Skip to content

Commit

Permalink
Merge pull request #33890 from dimagi/sr/refusers
Browse files Browse the repository at this point in the history
Refactor user import, support user data in import and fix profile data bug
  • Loading branch information
sravfeyn committed Jan 24, 2024
2 parents 36cce77 + 12d4687 commit bbe7d35
Show file tree
Hide file tree
Showing 6 changed files with 924 additions and 697 deletions.
8 changes: 6 additions & 2 deletions corehq/apps/custom_data_fields/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,9 +132,13 @@ def get_validator(self):
"""
Returns a validator to be used in bulk import
"""
def validate_custom_fields(custom_fields):
def validate_custom_fields(custom_fields, profile=None):
errors = []
for field in self.get_fields():
# Fields set via profile can be skipped since they
# are valdiated when the profile is created/edited
skip_fields = profile.fields.keys() if profile else []
fields = [f for f in self.get_fields() if f.slug not in skip_fields]
for field in fields:
value = custom_fields.get(field.slug, None)
errors.append(field.validate_required(value))
errors.append(field.validate_choices(value))
Expand Down
38 changes: 17 additions & 21 deletions corehq/apps/user_importer/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,23 @@ def update_role(self, role_qualified_id):
if self.role_updated:
self.user.set_role(self.user_domain, role_qualified_id)

def update_user_data(self, data, uncategorized_data, profile_name, profiles_by_name):
from corehq.apps.users.user_data import UserDataError
user_data = self.user.get_user_data(self.user_domain)
old_profile_id = user_data.profile_id
if PROFILE_SLUG in data:
raise UserUploadError(_("You cannot set {} directly").format(PROFILE_SLUG))
if profile_name:
profile_id = profiles_by_name[profile_name].pk

try:
user_data.update(data, profile_id=profile_id if profile_name else ...)
user_data.update(uncategorized_data)
except UserDataError as e:
raise UserUploadError(str(e))
if user_data.profile_id and user_data.profile_id != old_profile_id:
self.logger.add_info(UserChangeMessage.profile_info(user_data.profile_id, profile_name))

def save_log(self):
# Tracking for role is done post save to have role setup correctly on save
if self.role_updated:
Expand All @@ -169,9 +186,6 @@ def _include_user_data_changes(self):


class CommCareUserImporter(BaseUserImporter):
def update_password(self, password):
self.user.set_password(password)
self.logger.add_change_message(UserChangeMessage.password_reset())

def update_phone_numbers(self, phone_numbers):
"""
Expand All @@ -191,24 +205,6 @@ def update_name(self, name):
self.user.set_full_name(str(name))
self.logger.add_changes({'first_name': self.user.first_name, 'last_name': self.user.last_name})

def update_user_data(self, data, uncategorized_data, profile_name, domain_info):
from corehq.apps.users.user_data import UserDataError
user_data = self.user.get_user_data(self.user_domain)
old_profile_id = user_data.profile_id
if PROFILE_SLUG in data:
raise UserUploadError(_("You cannot set {} directly").format(PROFILE_SLUG))
if profile_name:
profile_id = domain_info.profiles_by_name[profile_name].pk

try:
user_data.update(data, profile_id=profile_id if profile_name else ...)
user_data.update(uncategorized_data)
except UserDataError as e:
raise UserUploadError(str(e))

if user_data.profile_id and user_data.profile_id != old_profile_id:
self.logger.add_info(UserChangeMessage.profile_info(user_data.profile_id, profile_name))

def update_language(self, language):
self.user.language = language
self.logger.add_changes({'language': language})
Expand Down

0 comments on commit bbe7d35

Please sign in to comment.