Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
grady
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Jan Maximilian Michal
grady
Commits
ad48953f
Commit
ad48953f
authored
7 years ago
by
Jan Maximilian Michal
Browse files
Options
Downloads
Patches
Plain Diff
Minor refactor in the importer classes
parent
dc6a8324
No related branches found
Branches containing commit
No related tags found
Tags containing commit
1 merge request
!16
Backend tests
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
backend/delbert.py
+3
-2
3 additions, 2 deletions
backend/delbert.py
backend/util/factories.py
+34
-31
34 additions, 31 deletions
backend/util/factories.py
backend/util/importer.py
+105
-4
105 additions, 4 deletions
backend/util/importer.py
with
142 additions
and
37 deletions
backend/delbert.py
+
3
−
2
View file @
ad48953f
...
@@ -2,18 +2,19 @@ import argparse
...
@@ -2,18 +2,19 @@ import argparse
import
csv
import
csv
import
json
import
json
import
os
import
os
os
.
environ
.
setdefault
(
'
DJANGO_SETTINGS_MODULE
'
,
'
grady.settings
'
)
import
secrets
import
secrets
import
sys
import
sys
import
django
import
django
django
.
setup
()
from
django.contrib.auth.models
import
User
from
django.contrib.auth.models
import
User
import
util.importer
import
util.importer
from
core.models
import
Student
,
Submission
from
core.models
import
Student
,
Submission
os
.
environ
.
setdefault
(
'
DJANGO_SETTINGS_MODULE
'
,
'
grady.settings
'
)
django
.
setup
()
def
parseme
():
def
parseme
():
...
...
This diff is collapsed.
Click to expand it.
backend/util/factories.py
+
34
−
31
View file @
ad48953f
...
@@ -2,13 +2,44 @@ import configparser
...
@@ -2,13 +2,44 @@ import configparser
import
secrets
import
secrets
from
core.models
import
UserAccount
as
User
,
Student
,
Tutor
,
Reviewer
from
core.models
import
UserAccount
as
User
,
Student
,
Tutor
,
Reviewer
from
util.importer
import
PASSWORDS
STUDENTS
=
'
students
'
TUTORS
=
'
tutors
'
REVIEWERS
=
'
reviewers
'
PASSWORDS
=
'
.importer_passwords
'
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
)
class
GradyUserFactory
:
class
GradyUserFactory
:
def
__init__
(
self
,
password_generator_func
=
get_xkcd_password
,
*
args
,
**
kwargs
):
def
__init__
(
self
,
password_generator_func
=
get_xkcd_password
,
password_storge
=
store_password
*
args
,
**
kwargs
):
self
.
password_generator_func
=
password_generator_func
self
.
password_generator_func
=
password_generator_func
self
.
password_storge
=
password_storge
@staticmethod
@staticmethod
def
_get_random_name
(
prefix
=
''
,
suffix
=
''
,
k
=
1
):
def
_get_random_name
(
prefix
=
''
,
suffix
=
''
,
k
=
1
):
...
@@ -37,7 +68,7 @@ class GradyUserFactory:
...
@@ -37,7 +68,7 @@ class GradyUserFactory:
user
.
save
()
user
.
save
()
if
created
and
store_pw
:
if
created
and
store_pw
:
s
tore_
password
(
username
,
groupname
,
password
)
s
elf
.
password
_storge
(
username
,
groupname
,
password
)
return
user
return
user
...
@@ -80,31 +111,3 @@ class GradyUserFactory:
...
@@ -80,31 +111,3 @@ class GradyUserFactory:
def
make_reviewer
(
self
,
username
=
None
,
**
kwargs
):
def
make_reviewer
(
self
,
username
=
None
,
**
kwargs
):
"""
Creates or updates a reviewer if needed with defaults
"""
"""
Creates or updates a reviewer if needed with defaults
"""
return
self
.
_make_user_generic
(
username
,
REVIEWERS
,
**
kwargs
)
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
)
This diff is collapsed.
Click to expand it.
backend/util/importer.py
+
105
−
4
View file @
ad48953f
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
util.factories
import
GradyUserFactory
,
STUDENTS
,
TUTORS
,
REVIEWERS
from
core.models
import
(
ExamType
,
Feedback
,
Reviewer
,
Student
,
Submission
,
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
'
...
@@ -57,6 +62,14 @@ class chdir_context(object):
...
@@ -57,6 +62,14 @@ 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
'
)]
...
@@ -72,8 +85,96 @@ def i(prompt: str, default: str='', is_path: bool=False, is_file: bool=False):
...
@@ -72,8 +85,96 @@ def i(prompt: str, default: str='', is_path: bool=False, is_file: bool=False):
return
answer
return
answer
# TODO more factories
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
def
add_user
(
username
,
group
,
**
kwargs
):
def
add_user
(
username
,
group
,
**
kwargs
):
user
=
GradyUserFactory
().
_make_base_user
(
user
=
GradyUserFactory
().
_make_base_user
(
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment