Source code for ploneintranet.api.microblog.statusupdate

# -*- coding: utf-8 -*-
from DateTime import DateTime
from datetime import datetime
from plone import api
from ploneintranet.microblog.interfaces import IMicroblogTool
from Products.CMFPlone.interfaces import IPloneSiteRoot
from zope.component import queryUtility

import logging
import pytz


logger = logging.getLogger(__name__)


[docs]def get(status_id): """Get a status update by id. :param status_id: The id of the status update :type status_id: int :returns: The matching StatusUpdate :rtype: StatusUpdate """ microblog = queryUtility(IMicroblogTool) return microblog.get(status_id)
[docs]def create( text=u"", microblog_context=None, thread_id=None, mention_ids=None, tags=None, user=None, userid=None, time=None, content_context=None, action_verb=None, ): """Create a status update (post). :param text: text of the post :type text: Unicode object :param microblog_context: Container of the post :type microblog_context: Content object :param user: User who should post. By default the current user posts. :type user: user object :param userid: userid of the user who should post. :type userid: string :param time: time when the post should happen. By default the current time. :type time: timezone aware datetime object :param content_context: a content referenced we are talking about :type content_context: content object :param action_verb: indicate event source (posted, created, published) :type action_verb: string :returns: Newly created statusupdate :rtype: StatusUpdate object Note that you can add attachments to statusupdates by calling .add_attachment(filename, data) on the returned StatusUpdate. """ if IPloneSiteRoot.providedBy(microblog_context): microblog_context = None if IPloneSiteRoot.providedBy(content_context): content_context = None # Avoid circulat dependencies from ploneintranet.microblog.statusupdate import StatusUpdate status_obj = StatusUpdate( text=text, microblog_context=microblog_context, thread_id=thread_id, mention_ids=mention_ids, tags=tags, content_context=content_context, action_verb=action_verb, ) # By default the post is done by the current user # Passing a userid or user allows to post as a different user if user is None and userid is not None: user = api.user.get(userid=userid) if user is not None: status_obj.userid = user.getId() status_obj.creator = user.getId() # By default the post happens now # Passing a time (as a datetime-object) the id and the date can be set if time is not None: assert isinstance(time, datetime) if not time.tzinfo or time.tzinfo.utcoffset(time) is None: raise ValueError("Naive datetime not supported") UTC = pytz.timezone("UTC") epoch = UTC.localize(datetime.utcfromtimestamp(0)) delta = time - epoch status_obj.id = long(delta.total_seconds() * 1e6) status_obj.date = DateTime(time) if time > datetime.now(UTC): raise ValueError("Future statusupdates are an abomination") microblog = queryUtility(IMicroblogTool) microblog.add(status_obj) # take care - statusupdate may still be queued for storage # and not actually written into the container yet # this may change the status_obj.id return status_obj