# HG changeset patch # User Nicolas Chauvat <nicolas.chauvat@logilab.fr> # Date 1279277043 -7200 # Fri Jul 16 12:44:03 2010 +0200 # Node ID 178d57399aaaa2845c8c2224c81d035a0116d16b # Parent cdce4addac55ccff274519739819f5113ea56eb9 silence warnings by porting to cw 3.9 diff --git a/entities.py b/entities.py --- a/entities.py +++ b/entities.py @@ -10,26 +10,25 @@ from logilab.common.date import todate from cubicweb.entities import AnyEntity, fetch_config -from cubicweb.interfaces import (ICalendarViews, ICalendarable, - ISiocItem, ISiocContainer, IPrevNext) - +from cubicweb.view import EntityAdapter +from cubicweb.selectors import is_instance -class Blog(AnyEntity): - """customized class for Blog entities""" - - __regid__ = 'Blog' - __implements__ = AnyEntity.__implements__ + (ISiocContainer,) +class BlogIFeedAdapter(EntityAdapter): + __regid__ = 'IFeed' + __select__ = EntityAdapter.__select__ & is_instance('Blog') def rss_feed_url(self): - if self.rss_url: - return self.rss_url + if self.entity.rss_url: + return self.entity.rss_url rql = ('Any E ORDERBY D DESC ' 'WHERE E is BlogEntry, E entry_of X, X eid %s, E creation_date D' ) return self._cw.build_url(rql=rql % self.eid, vid='rss', vtitle=self.dc_title()) - # isioc interface ########################################################## +class BlogISiocContainerAdapter(EntityAdapter): + __regid__ = 'ISiocContainer' + __select__ = EntityAdapter.__select__ & is_instance('Blog') def isioc_type(self): return 'Weblog' @@ -42,8 +41,6 @@ """customized class for BlogEntry entities""" __regid__ = 'BlogEntry' fetch_attrs, fetch_order = fetch_config(['creation_date', 'title'], order='DESC') - __implements__ = AnyEntity.__implements__ + ( - ICalendarViews, ICalendarable, ISiocItem, IPrevNext) def dc_title(self): return self.title @@ -58,19 +55,26 @@ def parent(self): return self.entry_of and self.entry_of[0] or None - # calendar interfaces ###################################################### +class BlogEntryICalendarableAdapter(EntityAdapter): + __regid__ = 'ICalendarable' + __select__ = EntityAdapter.__select__ & is_instance('BlogEntry') @property def start(self): - return self.creation_date + return self.entity.creation_date @property def stop(self): - return self.creation_date + return self.entity.creation_date + + +class BlogEntryICalendarViewsAdapter(EntityAdapter): + __regid__ = 'ICalendarViews' + __select__ = EntityAdapter.__select__ & is_instance('BlogEntry') def matching_dates(self, begin, end): """calendar views interface""" - mydate = self.creation_date + mydate = self.entity.creation_date if not mydate: return [] mydate = todate(mydate) @@ -78,18 +82,16 @@ return [mydate] return [] - def postinfo_description(self): - _ = self._cw._ - descr = u'%s %s' % (_('posted on'), self._cw.format_date(self.creation_date)) - return descr - # isioc interface ########################################################## +class BlogEntryISiocItemAdapter(EntityAdapter): + __regid__ = 'ISiocItem' + __select__ = EntityAdapter.__select__ & is_instance('BlogEntry') def isioc_content(self): - return self.content + return self.entity.content def isioc_container(self): - return self.parent() + return self.entity.parent() def isioc_type(self): return 'BlogPost' @@ -102,23 +104,27 @@ # XXX link to tags, folders? return [] - # IPrevNext interface ##################################################### - def _sibling_entry(self, order, operator): - if self.entry_of: - rql = ('Any B ORDERBY B %s LIMIT 1 ' - 'WHERE B is BlogEntry, B entry_of BL, BL eid %%(blog)s, ' - 'B eid %s %%(eid)s') - rset = self._cw.execute(rql % (order, operator), - {'blog': self.entry_of[0].eid, 'eid': self.eid}) - else: - rql = ('Any B ORDERBY B %s LIMIT 1 ' - 'WHERE B is BlogEntry, B eid %s %%(eid)s') - rset = self._cw.execute(rql % (order, operator), {'eid': self.eid}) - if rset: - return rset.get_entity(0,0) +class BlogEntryIPrevNextAdapter(EntityAdapter): + __regid__ = 'IPrevNext' + __select__ = EntityAdapter.__select__ & is_instance('BlogEntry') def next_entity(self): return self._sibling_entry('ASC', '>') def previous_entity(self): return self._sibling_entry('DESC', '<') + + def _sibling_entry(self, order, operator): + if self.entity.entry_of: + rql = ('Any B ORDERBY B %s LIMIT 1 ' + 'WHERE B is BlogEntry, B entry_of BL, BL eid %%(blog)s, ' + 'B eid %s %%(eid)s') + rset = self._cw.execute(rql % (order, operator), + {'blog': self.entity.entry_of[0].eid, 'eid': self.entity.eid}) + else: + rql = ('Any B ORDERBY B %s LIMIT 1 ' + 'WHERE B is BlogEntry, B eid %s %%(eid)s') + rset = self._cw.execute(rql % (order, operator), {'eid': self.entity.eid}) + if rset: + return rset.get_entity(0,0) + diff --git a/hooks.py b/hooks.py --- a/hooks.py +++ b/hooks.py @@ -1,9 +1,9 @@ -from cubicweb.selectors import implements, is_in_state +from cubicweb.selectors import is_instance, is_in_state from cubicweb.sobjects.notification import NotificationView, StatusChangeMixIn class BlogEntryPublishedView(StatusChangeMixIn, NotificationView): """get notified from published blogs""" - __select__ = implements('BlogEntry',) & is_in_state('published') + __select__ = is_instance('BlogEntry',) & is_in_state('published') content_attr = 'content' def subject(self): diff --git a/test/unittest_blog.py b/test/unittest_blog.py --- a/test/unittest_blog.py +++ b/test/unittest_blog.py @@ -18,12 +18,12 @@ self.assertEquals(len(MAILBOX), 0) self.commit() self.assertEquals(len(MAILBOX), 0) - blog_entry_1.fire_transition('publish') + blog_entry_1.cw_adapt_to('IWorkflowable').fire_transition('publish') self.commit() self.assertEquals(len(MAILBOX), 1) mail = MAILBOX[0] self.assertEquals(mail.subject, '[data] hop') - blog_entry_2.fire_transition('publish') + blog_entry_2.cw_adapt_to('IWorkflowable').fire_transition('publish') self.commit() self.assertEquals(len(MAILBOX), 2) mail = MAILBOX[1] diff --git a/data/external_resources b/uiprops.py rename from data/external_resources rename to uiprops.py --- a/data/external_resources +++ b/uiprops.py @@ -1,1 +1,1 @@ -BLOG_ICON = DATADIR/icon_blog.gif +BLOG_ICON = data('icon_blog.gif') diff --git a/views/boxes.py b/views/boxes.py --- a/views/boxes.py +++ b/views/boxes.py @@ -9,7 +9,7 @@ from logilab.mtconverter import xml_escape -from cubicweb.selectors import one_line_rset, implements +from cubicweb.selectors import one_line_rset, is_instance from cubicweb.web.htmlwidgets import BoxLink, BoxWidget from cubicweb.web.views import boxes @@ -77,7 +77,7 @@ if self.display_see_more_link: url = self._cw.build_url('view', rql=rql, page_size=10) box.append(BoxLink(url, u'[%s]' % self._cw._(u'see more'))) - rss_icon = self._cw.external_resource('RSS_LOGO_16') + rss_icon = self._cw.uiprops['RSS_LOGO_16'] # FIXME - could use rss_url defined as a property if available rss_label = u'%s <img src="%s" alt="%s"/>' % ( self._cw._(u'subscribe'), rss_icon, self._cw._('rss icon')) @@ -89,7 +89,7 @@ class LatestBlogsBlogBox(LatestBlogsBox): """display a box with latest blogs and rss, filtered for a particular blog """ - __select__ = LatestBlogsBox.__select__ & one_line_rset() & implements('Blog') + __select__ = LatestBlogsBox.__select__ & one_line_rset() & is_instance('Blog') title = _('latest_blogs_blog_box') display_see_more_link = False diff --git a/views/primary.py b/views/primary.py --- a/views/primary.py +++ b/views/primary.py @@ -9,7 +9,7 @@ from logilab.mtconverter import xml_escape from cubicweb.utils import UStringIO -from cubicweb.selectors import implements +from cubicweb.selectors import is_instance from cubicweb.web import uicfg, component from cubicweb.web.views import primary, workflow @@ -31,7 +31,7 @@ class BlogPrimaryView(primary.PrimaryView): - __select__ = implements('Blog') + __select__ = is_instance('Blog') def render_entity_relations(self, entity): super(BlogPrimaryView, self).render_entity_relations(entity) @@ -48,14 +48,14 @@ class SubscribeToBlogComponent(component.EntityVComponent): __regid__ = 'blogsubscribe' - __select__ = component.EntityVComponent.__select__ & implements('Blog') + __select__ = component.EntityVComponent.__select__ & is_instance('Blog') context = 'ctxtoolbar' def cell_call(self, row, col, view): entity = self.cw_rset.get_entity(row, col) self.w('<a href="%s"><img src="%s" alt="%s"/></a>' % ( - xml_escape(entity.rss_feed_url()), - self._cw.external_resource('RSS_LOGO_16'), + xml_escape(entity.cw_adapt_to('IFeed').rss_feed_url()), + self._cw.uiprops['RSS_LOGO_16'], self._cw._(u'subscribe to this blog'))) def render_blogentry_title(req, w, entity): @@ -73,7 +73,7 @@ w(u'</div></div>') class BlogEntryPrimaryView(primary.PrimaryView): - __select__ = implements('BlogEntry') + __select__ = is_instance('BlogEntry') show_attr_label = False def render_entity_relations(self, entity): @@ -92,7 +92,7 @@ # don't show workflow history for blog entry class BlogEntryWFHistoryVComponent(workflow.WFHistoryVComponent): - __select__ = workflow.WFHistoryVComponent.__select__ & implements('BlogEntry') + __select__ = workflow.WFHistoryVComponent.__select__ & is_instance('BlogEntry') def cell_call(self, row, col, view=None): pass diff --git a/views/secondary.py b/views/secondary.py --- a/views/secondary.py +++ b/views/secondary.py @@ -13,7 +13,7 @@ from cubicweb.schema import display_name from cubicweb.view import EntityView, StartupView -from cubicweb.selectors import paginated_rset, sorted_rset, implements +from cubicweb.selectors import paginated_rset, sorted_rset, is_instance from cubicweb.web.views import baseviews, calendar, navigation from cubes.blog.views.primary import render_blogentry_title @@ -75,7 +75,7 @@ class BlogEntrySameETypeListView(baseviews.SameETypeListView): - __select__ = baseviews.SameETypeListView.__select__ & implements('BlogEntry') + __select__ = baseviews.SameETypeListView.__select__ & is_instance('BlogEntry') countrql = ('Any COUNT(B) WHERE B is BlogEntry, ' 'B creation_date >= %(firstday)s, B creation_date <= %(lastday)s') item_vid = 'blog' @@ -126,7 +126,7 @@ class BlogEntryBlogView(EntityView): __regid__ = 'blog' - __select__ = implements('BlogEntry') + __select__ = is_instance('BlogEntry') def cell_call(self, row, col, **kwargs): entity = self.cw_rset.get_entity(row, col) @@ -144,7 +144,7 @@ class BlogEntryPostMetaData(EntityView): __regid__ = 'post-reldata' - __select__ = implements('BlogEntry') + __select__ = is_instance('BlogEntry') def cell_call(self, row, col): entity = self.cw_rset.get_entity(row, col) @@ -177,7 +177,7 @@ class BlogNavigation(navigation.PageNavigation): - __select__ = paginated_rset() & sorted_rset() & implements('BlogEntry') + __select__ = paginated_rset() & sorted_rset() & is_instance('BlogEntry') def index_display(self, start, stop): return u'%s' % (int(start / self.page_size)+1)