332 |
332 |
333 |
333 |
334 # high level abstract classes ################################################## |
334 # high level abstract classes ################################################## |
335 |
335 |
336 class RQLCtxComponent(CtxComponent): |
336 class RQLCtxComponent(CtxComponent): |
337 """abstract box for boxes displaying the content of a rql query not |
337 """abstract box for boxes displaying the content of a rql query not related |
338 related to the current result set. |
338 to the current result set. |
|
339 |
|
340 Notice that this class's init_rendering implemention is overwriting context |
|
341 result set (eg `cw_rset`) with the result set returned by execution of |
|
342 `to_display_rql()`. |
339 """ |
343 """ |
340 rql = None |
344 rql = None |
341 |
345 |
342 def to_display_rql(self): |
346 def to_display_rql(self): |
|
347 """return arguments to give to self._cw.execute, as a tuple, to build |
|
348 the result set to be displayed by this box. |
|
349 """ |
343 assert self.rql is not None, self.__regid__ |
350 assert self.rql is not None, self.__regid__ |
344 return (self.rql,) |
351 return (self.rql,) |
345 |
352 |
346 def init_rendering(self): |
353 def init_rendering(self): |
347 rset = self._cw.execute(*self.to_display_rql()) |
354 super(RQLCtxComponent, self).init_rendering() |
348 if not rset: |
355 self.cw_rset = self._cw.execute(*self.to_display_rql()) |
|
356 if not self.cw_rset: |
349 raise EmptyComponent() |
357 raise EmptyComponent() |
|
358 |
|
359 def render_body(self, w): |
|
360 rset = self.cw_rset |
350 if len(rset[0]) == 2: |
361 if len(rset[0]) == 2: |
351 self.items = [] |
362 items = [] |
352 for i, (eid, label) in enumerate(rset): |
363 for i, (eid, label) in enumerate(rset): |
353 entity = rset.get_entity(i, 0) |
364 entity = rset.get_entity(i, 0) |
354 self.items.append(self.build_link(label, entity.absolute_url())) |
365 items.append(self.build_link(label, entity.absolute_url())) |
355 else: |
366 else: |
356 self.items = [self.build_link(e.dc_title(), e.absolute_url()) |
367 items = [self.build_link(e.dc_title(), e.absolute_url()) |
357 for e in rset.entities()] |
368 for e in rset.entities()] |
358 |
369 self.render_items(w, items) |
359 def render_body(self, w): |
|
360 self.render_items(w) |
|
361 |
370 |
362 |
371 |
363 class EditRelationMixIn(ReloadableMixIn): |
372 class EditRelationMixIn(ReloadableMixIn): |
364 def box_item(self, entity, etarget, rql, label): |
373 def box_item(self, entity, etarget, rql, label): |
365 """builds HTML link to edit relation between `entity` and `etarget`""" |
374 """builds HTML link to edit relation between `entity` and `etarget`""" |