¿Cómo actualizo el contenido de archivos adjuntos con la API de Google Sites Python?
-
18-09-2019 - |
Pregunta
Estoy tratando de escribir un script que actualice automáticamente algunos archivos adjuntos en un sitio web creado y administrado a través de los sitios de Google. Esto debería ser posible a medida que Google lanzó el Sitios API en septiembre y el Python gdata API reclamos de apoyar sitios. Sin embargo, se llama el método más cercano que puedo encontrar client.update
, que me permite actualizar los metadatos de un archivo adjunto, pero no el contenido.
En la API de Java, la actualización de un archivo adjunto se realiza creando un nuevo MediaFileSource
Y luego llamando entry.setMediaFileSource(source)
seguido por entry.updateMedia()
. Sin embargo, no puedo encontrar nada similar en la API de Python. ¿Me estoy perdiendo algo y simplemente me falta algo, o realmente no es posible actualizar un archivo adjunto de Google Sites usando la API de Python?
Solución
Sites API se ha actualizado a V1.1; Esta es probablemente una nueva adición
http://code.google.com/apis/sites/docs/1.0/developers_guide_python.html#updatingcontent
Otros consejos
La documentación aquí Proporciona un ejemplo sobre cómo actualizar el contenido y los metadatos de un archivo adjunto (subsección que reemplaza el contenido y los metadatos de un archivo adjunto)
Lo único que queda fuera es obtener existing_attachment
que se puede hacer fácilmente con algo como esto:
existing_attachment = None
uri = '%s?kind=%s' % (client.MakeContentFeedUri(), 'attachment')
feed = client.GetContentFeed(uri=uri)
for entry in feed.entry:
if entry.title.text == title:
print '%s [%s]' % (entry.title.text, entry.Kind())
existing_attachment = entry
Ok, la API allí es extraña, y la documentación no es muy clara. Esto es lo que he descubierto. La primera vez que sube un archivo adjunto, lo hace a través del método de carga de carga, pero en los intentos de seguimiento, debe llamar a la actualización. Aquí está el código que lo hace:
class AttachmentUploader(object):
"""Uploads a given attachment to a given filecabinet in Google Sites."""
def __init__(self, site, username, password):
self.client = gdata.sites.client.SitesClient(
source="uploaderScript", site=site)
self.client.ssl = True
try:
self.client.ClientLogin(username, password, "some.key")
except:
traceback.print_exc()
raise
def FindAttachment(self, title):
uri = "%s?kind=%s" % (self.client.MakeContentFeedUri(), "attachment")
feed = self.client.GetContentFeed(uri=uri)
for entry in feed.entry:
if entry.title.text == title:
return entry
return None
def FindCabinet(self, title):
uri = "%s?kind=%s" % (self.client.MakeContentFeedUri(), "filecabinet")
feed = self.client.GetContentFeed(uri=uri)
for entry in feed.entry:
if entry.title.text == title:
return entry
return None
def Upload(self, cabinet_title, title, file_path, description):
"""Upload the given file as attachment."""
ms = gdata.data.MediaSource(file_path=file_path, content_type="text/ascii")
existing_attachment = self.FindAttachment(title)
if existing_attachment is not None:
existing_attachment.summary.text = description
updated = self.client.Update(existing_attachment, media_source=ms)
print "Updated: ", updated.GetAlternateLink().href
else:
cabinet = self.FindCabinet(cabinet_title)
if cabinet is None:
print "OUCH: cabinet %s does not exist" % cabinet_title
return
attachment = self.client.UploadAttachment(
ms, cabinet, title=title, description=description)
print "Uploaded: ", attachment.GetAlternateLink().href
Hay un cargar_attachment Método, eso debería funcionar. También es posible que desee ver el Código de muestra Para la API de los sitios, utiliza ese método.