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):
def __eq__(self, other):
return self.id == other.id
def __hash__(self):
return hash(self.id)
class ProjectConfig(db.Model, EntityBase):
"""Project's configuration
......@@ -724,6 +727,9 @@ class Role(db.Model, EntityBase, NamedMixin):
def __eq__(self, other):
return self.id == other.id
def __hash__(self):
return hash(self.id)
class RolePermissions(db.Model, EntityBase):
"""Role Permissions model
......@@ -839,6 +845,9 @@ class Group(db.Model, EntityBase, NamedMixin):
def __eq__(self, other):
return self.id == other.id
def __hash__(self):
return hash(self.id)
def get_users_based_on_role(self, role: 'Role' = None):
if not role:
return self.users
......
"""
Helpers to work and process the rest requests and responses
"""
from typing import Optional
from typing import Optional, List
import flask
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.service.errors import DataMissingError
......@@ -77,6 +77,27 @@ class FlaskRequestArgsHelper:
return None
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:
@property
......
......@@ -5,7 +5,7 @@ Submissions service
import logging
import time
from pathlib import Path
from typing import Union
from typing import Union, List
import flask
from celery.result import AsyncResult
......@@ -14,7 +14,7 @@ from werkzeug.utils import secure_filename
from portal import storage
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.service import errors
from portal.service.general import GeneralService
......@@ -223,26 +223,38 @@ class SubmissionsService(GeneralService):
break
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()
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):
request_helper = FlaskRequestHelper()
query = Submission.query
user = request_helper.args.user()
project = request_helper.args.project()
course = request_helper.args.course()
projects = request_helper.args.projects()
roles = request_helper.args.roles()
groups = request_helper.args.groups()
if user:
query = query.filter(Submission.user == user)
if course:
query = query.filter(Submission.course == course)
if project:
query = query.filter(Submission.project == project)
if projects:
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
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
......@@ -76,6 +76,19 @@ def test_list_all_avail_for_project(rest_service, client):
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
def test_read(client):
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