def save(self): from corehq.apps.users.views.utils import log_commcare_user_locations_changes selected_users = set(self.cleaned_data['selected_ids']) previous_users = set([u['id'] for u in self.get_users_at_location()]) to_remove = previous_users - selected_users to_add = selected_users - previous_users users_to_be_updated = set.union(to_add, to_remove) # fetch before updates and fetch from Couch to avoid any ES lag targeted_users_old_locations = { user_doc['_id']: { 'location_id': user_doc['location_id'], 'assigned_location_ids': user_doc['assigned_location_ids'] } for user_doc in iter_docs(CommCareUser.get_db(), users_to_be_updated) } self.unassign_users(to_remove) self.assign_users(to_add) self.cache_users_at_location(selected_users) # re-fetch users to get fresh locations for updated_user_doc in iter_docs(CommCareUser.get_db(), users_to_be_updated): updated_user = CommCareUser.wrap_correctly(updated_user_doc) user_old_locations = targeted_users_old_locations[ updated_user.get_id] log_commcare_user_locations_changes( self.request, updated_user, old_location_id=user_old_locations['location_id'], old_assigned_location_ids=user_old_locations[ 'assigned_location_ids'])
def tearDownClass(cls): delete_domain_phone_numbers(TEST_DOMAIN) if cls.sms_backend_mapping.id is not None: cls.sms_backend_mapping.delete() if cls.sms_backend.id is not None: cls.sms_backend.delete() users = get_user_docs_by_username([ 'stella', 'bella', 'trella', 'msd_person', ]) if users: CommCareUser.bulk_delete([ CommCareUser.wrap_correctly(user) for user in users ]) for product in Product.by_domain(TEST_DOMAIN): product.delete() SQLProduct.objects.all().delete() ils_gateway_config = ILSGatewayConfig.for_domain(TEST_DOMAIN) if ils_gateway_config: ils_gateway_config.delete() DocDomainMapping.objects.all().delete() for site_code in [ 'loc1', 'loc2', 'dis1', 'reg1', 'moh1', ]: location = cls.get_location_by_site_code(site_code) if location: location.delete() SQLLocation.objects.all().delete() test_domain = Domain.get_by_name(TEST_DOMAIN, strict=True) if test_domain: test_domain.delete() super(ILSTestScript, cls).tearDownClass()