diff -r 7070250bf50d -r 0a927fe4541b web/views/autoform.py --- a/web/views/autoform.py Fri Dec 09 12:14:11 2011 +0100 +++ b/web/views/autoform.py Fri Dec 16 12:30:12 2011 +0100 @@ -134,10 +134,11 @@ from cubicweb.selectors import ( match_kwargs, match_form_params, non_final_entity, specified_etype_implements) -from cubicweb.utils import json_dumps +from cubicweb.utils import json, json_dumps from cubicweb.web import (stdmsgs, uicfg, eid_param, form as f, formwidgets as fw, formfields as ff) from cubicweb.web.views import forms +from cubicweb.web.views.ajaxcontroller import ajaxfunc _AFS = uicfg.autoform_section _AFFK = uicfg.autoform_field_kwargs @@ -437,6 +438,70 @@ execute(rql, {'x': subj, 'y': obj}) +# ajax edition helpers ######################################################## +@ajaxfunc(output_type='xhtml', check_pageid=True) +def inline_creation_form(self, peid, petype, ttype, rtype, role, i18nctx): + view = self._cw.vreg['views'].select('inline-creation', self._cw, + etype=ttype, rtype=rtype, role=role, + peid=peid, petype=petype) + return self._call_view(view, i18nctx=i18nctx) + +@ajaxfunc(output_type='json') +def validate_form(self, action, names, values): + return self.validate_form(action, names, values) + +@ajaxfunc +def cancel_edition(self, errorurl): + """cancelling edition from javascript + + We need to clear associated req's data : + - errorurl + - pending insertions / deletions + """ + self._cw.cancel_edition(errorurl) + +@ajaxfunc(output_type='xhtml') +def reledit_form(self): + req = self._cw + args = dict((x, req.form[x]) + for x in ('formid', 'rtype', 'role', 'reload', 'action')) + rset = req.eid_rset(typed_eid(self._cw.form['eid'])) + try: + args['reload'] = json.loads(args['reload']) + except ValueError: # not true/false, an absolute url + assert args['reload'].startswith('http') + view = req.vreg['views'].select('reledit', req, rset=rset, rtype=args['rtype']) + return self._call_view(view, **args) + + +def _add_pending(req, eidfrom, rel, eidto, kind): + key = 'pending_%s' % kind + pendings = req.session.data.setdefault(key, set()) + pendings.add( (typed_eid(eidfrom), rel, typed_eid(eidto)) ) + +def _remove_pending(req, eidfrom, rel, eidto, kind): + key = 'pending_%s' % kind + pendings = req.session.data[key] + pendings.remove( (typed_eid(eidfrom), rel, typed_eid(eidto)) ) + +@ajaxfunc(output_type='json') +def remove_pending_insert(self, (eidfrom, rel, eidto)): + _remove_pending(self._cw, eidfrom, rel, eidto, 'insert') + +@ajaxfunc(output_type='json') +def add_pending_inserts(self, tripletlist): + for eidfrom, rel, eidto in tripletlist: + _add_pending(self._cw, eidfrom, rel, eidto, 'insert') + +@ajaxfunc(output_type='json') +def remove_pending_delete(self, (eidfrom, rel, eidto)): + _remove_pending(self._cw, eidfrom, rel, eidto, 'delete') + +@ajaxfunc(output_type='json') +def add_pending_delete(self, (eidfrom, rel, eidto)): + _add_pending(self._cw, eidfrom, rel, eidto, 'delete') + + class GenericRelationsWidget(fw.FieldWidget): def render(self, form, field, renderer):