class Action(AppObject): """abstract action. Handle the .search_states attribute to match request search state. """ __registry__ = 'actions' __select__ = match_search_state('normal') order = 99 category = 'moreactions' # actions in category 'moreactions' can specify a sub-menu in which they should be filed submenu = None def actual_actions(self): yield self def fill_menu(self, box, menu): """add action(s) to the given submenu of the given box""" for action in self.actual_actions(): menu.append(box.action_link(action)) def html_class(self): if self._cw.selected(self.url()): return 'selected' def build_action(self, title, url, **kwargs): return UnregisteredAction(self._cw, title, url, **kwargs) def url(self): """return the url associated with this action""" raise NotImplementedError
class LinkToEntityAction(Action): """base class for actions consisting to create a new object with an initial relation set to an entity. Additionally to EntityAction behaviour, this class is parametrized using .rtype, .role and .target_etype attributes to check if the action apply and if the logged user has access to it (see :class:`~cubicweb.selectors.partial_relation_possible` selector documentation for more information). """ __select__ = (match_search_state('normal') & one_line_rset() & partial_relation_possible(action='add', strict=True)) submenu = 'addrelated' # to be defined in concrete classes target_etype = rtype = None def url(self): ttype = self.target_etype entity = self.cw_rset.get_entity(self.cw_row or 0, self.cw_col or 0) linkto = '%s:%s:%s' % (self.rtype, entity.eid, target(self)) return self._cw.vreg["etypes"].etype_class(ttype).cw_create_url( self._cw, __redirectpath=entity.rest_path(), __linkto=linkto, __redirectvid=self._cw.form.get('__redirectvid', ''))
class SearchForAssociationView(EntityView): """view called by the edition view when the user asks to search for something to link to the edited eid """ __regid__ = 'search-associate' __select__ = (one_line_rset() & match_search_state('linksearch') & non_final_entity()) title = _('search for association') def cell_call(self, row, col): rset, vid, divid, paginate = self.filter_box_context_info() self.cw_rset = rset self.w(u'<div id="%s">' % divid) self.paginate() self.wview(vid, rset, 'noresult') self.w(u'</div>') @cached def filter_box_context_info(self): entity = self.cw_rset.get_entity(0, 0) role, eid, rtype, etype = self._cw.search_state[1] assert entity.eid == int(eid) # the default behaviour is to fetch all unrelated entities and display # them. Use fetch_order and not fetch_unrelated_order as sort method # since the latter is mainly there to select relevant items in the combo # box, it doesn't give interesting result in this context rql, args = entity.cw_unrelated_rql(rtype, etype, role, ordermethod='fetch_order', vocabconstraints=False) rset = self._cw.execute(rql, args) return rset, 'list', "search-associate-content", True
class CancelSelectAction(action.Action): __regid__ = 'cancel' __select__ = match_search_state('linksearch') title = _('cancel select') category = 'mainactions' order = 10 def url(self): target, eid, r_type, searched_type = self._cw.search_state[1] return self._cw.build_url(str(eid), vid='edition', __mode='normal')
class SelectAction(action.Action): """base class for link search actions. By default apply on any size entity result search it the current state is 'linksearch' if accept match. """ __regid__ = 'select' __select__ = (match_search_state('linksearch') & nonempty_rset() & match_searched_etype()) title = _('select') category = 'mainactions' order = 0 def url(self): return linksearch_select_url(self._cw, self.cw_rset)