Ejemplo n.º 1
0
 def __init__(self, first_name, last_name, title, email, is_responsible):
     self.first_name = first_name.strip()
     self.last_name = last_name.strip()
     self.title = title.strip()
     self.email = clean_email(email)
     self.username = self.email
     self.is_responsible = is_responsible
Ejemplo n.º 2
0
    def filter_users_by_claims(self, claims):
        email = claims.get('email')
        if not email:
            return []

        try:
            return [self.UserModel.objects.get(email=clean_email(email))]
        except UserProfile.DoesNotExist:
            return []
Ejemplo n.º 3
0
def bulk_update_users(request, user_file_content, test_run):
    # pylint: disable=too-many-branches,too-many-locals
    # user_file must have one user per line in the format "{username},{email}"
    imported_emails = {
        clean_email(line.decode().split(',')[1])
        for line in user_file_content.splitlines()
    }

    emails_of_users_to_be_created = []
    users_to_be_updated = []
    skipped_external_emails_counter = 0

    for imported_email in imported_emails:
        if is_external_email(imported_email):
            skipped_external_emails_counter += 1
            continue
        try:
            matching_user = find_matching_internal_user_for_email(
                request, imported_email)
        except UserProfile.MultipleObjectsReturned as e:
            messages.error(
                request,
                format_html(
                    _('Multiple users match the email {}:{}'), imported_email,
                    create_user_list_html_string_for_message(e.args[0])))
            return False

        if not matching_user:
            emails_of_users_to_be_created.append(imported_email)
        elif matching_user.email != imported_email:
            users_to_be_updated.append((matching_user, imported_email))

    emails_of_non_obsolete_users = set(imported_emails) | {
        user.email
        for user, _ in users_to_be_updated
    }
    deletable_users, users_to_mark_inactive = [], []
    for user in UserProfile.objects.exclude(
            email__in=emails_of_non_obsolete_users):
        if user.can_be_deleted_by_manager:
            deletable_users.append(user)
        elif user.is_active and user.can_be_marked_inactive_by_manager:
            users_to_mark_inactive.append(user)

    messages.info(
        request,
        _('The uploaded text file contains {} internal and {} external users. The external users will be ignored. '
          '{} users are currently in the database. Of those, {} will be updated, {} will be deleted and {} will be '
          'marked inactive. {} new users will be created.').format(
              len(imported_emails) - skipped_external_emails_counter,
              skipped_external_emails_counter, UserProfile.objects.count(),
              len(users_to_be_updated), len(deletable_users),
              len(users_to_mark_inactive), len(emails_of_users_to_be_created)))
    if users_to_be_updated:
        messages.info(
            request,
            format_html(
                _('Users to be updated are:{}'),
                format_html_join(
                    '', '<br />{} {} ({} > {})',
                    ((user.first_name, user.last_name, user.email, email)
                     for user, email in users_to_be_updated))))
    if deletable_users:
        messages.info(
            request,
            format_html(
                _('Users to be deleted are:{}'),
                create_user_list_html_string_for_message(deletable_users)))
    if users_to_mark_inactive:
        messages.info(
            request,
            format_html(
                _('Users to be marked inactive are:{}'),
                create_user_list_html_string_for_message(
                    users_to_mark_inactive)))
    if emails_of_users_to_be_created:
        messages.info(
            request,
            format_html(
                _('Users to be created are:{}'),
                format_html_join(
                    '', '<br />{}',
                    ((email, ) for email in emails_of_users_to_be_created))))

    with transaction.atomic():
        for user in deletable_users + users_to_mark_inactive:
            for message in remove_user_from_represented_and_ccing_users(
                    user, deletable_users + users_to_mark_inactive, test_run):
                messages.warning(request, message)
        if test_run:
            messages.info(request, _('No data was changed in this test run.'))
        else:
            for user in deletable_users:
                user.delete()
            for user in users_to_mark_inactive:
                user.is_active = False
                user.save()
            for user, email in users_to_be_updated:
                user.email = email
                user.save()
            userprofiles_to_create = []
            for email in emails_of_users_to_be_created:
                userprofiles_to_create.append(UserProfile(email=email))
            UserProfile.objects.bulk_create(userprofiles_to_create)
            messages.success(request,
                             _('Users have been successfully updated.'))

    return True