Skip to content
Snippets Groups Projects
Commit 85428244 authored by robinwilliam.hundt's avatar robinwilliam.hundt
Browse files

Refactored GradyUserFactory to factories.py

parent 6d3a4202
No related branches found
No related tags found
1 merge request!16Backend tests
from rest_framework.test import APIClient, APITestCase
from util.factories import GradyUserFactory
class StudentPageTests(APITestCase):
@classmethod
def setUpTestData(cls):
cls.factory = GradyUserFactory()
cls.student = cls.factory.make_student(username='student01', matrikel_no='12345',
exam='Exam01')
cls.tutor = cls.factory.make_tutor(username='tutor01')
cls.reviewer = cls.factory.make_reviewer(username='reviewer01')
...@@ -2,7 +2,7 @@ from django.test import TestCase ...@@ -2,7 +2,7 @@ from django.test import TestCase
from core.models import (Feedback, Reviewer, Student, Submission, from core.models import (Feedback, Reviewer, Student, Submission,
SubmissionType, Tutor) SubmissionType, Tutor)
from util.importer import GradyUserFactory from util.factories import GradyUserFactory
class FeedbackTestCase(TestCase): class FeedbackTestCase(TestCase):
......
import configparser
import secrets
from core.models import UserAccount as User, Student, Tutor, Reviewer
from util.importer import PASSWORDS
class GradyUserFactory:
def __init__(self, password_generator_func=get_xkcd_password, *args, **kwargs):
self.password_generator_func = password_generator_func
@staticmethod
def _get_random_name(prefix='', suffix='', k=1):
return ''.join((prefix, get_xkcd_password(k), suffix))
def _make_base_user(self, username, groupname, store_pw=False, **kwargs):
""" This is a specific wrapper for the django update_or_create method of
objects.
* A new user is created and password and group are set accordingly
* If the user was there before password is NOT change but group is. A
user must only have one group.
Returns:
(User object, str): The user object that was added to the group and
the password of that user if it was created.
"""
username = username.strip()
user, created = User.objects.update_or_create(
username=username,
defaults=kwargs)
if created:
password = self.password_generator_func()
user.set_password(password)
user.save()
if created and store_pw:
store_password(username, groupname, password)
return user
def _get_user_model_for_group(self, groupname):
""" Returns the model class for a usergroup """
return {
STUDENTS: Student,
TUTORS: Tutor,
REVIEWERS: Reviewer,
}[groupname]
def _make_user_generic(self, username, groupname, **kwargs):
""" Provides a model with a associated user but without any defaults
"""
if not username:
username = self._get_random_name(prefix=groupname.lower() + '_')
model = self._get_user_model_for_group(groupname)
user = self._make_base_user(username, groupname, **kwargs)
generic_user, _ = model.objects.get_or_create(user=user)
return generic_user
def make_student(self, username=None, matrikel_no=None, exam=None, **kwargs):
""" Creates a student. Defaults can be passed via kwargs like in
relation managers objects.update method. """
user = self._make_user_generic(username, STUDENTS, **kwargs)
if matrikel_no:
user.objects.update(matrikel_no=matrikel_no)
if exam:
user.objects.update(exam=exam)
return user
def make_tutor(self, username=None, **kwargs):
""" Creates or updates a tutor if needed with defaults """
return self._make_user_generic(username, TUTORS, **kwargs)
def make_reviewer(self, username=None, **kwargs):
""" Creates or updates a reviewer if needed with defaults """
return self._make_user_generic(username, REVIEWERS, **kwargs)
STUDENTS = 'students'
TUTORS = 'tutors'
REVIEWERS = 'reviewers'
def get_xkcd_password(k=2):
with open('/usr/share/dict/words') as words:
choose_from = list({word.strip().lower()
for word in words if 5 < len(word) < 8})
return ''.join(secrets.choice(choose_from) for _ in range(k))
def store_password(username, groupname, password):
storage = configparser.ConfigParser()
storage.read(PASSWORDS)
if not groupname in storage:
storage[groupname] = {}
storage[groupname][username] = password
with open(PASSWORDS, 'w') as passwd_file:
storage.write(passwd_file)
import configparser
import csv import csv
import json import json
import os import os
import readline import readline
import secrets
from typing import Callable from typing import Callable
import util.convert import util.convert
import util.processing import util.processing
from core.models import (ExamType, Feedback, Student, Submission,
SubmissionType, Test)
from core.models import UserAccount as User from core.models import UserAccount as User
from core.models import (ExamType, Feedback, Reviewer, Student, Submission, from util.factories import GradyUserFactory, STUDENTS, TUTORS, REVIEWERS
SubmissionType, Test, Tutor)
from util.messages import info, warn from util.messages import info, warn
from util.processing import EmptyTest from util.processing import EmptyTest
STUDENTS = 'students'
TUTORS = 'tutors'
REVIEWERS = 'reviewers'
HISTFILE = '.importer_history' HISTFILE = '.importer_history'
RECORDS = '.importer' RECORDS = '.importer'
PASSWORDS = '.importer_passwords' PASSWORDS = '.importer_passwords'
...@@ -62,14 +57,6 @@ class chdir_context(object): ...@@ -62,14 +57,6 @@ class chdir_context(object):
os.chdir(self.old_dir) os.chdir(self.old_dir)
def get_xkcd_password(k=2):
with open('/usr/share/dict/words') as words:
choose_from = list({word.strip().lower()
for word in words if 5 < len(word) < 8})
return ''.join(secrets.choice(choose_from) for _ in range(k))
def i(prompt: str, default: str='', is_path: bool=False, is_file: bool=False): def i(prompt: str, default: str='', is_path: bool=False, is_file: bool=False):
if default is YES or default is NO: if default is YES or default is NO:
answer = valid[input(f'[Q] {prompt} ({default}): ').lower() or ('y' if YES == default else 'n')] answer = valid[input(f'[Q] {prompt} ({default}): ').lower() or ('y' if YES == default else 'n')]
...@@ -85,97 +72,9 @@ def i(prompt: str, default: str='', is_path: bool=False, is_file: bool=False): ...@@ -85,97 +72,9 @@ def i(prompt: str, default: str='', is_path: bool=False, is_file: bool=False):
return answer return answer
def store_password(username, groupname, password):
storage = configparser.ConfigParser()
storage.read(PASSWORDS)
if not groupname in storage:
storage[groupname] = {}
storage[groupname][username] = password
with open(PASSWORDS, 'w') as passwd_file:
storage.write(passwd_file)
class GradyUserFactory:
def __init__(self, password_generator_func=get_xkcd_password, *args, **kwargs):
self.password_generator_func = password_generator_func
@staticmethod
def _get_random_name(prefix='', suffix='', k=1):
return ''.join((prefix, get_xkcd_password(k), suffix))
def _make_base_user(self, username, groupname, store_pw=False, **kwargs):
""" This is a specific wrapper for the django update_or_create method of
objects.
* A new user is created and password and group are set accordingly
* If the user was there before password is NOT change but group is. A
user must only have one group.
Returns:
(User object, str): The user object that was added to the group and
the password of that user if it was created.
"""
username = username.strip()
user, created = User.objects.update_or_create(
username=username,
defaults=kwargs)
if created:
password = self.password_generator_func()
user.set_password(password)
user.save()
if created and store_pw:
store_password(username, groupname, password)
return user
def _get_user_model_for_group(self, groupname):
""" Returns the model class for a usergroup """
return {
STUDENTS: Student,
TUTORS: Tutor,
REVIEWERS: Reviewer,
}[groupname]
def _make_user_generic(self, username, groupname, **kwargs):
""" Provides a model with a associated user but without any defaults
"""
if not username:
username = self._get_random_name(prefix=groupname.lower() + '_')
model = self._get_user_model_for_group(groupname)
user = self._make_base_user(username, groupname, **kwargs)
generic_user, _ = model.objects.get_or_create(user=user)
return generic_user
def make_student(self, username=None, matrikel_no=None, exam=None, **kwargs):
""" Creates a student. Defaults can be passed via kwargs like in
relation managers objects.update method. """
user = self._make_user_generic(username, STUDENTS, **kwargs)
if matrikel_no:
user.objects.update(matrikel_no=matrikel_no)
if exam:
user.objects.update(exam=exam)
return user
def make_tutor(self, username=None, **kwargs):
""" Creates or updates a tutor if needed with defaults """
return self._make_user_generic(username, TUTORS, **kwargs)
def make_reviewer(self, username=None, **kwargs):
""" Creates or updates a reviewer if needed with defaults """
return self._make_user_generic(username, REVIEWERS, **kwargs)
# TODO more factories # TODO more factories
def add_user(username, group, **kwargs): def add_user(username, group, **kwargs):
user = GradyUserFactory()._make_base_user( user = GradyUserFactory()._make_base_user(
username, group, store_pw=True, **kwargs username, group, store_pw=True, **kwargs
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment