Adding Plone Pages Remotely
The External Method
The External Method needs to:
- extract the unique_id representing the file containing the news article
- read the information in
- create the news article
- publish
The code will set the title to be a simple string. The body will be created using restructedText which requires setting the MIME type when we set the body text and start with a pretty printed version of the timestamp as a heading followed by the body text read from the file.
The various strings returned are then available for inspection to determine success or failure. It's not clear whether a command line utility should report an error when the transport of the HTTP error code was successful.
The Python code looks like:
import time
def news_update(self):
   """A first external method."""
   news_id = self.REQUEST.get('news_id',None)
   if news_id is None:
       return "No news identifier passed\n"
   news_file = '/path/to/news/%s.txt' % news_id
   if os.path.isfile (news_file) is None:
       return "News article doesn't exist\n"
   # recover the time from news_id
   when = time.strptime (news_id, "%Y%m%d%H%M%S")
   news = open (news_file)
   body = None
   location = ''
   location_msg = ''
   try:
       for line in news:
           # strip the strailing newline
           line = line.rstrip ()
           # Leading spaces which mean blockquote in text/x-rst!
           body += line.lstrip ()
   finally:
       news.close
   if body:
       # ensure a unique URL by appending a suffix if the id already
       # exists
       base_id = time.strftime ("%Y%m%d%H%M%S", when)
       id = base_id
       news_item = getattr (self, id, None)
       suffix = 2
       while news_item is not None:
           id = '%s-%d' % (base_id, suffix)
           news_item = getattr (self, id, None)
           suffix = suffix + 1
       # Create the News Item
       self.invokeFactory (type_name="News Item", id=id)
       news_item = self[id]
       news_item.setTitle ('News Update')
       description = 'News Update for %s' % time.strftime ("%A, %d %B, %Y %H:%M", when)
       if suffix > 2:
           description += ' #%d' % (suffix - 1)
       news_item.setDescription (description)
       # Create a restructuredText H1 from a date string underlined
       # with '=' chars
       date_h1 = time.strftime ("%A, %d %B, %Y %H:%M", when)
       h1 = "%s\n%s\n\n" % (date_h1, '=' * len (date_h1))
       news_item.setText (h1 + body, mimetype='text/x-rst')
       # {Creation,Modification,Effective}Date is used for sorting
       # News Items by default in the View listing??
       when_str = time.strftime('%Y/%m/%d %H:%M:%S', when)
       news_item.setCreationDate (when_str)
       # ModificationDate should reflect when we've edited this
       # news_item.setModificationDate (when_str)
       # EffectiveDate is used for sorting News Items by default in
       # the Contents listing??
       news_item.setEffectiveDate (when)
       # publish
       news_item.portal_workflow.doActionFor (news_item, "publish", comment="publised programmatically")
   else:
       return "No body generated for %s\n" % news_id
   return "Successfully added %s\n" % (news_id)
      Document Actions
