From b9fc5a8cef14ff0a9a718c039b8a749bdf75ff31 Mon Sep 17 00:00:00 2001 From: wad Date: Tue, 9 Jan 2018 18:33:51 +0300 Subject: [PATCH] code review "courses" --- course_service/courses/models.py | 36 +++++++++++++---------- gitlab_service/api.py | 50 +++++++++++++++++++++++++++----- 2 files changed, 63 insertions(+), 23 deletions(-) diff --git a/course_service/courses/models.py b/course_service/courses/models.py index 2592090..d975a79 100755 --- a/course_service/courses/models.py +++ b/course_service/courses/models.py @@ -73,20 +73,20 @@ class CourseManager(models.Manager): class Course(models.Model): - hidden = models.BooleanField(verbose_name='Видно только оплатившим', default=False) - level = models.CharField(verbose_name='Уровень', choices=COURSE_LEVEL, default='B', max_length=3) slug = models.SlugField(unique=True, editable=False, max_length=127) - direction = models.SmallIntegerField(choices=COURSE_DIRECTION, verbose_name='Направление') - public = models.BooleanField(verbose_name='Опубликовать', default=False) title = models.CharField(verbose_name="Заголовок", max_length=255, unique=True) description = models.TextField(verbose_name='Описание', blank=True) + level = models.CharField(verbose_name='Уровень', choices=COURSE_LEVEL, default='B', max_length=3) + direction = models.SmallIntegerField(choices=COURSE_DIRECTION, verbose_name='Направление') + public = models.BooleanField(verbose_name='Опубликовать', default=False) + route = models.OneToOneField(to=CourseRoute, verbose_name="Порядок прохождения по умолчанию", blank=True, null=True) + teachers = ArrayField( + models.CharField(max_length=15, blank=True, verbose_name='Ссылки на преподов'), default=[]) image = models.URLField(verbose_name='Изображение', blank=True, max_length=255) big_image = models.URLField(verbose_name='Большое изображение', blank=True, max_length=255) big_mobile_image = models.URLField(verbose_name='Под мобилку', blank=True, help_text='Большая картинка для мобильной версии', max_length=255) - teachers = ArrayField( - models.CharField(max_length=15, blank=True, verbose_name='Ссылки на преподов'), default=[]) - route = models.OneToOneField(to=CourseRoute, verbose_name="Порядок прохождения по умолчанию", blank=True, null=True) + hidden = models.BooleanField(verbose_name='Видно только оплатившим', default=False) def __str__(self): return self.title @@ -105,10 +105,10 @@ class Course(models.Model): class Topic(models.Model): + course = models.ForeignKey(to=Course, verbose_name='курс') title = models.CharField(verbose_name='Название', max_length=255) - icon = models.ImageField(verbose_name='Иконка темы', null=True, blank=True) description = models.TextField(verbose_name='Описание', blank=True, null=True) - course = models.ForeignKey(to=Course, verbose_name='курс') + icon = models.ImageField(verbose_name='Иконка темы', null=True, blank=True) class Meta: verbose_name = "Тема" @@ -116,20 +116,24 @@ class Topic(models.Model): class Vertex(models.Model): + # TODO переименовать в Lesson + token = models.CharField(max_length=15, verbose_name="Ключ доступа к узлу", unique=True, editable=False) + topic = models.ForeignKey(to=Topic, verbose_name='Тема') + title = models.CharField(verbose_name='Название', max_length=255) + description = models.TextField(verbose_name='Описание', blank=True, null=True) + video = models.TextField(verbose_name='Код видео', blank=True, null=True) + materials = ArrayField(models.CharField(max_length=15, blank=True, verbose_name='Материалы урока')) + # TODO material_tokens ??? + free = models.BooleanField(default=False, verbose_name='Привилегии для узла не будут проверяться') + + # TODO перейти на список валидаторов VALID_TYPE = ( (3, 'Автаматическая валидация'), (2, 'Полуавтаматическая валидация'), (1, 'Ручная валидация'), (0, 'Без валидации'), ) - topic = models.ForeignKey(to=Topic, verbose_name='Тема') - title = models.CharField(verbose_name='Название', max_length=255) - free = models.BooleanField(default=False, verbose_name='Привилегии для узла не будут проверяться') - description = models.TextField(verbose_name='Описание', blank=True, null=True) - video = models.TextField(verbose_name='Код видео', blank=True, null=True) - materials = ArrayField(models.CharField(max_length=15, blank=True, verbose_name='Материалы урока')) valid_type = models.SmallIntegerField(choices=VALID_TYPE, default=0) - token = models.CharField(max_length=15, verbose_name="Ключ доступа к узлу", unique=True, editable=False) def __str__(self): return self.title diff --git a/gitlab_service/api.py b/gitlab_service/api.py index c974732..9e05fa1 100644 --- a/gitlab_service/api.py +++ b/gitlab_service/api.py @@ -1,18 +1,56 @@ # -*- coding: utf-8 -*- - -def create_user(email, name): - """ Создает пользователя в GitLab и возвращает токен пользователя для последующей работы """ +# Сервис может +# интерфейс учителя: +# - логин +# - выбор курса для работы +# - привязка (или создание) репы для курса (можно через веб) +# - прописывание соответствий ДЗ курса <-> путь в репе (можно через веб) +# - clone всех реп учеников данного курса и базовой репы +# - pull всех изменений реп студентов данного курса +# - push всех новых коммитов учителя в репы студентов (+ save point опционально) +# - changes по всем репам студентов данного курса с момента последнего save point (можно через веб) +# - save point состояния реп студентов (можно через веб) +# - разнесение изменений в базовой репе по репам студентов + +# соотвтествие путей в гите к курсам/домашкам храним у себя, какая домашка следующая для ученика - спрашиваем ЛМС + +# запросы к ЛМС +# - get по токену получить ИД учителя, емейл и имя +# - get по ИД учителя список его курсов (ИД, название) +# - get по ИД курса список всех опубликованных домашек (ИД, название) +# - get по ИД учителя и ИД курса список всех его студентов (ИД, емейл, имя) +# - get по ИД курса + ИД студента + ИД домашки дай следующую доамашку (ИД, название) +# - post ИД студента, ИД домашки - ДЗ принято + + +# запросы к сервису +# - get получение пользователя +# - get + +def register_user(email, name): + """ Создает пользователя в сервисе и возвращает токен пользователя для последующей работы """ user_token = '...' return user_token -def get_user(email, name): - """ Выбирает пользователя GitLab и возвращает токен пользователя для последующей работы """ +def get_user(email): + """ Выбирает пользователя сервиса возвращает токен пользователя для последующей работы """ user_token = '...' return user_token +def create_git_user(user): + """ Создает пользователя в GitLab""" + pass + + +def get_users(emails): + """ Выбирает пользователей GitLab и возвращает токены для последующей работы """ + tokens = ['...', '...', '...', ] + return tokens + + def create_repository(user, project_name): """ Создает проект (репу) в GitLab и возвращает токен репу """ repository_token = '...' @@ -37,7 +75,6 @@ def copy_files_to_repository(base_repository, files_path, target_repository, aut def approve_homework(teacher, base_repository, student, target_repository, files_path): """ Принять домашку у студента, копировать новые файлы """ - # TODO возможно это на уровне LMS надо делать, а с гитлабом вызвать copy_files_to_repository pass @@ -49,4 +86,3 @@ def make_save_point(teacher, students): def get_last_changes(teacher, students, save_point=None): """ показать последние изменения в репах учеников относительно save point (последнего, если None) """ pass -