def _import_data_sender(self, form_model, organization, values): try: if organization.in_trial_mode: mobile_number = case_insensitive_lookup(values, "m") data_sender = DataSenderOnTrialAccount.objects.model( mobile_number=mobile_number, organization=organization) data_sender.save(force_insert=True) except IntegrityError: raise MultipleReportersForANumberException(mobile_number) if len(",".join(values["l"])) > 500: raise MangroveException( "Location Name cannot exceed 500 characters.") email = case_insensitive_lookup(values, "email") if email: if not email_re.match(email): raise InvalidEmailException(message="Invalid email address.") self._validate_duplicate_email_address(email) response = self.submit(form_model, values, []) else: response = self.submit(form_model, values, []) return response
def import_data_sender(self, form_model, organization, registered_emails, registered_phone_numbers, submission, values): phone_number = TelephoneNumber().clean( case_insensitive_lookup(values, MOBILE_NUMBER_FIELD_CODE)) if phone_number in registered_phone_numbers: raise DataObjectAlreadyExists(_("Data Sender"), _("Mobile Number"), phone_number) email = case_insensitive_lookup(values, "email") if email: if email in registered_emails: raise DataObjectAlreadyExists(_("User"), _("email address"), email) if not email_re.match(email): raise InvalidEmailException(message="Invalid email address.") response = self.submit(form_model, values, submission, []) user = User.objects.create_user(email, email, 'password') group = Group.objects.filter(name="Data Senders")[0] user.groups.add(group) user.first_name = case_insensitive_lookup(response.processed_data, NAME_FIELD_CODE) user.save() profile = NGOUserProfile(user=user, org_id=organization.org_id, title="Mr", reporter_id=case_insensitive_lookup( response.processed_data, SHORT_CODE)) profile.save() send_reset_password_email(user, ugettext_lazy("en")) else: response = self.submit(form_model, values, submission, []) return response
def _create_user(self, email, organization, response): user = User.objects.create_user(email, email, 'password') group = Group.objects.filter(name="Data Senders")[0] user.groups.add(group) user.first_name = case_insensitive_lookup(response.processed_data, NAME_FIELD_CODE) user.save() profile = NGOUserProfile(user=user, org_id=organization.org_id, title="Mr", reporter_id=case_insensitive_lookup(response.processed_data, SHORT_CODE)) profile.save() return user
def _import_submission(self, organization, values, form_model=None): self._append_country_for_location_field(form_model, values, organization) sid = transaction.savepoint() try: if filter(lambda x: len(x), values.values()).__len__() == 0: raise EmptyRowException() values = self._process(form_model, values) is_reporter = case_insensitive_lookup( values, ENTITY_TYPE_FIELD_CODE) == REPORTER if is_reporter: values[ 'is_data_sender'] = 'True' if self.is_datasender else 'False' response = self._import_data_sender(form_model, organization, values) else: SubjectTemplateValidator(form_model).validate(values) response = self.submit(form_model, values, [], self.is_update) if not response.success: response.errors = dict(error=response.errors, row=values) transaction.savepoint_commit(sid) return response except DataObjectAlreadyExists as e: transaction.savepoint_rollback(sid) if is_reporter: msg = _("%s with Unique ID Number = %s already exists.") % (e.data[2], e.data[1]) \ if e.data[0] == 'Unique ID Number' \ else _("%s with %s = %s already exists.") % (e.data[2], e.data[0], e.data[1]) else: msg = _("%s with ID Number '%s' already exists or has previously collected data.") % ( e.data[2], e.data[1]) \ if e.data[0] == 'Unique ID Number' \ else _("%s with %s = %s already exists.") % (e.data[2], e.data[0], e.data[1]) return self._appendFailedResponse(msg, values=values) except EmptyRowException as e: transaction.savepoint_rollback(sid) return self._appendFailedResponse(e.message) except (InvalidEmailException, MangroveException, NameNotFoundException, ValidationError) as e: transaction.savepoint_rollback(sid) return self._appendFailedResponse(e.message, values=values) except ImportValidationError as e: raise
def import_submission(self, form_code, organization, registered_emails, registered_phone_numbers, responses, values): transport_info = TransportInfo(transport=self.channel_name, source=self.channel_name, destination="") submission = self._create_submission(transport_info, form_code, copy(values)) try: form_model, values = self._process(form_code, values) log_entry = "message: " + str(values) + "|source: web|" if case_insensitive_lookup(values, ENTITY_TYPE_FIELD_CODE) == REPORTER: response = self.import_data_sender(form_model, organization, registered_emails, registered_phone_numbers, submission, values) else: response = self.submit(form_model, values, submission, []) if not response.success: response.errors = dict(error=response.errors, row=values) log_entry += "Status: False" else: log_entry += "Status: True" self.logger.info(log_entry) responses.append(response) except DataObjectAlreadyExists as e: if self.logger is not None: log_entry += "Status: False" self.logger.info(log_entry) self.appendFailedResponse(responses, "%s with %s = %s already exists." % (e.data[2], e.data[0], e.data[1]), values=values) except (InvalidEmailException, MangroveException) as e: self.appendFailedResponse(responses, e.message, values=values)