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 "Нет"