예제 #1
0
def bulk_add(request):
    if request.method == 'GET':
        form = UserBulkAddForm()
        return render(request, 'accounts/bulk_add_form.html', {'form': form})
    else:  # bulk adding time
        form = UserBulkAddForm(request.POST)
        if not form.is_valid():
            return render(request, 'accounts/bulk_add_form.html', {
                'form': form,
                'message': 'Invalid form. Are you missing a field?'
            })

        # todo(mglidden): use a regex instead of three replace statements
        users = form.cleaned_data['users'].replace(' ', ',').replace(
            '\t', ',').replace('\r\n',
                               ',').replace('\n', ',').replace(', ',
                                                               ',').split(',')

        semester = form.cleaned_data['semester']

        existing_users = 0
        created_users = 0
        existing_memberships = 0
        created_memberships = 0

        for user_str in users:
            if '@' in user_str:
                user_email = user_str
                user_str = user_email[:user_email.index('@')]
            else:
                user_email = user_str + '@mit.edu'

            # In production, we should never have more than one user for a given email. The dev DB has some bad data, so we're using filter instead of get.
            # We filter by username since that's the unique key.
            users = User.objects.filter(username=user_str)
            if users:
                user = users[0]
                existing_users += 1
            else:
                user = User(username=user_str, email=user_email)
                user.save()
                user.profile.role = 'S'
                user.profile.save()
                created_users += 1

            if not user.membership.filter(semester=semester):
                membership = Member(role=Member.STUDENT,
                                    user=user,
                                    semester=semester)
                membership.save()
                created_memberships += 1
            else:
                existing_memberships += 1

        return render(
            request, 'accounts/bulk_add_form.html', {
                'form':
                form,
                'message':
                'Created %s users, %s already existed. Added %s users to %s, %s were already members.'
                % (created_users, existing_users, created_memberships,
                   semester, existing_memberships),
            })