Skip to content

Instantly share code, notes, and snippets.

@0viktory0
Last active April 2, 2023 13:35
Show Gist options
  • Save 0viktory0/4a0655cb1193ebcffa5f369f333d7d42 to your computer and use it in GitHub Desktop.
Save 0viktory0/4a0655cb1193ebcffa5f369f333d7d42 to your computer and use it in GitHub Desktop.

A1. Зачем нужна каждая библиотека в requirements.txt?

  • Django – библиотека самого фреймворка Django
  • psycopg2-binary – модуль для базы данных PostgreSQL
  • djangorestframework - позволяет сериализовать данные из Django ORM через REST API
  • Pillow - библиотека для работы с изображениями
  • django-markupfield – позволяет создать поле в модели, в котором можно использовать дополнительные виды разметки
  • environs[django] - библиотека для управления переменными окружения, парсинга урлов
# myproject/settings.py
from environs import Env

env = Env()
env.read_env()

# Override in .env for local development
DEBUG = env.bool("DEBUG", default=False)
# SECRET_KEY is required
SECRET_KEY = env.str("SECRET_KEY")

# Parse database URLs, e.g.  "postgres://localhost:5432/mydb"
DATABASES = {"default": env.dj_db_url("DATABASE_URL")}

# Parse email URLs, e.g. "smtp://"
email = env.dj_email_url("EMAIL_URL", default="smtp://")
  • rollbar – позволяет использовать трекер кода Rollbar https://rollbar.com
  • django-mptt - модуль для работы с древовидными структурами (в данном проекте модель Deck)
  • django-taggit – используется для добавления тегов в модель
  • django-taggit-helpers - используется для помощи с работой тегов. Для данного проекта используется фильтрация по тегам
  • more-itertools - инструменты для работы с итерируемыми объектами, здесь используется функция flatten которая уменьшает вложенность.
  • django-import-export – используется для экспорта и импорта данных из админки
  • gTTS - создает токен для gTTS
  • sqlalchemy - ORM для работы с базой данных, используется для экспорта карточек в приложение
  • beautifulsoup4[lxml] - парсер HTML и XML
  • tqdm - для настройки прогресс баров

B1. Для каждой модели в models.py приведите пример наполнения БД. Оформите это в виде JSON/YAML, например:

Deck:
    name: API веб-сервисов
    slug: api_web_servisov
    parent: Уроки Девмана

Sleng:
    word_with_synonyms: template sample
    footnote_explanation: a thing that is used as a model for producing other similar examples
    tags: template

BaseCard:
    guid: 12345678912345678913456789123456789
    deck: id_Deck
    lesson: id_Lesson
    solution_enhancement_template: id_SolutionEnhancementTemplate]
    tags: api
    moderation_status: Одобрена
    moderator_notes: Добавить пример использования
    published: True
    created_by: Mike Forest
    created_at: 15.07.2022 10:00

BasicCard:
    front: Какой тип контента просит клиент?
           GET /wiki/страница HTTP/1.1
           Host: ru.wikipedia.org
           User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5)
           Gecko/2008050509 Firefox/3.0b5
           Accept: text/html
           Connection: close
    answer: text/html
    explanation: Клиент просит HTML разметку

EnglishCard:
    word: accidental
    word_translation: случайный
    phrase: That was purely accidental
    phrase_translation: Это было совершенно случайно
    article_link: https://article_link.com
    acting_voice: accidental.mp3
    slengs: id_Sleng

Issue:
    card: id_BaseCard
    description: Не отображается адрес
    created_at: 15.07.2022 10:00
    author: Mike Forest

B2. Что такое MPTTModel и зачем понадобился?

Используется для создания древовидных моделей. В данном проекте модель Deck - это родитель.

B3. Что такое MPTTMeta?

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

B4. Строка 40. Зачем понадобился unique_together? Кому и какую пользу он причиняет?

Указанные в скобках поля должны быть уникальными при совместном рассмотрении. Чтобы исключить дублирование колод.

B5. Как под капотом устроено поле MarkupField? Что лежит в базе данных? Как и когда происходит рендер markdown?

MarkupField - это текстовое поле, как CharField, но со связанным типом разметки. При сохранении объекта в БД происходит рендер markdown

B6. Как модель BaseCard связана с BasicCard и EnglishCard? Сколько таблиц в БД создаётся и как они связаны между собой?

BaseCard родительская модель, а BasicCard и EnglishCard дочерние. В БД создается три таблицы для каждой модели. BasicCard и EnglishCard наследуют все поля BaseCard и добавляют свои.

B7. Зачем нужна модель BaseCard?

Чтобы не дублировать поля в дочерних моделях, а прописать один раз в родительской. А так же, для вывода всех моделей одновременно.

B8. Почему модель BaseCard не сделали абстрактной? В чём польза от такого решения?

Потому, что была нужна еще одна таблица для отображения в админке. Можно вывести все карточки сразу в одном месте.

C1. Строка 17 -- о каком returncode идёт речь? Что лежит в этом атрибуте?

.returncode это атрибут объекта Popen, статус выхода из дочернего процесса. Пока он возвращает 0, процесс проходит успешно, при возврате значения, отличного от 0, поднимется исключение ValueError.

C2. Что делает функция render_markdown?

Рендерит markdown-разметку в HTML c помощью js скрипта

C3. Зачем понадобилась функция render_in_bulk? В чём профит?

Для ускорения процесса рендеринга, рендерится сразу много карточек

D1. Что полезного делает CustomTagListFilter?

Создает свой собственный фильтр для фильтрации карточек по именам тэгов в административной панели

D2. Что полезного делает BaseCardsResource?

Создает функционал для импорта/экпорта данных для модели BaseCard

D3. Что полезного делают методы BaseCardsResource.dehydrate_*?

Преобразовывают данные модели в более простые, для возможности экспорта или возвращают данных конкретных полей. dehydrate_tags - возвращает список тегов карточки через запятую dehydrate_card_type - возвращает тип карточки dehydrate_basiccard_front - возвращает исходный код поля 'Фронтальная сторона' или пустую строку dehydrate_basiccard_explanation - возвращает исходный код поля 'Объяснение ответа' или пустую строку

D4. В какой момент вызывается и что полезного делает метод BaseCardsResource.import_field?

Вызывается при импорте и позволяет импортировать файл с необходимыми полями и записать их в БД. Заполняет поля front, answer, explanation, tags, deck, lesson, solution_enhancement_template.

D5. Что полезного делает метод DeckAdminResource.import_field?

Позволяет импортировать файл с данными о колоде, и записать их в БД

D6. Зачем нужен DraggableMPTTAdmin?

Предназначен для уравления древовидным списком карточек путем перетаскивания узлов дерева

D7. Зачем понадобилась функция get_tags?

Возвращает список тэгов обычной или английской карточки или возвращат пустой список, при их отсутствии

D8. Зачем понадобилась форма BaseCardAddForm?

Создает поле выбора типа карточки - обычная карточка или английская карточка.

D9. Зачем нужен TreeRelatedFieldListFilter?

Используется для создания фильтрации в административной панели древовидной структуры по экземплярам модели со всеми её потомками.

D10. Зачем нужен класс BaseCardAdmin.Media?

Нужен для подключения css файлов

D11. Что полезного делает метод BaseCardAdmin.get_card_text?

Возвращает содержимое обычной или английской карточки в html разметке

D12. Что полезного делает метод get_lesson_and_solution_enhancement_template?

Возвращает название урока lesson_title, решение по улучшению шаблона enh_action и имена тэгов tag_names в html разметке

D13. Зачем переопределили метод BaseCardAdmin.save_model?

Метод перенаправляет обратно на страницу добавления карточки, при отсутствии изменеия карточки и без сохранения ее в БД.

D14. Зачем переопределили метод BaseCardAdmin.response_add?

Метод определяет url для перенапраления пользователя в зависимости от того, объект какой модели был создан формой: обычная или английская карточка.

D15. Зачем переопределили метод BaseCardAdmin.change_view?

Метод определяет url для перенапраления пользователя в зависимости от того, объект какой модели нужно редактировать: обычная или английская карточка

D16. Зачем переопределили метод BaseCardAdmin.has_delete_permission?

Метод проверяет наличие прав у пользователя (объект создан пользователем или у пользователя есть права на редактирование любых объектов данного типа) то, при наличии, позволяет удалить дочерние объекы модели BaseCard при каскадном удалении

D17. Что принимает в качестве аргумента функция def check_moderation_needed?

Cловарь BaseForm.cleaned_data

D18. Что полезного делает класс AutofilledCreatedByFieldAdmin?

Заполняет поле created_by, если оно пустое

D19. Зачем нужна настройка formfield_overrides?

Переопределяет 'widget', который отвечает за настройку отображения поля в форме для полей класса MarkupField

D20. Зачем переопределены методы get_queryset?

Добавляет к запросу список тегов

D21. Что полезного делает класс EnglishCardForm?

  • Проверяет, заполнено ли поле phrase или phrase_translation, и если да, то добавляет help_text (берется из ANKI_MARKDOWN_HELP_TEXT)
  • С помощью метода clean, проводится проверка на прохождение карточки модерации
  • Определяет настройки виджетов для редактирования полей

D22. Что делает конструкция BasicCard._meta.get_field(...)? Зачем она понадобилась?

    def get_explanation_preview(self, obj):
        return get_anki_field_preview(str(obj.explanation))
    get_explanation_preview.short_description = BasicCard._meta.get_field('explanation').verbose_name

Метод get_field(field_name) возвращает объект указанного поля модели. В данном случае извлекается значение атрибута verbose_name для заданного поля модели.

D23. Зачем BasicCardAdmin и EnglishCardAdmin понадобилось переопределять методы response_post_save_add, response_post_save_change и changelist_view?

Методы определяют url для перенаплавления пользователя после сохранения созданной или измененной карточки

D24. Что полезного делает метод EnglishCardAdmin.save_form и в какой момент он вызывается?

При сохранении карточки сервису Google Text to Speech передаётся фраза в текстовом формате на английском языке. Полученный результат озвучки сохраняется в mp3-файл. Если уже имеется такой файл, то происходит перезапись. В случае возникновения ошибки создания объекта, направляет отчет в rollbar

D25. Зачем нужен класс SlengForm?

В поле footnote_explanation добавляет help_text (берется из ANKI_MARKDOWN_HELP_TEXT)

E1. Что полезного умеет делать feedback_form.html?

Это шаблон, который формирует страницу для обратной связи с пользователем. С помощью нее можно сообщить об ошибке, возникшей в карточке. Содержит подсказку о возникших ошибках в виде вопроса "Что не так с картой?" и выводом информацию об этих ошибках.

E2. Что полезного умеет делать success_feedback_form.html?

Это шаблон, который формирует страницу, на которой выводится сообщение: "Теперь мы знаем о проблеме. Спасибо!" после успешной отправки сообщения об ошибке, созданной в форме feedback_form.html. Так же имеентся предложение о создании еще одного ообщения.

F1. Что лежит в файле devman_anki_cards.css? Где он используется?

В данном файле лежат css-стили для отображения предпросмотра карточки при экспорте

F2. Зачем нужен файл test_anki_card.html? Как им пользоваться?

Это шаблон страницы, на которой привдены примеры с элементами редактора карточки

F3. Что лежит в файле anki-cards-list-preview.css? Где он используется?

В данном файле лежат css-стили для оформления полей для страницы админ-панели для модели BaseCard. Он используется в файле test_anki_card.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment