def view_records(request, app="mypartners", model="contactrecord"): """ Returns records as JSON. Inputs: :request: Request object to inspect for search parameters. :app: Application to query. :model: Model to query. Query String Parameters: :values: The fields to include in the output. :order_by: The field to order the results by. Prefix with a '-' to indiciate descending order. Output: A JSON response containing the records queried for. """ if request.is_ajax() and request.method == 'GET': company = get_company_or_404(request) # parse request into dict, converting singleton lists into single items params = parse_params(request.GET) # remove non-query related params values = params.pop('values', None) order_by = params.pop('order_by', None) records = get_model(app, model).objects.from_search( company, params) if values: if not hasattr(values, '__iter__'): values = [values] records = records.values(*values) if order_by: if not hasattr(order_by, '__iter__'): order_by = [order_by] records = records.order_by(*order_by) ctx = serialize('json', records, values=values) response = HttpResponse( ctx, content_type='application/json; charset=utf-8') return response else: raise Http404("This view is only reachable via an AJAX GET request.")
def test_parse_params(self): """Test that params are properly parsed from a `QueryDict`.""" factory = RequestFactory() request = factory.post( "/reports/view/mypartners/contact", data=dict(baz=u"", biz=[u"bez", u""], foo=["bar", "baz"], buz=["biz"], quz="fizz", quox="false"), ) params = helpers.parse_params(request.POST) # Singleton lists should be flattened into single elements, lists # should be converted to tuples, and already flat elements should # remain untouched. self.assertEqual(params, dict(biz=u"bez", foo=("bar", "baz"), buz="biz", quz="fizz", quox=False))
def post(self, request, app='mypartners', model='contactrecords'): """ Create a report by querying on a specific model. The request's POST data is parsed for parameters to pass to the model's `from_search` method. Inputs: :app: The app to which the model belongs. :model: The model to query on Query String Parameters: :csrfmiddlewaretoken: Used to prevent Cross Site Request Forgery. :report_name: What to name the report. Spaces are converted to underscores. :values: Fields to include in report output. Outputs: An HttpResponse indicating success or failure of report creation. """ company = get_company_or_404(request) params = parse_params(request.POST) params.pop('csrfmiddlewaretoken', None) name = params.pop('report_name', str(datetime.now())) values = params.pop('values', None) records = get_model(app, model).objects.from_search( company, params) if values: if not hasattr(values, '__iter__'): values = [values] records = records.values(*values) contents = serialize('json', records, values=values) results = ContentFile(contents) report, created = Report.objects.get_or_create( name=name, created_by=request.user, owner=company, app=app, model=model, values=json.dumps(values), params=json.dumps(params)) report.results.save('%s-%s.json' % (name, report.pk), results) return HttpResponse(name, content_type='text/plain')