Example #1
0
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.")
Example #2
0
    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))
Example #3
0
    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')