web/views/baseforms.py
branchtls-sprint
changeset 1091 b5e253c0dd13
parent 1088 b7b58c3bb575
child 1132 96752791c2b6
--- a/web/views/baseforms.py	Thu Mar 12 16:23:31 2009 +0100
+++ b/web/views/baseforms.py	Thu Mar 12 16:29:00 2009 +0100
@@ -14,188 +14,18 @@
 from logilab.mtconverter import html_escape
 from logilab.common.decorators import cached
 
-from cubicweb.interfaces import IWorkflowable
 from cubicweb.selectors import (specified_etype_implements, implements,
                                 match_kwargs, match_form_params, one_line_rset,
                                 non_final_entity, accepts_etype_compat)
 from cubicweb.utils import make_uid
 from cubicweb.view import View, EntityView
-from cubicweb.common import tags
 from cubicweb.common.uilib import cut
 from cubicweb.web import INTERNAL_FIELD_VALUE, stdmsgs, eid_param
 from cubicweb.web.controller import NAV_FORM_PARAMETERS
 from cubicweb.web.widgets import checkbox, InputWidget, ComboBoxWidget
-from cubicweb.web.form import MultipleFieldsForm, EntityFieldsForm, FormMixIn, relation_id
-from cubicweb.web.formfields import StringField,  RichTextField, find_field
-from cubicweb.web.formwidgets import HiddenInput
+from cubicweb.web.form import FormMixIn
 
 _ = unicode
-
-
-
-class DeleteConfForm(EntityView):
-    id = 'deleteconf'
-    title = _('delete')
-    domid = 'deleteconf'
-    onsubmit = None
-    # don't use navigation, all entities asked to be deleted should be displayed
-    # else we will only delete the displayed page
-    need_navigation = False
-    
-    def call(self):
-        """ask for confirmation before real deletion"""
-        req, w = self.req, self.w
-        _ = req._
-        req.add_css('cubicweb.form.css')
-        req.add_js('cubicweb.edition.js')
-        w(u'<script type="text/javascript">updateMessage(\'%s\');</script>\n'
-          % _('this action is not reversible!'))
-        # XXX above message should have style of a warning
-        w(u'<h4>%s</h4>\n' % _('Do you want to delete the following element(s) ?'))
-        form = MultipleFieldsForm(req, domid='deleteconf', action=self.build_url('edit'),
-                                  onsubmit=self.onsubmit, copy_nav_params=True)
-        form.buttons.append(form.button_delete(label=stdmsgs.YES))
-        form.buttons.append(form.button_cancel(label=stdmsgs.NO))
-        done = set()
-        w(u'<ul>\n')
-        for i in xrange(self.rset.rowcount):
-            if self.rset[i][0] in done:
-                continue
-            done.add(self.rset[i][0])
-            entity = self.rset.get_entity(i, 0)
-            subform = EntityFieldsForm(req, set_error_url=False,
-                                       entity=entity)
-            form.form_add_subform(subform)
-            # don't use outofcontext view or any other that may contain inline edition form
-            w(u'<li>%s</li>' % tags.a(entity.view('textoutofcontext'),
-                                      href=entity.absolute_url()))
-        w(u'</ul>\n')
-        w(form.form_render())
-
-
-class ChangeStateForm(EntityFieldsForm):
-    id = 'changestate'
-    
-    __method = StringField(name='__method', initial='set_state', widget=HiddenInput)
-    state = StringField(widget=HiddenInput, eidparam=True)
-    trcomment = RichTextField(eidparam=True)
-
-    def form_buttons(self):
-        return [self.button_ok(label=stdmsgs.YES,
-                               tabindex=self.req.next_tabindex()),
-                self.button_cancel(label=stdmsgs.NO,
-                                   tabindex=self.req.next_tabindex())]
-
-        
-class ChangeStateFormView(EntityView):
-    id = 'statuschange'
-    title = _('status change')
-    __select__ = implements(IWorkflowable) & match_form_params('treid')
-
-    def cell_call(self, row, col):
-        entity = self.entity(row, col)
-        eid = entity.eid
-        state = entity.in_state[0]
-        transition = self.req.eid_rset(self.req.form['treid']).get_entity(0, 0)
-        dest = transition.destination()
-        self.req.add_js('cubicweb.edition.js')
-        self.req.add_css('cubicweb.form.css')
-        _ = self.req._
-        form = self.vreg.select_object('forms', 'changestate', self.req, self.rset, row, col,
-                                  entity=entity, redirect_path=self.redirectpath(entity))
-        self.w(form.error_message())
-        self.w(u'<h4>%s %s</h4>\n' % (_(transition.name), entity.view('oneline')))
-        msg = _('status will change from %(st1)s to %(st2)s') % {
-            'st1': _(state.name),
-            'st2': _(dest.name)}
-        self.w(u'<p>%s</p>\n' % msg)
-        self.w(form.form_render(state=dest.eid, trcomment=u''))
-
-    def redirectpath(self, entity):
-        return entity.rest_path()
-
-
-class ClickAndEditForm(FormMixIn, EntityView):
-    id = 'reledit'
-    __select__ = match_kwargs('rtype')
-
-    # FIXME editableField class could be toggleable from userprefs
-      
-    def cell_call(self, row, col, rtype=None, role='subject', reload=False):
-        entity = self.entity(row, col)
-        if getattr(entity, rtype) is None:
-            value = self.req._('not specified')
-        else:
-            value = entity.printable_value(rtype)
-        if not entity.has_perm('update'):
-            self.w(value)
-            return
-        self.req.add_js( ('cubicweb.ajax.js', 'cubicweb.edition.js') )
-        eid = entity.eid
-        edit_key = make_uid('%s-%s' % (rtype, eid))
-        divid = 'd%s' % edit_key
-        reload = dumps(reload)
-        buttons = [tags.input(klass="validateButton", type="submit", name="__action_apply",
-                              value=self.req._(stdmsgs.BUTTON_OK), tabindex=self.req.next_tabindex()),
-                   tags.input(klass="validateButton", type="button",
-                              value=self.req._(stdmsgs.BUTTON_CANCEL),
-                              onclick="cancelInlineEdit(%s,\'%s\',\'%s\')" % (eid, rtype, divid),
-                              tabindex=self.req.next_tabindex())]
-        form = self.vreg.select_object('forms', 'edition', self.req, self.rset, row=row, col=col,
-                                       entity=entity, domid='%s-form' % divid, action='#',
-                                       cssstyle='display: none', buttons=buttons,
-                                       onsubmit="return inlineValidateForm('%(divid)s-form', '%(rtype)s', '%(eid)s', '%(divid)s', %(reload)s);" % locals())
-        renderer = FormRenderer(display_label=False, display_help=False,
-                                display_fields=(rtype,), button_bar_class='buttonbar')
-        self.w(tags.div(value, klass='editableField', id=divid,
-                        ondblclick="showInlineEditionForm(%(eid)s, '%(rtype)s', '%(divid)s')" % locals()))
-        self.w(form.render(renderer=renderer)
-
-
-## work in progress, this class will replace the standard EditionView soon
-class _EditionForm(EntityView):
-    """primary entity edition form
-
-    When generating a new attribute_input, the editor will look for a method
-    named 'default_ATTRNAME' on the entity instance, where ATTRNAME is the
-    name of the attribute being edited. You may use this feature to compute
-    dynamic default values such as the 'tomorrow' date or the user's login
-    being connected
-    """    
-    id = '_edition'
-    __select__ = one_line_rset() & non_final_entity()
-
-    title = _('edition')
-    controller = 'edit'
-    skip_relations = FormMixIn.skip_relations.copy()
-
-    def cell_call(self, row, col, **kwargs):
-        self.req.add_js( ('cubicweb.ajax.js', 'cubicweb.edition.js') )
-        self.req.add_css('cubicweb.form.css')
-        self.initialize_varmaker()
-        entity = self.complete_entity(row, col)
-
-    def initialize_varmaker(self):
-        varmaker = self.req.get_page_data('rql_varmaker')
-        if varmaker is None:
-            varmaker = self.req.varmaker
-            self.req.set_page_data('rql_varmaker', varmaker)
-        self.varmaker = varmaker
-        
-    def edit_form(self, entity, kwargs):
-        form = EntityFieldsForm(self.req, entity=entity)
-        for rschema, target in self.editable_attributes(entity):
-            field = find_field(entity.__class__, entity.e_schema, rschema, target)
-            form.fields.append(field)
-        form.buttons.append(form.button_ok())
-        form.buttons.append(form.button_apply())
-        form.buttons.append(form.button_cancel())
-        self.w(form.form_render())
-
-    def editable_attributes(self, entity):
-        # XXX both (add, delete)
-        return [(rschema, x) for rschema, _, x in entity.relations_by_category(('primary', 'secondary'), 'add')
-                if rschema != 'eid']
     
     
 class EditionForm(FormMixIn, EntityView):
@@ -242,8 +72,7 @@
 '''
 
     def cell_call(self, row, col, **kwargs):
-        self.req.add_js( ('cubicweb.ajax.js', 'cubicweb.edition.js') )
-        self.req.add_css('cubicweb.form.css')
+        self.req.add_js( ('cubicweb.ajax.js', ) )
         entity = self.complete_entity(row, col)
         self.edit_form(entity, kwargs)
 
@@ -512,7 +341,7 @@
 
 
     
-class CreationForm(_EditionForm):
+class CreationForm(EditionForm):
     __select__ = specified_etype_implements('Any')
     # XXX bw compat, use View.registered since we don't want accept_compat
     #    wrapper set in EntityView
@@ -522,8 +351,7 @@
     
     def call(self, **kwargs):
         """creation view for an entity"""
-        self.req.add_js( ('cubicweb.ajax.js', 'cubicweb.edition.js') )
-        self.req.add_css('cubicweb.form.css')
+        self.req.add_js( ('cubicweb.ajax.js',) )
         self.initialize_varmaker()
         etype = kwargs.pop('etype', self.req.form.get('etype'))
         try:
@@ -657,7 +485,6 @@
         :param rtype: the relation bridging `etype` and `parent`
         :param role: the role played by the `parent` in the relation
         """
-        self.req.add_css('cubicweb.form.css')
         try:
             entity = self.vreg.etype_class(etype)(self.req, None, None)
         except:
@@ -694,7 +521,6 @@
         insertions of <div class="section"> between each row of
         the resultset
         """
-        self.req.add_css('cubicweb.form.css')
         rset = self.rset
         for i in xrange(len(rset)):
             self.wview(self.id, rset, row=i, **kwargs)
@@ -726,8 +552,7 @@
     title = _('copy edition')
 
     def cell_call(self, row, col, **kwargs):
-        self.req.add_js(('cubicweb.ajax.js', 'cubicweb.edition.js'))
-        self.req.add_css('cubicweb.form.css')
+        self.req.add_js(('cubicweb.ajax.js',))
         entity = self.complete_entity(row, col, skip_bytes=True)
         # make a copy of entity to avoid altering the entity in the
         # request's cache. 
@@ -807,8 +632,6 @@
         """
         req = self.req
         form = req.form
-        req.add_js('cubicweb.edition.js')
-        req.add_css('cubicweb.form.css')
         _ = req._
         sampleentity = self.complete_entity(0)
         attrheaders = [u'<th>%s</th>' % rdef[0].display_name(req, rdef[-1])