diff --git a/Pipfile b/Pipfile index a653d6ded7bde25d0724dbb15f92c8e456f91d32..101897d0a0b3b9de36ddcb9f0c7a84f4c9cfdcb2 100644 --- a/Pipfile +++ b/Pipfile @@ -33,4 +33,4 @@ pytest-mock = "*" mock = "*" [requires] -python_version = "3.7" +python_version = "3.6" diff --git a/app.py b/app.py index 4193394b4efe0d8a3c2dd0b78374b12505b07d60..2ebae75a6dcd8f2937c6e4fe87961cbe5adfd81b 100644 --- a/app.py +++ b/app.py @@ -20,8 +20,9 @@ log = logger.getLogger(__name__) data_cli = AppGroup('data', help='Sample data initialization') users_cli = AppGroup('users', help='Users management') courses_cli = AppGroup('courses', help='Courses management') -devel_cli = AppGroup('devel', help='Development options') -submissions_cli = AppGroup('submissions', help='Submissions options') +devel_cli = AppGroup('devel', help='Development management') +submissions_cli = AppGroup('submissions', help='Submissions management') +projects_cli = AppGroup('projects', help='Projects management') app: Flask = create_app() @@ -29,6 +30,8 @@ app.cli.add_command(data_cli) app.cli.add_command(users_cli) app.cli.add_command(courses_cli) app.cli.add_command(devel_cli) +app.cli.add_command(submissions_cli) +app.cli.add_command(projects_cli) manager = DataManagement(app, db) @@ -109,6 +112,12 @@ def cli_course_creates(name): log.info(f"[CMD] Created Course: {course}") +@courses_cli.command('list', help="List courses") +def cli_courses_list(): + log.info(f"[CMD] List Courses") + course = manager.list_courses() + + @courses_cli.command( 'create-role', help="Creates role by it's type in the course") @click.argument('course') @@ -120,5 +129,21 @@ def cli_course_role_creates(course, type, name=None): log.info(f"[CMD] Created Course: {course}") +@projects_cli.command('activate', help="activates project") +@click.option('-p', '--project') +@click.option('-c', '--course') +def cli_projects_activate(project, course): + log.info(f"[CMD] Activating project: {project} in course {course}") + project = manager.activate_project(course, project) + log.info(f"[CMD] Project has been activated: {project}") + + +@projects_cli.command('list', help="list projects") +@click.option('-c', '--course') +def cli_projects_list(course): + log.info(f"[CMD] Listing projects in the course {course}") + manager.list_projects(course) + + if __name__ == '__main__': cli_run_devel() diff --git a/management/data/__init__.py b/management/data/__init__.py index 595d25e931cff515f5718dd568033d4ce08cf5cd..43651851fce863a687035d97ab808fce6d6224ca 100644 --- a/management/data/__init__.py +++ b/management/data/__init__.py @@ -1,3 +1,4 @@ +import datetime from flask import Flask from flask_sqlalchemy import SQLAlchemy @@ -7,6 +8,8 @@ from management.data.data_dev import init_dev_data from management.data.data_prod import init_prod_data from portal.database.models import Course, Role, User from portal.service import general +from portal.service.general import write_entity +from portal.tools import time class DataManagement(object): @@ -75,7 +78,7 @@ class DataManagement(object): name=name, admin=True, password=password - ) + ) self.db.session.commit() return user @@ -109,3 +112,25 @@ class DataManagement(object): with self.app.app_context(): for user in User.query.all(): print(f"{user.username} ({user.id}) - {user.created_at}") + + def activate_project(self, course: str, project: str): + with self.app.app_context(): + course = general.find_course(course) + project = general.find_project(course, project) + days_allow_to = time.current_time() + datetime.timedelta(days=1000) + project.config.archive_from = None + project.config.submissions_allowed_to = days_allow_to + write_entity(project) + self.db.session.commit() + return project + + def list_projects(self, course: str): + with self.app.app_context(): + course = general.find_course(course) + for project in course.projects: + print(f"{project.name}: {project.description}") + + def list_courses(self): + with self.app.app_context(): + for course in Course.query.all(): + print(f"{course.codename}: {course.name}") diff --git a/portal/database/models.py b/portal/database/models.py index 6d4cb15a47e8f791f8bbb785a19955e43ed3f5c6..53f9d631046cd4030143c6398da5ad0a024ea1b5 100644 --- a/portal/database/models.py +++ b/portal/database/models.py @@ -552,10 +552,10 @@ class ProjectConfig(db.Model, EntityBase): submissions_allowed_to = normalize_time(submissions_allowed_to) if self.submissions_allowed_from is not None and \ self.submissions_allowed_from > submissions_allowed_to: - raise PortalDbError() + raise PortalDbError("Submissions allowed from later than to") if self.archive_from is not None and \ self.archive_from < submissions_allowed_to: - raise PortalDbError() + raise PortalDbError("Archive from is lesser than submissions allowed to") self._submissions_allowed_to = time.strip_seconds( submissions_allowed_to) @@ -565,6 +565,9 @@ class ProjectConfig(db.Model, EntityBase): Args: archive_from(time): Time from which all the submissions are allowed to archive """ + if archive_from is None: + self._archive_from = None + return archive_from = normalize_time(archive_from) if self.submissions_allowed_from is not None and \ self.submissions_allowed_from > archive_from: diff --git a/portal/service/projects.py b/portal/service/projects.py index 76457033dd255ff7fae31508ac213a1af36856b8..afb40e55e4a7d532b00f9c59713bc7a0f29a60d3 100644 --- a/portal/service/projects.py +++ b/portal/service/projects.py @@ -77,7 +77,7 @@ def update_project(project: Project, data: dict) -> Project: def __set_project_data(project: Project, data: dict) -> Project: - return general.update_entity(project, data, allowed=['name']) + return general.update_entity(project, data, allowed=['name', 'description']) def create_project(course: Course, data: dict) -> Project: