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