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'
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
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
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
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
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"] == ""
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
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'] == ''
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'] == ''