Beispiel #1
0
    def validate_sms_users(self):
        for sms_user in iterate_over_api_objects(self.endpoint.get_smsusers):
            description = ""
            user = CommCareUser.get_by_username(self.get_username(sms_user)[0])
            if not user:
                description = "Not exists"
                EWSMigrationProblem.objects.create(
                    domain=self.domain,
                    external_id=sms_user.id,
                    object_type='smsuser',
                    description=description
                )
                continue

            phone_numbers = {
                apply_leniency(connection.phone_number) for connection in sms_user.phone_numbers
            }

            if phone_numbers - set(user.phone_numbers):
                description += "Invalid phone numbers, "

            phone_to_backend = {
                connection.phone_number: connection.backend
                for connection in sms_user.phone_numbers
            }

            default_phone_number = [
                connection.phone_number for connection in sms_user.phone_numbers if connection.default
            ]

            default_phone_number = default_phone_number[0] if default_phone_number else None

            if default_phone_number and (apply_leniency(default_phone_number) != user.default_phone_number):
                description += "Invalid default phone number, "

            for phone_number in user.phone_numbers:
                vn = VerifiedNumber.by_phone(phone_number)
                if not vn or vn.owner_id != user.get_id:
                    description += "Phone number not verified, "
                else:
                    backend = phone_to_backend.get(phone_number)
                    if backend == 'message_tester' and vn.backend_id != 'MOBILE_BACKEND_TEST' \
                            or (backend != 'message_tester' and vn.backend_id):
                        description += "Invalid backend, "

            if description:
                migration_problem, _ = EWSMigrationProblem.objects.get_or_create(
                    domain=self.domain,
                    object_id=user.get_id,
                    object_type='smsuser'
                )
                migration_problem.external_id = sms_user.id
                migration_problem.description = description.rstrip(' ,')
                migration_problem.save()
            else:
                EWSMigrationProblem.objects.filter(
                    domain=self.domain,
                    external_id=sms_user.id,
                    object_type='smsuser'
                ).delete()
Beispiel #2
0
 def validate_supply_points(self, date):
     for location in iterate_over_api_objects(
             self.endpoint.get_locations, filters={'is_active': True, 'date_updated__gte': date}
     ):
         for supply_point in location.supply_points:
             sp = get_supply_point_case_by_domain_external_id(self.domain, supply_point.id)
             if sp:
                 EWSMigrationProblem.objects.filter(
                     domain=self.domain, external_id=supply_point.id, object_type='supply_point'
                 ).delete()
                 sql_location = sp.sql_location
                 ids = sql_location.facilityincharge_set.all().values_list('user_id', flat=True)
                 usernames = [user['username'].split('@')[0] for user in iter_docs(CouchUser.get_db(), ids)]
                 if not all([self._check_username(usernames, incharge) for incharge in supply_point.incharges]):
                     migration_problem, _ = EWSMigrationProblem.objects.get_or_create(
                         domain=self.domain,
                         object_id=sql_location.location_id,
                         object_type='location'
                     )
                     migration_problem.object_type = 'location'
                     migration_problem.external_id = sql_location.external_id
                     migration_problem.description = 'Invalid in charges'
                     migration_problem.save()
                 else:
                     EWSMigrationProblem.objects.filter(
                         domain=self.domain,
                         external_id=sql_location.external_id,
                         object_type='location'
                     ).delete()
             elif supply_point.active and supply_point.last_reported:
                 migration_problem, _ = EWSMigrationProblem.objects.get_or_create(
                     domain=self.domain,
                     external_id=supply_point.id,
                 )
                 migration_problem.object_type = 'supply_point'
                 migration_problem.external_id = supply_point.id
                 migration_problem.description = 'Not exists'
                 migration_problem.save()
Beispiel #3
0
    def validate_web_users(self, date=None):
        unique_usernames = set()
        for web_user in iterate_over_api_objects(
            self.endpoint.get_webusers, filters=dict(date_joined__gte=date)
        ):
            description = ""

            if web_user.email:
                username = web_user.email.lower()
            else:
                username = web_user.username.lower()
                try:
                    validate_email(username)
                except ValidationError:
                    # We are not migrating users without valid email in v1
                    continue

            unique_usernames.add(username)
            couch_web_user = WebUser.get_by_username(username)
            if not couch_web_user or self.domain not in couch_web_user.get_domains():
                description = "Not exists"
                EWSMigrationProblem.objects.create(
                    domain=self.domain,
                    object_type='webuser',
                    description=description,
                    external_id=web_user.email or web_user.username
                )
                continue

            user_contact = web_user.contact
            if not user_contact:
                continue

            phone_numbers = {
                apply_leniency(connection.phone_number)
                for connection in user_contact.phone_numbers
            }

            if set(phone_numbers) - set(couch_web_user.phone_numbers):
                description = "Invalid phone numbers, "

            default_phone_number = [
                connection.phone_number for connection in user_contact.phone_numbers if connection.default
            ]

            default_phone_number = default_phone_number[0] if default_phone_number else None

            if default_phone_number and \
                    (apply_leniency(default_phone_number) != couch_web_user.default_phone_number):
                description += "Invalid default phone number, "

            try:
                extension = EWSExtension.objects.get(user_id=couch_web_user.get_id, domain=self.domain)
                supply_point = extension.supply_point.external_id if extension.supply_point else None
                sms_notifications = extension.sms_notifications
            except EWSExtension.DoesNotExist:
                supply_point = None
                sms_notifications = False

            if str(supply_point) != str(web_user.supply_point):
                active = True
                if not supply_point and web_user.supply_point:
                    active = self.endpoint.get_supply_point(web_user.supply_point).active

                if active:
                    description += 'Invalid supply point, '

            if sms_notifications != web_user.sms_notifications:
                description += 'Invalid value of sms_notifications field'

            if description:
                migration_problem, _ = EWSMigrationProblem.objects.get_or_create(
                    domain=self.domain,
                    object_id=couch_web_user.get_id,
                    object_type='webuser'
                )
                migration_problem.external_id = web_user.email or web_user.username
                migration_problem.description = description.rstrip(' ,')
                migration_problem.save()
            else:
                EWSMigrationProblem.objects.filter(
                    domain=self.domain,
                    external_id=web_user.email or web_user.username,
                    object_type='webuser'
                ).delete()

        migration_stats = EWSMigrationStats.objects.get(domain=self.domain)
        migration_stats.web_users_count = len(unique_usernames)
        migration_stats.save()
Beispiel #4
0
    def validate_web_users(self):
        unique_usernames = set()
        read_only_role_id = UserRole.get_read_only_role_by_domain(self.domain).get_id
        for web_user in iterate_over_api_objects(self.endpoint.get_webusers):
            if not web_user.is_active:
                continue
            description = ''
            if web_user.email:
                username = web_user.email.lower()
            else:
                username = web_user.username.lower()
                try:
                    validate_email(username)
                except ValidationError:
                    # We are not migrating users without valid email in v1
                    continue

            unique_usernames.add(username)
            couch_web_user = WebUser.get_by_username(username)
            if not couch_web_user or self.domain not in couch_web_user.get_domains():
                description = "Not exists"
                ILSMigrationProblem.objects.get_or_create(
                    domain=self.domain,
                    object_type='webuser',
                    description=description,
                    external_id=web_user.email or web_user.username
                )
                continue

            if not couch_web_user.is_active:
                description += "user is migrated but not active in HQ, "

            dm = couch_web_user.get_domain_membership(self.domain)
            if web_user.location:
                try:
                    sql_location = SQLLocation.objects.get(external_id=web_user.location, domain=self.domain)
                    if dm.location_id != sql_location.location_id:
                        description += 'location not assigned, '
                except SQLLocation.DoesNotExist:
                    # Location is inactive in v1 or it's an error in location migration
                    if dm.location_id:
                        description += "location is assigned but shouldn't be "

            if dm.role_id != read_only_role_id:
                description += 'invalid role, '
            if not description:
                ILSMigrationProblem.objects.filter(
                    domain=self.domain,
                    external_id=web_user.email or web_user.username
                ).delete()
            else:
                ils_migration_problem = ILSMigrationProblem.objects.get_or_create(
                    domain=self.domain,
                    object_type='webuser',
                    external_id=web_user.email or web_user.username
                )[0]
                ils_migration_problem.description = description
                ils_migration_problem.object_id = couch_web_user.get_id
                ils_migration_problem.save()

        migration_stats = ILSMigrationStats.objects.get(domain=self.domain)
        migration_stats.web_users_count = len(unique_usernames)
        migration_stats.save()
Beispiel #5
0
    def validate_sms_users(self):
        for sms_user in iterate_over_api_objects(self.endpoint.get_smsusers, {'is_active': True}):
            description = ""
            user = CommCareUser.get_by_username(self.get_username(sms_user)[0])
            if not user:
                description = "Not exists"
                ILSMigrationProblem.objects.create(
                    domain=self.domain,
                    external_id=sms_user.id,
                    object_type='smsuser',
                    description=description
                )
                continue

            if user.domain != self.domain:
                description += "domain isn't correct"

            phone_numbers = {
                apply_leniency(connection.phone_number) for connection in sms_user.phone_numbers
            }

            if phone_numbers - set(user.phone_numbers):
                description += "Invalid phone numbers, "

            phone_to_backend = {
                apply_leniency(connection.phone_number): connection.backend
                for connection in sms_user.phone_numbers
            }

            default_phone_number = [
                connection.phone_number for connection in sms_user.phone_numbers if connection.default
            ]

            default_phone_number = default_phone_number[0] if default_phone_number else None

            if default_phone_number and (apply_leniency(default_phone_number) != user.default_phone_number):
                description += "Invalid default phone number, "

            for phone_number in user.phone_numbers:
                vn = VerifiedNumber.by_phone(phone_number)
                if vn and vn.owner_id != user.get_id and vn.domain == self.domain:
                    description += "Phone number already assigned to user({}) from this domain, "\
                        .format(vn.owner_id)
                elif vn and vn.domain != self.domain:
                    description += "Phone number already assigned on domain {}, ".format(vn.domain)
                elif not vn or not vn.verified:
                    description += "Phone number not verified, "
                else:
                    backend = phone_to_backend.get(phone_number)
                    if backend != 'push_backend' and vn.backend_id != 'MOBILE_BACKEND_TEST' \
                            or (backend == 'push_backend' and vn.backend_id):
                        description += "Invalid backend, "

            if description:
                migration_problem, _ = ILSMigrationProblem.objects.get_or_create(
                    domain=self.domain,
                    object_id=user.get_id,
                    object_type='smsuser'
                )
                migration_problem.external_id = sms_user.id
                migration_problem.description = description.rstrip(' ,')
                migration_problem.save()
            else:
                ILSMigrationProblem.objects.filter(
                    domain=self.domain,
                    external_id=sms_user.id,
                    object_type='smsuser'
                ).delete()