Esempio n. 1
0
    def test_validate_form_against_field_choices(self):
        self.table.field_set.filter(name__in=["uf", "city"]).update(
            frontend_filter=True)
        uf_field = self.table.get_field("uf")
        uf_field.has_choices = True
        uf_field.choices = {"data": ["RJ", "SP", "MG"]}
        uf_field.save()
        city_field = self.table.get_field("city")
        city_field.has_choices = True
        city_field.choices = {
            "data": ["Rio de Janeiro", "São Pauyo", "Belo Horizonte"]
        }
        city_field.save()

        # valid form
        DynamicFormClasss = get_table_dynamic_form(self.table, cache=False)
        form = DynamicFormClasss(data={"uf": "RJ", "city": "Rio de Janeiro"})
        assert isinstance(form.fields["uf"], ChoiceField)
        assert isinstance(form.fields["city"], ChoiceField)
        assert form.is_valid()
        assert {"uf": "RJ", "city": "Rio de Janeiro"} == form.cleaned_data

        # invalid form
        DynamicFormClasss = get_table_dynamic_form(self.table, cache=False)
        form = DynamicFormClasss(data={"uf": "XXX", "city": "Rio de Janeiro"})
        assert not form.is_valid()
        assert "uf" in form.errors
        assert "city" not in form.errors
        assert {"city": "Rio de Janeiro"} == form.cleaned_data
Esempio n. 2
0
    def test_filter_form_does_not_invalidate_if_no_data(self):
        self.table.field_set.filter(name__in=["uf", "city"]).update(
            frontend_filter=True)

        DynamicFormClasss = get_table_dynamic_form(self.table, cache=False)
        form = DynamicFormClasss(data={})

        assert form.is_valid()
        assert {"uf": "", "city": ""} == form.cleaned_data
Esempio n. 3
0
    def test_generate_form_based_in_table_filtering(self):
        self.table.field_set.filter(name__in=["uf", "city"]).update(
            frontend_filter=True)

        DynamicFormClasss = get_table_dynamic_form(self.table, cache=False)
        form = DynamicFormClasss()

        assert "uf" in form.fields
        assert "city" in form.fields
        assert isinstance(form.fields["uf"],
                          type(self.get_model_field("uf").formfield()))
        assert isinstance(form.fields["city"],
                          type(self.get_model_field("city").formfield()))
Esempio n. 4
0
    def get_queryset(self):
        querystring = self.request.query_params.copy()
        for pagination_key in ("limit", "offset"):
            if pagination_key in querystring:
                del querystring[pagination_key]

        Model = self.get_model_class()
        query, search_query, order_by = parse_querystring(querystring)

        DynamicForm = get_table_dynamic_form(self.get_table())
        filter_form = DynamicForm(data=query)
        if filter_form.is_valid():
            query = {
                k: v
                for k, v in filter_form.cleaned_data.items() if v != ""
            }
        else:
            raise InvalidFiltersException(filter_form.errors)

        return Model.objects.composed_query(query, search_query, order_by)
Esempio n. 5
0
    def test_none_value_should_display_vazio(self):
        self.table.field_set.filter(name__in=["uf"]).update(
            frontend_filter=True)
        uf_field = self.table.get_field("uf")
        uf_field.has_choices = True
        uf_field.choices = {"data": ["RJ", "SP", "MG", "None"]}
        uf_field.save()
        expected = [
            ("", "Todos"),
            ("RJ", "RJ"),
            ("SP", "SP"),
            ("MG", "MG"),
            ("None", "(vazio)"),
        ]

        # valid form
        DynamicFormClasss = get_table_dynamic_form(self.table, cache=False)

        assert sorted(expected) == sorted(
            DynamicFormClasss().fields["uf"].choices)
Esempio n. 6
0
    def test_choice_failback_to_default_type_if_has_choice_field_but_no_data(
            self):
        self.table.field_set.filter(name__in=["uf", "city"]).update(
            frontend_filter=True)
        uf_field = self.table.get_field("uf")
        uf_field.has_choices = True
        uf_field.save()
        city_field = self.table.get_field("city")
        city_field.has_choices = True
        city_field.save()

        DynamicFormClasss = get_table_dynamic_form(self.table, cache=False)
        form = DynamicFormClasss()

        assert "uf" in form.fields
        assert "city" in form.fields
        assert isinstance(form.fields["uf"],
                          type(self.get_model_field("uf").formfield()))
        assert isinstance(form.fields["city"],
                          type(self.get_model_field("city").formfield()))
Esempio n. 7
0
def dataset_detail(request, slug, tablename=""):
    if len(request.GET) > 0 and not request.user.is_authenticated:
        return redirect(f"{settings.LOGIN_URL}?next={request.get_full_path()}")

    try:
        dataset = Dataset.objects.get(slug=slug)
    except Dataset.DoesNotExist:
        context = {"message": "Dataset does not exist"}
        return render(request, "404.html", context, status=404)

    if not tablename:
        tablename = dataset.get_default_table().name
        return redirect(
            reverse(
                "core:dataset-table-detail",
                kwargs={
                    "slug": slug,
                    "tablename": tablename
                },
            ))

    try:
        allow_hidden = request.user.is_superuser
        table = dataset.get_table(tablename, allow_hidden=allow_hidden)
    except Table.DoesNotExist:
        context = {"message": "Table does not exist"}
        try:
            # log 404 request only if hidden table exist
            hidden_table = dataset.get_table(tablename, allow_hidden=True)
            if hidden_table:
                log_blocked_request(request, 404)
        except Table.DoesNotExist:
            pass
        return render(request, "404.html", context, status=404)

    querystring = request.GET.copy()
    page_number = querystring.pop("page", ["1"])[0].strip() or "1"
    items_per_page = querystring.pop("items", [str(
        settings.ROWS_PER_PAGE)])[0].strip() or str(settings.ROWS_PER_PAGE)
    download_csv = querystring.pop("format", [""]) == ["csv"]
    try:
        page = int(page_number)
    except ValueError:
        context = {"message": "Invalid page number."}
        return render(request, "404.html", context, status=404)
    try:
        items_per_page = int(items_per_page)
    except ValueError:
        context = {"message": "Invalid items per page."}
        return render(request, "404.html", context, status=404)
    items_per_page = min(items_per_page, 1000)

    version = dataset.version_set.order_by("-order").first()

    TableModel = table.get_model()
    query, search_query, order_by = parse_querystring(querystring)

    DynamicForm = get_table_dynamic_form(table)
    filter_form = DynamicForm(data=query)
    if filter_form.is_valid():
        query = {k: v for k, v in filter_form.cleaned_data.items() if v != ""}
    else:
        query = {}

    all_data = TableModel.objects.composed_query(query, search_query, order_by)

    if download_csv:
        user_agent = request.headers.get("User-Agent", "")
        block_agent = any(True for agent in settings.BLOCKED_AGENTS
                          if agent.lower() in user_agent.lower())

        if not any([query, search_query]) or not user_agent or block_agent:
            # User trying to download a CSV without custom filters or invalid
            # user-agent specified.
            context = {
                "html_code_snippet": "core/400-csv-without-filters.html",
                "download_url": dataset.files_url,
            }
            return render(request, "4xx.html", context, status=400)

        if all_data.count() > settings.CSV_EXPORT_MAX_ROWS:
            context = {
                "message": "Max rows exceeded.",
                "title_4xx": "Oops! Ocorreu um erro:"
            }
            return render(request, "4xx.html", context, status=400)

        filename = "{}-{}.csv".format(slug, uuid.uuid4().hex)
        pseudo_buffer = Echo()
        writer = csv.writer(pseudo_buffer, dialect=csv.excel)
        csv_rows = queryset_to_csv(all_data, table.fields)
        response = StreamingHttpResponse(
            (writer.writerow(row) for row in csv_rows),
            content_type="text/csv;charset=UTF-8",
        )
        response["Content-Disposition"] = 'attachment; filename="{}"'.format(
            filename)
        response.encoding = "UTF-8"
        return response

    paginator = Paginator(all_data, items_per_page)
    data = paginator.get_page(page)

    for key, value in list(querystring.items()):
        if not value:
            del querystring[key]

    context = {
        "data": data,
        "dataset": dataset,
        "filter_form": filter_form,
        "max_export_rows": settings.CSV_EXPORT_MAX_ROWS,
        "search_term": querystring.get("search", ""),
        "querystring": querystring.urlencode(),
        "slug": slug,
        "table": table,
        "total_count": all_data.count(),
        "version": version,
    }

    status = 200
    if filter_form.errors:
        status = 400
    return render(request, "core/dataset-detail.html", context, status=status)
Esempio n. 8
0
 def test_table_without_filters_gets_empty_form(self):
     DynamicFormClasss = get_table_dynamic_form(self.table, cache=False)
     form = DynamicFormClasss()
     assert 0 == len(form.fields)