def post(self, request, namespace=None, report_slug=None): # handle REST calls if 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(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) response = [] for field in form.dynamic_fields(): response.append({'id': field.auto_id, 'html': str(field)}) return HttpResponse(json.dumps(response))
def get(self, request, namespace=None, report_slug=None, widget_id=None): try: all_fields = SortedDict() if widget_id: w = Widget.objects.get(pk=widget_id) all_fields = w.collect_fields() else: report = Report.objects.get(namespace=namespace, slug=report_slug) fields_by_section = report.collect_fields_by_section() for c in fields_by_section.values(): all_fields.update(c) except: raise Http404 form = TableFieldForm(all_fields, use_widgets=False) # create object from the tablefield keywords # then populate it with the initial data that got generated by default keys = form._tablefields.keys() criteria = dict(zip(keys, [None]*len(keys))) criteria.update(form.data) return HttpResponse(json.dumps(criteria))
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 get_form(self, table, data=None): # First see if there's a single report associated with this table, # and if so, use it to get the field set widgets = Widget.objects.filter(tables__in=[table]) sections = set() for w in widgets: sections.add(w.section) if len(sections) == 1: all_fields = widgets[0].collect_fields() else: all_fields = {} for f in table.fields.all(): all_fields[f.keyword] = f return TableFieldForm(all_fields, use_widgets=False, data=data)
def get(self, request, namespace=None, report_slug=None): # handle REST calls if request.accepted_renderer.format != 'html': if namespace and report_slug: queryset = Report.objects.get(namespace=namespace, slug=report_slug) elif report_slug: queryset = Report.objects.get(namespace='default', slug=report_slug) elif namespace: queryset = Report.objects.filter(namespace='default') else: queryset = Report.objects.all() serializer = ReportSerializer(instance=queryset) return Response(serializer.data) # handle HTML calls try: if namespace is None: namespace = 'default' if report_slug is None: reports = (Report.objects.filter(namespace=namespace) .order_by('position')) kwargs = {'report_slug': reports[0].slug, 'namespace': namespace} return HttpResponseRedirect(reverse('report-view', kwargs=kwargs)) else: report = Report.objects.get(namespace=namespace, slug=report_slug) except: raise Http404 logging.debug('Received request for report page: %s' % report_slug) # search across all enabled devices for device in Device.objects.all(): if (device.enabled and ('host.or.ip' in device.host or device.username == '<username>' or device.password == '<password>' or device.password == '')): return HttpResponseRedirect('%s?invalid=true' % reverse('device-list')) profile = request.user.userprofile if not profile.profile_seen: # only redirect if first login return HttpResponseRedirect(reverse('preferences')+'?next=/report') # factory this to make it extensible form_init = {'ignore_cache': request.user.userprofile.ignore_cache} # Collect all fields organized by section, with section id 0 # representing common report level fields fields_by_section = report.collect_fields_by_section() # Merge fields into a single dict for use by the Django Form # logic all_fields = SortedDict() [all_fields.update(c) for c in fields_by_section.values()] form = TableFieldForm(all_fields, hidden_fields=report.hidden_fields, initial=form_init) # Build a section map that indicates which section each field # belongs in when displayed section_map = [] if fields_by_section[0]: section_map.append({'title': 'Common', 'parameters': fields_by_section[0]}) for s in Section.objects.filter(report=report).order_by('position'): show = False for v in fields_by_section[s.id].values(): if v.keyword not in (report.hidden_fields or []): show = True break if show: section_map.append({'title': s.title, 'parameters': fields_by_section[s.id]}) return render_to_response('report.html', {'report': report, 'developer': profile.developer, 'maps_version': profile.maps_version, 'maps_api_key': profile.maps_api_key, 'endtime': 'endtime' in form.fields, 'form': form, 'section_map': section_map, 'show_sections': (len(section_map) > 1)}, context_instance=RequestContext(request))
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)