Как обновить содержимое вложений с помощью API Python для сайтов Google? - PullRequest
2 голосов
/ 04 января 2010

Я пытаюсь написать скрипт, который будет автоматически обновлять некоторые вложения на веб-сайте, созданном и управляемым через Сайты Google. Это должно быть возможно, поскольку Google выпустила Sites API в сентябре и Python GData API претензии на поддержку сайтов. Однако самый близкий метод, который я могу найти, называется client.update, что позволяет мне обновлять метаданные вложения, но не содержимое.

В Java API обновление вложения выполняется путем создания нового MediaFileSource и последующего вызова entry.setMediaFileSource(source), за которым следует entry.updateMedia(). Однако я не могу найти ничего подобного в Python API. Я тупой и просто что-то упустил, или действительно ли невозможно обновить вложение сайтов Google с помощью API Python?

Ответы [ 4 ]

4 голосов
/ 07 ноября 2012

В документации здесь приведен пример обновления содержимого и метаданных вложения (подраздел Замена содержимого и метаданных вложения)

Единственное, что осталось, это получить existing_attachment, что можно легко сделать с помощью чего-то вроде этого:

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
2 голосов
/ 28 января 2010

api сайтов обновлен до v1.1; это, вероятно, новое дополнение

http://code.google.com/apis/sites/docs/1.0/developers_guide_python.html#UpdatingContent

1 голос
/ 11 марта 2010

Хорошо, API там странный, а документация не очень понятная. Вот что я понял. При первой загрузке вложения вы делаете это с помощью метода UploadAttachment, но при последующих попытках вам необходимо вызвать Update Вот код, который делает это:

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
0 голосов
/ 04 января 2010

Существует метод upload_attachment , который должен работать. Вы также можете проверить пример кода для API сайтов, он использует этот метод.

...