web/views/ajaxedit.py
changeset 0 b97547f5f1fa
child 431 18b4dd650ef8
equal deleted inserted replaced
-1:000000000000 0:b97547f5f1fa
       
     1 """Set of views allowing edition of entities/relations using ajax
       
     2 
       
     3 :organization: Logilab
       
     4 :copyright: 2008 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
       
     5 :contact: http://www.logilab.fr/ -- mailto:contact@logilab.fr
       
     6 """
       
     7 __docformat__ = "restructuredtext en"
       
     8 
       
     9 from cubicweb.common.selectors import (chainfirst, req_form_params_selector,
       
    10                                     kwargs_selector)
       
    11 from cubicweb.web.box import EditRelationBoxTemplate
       
    12 
       
    13 class AddRelationView(EditRelationBoxTemplate):
       
    14     """base class for view which let add entities linked
       
    15     by a given relation
       
    16 
       
    17     subclasses should define at least id, rtype and target
       
    18     class attributes.
       
    19     """
       
    20     __registry__ = 'views'
       
    21     __selectors__ = (chainfirst(req_form_params_selector, kwargs_selector),)
       
    22     property_defs = {} # don't want to inherit this from Box
       
    23     id = 'xaddrelation'
       
    24     expected_kwargs = form_params = ('rtype', 'target')
       
    25 
       
    26     build_js = EditRelationBoxTemplate.build_reload_js_call
       
    27     
       
    28     def cell_call(self, row, col, rtype=None, target=None, etype=None):
       
    29         self.rtype = rtype or self.req.form['rtype']
       
    30         self.target = target or self.req.form['target']
       
    31         self.etype = etype or self.req.form.get('etype')
       
    32         entity = self.entity(row, col)
       
    33         rschema = self.schema.rschema(self.rtype)
       
    34         if not self.etype:
       
    35             if self.target == 'object':
       
    36                 etypes = rschema.objects(entity.e_schema)
       
    37             else:
       
    38                 etypes = rschema.subjects(entity.e_schema)
       
    39             if len(etypes) == 1:
       
    40                 self.etype = etypes[0]
       
    41         fakebox = []
       
    42         self.w(u'<div id="%s">' % self.id)
       
    43         self.w(u'<h1>%s</h1>' % self.req._('relation %(relname)s of %(ent)s')
       
    44                % {'relname': rschema.display_name(self.req, self.xtarget()[0]),
       
    45                   'ent': entity.view('incontext')})
       
    46         self.w(u'<ul>')
       
    47         self.w_unrelated(fakebox, entity)
       
    48         for boxitem in fakebox:
       
    49             boxitem.render(self.w)
       
    50         self.w(u'</ul></div>')
       
    51 
       
    52     def unrelated_entities(self, entity):
       
    53         """returns the list of unrelated entities
       
    54 
       
    55         if etype is not defined on the Box's class, the default
       
    56         behaviour is to use the entity's appropraite vocabulary function
       
    57         """
       
    58         x, target = self.xtarget()
       
    59         # use entity.unrelated if we've been asked for a particular etype
       
    60         if getattr(self, 'etype', None):
       
    61             rset = entity.unrelated(self.rtype, self.etype, x, ordermethod='fetch_order')
       
    62             self.pagination(self.req, rset, w=self.w)
       
    63             return rset.entities()
       
    64         # in other cases, use vocabulary functions
       
    65         entities = []
       
    66         for _, eid in entity.vocabulary(self.rtype, x):
       
    67             if eid is not None:
       
    68                 rset = self.req.eid_rset(eid)
       
    69                 entities.append(rset.get_entity(0, 0))
       
    70         return entities