Code Monkey home page Code Monkey logo

lecture's People

Contributors

murkymeow avatar pcoldq avatar

Stargazers

 avatar

Watchers

 avatar  avatar

lecture's Issues

GraphQL API

Было принято решение отойти от идеологии REST в пользу GraphQL.

В #23 я настроила библиотеку graphene_django и добавила несколько контроллеров.

Нужно переписать все остальные контроллеры (в идеале, и тесты).

Предлагаю начать с контроллеров для курсов.

Затем взяться за обновление/удаление/получение комментариев (добавление я уже сделала для образца).

Небольшой гайд по graphene_django:

Контроллеры пишутся в файле schema.py.

Вместо сериализаторов теперь GraphQL типы. Они используются как для сериализации, так и для формирования документации:

from graphene_django import DjangoObjectType
from .models import Course

class CourseType(DjangoObjectType):
  class Meta:
    model = Course
    # можно использовать fields и exclude

GET контроллеры объявляются в типе Query:

import graphene
from .models import Course, Progress

class Query(graphene.ObjectType):
  courses = graphene.List(CourseType)
  progress = graphene.List(ProgressType)

  def resolve_courses(self, info):
    return Course.objects.all()

  def resolve_progress(self, info):
    return Progress.objects.filter(user=info.context.user)

Вначале идёт описание контроллеров в формате название = возвращаемоеЗначение.

Далее следуют методы, которые производят обработку соответствующих запросов.

Проще некуда.

Протестировать это можно в GraphiQL IDE (которая находится по адресу localhost:8000/graphql (очень советую поиграться там).

Например:

{
  courses { # запросить список курсов с приложенными id и name
     id
     name
  }
}

Пример контроллера с параметрами:

class CommentType(DjangoObjectType):
  class Meta:
    model = Comment

class Query(graphene.ObjectType):
  comments = graphene.List(CommentType,
    # имена и типы параметров:
    lecture_id=graphene.Int(required=True),
    slide_id=graphene.Int(required=True),
  )

                                 # параметры передаются в виде kwargs ^-^
  def resolve_comments(self, info, lecture_id, slide_id):
    return Comment.objects.filter(lecture_id=lecture_id, slide_id=slide_id)

Проверки параметров на None делаются автоматически. Сейчас мы пишем их вручную.

Каждый обработчик, который совершает изменение в бд (в терминах gql это называется мутацией), пишется в отдельном классе:

class CreateComment(graphene.Mutation):
  class Arguments:
    text = graphene.String(required=True)
    slide_id = graphene.Int(required=True)
    lecture_id = graphene.Int(required=True)

  comment = graphene.Field(CommentType) # возвращаемое значение

  def mutate(self, info, text, slide_id, lecture_id):
    return CreateComment(comment=Comment.objects.create(
      user=info.context.user,
      text=text,
      slide_id=slide_id,
      lecture_id=lecture_id,
    ))

Затем такие классы объединяются в одном типе Mutation:

class Mutation(graphene.ObjectType):
  create_comment = CreateComment.Field()
  update_comment = UpdateComment.Field()

Полный гайд: https://docs.graphene-python.org/projects/django/en/latest/tutorial-plain/

Вход в аккаунт не работает

Как сейчас в SigninView проверяется соотвествие пароля:

if user.password == password:
  return credentials(request, user)

При этом user.password зашифрован, а password (который достаётся из запроса) — нет.

Это значит, что зайти в свой аккаунт невозможно, даже если указать верные данные.

Тесты проходят, потому что юзер создаётся через create:

def setUp(self):
  User.objects.create(
    username=user['name'], email=user['email'], password=user['password']
  )

Это тоже нужно поправить.

Course views

Благодаря #15 курсы хранятся в бд. Теперь нужно определить вьюшки, чтобы доставать их оттуда.

Нам нужно:

  • Получение списка всех курсов
  • Получение лекций по id курса
  • Получение слайдов по id лекции

Скрипт синхронизации не должен стирать все данные

Такую строчку содержит скрипт:

Course.objects.all().delete()

Она удаляет все существующие курсы, после чего они добавляются в бд заново, НО при этом им присваиваются новые id, и все связанные модели становятся неактуальными.

Вместо этого предлагаю такой алгоритм:

  1. Получить список всех курсов из бд (обозначим его α)
  2. Узнать название курса из папки courses
  3. Посмотреть, содержит ли α курс с таким названием
  4. Если содержит, обновить его через update, иначе сделать insert
  5. В конце пройтись по α и удалить все записи, которых в папке нет

Я создала ветку (#21) и добавила туда тест.

Он запускает скрипт дважды, после чего сравнивает параметры сгенерированных объектов.

Сейчас он падает из-за того, что id объектов, полученных после первого прохода, не совпадает с id объектов, полученных во второй раз.

Если удастся сделать, чтобы тест не падал, то, вероятно, работу можно считать выполненной. (См).

Синхронизация лекций с бд

Так как лекции не хранятся в бд, мы теряем автоматическую валидацию целостности.

Например, комментарий можно оставить к несуществующей лекции.

Кроме того, id лекций не определяется автоматически и не присылается клиенту (без него оставить комментарий невозможно).

  • Переделать формат лекций, чтобы их можно было синхронизировать с бд
  • Написать алгоритм синхронизации

User info view

После авторизации в cookie клиента сохраняется зашифрованный id сесии.

Благодаря этому сервер может ассоциировать клиента с его аккаунтом.

Прекрасно! Но на фронтенде из кук невозможно достать информацию об аккунте (например, никнейм).

Поэтому нужно создать отдельный контроллер, который возвращает её.

Только чтобы он не присылал пароль, пожалуйста. Я думаю, достаточно ограничиться никнеймом и email .

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.