quick_frontend (constants, quick_app, quick_contact_list): blogging refactoring (not finished):

- adaptation to backend modifications
    - moved common blogging parts from Libervia to quick frontend
    - QuickApp use a MB_HANDLE class variable to indicated if blogging is managed by the frontend (and avoid waste of resources if not)
    - comments are now managed inside parent entry, as a result a tree of comments is now possible
    - Entry.level indicate where in the tree we are (-1 mean parent QuickBlog, 0 mean main item, more means comment)
    - items + comments are requested in 1 shot, and RTDeferred are used to avoid blocking while waiting for them
    - in QuickBlog, id2entries allow to get Entry from it's item id, and node2entries allow to get Entry(ies) hosting a comments node
    - QuickBlog.new_message_target tell where a new message will be sent by default
This commit is contained in:
Goffi 2015-08-16 01:00:54 +02:00
commit b747c1b733
3 changed files with 494 additions and 7 deletions

View file

@ -27,6 +27,7 @@ from sat.tools import trigger
from sat_frontends.tools import jid
from sat_frontends.quick_frontend import quick_widgets
from sat_frontends.quick_frontend import quick_menus
from sat_frontends.quick_frontend import quick_blog
from sat_frontends.quick_frontend import quick_chat, quick_games
from sat_frontends.quick_frontend.constants import Const as C
@ -196,6 +197,7 @@ class ProfilesManager(object):
class QuickApp(object):
"""This class contain the main methods needed for the frontend"""
MB_HANDLE = True # Set to false if the frontend doesn't manage microblog
def __init__(self, create_bridge, check_options=None):
"""Create a frontend application
@ -254,7 +256,7 @@ class QuickApp(object):
self.registerSignal("roomUserChangedNick", iface="plugin")
self.registerSignal("roomNewSubject", iface="plugin")
self.registerSignal("chatStateReceived", iface="plugin")
self.registerSignal("personalEvent", iface="plugin")
self.registerSignal("psEvent", iface="plugin")
# FIXME: do it dynamically
quick_games.Tarot.registerSignals(self)
@ -607,15 +609,42 @@ class QuickApp(object):
contact_list.setCache(from_jid, 'chat_state', to_display)
widget.update(from_jid)
def personalEventHandler(self, sender, event_type, data, profile):
"""Called when a PEP event is received.
def psEventHandler(self, category, service_s, node, event_type, data, profile):
"""Called when a PubSub event is received.
@param sender (jid.JID): event sender
@param event_type (unicode): event type, e.g. 'MICROBLOG' or 'MICROBLOG_DELETE'
@param category(unicode): event category (e.g. "PEP", "MICROBLOG")
@param service_s (unicode): pubsub service
@param node (unicode): pubsub node
@param event_type (unicode): event type (one of C.PUBLISH, C.RETRACT, C.DELETE)
@param data (dict): event data
"""
# FIXME move some code from Libervia to here and put the magic strings to constants
pass
service_s = jid.JID(service_s)
if category == C.PS_MICROBLOG and self.MB_HANDLE:
if event_type == C.PS_PUBLISH:
if not 'content' in data:
log.warning("No content found in microblog data")
return
if 'groups' in data:
_groups = set(data['groups'].split() if data['groups'] else [])
else:
_groups = None
for wid in self.widgets.getWidgets(quick_blog.QuickBlog):
wid.addEntryIfAccepted(service_s, node, data, _groups, profile)
try:
comments_node, comments_service = data['comments_node'], data['comments_service']
except KeyError:
pass
else:
self.bridge.mbGetLast(comments_service, comments_node, C.NO_LIMIT, {"subscribe":C.BOOL_TRUE}, profile=profile)
elif event_type == C.PS_RETRACT:
for wid in self.widgets.getWidgets(quick_blog.QuickBlog):
wid.deleteEntryIfPresent(service_s, node, data['id'], profile)
pass
else:
log.warning("Unmanaged PubSub event type {}".format(event_type))
def _subscribe_cb(self, answer, data):
entity, profile = data