NDOJ/judge/tasks/import_users.py

98 lines
2.8 KiB
Python
Raw Normal View History

2021-07-28 22:58:42 +00:00
import csv
from tempfile import mktemp
from django.conf import settings
from django.contrib.auth.models import User
from judge.models import Profile, Language, Organization
fields = ['username', 'password', 'name', 'school', 'email', 'organizations']
descriptions = ['my_username(edit old one if exist)',
'123456 (must have)',
'Le Van A (can be empty)',
'Le Quy Don (can be empty)',
'email@email.com (can be empty)',
'org1&org2&org3&... (can be empty - org slug in URL)']
def csv_to_dict(csv_file):
rows = csv.reader(csv_file.read().decode().split('\n'))
header = next(rows)
header = [i.lower() for i in header]
if 'username' not in header:
return []
res = []
for row in rows:
if len(row) != len(header):
continue
cur_dict = {i: '' for i in fields}
for i in range(len(header)):
if header[i] not in fields:
continue
cur_dict[header[i]] = row[i]
if cur_dict['username']:
res.append(cur_dict)
return res
# return result log
def import_users(users):
log = ''
for i, row in enumerate(users):
cur_log = str(i + 1) + '. '
username = row['username']
cur_log += username + ': '
pwd = row['password']
user, created = User.objects.get_or_create(username=username, defaults={
'is_active': True,
})
profile, _ = Profile.objects.get_or_create(user=user, defaults={
'language': Language.get_python3(),
'timezone': settings.DEFAULT_USER_TIME_ZONE,
})
if created:
cur_log += 'Create new - '
else:
cur_log += 'Edit - '
if pwd:
user.set_password(pwd)
elif created:
user.set_password('lqdoj')
cur_log += 'Missing password, set password = lqdoj - '
if 'name' in row.keys() and row['name']:
user.first_name = row['name']
if 'school' in row.keys() and row['school']:
user.last_name = row['school']
if row['organizations']:
orgs = row['organizations'].split('&')
added_orgs = []
for o in orgs:
try:
org = Organization.objects.get(slug=o)
profile.organizations.add(org)
added_orgs.append(org.name)
except Organization.DoesNotExist:
continue
if added_orgs:
cur_log += 'Added to ' + ', '.join(added_orgs) + ' - '
user.email = row['email']
user.save()
profile.save()
cur_log += 'Saved\n'
log += cur_log
log += 'FINISH'
return log