def put(self, request, app_label=None, actor=None): rpt = requested_actor(app_label, actor) PUT = http.QueryDict(request.body) # raw_post_data before Django 1.4 gc = dict( widths=[int(x) for x in PUT.getlist(constants.URL_PARAM_WIDTHS)], columns=[str(x) for x in PUT.getlist(constants.URL_PARAM_COLUMNS)], hiddens=[(x == 'true') for x in PUT.getlist(constants.URL_PARAM_HIDDENS)], #~ hidden_cols=[str(x) for x in PUT.getlist('hidden_cols')], ) filter = PUT.get('filter', None) if filter is not None: filter = json.loads(filter) gc['filters'] = [constants.dict2kw(flt) for flt in filter] name = PUT.get('name', None) if name is None: name = constants.DEFAULT_GC_NAME else: name = int(name) gc.update(label=PUT.get('label', "Standard")) try: msg = rpt.save_grid_config(name, gc) except IOError, e: msg = _("Error while saving GC for %(table)s: %(error)s") % dict( table=rpt, error=e) return settings.SITE.kernel.error(None, msg, alert=True)
def get(self, request, app_label=None, actor=None, pk=None, fldname=None, tplname=None, **kw): if request.method == 'GET': rpt = requested_actor(app_label, actor) elem = rpt.get_row_by_pk(None, pk) if elem is None: raise http.Http404("%s %s does not exist." % (rpt, pk)) TextFieldTemplate = rt.modules.tinymce.TextFieldTemplate if tplname: tft = TextFieldTemplate.objects.get(pk=int(tplname)) if settings.SITE.trusted_templates: #~ return http.HttpResponse(tft.text) template = JinjaTemplate(tft.text) context = dict(request=request, instance=elem, **rt.modules) return http.HttpResponse(template.render(**context)) else: return http.HttpResponse(tft.text) qs = TextFieldTemplate.objects.all().order_by('name') templates = [] for obj in qs: url = dd.plugins.tinymce.build_plain_url( 'templates', app_label, actor, pk, fldname, unicode(obj.pk)) templates.append([ unicode(obj.name), url, unicode(obj.description)]) js = "var tinyMCETemplateList = %s;" % py2js(templates) return http.HttpResponse(js, content_type='text/json') raise http.Http404("Method %r not supported" % request.method)
def get(self, request, app_label=None, rptname=None, fldname=None, **kw): """If `fldname` is specified, return a JSON object with two attributes `count` and `rows`, where `rows` is a list of `(display_text, value)` tuples. Used by ComboBoxes or similar widgets. If `fldname` is not specified, returns the choices for the `record_selector` widget. """ rpt = requested_actor(app_label, rptname) emptyValue = None if fldname is None: ar = rpt.request(request=request) qs = ar.data_iterator def row2dict(obj, d): d[constants.CHOICES_TEXT_FIELD] = str(obj) # getattr(obj,'pk') d[constants.CHOICES_VALUE_FIELD] = obj.pk return d else: # NOTE: if you define a *parameter* with the same name as # some existing *data element* name, then the parameter # will override the data element here in choices view. field = rpt.get_param_elem(fldname) if field is None: field = rpt.get_data_elem(fldname) if field.blank: # logger.info("views.Choices: %r is blank",field) emptyValue = '<br/>' ar = rpt.request(request=request) qs, row2dict = choices_for_field(ar, rpt, field) return choices_response(rpt, request, qs, row2dict, emptyValue)
def put(self, request, app_label=None, actor=None): rpt = requested_actor(app_label, actor) PUT = http.QueryDict(request.body) # raw_post_data before Django 1.4 gc = dict( widths=[int(x) for x in PUT.getlist(constants.URL_PARAM_WIDTHS)], columns=[str(x) for x in PUT.getlist(constants.URL_PARAM_COLUMNS)], hiddens=[(x == 'true') for x in PUT.getlist(constants.URL_PARAM_HIDDENS)], #~ hidden_cols=[str(x) for x in PUT.getlist('hidden_cols')], ) filter = PUT.get('filter', None) if filter is not None: filter = json.loads(filter) gc['filters'] = [constants.dict2kw(flt) for flt in filter] name = PUT.get('name', None) if name is None: name = constants.DEFAULT_GC_NAME else: name = int(name) gc.update(label=PUT.get('label', "Standard")) try: msg = rpt.save_grid_config(name, gc) except IOError as e: msg = _("Error while saving GC for %(table)s: %(error)s") % dict( table=rpt, error=e) return settings.SITE.kernel.error(None, msg, alert=True) #~ logger.info(msg) settings.SITE.kernel.extjs_renderer.build_site_cache(True) return settings.SITE.kernel.success(msg)
def get(self, request, app_label=None, actor=None, pk=None, fldname=None, tplname=None, **kw): if request.method == 'GET': rpt = requested_actor(app_label, actor) elem = rpt.get_row_by_pk(None, pk) if elem is None: raise http.Http404("%s %s does not exist." % (rpt, pk)) TextFieldTemplate = rt.modules.tinymce.TextFieldTemplate if tplname: tft = TextFieldTemplate.objects.get(pk=int(tplname)) if settings.SITE.trusted_templates: #~ return http.HttpResponse(tft.text) template = JinjaTemplate(tft.text) context = dict(request=request, instance=elem, **rt.modules) return http.HttpResponse(template.render(**context)) else: return http.HttpResponse(tft.text) qs = TextFieldTemplate.objects.all().order_by('name') templates = [] for obj in qs: url = dd.plugins.tinymce.build_plain_url( 'templates', app_label, actor, pk, fldname, str(obj.pk)) templates.append([ str(obj.name), url, str(obj.description)]) js = "var tinyMCETemplateList = %s;" % py2js(templates) return http.HttpResponse(js, content_type='text/json') raise http.Http404("Method %r not supported" % request.method)
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 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=str(ar.get_title())) return json_response(kw)
def get(self, request, app_label=None, actor=None, an=None, field=None, **kw): actor = requested_actor(app_label, actor) ba = actor.get_url_action(an) if ba is None: raise Exception("Unknown action %r for %s" % (an, actor)) field = ba.action.get_param_elem(field) qs, row2dict = choices_for_field(request, ba.action, field) if field.blank: emptyValue = '<br/>' else: emptyValue = None return choices_response(request, qs, row2dict, emptyValue)
def get(self, request, app_label=None, actor=None, an=None, field=None, **kw): actor = requested_actor(app_label, actor) ba = actor.get_url_action(an) if ba is None: raise Exception("Unknown action %r for %s" % (an, actor)) field = ba.action.get_param_elem(field) qs, row2dict = choices_for_field(ba.request(request=request), ba.action, field) if field.blank: emptyValue = '<br/>' else: emptyValue = None return choices_response(actor, request, qs, row2dict, emptyValue)
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.kernel.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 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 get(self, request, app_label=None, actor=None, pk=None): """ Works, but is ugly to get list and detail """ rpt = requested_actor(app_label, actor) action_name = request.GET.get(constants.URL_PARAM_ACTION_NAME, rpt.default_elem_action_name) fmt = request.GET.get(constants.URL_PARAM_FORMAT, constants.URL_FORMAT_JSON) sr = request.GET.getlist(constants.URL_PARAM_SELECTED) if not sr: sr = [pk] ar = rpt.request(request=request, selected_pks=sr) if pk is None: rh = ar.ah rows = [ rh.store.row2dict(ar, row, rh.store.all_fields) for row in ar.sliced_data_iterator ] kw = dict(count=ar.get_total_count(), rows=rows) kw.update(title=str(ar.get_title())) return json_response(kw) else: # action_name=="detail": #ba.action.opens_a_window: ba = rpt.get_url_action(action_name) ah = ar.ah ar = ba.request(request=request, selected_pks=sr) elem = ar.selected_rows[0] if fmt == constants.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) elif elem is None: datarec = dict(success=False, message=NOT_FOUND % (rpt, pk)) else: datarec = ar.elem2rec_detailed(elem) return json_response(datarec)
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 get(self, request, app_label=None, rptname=None, fldname=None, **kw): """ Return a JSON object with two attributes `count` and `rows`, where `rows` is a list of `(display_text,value)` tuples. Used by ComboBoxes or similar widgets. If `fldname` is not specified, returns the choices for the `record_selector` widget. """ rpt = requested_actor(app_label, rptname) emptyValue = None if fldname is None: ar = rpt.request(request=request) # ,rpt.default_action) # ~ rh = rpt.get_handle(self) # ~ ar = ViewReportRequest(request,rh,rpt.default_action) # ~ ar = dbtables.TableRequest(self,rpt,request,rpt.default_action) # ~ rh = ar.ah # ~ qs = ar.get_data_iterator() qs = ar.data_iterator # ~ qs = rpt.request(self).get_queryset() def row2dict(obj, d): d[constants.CHOICES_TEXT_FIELD] = str(obj) # getattr(obj,'pk') d[constants.CHOICES_VALUE_FIELD] = obj.pk return d else: """ NOTE: if you define a *parameter* with the same name as some existing *data element* name, then the parameter will override the data element. At least here in choices view. """ # ~ field = find_field(rpt.model,fldname) field = rpt.get_param_elem(fldname) if field is None: field = rpt.get_data_elem(fldname) if field.blank: # ~ logger.info("views.Choices: %r is blank",field) emptyValue = '' qs, row2dict = choices_for_field(rpt.request(request=request), rpt, field) return choices_response(rpt, request, qs, row2dict, emptyValue)
def get(self, request, app_label=None, rptname=None, fldname=None, **kw): """ Return a JSON object with two attributes `count` and `rows`, where `rows` is a list of `(display_text,value)` tuples. Used by ComboBoxes or similar widgets. If `fldname` is not specified, returns the choices for the `record_selector` widget. """ rpt = requested_actor(app_label, rptname) emptyValue = None if fldname is None: ar = rpt.request(request=request) # ,rpt.default_action) #~ rh = rpt.get_handle(self) #~ ar = ViewReportRequest(request,rh,rpt.default_action) #~ ar = dbtables.TableRequest(self,rpt,request,rpt.default_action) #~ rh = ar.ah #~ qs = ar.get_data_iterator() qs = ar.data_iterator #~ qs = rpt.request(self).get_queryset() def row2dict(obj, d): d[constants.CHOICES_TEXT_FIELD] = unicode(obj) # getattr(obj,'pk') d[constants.CHOICES_VALUE_FIELD] = obj.pk return d else: """ NOTE: if you define a *parameter* with the same name as some existing *data element* name, then the parameter will override the data element. At least here in choices view. """ #~ field = find_field(rpt.model,fldname) field = rpt.get_param_elem(fldname) if field is None: field = rpt.get_data_elem(fldname) if field.blank: #~ logger.info("views.Choices: %r is blank",field) emptyValue = '<br/>' qs, row2dict = choices_for_field(request, rpt, field) return choices_response(request, qs, row2dict, emptyValue)
def get(self, request, app_label=None, actor=None, pk=None): # this is also used by the react front end ui = settings.SITE.kernel rpt = requested_actor(app_label, actor) # if not rpt.get_view_permission(request.user.user_type): # raise PermissionDenied("{} has permission to view {}".format( # request.user.user_type, rpt)) # print(rpt, request.user.user_type) action_name = request.GET.get(constants.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 # Use url selected rows as selected PKs if defined, otherwise use the PK defined in the url path sr = request.GET.getlist(constants.URL_PARAM_SELECTED) if not sr: sr = [pk] ar = ba.request(request=request, selected_pks=sr) # print( # "20170116 views.ApiElement.get", ba, # ar.action_param_values) if len(ar.selected_rows): elem = ar.selected_rows[0] else: raise http.Http404("No permission to see {} {}.".format(rpt, action_name)) else: ar = ba.request(request=request) elem = None # ar.renderer = ui.extjs_renderer ar.renderer = ui.default_renderer ah = ar.ah if not ar.get_permission(): msg = "No permission to run {}".format(ar) # raise Exception(msg) raise PermissionDenied(msg) fmt = request.GET.get( constants.URL_PARAM_FORMAT, ba.action.default_format) if ba.action.opens_a_window: if fmt == constants.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) elif elem is None: datarec = dict( success=False, message=NOT_FOUND % (rpt, pk)) else: datarec = ar.elem2rec_detailed(elem) datarec.update(test_version_mismatch(request)) return json_response(datarec) after_show = ar.get_status(record_id=pk) tab = request.GET.get(constants.URL_PARAM_TAB, None) if tab is not None: tab = int(tab) after_show.update(active_tab=tab) return http.HttpResponse( ar.renderer.html_page( request, ba.action.label, on_ready=ar.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] elif elem is None: raise http.Http404(NOT_FOUND % (rpt, pk)) return settings.SITE.kernel.run_action(ar)
def get(self, request, app_label=None, actor=None, pk=None): ui = settings.SITE.kernel rpt = requested_actor(app_label, actor) action_name = request.GET.get(constants.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, selected_pks=[pk]) # print( # "20170116 views.ApiElement.get", ba, # ar.action_param_values) elem = ar.selected_rows[0] else: ar = ba.request(request=request) elem = None ar.renderer = ui.extjs_renderer ah = ar.ah fmt = request.GET.get(constants.URL_PARAM_FORMAT, ba.action.default_format) if ba.action.opens_a_window: if fmt == constants.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) elif elem is None: datarec = dict(success=False, message=NOT_FOUND % (rpt, pk)) else: datarec = ar.elem2rec_detailed(elem) return json_response(datarec) after_show = ar.get_status(record_id=pk) tab = request.GET.get(constants.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] elif elem is None: raise http.Http404(NOT_FOUND % (rpt, pk)) return settings.SITE.kernel.run_action(ar)
def old_delete(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] return delete_element(ar, elem)
def get(self, request, app_label=None, actor=None, pk=None): ui = settings.SITE.kernel rpt = requested_actor(app_label, actor) action_name = request.GET.get(constants.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] else: ar = ba.request(request=request) elem = None ar.renderer = ui.extjs_renderer ah = ar.ah fmt = request.GET.get( constants.URL_PARAM_FORMAT, ba.action.default_format) if ba.action.opens_a_window: if fmt == constants.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) elif elem is None: datarec = dict( success=False, message=NOT_FOUND % (rpt, pk)) else: datarec = ar.elem2rec_detailed(elem) return json_response(datarec) after_show = ar.get_status(record_id=pk) tab = request.GET.get(constants.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] elif elem is None: raise http.Http404(NOT_FOUND % (rpt, pk)) return settings.SITE.kernel.run_action(ar)
def get(self, request, app_label=None, actor=None, pk=None): ui = settings.SITE.kernel rpt = requested_actor(app_label, actor) # if not rpt.get_view_permission(request.user.user_type): # raise PermissionDenied("{} has permission to view {}".format( # request.user.user_type, rpt)) # print(rpt, request.user.user_type) action_name = request.GET.get(constants.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 # Use url selected rows as selected PKs if defined, otherwise use the PK defined in the url path sr = request.GET.getlist(constants.URL_PARAM_SELECTED) if not sr: sr = [pk] ar = ba.request(request=request, selected_pks=sr) # print( # "20170116 views.ApiElement.get", ba, # ar.action_param_values) elem = ar.selected_rows[0] else: ar = ba.request(request=request) elem = None ar.renderer = ui.extjs_renderer ah = ar.ah fmt = request.GET.get( constants.URL_PARAM_FORMAT, ba.action.default_format) if ba.action.opens_a_window: if fmt == constants.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) elif elem is None: datarec = dict( success=False, message=NOT_FOUND % (rpt, pk)) else: datarec = ar.elem2rec_detailed(elem) datarec.update(test_version_mismatch(request)) return json_response(datarec) after_show = ar.get_status(record_id=pk) tab = request.GET.get(constants.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] elif elem is None: raise http.Http404(NOT_FOUND % (rpt, pk)) return settings.SITE.kernel.run_action(ar)