From fa700c3ada79d3eb566c35a71fc74810d5864b89 Mon Sep 17 00:00:00 2001
From: Fedor Borshev <1592663+f213@users.noreply.github.com>
Date: Fri, 30 Aug 2024 21:37:24 +0300
Subject: [PATCH] Notion admin improvements (#2394)
* Searching notion materials buy short ids
* Links to the notion and LMS
---
src/apps/notion/admin.py | 45 +-
.../0009_notion_slug_field_translation.py | 19 +
src/apps/notion/models/material.py | 5 +-
src/core/static/admin.css | 10 +
src/core/static/logo/notion.svg | 4 +
src/core/static/logo/tds.png | Bin 0 -> 4489 bytes
src/locale/ru/LC_MESSAGES/django.po | 487 +++++++++---------
7 files changed, 332 insertions(+), 238 deletions(-)
create mode 100644 src/apps/notion/migrations/0009_notion_slug_field_translation.py
create mode 100644 src/core/static/logo/notion.svg
create mode 100644 src/core/static/logo/tds.png
diff --git a/src/apps/notion/admin.py b/src/apps/notion/admin.py
index 6925f8c49c5..16bd8c237c8 100644
--- a/src/apps/notion/admin.py
+++ b/src/apps/notion/admin.py
@@ -1,4 +1,9 @@
from django import forms
+from django.db.models import QuerySet, Value
+from django.db.models.functions import Replace
+from django.http.request import HttpRequest
+from django.utils.safestring import mark_safe
+from django.utils.translation import gettext_lazy as _
from httpx import HTTPError
from apps.notion import helpers
@@ -35,8 +40,8 @@ def clean_title(self) -> str:
class NotionMaterialAdmin(ModelAdmin):
list_display = (
"title",
- "course",
- "page_id",
+ "our_page",
+ "notion_page",
)
fields = [
"title",
@@ -44,11 +49,45 @@ class NotionMaterialAdmin(ModelAdmin):
"page_id",
"is_home_page",
]
- list_display_links = list_display
+ search_fields = [
+ "slug",
+ "page_id",
+ ]
+ lookup_fields = [
+ "page_id",
+ "slug_without_dashes",
+ ]
+
list_filter = ("course",)
form = NotionMaterialForm
save_as = True
+ def get_search_results(self, request: HttpRequest, queryset: QuerySet, search_term: str) -> tuple[QuerySet, bool]:
+ """Allow searching both by long and short ids"""
+ if len(search_term) == 36:
+ search_term = helpers.uuid_to_id(search_term)
+
+ queryset.annotate(slug_without_dashes=Replace("slug", Value("-"), Value("")))
+ return super().get_search_results(request, queryset, search_term)
+
+ @admin.display(description=_("LMS"))
+ @mark_safe
+ def our_page(self, obj: Material) -> str:
+ slug = helpers.uuid_to_id(str(obj.slug))
+ lms_url = obj.get_absolute_url()
+
+ return f"""
+
+ {slug}"""
+
+ @admin.display(description=_("Notion"))
+ @mark_safe
+ def notion_page(self, obj: Material) -> str:
+ notion_url = obj.get_notion_url()
+ return f"""
+
+ {obj.page_id}"""
+
@admin.register(MaterialFile)
class MaterialFileAdmin(ModelAdmin): ...
diff --git a/src/apps/notion/migrations/0009_notion_slug_field_translation.py b/src/apps/notion/migrations/0009_notion_slug_field_translation.py
new file mode 100644
index 00000000000..3e2b74d28ca
--- /dev/null
+++ b/src/apps/notion/migrations/0009_notion_slug_field_translation.py
@@ -0,0 +1,19 @@
+# Generated by Django 4.2.15 on 2024-08-30 17:26
+
+import uuid
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+ dependencies = [
+ ("notion", "0008_notion_asset_metadata"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="material",
+ name="slug",
+ field=models.UUIDField(db_index=True, default=uuid.uuid4, unique=True, verbose_name="Our page id"),
+ ),
+ ]
diff --git a/src/apps/notion/models/material.py b/src/apps/notion/models/material.py
index 73f00106fca..2391fbd6b69 100644
--- a/src/apps/notion/models/material.py
+++ b/src/apps/notion/models/material.py
@@ -40,7 +40,7 @@ def get_by_page_id_or_slug(self, page_id_or_slug: str) -> Optional["Material"]:
class Material(TimestampedModel):
objects = MaterialManager()
- slug = models.UUIDField(default=uuid.uuid4, db_index=True, unique=True)
+ slug = models.UUIDField(_("Our page id"), default=uuid.uuid4, db_index=True, unique=True)
title = models.CharField(_("Page title"), max_length=128, blank=True, help_text=_("Will be fetched automatically if empty"))
course = models.ForeignKey("products.Course", on_delete=models.CASCADE)
@@ -64,3 +64,6 @@ def __str__(self) -> str:
def get_absolute_url(self) -> str:
slug = uuid_to_id(str(self.slug))
return urljoin(settings.FRONTEND_URL, f"materials/{slug}/")
+
+ def get_notion_url(self) -> str:
+ return f"https://notion.so/1-{self.page_id}"
diff --git a/src/core/static/admin.css b/src/core/static/admin.css
index 2ebea9f3fdb..83b2d03265f 100644
--- a/src/core/static/admin.css
+++ b/src/core/static/admin.css
@@ -8,3 +8,13 @@
.app-number-input {
-moz-appearance: textfield;
}
+
+.notion-logo {
+ max-width: 16px;
+ position: relative;
+ top: -2px;
+}
+
+.notion-lms-logo {
+ max-width: 16px;
+}
diff --git a/src/core/static/logo/notion.svg b/src/core/static/logo/notion.svg
new file mode 100644
index 00000000000..bf6442f76a4
--- /dev/null
+++ b/src/core/static/logo/notion.svg
@@ -0,0 +1,4 @@
+
diff --git a/src/core/static/logo/tds.png b/src/core/static/logo/tds.png
new file mode 100644
index 0000000000000000000000000000000000000000..eeff77b2f9bbb2476aa3bc626d9f3e5a1a9ad89c
GIT binary patch
literal 4489
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
literal 0
HcmV?d00001
diff --git a/src/locale/ru/LC_MESSAGES/django.po b/src/locale/ru/LC_MESSAGES/django.po
index 74e3aef2317..82763c4f676 100644
--- a/src/locale/ru/LC_MESSAGES/django.po
+++ b/src/locale/ru/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-07-10 15:20+0300\n"
+"POT-Creation-Date: 2024-08-30 20:27+0300\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
"Language: \n"
@@ -19,239 +19,245 @@ msgstr ""
"n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || "
"(n%100>=11 && n%100<=14)? 2 : 3);\n"
-#: apps/a12n/signals/handlers.py:13
+#: src/apps/a12n/signals/handlers.py:13
msgid "Too many failed login attempts"
msgstr ""
-#: apps/banking/base.py:22
+#: src/apps/banking/base.py:22
msgid "—"
msgstr ""
-#: apps/banking/zero_price_bank.py:19
+#: src/apps/banking/zero_price_bank.py:19
msgid "Zero Price"
msgstr "Бесплатно"
-#: apps/chains/admin/chain.py:12
+#: src/apps/chains/admin/chain.py:12
msgid "Archived"
msgstr "Заархивирована"
-#: apps/chains/admin/forms.py:16 apps/chains/models/message.py:39
+#: src/apps/chains/admin/forms.py:16 src/apps/chains/models/message.py:39
msgid "Parent"
msgstr "Родитель"
-#: apps/chains/admin/forms.py:20 apps/chains/models/message.py:33
+#: src/apps/chains/admin/forms.py:20 src/apps/chains/models/message.py:33
msgid "Chain"
msgstr "Цепочка"
-#: apps/chains/admin/forms.py:21
+#: src/apps/chains/admin/forms.py:21
msgid ""
"Only the chains that are neither archived nor active for sending are listed"
msgstr "В списке только не запущенные и не заархивированные цепочки"
-#: apps/chains/admin/message.py:48 apps/chains/models/chain.py:33
-#: apps/diplomas/admin/diploma.py:55 apps/homework/admin/answer/admin.py:56
-#: apps/homework/admin/answer/admin.py:100 apps/orders/models/order.py:59
-#: apps/products/models/course.py:74 apps/studying/models.py:9
+#: src/apps/chains/admin/message.py:48 src/apps/chains/models/chain.py:33
+#: src/apps/diplomas/admin/diploma.py:55
+#: src/apps/homework/admin/answer/admin.py:56
+#: src/apps/homework/admin/answer/admin.py:100
+#: src/apps/orders/models/order.py:59 src/apps/products/models/course.py:74
+#: src/apps/studying/models.py:9
msgid "Course"
msgstr "Курс"
-#: apps/chains/models/chain.py:32 apps/chains/models/message.py:32
-#: apps/homework/models/question.py:14 apps/magnets/models.py:20
-#: apps/products/admin/course.py:17
+#: src/apps/chains/models/chain.py:32 src/apps/chains/models/message.py:32
+#: src/apps/homework/models/question.py:14 src/apps/magnets/models.py:20
+#: src/apps/products/admin/course.py:17
msgid "Name"
msgstr "Название"
-#: apps/chains/models/chain.py:35
+#: src/apps/chains/models/chain.py:35
msgid "Sending is active"
msgstr "Запущена"
-#: apps/chains/models/chain.py:36
+#: src/apps/chains/models/chain.py:36
msgid "The chain is archived"
msgstr "Заархивирована"
-#: apps/chains/models/chain.py:39
+#: src/apps/chains/models/chain.py:39
msgid "Email chain"
msgstr "Цепочка"
-#: apps/chains/models/chain.py:40
+#: src/apps/chains/models/chain.py:40
msgid "Email chains"
msgstr "Цепочки"
-#: apps/chains/models/message.py:34
+#: src/apps/chains/models/message.py:34
msgid "Template id"
msgstr "ID шаблона в постмарке"
-#: apps/chains/models/message.py:43
+#: src/apps/chains/models/message.py:43
msgid "Messages without parent will be sent upon start"
msgstr "Если не поставить — сообщение уйдёт сразу при запуске цепочки"
-#: apps/chains/models/message.py:46
+#: src/apps/chains/models/message.py:46
msgid "Delay (minutes)"
msgstr "Задержка (мин.)"
-#: apps/chains/models/message.py:46
+#: src/apps/chains/models/message.py:46
msgid "1440 for day, 10080 for week"
msgstr "День — 1440, Неделя — 10080"
-#: apps/chains/models/message.py:49
+#: src/apps/chains/models/message.py:49
msgid "Email chain message"
msgstr "Письмо"
-#: apps/chains/models/message.py:50
+#: src/apps/chains/models/message.py:50
msgid "Email chain messages"
msgstr "Письма"
-#: apps/diplomas/admin/diploma.py:51 apps/studying/models.py:8
-#: apps/users/models.py:107
+#: src/apps/diplomas/admin/diploma.py:51 src/apps/studying/models.py:8
+#: src/apps/users/models.py:107
msgid "Student"
msgstr "Студент"
-#: apps/diplomas/admin/diploma.py:59 apps/homework/models/question.py:19
+#: src/apps/diplomas/admin/diploma.py:59
+#: src/apps/homework/models/question.py:19
msgid "Homework"
msgstr "Домашка"
-#: apps/diplomas/admin/diploma.py:63 apps/orders/admin/orders/admin.py:93
+#: src/apps/diplomas/admin/diploma.py:63
+#: src/apps/orders/admin/orders/admin.py:93
msgid "Date"
msgstr "Дата"
-#: apps/diplomas/admin/diploma.py:67
+#: src/apps/diplomas/admin/diploma.py:67
msgid "Send diploma to student"
msgstr "Отправить студенту"
-#: apps/diplomas/admin/diploma.py:74
+#: src/apps/diplomas/admin/diploma.py:74
msgid "Regenerate diploma"
msgstr "Перегенерировать"
-#: apps/diplomas/admin/study.py:30
+#: src/apps/diplomas/admin/study.py:30
msgid "RU diploma exists"
msgstr "Есть диплом на русском"
-#: apps/diplomas/admin/study.py:36
+#: src/apps/diplomas/admin/study.py:36
msgid "EN diploma exists"
msgstr "Есть диплом на английском"
-#: apps/diplomas/apps.py:9 apps/diplomas/apps.py:10 apps/diplomas/models.py:70
+#: src/apps/diplomas/apps.py:9 src/apps/diplomas/apps.py:10
+#: src/apps/diplomas/models.py:70
msgid "Diplomas"
msgstr "Дипломы"
-#: apps/diplomas/models.py:20
+#: src/apps/diplomas/models.py:20
msgid "Russian"
msgstr "Русский"
-#: apps/diplomas/models.py:21
+#: src/apps/diplomas/models.py:21
msgid "English"
msgstr "Английский"
-#: apps/diplomas/models.py:51 apps/studying/models.py:21
+#: src/apps/diplomas/models.py:51 src/apps/studying/models.py:21
msgid "Study"
msgstr "Студент-курс"
-#: apps/diplomas/models.py:53
+#: src/apps/diplomas/models.py:53
msgid "Language"
msgstr "Язык"
-#: apps/diplomas/models.py:54
+#: src/apps/diplomas/models.py:54
msgid "Image"
msgstr "Обложка"
-#: apps/diplomas/models.py:66
+#: src/apps/diplomas/models.py:66
msgid "May access diplomas of all students"
msgstr "Видит все дипломы"
-#: apps/diplomas/models.py:69
+#: src/apps/diplomas/models.py:69
msgid "Diploma"
msgstr "Диплом"
-#: apps/diplomas/models.py:95
+#: src/apps/diplomas/models.py:95
msgid "Check out https://is.gd/eutOYr for available templates"
msgstr "Шаблоны искать в https://is.gd/eutOYr"
-#: apps/diplomas/models.py:97
+#: src/apps/diplomas/models.py:97
msgid "This template is for students that have completed the homework"
msgstr "Для тех, кто сдал домашку"
-#: apps/diplomas/models.py:100
+#: src/apps/diplomas/models.py:100
msgid "Diploma template"
msgstr "Шаблон диплома"
-#: apps/diplomas/models.py:101
+#: src/apps/diplomas/models.py:101
msgid "Diploma templates"
msgstr "Шаблоны дипломов"
-#: apps/diplomas/models.py:117
+#: src/apps/diplomas/models.py:117
msgid "Manual upload"
msgstr "Ручная загрузка"
-#: apps/diplomas/models.py:118
+#: src/apps/diplomas/models.py:118
msgid "Manual uploads"
msgstr "Ручные загрузки"
-#: apps/homework/admin/answer/admin.py:64
+#: src/apps/homework/admin/answer/admin.py:64
msgid "Crosschecking people"
msgstr "Учеников проверяет"
-#: apps/homework/admin/answer/admin.py:69
-#: apps/homework/admin/answer/admin.py:112 apps/orders/models/refund.py:27
+#: src/apps/homework/admin/answer/admin.py:69
+#: src/apps/homework/admin/answer/admin.py:112
+#: src/apps/orders/models/refund.py:27
msgid "Author"
msgstr "Автор"
-#: apps/homework/admin/answer/admin.py:108
+#: src/apps/homework/admin/answer/admin.py:108
msgid "Question"
msgstr "Вопрос"
-#: apps/homework/admin/answer/admin.py:116
+#: src/apps/homework/admin/answer/admin.py:116
msgid "View"
msgstr ""
-#: apps/homework/admin/answer/filters.py:9
+#: src/apps/homework/admin/answer/filters.py:9
msgid "Is root answer"
msgstr "Первый ответ"
-#: apps/homework/admin/question/admin.py:29
+#: src/apps/homework/admin/question/admin.py:29
msgid "Dispatch crosscheck"
msgstr "Запустить p2p-проверку домашки"
-#: apps/homework/models/answer.py:82
+#: src/apps/homework/models/answer.py:82
msgid "Exclude from cross-checking"
msgstr "Исключить из p2p-проверки"
-#: apps/homework/models/answer.py:87
+#: src/apps/homework/models/answer.py:87
msgid "Homework answer"
msgstr "Ответ на домашку"
-#: apps/homework/models/answer.py:88
+#: src/apps/homework/models/answer.py:88
msgid "Homework answers"
msgstr "Ответы на домашку"
-#: apps/homework/models/answer.py:91
+#: src/apps/homework/models/answer.py:91
msgid "May see answers from every user"
msgstr "Видит все ответы на домашку"
-#: apps/homework/models/answer_cross_check.py:11
+#: src/apps/homework/models/answer_cross_check.py:29
msgid "Date when crosscheck got checked"
msgstr "Когда проверен"
-#: apps/homework/models/question.py:20
+#: src/apps/homework/models/question.py:20
msgid "Homeworks"
msgstr "Домашки"
-#: apps/homework/models/question.py:22
+#: src/apps/homework/models/question.py:22
msgid "May see questions for all homeworks"
msgstr "Видит все вопросы домашки"
-#: apps/homework/models/reaction.py:26
+#: src/apps/homework/models/reaction.py:26
msgid "Reaction"
msgstr "Реакция"
-#: apps/homework/models/reaction.py:27
+#: src/apps/homework/models/reaction.py:27
msgid "Reactions"
msgstr "Реакции"
-#: apps/homework/services/reaction_creator.py:50
+#: src/apps/homework/services/reaction_creator.py:50
msgid "Invalid emoji symbol"
msgstr "Неверный символ emoji"
-#: apps/homework/services/reaction_creator.py:55
+#: src/apps/homework/services/reaction_creator.py:55
#, python-brace-format
msgid ""
"Only {Reaction.MAX_REACTIONS_FROM_ONE_AUTHOR} reactions per answer are "
@@ -260,361 +266,364 @@ msgstr ""
"Только {Reaction.MAX_REACTIONS_FROM_ONE_AUTHOR} реакций на ответ разрешено "
"для одного пользователя."
-#: apps/magnets/admin.py:31
+#: src/apps/magnets/admin.py:31
msgid "Lead count"
msgstr "Количество лидов"
-#: apps/magnets/apps.py:8
+#: src/apps/magnets/apps.py:8
msgid "Magnets"
msgstr "Лид-магниты"
-#: apps/magnets/models.py:23
+#: src/apps/magnets/models.py:23
msgid "Letter template id"
msgstr "ID почтового шаблона"
-#: apps/magnets/models.py:23
+#: src/apps/magnets/models.py:23
msgid "Will be sent upon amocrm_lead registration"
msgstr "Автоматически уходит юзеру, когда он зарегился"
-#: apps/magnets/models.py:25
+#: src/apps/magnets/models.py:25
msgid "Success Message"
msgstr "Сообщение об успехе"
-#: apps/magnets/models.py:25
+#: src/apps/magnets/models.py:25
msgid "Will be shown under tilda form"
msgstr "Покажется под формой в тильде"
-#: apps/magnets/models.py:28
+#: src/apps/magnets/models.py:28
msgid "Email Lead Magnet Campaign"
msgstr "Почтовая кампания"
-#: apps/magnets/models.py:29
+#: src/apps/magnets/models.py:29
msgid "Email Lead Magnet Campaigns"
msgstr "Почтовые кампании"
-#: apps/mailing/models/configuration.py:11
+#: src/apps/mailing/models/configuration.py:11
msgid "Unset"
msgstr "Дефолтный"
-#: apps/mailing/models/configuration.py:12
+#: src/apps/mailing/models/configuration.py:12
msgid "Postmark"
msgstr ""
-#: apps/mailing/models/configuration.py:16
+#: src/apps/mailing/models/configuration.py:16
msgid "Email sender"
msgstr "Отправитель"
-#: apps/mailing/models/configuration.py:16
+#: src/apps/mailing/models/configuration.py:16
msgid "E.g. Fedor Borshev <fedor@borshev.com>. MUST configure postmark!"
msgstr ""
-#: apps/mailing/models/configuration.py:17
+#: src/apps/mailing/models/configuration.py:17
msgid "Reply-to header"
msgstr "Reply-to"
-#: apps/mailing/models/configuration.py:17
+#: src/apps/mailing/models/configuration.py:17
msgid "E.g. Fedor Borshev <fedor@borshev.com>"
msgstr ""
-#: apps/mailing/models/configuration.py:22
+#: src/apps/mailing/models/configuration.py:22
msgid "Email configuration"
msgstr "Способ отсылки"
-#: apps/mailing/models/configuration.py:23
+#: src/apps/mailing/models/configuration.py:23
msgid "Email configurations"
msgstr "Способы отсылки"
-#: apps/mailing/models/personal_email_domain.py:10
+#: src/apps/mailing/models/personal_email_domain.py:10
msgid "Personal email domain"
msgstr "Домен личного email"
-#: apps/mailing/models/personal_email_domain.py:11
+#: src/apps/mailing/models/personal_email_domain.py:11
msgid "Personal email domains"
msgstr "Домены личных email"
-#: apps/notion/models/asset.py:11
+#: src/apps/notion/admin.py:66 src/apps/notion/models/material.py:43
+msgid "Our page id"
+msgstr "ID страницы LMS"
+
+#: src/apps/notion/models/asset.py:11
msgid "Image size in bytes"
msgstr ""
-#: apps/notion/models/asset.py:15
+#: src/apps/notion/models/asset.py:15
#, fuzzy
#| msgid "Notion page id"
msgid "Notion asset"
msgstr "ID страницы в ноушене"
-#: apps/notion/models/asset.py:16
-#, fuzzy
-#| msgid "Notion materials"
+#: src/apps/notion/models/asset.py:16
msgid "Notion assets"
-msgstr "Материалы"
+msgstr "Файлы"
-#: apps/notion/models/material.py:45
+#: src/apps/notion/models/material.py:45
msgid "Page title"
msgstr "Заголовок страницы"
-#: apps/notion/models/material.py:45
+#: src/apps/notion/models/material.py:45
msgid "Will be fetched automatically if empty"
msgstr "Если не указать — попробуем скачать из ноушена"
-#: apps/notion/models/material.py:47
+#: src/apps/notion/models/material.py:47
msgid "Notion page id"
msgstr "ID страницы в ноушене"
-#: apps/notion/models/material.py:47
-#, fuzzy
-#| msgid "Paste it from notion address bar"
-msgid "Paste it from apps.notion address bar"
+#: src/apps/notion/models/material.py:47
+msgid "Paste it from notion address bar"
msgstr "Скопируйте адрес из строки браузера"
-#: apps/notion/models/material.py:48 apps/orders/admin/promocodes/admin.py:14
-#: apps/orders/admin/promocodes/admin.py:71 apps/orders/models/promocode.py:48
+#: src/apps/notion/models/material.py:48
+#: src/apps/orders/admin/promocodes/admin.py:14
+#: src/apps/orders/admin/promocodes/admin.py:71
+#: src/apps/orders/models/promocode.py:48
msgid "Active"
msgstr "Включено"
-#: apps/notion/models/material.py:49
+#: src/apps/notion/models/material.py:49
msgid "Is home page of the course"
msgstr "Главная страница курса"
-#: apps/notion/models/material.py:52
+#: src/apps/notion/models/material.py:52
msgid "Notion material"
msgstr "Материал"
-#: apps/notion/models/material.py:53
+#: src/apps/notion/models/material.py:53
msgid "Notion materials"
msgstr "Материалы"
-#: apps/notion/models/material.py:58
+#: src/apps/notion/models/material.py:58
msgid "May access materials from every course"
msgstr "Видит страницы ноушена от всех курсов"
-#: apps/notion/models/material_file.py:10
+#: src/apps/notion/models/material_file.py:10
msgid "Material file"
msgstr "Файл"
-#: apps/notion/models/material_file.py:11
+#: src/apps/notion/models/material_file.py:11
msgid "Material files"
msgstr "Файлы"
-#: apps/orders/admin/orders/actions.py:21
+#: src/apps/orders/admin/orders/actions.py:21
msgid "Set paid"
msgstr "Пометить оплаченным"
-#: apps/orders/admin/orders/actions.py:29 apps/orders/models/refund.py:31
+#: src/apps/orders/admin/orders/actions.py:29
+#: src/apps/orders/models/refund.py:31
msgid "Refund"
msgstr "Сделать полный возврат"
-#: apps/orders/admin/orders/actions.py:44
+#: src/apps/orders/admin/orders/actions.py:44
#, python-brace-format
msgid "Orders {refunded_orders_as_message} refunded."
msgstr "Заказы {refunded_orders_as_message} возвращены."
-#: apps/orders/admin/orders/actions.py:50
+#: src/apps/orders/admin/orders/actions.py:50
#, python-brace-format
msgid "Some orders have not been refunded: {error_messages}"
msgstr ""
-#: apps/orders/admin/orders/actions.py:55
+#: src/apps/orders/admin/orders/actions.py:55
msgid "Ship without payments"
msgstr "Допустить до уроков без оплаты"
-#: apps/orders/admin/orders/actions.py:72
+#: src/apps/orders/admin/orders/actions.py:72
msgid "Ship again if paid"
msgstr "Ещё раз выполнить (если заказ не оплачен — не выполнится)"
-#: apps/orders/admin/orders/actions.py:85
-#: apps/products/admin/courses/actions.py:40
+#: src/apps/orders/admin/orders/actions.py:85
+#: src/apps/products/admin/courses/actions.py:40
msgid "Generate diplomas"
msgstr "Сгенерировать дипломы"
-#: apps/orders/admin/orders/actions.py:95
+#: src/apps/orders/admin/orders/actions.py:95
msgid "Accept homework"
msgstr "Засчитать домашку"
-#: apps/orders/admin/orders/actions.py:110
+#: src/apps/orders/admin/orders/actions.py:110
msgid "Disaccept homework"
msgstr "Не засчитать домашку"
-#: apps/orders/admin/orders/admin.py:89 apps/orders/models/order.py:45
-#: apps/products/admin/course.py:34
+#: src/apps/orders/admin/orders/admin.py:89 src/apps/orders/models/order.py:45
+#: src/apps/products/admin/course.py:34
msgid "Price"
msgstr "Цена"
-#: apps/orders/admin/orders/admin.py:97 apps/orders/models/order.py:44
+#: src/apps/orders/admin/orders/admin.py:97 src/apps/orders/models/order.py:44
msgid "User"
msgstr "Юзер"
-#: apps/orders/admin/orders/admin.py:101
+#: src/apps/orders/admin/orders/admin.py:101
msgid "Item"
msgstr "Товар"
-#: apps/orders/admin/orders/admin.py:105
+#: src/apps/orders/admin/orders/admin.py:105
msgid "Payment"
msgstr "Оплата"
-#: apps/orders/admin/orders/admin.py:109
+#: src/apps/orders/admin/orders/admin.py:109
msgid "Login as customer"
msgstr "Зайти от имени студента"
-#: apps/orders/admin/orders/filters.py:13
+#: src/apps/orders/admin/orders/filters.py:13
msgctxt "orders"
msgid "status"
msgstr "Статус"
-#: apps/orders/admin/orders/filters.py:18
+#: src/apps/orders/admin/orders/filters.py:18
msgid "Not paid"
msgstr "Не оплачен"
-#: apps/orders/admin/orders/filters.py:19
+#: src/apps/orders/admin/orders/filters.py:19
msgid "Paid"
msgstr "Оплачен"
-#: apps/orders/admin/orders/filters.py:20 apps/orders/human_readable.py:19
+#: src/apps/orders/admin/orders/filters.py:20
+#: src/apps/orders/human_readable.py:19
msgid "Shipped without payment"
msgstr "Ждём денег"
-#: apps/orders/admin/orders/forms.py:11 apps/users/admin/student.py:13
+#: src/apps/orders/admin/orders/forms.py:11 src/apps/users/admin/student.py:13
msgid "Email"
msgstr "Почта"
-#: apps/orders/admin/orders/forms.py:11 apps/orders/admin/orders/forms.py:17
+#: src/apps/orders/admin/orders/forms.py:11
+#: src/apps/orders/admin/orders/forms.py:17
msgid "User receives new welcome letter"
msgstr "Студент заново получит все письма"
-#: apps/orders/admin/promocodes/actions.py:10
+#: src/apps/orders/admin/promocodes/actions.py:10
msgid "Deactivate selected promo codes"
msgstr "Деактивировать выбранные промо-коды"
-#: apps/orders/admin/promocodes/admin.py:54
+#: src/apps/orders/admin/promocodes/admin.py:54
msgid "Order count"
msgstr "Заказов"
-#: apps/orders/admin/promocodes/admin.py:61
+#: src/apps/orders/admin/promocodes/admin.py:61
msgid "Discount"
msgstr "Скидка"
-#: apps/orders/admin/refunds/admin.py:20
+#: src/apps/orders/admin/refunds/admin.py:20
msgid "Partial refund"
msgstr "Частичный возврат"
-#: apps/orders/admin/refunds/admin.py:21
+#: src/apps/orders/admin/refunds/admin.py:21
msgid "Partial refunds"
msgstr "Возвраты"
-#: apps/orders/human_readable.py:14
+#: src/apps/orders/human_readable.py:14
msgid "B2B"
msgstr ""
-#: apps/orders/human_readable.py:16
+#: src/apps/orders/human_readable.py:16
msgid "Is paid"
msgstr "Оплачен"
-#: apps/orders/models/order.py:43
+#: src/apps/orders/models/order.py:43
msgid "Order author"
msgstr "Продавец"
-#: apps/orders/models/order.py:46 apps/orders/models/promocode.py:44
-#: apps/orders/models/promocode.py:54
+#: src/apps/orders/models/order.py:46 src/apps/orders/models/promocode.py:44
+#: src/apps/orders/models/promocode.py:54
msgid "Promo Code"
msgstr "Промо-код"
-#: apps/orders/models/order.py:49
+#: src/apps/orders/models/order.py:49
msgid "Date when order got paid"
msgstr "Когда оплачен"
-#: apps/orders/models/order.py:53
+#: src/apps/orders/models/order.py:53
msgid "Date when order was shipped"
msgstr "Дата выполнения"
-#: apps/orders/models/order.py:55
+#: src/apps/orders/models/order.py:55
msgid "User-requested bank string"
msgstr "Банк"
-#: apps/orders/models/order.py:56
+#: src/apps/orders/models/order.py:56
msgid "Purchase-time UE rate"
msgstr "Курс у.е. на момент покупки"
-#: apps/orders/models/order.py:60 apps/products/models/record.py:18
+#: src/apps/orders/models/order.py:60 src/apps/products/models/record.py:18
msgid "Record"
msgstr "Запись"
-#: apps/orders/models/order.py:61 apps/products/models/bundle.py:20
+#: src/apps/orders/models/order.py:61 src/apps/products/models/bundle.py:20
msgid "Bundle"
msgstr "Набор"
-#: apps/orders/models/order.py:70
+#: src/apps/orders/models/order.py:70
msgctxt "orders"
msgid "Order"
msgstr "Заказ"
-#: apps/orders/models/order.py:71
+#: src/apps/orders/models/order.py:71
msgctxt "orders"
msgid "Orders"
msgstr "Заказы"
-#: apps/orders/models/order.py:74
+#: src/apps/orders/models/order.py:74
msgid "May mark orders as paid"
msgstr "Отмечать заказы оплаченными"
-#: apps/orders/models/order.py:75
+#: src/apps/orders/models/order.py:75
msgid "May mark orders as unpaid"
msgstr "Возвращать заказы"
-#: apps/orders/models/promocode.py:45
+#: src/apps/orders/models/promocode.py:45
msgid "Discount percent"
msgstr "Процент скидки"
-#: apps/orders/models/promocode.py:46
+#: src/apps/orders/models/promocode.py:46
msgid "Discount amount"
msgstr "Скидка в деньгах"
-#: apps/orders/models/promocode.py:46
+#: src/apps/orders/models/promocode.py:46
msgid "Takes precedence over percent"
msgstr "Если задать — процент не будет работать"
-#: apps/orders/models/promocode.py:47
+#: src/apps/orders/models/promocode.py:47
msgid "Expiration date"
msgstr "Дата окончания"
-#: apps/orders/models/promocode.py:49
+#: src/apps/orders/models/promocode.py:49
msgid "Destination"
msgstr "Куда пойдет"
-#: apps/orders/models/promocode.py:51
+#: src/apps/orders/models/promocode.py:51
msgid "Can not be used for courses not checked here"
msgstr ""
"Если тут выбрать хоть что-нибудь, то промо-код будет действовать только для "
"этого курса"
-#: apps/orders/models/promocode.py:55
+#: src/apps/orders/models/promocode.py:55
msgid "Promo Codes"
msgstr "Промо-коды"
-#: apps/orders/models/promocode.py:62
+#: src/apps/orders/models/promocode.py:62
msgid "Percent or value must be set"
msgstr "Нужно задать или процент скидки или сумму в деньгах"
-#: apps/orders/models/refund.py:25 apps/studying/models.py:10
+#: src/apps/orders/models/refund.py:25 src/apps/studying/models.py:10
#, fuzzy
#| msgctxt "orders"
#| msgid "Order"
msgid "Order"
msgstr "Заказ"
-#: apps/orders/models/refund.py:26
+#: src/apps/orders/models/refund.py:26
msgid "Amount"
-msgstr ""
+msgstr "Сумма"
-#: apps/orders/models/refund.py:28
+#: src/apps/orders/models/refund.py:28
msgid "Order bank at the moment of refund"
msgstr ""
-#: apps/orders/models/refund.py:32
-#, fuzzy
-#| msgid "Refund"
+#: src/apps/orders/models/refund.py:32
msgid "Refunds"
-msgstr "Сделать полный возврат"
+msgstr "Возвраты"
-#: apps/orders/services/order_refunder.py:86
+#: src/apps/orders/services/order_refunder.py:86
#, fuzzy
#| msgid ""
#| "Orders {non_refunded_orders_as_message} have not been refunded. Up to 5 "
@@ -626,7 +635,7 @@ msgstr ""
"Заказы {non_refunded_orders_as_message} не были возвращены. Разрешено до 5 "
"возвратов в день, попробуйте снова завтра."
-#: apps/orders/services/order_refunder.py:88
+#: src/apps/orders/services/order_refunder.py:88
#, fuzzy
#| msgid ""
#| "Orders {non_refunded_orders_as_message} have not been refunded. Up to 5 "
@@ -638,284 +647,294 @@ msgstr ""
"Заказы {non_refunded_orders_as_message} не были возвращены. Разрешено до 5 "
"возвратов в день, попробуйте снова завтра."
-#: apps/orders/services/order_refunder.py:94
-#, fuzzy
-#| msgid "Partial refunds"
+#: src/apps/orders/services/order_refunder.py:94
msgid "Partial refund is not available"
-msgstr "Возвраты"
+msgstr "Частичные возвраты недоступны"
-#: apps/orders/services/order_refunder.py:98
+#: src/apps/orders/services/order_refunder.py:98
msgid "Only 0 can be refunded for not paid order"
msgstr ""
-#: apps/orders/services/order_refunder.py:100
+#: src/apps/orders/services/order_refunder.py:100
msgid "Amount to refund is more than available"
msgstr ""
-#: apps/orders/services/order_refunder.py:102
+#: src/apps/orders/services/order_refunder.py:102
msgid "Amount to refund should be more or equal 0"
msgstr ""
-#: apps/products/admin/course.py:43
+#: src/apps/products/admin/course.py:43
msgid "Email messages"
msgstr "Письма"
-#: apps/products/admin/course.py:52
+#: src/apps/products/admin/course.py:52
msgid "Order confirmation"
msgstr "Подтверждение покупки (для бесплатных курсов)"
-#: apps/products/admin/courses/actions.py:15
+#: src/apps/products/admin/courses/actions.py:15
msgid "Email template id"
msgstr "ID шаблона в постмарке"
-#: apps/products/admin/courses/actions.py:26
+#: src/apps/products/admin/courses/actions.py:26
msgid "Send email to all purchased_users"
msgstr "Отправить письмо всем купившим"
-#: apps/products/models/base.py:21
+#: src/apps/products/models/base.py:21
msgid "Name for receipts"
msgstr "Для чеков"
-#: apps/products/models/base.py:24
+#: src/apps/products/models/base.py:24
msgid "Full name for letters"
msgstr "Для писем"
-#: apps/products/models/base.py:28
+#: src/apps/products/models/base.py:28
msgid "Name used for international purchases"
msgstr "Название для международных покупок"
-#: apps/products/models/base.py:36
+#: src/apps/products/models/base.py:36
msgid "Fixed promo code for tinkoff credit"
msgstr "Промо-код на рассрочку в Тинькофф"
-#: apps/products/models/base.py:36
+#: src/apps/products/models/base.py:36
msgid "Used in tinkoff credit only"
msgstr ""
"Пересылается в тинькофф, если покупатель оформляет рассрочку на курс. Если "
"не заполнять — покупатель переплатит за кредит. Можно взять в админке "
"Тинькофф"
-#: apps/products/models/base.py:39 apps/products/models/group.py:13
+#: src/apps/products/models/base.py:39 src/apps/products/models/group.py:13
msgid "Analytical group"
msgstr "Группа товаров (аналитика)"
-#: apps/products/models/bundle.py:21
+#: src/apps/products/models/bundle.py:21
msgid "Bundles"
msgstr "Наборы"
-#: apps/products/models/course.py:45
+#: src/apps/products/models/course.py:45
msgid "Genitive name"
msgstr "В родительном падеже"
-#: apps/products/models/course.py:48
+#: src/apps/products/models/course.py:48
msgid "Welcome letter template id"
msgstr "ID шаблона приветственного письма"
-#: apps/products/models/course.py:48
+#: src/apps/products/models/course.py:48
msgid "Will be sent upon purchase if set"
msgstr "Если задать — письмо будет уходить вместе с каждой покупкой"
-#: apps/products/models/course.py:50
+#: src/apps/products/models/course.py:50
msgid "Display in LMS"
msgstr "Показывать в LMS"
-#: apps/products/models/course.py:50
+#: src/apps/products/models/course.py:50
msgid "If disabled will not be shown in LMS"
msgstr "Если снять галочку, студенты не будут видеть курс в LMS"
-#: apps/products/models/course.py:54
+#: src/apps/products/models/course.py:54
msgid "Disable all triggers"
msgstr "Отключить триггерные письма"
-#: apps/products/models/course.py:57
+#: src/apps/products/models/course.py:57
msgid "Confirmation template id"
msgstr "ID шаблона для письма-подтверждения"
-#: apps/products/models/course.py:61
+#: src/apps/products/models/course.py:61
msgid "If set user sill receive this message upon creating zero-priced order"
msgstr "Уходит пользователю, если он берёт бесплатный курс"
-#: apps/products/models/course.py:63
+#: src/apps/products/models/course.py:63
msgid "Confirmation success URL"
msgstr "Ссылка после успешного подтверждения"
-#: apps/products/models/course.py:66
+#: src/apps/products/models/course.py:66
msgid "Cover image"
msgstr ""
-#: apps/products/models/course.py:69
+#: src/apps/products/models/course.py:69
#, fuzzy
#| msgid "Is home page of the course"
msgid "The cover image of course"
msgstr "Главная страница курса"
-#: apps/products/models/course.py:75
+#: src/apps/products/models/course.py:75
msgid "Courses"
msgstr "Курсы"
-#: apps/products/models/course.py:84
+#: src/apps/products/models/course.py:84
msgid "Both confirmation_template_id and confirmation_success_url must be set"
msgstr ""
"У курсов с подтверждением обязательно нужно устанавливать оба поля: и "
"почтовый шаблон и ссылку для упешного подтверждения "
-#: apps/products/models/course.py:87
+#: src/apps/products/models/course.py:87
msgid "Courses with confirmation should have zero price"
msgstr ""
"Курсы с подтверждением могут быть только бесплатными. Если пользователь "
"платит деньги — это уже достаточное подтверждение"
-#: apps/products/models/group.py:14
+#: src/apps/products/models/group.py:14
msgid "Analytical groups"
msgstr "Группы товаров (аналитика)"
-#: apps/products/models/record.py:14
+#: src/apps/products/models/record.py:14
msgid "Postmark template_id"
msgstr "ID шаблона в постмарке"
-#: apps/products/models/record.py:14
+#: src/apps/products/models/record.py:14
msgid "Leave it blank for the default template"
msgstr "Если оставить пустым — будет дефолтным"
-#: apps/products/models/record.py:19
+#: src/apps/products/models/record.py:19
msgid "Records"
msgstr "Записи"
-#: apps/stripebank/bank.py:17
+#: src/apps/stripebank/bank.py:15
msgid "Stripe"
msgstr "Страйп"
-#: apps/studying/apps.py:8 apps/studying/apps.py:9
+#: src/apps/stripebank/bank.py:69
+#, fuzzy
+#| msgid "Stripe"
+msgid "Stripe USD"
+msgstr "Страйп"
+
+#: src/apps/stripebank/bank.py:78
+#, fuzzy
+#| msgid "Stripe"
+msgid "Stripe KZT"
+msgstr "Страйп"
+
+#: src/apps/studying/apps.py:8 src/apps/studying/apps.py:9
msgid "Studying"
msgstr "Студенты-курсы"
-#: apps/studying/models.py:12
+#: src/apps/studying/models.py:12
msgid "Homework accepted"
msgstr "Домашка принята"
-#: apps/studying/models.py:22
+#: src/apps/studying/models.py:22
msgid "Studies"
msgstr "Студенты-курсы"
-#: apps/tinkoff/bank.py:17
+#: src/apps/tinkoff/bank.py:17
msgid "Tinkoff"
msgstr "Тинькофф"
-#: apps/tinkoff/dolyame.py:23
+#: src/apps/tinkoff/dolyame.py:23
msgid "Dolyame"
msgstr "Долями"
-#: apps/tinkoff/models.py:10
+#: src/apps/tinkoff/models.py:10
msgid "Authorized"
msgstr ""
-#: apps/tinkoff/models.py:11
+#: src/apps/tinkoff/models.py:11
msgid "Confirmed"
msgstr ""
-#: apps/tinkoff/models.py:12
+#: src/apps/tinkoff/models.py:12
msgid "Reversed"
msgstr ""
-#: apps/tinkoff/models.py:13 apps/tinkoff/models.py:37
+#: src/apps/tinkoff/models.py:13 src/apps/tinkoff/models.py:37
msgid "Refunded"
msgstr ""
-#: apps/tinkoff/models.py:14
+#: src/apps/tinkoff/models.py:14
msgid "Partial refunded"
msgstr ""
-#: apps/tinkoff/models.py:15 apps/tinkoff/models.py:36
+#: src/apps/tinkoff/models.py:15 src/apps/tinkoff/models.py:36
msgid "Rejected"
msgstr ""
-#: apps/tinkoff/models.py:35
+#: src/apps/tinkoff/models.py:35
msgid "Approved"
msgstr ""
-#: apps/tinkoff/models.py:38
+#: src/apps/tinkoff/models.py:38
msgid "Canceled"
msgstr ""
-#: apps/tinkoff/models.py:39
+#: src/apps/tinkoff/models.py:39
#, fuzzy
#| msgid "Comment"
msgid "Committed"
msgstr "Комментарий"
-#: apps/tinkoff/models.py:40
+#: src/apps/tinkoff/models.py:40
msgid "Waiting for commit"
msgstr ""
-#: apps/tinkoff/models.py:41
+#: src/apps/tinkoff/models.py:41
msgid "Completed"
msgstr ""
-#: apps/users/admin/student.py:14
+#: src/apps/users/admin/student.py:14
msgid "first name"
msgstr "Имя"
-#: apps/users/admin/student.py:15
+#: src/apps/users/admin/student.py:15
msgid "last name"
msgstr "Фамилия"
-#: apps/users/admin/student.py:61
+#: src/apps/users/admin/student.py:61
msgid "Personal info"
msgstr "Персональные данные"
-#: apps/users/admin/student.py:62
+#: src/apps/users/admin/student.py:62
msgid "Name in english"
msgstr "Имя на английском"
-#: apps/users/apps.py:7
+#: src/apps/users/apps.py:7
msgid "Users"
msgstr "Юзеры"
-#: apps/users/models.py:21
+#: src/apps/users/models.py:21
msgid "Male"
msgstr "Мужчина"
-#: apps/users/models.py:22
+#: src/apps/users/models.py:22
msgid "Female"
msgstr "Женщина"
-#: apps/users/models.py:24
+#: src/apps/users/models.py:24
msgid "Subscribed to newsletter"
msgstr "Подписан на новости"
-#: apps/users/models.py:25
+#: src/apps/users/models.py:25
msgid "first name in english"
msgstr "Имя на английском"
-#: apps/users/models.py:26
+#: src/apps/users/models.py:26
msgid "last name in english"
msgstr "Фамилия на английском"
-#: apps/users/models.py:29
+#: src/apps/users/models.py:29
msgid "Gender"
msgstr "Пол"
-#: apps/users/models.py:37
+#: src/apps/users/models.py:37
msgid "Avatar"
msgstr "Аватар"
-#: apps/users/models.py:46
+#: src/apps/users/models.py:46
msgid "user"
msgstr "пользователь"
-#: apps/users/models.py:47
+#: src/apps/users/models.py:47
msgid "users"
msgstr "пользователи"
-#: apps/users/models.py:108
+#: src/apps/users/models.py:108
msgid "Students"
msgstr "Студенты"
-#: core/admin/filters.py:25
+#: src/core/admin/filters.py:25
msgid "Yes"
msgstr "Да"
-#: core/admin/filters.py:26
+#: src/core/admin/filters.py:26
msgid "No"
msgstr "Нет"