# HG changeset patch # User Adrien Di Mascio # Date 1236846572 -3600 # Node ID b7b58c3bb575fcc231ba3c68415a108b67d3724e # Parent c5e0768961c848a6cd6bb63548dd6b1145b128b3 commit pending work (started in TLS): starting to implement Creation/Edition form with new form API diff -r c5e0768961c8 -r b7b58c3bb575 web/views/baseforms.py --- a/web/views/baseforms.py Wed Mar 11 23:29:21 2009 +0100 +++ b/web/views/baseforms.py Thu Mar 12 09:29:32 2009 +0100 @@ -26,7 +26,7 @@ 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 +from cubicweb.web.formfields import StringField, RichTextField, find_field from cubicweb.web.formwidgets import HiddenInput _ = unicode @@ -152,6 +152,52 @@ 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): """primary entity edition form @@ -466,7 +512,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 @@ -478,12 +524,14 @@ """creation view for an entity""" self.req.add_js( ('cubicweb.ajax.js', 'cubicweb.edition.js') ) self.req.add_css('cubicweb.form.css') + self.initialize_varmaker() etype = kwargs.pop('etype', self.req.form.get('etype')) try: entity = self.vreg.etype_class(etype)(self.req, None, None) except: self.w(self.req._('no such entity type %s') % etype) else: + entity.eid = self.varmaker.next() self.edit_form(entity, kwargs) def action_title(self, entity):