Skip to content

Commit 55a7715

Browse files
committed
Factor out user creation from the import-users script so that
self-registration can also create a user. - Legacy-Id: 926
1 parent b6301e4 commit 55a7715

2 files changed

Lines changed: 75 additions & 47 deletions

File tree

ietf/bin/import-users

Lines changed: 8 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
#
2222
#
2323
from ietf.idtracker.models import PersonOrOrgInfo, IESGLogin, EmailAddress
24-
from ietf.ietfauth.models import UserMap, WgPassword, LiaisonUser
24+
from ietf.ietfauth.models import WgPassword, LiaisonUser
25+
from ietf.utils import users
2526
from django.core.validators import email_re
26-
from django.contrib.auth.models import User, Group
27-
from django.template import defaultfilters
27+
from django.contrib.auth.models import Group
2828
import sys
2929

3030
# Group mappings for IESGLogin entries
@@ -54,7 +54,7 @@ while line != '':
5454
except PersonOrOrgInfo.DoesNotExist:
5555
iesg = None
5656
except IESGLogin.DoesNotExist:
57-
pass
57+
iesg = None
5858
if person is None:
5959
try:
6060
wg = WgPassword.objects.get(login_name=user)
@@ -77,56 +77,17 @@ while line != '':
7777
except AssertionError:
7878
print "%s has multiple PersonOrOrgInfo entries, so couldn't pick" % email
7979
if person is not None:
80-
if '@' in user:
81-
# slugify to remove non-ASCII; slugify uses hyphens but
82-
# user schema says underscore.
83-
user = defaultfilters.slugify(str(person)).replace("-", "_")
84-
if email is None:
85-
email = person.email()[1]
86-
# Make sure the username is unique.
87-
# If it already exists,
88-
# 1. if the email is the same then skip, it's the same person
89-
# 2. otherwise, add a number to the end of the username
90-
# and loop.
91-
add = ''
92-
while True:
93-
try:
94-
t = user
95-
if add:
96-
t += "%d" % ( add )
97-
u = User.objects.get(username__iexact = t)
98-
except User.DoesNotExist:
99-
u = None
100-
user = t
101-
break
102-
if u.email == email:
103-
break
104-
else:
105-
if add == '':
106-
add = 2
107-
else:
108-
add = add + 1
109-
if not u:
110-
try:
111-
map = UserMap.objects.get(person = person)
112-
u = map.user
113-
except UserMap.DoesNotExist:
114-
pass
115-
if u:
80+
try:
81+
u = users.create_user(user, email, person, cryptpw=pw)
82+
except users.UserAlreadyExists, (msg, u):
11683
print "Already in system as %s when adding %s (%s)" % ( u.username, user, email )
117-
pass
118-
else:
119-
u = User(username = user, email = email, password = 'crypt$%s$%s' % ( pw[:2], pw[2:] ), first_name = person.first_name, last_name = person.last_name )
120-
#print "Saving user: username='%s', email='%s'" % ( u.username, u.email )
121-
u.save()
122-
umap, created = UserMap.objects.get_or_create(user = u, person = person)
123-
# get_or_create saves umap for us.
12484
if iesg:
12585
try:
12686
group, created = Group.objects.get_or_create(name = level2group[iesg.user_level])
12787
except KeyError:
12888
group = None
12989
if group:
90+
print "Adding %s to %s (user_level %d)" % (u.username, group.name, iesg.user_level)
13091
u.groups.add(group)
13192
else:
13293
print "Could not map %s to person" % ( user )

ietf/utils/users.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
2+
from ietf.ietfauth.models import UserMap
3+
from django.contrib.auth.models import User
4+
from django.template import defaultfilters
5+
6+
class UserAlreadyExists(Exception):
7+
pass
8+
9+
def create_user(user, email, person, pw=None, cryptpw=None):
10+
if user is None or '@' in user:
11+
# slugify to remove non-ASCII; slugify uses hyphens but
12+
# user schema says underscore.
13+
user = defaultfilters.slugify(str(person)).replace("-", "_")
14+
if email is None:
15+
email = person.email()[1]
16+
# Make sure the username is unique.
17+
# If it already exists,
18+
# 1. if the email is the same then skip, it's the same person
19+
# 2. otherwise, add a number to the end of the username
20+
# and loop.
21+
add = ''
22+
while True:
23+
try:
24+
t = user
25+
if add:
26+
t += "%d" % ( add )
27+
u = User.objects.get(username__iexact = t)
28+
except User.DoesNotExist:
29+
u = None
30+
user = t
31+
break
32+
if u.email == email:
33+
break
34+
else:
35+
if add == '':
36+
add = 2
37+
else:
38+
add = add + 1
39+
if not u:
40+
try:
41+
map = UserMap.objects.get(person = person)
42+
u = map.user
43+
except UserMap.DoesNotExist:
44+
pass
45+
if u:
46+
# Fill in the user's name from the IETF data
47+
if u.first_name != person.first_name or u.last_name != person.last_name:
48+
u.first_name = person.first_name
49+
u.last_name = person.last_name
50+
u.save()
51+
# make sure that the UserMap gets created
52+
umap, created = UserMap.objects.get_or_create(user = u, person = person)
53+
raise UserAlreadyExists("Already in system as %s when adding %s (%s)" % ( u.username, user, email ), u)
54+
else:
55+
if cryptpw:
56+
password = 'crypt$%s$%s' % ( cryptpw[:2], cryptpw[2:] )
57+
else:
58+
password = '!' # no hash
59+
u = User(username = user, email = email, password = password, first_name = person.first_name, last_name = person.last_name )
60+
if pw:
61+
u.set_password(pw)
62+
#print "Saving user: username='%s', email='%s'" % ( u.username, u.email )
63+
u.save()
64+
umap, created = UserMap.objects.get_or_create(user = u, person = person)
65+
# get_or_create saves umap for us.
66+
67+
return u

0 commit comments

Comments
 (0)