Commit 9035e55e authored by Barbora Kompisova's avatar Barbora Kompisova
Browse files

get submission list proper params

parent 2fb85ba7
Pipeline #13285 passed with stage
in 13 minutes and 4 seconds
...@@ -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
......
""" """
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
......
...@@ -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))
...@@ -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()
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment