diff options
-rw-r--r-- | archaeological_context_records/tests.py | 97 | ||||
-rw-r--r-- | archaeological_finds/models_finds.py | 1 | ||||
-rw-r--r-- | archaeological_finds/tests.py | 138 | ||||
-rw-r--r-- | archaeological_operations/tests.py | 131 | ||||
-rw-r--r-- | ishtar_common/views.py | 4 |
5 files changed, 332 insertions, 39 deletions
diff --git a/archaeological_context_records/tests.py b/archaeological_context_records/tests.py index fe4bb7674..c56964670 100644 --- a/archaeological_context_records/tests.py +++ b/archaeological_context_records/tests.py @@ -140,6 +140,30 @@ class ContextRecordTest(ContextRecordInit, TestCase): models.RecordRelations.objects.create( left_record=cr_1, right_record=cr_2, relation_type=sym_rel_type) + def testExternalID(self): + cr = self.context_records[0] + self.assertEqual( + cr.external_id, + u"{}-{}".format(cr.parcel.external_id, cr.label)) + + +class ContextRecordSearchTest(ContextRecordInit, TestCase): + fixtures = ImportContextRecordTest.fixtures + + def setUp(self): + IshtarSiteProfile.objects.create() + self.username, self.password, self.user = create_superuser() + self.create_context_record(data={"label": u"CR 1"}) + self.create_context_record(data={"label": u"CR 2"}) + + cr_1 = self.context_records[0] + cr_2 = self.context_records[1] + sym_rel_type = models.RelationType.objects.filter( + symmetrical=True).all()[0] + self.cr_rel_type = sym_rel_type + models.RecordRelations.objects.create( + left_record=cr_1, right_record=cr_2, relation_type=sym_rel_type) + def testSearchExport(self): c = Client() response = c.get(reverse('get-contextrecord')) @@ -187,11 +211,76 @@ class ContextRecordTest(ContextRecordInit, TestCase): lines = [line for line in response.content.split('\n') if line] self.assertEqual(len(lines), 3) - def testZExternalID(self): + def testUnitHierarchicSearch(self): cr = self.context_records[0] - self.assertEqual( - cr.external_id, - u"{}-{}".format(cr.parcel.external_id, cr.label)) + c = Client() + + neg = models.Unit.objects.get(txt_idx='negative') + dig = models.Unit.objects.get(txt_idx='digging') + dest = models.Unit.objects.get(txt_idx='partial_destruction') + cr.unit = (dig) + cr.save() + search = {'unit': dig.pk} + + # no result when no authentication + response = c.get(reverse('get-contextrecord'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(not json.loads(response.content)) + + # one result for exact search + c.login(username=self.username, password=self.password) + response = c.get(reverse('get-contextrecord'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 1) + + # no result for the brother + search = {'unit': dest.pk} + response = c.get(reverse('get-contextrecord'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 0) + + # one result for the father + search = {'unit': neg.pk} + response = c.get(reverse('get-contextrecord'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 1) + + def testPeriodHierarchicSearch(self): + cr = self.context_records[0] + c = Client() + + neo = models.Period.objects.get(txt_idx='neolithic') + final_neo = models.Period.objects.get(txt_idx='final_neolithic') + recent_neo = models.Period.objects.get(txt_idx='recent_neolithic') + dating = models.Dating.objects.create( + period=final_neo + ) + cr.datings.add(dating) + + search = {'datings__period': final_neo.pk} + + # no result when no authentication + response = c.get(reverse('get-contextrecord'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(not json.loads(response.content)) + + # one result for exact search + c.login(username=self.username, password=self.password) + response = c.get(reverse('get-contextrecord'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 1) + + # no result for the brother + search = {'datings__period': recent_neo.pk} + response = c.get(reverse('get-contextrecord'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 0) + + # one result for the father + search = {'datings__period': neo.pk} + response = c.get(reverse('get-contextrecord'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 1) class RecordRelationsTest(ContextRecordInit, TestCase): diff --git a/archaeological_finds/models_finds.py b/archaeological_finds/models_finds.py index 588edb5cf..651559426 100644 --- a/archaeological_finds/models_finds.py +++ b/archaeological_finds/models_finds.py @@ -382,6 +382,7 @@ class Find(BaseHistorizedItem, ImageModel, OwnPerms, ShortMenuItem): 'base_finds__context_record__operation__code_patriarche': 'base_finds__context_record__operation__code_patriarche', 'datings__period': 'datings__period__pk', + 'material_types': 'material_types__pk', 'base_finds__find__description': 'base_finds__find__description__icontains', 'base_finds__batch': 'base_finds__batch', diff --git a/archaeological_finds/tests.py b/archaeological_finds/tests.py index 2d1367c58..34f95cf7d 100644 --- a/archaeological_finds/tests.py +++ b/archaeological_finds/tests.py @@ -17,7 +17,7 @@ # See the file COPYING for details. -import datetime +import json from django.conf import settings from django.contrib.auth.models import User @@ -29,7 +29,7 @@ from ishtar_common.models import ImporterType, IshtarUser, ImporterColumn,\ FormaterType, ImportTarget from ishtar_common.models import Person -from archaeological_context_records.models import Period +from archaeological_context_records.models import Period, Dating from archaeological_finds import models, views from archaeological_warehouse.models import Warehouse, WarehouseType @@ -325,6 +325,140 @@ class FindTest(FindInit, TestCase): response.content) +class FindSearchTest(FindInit, TestCase): + fixtures = [settings.ROOT_PATH + + '../fixtures/initial_data.json', + settings.ROOT_PATH + + '../ishtar_common/fixtures/initial_data.json', + settings.ROOT_PATH + + '../archaeological_files/fixtures/initial_data.json', + settings.ROOT_PATH + + '../archaeological_operations/fixtures/initial_data-fr.json', + settings.ROOT_PATH + + '../archaeological_finds/fixtures/initial_data-fr.json', + ] + model = models.Find + + def setUp(self): + self.create_finds(force=True) + self.username = 'myuser' + self.password = 'mypassword' + User.objects.create_superuser(self.username, 'myemail@test.com', + self.password) + self.client = Client() + + def testMaterialTypeHierarchicSearch(self): + find = self.finds[0] + c = Client() + metal = models.MaterialType.objects.get(txt_idx='metal') + iron_metal = models.MaterialType.objects.get(txt_idx='iron_metal') + not_iron_metal = models.MaterialType.objects.get( + txt_idx='not_iron_metal') + find.material_types.add(iron_metal) + + search = {'material_types': iron_metal.pk} + + # no result when no authentication + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(not json.loads(response.content)) + c.login(username=self.username, password=self.password) + + # one result for exact search + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(json.loads(response.content)['total'] == 1) + + # no result for the brother + search = {'material_types': not_iron_metal.pk} + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(json.loads(response.content)['total'] == 0) + + # one result for the father + search = {'material_types': metal.pk} + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(json.loads(response.content)['total'] == 1) + + def testPeriodHierarchicSearch(self): + find = self.finds[0] + c = Client() + + neo = Period.objects.get(txt_idx='neolithic') + final_neo = Period.objects.get(txt_idx='final_neolithic') + recent_neo = Period.objects.get(txt_idx='recent_neolithic') + dating = Dating.objects.create( + period=final_neo + ) + find.datings.add(dating) + + search = {'datings__period': final_neo.pk} + + # no result when no authentication + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(not json.loads(response.content)) + + # one result for exact search + c.login(username=self.username, password=self.password) + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 1) + + # no result for the brother + search = {'datings__period': recent_neo.pk} + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 0) + + # one result for the father + search = {'datings__period': neo.pk} + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 1) + + def testConservatoryStateHierarchicSearch(self): + find = self.finds[0] + c = Client() + cs1 = models.ConservatoryState.objects.all()[0] + cs1.parent = None + cs1.save() + cs2 = models.ConservatoryState.objects.all()[1] + cs2.parent = cs1 + cs2.save() + cs3 = models.ConservatoryState.objects.all()[2] + cs3.parent = cs1 + cs3.save() + find.conservatory_state = cs2 + find.save() + + search = {'conservatory_state': cs2.pk} + + # no result when no authentication + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(not json.loads(response.content)) + c.login(username=self.username, password=self.password) + + # one result for exact search + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(json.loads(response.content)['total'] == 1) + + # no result for the brother + search = {'conservatory_state': cs3.pk} + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(json.loads(response.content)['total'] == 0) + + # one result for the father + search = {'conservatory_state': cs1.pk} + response = c.get(reverse('get-find'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(json.loads(response.content)['total'] == 1) + + class PackagingTest(FindInit, TestCase): fixtures = [settings.ROOT_PATH + '../fixtures/initial_data.json', diff --git a/archaeological_operations/tests.py b/archaeological_operations/tests.py index 9a61d8bbb..ba7722d84 100644 --- a/archaeological_operations/tests.py +++ b/archaeological_operations/tests.py @@ -566,7 +566,73 @@ class OperationTest(TestCase, OperationInitTest): parcel.save() self.assertEqual(parcel.external_id, 'blabla') - def testSearch(self): + def create_relations(self): + rel1 = models.RelationType.objects.create( + symmetrical=True, label='Include', txt_idx='include') + rel2 = models.RelationType.objects.create( + symmetrical=False, label='Included', txt_idx='included', + inverse_relation=rel1) + models.RecordRelations.objects.create( + left_record=self.operations[0], + right_record=self.operations[1], + relation_type=rel1) + return rel1, rel2 + + def testPostDeleteRelations(self): + self.create_relations() + self.operations[0].delete() + + def testPostDeleteParcels(self): + ope = self.operations[0] + town = Town.objects.create(name='plouf', numero_insee='20000') + parcel = models.Parcel.objects.create(town=town) + parcel_nb = models.Parcel.objects.count() + ope.parcels.add(parcel) + ope.delete() + # our parcel has no operation attached and should be deleted + self.assertEqual(parcel_nb - 1, models.Parcel.objects.count()) + ope = self.operations[1] + parcel = models.Parcel.objects.create(town=town) + parcel_nb = models.Parcel.objects.count() + ope.parcels.add(parcel) + ope.parcels.clear() # no signal raised... should resave + models.Parcel.objects.filter(pk=parcel.pk).all()[0].save() + # our parcel has no operation attached and should be deleted + self.assertEqual(parcel_nb - 1, models.Parcel.objects.count()) + + def testIndex(self): + ope = create_operation(self.user, values={'year': 2042}) + self.assertEqual(ope.operation_code, 1) + ope2 = create_operation(self.user, values={'year': 2042}) + self.assertEqual(ope2.operation_code, 2) + ope = create_operation(self.user, values={'year': 0}) + self.assertEqual(ope.operation_code, 1) + ope2 = create_operation(self.user, values={'year': 0}) + self.assertEqual(ope2.operation_code, 2) + + +class OperationSearchTest(TestCase, OperationInitTest): + fixtures = [settings.ROOT_PATH + + '../fixtures/initial_data-auth-fr.json', + settings.ROOT_PATH + + '../ishtar_common/fixtures/initial_data-fr.json', + settings.ROOT_PATH + + '../archaeological_files/fixtures/initial_data.json', + settings.ROOT_PATH + + '../archaeological_operations/fixtures/initial_data-fr.json'] + + def setUp(self): + IshtarSiteProfile.objects.create() + self.username, self.password, self.user = create_superuser() + self.alt_username, self.alt_password, self.alt_user = create_user() + self.alt_user.user_permissions.add(Permission.objects.get( + codename='view_own_operation')) + self.orgas = self.create_orgas(self.user) + self.operations = self.create_operation(self.user, self.orgas[0]) + self.operations += self.create_operation(self.alt_user, self.orgas[0]) + self.item = self.operations[0] + + def testBaseSearch(self): c = Client() response = c.get(reverse('get-operation'), {'year': '2010'}) # no result when no authentification @@ -603,27 +669,40 @@ class OperationTest(TestCase, OperationInitTest): response = c.get(reverse('get-operation'), search) self.assertTrue(json.loads(response.content)['total'] == 2) - def testPostDeleteRelations(self): - self.create_relations() - self.operations[0].delete() - - def testPostDeleteParcels(self): - ope = self.operations[0] - town = Town.objects.create(name='plouf', numero_insee='20000') - parcel = models.Parcel.objects.create(town=town) - parcel_nb = models.Parcel.objects.count() - ope.parcels.add(parcel) - ope.delete() - # our parcel has no operation attached and should be deleted - self.assertEqual(parcel_nb - 1, models.Parcel.objects.count()) + def testHierarchicSearch(self): ope = self.operations[1] - parcel = models.Parcel.objects.create(town=town) - parcel_nb = models.Parcel.objects.count() - ope.parcels.add(parcel) - ope.parcels.clear() # no signal raised... should resave - models.Parcel.objects.filter(pk=parcel.pk).all()[0].save() - # our parcel has no operation attached and should be deleted - self.assertEqual(parcel_nb - 1, models.Parcel.objects.count()) + c = Client() + + neo = models.Period.objects.get(txt_idx='neolithic') + final_neo = models.Period.objects.get(txt_idx='final_neolithic') + recent_neo = models.Period.objects.get(txt_idx='recent_neolithic') + ope.periods.add(final_neo) + + search = {'periods': final_neo.pk} + + # no result when no authentication + response = c.get(reverse('get-operation'), search) + self.assertEqual(response.status_code, 200) + self.assertTrue(not json.loads(response.content)) + c.login(username=self.username, password=self.password) + + # one result for exact search + response = c.get(reverse('get-operation'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 1) + + # no result for the brother + search = {'periods': recent_neo.pk} + response = c.get(reverse('get-operation'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 0) + + # one result for the father + search = {'periods': neo.pk} + response = c.get(reverse('get-operation'), search) + self.assertEqual(response.status_code, 200) + self.assertEqual(json.loads(response.content)['total'], 1) + def testOwnSearch(self): c = Client() @@ -638,16 +717,6 @@ class OperationTest(TestCase, OperationInitTest): {'operator': self.orgas[0].pk}) self.assertTrue(json.loads(response.content)['total'] == 1) - def testIndex(self): - ope = create_operation(self.user, values={'year': 2042}) - self.assertEqual(ope.operation_code, 1) - ope2 = create_operation(self.user, values={'year': 2042}) - self.assertEqual(ope2.operation_code, 2) - ope = create_operation(self.user, values={'year': 0}) - self.assertEqual(ope.operation_code, 1) - ope2 = create_operation(self.user, values={'year': 0}) - self.assertEqual(ope2.operation_code, 2) - def create_administrativact(user, operation): act_type, created = models.ActType.objects.get_or_create( diff --git a/ishtar_common/views.py b/ishtar_common/views.py index dbbc3d538..b7ef5ea47 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -759,7 +759,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[], if not idx: q = Q(**{r: val}) else: - q = q | Q(**{r: val}) + q |= Q(**{r: val}) and_reqs.append(q) break elif req.endswith(k_hr + '__pk'): @@ -769,7 +769,7 @@ def get_item(model, func_name, default_name, extra_request_keys=[], for idx in xrange(HIERARCHIC_LEVELS): req = req[:-2] + 'parent__pk' q = Q(**{req: val}) - reqs = reqs | q + reqs |= q and_reqs.append(reqs) break query = Q(**dct) |