Skip to content

Instantly share code, notes, and snippets.

@loic
Created September 7, 2016 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save loic/73702350ba5cea8935edfaece39739b9 to your computer and use it in GitHub Desktop.
Save loic/73702350ba5cea8935edfaece39739b9 to your computer and use it in GitHub Desktop.
diff --git a/scope/foodnet/apps/mobile/importer.py b/scope/foodnet/apps/mobile/importer.py
index 2ce4f0e..c1a8c0c 100644
--- a/scope/foodnet/apps/mobile/importer.py
+++ b/scope/foodnet/apps/mobile/importer.py
@@ -76,18 +76,22 @@ class MobileHouseholdImporter(object):
member = Person(uuid=member_uuid)
created = True
- member.last_name = member_data.get('lastName', '')
- member.first_name = member_data.get('firstName', '')
- member.middle_name = member_data.get('middleName', '')
+
+ # Previous to 1.0.3 "info" wasn't a subdict of member.
+ info = member_data.get('info', member_data)
+
+ member.last_name = info.get('lastName', '')
+ member.first_name = info.get('firstName', '')
+ member.middle_name = info.get('middleName', '')
member.location = household.location
- member.phone_number = self.get_phone_number(member_data.get('homePhone', ''))
- member.mobile_number = self.get_phone_number(member_data.get('mobilePhone', ''))
+ member.phone_number = self.get_phone_number(info.get('homePhone', ''))
+ member.mobile_number = self.get_phone_number(info.get('mobilePhone', ''))
member.office = household.office
member.household = household
- member.household_role = self.get_role(member_data.get('role'))
- member.gender = self.get_gender(member_data.get('gender'))
- member.date_of_birth_is_exact = member_data.get('dateOfBirthExact', False)
- member.date_of_birth = self.get_date_from_iso(member_data.get('dateOfBirth'))
+ member.household_role = self.get_role(info.get('role'))
+ member.gender = self.get_gender(info.get('gender'))
+ member.date_of_birth_is_exact = info.get('dateOfBirthExact', False)
+ member.date_of_birth = self.get_date_from_iso(info.get('dateOfBirth'))
member.full_clean()
member.save()
@@ -132,7 +136,7 @@ class MobileHouseholdImporter(object):
# TODO: md5 digest
# Bio data
- if 'height' in member_data: # Hack! To detect if we have bio data!
+ if 'height' in info: # Hack! To detect if we have bio data!
# TODO: We need to support time series,
# get_or_create() will blow up if there
# is more than one.
@@ -144,13 +148,13 @@ class MobileHouseholdImporter(object):
# Registrar can use 0 to opt out of a field,
# so we cast it to None (i.e. no value).
- bio_data.height = member_data.get('height') or None
- bio_data.weight = member_data.get('weight') or None
- bio_data.muac = member_data.get('muac') or None
+ bio_data.height = info.get('height') or None
+ bio_data.weight = info.get('weight') or None
+ bio_data.muac = info.get('muac') or None
- bio_data.breastfeeding = member_data.get('breastfeeding', False)
- bio_data.malnourished = member_data.get('malnourished', False)
- bio_data.pregnant = member_data.get('pregnant', False)
+ bio_data.breastfeeding = info.get('breastfeeding', False)
+ bio_data.malnourished = info.get('malnourished', False)
+ bio_data.pregnant = info.get('pregnant', False)
bio_data.save()
@@ -158,24 +162,24 @@ class MobileHouseholdImporter(object):
@transaction.atomic
def import_household(self):
+ info = self.source['info']
household = None
household_uuid = None
- household_name = None
cycle_subscription = None
if self.token_mapping == 'UUID':
- household_uuid = uuid.UUID(self.source['info']['token'])
+ household_uuid = uuid.UUID(info['token'])
if self.token_mapping == 'HOUSEHOLD_NAME':
- household_name = self.source['info']['token']
+ household_name = info['token']
else:
- household_name = self.source['info'].get('name', '')
+ household_name = info.get('name', '')
if self.token_mapping == 'DELIVERY_MECHANISM':
cycle_subscription = (
CycleSubscription.objects
.select_related('enrolment__household')
- .filter(token_num=self.source['info']['token'])
+ .filter(token_num=info['token'])
.first()
)
if cycle_subscription:
@@ -196,9 +200,9 @@ class MobileHouseholdImporter(object):
)
household.name = household_name
- household.refugee_status = self.get_beneficiary_type(self.source['info'].get('beneficiaryType'))
- household.location = self.get_location(self.source['info'].get('location'))
- household.address = self.source['info'].get('address')
+ household.refugee_status = self.get_beneficiary_type(info.get('beneficiaryType'))
+ household.location = self.get_location(info.get('location'))
+ household.address = info.get('address')
household.claimed_member_count = len(self.source['members'])
household.full_clean()
household.save()
diff --git a/scope/foodnet/apps/mobile/serializers.py b/scope/foodnet/apps/mobile/serializers.py
index 88eaf1e..3744f0a 100644
--- a/scope/foodnet/apps/mobile/serializers.py
+++ b/scope/foodnet/apps/mobile/serializers.py
@@ -72,10 +72,7 @@ def get_attachment_key_for_fingerprint_template(person, fingerprint):
to_mobile_choice(FINGERPRINT_FINGER_MAPPING, fingerprint.finger),
)
-
-class PersonSerializer(serializers.Serializer):
-
- id = UUIDField(source='uuid')
+class PersonInfoSerializer(serializers.Serializer):
firstName = serializers.CharField(source='first_name')
middleName = serializers.CharField(source='middle_name')
@@ -114,6 +111,13 @@ class PersonSerializer(serializers.Serializer):
homePhone = serializers.CharField(source='phone_number')
mobilePhone = serializers.CharField(source='mobile_number')
+
+class PersonSerializer(serializers.Serializer):
+
+ id = UUIDField(source='uuid')
+
+ info = PersonInfoSerializer(source='*')
+
photo = serializers.SerializerMethodField()
def get_photo(self, obj):
diff --git a/scope/foodnet/apps/mobile/tests.py b/scope/foodnet/apps/mobile/tests.py
index 0f0ccbe..022c9b8 100644
--- a/scope/foodnet/apps/mobile/tests.py
+++ b/scope/foodnet/apps/mobile/tests.py
@@ -6,7 +6,7 @@ from rest_framework.renderers import JSONRenderer
from foodnet.apps.mobile.constants import BENEFICIARY_TYPE_MAPPING, GENDER_MAPPING, ROLE_MAPPING, to_mobile_choice
from foodnet.apps.mobile.serializers import PersonSerializer, HouseholdSerializer, format_uuid, \
- get_attachment_key_for_photo
+ get_attachment_key_for_photo, PersonInfoSerializer
from foodnet.apps.registration.factories import person_factory, household_factory
from foodnet.apps.wfp.factories import office_factory
@@ -25,18 +25,20 @@ class TestSerializers(TestCase):
def _get_control_data_for_person(self, person):
return {
'id': format_uuid(person.uuid),
- 'firstName': person.first_name,
- 'middleName': person.middle_name,
- 'lastName': person.last_name,
- 'gender': to_mobile_choice(GENDER_MAPPING, person.gender),
- 'dateOfBirth': str(person.date_of_birth),
- 'dateOfBirthExact': person.date_of_birth_is_exact,
- 'role': to_mobile_choice(ROLE_MAPPING, person.household_role),
- 'recipient': PersonSerializer().get_recipient(person),
- 'documentType': PersonSerializer().get_document_type(person),
- 'documentNumber': PersonSerializer().get_document_number(person),
- 'homePhone': person.phone_number,
- 'mobilePhone': person.mobile_number,
+ 'info': {
+ 'firstName': person.first_name,
+ 'middleName': person.middle_name,
+ 'lastName': person.last_name,
+ 'gender': to_mobile_choice(GENDER_MAPPING, person.gender),
+ 'dateOfBirth': str(person.date_of_birth),
+ 'dateOfBirthExact': person.date_of_birth_is_exact,
+ 'role': to_mobile_choice(ROLE_MAPPING, person.household_role),
+ 'recipient': PersonInfoSerializer().get_recipient(person),
+ 'documentType': PersonInfoSerializer().get_document_type(person),
+ 'documentNumber': PersonInfoSerializer().get_document_number(person),
+ 'homePhone': person.phone_number,
+ 'mobilePhone': person.mobile_number,
+ },
'photo': get_attachment_key_for_photo(person),
'fingerprints': PersonSerializer().get_fingerprints(person),
'meta': {},
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment