7 __docformat__ = "restructuredtext en" |
7 __docformat__ = "restructuredtext en" |
8 |
8 |
9 from logilab.common.deprecation import class_renamed |
9 from logilab.common.deprecation import class_renamed |
10 from logilab.mtconverter import html_escape |
10 from logilab.mtconverter import html_escape |
11 |
11 |
|
12 from cubicweb import role |
12 from cubicweb.utils import merge_dicts |
13 from cubicweb.utils import merge_dicts |
13 from cubicweb.view import View, Component |
14 from cubicweb.view import View, Component |
14 from cubicweb.selectors import ( |
15 from cubicweb.selectors import ( |
15 paginated_rset, one_line_rset, primary_view, match_context_prop, |
16 paginated_rset, one_line_rset, primary_view, match_context_prop, |
|
17 abstract_has_related_entities, |
16 condition_compat, accepts_compat, has_relation_compat) |
18 condition_compat, accepts_compat, has_relation_compat) |
17 from cubicweb.common.registerers import accepts_registerer |
19 from cubicweb.common.registerers import accepts_registerer |
18 |
20 |
19 _ = unicode |
21 _ = unicode |
20 |
22 |
67 stop_param = '__stop' |
69 stop_param = '__stop' |
68 page_link_templ = u'<span class="slice"><a href="%s" title="%s">%s</a></span>' |
70 page_link_templ = u'<span class="slice"><a href="%s" title="%s">%s</a></span>' |
69 selected_page_link_templ = u'<span class="selectedSlice"><a href="%s" title="%s">%s</a></span>' |
71 selected_page_link_templ = u'<span class="selectedSlice"><a href="%s" title="%s">%s</a></span>' |
70 previous_page_link_templ = next_page_link_templ = page_link_templ |
72 previous_page_link_templ = next_page_link_templ = page_link_templ |
71 no_previous_page_link = no_next_page_link = u'' |
73 no_previous_page_link = no_next_page_link = u'' |
72 |
|
73 @classmethod |
|
74 def selected(cls, req, rset, row=None, col=None, page_size=None, **kwargs): |
|
75 """by default web app objects are usually instantiated on |
|
76 selection according to a request, a result set, and optional |
|
77 row and col |
|
78 """ |
|
79 instance = super(NavigationComponent, cls).selected(req, rset, row, col, **kwargs) |
|
80 if page_size is not None: |
|
81 instance.page_size = page_size |
|
82 elif 'page_size' in req.form: |
|
83 instance.page_size = int(req.form['page_size']) |
|
84 return instance |
|
85 |
74 |
86 def __init__(self, req, rset): |
75 def __init__(self, req, rset): |
87 super(NavigationComponent, self).__init__(req, rset) |
76 super(NavigationComponent, self).__init__(req, rset) |
88 self.starting_from = 0 |
77 self.starting_from = 0 |
89 self.total = rset.rowcount |
78 self.total = rset.rowcount |
90 |
79 |
91 def get_page_size(self): |
80 def get_page_size(self): |
92 try: |
81 try: |
93 return self._page_size |
82 return self._page_size |
94 except AttributeError: |
83 except AttributeError: |
95 self._page_size = self.req.property_value(self.page_size_property) |
84 if 'page_size' in self.extra_kwargs: |
96 return self._page_size |
85 page_size = self.extra_kwargs['page_size'] |
|
86 elif 'page_size' in self.req.form: |
|
87 page_size = int(self.req.form['page_size']) |
|
88 else: |
|
89 page_size = self.req.property_value(self.page_size_property) |
|
90 self._page_size = page_size |
|
91 return page_size |
97 |
92 |
98 def set_page_size(self, page_size): |
93 def set_page_size(self, page_size): |
99 self._page_size = page_size |
94 self._page_size = page_size |
100 |
95 |
101 page_size = property(get_page_size, set_page_size) |
96 page_size = property(get_page_size, set_page_size) |
146 |
141 |
147 |
142 |
148 class RelatedObjectsVComponent(EntityVComponent): |
143 class RelatedObjectsVComponent(EntityVComponent): |
149 """a section to display some related entities""" |
144 """a section to display some related entities""" |
150 vid = 'list' |
145 vid = 'list' |
151 |
146 __select__ = abstract_has_related_entities() |
|
147 |
152 def rql(self): |
148 def rql(self): |
153 """override this method if you want to use a custom rql query""" |
149 """override this method if you want to use a custom rql query""" |
154 return None |
150 return None |
155 |
151 |
156 def cell_call(self, row, col, view=None): |
152 def cell_call(self, row, col, view=None): |
157 rql = self.rql() |
153 rql = self.rql() |
158 if rql is None: |
154 if rql is None: |
159 entity = self.rset.get_entity(row, col) |
155 entity = self.rset.get_entity(row, col) |
160 if self.target == 'object': |
156 rset = entity.related(self.rtype, role(self)) |
161 role = 'subject' |
|
162 else: |
|
163 role = 'object' |
|
164 rset = entity.related(self.rtype, role) |
|
165 else: |
157 else: |
166 eid = self.rset[row][col] |
158 eid = self.rset[row][col] |
167 rset = self.req.execute(self.rql(), {'x': eid}, 'x') |
159 rset = self.req.execute(self.rql(), {'x': eid}, 'x') |
168 if not rset.rowcount: |
160 if not rset.rowcount: |
169 return |
161 return |