Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Kontr 2.0
Portal API Backend
Commits
9035e55e
Commit
9035e55e
authored
Sep 23, 2018
by
Barbora Kompisova
Browse files
get submission list proper params
parent
2fb85ba7
Pipeline
#13285
passed with stage
in 13 minutes and 4 seconds
Changes
4
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
portal/database/models.py
View file @
9035e55e
...
@@ -528,6 +528,9 @@ class Project(db.Model, EntityBase, NamedMixin):
...
@@ -528,6 +528,9 @@ class Project(db.Model, EntityBase, NamedMixin):
def
__eq__
(
self
,
other
):
def
__eq__
(
self
,
other
):
return
self
.
id
==
other
.
id
return
self
.
id
==
other
.
id
def
__hash__
(
self
):
return
hash
(
self
.
id
)
class
ProjectConfig
(
db
.
Model
,
EntityBase
):
class
ProjectConfig
(
db
.
Model
,
EntityBase
):
"""Project's configuration
"""Project's configuration
...
@@ -724,6 +727,9 @@ class Role(db.Model, EntityBase, NamedMixin):
...
@@ -724,6 +727,9 @@ class Role(db.Model, EntityBase, NamedMixin):
def
__eq__
(
self
,
other
):
def
__eq__
(
self
,
other
):
return
self
.
id
==
other
.
id
return
self
.
id
==
other
.
id
def
__hash__
(
self
):
return
hash
(
self
.
id
)
class
RolePermissions
(
db
.
Model
,
EntityBase
):
class
RolePermissions
(
db
.
Model
,
EntityBase
):
"""Role Permissions model
"""Role Permissions model
...
@@ -839,6 +845,9 @@ class Group(db.Model, EntityBase, NamedMixin):
...
@@ -839,6 +845,9 @@ class Group(db.Model, EntityBase, NamedMixin):
def
__eq__
(
self
,
other
):
def
__eq__
(
self
,
other
):
return
self
.
id
==
other
.
id
return
self
.
id
==
other
.
id
def
__hash__
(
self
):
return
hash
(
self
.
id
)
def
get_users_based_on_role
(
self
,
role
:
'Role'
=
None
):
def
get_users_based_on_role
(
self
,
role
:
'Role'
=
None
):
if
not
role
:
if
not
role
:
return
self
.
users
return
self
.
users
...
...
portal/rest/rest_helpers.py
View file @
9035e55e
"""
"""
Helpers to work and process the rest requests and responses
Helpers to work and process the rest requests and responses
"""
"""
from
typing
import
Optional
from
typing
import
Optional
,
List
import
flask
import
flask
from
werkzeug.datastructures
import
ImmutableMultiDict
from
werkzeug.datastructures
import
ImmutableMultiDict
from
portal.database
import
Course
,
Project
,
User
from
portal.database
import
Course
,
Project
,
User
,
Group
,
Role
from
portal.rest.schemas
import
SCHEMAS
from
portal.rest.schemas
import
SCHEMAS
from
portal.service.errors
import
DataMissingError
from
portal.service.errors
import
DataMissingError
...
@@ -77,6 +77,27 @@ class FlaskRequestArgsHelper:
...
@@ -77,6 +77,27 @@ class FlaskRequestArgsHelper:
return
None
return
None
return
self
.
_rest
.
find
.
project
(
course
,
project
)
return
self
.
_rest
.
find
.
project
(
course
,
project
)
def
projects
(
self
)
->
List
[
str
]:
projects
=
self
.
_args
.
getlist
(
'project'
)
course
=
self
.
course
()
if
course
is
None
:
return
[]
return
[
self
.
_rest
.
find
.
project
(
course
,
projectId
).
id
for
projectId
in
projects
]
def
groups
(
self
)
->
List
[
Group
]:
groups
=
self
.
_args
.
getlist
(
'group'
)
course
=
self
.
course
()
if
course
is
None
:
return
[]
return
[
self
.
_rest
.
find
.
group
(
course
,
groupId
)
for
groupId
in
groups
]
def
roles
(
self
)
->
List
[
Role
]:
roles
=
self
.
_args
.
getlist
(
'role'
)
course
=
self
.
course
()
if
course
is
None
:
return
[]
return
[
self
.
_rest
.
find
.
role
(
course
,
roleId
)
for
roleId
in
roles
]
class
FlaskRequestHelper
:
class
FlaskRequestHelper
:
@
property
@
property
...
...
portal/service/submissions.py
View file @
9035e55e
...
@@ -5,7 +5,7 @@ Submissions service
...
@@ -5,7 +5,7 @@ Submissions service
import
logging
import
logging
import
time
import
time
from
pathlib
import
Path
from
pathlib
import
Path
from
typing
import
Union
from
typing
import
Union
,
List
import
flask
import
flask
from
celery.result
import
AsyncResult
from
celery.result
import
AsyncResult
...
@@ -14,7 +14,7 @@ from werkzeug.utils import secure_filename
...
@@ -14,7 +14,7 @@ from werkzeug.utils import secure_filename
from
portal
import
storage
from
portal
import
storage
from
portal.async_celery
import
submission_processor
,
tasks
from
portal.async_celery
import
submission_processor
,
tasks
from
portal.database.models
import
Project
,
Submission
,
SubmissionState
,
User
,
Worker
from
portal.database.models
import
Project
,
Submission
,
SubmissionState
,
User
,
Worker
,
Role
,
Group
from
portal.rest.rest_helpers
import
FlaskRequestHelper
from
portal.rest.rest_helpers
import
FlaskRequestHelper
from
portal.service
import
errors
from
portal.service
import
errors
from
portal.service.general
import
GeneralService
from
portal.service.general
import
GeneralService
...
@@ -223,26 +223,38 @@ class SubmissionsService(GeneralService):
...
@@ -223,26 +223,38 @@ class SubmissionsService(GeneralService):
break
break
time
.
sleep
(
1
)
time
.
sleep
(
1
)
def
filter_user_avail_submissions
(
self
,
query
):
def
filter_user_avail_submissions
(
self
,
query
,
roles
:
List
[
Role
],
groups
:
List
[
Group
]
):
submissions
=
query
.
all
()
submissions
=
query
.
all
()
return
[
submission
for
submission
in
submissions
return
[
submission
for
submission
in
submissions
if
self
.
perm_service
(
submission
=
submission
).
check
.
read_submission
()]
if
nonempty_intersection
(
submission
.
user
.
roles
,
roles
)
and
nonempty_intersection
(
submission
.
user
.
groups
,
groups
)
and
self
.
perm_service
(
submission
=
submission
).
check
.
read_submission
()]
def
find_all
(
self
):
def
find_all
(
self
):
request_helper
=
FlaskRequestHelper
()
request_helper
=
FlaskRequestHelper
()
query
=
Submission
.
query
query
=
Submission
.
query
user
=
request_helper
.
args
.
user
()
user
=
request_helper
.
args
.
user
()
project
=
request_helper
.
args
.
project
()
course
=
request_helper
.
args
.
course
()
course
=
request_helper
.
args
.
course
()
projects
=
request_helper
.
args
.
projects
()
roles
=
request_helper
.
args
.
roles
()
groups
=
request_helper
.
args
.
groups
()
if
user
:
if
user
:
query
=
query
.
filter
(
Submission
.
user
==
user
)
query
=
query
.
filter
(
Submission
.
user
==
user
)
if
course
:
if
course
:
query
=
query
.
filter
(
Submission
.
course
==
course
)
query
=
query
.
filter
(
Submission
.
course
==
course
)
if
project
:
if
projects
:
query
=
query
.
filter
(
Submission
.
project
==
project
)
query
=
query
.
filter
(
Submission
.
project_id
.
in_
(
projects
))
# TODO: filter by groups and roles in the query here
return
self
.
filter_user_avail_submissions
(
query
,
roles
,
groups
)
return
self
.
filter_user_avail_submissions
(
query
=
query
)
def
nonempty_intersection
(
provided
:
list
,
required
:
list
):
if
not
required
:
return
True
return
list
(
set
(
provided
)
&
set
(
required
))
tests/rest/test_submission.py
View file @
9035e55e
...
@@ -2,7 +2,7 @@ import json
...
@@ -2,7 +2,7 @@ import json
import
pytest
import
pytest
from
portal.database.models
import
Course
,
Project
,
Review
,
ReviewItem
,
Submission
,
SubmissionState
from
portal.database.models
import
Course
,
Project
,
Review
,
ReviewItem
,
Submission
,
SubmissionState
,
User
,
Group
from
.
import
utils
from
.
import
utils
...
@@ -76,6 +76,19 @@ def test_list_all_avail_for_project(rest_service, client):
...
@@ -76,6 +76,19 @@ def test_list_all_avail_for_project(rest_service, client):
assert
len
(
resp_submissions
)
==
len
(
db_subm
)
assert
len
(
resp_submissions
)
==
len
(
db_subm
)
# TODO: missing some tests (filter by group, role)
def
test_list_all_avail_for_group
(
rest_service
,
client
):
project
=
rest_service
.
find
.
project
(
'testcourse1'
,
'hw01'
)
group
=
rest_service
.
find
.
group
(
project
.
course
,
'seminar01'
)
db_subm
=
[
sub
for
sub
in
Submission
.
query
.
filter
(
Submission
.
project
==
project
).
all
()
if
group
in
sub
.
user
.
groups
]
response
=
utils
.
make_request
(
client
,
f
'/submissions?course=testcourse1&group=seminar01'
)
assert
response
.
status_code
==
200
assert
response
.
mimetype
==
'application/json'
resp_submissions
=
utils
.
extract_data
(
response
)
assert
len
(
resp_submissions
)
==
len
(
db_subm
)
# missing tests for working with zip
# missing tests for working with zip
def
test_read
(
client
):
def
test_read
(
client
):
submissions
=
Submission
.
query
.
all
()
submissions
=
Submission
.
query
.
all
()
...
...
Write
Preview
Supports
Markdown
0%
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!
Cancel
Please
register
or
sign in
to comment