def post(self, request, namespace, report_slug, widget_id, format=None): logger.debug("Received POST for report %s, widget %s: %s" % (report_slug, widget_id, request.POST)) try: report = Report.objects.get(namespace=namespace, slug=report_slug) widget = Widget.objects.get(id=widget_id) except: raise Http404 req_json = json.loads(request.POST['criteria']) fields = widget.collect_fields() form = TableFieldForm(fields, use_widgets=False, hidden_fields=report.hidden_fields, include_hidden=True, data=req_json, files=request.FILES) if not form.is_valid(): raise ValueError("Widget internal criteria form is invalid:\n%s" % (form.errors.as_text())) if form.is_valid(): logger.debug('Form passed validation: %s' % form) formdata = form.cleaned_data logger.debug('Form cleaned data: %s' % formdata) # parse time and localize to user profile timezone profile = request.user.userprofile timezone = pytz.timezone(profile.timezone) form.apply_timezone(timezone) form_criteria = form.criteria() logger.debug('Form_criteria: %s' % form_criteria) try: job = Job.create(table=widget.table(), criteria=form_criteria) job.start() wjob = WidgetJob(widget=widget, job=job) wjob.save() logger.debug("Created WidgetJob %s for report %s (handle %s)" % (str(wjob), report_slug, job.handle)) return Response({"joburl": reverse('report-job-detail', args=[namespace, report_slug, widget_id, wjob.id])}) except Exception as e: logger.exception("Failed to start job, an exception occurred") return HttpResponse(str(e), status=400) else: logger.error("form is invalid, entering debugger") from IPython import embed; embed()
def post(self, request, namespace, report_slug, widget_id, format=None): logger.debug("Received POST for report %s, widget %s: %s" % (report_slug, widget_id, request.POST)) try: report = Report.objects.get(namespace=namespace, slug=report_slug) widget = Widget.objects.get(id=widget_id) except: raise Http404 req_json = json.loads(request.POST['criteria']) fields = widget.collect_fields() form = TableFieldForm(fields, use_widgets=False, hidden_fields=report.hidden_fields, include_hidden=True, data=req_json, files=request.FILES) if not form.is_valid(): raise ValueError("Widget internal criteria form is invalid:\n%s" % (form.errors.as_text())) if form.is_valid(): logger.debug('Form passed validation: %s' % form) formdata = form.cleaned_data logger.debug('Form cleaned data: %s' % formdata) # parse time and localize to user profile timezone profile = request.user.userprofile timezone = pytz.timezone(profile.timezone) form.apply_timezone(timezone) try: job = Job.create(table=widget.table(), criteria=form.criteria()) job.start() wjob = WidgetJob(widget=widget, job=job) wjob.save() logger.debug("Created WidgetJob %s for report %s (handle %s)" % (str(wjob), report_slug, job.handle)) return Response({"joburl": reverse('report-job-detail', args=[namespace, report_slug, widget_id, wjob.id])}) except Exception as e: logger.exception("Failed to start job, an exception occurred") return HttpResponse(str(e), status=400) else: logger.error("form is invalid, entering debugger") from IPython import embed; embed()
def post(self, request, namespace=None, report_slug=None): # handle REST calls if namespace is None or report_slug is None: return self.http_method_not_allowed(request) logger.debug("Received POST for report %s, with params: %s" % (report_slug, request.POST)) try: report = Report.objects.get(namespace=namespace, slug=report_slug) except: raise Http404 fields_by_section = report.collect_fields_by_section() all_fields = SortedDict() [all_fields.update(c) for c in fields_by_section.values()] form = TableFieldForm(all_fields, hidden_fields=report.hidden_fields, data=request.POST, files=request.FILES) if form.is_valid(): logger.debug('Form passed validation: %s' % form) formdata = form.cleaned_data logger.debug('Form cleaned data: %s' % formdata) # parse time and localize to user profile timezone profile = request.user.userprofile timezone = pytz.timezone(profile.timezone) form.apply_timezone(timezone) if formdata['debug']: logger.debug("Debugging report and rotating logs now ...") management.call_command('rotate_logs') logger.debug("Report %s validated form: %s" % (report_slug, formdata)) # setup definitions for each Widget definition = [] # store datetime info about when report is being run # XXX move datetime format to preferences or somesuch now = datetime.datetime.now(timezone) definition.append({'datetime': str(date(now, 'jS F Y H:i:s')), 'timezone': str(timezone), 'debug': formdata['debug']}) # create matrix of Widgets lastrow = -1 rows = [] for w in report.widgets().order_by('row', 'col'): if w.row != lastrow: lastrow = w.row rows.append([]) rows[-1].append(Widget.objects.get_subclass(id=w.id)) # populate definitions for row in rows: for w in row: widget_def = {"widgettype": w.widgettype().split("."), "posturl": reverse('widget-job-list', args=(report.namespace, report.slug, w.id)), "options": w.uioptions, "widgetid": w.id, "row": w.row, "width": w.width, "height": w.height, "criteria": w.criteria_from_form(form) } definition.append(widget_def) logger.debug("Sending widget definitions for report %s: %s" % (report_slug, definition)) return HttpResponse(json.dumps(definition)) else: # return form with errors attached in a HTTP 200 Error response return HttpResponse(str(form.errors), status=400)