-
Notifications
You must be signed in to change notification settings - Fork 88
/
Copy pathcreate_users.py
139 lines (115 loc) · 5.11 KB
/
create_users.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#!/usr/bin/env python3
import argparse
import os
import random
from datetime import datetime
import names
from dateutil.relativedelta import relativedelta
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "intranet.settings")
django.setup()
from intranet.apps.groups.models import Group # noqa: E402
from intranet.apps.users.models import User # noqa: E402
GRADES = ["freshman", "sophomore", "junior", "senior"]
def grade_to_year(year: str) -> str:
delta = 0
if year == "freshman":
delta = 3
if year == "sophomore":
delta = 2
if year == "junior":
delta = 1
if year == "senior":
delta = 0
# if it is from august -> december add 1
if datetime.now().month > 7:
delta += 1
return (datetime.now() + relativedelta(years=delta)).strftime("%Y")
def create_teachers(args: argparse.Namespace) -> None:
for first_name, last_name, username in args.names:
username = validate(username)
user = User.objects.get_or_create(first_name=first_name, last_name=last_name, username=username, user_type="teacher")[0]
if args.nowelcome:
user.first_login = django.utils.timezone.now()
user.seen_welcome = True
user.save()
if args.verbose:
print(f'Created teacher "{first_name} {last_name}" ({username})')
def create_students(args: argparse.Namespace) -> None:
for first_name, last_name, username in args.names:
username = validate(username)
user = User.objects.get_or_create(first_name=first_name, last_name=last_name, username=username)[0]
if not args.noyear:
user.graduation_year = username[:4]
if args.nowelcome:
user.first_login = django.utils.timezone.now()
user.seen_welcome = True
user.save()
if args.verbose:
print(f'Created student "{first_name} {last_name}" ({username})')
def create_admins(args: argparse.Namespace) -> None:
group = Group.objects.get_or_create(name="admin_all")[0]
for first_name, last_name, username in args.names:
username = validate(username)
user = User.objects.get_or_create(first_name=first_name, last_name=last_name, username=username)[0]
if not args.noyear:
user.graduation_year = username[:4]
if args.nowelcome:
user.first_login = django.utils.timezone.now()
user.seen_welcome = True
user.groups.add(group)
user.is_superuser = True
user.save()
if args.verbose:
print(f'Created admin "{first_name} {last_name}" ({username})')
def validate(username: str) -> str:
if User.objects.filter(username=username):
username += "1"
while User.objects.filter(username=username):
end = int(username[-1])
username = username[:-1] + str(end + 1)
return username
def generate_names(args: argparse.Namespace) -> "list[tuple[str]]":
for i, name in enumerate(args.names):
username = ""
if not args.noyear and args.type != "teacher":
username = grade_to_year(args.year if args.year else random.choice(GRADES))
if name:
if "_" in name:
first_name, last_name = name.split("_")
username += first_name[0].lower() + last_name[:7].lower()
else:
first_name = name
last_name = name
username += name
else:
first_name, last_name = names.get_full_name(gender=args.gender).split(" ")
username += first_name[0].lower() + last_name[:7].lower()
args.names[i] = (first_name, last_name, username)
return args.names
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument(
"-n", "--names", nargs="+", default=[], help="Provide in format first_last, or as a username, ignores count if supplied, separate with '_'"
)
parser.add_argument("-c", "--count", type=int, default=10, help="Number of users to make, defaults to 10")
parser.add_argument("-t", "--type", type=str, required=True, choices=["student", "teacher", "admin"], help="type of user to make")
parser.add_argument("-ny", "--noyear", action="store_true", help="does not prepend username with year, ignores year flag")
parser.add_argument("-nw", "--nowelcome", action="store_true", help="disables welcome message on first login to ion")
parser.add_argument(
"-y", "--year", type=str, required=False, choices=GRADES, help="Year of student, doesn't do anything for teachers, defaults to random"
)
parser.add_argument("-g", "--gender", type=str, required=False, choices=["male", "female"], help="Gender of user's name, defaults to either")
parser.add_argument("-v", "--verbose", action="store_true", help="Enables verbose output")
args = parser.parse_args()
if not args.names:
args.names = [None] * args.count
args.names = generate_names(args)
if args.type == "student":
create_students(args)
elif args.type == "teacher":
create_teachers(args)
elif args.type == "admin":
create_admins(args)
if __name__ == "__main__":
main()