Esempio n. 1
0
def test_create_filter(send_mock, data_fixture):
    user = data_fixture.create_user()
    user_2 = data_fixture.create_user()
    grid_view = data_fixture.create_grid_view(user=user)
    text_field = data_fixture.create_text_field(table=grid_view.table)
    other_field = data_fixture.create_text_field()

    handler = ViewHandler()

    with pytest.raises(UserNotInGroupError):
        handler.create_filter(user=user_2, view=grid_view, field=text_field,
                              type_name='equal', value='test')

    grid_view_type = view_type_registry.get('grid')
    grid_view_type.can_filter = False
    with pytest.raises(ViewFilterNotSupported):
        handler.create_filter(user=user, view=grid_view, field=text_field,
                              type_name='equal', value='test')
    grid_view_type.can_filter = True

    with pytest.raises(ViewFilterTypeDoesNotExist):
        handler.create_filter(user=user, view=grid_view, field=text_field,
                              type_name='NOT_EXISTS', value='test')

    equal_filter_type = view_filter_type_registry.get('equal')
    allowed = equal_filter_type.compatible_field_types
    equal_filter_type.compatible_field_types = []
    with pytest.raises(ViewFilterTypeNotAllowedForField):
        handler.create_filter(user=user, view=grid_view, field=text_field,
                              type_name='equal', value='test')
    equal_filter_type.compatible_field_types = allowed

    with pytest.raises(FieldNotInTable):
        handler.create_filter(user=user, view=grid_view, field=other_field,
                              type_name='equal', value='test')

    view_filter = handler.create_filter(user=user, view=grid_view, field=text_field,
                                        type_name='equal', value='test')

    send_mock.assert_called_once()
    assert send_mock.call_args[1]['view_filter'].id == view_filter.id
    assert send_mock.call_args[1]['user'].id == user.id

    assert ViewFilter.objects.all().count() == 1
    first = ViewFilter.objects.all().first()

    assert view_filter.id == first.id
    assert view_filter.view_id == grid_view.id
    assert view_filter.field_id == text_field.id
    assert view_filter.type == 'equal'
    assert view_filter.value == 'test'

    tmp_field = Field.objects.get(pk=text_field.id)
    view_filter_2 = handler.create_filter(user=user, view=grid_view, field=tmp_field,
                                          type_name='equal', value='test')
    assert view_filter_2.view_id == grid_view.id
    assert view_filter_2.field_id == text_field.id
    assert view_filter_2.type == 'equal'
    assert view_filter_2.value == 'test'
Esempio n. 2
0
def test_create_sort(send_mock, data_fixture):
    user = data_fixture.create_user()
    user_2 = data_fixture.create_user()
    grid_view = data_fixture.create_grid_view(user=user)
    text_field = data_fixture.create_text_field(table=grid_view.table)
    text_field_2 = data_fixture.create_text_field(table=grid_view.table)
    link_row_field = data_fixture.create_link_row_field(table=grid_view.table)
    other_field = data_fixture.create_text_field()

    handler = ViewHandler()

    with pytest.raises(UserNotInGroupError):
        handler.create_sort(user=user_2, view=grid_view, field=text_field,
                            order='ASC')

    grid_view_type = view_type_registry.get('grid')
    grid_view_type.can_sort = False
    with pytest.raises(ViewSortNotSupported):
        handler.create_sort(user=user, view=grid_view, field=text_field,
                            order='ASC')
    grid_view_type.can_sort = True

    with pytest.raises(ViewSortFieldNotSupported):
        handler.create_sort(user=user, view=grid_view, field=link_row_field,
                            order='ASC')

    with pytest.raises(FieldNotInTable):
        handler.create_sort(user=user, view=grid_view, field=other_field,
                            order='ASC')

    view_sort = handler.create_sort(user=user, view=grid_view, field=text_field,
                                    order='ASC')

    send_mock.assert_called_once()
    assert send_mock.call_args[1]['view_sort'].id == view_sort.id
    assert send_mock.call_args[1]['user'].id == user.id

    assert ViewSort.objects.all().count() == 1
    first = ViewSort.objects.all().first()

    assert view_sort.id == first.id
    assert view_sort.view_id == grid_view.id
    assert view_sort.field_id == text_field.id
    assert view_sort.order == 'ASC'

    with pytest.raises(ViewSortFieldAlreadyExist):
        handler.create_sort(user=user, view=grid_view, field=text_field, order='ASC')

    view_sort_2 = handler.create_sort(user=user, view=grid_view, field=text_field_2,
                                      order='DESC')
    assert view_sort_2.view_id == grid_view.id
    assert view_sort_2.field_id == text_field_2.id
    assert view_sort_2.order == 'DESC'
    assert ViewSort.objects.all().count() == 2
Esempio n. 3
0
def test_import_export_grid_view(data_fixture):
    grid_view = data_fixture.create_grid_view(name='Test',
                                              order=1,
                                              filter_type='AND',
                                              filters_disabled=False)
    field = data_fixture.create_text_field(table=grid_view.table)
    imported_field = data_fixture.create_text_field(table=grid_view.table)
    field_option = data_fixture.create_grid_view_field_option(
        grid_view=grid_view, field=field)
    view_filter = data_fixture.create_view_filter(view=grid_view,
                                                  field=field,
                                                  value='test',
                                                  type='equal')
    view_sort = data_fixture.create_view_sort(view=grid_view,
                                              field=field,
                                              order='ASC')

    id_mapping = {'database_fields': {field.id: imported_field.id}}

    grid_view_type = view_type_registry.get('grid')
    serialized = grid_view_type.export_serialized(grid_view)
    imported_grid_view = grid_view_type.import_serialized(
        grid_view.table, serialized, id_mapping)

    assert grid_view.id != imported_grid_view.id
    assert grid_view.name == imported_grid_view.name
    assert grid_view.order == imported_grid_view.order
    assert grid_view.filter_type == imported_grid_view.filter_type
    assert grid_view.filters_disabled == imported_grid_view.filters_disabled
    assert imported_grid_view.viewfilter_set.all().count() == 1
    assert imported_grid_view.viewsort_set.all().count() == 1

    imported_view_filter = imported_grid_view.viewfilter_set.all().first()
    assert view_filter.id != imported_view_filter.id
    assert imported_field.id == imported_view_filter.field_id
    assert view_filter.value == imported_view_filter.value
    assert view_filter.type == imported_view_filter.type

    imported_view_sort = imported_grid_view.viewsort_set.all().first()
    assert view_sort.id != imported_view_sort.id
    assert imported_field.id == imported_view_sort.field_id
    assert view_sort.order == imported_view_sort.order

    imported_field_options = imported_grid_view.get_field_options()
    imported_field_option = imported_field_options[0]
    assert field_option.id != imported_field_option.id
    assert imported_field.id == imported_field_option.field_id
    assert field_option.width == imported_field_option.width
    assert field_option.hidden == imported_field_option.hidden
    assert field_option.order == imported_field_option.order
Esempio n. 4
0
    def import_serialized(self, group, serialized_values, id_mapping,
                          files_zip, storage):
        """
        Imports a database application exported by the `export_serialized` method.
        """

        if "database_tables" not in id_mapping:
            id_mapping["database_tables"] = {}

        tables = serialized_values.pop("tables")
        database = super().import_serialized(group, serialized_values,
                                             id_mapping, files_zip, storage)
        connection = connections[settings.USER_TABLE_DATABASE]

        # First, we want to create all the table instances because it could be that
        # field or view properties depend on the existence of a table.
        for table in tables:
            table_object = Table.objects.create(
                database=database,
                name=table["name"],
                order=table["order"],
            )
            id_mapping["database_tables"][table["id"]] = table_object.id
            table["_object"] = table_object
            table["_field_objects"] = []

        # Because view properties might depend on fields, we first want to create all
        # the fields.
        for table in tables:
            for field in table["fields"]:
                field_type = field_type_registry.get(field["type"])
                field_object = field_type.import_serialized(
                    table["_object"], field, id_mapping)

                if field_object:
                    table["_field_objects"].append(field_object)

        # Now that the all tables and fields exist, we can create the views and create
        # the table schema in the database.
        for table in tables:
            for view in table["views"]:
                view_type = view_type_registry.get(view["type"])
                view_type.import_serialized(table["_object"], view, id_mapping)

            # We don't need to create all the fields individually because the schema
            # editor can handle the creation of the table schema in one go.
            with connection.schema_editor() as schema_editor:
                model = table["_object"].get_model(
                    fields=table["_field_objects"], field_ids=[])
                schema_editor.create_model(model)

        # Now that everything is in place we can start filling the table with the rows
        # in an efficient matter by using the bulk_create functionality.
        for table in tables:
            model = table["_object"].get_model(fields=table["_field_objects"],
                                               field_ids=[])
            field_ids = [
                field_object.id for field_object in table["_field_objects"]
            ]
            rows_to_be_inserted = []

            for row in table["rows"]:
                row_object = model(id=row["id"], order=row["order"])

                for field in table["fields"]:
                    field_type = field_type_registry.get(field["type"])
                    new_field_id = id_mapping["database_fields"][field["id"]]

                    # If the new field id is not present in the field_ids then we don't
                    # want to set that value on the row. This is because upon creation
                    # of the field there could be a deliberate choice not to populate
                    # that field. This is for example the case with the related field
                    # of the `link_row` field which would result in duplicates if we
                    # would populate.
                    if new_field_id in field_ids:
                        field_type.set_import_serialized_value(
                            row_object,
                            f'field_{id_mapping["database_fields"][field["id"]]}',
                            row[f'field_{field["id"]}'],
                            id_mapping,
                            files_zip,
                            storage,
                        )

                rows_to_be_inserted.append(row_object)

            # We want to insert the rows in bulk because there could potentially be
            # hundreds of thousands of rows in there and this will result in better
            # performance.
            model.objects.bulk_create(rows_to_be_inserted)

            # When the rows are inserted we keep the provide the old ids and because of
            # that the auto increment is still set at `1`. This needs to be set to the
            # maximum value because otherwise creating a new row could later fail.
            connection = connections[settings.USER_TABLE_DATABASE]
            sequence_sql = connection.ops.sequence_reset_sql(
                no_style(), [model])
            with connection.cursor() as cursor:
                cursor.execute(sequence_sql[0])

        return database
Esempio n. 5
0
def test_create_view_sort(api_client, data_fixture):
    user, token = data_fixture.create_user_and_token()
    table_1 = data_fixture.create_database_table(user=user)
    table_2 = data_fixture.create_database_table()
    field_1 = data_fixture.create_text_field(table=table_1)
    field_2 = data_fixture.create_text_field(table=table_2)
    field_3 = data_fixture.create_text_field(table=table_1)
    field_4 = data_fixture.create_text_field(table=table_1)
    link_row_field = data_fixture.create_link_row_field(table=table_1)
    view_1 = data_fixture.create_grid_view(table=table_1)
    view_2 = data_fixture.create_grid_view(table=table_2)

    response = api_client.post(
        reverse("api:database:views:list_sortings", kwargs={"view_id": view_2.id}),
        {
            "field": field_2.id,
            "order": "ASC",
        },
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response.json()["error"] == "ERROR_USER_NOT_IN_GROUP"

    response = api_client.post(
        reverse("api:database:views:list_sortings", kwargs={"view_id": 99999}),
        {"field": field_1.id, "order": "ASC", "value": "test"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    assert response.status_code == HTTP_404_NOT_FOUND
    assert response.json()["error"] == "ERROR_VIEW_DOES_NOT_EXIST"

    response = api_client.post(
        reverse("api:database:views:list_sortings", kwargs={"view_id": view_1.id}),
        {"field": 9999999, "order": "NOT_EXISTING"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json["error"] == "ERROR_REQUEST_BODY_VALIDATION"
    assert response_json["detail"]["field"][0]["code"] == "does_not_exist"
    assert response_json["detail"]["order"][0]["code"] == "invalid_choice"

    response = api_client.post(
        reverse("api:database:views:list_sortings", kwargs={"view_id": view_1.id}),
        {
            "field": field_2.id,
            "order": "ASC",
        },
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json["error"] == "ERROR_FIELD_NOT_IN_TABLE"

    grid_view_type = view_type_registry.get("grid")
    grid_view_type.can_sort = False
    response = api_client.post(
        reverse("api:database:views:list_sortings", kwargs={"view_id": view_1.id}),
        {"field": field_1.id, "order": "ASC"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json["error"] == "ERROR_VIEW_SORT_NOT_SUPPORTED"
    grid_view_type.can_sort = True

    response = api_client.post(
        reverse("api:database:views:list_sortings", kwargs={"view_id": view_1.id}),
        {"field": link_row_field.id, "order": "ASC"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json["error"] == "ERROR_VIEW_SORT_FIELD_NOT_SUPPORTED"

    response = api_client.post(
        reverse("api:database:views:list_sortings", kwargs={"view_id": view_1.id}),
        {"field": field_1.id, "order": "ASC"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    assert ViewSort.objects.all().count() == 1
    first = ViewSort.objects.all().first()
    assert response_json["id"] == first.id
    assert response_json["view"] == view_1.id
    assert response_json["field"] == field_1.id
    assert response_json["order"] == "ASC"

    response = api_client.post(
        reverse("api:database:views:list_sortings", kwargs={"view_id": view_1.id}),
        {"field": field_1.id, "order": "ASC"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json["error"] == "ERROR_VIEW_SORT_FIELD_ALREADY_EXISTS"

    response = api_client.post(
        reverse("api:database:views:list_sortings", kwargs={"view_id": view_1.id}),
        {"field": field_3.id, "order": "DESC"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json["order"] == "DESC"

    response = api_client.post(
        reverse("api:database:views:list_sortings", kwargs={"view_id": view_1.id}),
        {
            "field": field_4.id,
        },
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json["order"] == "ASC"

    assert ViewSort.objects.all().count() == 3
Esempio n. 6
0
def test_update_view_filter(api_client, data_fixture):
    user, token = data_fixture.create_user_and_token()
    filter_1 = data_fixture.create_view_filter(user=user, value="test")
    filter_2 = data_fixture.create_view_filter()
    field_1 = data_fixture.create_text_field(table=filter_1.view.table)
    field_2 = data_fixture.create_text_field()

    response = api_client.patch(
        reverse(
            "api:database:views:filter_item", kwargs={"view_filter_id": filter_2.id}
        ),
        {"value": "test"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response.json()["error"] == "ERROR_USER_NOT_IN_GROUP"

    response = api_client.patch(
        reverse("api:database:views:filter_item", kwargs={"view_filter_id": 9999}),
        {"value": "test"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    assert response.status_code == HTTP_404_NOT_FOUND
    assert response.json()["error"] == "ERROR_VIEW_FILTER_DOES_NOT_EXIST"

    response = api_client.patch(
        reverse(
            "api:database:views:filter_item", kwargs={"view_filter_id": filter_1.id}
        ),
        {
            "field": 9999999,
            "type": "NOT_EXISTING",
        },
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json["error"] == "ERROR_REQUEST_BODY_VALIDATION"
    assert response_json["detail"]["field"][0]["code"] == "does_not_exist"
    assert response_json["detail"]["type"][0]["code"] == "invalid_choice"

    response = api_client.patch(
        reverse(
            "api:database:views:filter_item", kwargs={"view_filter_id": filter_1.id}
        ),
        {"field": field_2.id},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json["error"] == "ERROR_FIELD_NOT_IN_TABLE"

    equal_filter_type = view_filter_type_registry.get("not_equal")
    allowed = equal_filter_type.compatible_field_types
    equal_filter_type.compatible_field_types = []
    grid_view_type = view_type_registry.get("grid")
    grid_view_type.can_filter = False
    response = api_client.patch(
        reverse(
            "api:database:views:filter_item", kwargs={"view_filter_id": filter_1.id}
        ),
        {"type": "not_equal"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    grid_view_type.can_filter = True
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json["error"] == "ERROR_VIEW_FILTER_TYPE_UNSUPPORTED_FIELD"
    equal_filter_type.compatible_field_types = allowed

    response = api_client.patch(
        reverse(
            "api:database:views:filter_item", kwargs={"view_filter_id": filter_1.id}
        ),
        {"field": field_1.id, "type": "not_equal", "value": "test 2"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    assert ViewFilter.objects.all().count() == 2
    first = ViewFilter.objects.get(pk=filter_1.id)
    assert first.field_id == field_1.id
    assert first.type == "not_equal"
    assert first.value == "test 2"
    assert response_json["id"] == first.id
    assert response_json["view"] == first.view_id
    assert response_json["field"] == field_1.id
    assert response_json["type"] == "not_equal"
    assert response_json["value"] == "test 2"

    response = api_client.patch(
        reverse(
            "api:database:views:filter_item", kwargs={"view_filter_id": filter_1.id}
        ),
        {"type": "equal"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    first = ViewFilter.objects.get(pk=filter_1.id)
    assert first.field_id == field_1.id
    assert first.type == "equal"
    assert first.value == "test 2"
    assert response_json["id"] == first.id
    assert response_json["field"] == field_1.id
    assert response_json["type"] == "equal"
    assert response_json["value"] == "test 2"

    response = api_client.patch(
        reverse(
            "api:database:views:filter_item", kwargs={"view_filter_id": filter_1.id}
        ),
        {"value": "test 3"},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    first = ViewFilter.objects.get(pk=filter_1.id)
    assert first.field_id == field_1.id
    assert first.type == "equal"
    assert first.value == "test 3"
    assert response_json["id"] == first.id
    assert response_json["view"] == first.view_id
    assert response_json["field"] == field_1.id
    assert response_json["type"] == "equal"
    assert response_json["value"] == "test 3"

    response = api_client.patch(
        reverse(
            "api:database:views:filter_item", kwargs={"view_filter_id": filter_1.id}
        ),
        {"value": ""},
        format="json",
        HTTP_AUTHORIZATION=f"JWT {token}",
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    first = ViewFilter.objects.get(pk=filter_1.id)
    assert first.value == ""
    assert response_json["value"] == ""
Esempio n. 7
0
def test_create_view_sort(api_client, data_fixture):
    user, token = data_fixture.create_user_and_token()
    table_1 = data_fixture.create_database_table(user=user)
    table_2 = data_fixture.create_database_table()
    field_1 = data_fixture.create_text_field(table=table_1)
    field_2 = data_fixture.create_text_field(table=table_2)
    field_3 = data_fixture.create_text_field(table=table_1)
    field_4 = data_fixture.create_text_field(table=table_1)
    link_row_field = data_fixture.create_link_row_field(table=table_1)
    view_1 = data_fixture.create_grid_view(table=table_1)
    view_2 = data_fixture.create_grid_view(table=table_2)

    response = api_client.post(
        reverse('api:database:views:list_sortings', kwargs={'view_id': view_2.id}),
        {
            'field': field_2.id,
            'order': 'ASC',
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response.json()['error'] == 'ERROR_USER_NOT_IN_GROUP'

    response = api_client.post(
        reverse('api:database:views:list_sortings', kwargs={'view_id': 99999}),
        {
            'field': field_1.id,
            'order': 'ASC',
            'value': 'test'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    assert response.status_code == HTTP_404_NOT_FOUND
    assert response.json()['error'] == 'ERROR_VIEW_DOES_NOT_EXIST'

    response = api_client.post(
        reverse('api:database:views:list_sortings', kwargs={'view_id': view_1.id}),
        {
            'field': 9999999,
            'order': 'NOT_EXISTING'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_REQUEST_BODY_VALIDATION'
    assert response_json['detail']['field'][0]['code'] == 'does_not_exist'
    assert response_json['detail']['order'][0]['code'] == 'invalid_choice'

    response = api_client.post(
        reverse('api:database:views:list_sortings', kwargs={'view_id': view_1.id}),
        {
            'field': field_2.id,
            'order': 'ASC',
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_FIELD_NOT_IN_TABLE'

    grid_view_type = view_type_registry.get('grid')
    grid_view_type.can_sort = False
    response = api_client.post(
        reverse('api:database:views:list_sortings', kwargs={'view_id': view_1.id}),
        {
            'field': field_1.id,
            'order': 'ASC'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_VIEW_SORT_NOT_SUPPORTED'
    grid_view_type.can_sort = True

    response = api_client.post(
        reverse('api:database:views:list_sortings', kwargs={'view_id': view_1.id}),
        {
            'field': link_row_field.id,
            'order': 'ASC'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_VIEW_SORT_FIELD_NOT_SUPPORTED'

    response = api_client.post(
        reverse('api:database:views:list_sortings', kwargs={'view_id': view_1.id}),
        {
            'field': field_1.id,
            'order': 'ASC'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    assert ViewSort.objects.all().count() == 1
    first = ViewSort.objects.all().first()
    assert response_json['id'] == first.id
    assert response_json['view'] == view_1.id
    assert response_json['field'] == field_1.id
    assert response_json['order'] == 'ASC'

    response = api_client.post(
        reverse('api:database:views:list_sortings', kwargs={'view_id': view_1.id}),
        {
            'field': field_1.id,
            'order': 'ASC'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_VIEW_SORT_FIELD_ALREADY_EXISTS'

    response = api_client.post(
        reverse('api:database:views:list_sortings', kwargs={'view_id': view_1.id}),
        {
            'field': field_3.id,
            'order': 'DESC'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json['order'] == 'DESC'

    response = api_client.post(
        reverse('api:database:views:list_sortings', kwargs={'view_id': view_1.id}),
        {
            'field': field_4.id,
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json['order'] == 'ASC'

    assert ViewSort.objects.all().count() == 3
Esempio n. 8
0
def test_update_view_filter(api_client, data_fixture):
    user, token = data_fixture.create_user_and_token()
    filter_1 = data_fixture.create_view_filter(user=user, value='test')
    filter_2 = data_fixture.create_view_filter()
    field_1 = data_fixture.create_text_field(table=filter_1.view.table)
    field_2 = data_fixture.create_text_field()

    response = api_client.patch(
        reverse(
            'api:database:views:filter_item',
            kwargs={'view_filter_id': filter_2.id}
        ),
        {'value': 'test'},
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response.json()['error'] == 'ERROR_USER_NOT_IN_GROUP'

    response = api_client.patch(
        reverse(
            'api:database:views:filter_item',
            kwargs={'view_filter_id': 9999}
        ),
        {'value': 'test'},
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    assert response.status_code == HTTP_404_NOT_FOUND
    assert response.json()['error'] == 'ERROR_VIEW_FILTER_DOES_NOT_EXIST'

    response = api_client.patch(
        reverse(
            'api:database:views:filter_item',
            kwargs={'view_filter_id': filter_1.id}
        ),
        {
            'field': 9999999,
            'type': 'NOT_EXISTING',
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_REQUEST_BODY_VALIDATION'
    assert response_json['detail']['field'][0]['code'] == 'does_not_exist'
    assert response_json['detail']['type'][0]['code'] == 'invalid_choice'

    response = api_client.patch(
        reverse(
            'api:database:views:filter_item',
            kwargs={'view_filter_id': filter_1.id}
        ),
        {'field': field_2.id},
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_FIELD_NOT_IN_TABLE'

    equal_filter_type = view_filter_type_registry.get('not_equal')
    allowed = equal_filter_type.compatible_field_types
    equal_filter_type.compatible_field_types = []
    grid_view_type = view_type_registry.get('grid')
    grid_view_type.can_filter = False
    response = api_client.patch(
        reverse(
            'api:database:views:filter_item',
            kwargs={'view_filter_id': filter_1.id}
        ),
        {'type': 'not_equal'},
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_VIEW_FILTER_TYPE_NOT_ALLOWED_FOR_FIELD'
    equal_filter_type.compatible_field_types = allowed

    response = api_client.patch(
        reverse(
            'api:database:views:filter_item',
            kwargs={'view_filter_id': filter_1.id}
        ),
        {
            'field': field_1.id,
            'type': 'not_equal',
            'value': 'test 2'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    assert ViewFilter.objects.all().count() == 2
    first = ViewFilter.objects.get(pk=filter_1.id)
    assert first.field_id == field_1.id
    assert first.type == 'not_equal'
    assert first.value == 'test 2'
    assert response_json['id'] == first.id
    assert response_json['view'] == first.view_id
    assert response_json['field'] == field_1.id
    assert response_json['type'] == 'not_equal'
    assert response_json['value'] == 'test 2'

    response = api_client.patch(
        reverse(
            'api:database:views:filter_item',
            kwargs={'view_filter_id': filter_1.id}
        ),
        {'type': 'equal'},
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    first = ViewFilter.objects.get(pk=filter_1.id)
    assert first.field_id == field_1.id
    assert first.type == 'equal'
    assert first.value == 'test 2'
    assert response_json['id'] == first.id
    assert response_json['field'] == field_1.id
    assert response_json['type'] == 'equal'
    assert response_json['value'] == 'test 2'

    response = api_client.patch(
        reverse(
            'api:database:views:filter_item',
            kwargs={'view_filter_id': filter_1.id}
        ),
        {'value': 'test 3'},
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    first = ViewFilter.objects.get(pk=filter_1.id)
    assert first.field_id == field_1.id
    assert first.type == 'equal'
    assert first.value == 'test 3'
    assert response_json['id'] == first.id
    assert response_json['view'] == first.view_id
    assert response_json['field'] == field_1.id
    assert response_json['type'] == 'equal'
    assert response_json['value'] == 'test 3'

    response = api_client.patch(
        reverse(
            'api:database:views:filter_item',
            kwargs={'view_filter_id': filter_1.id}
        ),
        {'value': ''},
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    first = ViewFilter.objects.get(pk=filter_1.id)
    assert first.value == ''
    assert response_json['value'] == ''
Esempio n. 9
0
def test_create_view_filter(api_client, data_fixture):
    user, token = data_fixture.create_user_and_token()
    table_1 = data_fixture.create_database_table(user=user)
    table_2 = data_fixture.create_database_table()
    field_1 = data_fixture.create_text_field(table=table_1)
    field_2 = data_fixture.create_text_field(table=table_2)
    view_1 = data_fixture.create_grid_view(table=table_1)
    view_2 = data_fixture.create_grid_view(table=table_2)

    response = api_client.post(
        reverse('api:database:views:list_filters', kwargs={'view_id': view_2.id}),
        {
            'field': field_2.id,
            'type': 'equal',
            'value': 'test'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response.json()['error'] == 'ERROR_USER_NOT_IN_GROUP'

    response = api_client.post(
        reverse('api:database:views:list_filters', kwargs={'view_id': 99999}),
        {
            'field': field_1.id,
            'type': 'equal',
            'value': 'test'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    assert response.status_code == HTTP_404_NOT_FOUND
    assert response.json()['error'] == 'ERROR_VIEW_DOES_NOT_EXIST'

    response = api_client.post(
        reverse('api:database:views:list_filters', kwargs={'view_id': view_1.id}),
        {
            'field': 9999999,
            'type': 'NOT_EXISTING',
            'not_value': 'test'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_REQUEST_BODY_VALIDATION'
    assert response_json['detail']['field'][0]['code'] == 'does_not_exist'
    assert response_json['detail']['type'][0]['code'] == 'invalid_choice'

    response = api_client.post(
        reverse('api:database:views:list_filters', kwargs={'view_id': view_1.id}),
        {
            'field': field_2.id,
            'type': 'equal',
            'value': 'test'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_FIELD_NOT_IN_TABLE'

    grid_view_type = view_type_registry.get('grid')
    grid_view_type.can_filter = False
    response = api_client.post(
        reverse('api:database:views:list_filters', kwargs={'view_id': view_1.id}),
        {
            'field': field_1.id,
            'type': 'equal',
            'value': 'test'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_VIEW_FILTER_NOT_SUPPORTED'
    grid_view_type.can_filter = True

    equal_filter_type = view_filter_type_registry.get('equal')
    allowed = equal_filter_type.compatible_field_types
    equal_filter_type.compatible_field_types = []
    response = api_client.post(
        reverse('api:database:views:list_filters', kwargs={'view_id': view_1.id}),
        {
            'field': field_1.id,
            'type': 'equal',
            'value': 'test'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_400_BAD_REQUEST
    assert response_json['error'] == 'ERROR_VIEW_FILTER_TYPE_NOT_ALLOWED_FOR_FIELD'
    equal_filter_type.compatible_field_types = allowed

    response = api_client.post(
        reverse('api:database:views:list_filters', kwargs={'view_id': view_1.id}),
        {
            'field': field_1.id,
            'type': 'equal',
            'value': 'test'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    assert ViewFilter.objects.all().count() == 1
    first = ViewFilter.objects.all().first()
    assert response_json['id'] == first.id
    assert response_json['view'] == view_1.id
    assert response_json['field'] == field_1.id
    assert response_json['type'] == 'equal'
    assert response_json['value'] == 'test'

    response = api_client.post(
        reverse('api:database:views:list_filters', kwargs={'view_id': view_1.id}),
        {
            'field': field_1.id,
            'type': 'equal',
            'value': ''
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json['value'] == ''

    response = api_client.post(
        reverse('api:database:views:list_filters', kwargs={'view_id': view_1.id}),
        {
            'field': field_1.id,
            'type': 'equal'
        },
        format='json',
        HTTP_AUTHORIZATION=f'JWT {token}'
    )
    response_json = response.json()
    assert response.status_code == HTTP_200_OK
    assert response_json['value'] == ''