def test_parse_xform_nested_repeats(self): self._publish_and_submit_new_repeats() parser = XFormInstanceParser(self.xml, self.xform.data_dictionary()) dict = parser.to_dict() expected_dict = { u'new_repeats': { u'info': { u'age': u'80', u'name': u'Adam' }, u'kids': { u'kids_details': [ { u'kids_age': u'50', u'kids_name': u'Abel' }, ], u'has_kids': u'1' }, u'web_browsers': u'chrome ie', u'gps': u'-1.2627557 36.7926442 0.0 30.0' } } self.assertEqual(dict, expected_dict) flat_dict = parser.to_flat_dict() expected_flat_dict = { u'gps': u'-1.2627557 36.7926442 0.0 30.0', u'kids/kids_details': [ { u'kids/kids_details/kids_name': u'Abel', u'kids/kids_details/kids_age': u'50' } ], u'kids/has_kids': u'1', u'info/age': u'80', u'web_browsers': u'chrome ie', u'info/name': u'Adam' } self.assertEqual(flat_dict, expected_flat_dict)
class Instance(models.Model): # I should rename this model, maybe Survey xml = models.TextField() user = models.ForeignKey(User, related_name='surveys', null=True) # using instances instead of surveys breaks django xform = models.ForeignKey(XForm, null=True, related_name='surveys') start_time = models.DateTimeField(null=True) date = models.DateField(null=True) survey_type = models.ForeignKey(SurveyType) # shows when we first received this instance date_created = models.DateTimeField(auto_now_add=True) # this will end up representing "date last parsed" date_modified = models.DateTimeField(auto_now=True) # this will end up representing "date instance was deleted" deleted_at = models.DateTimeField(null=True, default=None) is_deleted = models.BooleanField(null=False, default=False) # ODK keeps track of three statuses for an instance: # incomplete, submitted, complete # we will add a fourth status: submitted_via_web status = models.CharField(max_length=20, default=u'submitted_via_web') uuid = models.CharField(max_length=249, default=u'') tags = TaggableManager() class Meta: app_label = 'odk_logger' def _set_xform(self, id_string): self.xform = XForm.objects.get( id_string=id_string, user=self.user) def get_root_node_name(self): self._set_parser() return self._parser.get_root_node_name() def get_root_node(self): self._set_parser() return self._parser.get_root_node() def get(self, abbreviated_xpath): self._set_parser() return self._parser.get(abbreviated_xpath) def _set_survey_type(self, doc): self.survey_type, created = \ SurveyType.objects.get_or_create(slug=self.get_root_node_name()) # todo: get rid of these fields def _set_start_time(self, doc): self.start_time = None def _set_date(self, doc): self.date = None def _set_uuid(self): if self.xml and not self.uuid: uuid = get_uuid_from_xml(self.xml) if uuid is not None: self.uuid = uuid set_uuid(self) def save(self, *args, **kwargs): self._set_xform(get_id_string_from_xml_str(self.xml)) doc = self.get_dict() if self.xform and not self.xform.downloadable: raise FormInactiveError() self._set_start_time(doc) self._set_date(doc) self._set_survey_type(doc) self._set_uuid() super(Instance, self).save(*args, **kwargs) def _set_parser(self): if not hasattr(self, "_parser"): self._parser = XFormInstanceParser( self.xml, self.xform.data_dictionary()) def get_dict(self, force_new=False, flat=True): """Return a python object representation of this instance's XML.""" self._set_parser() if flat: return self._parser.get_flat_dict_with_attributes() else: return self._parser.to_dict() def set_deleted(self, deleted_at=timezone.now()): self.deleted_at = deleted_at self.is_deleted = True self.save() self.parsed_instance.save() @classmethod def set_deleted_at(cls, instance_id, deleted_at=timezone.now()): try: instance = cls.objects.get(id=instance_id) except cls.DoesNotExist: pass else: instance.set_deleted(deleted_at)
def _set_parser(self): if not hasattr(self, "_parser"): self._parser = XFormInstanceParser( self.xml, self.xform.data_dictionary())
def _set_parser(self): if not hasattr(self, "_parser"): self._parser = XFormInstanceParser(self.xml)
class Instance(models.Model): # I should rename this model, maybe Survey xml = models.TextField() user = models.ForeignKey(User, related_name='surveys', null=True) #using instances instead of surveys breaks django xform = models.ForeignKey(XForm, null=True, related_name='surveys') start_time = models.DateTimeField(null=True) date = models.DateField(null=True) survey_type = models.ForeignKey(SurveyType) #shows when we first received this instance date_created = models.DateTimeField(auto_now_add=True) #this will end up representing "date last parsed" date_modified = models.DateTimeField(auto_now=True) # ODK keeps track of three statuses for an instance: # incomplete, submitted, complete # we will add a fourth status: submitted_via_web status = models.CharField(max_length=20, default=u'submitted_via_web') uuid = models.CharField(max_length=32, default=u'') class Meta: app_label = 'odk_logger' def _set_xform(self, doc): self.xform = XForm.objects.get(id_string=doc[XFORM_ID_STRING], user=self.user) def get_root_node_name(self): self._set_parser() return self._parser.get_root_node_name() def get(self, abbreviated_xpath): self._set_parser() return self._parser.get(abbreviated_xpath) def _set_survey_type(self, doc): self.survey_type, created = \ SurveyType.objects.get_or_create(slug=self.get_root_node_name()) # todo: get rid of these fields def _set_start_time(self, doc): self.start_time = None def _set_date(self, doc): self.date = None def save(self, *args, **kwargs): doc = self.get_dict() self._set_xform(doc) if self.xform and not self.xform.downloadable: raise FormInactiveError() self._set_start_time(doc) self._set_date(doc) self._set_survey_type(doc) set_uuid(self) super(Instance, self).save(*args, **kwargs) def _set_parser(self): if not hasattr(self, "_parser"): self._parser = XFormInstanceParser(self.xml) def get_dict(self, force_new=False, flat=True): """Return a python object representation of this instance's XML.""" self._set_parser() if flat: return self._parser.get_flat_dict_with_attributes() else: return self._parser.to_dict()
class Instance(models.Model): # I should rename this model, maybe Survey xml = models.TextField() user = models.ForeignKey(User, related_name='surveys', null=True) # using instances instead of surveys breaks django xform = models.ForeignKey(XForm, null=True, related_name='surveys') start_time = models.DateTimeField(null=True) date = models.DateField(null=True) survey_type = models.ForeignKey(SurveyType) # shows when we first received this instance date_created = models.DateTimeField(auto_now_add=True) # this will end up representing "date last parsed" date_modified = models.DateTimeField(auto_now=True) # this will end up representing "date instance was deleted" deleted_at = models.DateTimeField(null=True, default=None) # ODK keeps track of three statuses for an instance: # incomplete, submitted, complete # we will add a fourth status: submitted_via_web status = models.CharField(max_length=20, default=u'submitted_via_web') uuid = models.CharField(max_length=32, default=u'') class Meta: app_label = 'odk_logger' def _set_xform(self, id_string): self.xform = XForm.objects.get(id_string=id_string, user=self.user) def get_root_node_name(self): self._set_parser() return self._parser.get_root_node_name() def get(self, abbreviated_xpath): self._set_parser() return self._parser.get(abbreviated_xpath) def _set_survey_type(self, doc): self.survey_type, created = \ SurveyType.objects.get_or_create(slug=self.get_root_node_name()) # todo: get rid of these fields def _set_start_time(self, doc): self.start_time = None def _set_date(self, doc): self.date = None def save(self, *args, **kwargs): self._set_xform(get_id_string_from_xml_str(self.xml)) doc = self.get_dict() if self.xform and not self.xform.downloadable: raise FormInactiveError() self._set_start_time(doc) self._set_date(doc) self._set_survey_type(doc) set_uuid(self) super(Instance, self).save(*args, **kwargs) def _set_parser(self): if not hasattr(self, "_parser"): self._parser = XFormInstanceParser(self.xml, self.xform.data_dictionary()) def get_dict(self, force_new=False, flat=True): """Return a python object representation of this instance's XML.""" self._set_parser() if flat: return self._parser.get_flat_dict_with_attributes() else: return self._parser.to_dict() @classmethod def delete_by_uuid(cls, username, id_string, uuid, deleted_at=datetime.now()): try: instance = cls.objects.get( uuid=uuid, xform__id_string=id_string, xform__user__username=username ) except cls.DoesNotExist: return False else: xform_instances = settings.MONGO_DB.instances query = { "_uuid": uuid, "_userform_id": "%s_%s" % (username, id_string)} update_query = { "$set": { "_deleted_at": deleted_at.strftime('%Y-%m-%dT%H:%M:%S') } } xform_instances.update(query, update_query) instance.deleted_at = deleted_at super(Instance, instance).save() return True
class Instance(models.Model): # I should rename this model, maybe Survey xml = models.TextField() user = models.ForeignKey(User, related_name='surveys', null=True) #using instances instead of surveys breaks django xform = models.ForeignKey(XForm, null=True, related_name='surveys') start_time = models.DateTimeField(null=True) date = models.DateField(null=True) survey_type = models.ForeignKey(SurveyType) #shows when we first received this instance date_created = models.DateTimeField(auto_now_add=True) #this will end up representing "date last parsed" date_modified = models.DateTimeField(auto_now=True) # ODK keeps track of three statuses for an instance: # incomplete, submitted, complete # we will add a fourth status: submitted_via_web status = models.CharField(max_length=20, default=u'submitted_via_web') uuid = models.CharField(max_length=32, default=u'') class Meta: app_label = 'odk_logger' def _set_xform(self, doc): try: self.xform = XForm.objects.get(id_string=doc[XFORM_ID_STRING], user=self.user) except XForm.DoesNotExist: self.xform = None def get_root_node_name(self): self._set_parser() return self._parser.get_root_node_name() def get(self, abbreviated_xpath): self._set_parser() return self._parser.get(abbreviated_xpath) def _set_survey_type(self, doc): self.survey_type, created = \ SurveyType.objects.get_or_create(slug=self.get_root_node_name()) # todo: get rid of these fields def _set_start_time(self, doc): self.start_time = None def _set_date(self, doc): self.date = None def save(self, *args, **kwargs): doc = self.get_dict() self._set_xform(doc) if self.xform and not self.xform.downloadable: raise FormInactiveError() self._set_start_time(doc) self._set_date(doc) self._set_survey_type(doc) set_uuid(self) super(Instance, self).save(*args, **kwargs) def _set_parser(self): if not hasattr(self, "_parser"): self._parser = XFormInstanceParser(self.xml) def get_dict(self, force_new=False, flat=True): """Return a python object representation of this instance's XML.""" self._set_parser() if flat: return self._parser.get_flat_dict_with_attributes() else: return self._parser.to_dict()