From e71589460a2c09dad7629e08dc8948d201de684a Mon Sep 17 00:00:00 2001 From: Lindsey Jacks Date: Mon, 3 Oct 2016 03:46:46 -0400 Subject: [PATCH] #554: Questionnaires can include repeat groups of parties or locations. (#738) * Questionnaires can include repeats of parties or locations. * refactored model_helper * added unit tests for model_helper --- cadasta/questionnaires/managers.py | 10 +- .../tests/files/t_questionnaire.xlsx | Bin 0 -> 17199 bytes ...aire_bad.xlsx => t_questionnaire_bad.xlsx} | Bin ...sx => t_questionnaire_geotype_select.xlsx} | Bin .../t_questionnaire_repeat_location.xlsx | Bin 0 -> 16564 bytes .../t_questionnaire_repeat_minus_tenure.xlsx | Bin 0 -> 16580 bytes .../files/t_questionnaire_repeat_party.xlsx | Bin 0 -> 17453 bytes ...estionnaire_repeat_party_minus_tenure.xlsx | Bin 0 -> 16575 bytes .../files/test_standard_questionnaire.xlsx | Bin 17283 -> 0 bytes cadasta/questionnaires/tests/test_managers.py | 45 + cadasta/xforms/mixins/model_helper.py | 373 ++++++--- .../xforms/tests/files/test_image_five.png | Bin 0 -> 34345 bytes .../xforms/tests/files/test_image_four.png | Bin 0 -> 48767 bytes .../xforms/tests/files/test_image_three.png | Bin 0 -> 22903 bytes cadasta/xforms/tests/files/test_resources.py | 478 +++++++++-- cadasta/xforms/tests/test_model_helper.py | 778 ++++++++++++++++++ cadasta/xforms/tests/test_views_api.py | 323 ++++++-- cadasta/xforms/views/api.py | 14 +- 18 files changed, 1722 insertions(+), 299 deletions(-) create mode 100644 cadasta/questionnaires/tests/files/t_questionnaire.xlsx rename cadasta/questionnaires/tests/files/{test_standard_questionnaire_bad.xlsx => t_questionnaire_bad.xlsx} (100%) rename cadasta/questionnaires/tests/files/{test_standard_questionnaire_2.xlsx => t_questionnaire_geotype_select.xlsx} (100%) create mode 100644 cadasta/questionnaires/tests/files/t_questionnaire_repeat_location.xlsx create mode 100644 cadasta/questionnaires/tests/files/t_questionnaire_repeat_minus_tenure.xlsx create mode 100644 cadasta/questionnaires/tests/files/t_questionnaire_repeat_party.xlsx create mode 100644 cadasta/questionnaires/tests/files/t_questionnaire_repeat_party_minus_tenure.xlsx delete mode 100644 cadasta/questionnaires/tests/files/test_standard_questionnaire.xlsx create mode 100644 cadasta/xforms/tests/files/test_image_five.png create mode 100644 cadasta/xforms/tests/files/test_image_four.png create mode 100644 cadasta/xforms/tests/files/test_image_three.png create mode 100644 cadasta/xforms/tests/test_model_helper.py diff --git a/cadasta/questionnaires/managers.py b/cadasta/questionnaires/managers.py index 9eb4468ec..8bca1f608 100644 --- a/cadasta/questionnaires/managers.py +++ b/cadasta/questionnaires/managers.py @@ -43,7 +43,9 @@ def create_children(children, errors=[], project=None, kwargs={}): if children: for c in children: - if c.get('type') == 'group': + if c.get('type') == 'repeat': + create_children(c['children'], errors, project, kwargs) + elif c.get('type') == 'group': model_name = 'QuestionGroup' # parse attribute group @@ -61,8 +63,9 @@ def create_children(children, errors=[], project=None, kwargs={}): else: model_name = 'Question' - model = apps.get_model('questionnaires', model_name) - model.objects.create_from_dict(dict=c, errors=errors, **kwargs) + if c.get('type') != 'repeat': + model = apps.get_model('questionnaires', model_name) + model.objects.create_from_dict(dict=c, errors=errors, **kwargs) def create_options(options, question, errors=[]): @@ -234,7 +237,6 @@ class QuestionManager(models.Manager): def create_from_dict(self, errors=[], **kwargs): dict = kwargs.pop('dict') instance = self.model(**kwargs) - type_dict = {name: code for code, name in instance.TYPE_CHOICES} instance.type = type_dict[dict.get('type')] diff --git a/cadasta/questionnaires/tests/files/t_questionnaire.xlsx b/cadasta/questionnaires/tests/files/t_questionnaire.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..868bbcd25eda10ad5ac3c72163be361deedb7e4c GIT binary patch literal 17199 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 1: + if p > l: + t = p + else: + t = l + tenure = TenureRelationship.objects.create( + project=project, + party=party[p], + spatial_unit=location[l], + tenure_type=TenureRelationshipType.objects.get( + id=tenure_group[t]['tenure_type']), + attributes=self._get_attributes( + tenure_group[t], + 'tenure_relationship') + ) + tenure_resources.append( + self._get_resource_names( + tenure_group[t], tenure, 'tenure') + ) + except Exception as e: raise InvalidXMLSubmission(_( "Tenure relationship error: {}".format(e))) - return tenure + return tenure_resources - def add_file_to_resource(self, data, user, project, content_object=None): + def create_resource(self, data, user, project, content_object=None): Storage = get_storage_class() - storage = Storage() - url = storage.save('resources/' + data.name, data.file.read()) + file = data.file.read() try: - resource = Resource.objects.create( - name=data.name, - file=url, - content_object=content_object, - mime_type=data.content_type, - contributor=user, - project=project, - original_file=data.name - ) - resource.full_clean() + if file == b'': + Resource.objects.get( + name=data.name, + contributor=user, + mime_type=data.content_type, + project=project, + original_file=data.name + ).content_objects.create( + content_object=content_object + ) + else: + url = Storage().save('resources/' + data.name, file) + Resource.objects.create( + name=data.name, + file=url, + content_object=content_object, + mime_type=data.content_type, + contributor=user, + project=project, + original_file=data.name + ).full_clean() except Exception as e: raise InvalidXMLSubmission(_("{}".format(e))) + def upload_submission_data(self, request): + if 'xml_submission_file' not in request.data.keys(): + raise InvalidXMLSubmission(_('XML submission not found')) + + xml_submission_file = request.data['xml_submission_file'].read() + full_submission = XFormToDict( + xml_submission_file.decode('utf-8')).get_dict() + + submission = full_submission[list(full_submission.keys())[0]] + + with transaction.atomic(): + questionnaire, party, location, tenure = self.create_models( + submission) + + party_submission = [submission] + location_submission = [submission] + tenure_submission = [submission] + + if 'party_repeat' in submission: + party_submission = self._format_repeat(submission, ['party']) + if 'tenure_type' in party_submission[0]: + tenure_submission = party_submission + + elif 'location_repeat' in submission: + location_submission = self._format_repeat( + submission, ['location']) + if 'tenure_type' in location_submission[0]: + tenure_submission = location_submission + + party_resources = [] + location_resources = [] + tenure_resources = [] + + for group in party_submission: + party_resources.extend( + self._get_resource_files(group, 'party') + ) + + for group in location_submission: + location_resources.extend( + self._get_resource_files(group, 'location') + ) + + for group in tenure_submission: + tenure_resources.extend( + self._get_resource_files(group, 'tenure') + ) + + resource_data = { + 'project': questionnaire.project, + 'location_resources': location_resources, + 'locations': location, + 'party_resources': party_resources, + 'parties': party, + 'tenure_resources': tenure_resources, + 'tenures': tenure, + } + self.upload_resource_files(request, resource_data) + + return XFormSubmission( + json_submission=full_submission, + user=request.user, + questionnaire=questionnaire) + + def upload_resource_files(self, request, data): + user = request.user + files = request.FILES + files.pop('xml_submission_file') + project = data['project'] + for file_name in files: + if file_name in data['location_resources']: + for location in data['locations']: + if file_name in location['resources']: + content_object = SpatialUnit.objects.get( + id=location['id']) + + self.create_resource(data=files[file_name], + user=user, + project=project, + content_object=content_object + ) + + elif file_name in data['party_resources']: + for party in data['parties']: + if file_name in party['resources']: + content_object = Party.objects.get( + id=party['id']) + + self.create_resource(data=files[file_name], + user=user, + project=project, + content_object=content_object + ) + + elif file_name in data['tenure_resources']: + for tenure in data['tenures']: + if file_name in tenure['resources']: + content_object = TenureRelationship.objects.get( + id=tenure['id']) + + self.create_resource(data=files[file_name], + user=user, + project=project, + content_object=content_object + ) + else: + self.create_resource(data=files[file_name], + user=user, + project=project, + content_object=None + ) + def _format_geometry(self, coords, geoshape=False): if coords == '': return '' @@ -153,7 +322,18 @@ def _format_geometry(self, coords, geoshape=False): latlng = [x for x in latlng if x] return dumps(Point(float(latlng[1]), float(latlng[0]))) - def get_questionnaire(self, id_string, version): + def _format_repeat(self, data, model_type): + repeat_group = [data] + for model in model_type: + if '{}_repeat'.format(model) in data: + repeat_group = data['{}_repeat'.format(model)] + + if type(repeat_group) != list: + repeat_group = [repeat_group] + + return repeat_group + + def _get_questionnaire(self, id_string, version): try: return Questionnaire.objects.get( id_string=id_string, version=int(version) @@ -161,7 +341,7 @@ def get_questionnaire(self, id_string, version): except Questionnaire.DoesNotExist: raise ValidationError(_('Questionnaire not found.')) - def get_attributes(self, data, model_type): + def _get_attributes(self, data, model_type): attributes = {} for attr_group in data: if '{model}_attributes'.format(model=model_type) in attr_group: @@ -169,73 +349,28 @@ def get_attributes(self, data, model_type): attributes[item] = data[attr_group][item] return attributes + def _get_resource_files(self, data, model_type): + resources = [] + for file_name in data.keys(): + if ("{}_resource".format(model_type) in file_name or + "{}_photo".format(model_type) in file_name): + resources.append(data[file_name]) + return resources + + def _get_resource_names(self, data, model, model_type): + resources = {'id': model.id, 'resources': []} + # for legacy xlsforms + if '{}_photo'.format(model_type) in data.keys(): + resources['resources'].append( + data['{}_photo'.format(model_type)]) + + for key in data.keys(): + if '{}_resource'.format(model_type) in key: + resources['resources'].append( + data[key]) + return resources + # ~~~~~~~~~~~~~~~ # To Do: # Add location<->location and party<->party relationship # ~~~~~~~~~~~~~~~ - def upload_submission_data(self, request): - if 'xml_submission_file' not in request.data.keys(): - raise InvalidXMLSubmission(_('XML submission not found')) - - xml_submission_file = request.data['xml_submission_file'].read() - full_submission = XFormToDict( - xml_submission_file.decode('utf-8') - ).get_dict() - - submission = full_submission[list(full_submission.keys())[0]] - - with transaction.atomic(): - questionnaire, party, location, tenure = self.create_models( - submission) - party_resources = [] - location_resources = [] - tenure_resources = [] - for file_name in submission.keys(): - if ("party_resource" in file_name or - "party_photo" in file_name): - party_resources.append(submission[file_name]) - - if ("location_resource" in file_name or - "location_photo" in file_name): - location_resources.append(submission[file_name]) - - if ("tenure_resource" in file_name): - tenure_resources.append(submission[file_name]) - - resource_data = { - 'project': questionnaire.project, - 'location_resources': location_resources, - 'location': location, - 'party_resources': party_resources, - 'party_id': party, - 'tenure_resources': tenure_resources, - 'tenure_id': tenure, - } - self.upload_files(request, resource_data) - - return XFormSubmission( - json_submission=full_submission, - user=request.user, - questionnaire=questionnaire) - - def upload_files(self, request, data): - user = request.user - files = request.FILES - files.pop('xml_submission_file') - project = data['project'] - for file_name in files: - content_object = None - if file_name in data['location_resources']: - content_object = SpatialUnit.objects.get( - id=data['location']) - elif file_name in data['party_resources']: - content_object = Party.objects.get( - id=data['party_id']) - elif file_name in data['tenure_resources']: - content_object = TenureRelationship.objects.get( - id=data['tenure_id']) - - self.add_file_to_resource(data=files[file_name], - user=user, - project=project, - content_object=content_object) diff --git a/cadasta/xforms/tests/files/test_image_five.png b/cadasta/xforms/tests/files/test_image_five.png new file mode 100644 index 0000000000000000000000000000000000000000..e092ea3a5a3b0808a3601766729f835cf614bd45 GIT binary patch literal 34345 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 literal 0 HcmV?d00001 diff --git a/cadasta/xforms/tests/files/test_image_four.png b/cadasta/xforms/tests/files/test_image_four.png new file mode 100644 index 0000000000000000000000000000000000000000..3f35d2d7abeed15e161dcc2b92d4851533c53aac GIT binary patch literal 48767 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%0DSDK>Kz@NSV9H`4G#hQuRQ>Oa>S)5 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 Z|3ATaBi|Bl^Bw>I002ovPDHLkV1ksTVZs0a literal 0 HcmV?d00001 diff --git a/cadasta/xforms/tests/files/test_image_three.png b/cadasta/xforms/tests/files/test_image_three.png new file mode 100644 index 0000000000000000000000000000000000000000..994331cdd53f4d68a860e66db1218fa86af3f9c5 GIT binary patch literal 22903 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 literal 0 HcmV?d00001 diff --git a/cadasta/xforms/tests/files/test_resources.py b/cadasta/xforms/tests/files/test_resources.py index 81dc161da..161f1368d 100644 --- a/cadasta/xforms/tests/files/test_resources.py +++ b/cadasta/xforms/tests/files/test_resources.py @@ -1,6 +1,6 @@ -FORM = ''' - +STANDARD = ''' + 2016-07-07T16:38:20.310-04 2016-07-07T16:39:23.673-04 2016-07-07 @@ -13,6 +13,9 @@ test_image_one.png test_image_two.png test_audio_one.mp3 + test_image_one.png + test_image_two.png + test_image_three.png LH Middle Earth @@ -34,48 +37,11 @@ uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad - '''.strip() + '''.strip() -INVALID_FORM = ''' - - 2016-07-07T16:38:20.310-04 - 2016-07-07T16:39:23.673-04 - 2016-07-07 - 00:bb:3a:44:d0:fb - - <party_type>IN</party_type> - <party_name></party_name> - <location_geometry>40.6890612 -73.9925067 0.0 0.0;</location_geometry> - <location_type>MI</location_type> - <location_resource_photo>test_image.png</location_resource_photo> - <party_resource_photo /> - <tenure_type>LH</tenure_type> - <location_attributes> - <name>Null Island</name> - </location_attributes> - <party_attributes_default> - <notes>Party attribute default notes.</notes> - </party_attributes_default> - <party_attributes_individual> - <gender>f</gender> - <homeowner>no</homeowner> - <dob>2016-07-07</dob> - </party_attributes_individual> - <party_relationship_attributes> - <notes>Party relationship notes.</notes> - </party_relationship_attributes> - <tenure_relationship_attributes> - <notes>Tenure relationship notes.</notes> - </tenure_relationship_attributes> - <meta> - <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> - </meta> - </test_standard_questionnaire>'''.strip() - -POLY_FORM = '''<?xml version=\'1.0\' ?> - <test_standard_questionnaire - id="test_standard_questionnaire" version="20160727122110"> +POLY = '''<?xml version=\'1.0\' ?> + <t_questionnaire + id="t_questionnaire" version="20160727122110"> <start>2016-07-07T16:38:20.310-04</start> <end>2016-07-07T16:39:23.673-04</end> <today>2016-07-07</today> @@ -96,11 +62,11 @@ <meta> <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> </meta> - </test_standard_questionnaire>'''.strip() + </t_questionnaire>'''.strip() -LINE_FORM = '''<?xml version=\'1.0\' ?> - <test_standard_questionnaire - id="test_standard_questionnaire" version="20160727122110"> +LINE = '''<?xml version=\'1.0\' ?> + <t_questionnaire + id="t_questionnaire" version="20160727122110"> <start>2016-07-07T16:38:20.310-04</start> <end>2016-07-07T16:39:23.673-04</end> <today>2016-07-07</today> @@ -122,11 +88,11 @@ <meta> <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> </meta> - </test_standard_questionnaire>'''.strip() + </t_questionnaire>'''.strip() -MISSING_SEMI_FORM = '''<?xml version=\'1.0\' ?> - <test_standard_questionnaire - id="test_standard_questionnaire" version="20160727122110"> +MISSING_SEMI = '''<?xml version=\'1.0\' ?> + <t_questionnaire + id="t_questionnaire" version="20160727122110"> <start>2016-07-07T16:38:20.310-04</start> <end>2016-07-07T16:39:23.673-04</end> <today>2016-07-07</today> @@ -145,11 +111,11 @@ <meta> <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> </meta> - </test_standard_questionnaire>'''.strip() + </t_questionnaire>'''.strip() -GEOSHAPE_FORM = '''<?xml version=\'1.0\' ?> - <test_standard_questionnaire_2 - id="test_standard_questionnaire_2" version="20160727122111"> +GEOTYPE_SELECT = '''<?xml version=\'1.0\' ?> + <t_questionnaire_geotype_select + id="t_questionnaire_geotype_select" version="20160727122111"> <start>2016-07-07T16:38:20.310-04</start> <end>2016-07-07T16:39:23.673-04</end> <today>2016-07-07</today> @@ -172,11 +138,11 @@ <meta> <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> </meta> - </test_standard_questionnaire_2>'''.strip() + </t_questionnaire_geotype_select>'''.strip() -NEITHER_FORM = '''<?xml version=\'1.0\' ?> - <test_standard_questionnaire_2 - id="test_standard_questionnaire_2" version="20160727122111"> +GEOTYPE_NEITHER = '''<?xml version=\'1.0\' ?> + <t_questionnaire_geotype_select + id="t_questionnaire_geotype_select" version="20160727122111"> <start>2016-07-07T16:38:20.310-04</start> <end>2016-07-07T16:39:23.673-04</end> <today>2016-07-07</today> @@ -199,7 +165,7 @@ <meta> <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> </meta> - </test_standard_questionnaire_2>'''.strip() + </t_questionnaire_geotype_select>'''.strip() BAD_QUESTIONNAIRE = '''<?xml version=\'1.0\' ?> <tax_return id="tax_return" version="20160727122110"> @@ -220,9 +186,9 @@ </meta> </tax_return>'''.strip() -BAD_LOCATION_FORM = '''<?xml version=\'1.0\' ?> - <test_standard_questionnaire - id="test_standard_questionnaire" version="20160727122110"> +BAD_LOCATION = '''<?xml version=\'1.0\' ?> + <t_questionnaire + id="t_questionnaire" version="20160727122110"> <start>2016-07-07T16:38:20.310-04</start> <end>2016-07-07T16:39:23.673-04</end> <today>2016-07-07</today> @@ -236,11 +202,11 @@ <meta> <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> </meta> - </test_standard_questionnaire>'''.strip() + </t_questionnaire>'''.strip() -BAD_PARTY_FORM = '''<?xml version=\'1.0\' ?> - <test_standard_questionnaire - id="test_standard_questionnaire" version="20160727122110"> +BAD_PARTY = '''<?xml version=\'1.0\' ?> + <t_questionnaire + id="t_questionnaire" version="20160727122110"> <start>2016-07-07T16:38:20.310-04</start> <end>2016-07-07T16:39:23.673-04</end> <today>2016-07-07</today> @@ -254,11 +220,11 @@ <meta> <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> </meta> - </test_standard_questionnaire>'''.strip() + </t_questionnaire>'''.strip() -BAD_TENURE_FORM = '''<?xml version=\'1.0\' ?> - <test_standard_questionnaire - id="test_standard_questionnaire" version="20160727122110"> +BAD_TENURE = '''<?xml version=\'1.0\' ?> + <t_questionnaire + id="t_questionnaire" version="20160727122110"> <start>2016-07-07T16:38:20.310-04</start> <end>2016-07-07T16:39:23.673-04</end> <today>2016-07-07</today> @@ -272,11 +238,11 @@ <meta> <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> </meta> - </test_standard_questionnaire>'''.strip() + </t_questionnaire>'''.strip() -BAD_RESOURCE_FORM = '''<?xml version=\'1.0\' ?> - <test_standard_questionnaire_bad - id="test_standard_questionnaire_bad" version="20160727122112"> +BAD_RESOURCE = '''<?xml version=\'1.0\' ?> + <t_questionnaire_bad + id="t_questionnaire_bad" version="20160727122112"> <start>2016-07-07T16:38:20.310-04</start> <end>2016-07-07T16:39:23.673-04</end> <today>2016-07-07</today> @@ -291,19 +257,353 @@ <meta> <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> </meta> - </test_standard_questionnaire_bad>'''.strip() + </t_questionnaire_bad>'''.strip() + +REPEAT_PARTY = '''<?xml version=\'1.0\' ?> + <t_questionnaire_repeat_party + id="t_questionnaire_repeat_party" version="20160727122113"> + <start>2016-07-07T16:38:20.310-04</start> + <end>2016-07-07T16:39:23.673-04</end> + <today>2016-07-07</today> + <deviceid>00:bb:3a:44:d0:fb</deviceid> + <title /> + <location_geometry>40.6890612 -73.9925067 0.0 0.0;</location_geometry> + <location_type>MI</location_type> + <location_resource_audio>test_audio_one.mp3</location_resource_audio> + <location_photo>test_image_one.png</location_photo> + <location_attributes> + <name>Middle Earth</name> + </location_attributes> + <party_repeat> + <party_type>IN</party_type> + <party_name>Bilbo Baggins</party_name> + <party_photo>test_image_two.png</party_photo> + <party_resource_photo>test_image_three.png</party_resource_photo> + <party_attributes_default> + <notes>Party attribute default notes.</notes> + </party_attributes_default> + <party_attributes_individual> + <gender>f</gender> + <homeowner>no</homeowner> + <dob>2016-07-07</dob> + </party_attributes_individual> + <party_relationship_attributes> + <notes>Party relationship notes.</notes> + </party_relationship_attributes> + <tenure_type>LH</tenure_type> + <tenure_relationship_attributes> + <notes>Tenure relationship notes.</notes> + </tenure_relationship_attributes> + <tenure_resource_photo>test_image_four.png</tenure_resource_photo> + </party_repeat> + <party_repeat> + <party_type>IN</party_type> + <party_name>Samwise Gamgee</party_name> + <party_photo>test_image_five.png</party_photo> + <party_resource_photo /> + <party_attributes_default> + <notes>Repeated party attribute default notes.</notes> + </party_attributes_default> + <party_attributes_individual> + <gender>f</gender> + <homeowner>no</homeowner> + <dob>2016-07-07</dob> + </party_attributes_individual> + <party_relationship_attributes> + <notes>Party relationship notes.</notes> + </party_relationship_attributes> + <tenure_type>LH</tenure_type> + <tenure_relationship_attributes> + <notes>Tenure relationship notes.</notes> + </tenure_relationship_attributes> + <tenure_resource_photo /> + </party_repeat> + <meta> + <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> + </meta> + </t_questionnaire_repeat_party>'''.strip() + +REPEAT_ONE_PARTY = '''<?xml version=\'1.0\' ?> + <t_questionnaire_repeat_party + id="t_questionnaire_repeat_party" version="20160727122113"> + <start>2016-07-07T16:38:20.310-04</start> + <end>2016-07-07T16:39:23.673-04</end> + <today>2016-07-07</today> + <deviceid>00:bb:3a:44:d0:fb</deviceid> + <title /> + <location_geometry>40.6890612 -73.9925067 0.0 0.0;</location_geometry> + <location_type>MI</location_type> + <location_resource_audio>test_audio_one.mp3</location_resource_audio> + <location_photo>test_image_one.png</location_photo> + <location_attributes> + <name>Middle Earth</name> + </location_attributes> + <party_repeat> + <party_type>IN</party_type> + <party_name>Bilbo Baggins</party_name> + <party_photo>test_image_two.png</party_photo> + <party_resource_photo>test_image_three.png</party_resource_photo> + <party_attributes_default> + <notes>Party attribute default notes.</notes> + </party_attributes_default> + <party_attributes_individual> + <gender>f</gender> + <homeowner>no</homeowner> + <dob>2016-07-07</dob> + </party_attributes_individual> + <party_relationship_attributes> + <notes>Party relationship notes.</notes> + </party_relationship_attributes> + <tenure_type>LH</tenure_type> + <tenure_relationship_attributes> + <notes>Tenure relationship notes.</notes> + </tenure_relationship_attributes> + <tenure_resource_photo>test_image_four.png</tenure_resource_photo> + </party_repeat> + <meta> + <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> + </meta> + </t_questionnaire_repeat_party>'''.strip() + +REPEAT_LOCATION = '''<?xml version=\'1.0\' ?> + <t_questionnaire_repeat_location + id="t_questionnaire_repeat_location" + version="20160727122114"> + <start>2016-07-07T16:38:20.310-04</start> + <end>2016-07-07T16:39:23.673-04</end> + <today>2016-07-07</today> + <deviceid>00:bb:3a:44:d0:fb</deviceid> + <title /> + <location_repeat> + <location_geometry>40.6890612 -73.9925067 0.0 0.0; + </location_geometry> + <location_type>MI</location_type> + <location_resource_audio>test_audio_one.mp3</location_resource_audio> + <location_photo>test_image_one.png</location_photo> + <location_attributes> + <name>Middle Earth</name> + </location_attributes> + <tenure_type>CR</tenure_type> + <tenure_relationship_attributes> + <notes>Tenure relationship notes.</notes> + </tenure_relationship_attributes> + <tenure_resource_photo>test_image_two.png</tenure_resource_photo> + </location_repeat> + <location_repeat> + <location_geometry>40.6890612 -73.9925067 0.0 0.0; + </location_geometry> + <location_type>CB</location_type> + <location_resource_audio /> + <location_photo>test_image_three.png</location_photo> + <location_attributes> + <name>Middle Earth</name> + </location_attributes> + <tenure_type>LH</tenure_type> + <tenure_relationship_attributes> + <notes>Tenure relationship notes.</notes> + </tenure_relationship_attributes> + <tenure_resource_photo /> + </location_repeat> + <party_type>IN</party_type> + <party_name>Bilbo Baggins</party_name> + <party_photo>test_image_four.png</party_photo> + <party_resource_photo>test_image_five.png</party_resource_photo> + <party_attributes_default> + <notes>Party attribute default notes.</notes> + </party_attributes_default> + <party_attributes_individual> + <gender>f</gender> + <homeowner>no</homeowner> + <dob>2016-07-07</dob> + </party_attributes_individual> + <party_relationship_attributes> + <notes>Party relationship notes.</notes> + </party_relationship_attributes> + <meta> + <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> + </meta> + </t_questionnaire_repeat_location>'''.strip() + +REPEAT_ONE_LOCATION = '''<?xml version=\'1.0\' ?> + <t_questionnaire_repeat_location + id="t_questionnaire_repeat_location" + version="20160727122114"> + <start>2016-07-07T16:38:20.310-04</start> + <end>2016-07-07T16:39:23.673-04</end> + <today>2016-07-07</today> + <deviceid>00:bb:3a:44:d0:fb</deviceid> + <title /> + <location_repeat> + <location_geometry>40.6890612 -73.9925067 0.0 0.0; + </location_geometry> + <location_type>MI</location_type> + <location_resource_audio>test_audio_one.mp3</location_resource_audio> + <location_photo>test_image_one.png</location_photo> + <location_attributes> + <name>Middle Earth</name> + </location_attributes> + <tenure_type>CR</tenure_type> + <tenure_relationship_attributes> + <notes>Tenure relationship notes.</notes> + </tenure_relationship_attributes> + <tenure_resource_photo>test_image_two.png</tenure_resource_photo> + </location_repeat> + <party_type>IN</party_type> + <party_name>Bilbo Baggins</party_name> + <party_photo>test_image_four.png</party_photo> + <party_resource_photo>test_image_five.png</party_resource_photo> + <party_attributes_default> + <notes>Party attribute default notes.</notes> + </party_attributes_default> + <party_attributes_individual> + <gender>f</gender> + <homeowner>no</homeowner> + <dob>2016-07-07</dob> + </party_attributes_individual> + <party_relationship_attributes> + <notes>Party relationship notes.</notes> + </party_relationship_attributes> + <meta> + <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> + </meta> + </t_questionnaire_repeat_location>'''.strip() + +REPEAT_MINUS_TENURE = '''<?xml version=\'1.0\' ?> + <t_questionnaire_repeat_minus_tenure + id="t_questionnaire_repeat_minus_tenure" + version="20160727122115"> + <start>2016-07-07T16:38:20.310-04</start> + <end>2016-07-07T16:39:23.673-04</end> + <today>2016-07-07</today> + <deviceid>00:bb:3a:44:d0:fb</deviceid> + <title /> + <location_repeat> + <location_geometry>40.6890612 -73.9925067 0.0 0.0; + </location_geometry> + <location_type>MI</location_type> + <location_resource_audio>test_audio_one.mp3</location_resource_audio> + <location_photo>test_image_one.png</location_photo> + <location_attributes> + <name>Middle Earth</name> + </location_attributes> + </location_repeat> + <location_repeat> + <location_geometry>40.6890612 -73.9925067 0.0 0.0; + </location_geometry> + <location_type>CB</location_type> + <location_resource_audio /> + <location_photo>test_image_three.png</location_photo> + <location_attributes> + <name>Middle Earth</name> + </location_attributes> + </location_repeat> + <tenure_type>CR</tenure_type> + <tenure_relationship_attributes> + <notes>Tenure relationship notes.</notes> + </tenure_relationship_attributes> + <tenure_resource_photo>test_image_two.png</tenure_resource_photo> + <party_type>IN</party_type> + <party_name>Bilbo Baggins</party_name> + <party_photo>test_image_four.png</party_photo> + <party_resource_photo>test_image_five.png</party_resource_photo> + <party_attributes_default> + <notes>Party attribute default notes.</notes> + </party_attributes_default> + <party_attributes_individual> + <gender>f</gender> + <homeowner>no</homeowner> + <dob>2016-07-07</dob> + </party_attributes_individual> + <party_relationship_attributes> + <notes>Party relationship notes.</notes> + </party_relationship_attributes> + <meta> + <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> + </meta> + </t_questionnaire_repeat_minus_tenure>'''.strip() + +REPEAT_PARTY_MINUS_TENURE = '''<?xml version=\'1.0\' ?> + <t_questionnaire_repeat_party_minus_tenure + id="t_questionnaire_repeat_party_minus_tenure" + version="20160727122116"> + <start>2016-07-07T16:38:20.310-04</start> + <end>2016-07-07T16:39:23.673-04</end> + <today>2016-07-07</today> + <deviceid>00:bb:3a:44:d0:fb</deviceid> + <title /> + <location_geometry>40.6890612 -73.9925067 0.0 0.0; + </location_geometry> + <location_type>MI</location_type> + <location_resource_audio>test_audio_one.mp3</location_resource_audio> + <location_photo>test_image_one.png</location_photo> + <location_attributes> + <name>Middle Earth</name> + </location_attributes> + <tenure_type>CR</tenure_type> + <tenure_relationship_attributes> + <notes>Tenure relationship notes.</notes> + </tenure_relationship_attributes> + <tenure_resource_photo>test_image_two.png</tenure_resource_photo> + <party_repeat> + <party_type>IN</party_type> + <party_name>Bilbo Baggins</party_name> + <party_photo>test_image_three.png</party_photo> + <party_resource_photo>test_image_four.png</party_resource_photo> + <party_attributes_default> + <notes>Party attribute default notes.</notes> + </party_attributes_default> + <party_attributes_individual> + <gender>f</gender> + <homeowner>no</homeowner> + <dob>2016-07-07</dob> + </party_attributes_individual> + <party_relationship_attributes> + <notes>Party relationship notes.</notes> + </party_relationship_attributes> + </party_repeat> + <party_repeat> + <party_type>IN</party_type> + <party_name>Samwise Gamgee</party_name> + <party_photo>test_image_five.png</party_photo> + <party_resource_photo /> + <party_attributes_default> + <notes>Repeated party attribute default notes.</notes> + </party_attributes_default> + <party_attributes_individual> + <gender>f</gender> + <homeowner>no</homeowner> + <dob>2016-07-07</dob> + </party_attributes_individual> + <party_relationship_attributes> + <notes>Party relationship notes.</notes> + </party_relationship_attributes> + <tenure_type>LH</tenure_type> + <tenure_relationship_attributes> + <notes>Tenure relationship notes.</notes> + </tenure_relationship_attributes> + <tenure_resource_photo /> + </party_repeat> + <meta> + <instanceID>uuid:b3f225d3-0fac-4a0b-80c7-60e6db4cc0ad</instanceID> + </meta> + </t_questionnaire_repeat_party_minus_tenure>'''.strip() responses = { - 'form': FORM, - 'invalid_form': INVALID_FORM, - 'line_form': LINE_FORM, - 'poly_form': POLY_FORM, - 'missing_semi_form': MISSING_SEMI_FORM, - 'geoshape_form': GEOSHAPE_FORM, - 'location_geoshape_form': NEITHER_FORM, - 'bad_questionnaire': BAD_QUESTIONNAIRE, - 'bad_location_form': BAD_LOCATION_FORM, - 'bad_party_form': BAD_PARTY_FORM, - 'bad_tenure_form': BAD_TENURE_FORM, - 'bad_resource_form': BAD_RESOURCE_FORM, + 'submission': STANDARD, + 'submission_line': LINE, + 'submission_poly': POLY, + 'submission_missing_semi': MISSING_SEMI, + 'submission_geotype_select': GEOTYPE_SELECT, + 'submission_geotype_neither': GEOTYPE_NEITHER, + 'submission_bad_questionnaire': BAD_QUESTIONNAIRE, + 'submission_bad_location': BAD_LOCATION, + 'submission_bad_party': BAD_PARTY, + 'submission_bad_tenure': BAD_TENURE, + 'submission_bad_resource': BAD_RESOURCE, + 'submission_party_repeat': REPEAT_PARTY, + 'submission_party_one_repeat': REPEAT_ONE_PARTY, + 'submission_location_repeat': REPEAT_LOCATION, + 'submission_location_one_repeat': REPEAT_ONE_LOCATION, + 'submission_repeat_minus_tenure': REPEAT_MINUS_TENURE, + 'submission_repeat_party_minus_tenure': REPEAT_PARTY_MINUS_TENURE, } diff --git a/cadasta/xforms/tests/test_model_helper.py b/cadasta/xforms/tests/test_model_helper.py new file mode 100644 index 000000000..3c0742460 --- /dev/null +++ b/cadasta/xforms/tests/test_model_helper.py @@ -0,0 +1,778 @@ +import os +import io +import pytest +from django.conf import settings +from django.test import TestCase +from django.core.exceptions import ValidationError +from django.core.files.uploadedfile import InMemoryUploadedFile +from django.contrib.contenttypes.models import ContentType +from jsonattrs.models import Attribute, AttributeType, Schema +from jsonattrs.management.commands import loadattrtypes +from jsonattrs.models import create_attribute_types + +from accounts.tests.factories import UserFactory +from core.tests.factories import PolicyFactory +from party.tests.factories import PartyFactory +from organization.tests.factories import ProjectFactory +from spatial.tests.factories import SpatialUnitFactory +from questionnaires.tests.factories import (QuestionnaireFactory, + QuestionFactory,) + +from party.models import (Party, TenureRelationship, + load_tenure_relationship_types) +from organization.models import OrganizationRole +from resources.models import Resource +from spatial.models import SpatialUnit +from xforms.mixins.model_helper import ModelHelper as mh +from xforms.exceptions import InvalidXMLSubmission + +path = os.path.dirname(settings.BASE_DIR) + + +class XFormModelHelperTest(TestCase): + def setUp(self): + super().setUp() + PolicyFactory.load_policies() + create_attribute_types() + + loadattrtypes.Command().handle(force=True) + load_tenure_relationship_types(force=True) + + self.user = UserFactory.create() + self.project = ProjectFactory.create( + current_questionnaire='a1') + + self.questionnaire = QuestionnaireFactory.create( + id_string='a1', version=0, project=self.project, id='a1') + QuestionFactory.create( + name='location_geometry', + label='Location of Parcel', + type='GS', + questionnaire=self.questionnaire) + + content_type_party = ContentType.objects.get( + app_label='party', model='party') + content_type_spatial = ContentType.objects.get( + app_label='spatial', model='spatialunit') + content_type_tenure = ContentType.objects.get( + app_label='party', model='tenurerelationship') + for content_type in [content_type_party, content_type_tenure, + content_type_spatial]: + schema = Schema.objects.create( + content_type=content_type, + selectors=(self.project.organization.id, self.project.id, 'a1') + ) + attr_type = AttributeType.objects.get(name='boolean') + Attribute.objects.create( + schema=schema, + name='fname', long_name='True or False', + attr_type=attr_type, index=0, + required=False, omit=False + ) + attr_type = AttributeType.objects.get(name='text') + Attribute.objects.create( + schema=schema, + name='fname_two', long_name='Notes', + attr_type=attr_type, index=1, + required=False, omit=False + ) + + OrganizationRole.objects.create( + user=self.user, organization=self.project.organization) + + def test_create_models(self): + geoshape = ('45.56342779158167 -122.67650283873081 0.0 0.0;' + '45.56176327330353 -122.67669159919024 0.0 0.0;' + '45.56151562182025 -122.67490658909082 0.0 0.0;' + '45.563479432877415 -122.67494414001703 0.0 0.0;' + '45.56176327330353 -122.67669159919024 0.0 0.0') + data = { + 'id': 'a1', + 'version': str(self.questionnaire.version), + 'party_name': 'Party One', + 'party_type': 'IN', + 'party_attributes_individual': { + 'fname': False, + 'fname_two': 'socks', + }, + 'party_photo': 'sad_birthday.png', + 'party_resource_invite': 'invitation.pdf', + 'location_type': 'BU', + 'location_geometry': geoshape, + 'location_attributes': { + 'fname': False, + 'fname_two': 'Location One', + }, + 'location_photo': 'resource_one.png', + 'location_resource_invite': 'resource_two.pdf', + 'tenure_type': 'CO', + 'tenure_relationship_attributes': { + 'fname': False, + 'fname_two': 'Tenure One' + }, + 'tenure_resource_photo': 'resource_three.png' + } + + (questionnaire, + party_resources, + location_resources, + tenure_resources) = mh.create_models(mh(), data) + + assert questionnaire == self.questionnaire + party = Party.objects.get(name='Party One') + assert party_resources[0]['id'] == party.id + assert 'sad_birthday.png' in party_resources[0]['resources'] + assert 'invitation.pdf' in party_resources[0]['resources'] + + location = SpatialUnit.objects.get(type='BU') + assert location_resources[0]['id'] == location.id + assert 'resource_two.pdf' in location_resources[0]['resources'] + + tenure = TenureRelationship.objects.get(spatial_unit=location) + assert tenure.party == party + assert tenure_resources[0]['id'] == tenure.id + assert 'resource_three.png' in tenure_resources[0]['resources'] + + def test_create_party(self): + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test without repeats + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + data = { + 'party_name': 'Party One', + 'party_type': 'IN', + 'party_attributes_individual': { + 'fname': False, + 'fname_two': 'socks', + }, + 'party_photo': 'sad_birthday.png', + 'party_resource_invite': 'invitation.pdf', + } + + party_objects, party_resources = mh.create_party( + mh(), data, self.project + ) + assert len(party_objects) == 1 + party = Party.objects.get(name='Party One') + assert party.type == 'IN' + assert party.attributes == {'fname': False, 'fname_two': 'socks'} + assert len(party_resources) == 1 + assert party_resources[0]['id'] == party.id + assert len(party_resources[0]['resources']) == 2 + assert 'sad_birthday.png' in party_resources[0]['resources'] + assert 'invitation.pdf' in party_resources[0]['resources'] + assert party.project == self.project + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test with repeats + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + data = { + 'party_repeat': [{ + 'party_name': 'Party Two', + 'party_type': 'IN', + 'party_attributes_individual': { + 'fname': False, + 'fname_two': 'socks', + }, + 'party_photo': 'sad_birthday.png', + 'party_resource_invite': 'invitation.pdf', + + }, { + 'party_name': 'Party Three', + 'party_type': 'GR', + 'party_attributes_group': { + 'fname': True, + 'fname_two': 'video games', + }, + 'party_photo': 'awesome_birthday.png', + 'party_resource_invite': 'invitation_two.pdf', + + }] + } + party_objects, party_resources = mh.create_party( + mh(), data, self.project + ) + assert len(party_objects) == 2 + party = Party.objects.get(name='Party Two') + assert party.type == 'IN' + assert party.attributes == {'fname': False, 'fname_two': 'socks'} + party2 = Party.objects.get(name='Party Three') + assert party2.type == 'GR' + assert party2.attributes == { + 'fname': True, 'fname_two': 'video games'} + + assert len(party_resources) == 2 + assert party_resources[0]['id'] == party.id + assert len(party_resources[0]['resources']) == 2 + assert 'sad_birthday.png' in party_resources[0]['resources'] + assert 'invitation.pdf' in party_resources[0]['resources'] + assert party.project == self.project + + assert party_resources[1]['id'] == party2.id + assert len(party_resources[1]['resources']) == 2 + assert 'awesome_birthday.png' in party_resources[1]['resources'] + assert 'invitation_two.pdf' in party_resources[1]['resources'] + assert party2.project == self.project + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test without fails + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + data = { + 'party_nonsense': 'Blah blah blah', + 'party_type': 'IN', + 'party_attributes_individual': { + 'fname': False, + 'fname_two': 'socks', + }, + 'party_photo': 'sad_birthday.png', + 'party_resource_invite': 'invitation.pdf', + } + + with pytest.raises(InvalidXMLSubmission): + mh.create_party( + mh(), data, self.project + ) + assert Party.objects.count() == 3 + + def test_create_spatial_unit(self): + geoshape = ('45.56342779158167 -122.67650283873081 0.0 0.0;' + '45.56176327330353 -122.67669159919024 0.0 0.0;' + '45.56151562182025 -122.67490658909082 0.0 0.0;' + '45.563479432877415 -122.67494414001703 0.0 0.0;' + '45.56176327330353 -122.67669159919024 0.0 0.0') + + line = ('45.56342779158167 -122.67650283873081 0.0 0.0;' + '45.56176327330353 -122.67669159919024 0.0 0.0;' + '45.56151562182025 -122.67490658909082 0.0 0.0;') + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test without repeats + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + data = { + 'location_type': 'BU', + 'location_geometry': geoshape, + 'location_attributes': { + 'fname': False, + 'fname_two': 'Location One', + }, + 'location_photo': 'resource.png', + 'location_resource_invite': 'resource_two.pdf', + } + + location_objects, location_resources = mh.create_spatial_unit( + mh(), data, self.project, self.questionnaire) + assert len(location_objects) == 1 + location = SpatialUnit.objects.get(type='BU') + assert location.attributes == { + 'fname': False, 'fname_two': 'Location One'} + assert location.geometry.geom_type == 'Polygon' + assert len(location_resources) == 1 + assert location_resources[0]['id'] == location.id + assert len(location_resources[0]['resources']) == 2 + assert 'resource.png' in location_resources[0]['resources'] + assert 'resource_two.pdf' in location_resources[0]['resources'] + assert location.project == self.project + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test with repeats + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + data = { + 'location_repeat': [{ + 'location_type': 'PA', + 'location_geotrace': line, + 'location_attributes': { + 'fname': False, + 'fname_two': 'Location One', + }, + 'location_photo': 'resource.png', + 'location_resource_invite': 'resource_two.pdf', + }, { + 'location_type': 'CB', + 'location_geoshape': geoshape, + 'location_attributes': { + 'fname': True, + 'fname_two': 'Location Two', + }, + 'location_photo': 'resource_three.png', + 'location_resource_invite': 'resource_four.pdf', + }] + } + + location_objects, location_resources = mh.create_spatial_unit( + mh(), data, self.project, self.questionnaire) + + assert len(location_objects) == 2 + location = SpatialUnit.objects.get(type='PA') + assert location.geometry.geom_type == 'LineString' + assert location.attributes == { + 'fname': False, 'fname_two': 'Location One'} + location2 = SpatialUnit.objects.get(type='CB') + assert location2.geometry.geom_type == 'Polygon' + assert location2.attributes == { + 'fname': True, 'fname_two': 'Location Two'} + + assert len(location_resources) == 2 + assert location_resources[0]['id'] == location.id + assert len(location_resources[0]['resources']) == 2 + assert 'resource.png' in location_resources[0]['resources'] + assert 'resource_two.pdf' in location_resources[0]['resources'] + assert location.project == self.project + + assert location_resources[1]['id'] == location2.id + assert len(location_resources[1]['resources']) == 2 + assert 'resource_three.png' in location_resources[1]['resources'] + assert 'resource_four.pdf' in location_resources[1]['resources'] + assert location2.project == self.project + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test fails + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + data = { + 'location_nonsense': 'BLAH BLAH', + 'location_geometry': line, + 'location_attributes': { + 'fname': False, + 'fname_two': 'Location One', + }, + 'location_photo': 'resource.png', + 'location_resource_invite': 'resource_two.pdf', + } + + with pytest.raises(InvalidXMLSubmission): + mh.create_spatial_unit( + mh(), data, self.project, self.questionnaire) + assert SpatialUnit.objects.count() == 3 + + def test_create_tenure_relationship(self): + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test without repeats + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + party = PartyFactory.create(project=self.project) + location = SpatialUnitFactory.create(project=self.project) + + data = { + 'tenure_type': 'CO', + 'tenure_relationship_attributes': { + 'fname': False, + 'fname_two': 'Tenure One' + }, + 'tenure_resource_photo': 'resource.png' + } + + tenure_resources = mh.create_tenure_relationship( + mh(), data, [party], [location], self.project) + tenure = TenureRelationship.objects.get(tenure_type='CO') + assert tenure.party == party + assert tenure.spatial_unit == location + assert tenure.attributes == {'fname': False, 'fname_two': 'Tenure One'} + assert len(tenure_resources) == 1 + assert tenure_resources[0]['id'] == tenure.id + assert 'resource.png' in tenure_resources[0]['resources'] + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # inside party_repeat + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + party2 = PartyFactory.create(project=self.project) + party3 = PartyFactory.create(project=self.project) + + data = { + 'party_repeat': [{ + 'tenure_type': 'WR', + 'tenure_relationship_attributes': { + 'fname': False, + 'fname_two': 'Tenure Two' + }, + 'tenure_resource_photo': 'resource_two.png' + }, { + 'tenure_type': 'CO', + 'tenure_relationship_attributes': { + 'fname': True, + 'fname_two': 'Tenure Three' + }, + 'tenure_resource_photo': 'resource_three.png' + }] + } + + tenure_resources = mh.create_tenure_relationship( + mh(), data, [party2, party3], [location], self.project) + tenure2 = TenureRelationship.objects.get(party=party2) + tenure3 = TenureRelationship.objects.get(party=party3) + + assert tenure2.spatial_unit == location + assert tenure2.tenure_type.id == 'WR' + assert tenure2.attributes == { + 'fname': False, 'fname_two': 'Tenure Two'} + + assert tenure3.spatial_unit == location + assert tenure3.tenure_type.id == 'CO' + assert tenure3.attributes == { + 'fname': True, 'fname_two': 'Tenure Three'} + + assert len(tenure_resources) == 2 + assert tenure_resources[0]['id'] == tenure2.id + assert 'resource_two.png' in tenure_resources[0]['resources'] + + assert tenure_resources[1]['id'] == tenure3.id + assert 'resource_three.png' in tenure_resources[1]['resources'] + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # inside location_repeat + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + location2 = SpatialUnitFactory.create(project=self.project) + location3 = SpatialUnitFactory.create(project=self.project) + + data = { + 'location_repeat': [{ + 'tenure_type': 'WR', + 'tenure_relationship_attributes': { + 'fname': False, + 'fname_two': 'Tenure Four' + }, + 'tenure_resource_photo': 'resource_four.png' + }, { + 'tenure_type': 'CO', + 'tenure_relationship_attributes': { + 'fname': True, + 'fname_two': 'Tenure Five' + }, + 'tenure_resource_photo': 'resource_five.png' + }] + } + + tenure_resources = mh.create_tenure_relationship( + mh(), data, [party], [location2, location3], self.project) + + tenure4 = TenureRelationship.objects.get(spatial_unit=location2) + tenure5 = TenureRelationship.objects.get(spatial_unit=location3) + + assert tenure4.party == party + assert tenure4.tenure_type.id == 'WR' + assert tenure4.attributes == { + 'fname': False, 'fname_two': 'Tenure Four'} + + assert tenure5.party == party + assert tenure5.tenure_type.id == 'CO' + assert tenure5.attributes == { + 'fname': True, 'fname_two': 'Tenure Five'} + + assert len(tenure_resources) == 2 + assert tenure_resources[0]['id'] == tenure4.id + assert 'resource_four.png' in tenure_resources[0]['resources'] + + assert tenure_resources[1]['id'] == tenure5.id + assert 'resource_five.png' in tenure_resources[1]['resources'] + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # outside party_repeat + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + party4 = PartyFactory.create(project=self.project) + party5 = PartyFactory.create(project=self.project) + + data = { + 'party_repeat': [], + 'tenure_type': 'CO', + 'tenure_relationship_attributes': { + 'fname': True, + 'fname_two': 'Tenure 6, 7' + }, + 'tenure_resource_photo': 'resource_six.png' + } + + tenure_resources = mh.create_tenure_relationship( + mh(), data, [party4, party5], [location], self.project) + tenure6 = TenureRelationship.objects.get(party=party4) + tenure7 = TenureRelationship.objects.get(party=party5) + + assert tenure6.spatial_unit == location + assert tenure6.tenure_type.id == 'CO' + assert tenure6.attributes == { + 'fname': True, 'fname_two': 'Tenure 6, 7'} + + assert tenure7.spatial_unit == location + assert tenure7.tenure_type.id == 'CO' + assert tenure7.attributes == { + 'fname': True, 'fname_two': 'Tenure 6, 7'} + + assert len(tenure_resources) == 2 + assert tenure_resources[0]['id'] == tenure6.id + assert 'resource_six.png' in tenure_resources[0]['resources'] + + assert tenure_resources[1]['id'] == tenure7.id + assert 'resource_six.png' in tenure_resources[1]['resources'] + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # outside location_repeat + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + location4 = SpatialUnitFactory.create(project=self.project) + location5 = SpatialUnitFactory.create(project=self.project) + + data = { + 'location_repeat': [], + 'tenure_type': 'WR', + 'tenure_relationship_attributes': { + 'fname': False, + 'fname_two': 'Tenure 8, 9' + }, + 'tenure_resource_photo': 'resource_seven.png' + } + + tenure_resources = mh.create_tenure_relationship( + mh(), data, [party], [location4, location5], self.project) + + tenure8 = TenureRelationship.objects.get(spatial_unit=location4) + tenure9 = TenureRelationship.objects.get(spatial_unit=location5) + + assert tenure8.party == party + assert tenure8.tenure_type.id == 'WR' + assert tenure8.attributes == { + 'fname': False, 'fname_two': 'Tenure 8, 9'} + + assert tenure9.party == party + assert tenure9.tenure_type.id == 'WR' + assert tenure9.attributes == { + 'fname': False, 'fname_two': 'Tenure 8, 9'} + + assert len(tenure_resources) == 2 + assert tenure_resources[0]['id'] == tenure8.id + assert 'resource_seven.png' in tenure_resources[0]['resources'] + + assert tenure_resources[1]['id'] == tenure9.id + assert 'resource_seven.png' in tenure_resources[1]['resources'] + + data = { + 'location_repeat': [], + 'tenure_nonsense': 'Blah blah blah', + 'tenure_relationship_attributes': { + 'fname': False, + 'fname_two': 'Tenure 8, 9' + }, + 'tenure_resource_photo': 'resource_seven.png' + } + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test failing + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + with pytest.raises(InvalidXMLSubmission): + mh.create_tenure_relationship( + mh(), data, [party], [location4, location5], self.project) + assert TenureRelationship.objects.count() == 9 + + def test_create_resource(self): + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test attaching resources + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + file = open( + path + '/xforms/tests/files/test_image_one.png', 'rb' + ).read() + + data = InMemoryUploadedFile( + file=io.BytesIO(file), + field_name='test_image_one', + name='{}.png'.format('test_image_one'), + content_type='image/png', + size=len(file), + charset='utf-8', + ) + party = PartyFactory.create(project=self.project) + mh.create_resource( + self, data, self.user, self.project, content_object=party) + assert len(party.resources) == 1 + resource = Resource.objects.get(name='test_image_one.png') + assert resource in party.resources + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test attaching existing resources + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + party2 = PartyFactory.create(project=self.project) + mh.create_resource( + self, data, self.user, self.project, content_object=party2) + + assert Resource.objects.count() == 1 + assert len(party2.resources) == 1 + assert resource in party2.resources + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test without content object + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + file = open( + path + '/xforms/tests/files/test_image_two.png', 'rb' + ).read() + + data = InMemoryUploadedFile( + file=io.BytesIO(file), + field_name='test_image_two', + name='{}.png'.format('test_image_two'), + content_type='image/png', + size=len(file), + charset='utf-8', + ) + + mh.create_resource( + self, data, self.user, self.project, content_object=None) + + assert Resource.objects.count() == 2 + resource = Resource.objects.get(name='test_image_two.png') + assert resource.content_objects.count() == 0 + + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + # test failing + # ~~~~~~~~~~~~~~~~~~~~~~~~~~ + with pytest.raises(InvalidXMLSubmission): + mh.create_resource( + self, data, self.user, self.project, content_object='ardvark') + assert Resource.objects.count() == 2 + + # def test_upload_submission_data(self): + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # covered by the view tests + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + # def test_upload_resource_files(self): + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + # covered by the view tests + # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + def test_format_geometry(self): + point = '40.6890612 -73.9925067 0.0 0.0;' + geometry = mh._format_geometry(self, point, False) + assert 'POINT' in geometry + + point_minus_semi = '340.6890612 -373.9925067 0.0 0.0' + geometry = mh._format_geometry(self, point_minus_semi, False) + assert 'POINT' in geometry + + polygon = ('40.6890612 -73.9925067 0.0 0.0;' + '41.6890612 -73.9925067 0.0 0.0;' + '41.6890612 -72.9925067 0.0 0.0;' + '40.6890612 -72.9925067 0.0 0.0;' + '40.6890612 -73.9925067 0.0 0.0;') + geometry = mh._format_geometry(self, polygon, False) + assert 'POLYGON' in geometry + + line = ('45.56342779158167 -122.67650283873081 0.0 0.0;' + '45.56176327330353 -122.67669159919024 0.0 0.0;' + '45.56151562182025 -122.67490658909082 0.0 0.0;') + geometry = mh._format_geometry(self, line, False) + assert 'LINESTRING' in geometry + + geoshape = ('45.56342779158167 -122.67650283873081 0.0 0.0;' + '45.56176327330353 -122.67669159919024 0.0 0.0;' + '45.56151562182025 -122.67490658909082 0.0 0.0;' + '45.563479432877415 -122.67494414001703 0.0 0.0;' + '45.56176327330353 -122.67669159919024 0.0 0.0') + geometry = mh._format_geometry(self, geoshape, True) + assert 'POLYGON' in geometry + + def test_format_repeat(self): + data = { + 'party_type': 'Not repeating', + 'party_name': 'Still not repeating' + } + group = mh._format_repeat(self, data, ['party']) + assert type(group) == list + assert group[0] == data + + data = { + 'party_type': 'Repeating', + 'party_name': 'Totally repeating', + 'party_repeat': [{ + 'repeat_type': 'Just One' + }] + } + + group = mh._format_repeat(self, data, ['party']) + assert type(group) == list + assert len(group) == 1 + assert group[0]['repeat_type'] == 'Just One' + + assert 'party_repeat' not in group + assert 'party_type' not in group + assert 'party_name' not in group + + data = { + 'party_type': 'Repeating', + 'party_name': 'Totally repeating', + 'party_repeat': [{ + 'repeat_type': 'First!' + }, { + 'repeat_type': 'Second!' + }] + } + + group = mh._format_repeat(self, data, ['party']) + assert type(group) == list + assert len(group) == 2 + assert group[0]['repeat_type'] == 'First!' + assert group[1]['repeat_type'] == 'Second!' + + assert 'party_repeat' not in group + assert 'party_type' not in group + assert 'party_name' not in group + + def test_get_questionnaire(self): + questionnaire = mh._get_questionnaire( + self, 'a1', '0') + assert questionnaire == self.questionnaire + + with pytest.raises(ValidationError): + mh._get_questionnaire( + self, 'bad_info', '0') + + def test_get_attributes(self): + data = { + 'party_type': 'Party Type', + 'party_attributes_individual': { + 'name_indv': 'Party Indv Attrs', + 'type_indv': 'Party for one', + }, + 'party_attributes_people': { + 'name_ppl': 'Party People Attrs', + 'type_ppl': 'Where my party people at?', + }, + 'party_name': 'House Party' + } + attributes = mh._get_attributes(self, data, 'party') + + assert attributes['name_indv'] == 'Party Indv Attrs' + assert attributes['type_indv'] == 'Party for one' + assert attributes['name_ppl'] == 'Party People Attrs' + assert attributes['type_ppl'] == 'Where my party people at?' + assert 'party_name' not in attributes + assert 'party_type' not in attributes + + def test_get_resource_files(self): + data = { + 'ardvark': 'Ardvark!', + 'party_resource_thing': 'Party Resource Thing!', + 'location_resource_thing': 'Location Resource!', + 'party_photo': 'Party Photo!' + } + resources = mh._get_resource_files(self, data, 'party') + assert type(resources) == list + assert 'Party Resource Thing!' in resources + assert 'Party Photo!' in resources + + assert 'Ardvark!' not in resources + assert 'Location Resource!' not in resources + + resources = mh._get_resource_files(self, data, 'location') + assert 'Location Resource!' in resources + + assert 'Ardvark!' not in resources + assert 'Party Resource Thing!' not in resources + assert 'Party Photo!' not in resources + + def test_get_resource_names(self): + data = { + 'party_type': 'Party Type', + 'party_photo': 'Party Photo', + 'party_resource_thing': 'Party Resource Thing', + 'tenure_resource_thing': 'Tenure Resource Thing', + } + model = PartyFactory.create() + resources = mh._get_resource_names(self, data, model, 'party') + assert resources['id'] == model.id + assert 'Party Photo' in resources['resources'] + assert 'Party Resource Thing' in resources['resources'] + + assert 'Tenure Resource Thing' not in resources['resources'] + assert 'Party Type' not in resources['resources'] diff --git a/cadasta/xforms/tests/test_views_api.py b/cadasta/xforms/tests/test_views_api.py index 0dec2680a..2af3d9bae 100644 --- a/cadasta/xforms/tests/test_views_api.py +++ b/cadasta/xforms/tests/test_views_api.py @@ -26,6 +26,7 @@ from spatial.models import SpatialUnit from tutelary.models import Role from xforms.tests.files.test_resources import responses +from xforms.models import XFormSubmission from ..views import api from .attr_schemas import (default_party_xform_group, @@ -95,7 +96,6 @@ def test_get_xforms_with_no_superuser(self): response = self.request(user=self.user) assert response.status_code == 200 - print(response.content) xml = etree.fromstring(response.content.encode('utf-8')) ns = {'xf': 'http://openrosa.org/xforms/xformsList'} @@ -123,72 +123,39 @@ def setup_models(self): self.user = UserFactory.create() self.org = OrganizationFactory.create() self.prj = ProjectFactory.create(organization=self.org) - self.prj_2 = ProjectFactory.create(organization=self.org) - self.prj_3 = ProjectFactory.create(organization=self.org) OrganizationRole.objects.create( organization=self.org, user=self.user, admin=True) - QuestionnaireFactory.create( - project=self.prj, - xls_form=get_form('test_standard_questionnaire'), - filename='test_standard_questionnaire', - id_string='test_standard_questionnaire', - version=20160727122110) - + def _create_questionnaire(self, questionnaire_name, version, + schema=True): questionnaire = QuestionnaireFactory.create( - project=self.prj_2, - xls_form=get_form('test_standard_questionnaire_2'), - filename='test_standard_questionnaire_2', - id_string='test_standard_questionnaire_2', - version=20160727122111) - - QuestionFactory.create( - name='location_geometry', - label='Location of Parcel', - type='GS', - questionnaire=questionnaire) + project=self.prj, + xls_form=get_form(questionnaire_name), + filename=questionnaire_name, + id_string=questionnaire_name, + version=(20160727122110 + version)) - QuestionnaireFactory.create( - project=self.prj_3, - xls_form=get_form('test_standard_questionnaire_bad'), - filename='test_standard_questionnaire_bad', - id_string='test_standard_questionnaire_bad', - version=20160727122112) + if schema: + self._create_attrs_schema(self.prj) - # project 1 - create_attrs_schema( - project=self.prj, dict=default_party_xform_group, - content_type=ContentType.objects.get( - app_label='party', model='party'), errors=[]) - create_attrs_schema( - project=self.prj, dict=individual_party_xform_group, - content_type=ContentType.objects.get( - app_label='party', model='party'), errors=[]) - create_attrs_schema( - project=self.prj, dict=location_xform_group, - content_type=ContentType.objects.get( - app_label='spatial', model='spatialunit'), errors=[]) - create_attrs_schema( - project=self.prj, dict=tenure_relationship_xform_group, - content_type=ContentType.objects.get( - app_label='party', model='tenurerelationship'), errors=[]) + return questionnaire - # project 2 + def _create_attrs_schema(self, prj): create_attrs_schema( - project=self.prj_2, dict=default_party_xform_group, + project=prj, dict=default_party_xform_group, content_type=ContentType.objects.get( app_label='party', model='party'), errors=[]) create_attrs_schema( - project=self.prj_2, dict=individual_party_xform_group, + project=prj, dict=individual_party_xform_group, content_type=ContentType.objects.get( app_label='party', model='party'), errors=[]) create_attrs_schema( - project=self.prj_2, dict=location_xform_group, + project=prj, dict=location_xform_group, content_type=ContentType.objects.get( app_label='spatial', model='spatialunit'), errors=[]) create_attrs_schema( - project=self.prj_2, dict=tenure_relationship_xform_group, + project=prj, dict=tenure_relationship_xform_group, content_type=ContentType.objects.get( app_label='party', model='tenurerelationship'), errors=[]) @@ -265,9 +232,16 @@ def _getResponseMessage(self, response): ns = {'or': 'http://openrosa.org/http/response'} return xml.find('.//or:message', namespaces=ns).text + def _test_resource(self, resource, model): + assert Resource.objects.get( + name__contains=resource) in model.resources + def test_submission_upload(self): - data = self._submission(form='form', - image=['test_image_one', 'test_image_two'], + questionnaire = self._create_questionnaire('t_questionnaire', 0) + data = self._submission(form='submission', + image=['test_image_one', + 'test_image_two', + 'test_image_three'], audio=['test_audio_one']) response = self.request(method='POST', user=self.user, post_data=data, @@ -276,18 +250,21 @@ def test_submission_upload(self): party = Party.objects.get(name='Bilbo Baggins') location = SpatialUnit.objects.get(attributes={'name': 'Middle Earth'}) - assert location in party.tenure_relationships.all() - assert len(location.resources) == 1 - assert location.resources[0] == Resource.objects.get( - name__contains='test_image_one') - assert len(party.resources) == 2 - assert Resource.objects.get( - name__contains='test_image_two') in party.resources - assert Resource.objects.get( - name__contains='test_audio_one') in party.resources + tenure = TenureRelationship.objects.get(party=party) + assert tenure.spatial_unit == location + self._test_resource('test_image_one', location) + self._test_resource('test_image_two', party) + self._test_resource('test_audio_one', party) + self._test_resource('test_image_three', tenure) + + response = XFormSubmission.objects.get(user=self.user) + assert response.questionnaire == questionnaire + assert ('Bilbo Baggins' in + response.json_submission['t_questionnaire']['party_name']) def test_line_upload(self): - data = self._submission(form='line_form') + self._create_questionnaire('t_questionnaire', 0) + data = self._submission(form='submission_line') response = self.request(method='POST', user=self.user, post_data=data, content_type='multipart/form-data') @@ -296,7 +273,8 @@ def test_line_upload(self): assert geom.geometry.geom_type == 'LineString' def test_polygon_upload(self): - data = self._submission(form='poly_form', + self._create_questionnaire('t_questionnaire', 0) + data = self._submission(form='submission_poly', audio=['test_audio_one']) response = self.request(method='POST', user=self.user, post_data=data, content_type='multipart/form-data') @@ -307,11 +285,11 @@ def test_polygon_upload(self): assert geom.geometry.geom_type == 'Polygon' tenure = TenureRelationship.objects.get(tenure_type='LH') - assert Resource.objects.get( - name__contains='test_audio_one') in tenure.resources + self._test_resource('test_audio_one', tenure) def test_point_upload(self): - data = self._submission(form='missing_semi_form') + self._create_questionnaire('t_questionnaire', 0) + data = self._submission(form='submission_missing_semi') response = self.request(method='POST', user=self.user, post_data=data, content_type='multipart/form-data') @@ -320,7 +298,15 @@ def test_point_upload(self): assert geom.geometry.geom_type == 'Point' def test_geoshape_upload(self): - data = self._submission(form='geoshape_form') + questionnaire = self._create_questionnaire( + 't_questionnaire_geotype_select', 1) + QuestionFactory.create( + name='location_geometry', + label='Location of Parcel', + type='GS', + questionnaire=questionnaire) + + data = self._submission(form='submission_geotype_select') response = self.request(method='POST', user=self.user, post_data=data, content_type='multipart/form-data') @@ -329,7 +315,15 @@ def test_geoshape_upload(self): assert geom.geometry.geom_type == 'Polygon' def test_geoshape_as_location_geometry_upload(self): - data = self._submission(form='location_geoshape_form') + questionnaire = self._create_questionnaire( + 't_questionnaire_geotype_select', 1) + QuestionFactory.create( + name='location_geometry', + label='Location of Parcel', + type='GS', + questionnaire=questionnaire) + + data = self._submission(form='submission_geotype_neither') response = self.request(method='POST', user=self.user, post_data=data, content_type='multipart/form-data') @@ -338,6 +332,7 @@ def test_geoshape_as_location_geometry_upload(self): assert geom.geometry.geom_type == 'Polygon' def test_invalid_submission_upload(self): + self._create_questionnaire('t_questionnaire', 0) # testing submitting with a missing xml_submission_file data = self._invalid_submission(form='This is not an xml form!') response = self.request(method='POST', user=self.user, post_data=data, @@ -346,21 +341,21 @@ def test_invalid_submission_upload(self): msg = self._getResponseMessage(response) assert msg == "XML submission not found" - data = self._submission(form='bad_location_form') + data = self._submission(form='submission_bad_location') response = self.request(method='POST', user=self.user, post_data=data, content_type='multipart/form-data') assert response.status_code == 400 msg = self._getResponseMessage(response) assert msg == "Location error: 'location_type'" - data = self._submission(form='bad_party_form') + data = self._submission(form='submission_bad_party') response = self.request(method='POST', user=self.user, post_data=data, content_type='multipart/form-data') assert response.status_code == 400 msg = self._getResponseMessage(response) assert msg == "Party error: 'party_name'" - data = self._submission(form='bad_tenure_form') + data = self._submission(form='submission_bad_tenure') response = self.request(method='POST', user=self.user, post_data=data, content_type='multipart/form-data') assert response.status_code == 400 @@ -373,7 +368,8 @@ def test_invalid_submission_upload(self): ).read() bad_file = bad_file.decode('utf-8') - data = self._submission(form='bad_resource_form', + self._create_questionnaire('t_questionnaire_bad', 2, False) + data = self._submission(form='submission_bad_resource', image=['test_image_one'], file=bad_file) response = self.request(method='POST', user=self.user, post_data=data, @@ -388,14 +384,15 @@ def test_invalid_submission_upload(self): assert len(Resource.objects.all()) == 0 def test_anonymous_user(self): - data = self._submission(form='form') + self._create_questionnaire('t_questionnaire', 0) + data = self._submission(form='submission') response = self.request(method='POST', post_data=data, content_type='multipart/form-data') assert response.status_code == 403 def test_questionnaire_not_found(self): with pytest.raises(ValidationError): - data = self._submission(form='bad_questionnaire') + data = self._submission(form='submission_bad_questionnaire') response = self.request(method='POST', post_data=data, user=self.user, @@ -408,16 +405,180 @@ def test_no_content_head(self): def test_form_not_current_questionnaire(self): # update the default form to a new version - QuestionnaireFactory.create( - project=self.prj, - xls_form=get_form('test_standard_questionnaire'), - filename='test_standard_questionnaire_updated', - id_string='test_standard_questionnaire', - version=20160727122111 - ) - data = self._submission(form='form') + self._create_questionnaire('t_questionnaire', 0) + self._create_questionnaire('t_questionnaire', 1) + + data = self._submission(form='submission') response = self.request(method='POST', post_data=data, user=self.user, content_type='multipart/form-data') msg = self._getResponseMessage(response) assert msg == 'Form out of date' + + def test_form_with_repeat_party(self): + self._create_questionnaire('t_questionnaire_repeat_party', 3) + data = self._submission(form='submission_party_repeat', + image=['test_image_one', + 'test_image_two', + 'test_image_three', + 'test_image_four', + 'test_image_five'], + audio=['test_audio_one']) + + response = self.request(method='POST', user=self.user, post_data=data, + content_type='multipart/form-data') + assert response.status_code == 201 + + party_one = Party.objects.get(name='Bilbo Baggins') + party_two = Party.objects.get(name='Samwise Gamgee') + location = SpatialUnit.objects.get(type='MI') + tenure = TenureRelationship.objects.get(party=party_one) + assert tenure.spatial_unit == location + self._test_resource('test_audio_one', location) + self._test_resource('test_image_one', location) + self._test_resource('test_image_two', party_one) + self._test_resource('test_image_three', party_one) + self._test_resource('test_image_four', tenure) + self._test_resource('test_image_five', party_two) + + def test_form_repeat_with_one_party(self): + self._create_questionnaire('t_questionnaire_repeat_party', 3) + data = self._submission(form='submission_party_one_repeat', + image=['test_image_one', + 'test_image_two', + 'test_image_three', + 'test_image_four'], + audio=['test_audio_one']) + + response = self.request(method='POST', user=self.user, post_data=data, + content_type='multipart/form-data') + assert response.status_code == 201 + + party = Party.objects.get(name='Bilbo Baggins') + location = SpatialUnit.objects.get(type='MI') + tenure = TenureRelationship.objects.get( + party=party) + assert tenure.spatial_unit == location + self._test_resource('test_audio_one', location) + self._test_resource('test_image_one', location) + self._test_resource('test_image_two', party) + self._test_resource('test_image_three', party) + self._test_resource('test_image_four', tenure) + + def test_form_with_repeat_location(self): + self._create_questionnaire('t_questionnaire_repeat_location', 4) + data = self._submission(form='submission_location_repeat', + image=['test_image_one', + 'test_image_two', + 'test_image_three', + 'test_image_four', + 'test_image_five'], + audio=['test_audio_one']) + + response = self.request(method='POST', user=self.user, post_data=data, + content_type='multipart/form-data') + assert response.status_code == 201 + + party = Party.objects.get(name='Bilbo Baggins') + location_one = SpatialUnit.objects.get(type='MI') + location_two = SpatialUnit.objects.get(type='CB') + tenure_one = TenureRelationship.objects.get( + spatial_unit=location_one) + assert tenure_one.party == party + tenure = TenureRelationship.objects.get( + spatial_unit=location_two) + + assert tenure.party == party + self._test_resource('test_audio_one', location_one) + self._test_resource('test_image_one', location_one) + self._test_resource('test_image_two', tenure_one) + self._test_resource('test_image_three', location_two) + self._test_resource('test_image_four', party) + self._test_resource('test_image_five', party) + + def test_form_repeat_with_one_location(self): + self._create_questionnaire('t_questionnaire_repeat_location', 4) + data = self._submission(form='submission_location_one_repeat', + image=['test_image_one', + 'test_image_two', + 'test_image_four', + 'test_image_five'], + audio=['test_audio_one']) + + response = self.request(method='POST', user=self.user, post_data=data, + content_type='multipart/form-data') + assert response.status_code == 201 + + party = Party.objects.get(name='Bilbo Baggins') + location = SpatialUnit.objects.get(type='MI') + tenure = TenureRelationship.objects.get( + spatial_unit=location) + + assert tenure.party == party + self._test_resource('test_audio_one', location) + self._test_resource('test_image_one', location) + self._test_resource('test_image_two', tenure) + self._test_resource('test_image_four', party) + self._test_resource('test_image_five', party) + + def test_form_repeat_minus_tenure(self): + self._create_questionnaire('t_questionnaire_repeat_minus_tenure', 5) + data = self._submission(form='submission_repeat_minus_tenure', + image=['test_image_one', + 'test_image_two', + 'test_image_three', + 'test_image_four', + 'test_image_five'], + audio=['test_audio_one']) + + response = self.request(method='POST', user=self.user, post_data=data, + content_type='multipart/form-data') + assert response.status_code == 201 + + party = Party.objects.get(name='Bilbo Baggins') + location_one = SpatialUnit.objects.get(type='MI') + location_two = SpatialUnit.objects.get(type='CB') + tenure_one = TenureRelationship.objects.get( + spatial_unit=location_one) + tenure_two = TenureRelationship.objects.get( + spatial_unit=location_two) + assert tenure_one.party == party and tenure_two.party == party + + self._test_resource('test_audio_one', location_one) + self._test_resource('test_image_one', location_one) + self._test_resource('test_image_two', tenure_one) + self._test_resource('test_image_two', tenure_two) + self._test_resource('test_image_three', location_two) + self._test_resource('test_image_four', party) + self._test_resource('test_image_five', party) + + def test_form_repeat_party_minus_tenure(self): + self._create_questionnaire( + 't_questionnaire_repeat_party_minus_tenure', 6) + data = self._submission(form='submission_repeat_party_minus_tenure', + image=['test_image_one', + 'test_image_two', + 'test_image_three', + 'test_image_four', + 'test_image_five'], + audio=['test_audio_one']) + + response = self.request(method='POST', user=self.user, post_data=data, + content_type='multipart/form-data') + assert response.status_code == 201 + + party_one = Party.objects.get(name='Bilbo Baggins') + party_two = Party.objects.get(name='Samwise Gamgee') + location = SpatialUnit.objects.get(type='MI') + tenure_one = TenureRelationship.objects.get(party=party_one) + tenure_two = TenureRelationship.objects.get(party=party_two) + assert tenure_one.spatial_unit == location + assert tenure_two.spatial_unit == location + + self._test_resource('test_audio_one', location) + self._test_resource('test_image_one', location) + self._test_resource('test_image_two', tenure_one) + self._test_resource('test_image_two', tenure_two) + self._test_resource('test_image_three', party_one) + self._test_resource('test_image_four', party_one) + self._test_resource('test_image_five', party_two) diff --git a/cadasta/xforms/views/api.py b/cadasta/xforms/views/api.py index 8f551cf33..9a74c5a4e 100644 --- a/cadasta/xforms/views/api.py +++ b/cadasta/xforms/views/api.py @@ -17,7 +17,8 @@ from ..exceptions import InvalidXMLSubmission -logger = logging.getLogger('xform.submissions') +logger = logging +# logger = logging.getLogger('xform.submissions') OPEN_ROSA_ENVELOPE = """ <OpenRosaResponse xmlns="http://openrosa.org/http/response"> @@ -46,9 +47,10 @@ def create(self, request, *args, **kwargs): status=status.HTTP_204_NO_CONTENT,) try: instance = ModelHelper( - ).upload_submission_data(request) + ).upload_submission_data(request) except InvalidXMLSubmission as e: - logger.debug(str(e)) + # logger.debug(str(e)) + logger.error(str(e)) return self._sendErrorResponse(request, e) serializer = XFormSubmissionSerializer(instance) @@ -93,11 +95,11 @@ class XFormListView(OpenRosaHeadersMixin, def get_user_forms(self): forms = [] policies = self.request.user.assigned_policies() - orgs = self.request.user.organizations.all() + orgs = self.request.user.organizations.filter(archived=False) if Role.objects.get(name='superuser') in policies: - return Questionnaire.objects.all() + return Questionnaire.objects.filter(project__archived=False) for org in orgs: - projects = org.projects.all() + projects = org.projects.filter(archived=False) for project in projects: try: questionnaire = Questionnaire.objects.get(