def run(self): # Collect all dependent tables options = self.table.options model = get_schema_map()[options.schema] df = model.objects.get_dataframe() if df.empty: return QueryError( 'No metrics defined for schema "%s". Add new metrics ' 'using the <a href="%s">admin interface</a>.' % (options.schema, reverse('admin:metrics_plugin_%s_changelist' % model.__name__.lower())) ) # Add some default columns as needed # new ones are created as normal columns vs ephemeral - the table # schema will not be dynamic, any changes will be done via code # changes and/or a report reload. # We check to see if some have already been defined to allow for # customization of the actual labels or column display keys = list(df.keys()) for k in keys: try: Column.objects.get(table=self.job.table, name=k) except ObjectDoesNotExist: Column.create(self.job.table, k, k.title(), datatype='string') logger.debug("%s: completed successfully" % self) return QueryComplete(df)
def get(self, request, schema, metric_name): try: model = get_schema_map()[schema] serializer_cls = find_serializer(model, method='GET') except Exception as e: logger.error(e) raise Http404 metric = get_object_or_404(model, name=metric_name) serializer = serializer_cls(instance=metric) data = serializer.data return Response(data)
def post(self, request, schema): logger.debug('Received metric POST for schema %s' % schema) try: model = get_schema_map()[schema] get_kwargs = self.get_kwargs(model, request) serializer_cls = find_serializer(model, method='POST') except Exception as e: logger.error(e) raise Http404 metric = get_object_or_404(model, **get_kwargs) serialized = serializer_cls(instance=metric, data=request.DATA, context=request.DATA) if serialized.is_valid(): serialized.save() return HttpResponse(status=200) else: logger.error('serialize error: %s' % serialized.errors) return HttpResponse(status=400)