Удалить ресурс из Google Документов с Python - PullRequest
1 голос
/ 30 марта 2012

Я пытаюсь удалить электронную таблицу в Google Docs с помощью этой функции:

def f_DeleteResource(xls_name):
  """Delete a resource"""
  client=Auth()
  for e1 in client.GetResources().entry:
    e2 = client.GetResource(e1)
    if xls_name==e2.title.text:
      client.DeleteResource(e2.resource_id.text,True)

И я получаю разные ошибки при изменении первого параметра client.DeleteResource(p1,p2):

client.DeleteResource(e2.resource_id.text,True):

Traceback (most recent call last):
File "C:\xmp\D6GDocsDeleteUpload.py", line 164, in <module> main()
File "C:\xmp\D6GDocsDeleteUpload.py", line 157, in main f_DeleteResource(sys.argv[2])
File "C:\xmp\D6GDocsDeleteUpload.py", line 144, in f_DeleteResource client.DeleteResource(e2.resource_id.text,True)
File "C:\Python27\lib\site-packages\gdata\docs\client.py", line 540, in delete_resource uri = entry.GetEditLink().href
AttributeError: 'str' object has no attribute 'GetEditLink'

client.DeleteResource(e2,True):

Traceback (most recent call last):
File "C:\xmp\D6GDocsDeleteUpload.py", line 164, in <module> main()
File "C:\xmp\D6GDocsDeleteUpload.py", line 157, in main f_DeleteResource(sys.argv[2])
File "C:\xmp\D6GDocsDeleteUpload.py", line 144, in f_DeleteResource client.DeleteResource(e2,True)
File "C:\Python27\lib\site-packages\gdata\docs\client.py", line 543, in delete_resource return super(DocsClient, self).delete(uri, **kwargs)
File "C:\Python27\lib\site-packages\gdata\client.py", line 748, in delete **kwargs)
File "C:\Python27\lib\site-packages\gdata\docs\client.py", line 66, in request return super(DocsClient, self).request(method=method, uri=uri, **kwargs)
File "C:\Python27\lib\site-packages\gdata\client.py", line 319, in request RequestError)
gdata.client.RequestError: Server responded with: 403, <errors xmlns='http://schemas.google.com/g/2005'><error><domain>GData</domain><code>matchHeaderRequired</code><location type='header'>If-Match|If-None-Match</location><internalReason>If-Match or If-None-Match header or entry etag attribute required</internalReason></error></errors>

Кто-нибудь может мне помочь?

Ответы [ 2 ]

3 голосов
/ 05 апреля 2012

Эта проблема была исправлена ​​в этой ревизии: http://code.google.com/p/gdata-python-client/source/detail?r=f98fff494fb89fca12deede00c3567dd589e5f97

Если вы синхронизируете свой клиент с репозиторием, вы сможете удалить ресурс, не указывая «force = True».

3 голосов
/ 30 марта 2012

Кажется, это ошибка в библиотеке API Google API Python.Я проверил gdata-2.0.16 и заметил, что функция DeleteResource () использует только URL-адрес ресурса (строки 540-543 gdata / docs / client.py), но позже проверяет hasattr (entry_or_uri, 'etag') (строки gdata / client.py 737-741) и, конечно, строковое значение (uri) не имеет атрибута etag .

Вы можете обойти это, используя force аргумент ключевого слова:

import gdata.docs.data
import gdata.docs.client

client = gdata.docs.client.DocsClient()
client.ClientLogin('xxxxxx@gmail.com', 'xxxxxx', 'XxX')

for doc in client.GetAllResources():
    if doc.title.text == 'qpqpqpqpqpqp':
        client.DeleteResource(doc, force=True)
        break

Если вы хотите, вы можете сообщить об ошибке сопровождающим библиотеки (если об этом еще не сообщалось).

...