2012-03-30 6 views
1

Je suis en train de supprimer une feuille de calcul dans Google Docs avec cette fonction:DeleteResource de Google Docs avec Python

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) 

Et j'obtiens des erreurs différentes quand je change le premier paramètre de 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> 

Quelqu'un peut-il m'aider?

Répondre

3

Il semble que ce soit un bogue dans la bibliothèque Google API Python. J'ai vérifié gdata-2.0.16 et j'ai remarqué que la fonction DeleteResource() utilise uniquement l'URL de la ressource (gdata/docs/client.py lignes 540-543), mais vérifie par la suite hasattr (entry_or_uri, 'etag') (gdata/client.py lignes 737-741) et bien sûr la valeur de chaîne (uri) n'a pas l'attribut etag.

Vous pouvez travailler autour d'elle en utilisant la force argument mot-clé: Si vous voulez, vous pouvez signaler une erreur à mainteneurs de la bibliothèque (si elle est pas déjà rapporté)

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

client = gdata.docs.client.DocsClient() 
client.ClientLogin('[email protected]', 'xxxxxx', 'XxX') 

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

.

+0

Merci beaucoup Tupteq! Oui, avec ce travail, ça marche. Je demande dans Google Groupes et j'obtiens une réponse de l'un des développeurs qui dit la même chose. Il change de code pour faire cela force = Vrai était une option: http://code.google.com/p/gdata-python-client/source/detail?r=f98fff494fb89fca12deede00c3567dd589e5f97 – Sithram