def render_action_response(self, ar): """Builds a JSON response from response information stored in given ActionRequest. """ # logger.info("20140430 render_action_response %s", ar.response) return views.json_response(ar.response, ar.content_type)
def get(self, request, app_label=None, actor=None, pk=None): rpt = requested_actor(app_label, actor) assert pk is None, 20120814 ar = rpt.request(request=request) rh = ar.ah rows = [ rh.store.row2dict(ar, row, rh.store.list_fields) for row in ar.sliced_data_iterator] kw = dict(count=ar.get_total_count(), rows=rows) kw.update(title=unicode(ar.get_title())) return json_response(kw)
def put(self, request, app_label=None, actor=None, pk=None): rpt = requested_actor(app_label, actor) ar = rpt.request(request=request) ar.set_selected_pks(pk) elem = ar.selected_rows[0] rh = ar.ah data = http.QueryDict(request.body).get('rows') data = json.loads(data) a = rpt.get_url_action(rpt.default_list_action_name) ar = rpt.request(request=request, action=a) ar.renderer = settings.SITE.ui.extjs_renderer ar.form2obj_and_save(data, elem, False) # Ext.ensible needs list_fields, not detail_fields ar.set_response( rows=[rh.store.row2dict(ar, elem, rh.store.list_fields)]) return json_response(ar.response)
def get(self, request, app_label=None, actor=None, pk=None): #~ ui = settings.SITE.ui rpt = requested_actor(app_label, actor) #~ a = rpt.default_action assert pk is None, 20120814 #~ if pk is None: #~ elem = None #~ else: #~ elem = rpt.get_row_by_pk(pk) ar = rpt.request(request=request) rh = ar.ah rows = [ rh.store.row2dict(ar, row, rh.store.list_fields) for row in ar.sliced_data_iterator] kw = dict(count=ar.get_total_count(), rows=rows) kw.update(title=unicode(ar.get_title())) return json_response(kw)
def post(self, request, app_label=None, actor=None, pk=None): rpt = requested_actor(app_label, actor) ar = rpt.request(request=request) instance = ar.create_instance() # store uploaded files. # html forms cannot send files with PUT or GET, only with POST if ar.actor.handle_uploaded_files is not None: ar.actor.handle_uploaded_files(instance, request) data = request.POST.get('rows') data = json.loads(data) ar.form2obj_and_save(data, instance, True) # Ext.ensible needs list_fields, not detail_fields ar.set_response( rows=[ar.ah.store.row2dict( ar, instance, ar.ah.store.list_fields)]) return json_response(ar.response)
def ajax_error(ar, e): """ Utility function that converts a catched exception to a user-friendly error message. """ if isinstance(e, exceptions.ValidationError): def fieldlabel(name): de = ar.ah.actor.get_data_elem(name) #~ print 20130423, de return force_unicode(getattr(de, 'verbose_name', name)) #~ logger.info("20130418 ajax_error(%s",e.messages) #~ if isinstance(e.messages,dict): md = getattr(e, 'message_dict', None) if md is not None: e = '<br>'.join(["%s : %s" % (fieldlabel(k), v) for k, v in md.items()]) else: e = '<br>'.join(e.messages) ar.error(e, alert=True) return json_response(ar.response)
def get(self, request, app_label=None, actor=None): ar = action_request(app_label, actor, request, request.GET, True) ar.renderer = settings.SITE.ui.extjs_renderer rh = ar.ah fmt = request.GET.get( ext_requests.URL_PARAM_FORMAT, ar.bound_action.action.default_format) if fmt == ext_requests.URL_FORMAT_JSON: rows = [rh.store.row2list(ar, row) for row in ar.sliced_data_iterator] total_count = ar.get_total_count() for row in ar.create_phantom_rows(): d = rh.store.row2list(ar, row) rows.append(d) total_count += 1 kw = dict(count=total_count, rows=rows, success=True, no_data_text=ar.no_data_text, title=unicode(ar.get_title())) if ar.actor.parameters: kw.update( param_values=ar.actor.params_layout.params_store.pv2dict( ar.param_values)) return json_response(kw) if fmt == ext_requests.URL_FORMAT_HTML: after_show = ar.get_status() sp = request.GET.get( ext_requests.URL_PARAM_SHOW_PARAMS_PANEL, None) if sp is not None: #~ after_show.update(show_params_panel=sp) after_show.update( show_params_panel=ext_requests.parse_boolean(sp)) if isinstance(ar.bound_action.action, actions.InsertRow): elem = ar.create_instance() #~ print 20120630 #~ print elem.national_id rec = ar.elem2rec_insert(rh, elem) after_show.update(data_record=rec) kw = dict(on_ready= ar.renderer.action_call( ar.request, ar.bound_action, after_show)) #~ print '20110714 on_ready', params kw.update(title=ar.get_title()) return http.HttpResponse(ar.renderer.html_page(request, **kw)) if fmt == 'csv': #~ response = HttpResponse(mimetype='text/csv') charset = settings.SITE.csv_params.get('encoding', 'utf-8') response = http.HttpResponse( content_type='text/csv;charset="%s"' % charset) if False: response['Content-Disposition'] = \ 'attachment; filename="%s.csv"' % ar.actor else: #~ response = HttpResponse(content_type='application/csv') response['Content-Disposition'] = \ 'inline; filename="%s.csv"' % ar.actor #~ response['Content-Disposition'] = 'attachment; filename=%s.csv' % ar.get_base_filename() w = ucsv.UnicodeWriter(response, **settings.SITE.csv_params) w.writerow(ar.ah.store.column_names()) if True: # 20130418 : also column headers, not only internal names column_names = None fields, headers, cellwidths = ar.get_field_info(column_names) w.writerow(headers) for row in ar.data_iterator: w.writerow([unicode(v) for v in rh.store.row2list(ar, row)]) return response if fmt == ext_requests.URL_FORMAT_PRINTER: if ar.get_total_count() > MAX_ROW_COUNT: raise Exception(_("List contains more than %d rows") % MAX_ROW_COUNT) response = http.HttpResponse( content_type='text/html;charset="utf-8"') doc = xghtml.Document(force_unicode(ar.get_title())) doc.body.append(E.h1(doc.title)) t = doc.add_table() #~ settings.SITE.ui.ar2html(ar,t,ar.data_iterator) ar.dump2html(t, ar.data_iterator) doc.write(response, encoding='utf-8') return response return settings.SITE.ui.run_action(ar)
def get(self, request, app_label=None, actor=None, pk=None): ui = settings.SITE.ui rpt = requested_actor(app_label, actor) action_name = request.GET.get(ext_requests.URL_PARAM_ACTION_NAME, rpt.default_elem_action_name) ba = rpt.get_url_action(action_name) if ba is None: raise http.Http404("%s has no action %r" % (rpt, action_name)) if pk and pk != '-99999' and pk != '-99998': #~ ar = ba.request(request=request,selected_pks=[pk]) #~ print 20131004, ba.actor ar = ba.request(request=request) ar.set_selected_pks(pk) elem = ar.selected_rows[0] if elem is None: raise http.Http404( "%s has no row with primary key %r" % (rpt, pk)) else: ar = ba.request(request=request) elem = None ar.renderer = ui.extjs_renderer ah = ar.ah fmt = request.GET.get( ext_requests.URL_PARAM_FORMAT, ba.action.default_format) if ba.action.opens_a_window: if fmt == ext_requests.URL_FORMAT_JSON: if pk == '-99999': elem = ar.create_instance() datarec = ar.elem2rec_insert(ah, elem) elif pk == '-99998': elem = ar.create_instance() datarec = elem2rec_empty(ar, ah, elem) else: datarec = ar.elem2rec_detailed(elem) return json_response(datarec) after_show = ar.get_status(record_id=pk) tab = request.GET.get(ext_requests.URL_PARAM_TAB, None) if tab is not None: tab = int(tab) after_show.update(active_tab=tab) return http.HttpResponse( ui.extjs_renderer.html_page( request, ba.action.label, on_ready=ui.extjs_renderer.action_call( request, ba, after_show))) if isinstance(ba.action, actions.RedirectAction): target = ba.action.get_target_url(elem) if target is None: raise http.Http404("%s failed for %r" % (ba, elem)) return http.HttpResponseRedirect(target) if pk == '-99998': assert elem is None elem = ar.create_instance() ar.selected_rows = [elem] return settings.SITE.ui.run_action(ar)
else: ar.response.update(message=_("%s : nothing to save.") % dd.obj2unicode(elem)) elem.after_ui_save(ar) if restful: # restful mode (used only for Ext.ensible) needs list_fields, not # detail_fields ar.response.update( rows=[rh.store.row2dict(ar, elem, rh.store.list_fields)]) elif file_upload: ar.response.update(record_id=elem.pk) return json_response(ar.response, content_type='text/html') else: # 20120814 #~ logger.info("20120816 %r", ar.action) #~ if isinstance(ar.bound_action.action,actions.GridEdit): # ~ if ar.bound_action.action.action_name in ('put','post'): # grid.on_afteredit #~ kw.update(rows=[rh.store.row2list(ar,elem)]) #~ else: #~ kw.update(data_record=elem2rec_detailed(ar,elem)) """ TODO: in fact we need *either* `rows` (when this was called from a Grid) *or* `data_record` (when this was called from a form). But how to find out which one is needed? """ ar.response.update(rows=[rh.store.row2list(ar, elem)]) ar.response.update(data_record=elem2rec_detailed(ar, elem)) #~ logger.info("20120208 form2obj_and_save --> %r",kw)