diff -r a64f48dd5fe4 -r 9ab2b4c74baf web/views/isioc.py --- a/web/views/isioc.py Thu May 20 20:47:13 2010 +0200 +++ b/web/views/isioc.py Thu May 20 20:47:55 2010 +0200 @@ -15,20 +15,70 @@ # # You should have received a copy of the GNU Lesser General Public License along # with CubicWeb. If not, see . -"""Specific views for SIOC interfaces +"""Specific views for SIOC (Semantically-Interlinked Online Communities) +http://sioc-project.org """ + __docformat__ = "restructuredtext en" from logilab.mtconverter import xml_escape -from cubicweb.view import EntityView -from cubicweb.selectors import implements +from cubicweb.view import EntityView, EntityAdapter, implements_adapter_compat +from cubicweb.selectors import implements, adaptable from cubicweb.interfaces import ISiocItem, ISiocContainer + +class ISIOCItemAdapter(EntityAdapter): + """interface for entities which may be represented as an ISIOC items""" + __regid__ = 'ISIOCItem' + __select__ = implements(ISiocItem) # XXX for bw compat, should be abstract + + @implements_adapter_compat('ISIOCItem') + def isioc_content(self): + """return item's content""" + raise NotImplementedError + + @implements_adapter_compat('ISIOCItem') + def isioc_container(self): + """return container entity""" + raise NotImplementedError + + @implements_adapter_compat('ISIOCItem') + def isioc_type(self): + """return container type (post, BlogPost, MailMessage)""" + raise NotImplementedError + + @implements_adapter_compat('ISIOCItem') + def isioc_replies(self): + """return replies items""" + raise NotImplementedError + + @implements_adapter_compat('ISIOCItem') + def isioc_topics(self): + """return topics items""" + raise NotImplementedError + + +class ISIOCContainerAdapter(EntityAdapter): + """interface for entities which may be represented as an ISIOC container""" + __regid__ = 'ISIOCContainer' + __select__ = implements(ISiocContainer) # XXX for bw compat, should be abstract + + @implements_adapter_compat('ISIOCContainer') + def isioc_type(self): + """return container type (forum, Weblog, MailingList)""" + raise NotImplementedError + + @implements_adapter_compat('ISIOCContainer') + def isioc_items(self): + """return contained items""" + raise NotImplementedError + + class SIOCView(EntityView): __regid__ = 'sioc' - __select__ = EntityView.__select__ & implements(ISiocItem, ISiocContainer) + __select__ = adaptable('ISIOCItem', 'ISIOCContainer') title = _('sioc') templatable = False content_type = 'text/xml' @@ -52,48 +102,51 @@ class SIOCContainerView(EntityView): __regid__ = 'sioc_element' - __select__ = EntityView.__select__ & implements(ISiocContainer) + __select__ = adaptable('ISIOCContainer') templatable = False content_type = 'text/xml' def cell_call(self, row, col): entity = self.cw_rset.complete_entity(row, col) - sioct = xml_escape(entity.isioc_type()) + isioc = entity.cw_adapt_to('ISIOCContainer') + isioct = isioc.isioc_type() self.w(u'\n' - % (sioct, xml_escape(entity.absolute_url()))) + % (isioct, xml_escape(entity.absolute_url()))) self.w(u'%s' % xml_escape(entity.dc_title())) self.w(u'%s' - % entity.creation_date) + % entity.creation_date) # XXX format self.w(u'%s' - % entity.modification_date) + % entity.modification_date) # XXX format self.w(u'')#entity.isioc_items() self.w(u'\n' % sioct) class SIOCItemView(EntityView): __regid__ = 'sioc_element' - __select__ = EntityView.__select__ & implements(ISiocItem) + __select__ = adaptable('ISIOCItem') templatable = False content_type = 'text/xml' def cell_call(self, row, col): entity = self.cw_rset.complete_entity(row, col) - sioct = xml_escape(entity.isioc_type()) + isioc = entity.cw_adapt_to('ISIOCItem') + isioct = isioc.isioc_type() self.w(u'\n' - % (sioct, xml_escape(entity.absolute_url()))) + % (isioct, xml_escape(entity.absolute_url()))) self.w(u'%s' % xml_escape(entity.dc_title())) self.w(u'%s' - % entity.creation_date) + % entity.creation_date) # XXX format self.w(u'%s' - % entity.modification_date) - if entity.content: - self.w(u'%s''' - % xml_escape(entity.isioc_content())) - if entity.related('entry_of'): + % entity.modification_date) # XXX format + content = isioc.isioc_content() + if content: + self.w(u'%s' % xml_escape(content)) + container = isioc.isioc_container() + if container: self.w(u'\n' - % xml_escape(entity.isioc_container().absolute_url())) + % xml_escape(container.absolute_url())) if entity.creator: self.w(u'\n') self.w(u'\n'