Merge branch 'main' into storefront-nuxt

This commit is contained in:
Egor Pavlovich Gorbunov 2025-12-18 19:36:45 +03:00
commit 3191220ee9
236 changed files with 28294 additions and 27507 deletions

View file

@ -1,6 +1,8 @@
from django.contrib.admin import register from django.contrib.admin import register
from django.db.models import TextField from django.db.models import TextField
from django_summernote.admin import SummernoteModelAdminMixin from django_summernote.admin import (
SummernoteModelAdminMixin,
)
from unfold.admin import ModelAdmin from unfold.admin import ModelAdmin
from unfold_markdown import MarkdownWidget from unfold_markdown import MarkdownWidget
@ -11,7 +13,7 @@ from engine.core.admin import ActivationActionsMixin, FieldsetsMixin
@register(Post) @register(Post)
class PostAdmin( class PostAdmin(
SummernoteModelAdminMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin SummernoteModelAdminMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
list_display = ("title", "author", "slug", "created", "modified") list_display = ("title", "author", "slug", "created", "modified")
list_filter = ("author", "tags", "created", "modified") list_filter = ("author", "tags", "created", "modified")
search_fields = ("title", "content", "slug") search_fields = ("title", "content", "slug")
@ -40,7 +42,7 @@ class PostAdmin(
@register(PostTag) @register(PostTag)
class PostTagAdmin(ModelAdmin): # type: ignore [type-arg] class PostTagAdmin(ModelAdmin):
list_display = ("tag_name", "name") list_display = ("tag_name", "name")
search_fields = ("tag_name", "name") search_fields = ("tag_name", "name")
ordering = ("tag_name",) ordering = ("tag_name",)

View file

@ -9,5 +9,5 @@ class BlogConfig(AppConfig):
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
def ready(self) -> None: def ready(self) -> None:
import engine.blog.elasticsearch.documents import engine.blog.elasticsearch.documents # noqa: F401
import engine.blog.signals # noqa: F401 import engine.blog.signals # noqa: F401

View file

@ -10,7 +10,7 @@ from engine.core.elasticsearch import (
from engine.core.elasticsearch.documents import BaseDocument from engine.core.elasticsearch.documents import BaseDocument
class PostDocument(ActiveOnlyMixin, BaseDocument): # type: ignore [misc] class PostDocument(ActiveOnlyMixin, BaseDocument):
title = fields.TextField( title = fields.TextField(
attr="title", attr="title",
analyzer="standard", analyzer="standard",

View file

@ -4,7 +4,7 @@ from engine.blog.models import Post
from engine.core.filters import CaseInsensitiveListFilter from engine.core.filters import CaseInsensitiveListFilter
class PostFilter(FilterSet): # type: ignore [misc] class PostFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact") uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
slug = CharFilter(field_name="slug", lookup_expr="exact") slug = CharFilter(field_name="slug", lookup_expr="exact")
author = UUIDFilter(field_name="author__uuid", lookup_expr="exact") author = UUIDFilter(field_name="author__uuid", lookup_expr="exact")

View file

@ -1,20 +1,20 @@
import graphene from django.http import HttpRequest
from graphene import relay from graphene import List, String, relay
from graphene_django import DjangoObjectType from graphene_django import DjangoObjectType
from engine.blog.models import Post, PostTag from engine.blog.models import Post, PostTag
class PostType(DjangoObjectType): class PostType(DjangoObjectType):
tags = graphene.List(lambda: PostTagType) tags = List(lambda: PostTagType)
content = graphene.String() content = String()
class Meta: class Meta:
model = Post model = Post
fields = ["tags", "content", "title", "slug"] fields = ["tags", "content", "title", "slug"]
interfaces = (relay.Node,) interfaces = (relay.Node,)
def resolve_content(self: Post, _info): def resolve_content(self: Post, _info: HttpRequest) -> str:
return self.content.html.replace("\n", "<br/>") return self.content.html.replace("\n", "<br/>")

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "سرد جميع المشاركات (للقراءة فقط)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "استرداد منشور واحد (للقراءة فقط)" msgstr "استرداد منشور واحد (للقراءة فقط)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -39,62 +39,62 @@ msgstr ""
"والعلامات المرتبطة بها. يفرض الصنف قيودًا مثل طلب إما محتوى أو مرفق ملف ولكن " "والعلامات المرتبطة بها. يفرض الصنف قيودًا مثل طلب إما محتوى أو مرفق ملف ولكن "
"ليس كلاهما في نفس الوقت. كما أنها تدعم إنشاء سبيكة تلقائية بناءً على العنوان." "ليس كلاهما في نفس الوقت. كما أنها تدعم إنشاء سبيكة تلقائية بناءً على العنوان."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "عنوان المنشور" msgstr "عنوان المنشور"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "العنوان" msgstr "العنوان"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "هي صفحة ثابتة" msgstr "هي صفحة ثابتة"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"هل هذا منشور لصفحة ذات عنوان URL ثابت (على سبيل المثال '/مساعدة/التسليم'؟)" "هل هذا منشور لصفحة ذات عنوان URL ثابت (على سبيل المثال '/مساعدة/التسليم'؟)"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "المنشور" msgstr "المنشور"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "المنشورات" msgstr "المنشورات"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"ملفات تخفيض السعر غير مدعومة Yer - استخدم محتوى تخفيض السعر بدلاً من ذلك!" "ملفات تخفيض السعر غير مدعومة Yer - استخدم محتوى تخفيض السعر بدلاً من ذلك!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "يجب توفير ملف ترميز أو محتوى ترميز مخفض - متنافيان" msgstr "يجب توفير ملف ترميز أو محتوى ترميز مخفض - متنافيان"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "معرّف العلامة الداخلي لعلامة المنشور" msgstr "معرّف العلامة الداخلي لعلامة المنشور"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "اسم العلامة" msgstr "اسم العلامة"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "اسم سهل الاستخدام لعلامة المنشور" msgstr "اسم سهل الاستخدام لعلامة المنشور"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "اسم عرض العلامة" msgstr "اسم عرض العلامة"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "علامة المشاركة" msgstr "علامة المشاركة"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "علامات المشاركة" msgstr "علامات المشاركة"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Seznam všech příspěvků (pouze pro čtení)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Získání jednoho příspěvku (pouze pro čtení)" msgstr "Získání jednoho příspěvku (pouze pro čtení)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -40,65 +40,65 @@ msgstr ""
"je požadavek na obsah nebo přílohu souboru, ale ne obojí současně. Podporuje " "je požadavek na obsah nebo přílohu souboru, ale ne obojí současně. Podporuje "
"také automatické generování slugu na základě názvu." "také automatické generování slugu na základě názvu."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Název příspěvku" msgstr "Název příspěvku"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Název" msgstr "Název"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "je statická stránka" msgstr "je statická stránka"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"je to příspěvek pro stránku se statickou adresou URL (např. `/help/" "je to příspěvek pro stránku se statickou adresou URL (např. `/help/"
"delivery`)?" "delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Příspěvek" msgstr "Příspěvek"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Příspěvky" msgstr "Příspěvky"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"Soubory Markdown nejsou podporovány - místo toho použijte obsah Markdown!" "Soubory Markdown nejsou podporovány - místo toho použijte obsah Markdown!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"musí být poskytnut soubor markdown nebo obsah markdown - vzájemně se " "musí být poskytnut soubor markdown nebo obsah markdown - vzájemně se "
"vylučují." "vylučují."
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "interní identifikátor tagu pro tag příspěvku" msgstr "interní identifikátor tagu pro tag příspěvku"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Název štítku" msgstr "Název štítku"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Uživatelsky přívětivý název pro značku příspěvku" msgstr "Uživatelsky přívětivý název pro značku příspěvku"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Zobrazení názvu štítku" msgstr "Zobrazení názvu štítku"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Označení příspěvku" msgstr "Označení příspěvku"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Štítky příspěvků" msgstr "Štítky příspěvků"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Vis alle indlæg (skrivebeskyttet)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Hent et enkelt indlæg (skrivebeskyttet)" msgstr "Hent et enkelt indlæg (skrivebeskyttet)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,62 +41,62 @@ msgstr ""
"ikke begge dele på samme tid. Den understøtter også automatisk generering af " "ikke begge dele på samme tid. Den understøtter også automatisk generering af "
"slugs baseret på titlen." "slugs baseret på titlen."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Indlæggets titel" msgstr "Indlæggets titel"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Titel" msgstr "Titel"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "er en statisk side" msgstr "er en statisk side"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"Er dette et indlæg til en side med statisk URL (f.eks. `/help/delivery`)?" "Er dette et indlæg til en side med statisk URL (f.eks. `/help/delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Indlæg" msgstr "Indlæg"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Indlæg" msgstr "Indlæg"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "Markdown-filer understøttes ikke - brug markdown-indhold i stedet!" msgstr "Markdown-filer understøttes ikke - brug markdown-indhold i stedet!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"en markdown-fil eller markdown-indhold skal leveres - gensidigt udelukkende" "en markdown-fil eller markdown-indhold skal leveres - gensidigt udelukkende"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "intern tag-identifikator for indlægs-tagget" msgstr "intern tag-identifikator for indlægs-tagget"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Tag-navn" msgstr "Tag-navn"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Brugervenligt navn til posttagget" msgstr "Brugervenligt navn til posttagget"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Navn på tag-visning" msgstr "Navn på tag-visning"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Tag til indlæg" msgstr "Tag til indlæg"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Tags til indlæg" msgstr "Tags til indlæg"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Alle Beiträge auflisten (schreibgeschützt)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Einen einzelnen Beitrag abrufen (schreibgeschützt)" msgstr "Einen einzelnen Beitrag abrufen (schreibgeschützt)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -42,66 +42,66 @@ msgstr ""
"unterstützt auch die automatische Slug-Generierung auf der Grundlage des " "unterstützt auch die automatische Slug-Generierung auf der Grundlage des "
"Titels." "Titels."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Titel des Beitrags" msgstr "Titel des Beitrags"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Titel" msgstr "Titel"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "ist eine statische Seite" msgstr "ist eine statische Seite"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"Ist dies ein Beitrag für eine Seite mit statischer URL (z. B. `/help/" "Ist dies ein Beitrag für eine Seite mit statischer URL (z. B. `/help/"
"delivery`)?" "delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Beitrag" msgstr "Beitrag"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Beiträge" msgstr "Beiträge"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"Markdown-Dateien werden nicht unterstützt - verwenden Sie stattdessen " "Markdown-Dateien werden nicht unterstützt - verwenden Sie stattdessen "
"Markdown-Inhalte!" "Markdown-Inhalte!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"eine Markdown-Datei oder ein Markdown-Inhalt muss bereitgestellt werden - " "eine Markdown-Datei oder ein Markdown-Inhalt muss bereitgestellt werden - "
"beide schließen sich gegenseitig aus" "beide schließen sich gegenseitig aus"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "interner Tag-Bezeichner für den Post-Tag" msgstr "interner Tag-Bezeichner für den Post-Tag"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Tag name" msgstr "Tag name"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Benutzerfreundlicher Name für das Post-Tag" msgstr "Benutzerfreundlicher Name für das Post-Tag"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Tag-Anzeigename" msgstr "Tag-Anzeigename"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Tag eintragen" msgstr "Tag eintragen"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Tags eintragen" msgstr "Tags eintragen"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -29,7 +29,7 @@ msgstr "List all posts (read-only)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Retrieve a single post (read-only)" msgstr "Retrieve a single post (read-only)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -45,61 +45,61 @@ msgstr ""
"both simultaneously. It also supports automatic slug generation based on the " "both simultaneously. It also supports automatic slug generation based on the "
"title." "title."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Post's title" msgstr "Post's title"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Title" msgstr "Title"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "is static page" msgstr "is static page"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgstr "is this a post for a page with static URL (e.g. `/help/delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Post" msgstr "Post"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Posts" msgstr "Posts"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "Markdown files are not supported yer - use markdown content instead!" msgstr "Markdown files are not supported yer - use markdown content instead!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "internal tag identifier for the post tag" msgstr "internal tag identifier for the post tag"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Tag name" msgstr "Tag name"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "User-friendly name for the post tag" msgstr "User-friendly name for the post tag"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Tag display name" msgstr "Tag display name"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Post tag" msgstr "Post tag"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Post tags" msgstr "Post tags"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "List all posts (read-only)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Retrieve a single post (read-only)" msgstr "Retrieve a single post (read-only)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,61 +41,61 @@ msgstr ""
"both simultaneously. It also supports automatic slug generation based on the " "both simultaneously. It also supports automatic slug generation based on the "
"title." "title."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Post's title" msgstr "Post's title"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Title" msgstr "Title"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "is static page" msgstr "is static page"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgstr "is this a post for a page with static URL (e.g. `/help/delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Post" msgstr "Post"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Posts" msgstr "Posts"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "Markdown files are not supported yer - use markdown content instead!" msgstr "Markdown files are not supported yer - use markdown content instead!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "internal tag identifier for the post tag" msgstr "internal tag identifier for the post tag"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Tag name" msgstr "Tag name"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "User-friendly name for the post tag" msgstr "User-friendly name for the post tag"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Tag display name" msgstr "Tag display name"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Post tag" msgstr "Post tag"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Post tags" msgstr "Post tags"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Listar todos los mensajes (sólo lectura)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Recuperar una única entrada (sólo lectura)" msgstr "Recuperar una única entrada (sólo lectura)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,65 +41,65 @@ msgstr ""
"adjunto, pero no ambos simultáneamente. También admite la generación " "adjunto, pero no ambos simultáneamente. También admite la generación "
"automática de slug a partir del título." "automática de slug a partir del título."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Título del mensaje" msgstr "Título del mensaje"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Título" msgstr "Título"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "es una página estática" msgstr "es una página estática"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"¿se trata de una entrada para una página con URL estática (por ejemplo, `/" "¿se trata de una entrada para una página con URL estática (por ejemplo, `/"
"help/delivery`)?" "help/delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Publicar en" msgstr "Publicar en"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Puestos" msgstr "Puestos"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"No se admiten archivos Markdown - ¡utiliza contenido Markdown en su lugar!" "No se admiten archivos Markdown - ¡utiliza contenido Markdown en su lugar!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"se debe proporcionar un archivo markdown o contenido markdown - mutuamente " "se debe proporcionar un archivo markdown o contenido markdown - mutuamente "
"excluyentes" "excluyentes"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "identificador interno de la etiqueta post" msgstr "identificador interno de la etiqueta post"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Nombre de la etiqueta" msgstr "Nombre de la etiqueta"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Nombre fácil de usar para la etiqueta de la entrada" msgstr "Nombre fácil de usar para la etiqueta de la entrada"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Nombre de la etiqueta" msgstr "Nombre de la etiqueta"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Etiqueta postal" msgstr "Etiqueta postal"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Etiquetas" msgstr "Etiquetas"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -28,7 +28,7 @@ msgstr ""
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "" msgstr ""
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -38,60 +38,60 @@ msgid ""
"title." "title."
msgstr "" msgstr ""
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "" msgstr ""
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "" msgstr ""
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "" msgstr ""
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "" msgstr ""
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "" msgstr ""
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "" msgstr ""
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "" msgstr ""
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "" msgstr ""

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Liste de tous les messages (en lecture seule)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Récupérer un seul message (en lecture seule)" msgstr "Récupérer un seul message (en lecture seule)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -42,66 +42,66 @@ msgstr ""
"simultanément. Elle prend également en charge la génération automatique " "simultanément. Elle prend également en charge la génération automatique "
"d'une balise en fonction du titre." "d'une balise en fonction du titre."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Titre du message" msgstr "Titre du message"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Titre" msgstr "Titre"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "est une page statique" msgstr "est une page statique"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"s'agit-il d'un message pour une page dont l'URL est statique (par exemple `/" "s'agit-il d'un message pour une page dont l'URL est statique (par exemple `/"
"help/delivery`) ?" "help/delivery`) ?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Poste" msgstr "Poste"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Postes" msgstr "Postes"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"Les fichiers Markdown ne sont pas pris en charge - utilisez plutôt du " "Les fichiers Markdown ne sont pas pris en charge - utilisez plutôt du "
"contenu Markdown !" "contenu Markdown !"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"un fichier markdown ou un contenu markdown doit être fourni - ils s'excluent " "un fichier markdown ou un contenu markdown doit être fourni - ils s'excluent "
"mutuellement" "mutuellement"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "identifiant interne de la balise post" msgstr "identifiant interne de la balise post"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Nom du jour" msgstr "Nom du jour"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Nom convivial pour la balise post" msgstr "Nom convivial pour la balise post"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Nom d'affichage de l'étiquette" msgstr "Nom d'affichage de l'étiquette"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Tag de poste" msgstr "Tag de poste"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Tags de la poste" msgstr "Tags de la poste"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "הצג את כל ההודעות (לקריאה בלבד)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "איתור פוסט בודד (לקריאה בלבד)" msgstr "איתור פוסט בודד (לקריאה בלבד)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -39,60 +39,60 @@ msgstr ""
"ותגיות נלוות. המחלקה אוכפת אילוצים כגון דרישה לתוכן או לקובץ מצורף, אך לא " "ותגיות נלוות. המחלקה אוכפת אילוצים כגון דרישה לתוכן או לקובץ מצורף, אך לא "
"לשניהם בו-זמנית. היא תומכת גם ביצירה אוטומטית של slug על סמך הכותרת." "לשניהם בו-זמנית. היא תומכת גם ביצירה אוטומטית של slug על סמך הכותרת."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "כותרת הפוסט" msgstr "כותרת הפוסט"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "כותרת" msgstr "כותרת"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "הוא דף סטטי" msgstr "הוא דף סטטי"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "האם זו הודעה לדף עם כתובת URL סטטית (למשל `/help/delivery`)?" msgstr "האם זו הודעה לדף עם כתובת URL סטטית (למשל `/help/delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "פוסט" msgstr "פוסט"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "פוסטים" msgstr "פוסטים"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "קובצי Markdown אינם נתמכים עדיין - השתמש בתוכן Markdown במקום!" msgstr "קובצי Markdown אינם נתמכים עדיין - השתמש בתוכן Markdown במקום!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "יש לספק קובץ markdown או תוכן markdown - באופן בלעדי" msgstr "יש לספק קובץ markdown או תוכן markdown - באופן בלעדי"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "מזהה תגיות פנימי עבור תגיות הפוסט" msgstr "מזהה תגיות פנימי עבור תגיות הפוסט"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "שם היום" msgstr "שם היום"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "שם ידידותי למשתמש עבור תגיות הפוסט" msgstr "שם ידידותי למשתמש עבור תגיות הפוסט"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "שם תצוגה של התג" msgstr "שם תצוגה של התג"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "תגית פוסט" msgstr "תגית פוסט"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "תגיות פוסט" msgstr "תגיות פוסט"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -28,7 +28,7 @@ msgstr ""
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "" msgstr ""
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -38,60 +38,60 @@ msgid ""
"title." "title."
msgstr "" msgstr ""
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "" msgstr ""
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "" msgstr ""
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "" msgstr ""
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "" msgstr ""
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "" msgstr ""
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "" msgstr ""
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "" msgstr ""
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "" msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -28,7 +28,7 @@ msgstr ""
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "" msgstr ""
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -38,60 +38,60 @@ msgid ""
"title." "title."
msgstr "" msgstr ""
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "" msgstr ""
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "" msgstr ""
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "" msgstr ""
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "" msgstr ""
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "" msgstr ""
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "" msgstr ""
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "" msgstr ""
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "" msgstr ""

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Daftar semua postingan (hanya-baca)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Mengambil satu postingan (hanya-baca)" msgstr "Mengambil satu postingan (hanya-baca)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,66 +41,66 @@ msgstr ""
"secara bersamaan. Kelas ini juga mendukung pembuatan slug otomatis " "secara bersamaan. Kelas ini juga mendukung pembuatan slug otomatis "
"berdasarkan judul." "berdasarkan judul."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Judul postingan" msgstr "Judul postingan"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Judul" msgstr "Judul"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "adalah halaman statis" msgstr "adalah halaman statis"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"apakah ini adalah postingan untuk halaman dengan URL statis (misalnya `/help/" "apakah ini adalah postingan untuk halaman dengan URL statis (misalnya `/help/"
"pengiriman`)?" "pengiriman`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Pos" msgstr "Pos"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Posting" msgstr "Posting"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"File penurunan harga tidak didukung - gunakan konten penurunan harga sebagai " "File penurunan harga tidak didukung - gunakan konten penurunan harga sebagai "
"gantinya!" "gantinya!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"file penurunan harga atau konten penurunan harga harus disediakan - tidak " "file penurunan harga atau konten penurunan harga harus disediakan - tidak "
"boleh ada yang sama" "boleh ada yang sama"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "pengidentifikasi tag internal untuk tag pos" msgstr "pengidentifikasi tag internal untuk tag pos"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Nama tag" msgstr "Nama tag"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Nama yang mudah digunakan untuk tag postingan" msgstr "Nama yang mudah digunakan untuk tag postingan"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Nama tampilan tag" msgstr "Nama tampilan tag"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Tag pos" msgstr "Tag pos"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Tag pos" msgstr "Tag pos"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Elenco di tutti i messaggi (solo lettura)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Recuperare un singolo post (solo lettura)" msgstr "Recuperare un singolo post (solo lettura)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,64 +41,64 @@ msgstr ""
"di un file allegato, ma non di entrambi contemporaneamente. Supporta anche " "di un file allegato, ma non di entrambi contemporaneamente. Supporta anche "
"la generazione automatica dello slug in base al titolo." "la generazione automatica dello slug in base al titolo."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Titolo del post" msgstr "Titolo del post"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Titolo" msgstr "Titolo"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "è una pagina statica" msgstr "è una pagina statica"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"Si tratta di un post per una pagina con URL statico (ad esempio `/help/" "Si tratta di un post per una pagina con URL statico (ad esempio `/help/"
"delivery`)?" "delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Posta" msgstr "Posta"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Messaggi" msgstr "Messaggi"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "I file Markdown non sono supportati: usa invece i contenuti Markdown!" msgstr "I file Markdown non sono supportati: usa invece i contenuti Markdown!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"deve essere fornito un file markdown o un contenuto markdown - si escludono " "deve essere fornito un file markdown o un contenuto markdown - si escludono "
"a vicenda" "a vicenda"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "identificatore interno del tag post" msgstr "identificatore interno del tag post"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Nome del tag" msgstr "Nome del tag"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Nome intuitivo per il tag del post" msgstr "Nome intuitivo per il tag del post"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Nome del tag" msgstr "Nome del tag"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Post tag" msgstr "Post tag"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Tag dei post" msgstr "Tag dei post"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "すべての投稿をリストアップする(読み取り専用)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "単一の投稿を取得する(読み取り専用)" msgstr "単一の投稿を取得する(読み取り専用)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -40,64 +40,64 @@ msgstr ""
"時に要求しないといった制約を強制します。また、タイトルに基づくスラッグの自動" "時に要求しないといった制約を強制します。また、タイトルに基づくスラッグの自動"
"生成もサポートしています。" "生成もサポートしています。"
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "投稿タイトル" msgstr "投稿タイトル"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "タイトル" msgstr "タイトル"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "は静的ページ" msgstr "は静的ページ"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "これは静的URLのページ`/help/delivery`)への投稿ですか?" msgstr "これは静的URLのページ`/help/delivery`)への投稿ですか?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "ポスト" msgstr "ポスト"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "投稿" msgstr "投稿"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"マークダウン・ファイルはサポートされていません - 代わりにマークダウン・コンテ" "マークダウン・ファイルはサポートされていません - 代わりにマークダウン・コンテ"
"ンツを使用してください!" "ンツを使用してください!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"マークダウン・ファイルまたはマークダウン・コンテンツを提供しなければならな" "マークダウン・ファイルまたはマークダウン・コンテンツを提供しなければならな"
"い。" "い。"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "投稿タグの内部タグ識別子" msgstr "投稿タグの内部タグ識別子"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "タグ名" msgstr "タグ名"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "投稿タグのユーザーフレンドリーな名前" msgstr "投稿タグのユーザーフレンドリーな名前"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "タグ表示名" msgstr "タグ表示名"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "投稿タグ" msgstr "投稿タグ"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "投稿タグ" msgstr "投稿タグ"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -28,7 +28,7 @@ msgstr ""
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "" msgstr ""
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -38,60 +38,60 @@ msgid ""
"title." "title."
msgstr "" msgstr ""
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "" msgstr ""
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "" msgstr ""
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "" msgstr ""
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "" msgstr ""
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "" msgstr ""
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "" msgstr ""
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "" msgstr ""
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "" msgstr ""
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "" msgstr ""

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "모든 게시물 나열(읽기 전용)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "단일 게시물 검색(읽기 전용)" msgstr "단일 게시물 검색(읽기 전용)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -40,61 +40,61 @@ msgstr ""
"둘 다 동시에 요구하지 않는 등의 제약 조건을 적용합니다. 또한 제목에 따른 자" "둘 다 동시에 요구하지 않는 등의 제약 조건을 적용합니다. 또한 제목에 따른 자"
"동 슬러그 생성도 지원합니다." "동 슬러그 생성도 지원합니다."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "게시물 제목" msgstr "게시물 제목"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "제목" msgstr "제목"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "는 정적 페이지입니다." msgstr "는 정적 페이지입니다."
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "정적 URL(예: `/help/delivery`)이 있는 페이지의 게시물인가요?" msgstr "정적 URL(예: `/help/delivery`)이 있는 페이지의 게시물인가요?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "게시물" msgstr "게시물"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "게시물" msgstr "게시물"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"마크다운 파일은 지원되지 않습니다 예 - 대신 마크다운 콘텐츠를 사용하세요!" "마크다운 파일은 지원되지 않습니다 예 - 대신 마크다운 콘텐츠를 사용하세요!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "마크다운 파일 또는 마크다운 콘텐츠가 제공되어야 합니다." msgstr "마크다운 파일 또는 마크다운 콘텐츠가 제공되어야 합니다."
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "게시물 태그의 내부 태그 식별자" msgstr "게시물 태그의 내부 태그 식별자"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "태그 이름" msgstr "태그 이름"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "게시물 태그의 사용자 친화적인 이름" msgstr "게시물 태그의 사용자 친화적인 이름"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "태그 표시 이름" msgstr "태그 표시 이름"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "게시물 태그" msgstr "게시물 태그"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "게시물 태그" msgstr "게시물 태그"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Alle berichten weergeven (alleen-lezen)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Een enkel bericht ophalen (alleen-lezen)" msgstr "Een enkel bericht ophalen (alleen-lezen)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,66 +41,66 @@ msgstr ""
"maar niet beide tegelijk. Het ondersteunt ook het automatisch genereren van " "maar niet beide tegelijk. Het ondersteunt ook het automatisch genereren van "
"slugs op basis van de titel." "slugs op basis van de titel."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Titel van de post" msgstr "Titel van de post"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Titel" msgstr "Titel"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "is statische pagina" msgstr "is statische pagina"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"Is dit een bericht voor een pagina met een statische URL (bijv. `/help/" "Is dit een bericht voor een pagina met een statische URL (bijv. `/help/"
"delivery`)?" "delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Plaats" msgstr "Plaats"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Berichten" msgstr "Berichten"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"Markdown-bestanden worden niet ondersteund - gebruik in plaats daarvan " "Markdown-bestanden worden niet ondersteund - gebruik in plaats daarvan "
"markdown-inhoud!" "markdown-inhoud!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"er moet een markdown-bestand of markdown-inhoud worden geleverd - wederzijds " "er moet een markdown-bestand of markdown-inhoud worden geleverd - wederzijds "
"exclusief" "exclusief"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "interne tagidentifier voor de posttag" msgstr "interne tagidentifier voor de posttag"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Tag naam" msgstr "Tag naam"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Gebruiksvriendelijke naam voor de posttag" msgstr "Gebruiksvriendelijke naam voor de posttag"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Tag weergavenaam" msgstr "Tag weergavenaam"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Post tag" msgstr "Post tag"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Post tags" msgstr "Post tags"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Liste over alle innlegg (skrivebeskyttet)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Hent et enkelt innlegg (skrivebeskyttet)" msgstr "Hent et enkelt innlegg (skrivebeskyttet)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,62 +41,62 @@ msgstr ""
"må være med, men ikke begge deler samtidig. Den støtter også automatisk " "må være med, men ikke begge deler samtidig. Den støtter også automatisk "
"generering av slug basert på tittelen." "generering av slug basert på tittelen."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Innleggets tittel" msgstr "Innleggets tittel"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Title" msgstr "Title"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "er statisk side" msgstr "er statisk side"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"er dette et innlegg for en side med statisk URL (f.eks. `/help/delivery`)?" "er dette et innlegg for en side med statisk URL (f.eks. `/help/delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Post" msgstr "Post"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Innlegg" msgstr "Innlegg"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "Markdown-filer støttes ikke - bruk markdown-innhold i stedet!" msgstr "Markdown-filer støttes ikke - bruk markdown-innhold i stedet!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"en markdown-fil eller markdown-innhold må oppgis - gjensidig utelukkende" "en markdown-fil eller markdown-innhold må oppgis - gjensidig utelukkende"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "intern tagg-identifikator for innleggstaggen" msgstr "intern tagg-identifikator for innleggstaggen"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Tagg navn" msgstr "Tagg navn"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Brukervennlig navn for innleggstaggen" msgstr "Brukervennlig navn for innleggstaggen"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Visningsnavn for taggen" msgstr "Visningsnavn for taggen"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Post tag" msgstr "Post tag"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Tagger for innlegg" msgstr "Tagger for innlegg"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Lista wszystkich postów (tylko do odczytu)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Pobieranie pojedynczego wpisu (tylko do odczytu)" msgstr "Pobieranie pojedynczego wpisu (tylko do odczytu)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,64 +41,64 @@ msgstr ""
"nie obu jednocześnie. Obsługuje również automatyczne generowanie slug na " "nie obu jednocześnie. Obsługuje również automatyczne generowanie slug na "
"podstawie tytułu." "podstawie tytułu."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Tytuł postu" msgstr "Tytuł postu"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Tytuł" msgstr "Tytuł"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "jest stroną statyczną" msgstr "jest stroną statyczną"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"Czy jest to post dla strony ze statycznym adresem URL (np. `/help/delivery`)?" "Czy jest to post dla strony ze statycznym adresem URL (np. `/help/delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Post" msgstr "Post"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Posty" msgstr "Posty"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"Pliki Markdown nie są obsługiwane - zamiast tego użyj zawartości Markdown!" "Pliki Markdown nie są obsługiwane - zamiast tego użyj zawartości Markdown!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"należy dostarczyć plik markdown lub zawartość markdown - wzajemnie się " "należy dostarczyć plik markdown lub zawartość markdown - wzajemnie się "
"wykluczające" "wykluczające"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "wewnętrzny identyfikator tagu posta" msgstr "wewnętrzny identyfikator tagu posta"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Nazwa tagu" msgstr "Nazwa tagu"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Przyjazna dla użytkownika nazwa tagu posta" msgstr "Przyjazna dla użytkownika nazwa tagu posta"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Wyświetlana nazwa znacznika" msgstr "Wyświetlana nazwa znacznika"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Tag posta" msgstr "Tag posta"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Tagi postów" msgstr "Tagi postów"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Listar todas as postagens (somente leitura)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Recuperar um único post (somente leitura)" msgstr "Recuperar um único post (somente leitura)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,64 +41,64 @@ msgstr ""
"simultaneamente. Ela também oferece suporte à geração automática de slug com " "simultaneamente. Ela também oferece suporte à geração automática de slug com "
"base no título." "base no título."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Título da postagem" msgstr "Título da postagem"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Título" msgstr "Título"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "é uma página estática" msgstr "é uma página estática"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"Essa é uma postagem para uma página com URL estático (por exemplo, `/help/" "Essa é uma postagem para uma página com URL estático (por exemplo, `/help/"
"delivery`)?" "delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Postar" msgstr "Postar"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Publicações" msgstr "Publicações"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"Os arquivos markdown não são suportados - use conteúdo markdown em vez disso!" "Os arquivos markdown não são suportados - use conteúdo markdown em vez disso!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"um arquivo ou conteúdo de markdown deve ser fornecido - mutuamente exclusivo" "um arquivo ou conteúdo de markdown deve ser fornecido - mutuamente exclusivo"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "identificador de tag interno para a tag de postagem" msgstr "identificador de tag interno para a tag de postagem"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Nome da etiqueta" msgstr "Nome da etiqueta"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Nome de fácil utilização para a tag de postagem" msgstr "Nome de fácil utilização para a tag de postagem"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Nome de exibição da tag" msgstr "Nome de exibição da tag"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Etiqueta de postagem" msgstr "Etiqueta de postagem"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Tags de postagem" msgstr "Tags de postagem"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Listează toate postările (doar pentru citire)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Recuperează o singură postare (read-only)" msgstr "Recuperează o singură postare (read-only)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,65 +41,65 @@ msgstr ""
"fișier atașat, dar nu ambele simultan. De asemenea, acceptă generarea " "fișier atașat, dar nu ambele simultan. De asemenea, acceptă generarea "
"automată a slug-ului pe baza titlului." "automată a slug-ului pe baza titlului."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Titlul postului" msgstr "Titlul postului"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Titlul" msgstr "Titlul"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "este o pagină statică" msgstr "este o pagină statică"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"este aceasta o postare pentru o pagină cu URL static (de exemplu `/help/" "este aceasta o postare pentru o pagină cu URL static (de exemplu `/help/"
"delivery`)?" "delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Post" msgstr "Post"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Mesaje" msgstr "Mesaje"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"Fișierele Markdown nu sunt acceptate - utilizați în schimb conținut Markdown!" "Fișierele Markdown nu sunt acceptate - utilizați în schimb conținut Markdown!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"trebuie furnizat un fișier markdown sau conținut markdown - se exclud " "trebuie furnizat un fișier markdown sau conținut markdown - se exclud "
"reciproc" "reciproc"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "identificator intern de etichetă pentru eticheta postului" msgstr "identificator intern de etichetă pentru eticheta postului"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Nume etichetă" msgstr "Nume etichetă"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Nume ușor de utilizat pentru eticheta postului" msgstr "Nume ușor de utilizat pentru eticheta postului"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Nume afișare etichetă" msgstr "Nume afișare etichetă"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Etichetă post" msgstr "Etichetă post"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Etichete poștale" msgstr "Etichete poștale"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Список всех сообщений (только для чтени
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Получение одного сообщения (только для чтения)" msgstr "Получение одного сообщения (только для чтения)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,65 +41,65 @@ msgstr ""
"вложение файла, но не то и другое одновременно. Он также поддерживает " "вложение файла, но не то и другое одновременно. Он также поддерживает "
"автоматическую генерацию slug на основе заголовка." "автоматическую генерацию slug на основе заголовка."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Заголовок сообщения" msgstr "Заголовок сообщения"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Название" msgstr "Название"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "это статическая страница" msgstr "это статическая страница"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"Это сообщение для страницы со статическим URL (например, `/help/delivery`)?" "Это сообщение для страницы со статическим URL (например, `/help/delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Пост" msgstr "Пост"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Посты" msgstr "Посты"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"Файлы в формате Markdown не поддерживаются - используйте вместо них " "Файлы в формате Markdown не поддерживаются - используйте вместо них "
"содержимое в формате Markdown!" "содержимое в формате Markdown!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"необходимо предоставить файл разметки или содержимое разметки - " "необходимо предоставить файл разметки или содержимое разметки - "
"взаимоисключающие варианты" "взаимоисключающие варианты"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "внутренний идентификатор тега для тега post" msgstr "внутренний идентификатор тега для тега post"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Название тега" msgstr "Название тега"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Удобное для пользователя название тега поста" msgstr "Удобное для пользователя название тега поста"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Отображаемое имя тега" msgstr "Отображаемое имя тега"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Тэг поста" msgstr "Тэг поста"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Тэги постов" msgstr "Тэги постов"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Lista alla inlägg (skrivskyddad)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Hämta ett enskilt inlägg (skrivskyddat)" msgstr "Hämta ett enskilt inlägg (skrivskyddat)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,63 +41,63 @@ msgstr ""
"filbilaga krävs, men inte båda samtidigt. Den stöder också automatisk " "filbilaga krävs, men inte båda samtidigt. Den stöder också automatisk "
"sluggenerering baserat på titeln." "sluggenerering baserat på titeln."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Inläggets titel" msgstr "Inläggets titel"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Titel" msgstr "Titel"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "är statisk sida" msgstr "är statisk sida"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"är detta ett inlägg för en sida med statisk URL (t.ex. `/help/delivery`)?" "är detta ett inlägg för en sida med statisk URL (t.ex. `/help/delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Post" msgstr "Post"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Inlägg" msgstr "Inlägg"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "Markdown-filer stöds inte - använd markdown-innehåll istället!" msgstr "Markdown-filer stöds inte - använd markdown-innehåll istället!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"en markdown-fil eller markdown-innehåll måste tillhandahållas - ömsesidigt " "en markdown-fil eller markdown-innehåll måste tillhandahållas - ömsesidigt "
"uteslutande" "uteslutande"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "intern taggidentifierare för inläggstaggen" msgstr "intern taggidentifierare för inläggstaggen"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Tagg namn" msgstr "Tagg namn"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Användarvänligt namn för inläggstaggen" msgstr "Användarvänligt namn för inläggstaggen"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Taggens visningsnamn" msgstr "Taggens visningsnamn"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Post tagg" msgstr "Post tagg"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Taggar för inlägg" msgstr "Taggar för inlägg"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "แสดงรายการโพสต์ทั้งหมด (อ
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "ดึงโพสต์เดียว (อ่านอย่างเดียว)" msgstr "ดึงโพสต์เดียว (อ่านอย่างเดียว)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -39,60 +39,60 @@ msgstr ""
"และแท็กที่เกี่ยวข้อง คลาสนี้บังคับใช้ข้อจำกัด เช่น ต้องมีเนื้อหาหรือไฟล์แนบอย่างใดอย่างหนึ่ง " "และแท็กที่เกี่ยวข้อง คลาสนี้บังคับใช้ข้อจำกัด เช่น ต้องมีเนื้อหาหรือไฟล์แนบอย่างใดอย่างหนึ่ง "
"แต่ไม่สามารถมีทั้งสองอย่างพร้อมกันได้ นอกจากนี้ยังรองรับการสร้าง slug โดยอัตโนมัติจากชื่อเรื่อง" "แต่ไม่สามารถมีทั้งสองอย่างพร้อมกันได้ นอกจากนี้ยังรองรับการสร้าง slug โดยอัตโนมัติจากชื่อเรื่อง"
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "ชื่อโพสต์" msgstr "ชื่อโพสต์"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "ชื่อเรื่อง" msgstr "ชื่อเรื่อง"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "เป็นหน้าคงที่" msgstr "เป็นหน้าคงที่"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "นี่คือโพสต์สำหรับหน้าที่มี URL แบบคงที่ (เช่น `/help/delivery`)?" msgstr "นี่คือโพสต์สำหรับหน้าที่มี URL แบบคงที่ (เช่น `/help/delivery`)?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "โพสต์" msgstr "โพสต์"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "โพสต์" msgstr "โพสต์"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "ไฟล์มาร์กดาวน์ยังไม่รองรับในตอนนี้ - กรุณาใช้เนื้อหาแบบมาร์กดาวน์แทน!" msgstr "ไฟล์มาร์กดาวน์ยังไม่รองรับในตอนนี้ - กรุณาใช้เนื้อหาแบบมาร์กดาวน์แทน!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "ไฟล์มาร์กดาวน์หรือเนื้อหาแบบมาร์กดาวน์ต้องได้รับการจัดเตรียมไว้ - ไม่สามารถใช้ร่วมกันได้" msgstr "ไฟล์มาร์กดาวน์หรือเนื้อหาแบบมาร์กดาวน์ต้องได้รับการจัดเตรียมไว้ - ไม่สามารถใช้ร่วมกันได้"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "ตัวระบุแท็กภายในสำหรับแท็กโพสต์" msgstr "ตัวระบุแท็กภายในสำหรับแท็กโพสต์"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "ชื่อวัน" msgstr "ชื่อวัน"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "ชื่อที่ใช้งานได้ง่ายสำหรับแท็กโพสต์" msgstr "ชื่อที่ใช้งานได้ง่ายสำหรับแท็กโพสต์"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "แสดงชื่อแท็ก" msgstr "แสดงชื่อแท็ก"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "โพสต์แท็ก" msgstr "โพสต์แท็ก"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "ป้ายกำกับโพสต์" msgstr "ป้ายกำกับโพสต์"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Tüm gönderileri listele (salt okunur)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Tek bir gönderiyi al (salt okunur)" msgstr "Tek bir gönderiyi al (salt okunur)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -41,65 +41,65 @@ msgstr ""
"kısıtlamalar uygular. Ayrıca başlığa dayalı otomatik slug oluşturmayı da " "kısıtlamalar uygular. Ayrıca başlığa dayalı otomatik slug oluşturmayı da "
"destekler." "destekler."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Gönderinin başlığı" msgstr "Gönderinin başlığı"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Başlık" msgstr "Başlık"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "statik sayfadır" msgstr "statik sayfadır"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"Bu, statik URL'ye sahip bir sayfa (örneğin `/help/delivery`) için bir " "Bu, statik URL'ye sahip bir sayfa (örneğin `/help/delivery`) için bir "
"gönderi mi?" "gönderi mi?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Posta" msgstr "Posta"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Mesajlar" msgstr "Mesajlar"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"Markdown dosyaları desteklenmiyor yer - bunun yerine markdown içeriği " "Markdown dosyaları desteklenmiyor yer - bunun yerine markdown içeriği "
"kullanın!" "kullanın!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"bir markdown dosyası veya markdown içeriği sağlanmalıdır - birbirini dışlayan" "bir markdown dosyası veya markdown içeriği sağlanmalıdır - birbirini dışlayan"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "gönderi etiketi için dahili etiket tanımlayıcısı" msgstr "gönderi etiketi için dahili etiket tanımlayıcısı"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Etiket adı" msgstr "Etiket adı"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Gönderi etiketi için kullanıcı dostu ad" msgstr "Gönderi etiketi için kullanıcı dostu ad"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Etiket görünen adı" msgstr "Etiket görünen adı"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Mesaj etiketi" msgstr "Mesaj etiketi"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Gönderi etiketleri" msgstr "Gönderi etiketleri"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "Danh sách tất cả các bài đăng (chỉ đọc)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "Lấy một bài đăng duy nhất (chỉ đọc)" msgstr "Lấy một bài đăng duy nhất (chỉ đọc)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -40,65 +40,65 @@ msgstr ""
"ràng buộc như yêu cầu phải có nội dung hoặc tệp đính kèm nhưng không cả hai " "ràng buộc như yêu cầu phải có nội dung hoặc tệp đính kèm nhưng không cả hai "
"cùng lúc. Nó cũng hỗ trợ tạo slug tự động dựa trên tiêu đề." "cùng lúc. Nó cũng hỗ trợ tạo slug tự động dựa trên tiêu đề."
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "Tiêu đề bài đăng" msgstr "Tiêu đề bài đăng"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "Tiêu đề" msgstr "Tiêu đề"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "là trang tĩnh" msgstr "là trang tĩnh"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "" msgstr ""
"Đây có phải là bài đăng cho một trang có URL tĩnh (ví dụ: `/help/delivery`) " "Đây có phải là bài đăng cho một trang có URL tĩnh (ví dụ: `/help/delivery`) "
"không?" "không?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "Bài đăng" msgstr "Bài đăng"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "Bài đăng" msgstr "Bài đăng"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "" msgstr ""
"Tệp Markdown hiện chưa được hỗ trợ - hãy sử dụng nội dung Markdown thay thế!" "Tệp Markdown hiện chưa được hỗ trợ - hãy sử dụng nội dung Markdown thay thế!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "" msgstr ""
"Phải cung cấp tệp Markdown hoặc nội dung Markdown - hai tùy chọn này là " "Phải cung cấp tệp Markdown hoặc nội dung Markdown - hai tùy chọn này là "
"tương phản nhau." "tương phản nhau."
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "Mã định danh thẻ nội bộ cho thẻ bài viết" msgstr "Mã định danh thẻ nội bộ cho thẻ bài viết"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "Tên ngày" msgstr "Tên ngày"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "Tên thân thiện với người dùng cho thẻ bài viết" msgstr "Tên thân thiện với người dùng cho thẻ bài viết"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "Hiển thị tên thẻ" msgstr "Hiển thị tên thẻ"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "Thẻ bài viết" msgstr "Thẻ bài viết"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "Thẻ bài viết" msgstr "Thẻ bài viết"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-06-16 08:59+0100\n" "PO-Revision-Date: 2025-06-16 08:59+0100\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n" "Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "列出所有帖子(只读)"
msgid "retrieve a single post (read-only)" msgid "retrieve a single post (read-only)"
msgstr "检索单个帖子(只读)" msgstr "检索单个帖子(只读)"
#: engine/blog/models.py:13 #: engine/blog/models.py:20
msgid "" msgid ""
"Represents a blog post model. The Post class defines the structure and " "Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, " "behavior of a blog post. It includes attributes for author, title, content, "
@ -38,60 +38,60 @@ msgstr ""
"附件、标签和相关标记的属性。该类可强制执行一些限制条件,如要求提供内容或文件" "附件、标签和相关标记的属性。该类可强制执行一些限制条件,如要求提供内容或文件"
"附件,但不能同时提供这两种内容。它还支持根据标题自动生成标签。" "附件,但不能同时提供这两种内容。它还支持根据标题自动生成标签。"
#: engine/blog/models.py:24 #: engine/blog/models.py:41
msgid "post title" msgid "post title"
msgstr "帖子标题" msgstr "帖子标题"
#: engine/blog/models.py:24 #: engine/blog/models.py:42
msgid "title" msgid "title"
msgstr "标题" msgstr "标题"
#: engine/blog/models.py:69 #: engine/blog/models.py:89
msgid "is static page" msgid "is static page"
msgstr "是静态页面" msgstr "是静态页面"
#: engine/blog/models.py:70 #: engine/blog/models.py:91
msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?" msgid "is this a post for a page with static URL (e.g. `/help/delivery`)?"
msgstr "这是静态 URL 页面(如 `/help/delivery`)的帖子吗?" msgstr "这是静态 URL 页面(如 `/help/delivery`)的帖子吗?"
#: engine/blog/models.py:77 #: engine/blog/models.py:99
msgid "post" msgid "post"
msgstr "职位" msgstr "职位"
#: engine/blog/models.py:78 #: engine/blog/models.py:100
msgid "posts" msgid "posts"
msgstr "职位" msgstr "职位"
#: engine/blog/models.py:82 #: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead" msgid "markdown files are not supported yet - use markdown content instead"
msgstr "不支持 Markdown 文件,请使用 Markdown 内容!" msgstr "不支持 Markdown 文件,请使用 Markdown 内容!"
#: engine/blog/models.py:84 #: engine/blog/models.py:110
msgid "" msgid ""
"a markdown file or markdown content must be provided - mutually exclusive" "a markdown file or markdown content must be provided - mutually exclusive"
msgstr "必须提供标记符文件或标记符内容 - 相互排斥" msgstr "必须提供标记符文件或标记符内容 - 相互排斥"
#: engine/blog/models.py:116 #: engine/blog/models.py:144
msgid "internal tag identifier for the post tag" msgid "internal tag identifier for the post tag"
msgstr "职位标签的内部标签标识符" msgstr "职位标签的内部标签标识符"
#: engine/blog/models.py:117 #: engine/blog/models.py:145
msgid "tag name" msgid "tag name"
msgstr "标签名称" msgstr "标签名称"
#: engine/blog/models.py:121 #: engine/blog/models.py:149
msgid "user-friendly name for the post tag" msgid "user-friendly name for the post tag"
msgstr "方便用户使用的帖子标签名称" msgstr "方便用户使用的帖子标签名称"
#: engine/blog/models.py:122 #: engine/blog/models.py:150
msgid "tag display name" msgid "tag display name"
msgstr "标签显示名称" msgstr "标签显示名称"
#: engine/blog/models.py:130 #: engine/blog/models.py:158
msgid "post tag" msgid "post tag"
msgstr "职位标签" msgstr "职位标签"
#: engine/blog/models.py:131 #: engine/blog/models.py:159
msgid "post tags" msgid "post tags"
msgstr "帖子标签" msgstr "帖子标签"

View file

@ -15,8 +15,8 @@ from markdown_field import MarkdownField
from engine.core.abstract import NiceModel from engine.core.abstract import NiceModel
class Post(NiceModel): # type: ignore [django-manager-missing] class Post(NiceModel):
__doc__ = _( # type: ignore [assignment] __doc__ = _( # pyright: ignore[reportUnknownVariableType]
"Represents a blog post model. " "Represents a blog post model. "
"The Post class defines the structure and behavior of a blog post. " "The Post class defines the structure and behavior of a blog post. "
"It includes attributes for author, title, content, optional file attachment, slug, and associated tags. " "It includes attributes for author, title, content, optional file attachment, slug, and associated tags. "

View file

@ -11,8 +11,8 @@ from engine.core.permissions import EvibesPermission
@extend_schema_view(**POST_SCHEMA) @extend_schema_view(**POST_SCHEMA)
class PostViewSet(ReadOnlyModelViewSet): # type: ignore [type-arg] class PostViewSet(ReadOnlyModelViewSet):
__doc__ = _( # type: ignore [assignment] __doc__ = _(
"Encapsulates operations for managing and retrieving Post entities in a read-only model view set. " "Encapsulates operations for managing and retrieving Post entities in a read-only model view set. "
"This class is tailored to handle Post objects that are active and allows filtration based on defined " "This class is tailored to handle Post objects that are active and allows filtration based on defined "
"filters. It integrates with Django's backend filtering system and ensures operations align with the " "filters. It integrates with Django's backend filtering system and ensures operations align with the "

View file

@ -24,12 +24,12 @@ class NiceModel(Model):
) )
created = CreationDateTimeField( created = CreationDateTimeField(
_("created"), help_text=_("when the object first appeared on the database") _("created"), help_text=_("when the object first appeared on the database")
) # type: ignore [no-untyped-call] )
modified = ModificationDateTimeField( modified = ModificationDateTimeField(
_("modified"), help_text=_("when the object was last modified") _("modified"), help_text=_("when the object was last modified")
) # type: ignore [no-untyped-call] )
def save( # type: ignore [override] def save(
self, self,
*, *,
force_insert: bool = False, force_insert: bool = False,

View file

@ -31,6 +31,7 @@ from mptt.admin import DraggableMPTTAdmin
from unfold.admin import ModelAdmin, TabularInline from unfold.admin import ModelAdmin, TabularInline
from unfold.contrib.import_export.forms import ExportForm, ImportForm from unfold.contrib.import_export.forms import ExportForm, ImportForm
from unfold.decorators import action from unfold.decorators import action
from unfold.typing import FieldsetsType
from unfold.widgets import UnfoldAdminSelectWidget, UnfoldAdminTextInputWidget from unfold.widgets import UnfoldAdminSelectWidget, UnfoldAdminTextInputWidget
from engine.core.forms import ( from engine.core.forms import (
@ -70,9 +71,7 @@ class FieldsetsMixin:
additional_fields: list[str] | None = [] additional_fields: list[str] | None = []
model: ClassVar[Type[Model]] model: ClassVar[Type[Model]]
def get_fieldsets( def get_fieldsets(self, request: HttpRequest, obj: Any = None) -> FieldsetsType:
self, request: HttpRequest, obj: Any = None
) -> list[tuple[str, dict[str, list[str]]]]:
if request: if request:
pass pass
@ -82,8 +81,8 @@ class FieldsetsMixin:
fieldsets = [] fieldsets = []
def add_translations_fieldset( def add_translations_fieldset(
fss: list[tuple[str, dict[str, list[str]]]], fss: FieldsetsType,
) -> list[tuple[str, dict[str, list[str]]]]: ) -> FieldsetsType:
with suppress(NotRegistered): with suppress(NotRegistered):
transoptions = translator.get_options_for_model(self.model) transoptions = translator.get_options_for_model(self.model)
translation_fields = [] translation_fields = []
@ -95,7 +94,7 @@ class FieldsetsMixin:
_("translations"), _("translations"),
{"classes": ["tab"], "fields": translation_fields}, {"classes": ["tab"], "fields": translation_fields},
) )
] # type: ignore [list-item] ]
return fss return fss
if self.general_fields: if self.general_fields:
@ -140,8 +139,8 @@ class FieldsetsMixin:
ts.append(name) ts.append(name)
if ts: if ts:
fieldsets.append((_("timestamps"), {"classes": ["tab"], "fields": ts})) fieldsets.append((_("timestamps"), {"classes": ["tab"], "fields": ts}))
fieldsets = add_translations_fieldset(fieldsets) # type: ignore [arg-type, assignment] fieldsets = add_translations_fieldset(fieldsets)
return fieldsets # type: ignore [return-value] return fieldsets
# noinspection PyUnresolvedReferences # noinspection PyUnresolvedReferences
@ -161,14 +160,14 @@ class ActivationActionsMixin:
def activate_selected(self, request: HttpRequest, queryset: QuerySet[Any]) -> None: def activate_selected(self, request: HttpRequest, queryset: QuerySet[Any]) -> None:
try: try:
queryset.update(is_active=True) queryset.update(is_active=True)
self.message_user( # type: ignore [attr-defined] self.message_user(
request=request, request=request,
message=_("selected items have been activated.").lower(), message=_("selected items have been activated.").lower(),
level=messages.SUCCESS, level=messages.SUCCESS,
) )
except Exception as e: except Exception as e:
self.message_user(request=request, message=str(e), level=messages.ERROR) # type: ignore [attr-defined] self.message_user(request=request, message=str(e), level=messages.ERROR)
@action( @action(
description=_("deactivate selected %(verbose_name_plural)s").lower(), description=_("deactivate selected %(verbose_name_plural)s").lower(),
@ -179,17 +178,17 @@ class ActivationActionsMixin:
) -> None: ) -> None:
try: try:
queryset.update(is_active=False) queryset.update(is_active=False)
self.message_user( # type: ignore [attr-defined] self.message_user(
request=request, request=request,
message=_("selected items have been deactivated.").lower(), message=_("selected items have been deactivated.").lower(),
level=messages.SUCCESS, level=messages.SUCCESS,
) )
except Exception as e: except Exception as e:
self.message_user(request=request, message=str(e), level=messages.ERROR) # type: ignore [attr-defined] self.message_user(request=request, message=str(e), level=messages.ERROR)
class AttributeValueInline(TabularInline): # type: ignore [type-arg] class AttributeValueInline(TabularInline):
model = AttributeValue model = AttributeValue
extra = 0 extra = 0
autocomplete_fields = ["attribute"] autocomplete_fields = ["attribute"]
@ -201,7 +200,7 @@ class AttributeValueInline(TabularInline): # type: ignore [type-arg]
return super().get_queryset(request).select_related("attribute", "product") return super().get_queryset(request).select_related("attribute", "product")
class ProductImageInline(TabularInline): # type: ignore [type-arg] class ProductImageInline(TabularInline):
model = ProductImage model = ProductImage
extra = 0 extra = 0
tab = True tab = True
@ -212,7 +211,7 @@ class ProductImageInline(TabularInline): # type: ignore [type-arg]
return super().get_queryset(request).select_related("product") return super().get_queryset(request).select_related("product")
class StockInline(TabularInline): # type: ignore [type-arg] class StockInline(TabularInline):
model = Stock model = Stock
extra = 0 extra = 0
form = StockForm form = StockForm
@ -224,7 +223,7 @@ class StockInline(TabularInline): # type: ignore [type-arg]
return super().get_queryset(request).select_related("vendor", "product") return super().get_queryset(request).select_related("vendor", "product")
class OrderProductInline(TabularInline): # type: ignore [type-arg] class OrderProductInline(TabularInline):
model = OrderProduct model = OrderProduct
extra = 0 extra = 0
readonly_fields = ("product", "quantity", "buy_price") readonly_fields = ("product", "quantity", "buy_price")
@ -242,7 +241,7 @@ class OrderProductInline(TabularInline): # type: ignore [type-arg]
) )
class CategoryChildrenInline(TabularInline): # type: ignore [type-arg] class CategoryChildrenInline(TabularInline):
model = Category model = Category
fk_name = "parent" fk_name = "parent"
extra = 0 extra = 0
@ -255,9 +254,9 @@ class CategoryChildrenInline(TabularInline): # type: ignore [type-arg]
@register(AttributeGroup) @register(AttributeGroup)
class AttributeGroupAdmin( class AttributeGroupAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = AttributeGroup # type: ignore [misc] model = AttributeGroup
list_display = ( list_display = (
"name", "name",
"modified", "modified",
@ -281,9 +280,9 @@ class AttributeGroupAdmin(
@register(Attribute) @register(Attribute)
class AttributeAdmin( class AttributeAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = Attribute # type: ignore [misc] model = Attribute
list_display = ( list_display = (
"name", "name",
"group", "group",
@ -320,9 +319,9 @@ class AttributeAdmin(
@register(AttributeValue) @register(AttributeValue)
class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
# noinspection PyClassVar # noinspection PyClassVar
model = AttributeValue # type: ignore [misc] model = AttributeValue
list_display = ( list_display = (
"attribute", "attribute",
"value", "value",
@ -413,9 +412,9 @@ class CategoryAdmin(
@register(Brand) @register(Brand)
class BrandAdmin( class BrandAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = Brand # type: ignore [misc] model = Brand
list_display = ( list_display = (
"name", "name",
"priority", "priority",
@ -451,9 +450,9 @@ class ProductAdmin(
ActivationActionsMixin, ActivationActionsMixin,
ModelAdmin, ModelAdmin,
ImportExportModelAdmin, ImportExportModelAdmin,
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = Product # type: ignore [misc] model = Product
list_display = ( list_display = (
"sku", "sku",
"name", "name",
@ -532,9 +531,9 @@ class ProductAdmin(
@register(ProductTag) @register(ProductTag)
class ProductTagAdmin( class ProductTagAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = ProductTag # type: ignore [misc] model = ProductTag
list_display = ("tag_name",) list_display = ("tag_name",)
search_fields = ("tag_name",) search_fields = ("tag_name",)
readonly_fields = ( readonly_fields = (
@ -552,9 +551,9 @@ class ProductTagAdmin(
@register(CategoryTag) @register(CategoryTag)
class CategoryTagAdmin( class CategoryTagAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = CategoryTag # type: ignore [misc] model = CategoryTag
list_display = ( list_display = (
"name", "name",
"tag_name", "tag_name",
@ -580,9 +579,9 @@ class CategoryTagAdmin(
@register(Vendor) @register(Vendor)
class VendorAdmin( class VendorAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = Vendor # type: ignore [misc] model = Vendor
list_display = ( list_display = (
"name", "name",
"markup_percent", "markup_percent",
@ -622,9 +621,9 @@ class VendorAdmin(
@register(Feedback) @register(Feedback)
class FeedbackAdmin( class FeedbackAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = Feedback # type: ignore [misc] model = Feedback
list_display = ( list_display = (
"order_product", "order_product",
"rating", "rating",
@ -657,9 +656,9 @@ class FeedbackAdmin(
@register(Order) @register(Order)
class OrderAdmin( class OrderAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = Order # type: ignore [misc] model = Order
list_display = ( list_display = (
"human_readable_id", "human_readable_id",
"user", "user",
@ -710,9 +709,9 @@ class OrderAdmin(
@register(OrderProduct) @register(OrderProduct)
class OrderProductAdmin( class OrderProductAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = OrderProduct # type: ignore [misc] model = OrderProduct
list_display = ( list_display = (
"order", "order",
"product", "product",
@ -750,9 +749,9 @@ class OrderProductAdmin(
@register(PromoCode) @register(PromoCode)
class PromoCodeAdmin( class PromoCodeAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = PromoCode # type: ignore [misc] model = PromoCode
list_display = ( list_display = (
"code", "code",
"discount_percent", "discount_percent",
@ -796,9 +795,9 @@ class PromoCodeAdmin(
@register(Promotion) @register(Promotion)
class PromotionAdmin( class PromotionAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = Promotion # type: ignore [misc] model = Promotion
list_display = ( list_display = (
"name", "name",
"discount_percent", "discount_percent",
@ -825,9 +824,9 @@ class PromotionAdmin(
@register(Stock) @register(Stock)
class StockAdmin( class StockAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = Stock # type: ignore [misc] model = Stock
form = StockForm form = StockForm
list_display = ( list_display = (
"product", "product",
@ -875,9 +874,9 @@ class StockAdmin(
@register(Wishlist) @register(Wishlist)
class WishlistAdmin( class WishlistAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = Wishlist # type: ignore [misc] model = Wishlist
list_display = ( list_display = (
"user", "user",
"modified", "modified",
@ -903,9 +902,9 @@ class WishlistAdmin(
@register(ProductImage) @register(ProductImage)
class ProductImageAdmin( class ProductImageAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ActivationActionsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = ProductImage # type: ignore [misc] model = ProductImage
list_display = ( list_display = (
"alt", "alt",
"product", "product",
@ -939,9 +938,9 @@ class ProductImageAdmin(
@register(Address) @register(Address)
class AddressAdmin(DjangoQLSearchMixin, FieldsetsMixin, GISModelAdmin): # type: ignore [misc] class AddressAdmin(DjangoQLSearchMixin, FieldsetsMixin, GISModelAdmin):
# noinspection PyClassVar # noinspection PyClassVar
model = Address # type: ignore [misc] model = Address
list_display = ( list_display = (
"street", "street",
"city", "city",
@ -991,9 +990,9 @@ class AddressAdmin(DjangoQLSearchMixin, FieldsetsMixin, GISModelAdmin): # type:
@register(CustomerRelationshipManagementProvider) @register(CustomerRelationshipManagementProvider)
class CustomerRelationshipManagementProviderAdmin( class CustomerRelationshipManagementProviderAdmin(
DjangoQLSearchMixin, FieldsetsMixin, ModelAdmin DjangoQLSearchMixin, FieldsetsMixin, ModelAdmin
): # type: ignore [misc, type-arg] ):
# noinspection PyClassVar # noinspection PyClassVar
model = CustomerRelationshipManagementProvider # type: ignore [misc] model = CustomerRelationshipManagementProvider
list_display = ( list_display = (
"name", "name",
"default", "default",
@ -1020,9 +1019,9 @@ class CustomerRelationshipManagementProviderAdmin(
@register(OrderCrmLink) @register(OrderCrmLink)
class OrderCrmLinkAdmin(DjangoQLSearchMixin, FieldsetsMixin, ModelAdmin): # type: ignore [misc, type-arg] class OrderCrmLinkAdmin(DjangoQLSearchMixin, FieldsetsMixin, ModelAdmin):
# noinspection PyClassVar # noinspection PyClassVar
model = OrderCrmLink # type: ignore [misc] model = OrderCrmLink
list_display = ( list_display = (
"crm_lead_id", "crm_lead_id",
"order", "order",
@ -1086,7 +1085,7 @@ class ConstanceConfig:
# noinspection PyTypeChecker # noinspection PyTypeChecker
site.unregister([Config]) site.unregister([Config])
# noinspection PyTypeChecker # noinspection PyTypeChecker
site.register([ConstanceConfig], BaseConstanceAdmin) # type: ignore [list-item] site.register([ConstanceConfig], BaseConstanceAdmin)
site.site_title = settings.PROJECT_NAME site.site_title = settings.PROJECT_NAME
site.site_header = "eVibes" site.site_header = "eVibes"
site.index_title = settings.PROJECT_NAME site.index_title = settings.PROJECT_NAME

View file

@ -434,9 +434,9 @@ def _lang_analyzer(lang_code: str) -> str:
class ActiveOnlyMixin: class ActiveOnlyMixin:
def get_queryset(self) -> QuerySet[Any]: def get_queryset(self) -> QuerySet[Any]:
return super().get_queryset().filter(is_active=True) # type: ignore [no-any-return, misc] return super().get_queryset().filter(is_active=True)
def should_index_object(self, obj) -> bool: # type: ignore [no-untyped-def] def should_index_object(self, obj) -> bool:
return getattr(obj, "is_active", False) return getattr(obj, "is_active", False)

View file

@ -13,7 +13,7 @@ from engine.core.elasticsearch import (
from engine.core.models import Brand, Category, Product from engine.core.models import Brand, Category, Product
class BaseDocument(Document): # type: ignore [misc] class BaseDocument(Document):
name = fields.TextField( name = fields.TextField(
attr="name", attr="name",
analyzer="standard", analyzer="standard",
@ -197,7 +197,7 @@ add_multilang_fields(BrandDocument)
registry.register_document(BrandDocument) registry.register_document(BrandDocument)
class TestModelDocument(Document): # type: ignore [misc] class TestModelDocument(Document):
class Index: class Index:
name = "testmodels" name = "testmodels"

View file

@ -51,7 +51,7 @@ from engine.core.models import (
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class CaseInsensitiveListFilter(BaseInFilter, CharFilter): # type: ignore [misc] class CaseInsensitiveListFilter(BaseInFilter, CharFilter):
def filter(self, qs: QuerySet[Any], value: Any) -> QuerySet[Any]: def filter(self, qs: QuerySet[Any], value: Any) -> QuerySet[Any]:
if not value: if not value:
return qs return qs
@ -74,7 +74,7 @@ class CaseInsensitiveListFilter(BaseInFilter, CharFilter): # type: ignore [misc
# noinspection PyUnusedLocal # noinspection PyUnusedLocal
class ProductFilter(FilterSet): # type: ignore [misc] class ProductFilter(FilterSet):
search = CharFilter(field_name="name", method="search_products", label=_("Search")) search = CharFilter(field_name="name", method="search_products", label=_("Search"))
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID")) uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID"))
name = CharFilter(lookup_expr="icontains", label=_("Name")) name = CharFilter(lookup_expr="icontains", label=_("Name"))
@ -188,7 +188,7 @@ class ProductFilter(FilterSet): # type: ignore [misc]
if not value: if not value:
return queryset return queryset
es_products = process_query(query=value, indexes=("products",)) # type: ignore es_products = process_query(query=value, indexes=("products",))
uuids = [p.get("uuid") for p in (es_products or {}).get("products", [])][:33] uuids = [p.get("uuid") for p in (es_products or {}).get("products", [])][:33]
if not uuids: if not uuids:
return queryset.none() return queryset.none()
@ -392,7 +392,7 @@ class ProductFilter(FilterSet): # type: ignore [misc]
# noinspection PyUnusedLocal # noinspection PyUnusedLocal
class OrderFilter(FilterSet): # type: ignore [misc] class OrderFilter(FilterSet):
search = CharFilter( search = CharFilter(
method="filter_search", method="filter_search",
label=_("Search (ID, product name or part number)"), label=_("Search (ID, product name or part number)"),
@ -455,7 +455,7 @@ class OrderFilter(FilterSet): # type: ignore [misc]
).distinct() ).distinct()
class WishlistFilter(FilterSet): # type: ignore [misc] class WishlistFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact") uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
user_email = CharFilter( user_email = CharFilter(
field_name="user__email", lookup_expr="iexact", label=_("User email") field_name="user__email", lookup_expr="iexact", label=_("User email")
@ -479,7 +479,7 @@ class WishlistFilter(FilterSet): # type: ignore [misc]
# noinspection PyUnusedLocal # noinspection PyUnusedLocal
class CategoryFilter(FilterSet): # type: ignore [misc] class CategoryFilter(FilterSet):
search = CharFilter( search = CharFilter(
field_name="name", method="search_categories", label=_("Search") field_name="name", method="search_categories", label=_("Search")
) )
@ -521,7 +521,7 @@ class CategoryFilter(FilterSet): # type: ignore [misc]
for category in process_query(query=value, indexes=("categories",))[ for category in process_query(query=value, indexes=("categories",))[
"categories" "categories"
] ]
] # type: ignore ]
return queryset.filter(uuid__in=uuids) return queryset.filter(uuid__in=uuids)
@ -621,7 +621,7 @@ class CategoryFilter(FilterSet): # type: ignore [misc]
# noinspection PyUnusedLocal # noinspection PyUnusedLocal
class BrandFilter(FilterSet): # type: ignore [misc] class BrandFilter(FilterSet):
search = CharFilter(field_name="name", method="search_brands", label=_("Search")) search = CharFilter(field_name="name", method="search_brands", label=_("Search"))
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact") uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
name = CharFilter(lookup_expr="icontains", label=_("Name")) name = CharFilter(lookup_expr="icontains", label=_("Name"))
@ -653,12 +653,12 @@ class BrandFilter(FilterSet): # type: ignore [misc]
uuids = [ uuids = [
brand.get("uuid") brand.get("uuid")
for brand in process_query(query=value, indexes=("brands",))["brands"] for brand in process_query(query=value, indexes=("brands",))["brands"]
] # type: ignore ]
return queryset.filter(uuid__in=uuids) return queryset.filter(uuid__in=uuids)
class FeedbackFilter(FilterSet): # type: ignore [misc] class FeedbackFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID")) uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID"))
product_uuid = UUIDFilter( product_uuid = UUIDFilter(
field_name="order_product__product__uuid", field_name="order_product__product__uuid",
@ -687,7 +687,7 @@ class FeedbackFilter(FilterSet): # type: ignore [misc]
fields = ["uuid", "product_uuid", "user_uuid", "order_by"] fields = ["uuid", "product_uuid", "user_uuid", "order_by"]
class AddressFilter(FilterSet): # type: ignore [misc] class AddressFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID")) uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID"))
user_uuid = UUIDFilter( user_uuid = UUIDFilter(
field_name="user__uuid", lookup_expr="exact", label=_("User UUID") field_name="user__uuid", lookup_expr="exact", label=_("User UUID")

View file

@ -3,7 +3,7 @@ from typing import Any
from graphene import Mutation from graphene import Mutation
class BaseMutation(Mutation): # type: ignore [misc] class BaseMutation(Mutation):
def __init__(self, *args: list[Any], **kwargs: dict[Any, Any]) -> None: def __init__(self, *args: list[Any], **kwargs: dict[Any, Any]) -> None:
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)

View file

@ -53,7 +53,7 @@ def resolve_tags(product, tag_uuids):
product.tags.set(tags) product.tags.set(tags)
class AttributeInput(InputObjectType): # type: ignore[misc] class AttributeInput(InputObjectType):
attribute_uuid = UUID(required=False, name="attributeUuid") attribute_uuid = UUID(required=False, name="attributeUuid")
group_name = String(required=False, name="groupName") group_name = String(required=False, name="groupName")
attribute_name = String(required=False, name="attributeName") attribute_name = String(required=False, name="attributeName")
@ -61,7 +61,7 @@ class AttributeInput(InputObjectType): # type: ignore[misc]
value = String(required=True) value = String(required=True)
class ProductInput(InputObjectType): # type: ignore[misc] class ProductInput(InputObjectType):
name = NonNull(String) name = NonNull(String)
description = String(required=False) description = String(required=False)
is_digital = Boolean(required=False, name="isDigital") is_digital = Boolean(required=False, name="isDigital")
@ -85,15 +85,15 @@ class CreateProduct(BaseMutation):
product = Field(ProductType) product = Field(ProductType)
@staticmethod @staticmethod
def mutate(parent, info, product_data): # type: ignore [override] def mutate(parent, info, product_data):
user = info.context.user user = info.context.user
if not user.has_perm("core.add_product"): if not user.has_perm("core.add_product"):
raise PermissionDenied(permission_denied_message) raise PermissionDenied(permission_denied_message)
category = Category.objects.get(uuid=product_data["category_uuid"]) # type: ignore[index] category = Category.objects.get(uuid=product_data["category_uuid"])
brand = None brand = None
if product_data.get("brand_uuid"): if product_data.get("brand_uuid"):
with suppress(Brand.DoesNotExist): # type: ignore[name-defined] with suppress(Brand.DoesNotExist):
brand = Brand.objects.get(uuid=product_data["brand_uuid"]) # type: ignore[index] brand = Brand.objects.get(uuid=product_data["brand_uuid"])
product = Product.objects.create( product = Product.objects.create(
name=product_data["name"], name=product_data["name"],
@ -124,7 +124,7 @@ class UpdateProduct(BaseMutation):
product = Field(ProductType) product = Field(ProductType)
@staticmethod @staticmethod
def mutate(parent, info, product_uuid, product_data): # type: ignore [override] def mutate(parent, info, product_uuid, product_data):
user = info.context.user user = info.context.user
if not user.has_perm("core.change_product"): if not user.has_perm("core.change_product"):
raise PermissionDenied(permission_denied_message) raise PermissionDenied(permission_denied_message)
@ -142,10 +142,10 @@ class UpdateProduct(BaseMutation):
updates[model_field] = product_data[field_in] updates[model_field] = product_data[field_in]
if product_data.get("category_uuid"): if product_data.get("category_uuid"):
product.category = Category.objects.get(uuid=product_data["category_uuid"]) # type: ignore[index] product.category = Category.objects.get(uuid=product_data["category_uuid"])
if product_data.get("brand_uuid") is not None: if product_data.get("brand_uuid") is not None:
if product_data.get("brand_uuid"): if product_data.get("brand_uuid"):
product.brand = Brand.objects.get(uuid=product_data["brand_uuid"]) # type: ignore[index] product.brand = Brand.objects.get(uuid=product_data["brand_uuid"])
else: else:
product.brand = None product.brand = None
@ -171,7 +171,7 @@ class DeleteProduct(BaseMutation):
ok = Boolean() ok = Boolean()
@staticmethod @staticmethod
def mutate(parent, info, product_uuid): # type: ignore [override] def mutate(parent, info, product_uuid):
user = info.context.user user = info.context.user
if not user.has_perm("core.delete_product"): if not user.has_perm("core.delete_product"):
raise PermissionDenied(permission_denied_message) raise PermissionDenied(permission_denied_message)

View file

@ -8,7 +8,6 @@ from django.http import Http404
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from graphene import UUID, Boolean, Field, Int, List, String from graphene import UUID, Boolean, Field, Int, List, String
from graphene.types.generic import GenericScalar from graphene.types.generic import GenericScalar
from graphene_django.utils import camelize
from engine.core.elasticsearch import process_query from engine.core.elasticsearch import process_query
from engine.core.graphene import BaseMutation from engine.core.graphene import BaseMutation
@ -27,6 +26,7 @@ from engine.core.utils.emailing import contact_us_email
from engine.core.utils.messages import permission_denied_message from engine.core.utils.messages import permission_denied_message
from engine.core.utils.nominatim import fetch_address_suggestions from engine.core.utils.nominatim import fetch_address_suggestions
from engine.payments.graphene.object_types import TransactionType from engine.payments.graphene.object_types import TransactionType
from evibes.utils.renderers import camelize
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -49,7 +49,7 @@ class CacheOperator(BaseMutation):
data = GenericScalar(description=_("cached data")) data = GenericScalar(description=_("cached data"))
@staticmethod @staticmethod
def mutate(parent, info, key, data=None, timeout=None) -> dict[Any, Any]: # type: ignore [override] def mutate(parent, info, key, data=None, timeout=None) -> dict[Any, Any]:
return camelize(web_cache(info.context, key, data, timeout)) return camelize(web_cache(info.context, key, data, timeout))
@ -64,7 +64,7 @@ class RequestCursedURL(BaseMutation):
data = GenericScalar(description=_("camelized JSON data from the requested URL")) data = GenericScalar(description=_("camelized JSON data from the requested URL"))
@staticmethod @staticmethod
def mutate(parent, info, url) -> dict[str, Any]: # type: ignore [override] def mutate(parent, info, url) -> dict[str, Any]:
if not is_url_safe(url): if not is_url_safe(url):
raise BadRequest(_("only URLs starting with http(s):// are allowed")) raise BadRequest(_("only URLs starting with http(s):// are allowed"))
try: try:
@ -94,7 +94,7 @@ class AddOrderProduct(BaseMutation):
order = Field(OrderType) order = Field(OrderType)
@staticmethod @staticmethod
def mutate(parent, info, product_uuid, order_uuid, attributes=None): # type: ignore [override] def mutate(parent, info, product_uuid, order_uuid, attributes=None):
user = info.context.user user = info.context.user
try: try:
order = Order.objects.get(uuid=order_uuid) order = Order.objects.get(uuid=order_uuid)
@ -123,7 +123,7 @@ class RemoveOrderProduct(BaseMutation):
order = Field(OrderType) order = Field(OrderType)
@staticmethod @staticmethod
def mutate(parent, info, product_uuid, order_uuid, attributes=None): # type: ignore [override] def mutate(parent, info, product_uuid, order_uuid, attributes=None):
user = info.context.user user = info.context.user
try: try:
order = Order.objects.get(uuid=order_uuid) order = Order.objects.get(uuid=order_uuid)
@ -150,7 +150,7 @@ class RemoveAllOrderProducts(BaseMutation):
order = Field(OrderType) order = Field(OrderType)
@staticmethod @staticmethod
def mutate(parent, info, order_uuid): # type: ignore [override] def mutate(parent, info, order_uuid):
user = info.context.user user = info.context.user
order = Order.objects.get(uuid=order_uuid) order = Order.objects.get(uuid=order_uuid)
if not (user.has_perm("core.delete_orderproduct") or user == order.user): if not (user.has_perm("core.delete_orderproduct") or user == order.user):
@ -173,7 +173,7 @@ class RemoveOrderProductsOfAKind(BaseMutation):
order = Field(OrderType) order = Field(OrderType)
@staticmethod @staticmethod
def mutate(parent, info, product_uuid, order_uuid): # type: ignore [override] def mutate(parent, info, product_uuid, order_uuid):
user = info.context.user user = info.context.user
order = Order.objects.get(uuid=order_uuid) order = Order.objects.get(uuid=order_uuid)
if not (user.has_perm("core.delete_orderproduct") or user == order.user): if not (user.has_perm("core.delete_orderproduct") or user == order.user):
@ -214,7 +214,7 @@ class BuyOrder(BaseMutation):
shipping_address=None, shipping_address=None,
billing_address=None, billing_address=None,
chosen_products=None, chosen_products=None,
): # type: ignore [override] ):
if not any([order_uuid, order_hr_id]) or all([order_uuid, order_hr_id]): if not any([order_uuid, order_hr_id]) or all([order_uuid, order_hr_id]):
raise BadRequest( raise BadRequest(
_( _(
@ -276,7 +276,7 @@ class BulkOrderAction(BaseMutation):
products, products,
order_uuid=None, order_uuid=None,
order_hr_id=None, order_hr_id=None,
): # type: ignore [override] ):
if not any([order_uuid, order_hr_id]) or all([order_uuid, order_hr_id]): if not any([order_uuid, order_hr_id]) or all([order_uuid, order_hr_id]):
raise BadRequest( raise BadRequest(
_( _(
@ -326,7 +326,7 @@ class BulkWishlistAction(BaseMutation):
action, action,
products, products,
wishlist_uuid=None, wishlist_uuid=None,
): # type: ignore [override] ):
if not wishlist_uuid: if not wishlist_uuid:
raise BadRequest(_("please provide wishlist_uuid value")) raise BadRequest(_("please provide wishlist_uuid value"))
user = info.context.user user = info.context.user
@ -379,7 +379,7 @@ class BuyUnregisteredOrder(BaseMutation):
customer_shipping_address=None, customer_shipping_address=None,
promocode_uuid=None, promocode_uuid=None,
is_business=False, is_business=False,
): # type: ignore [override] ):
order = Order.objects.create(status="MOMENTAL") order = Order.objects.create(status="MOMENTAL")
transaction = order.buy_without_registration( transaction = order.buy_without_registration(
products=products, products=products,
@ -408,7 +408,7 @@ class AddWishlistProduct(BaseMutation):
wishlist = Field(WishlistType) wishlist = Field(WishlistType)
@staticmethod @staticmethod
def mutate(parent, info, product_uuid, wishlist_uuid): # type: ignore [override] def mutate(parent, info, product_uuid, wishlist_uuid):
user = info.context.user user = info.context.user
try: try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid) wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -436,7 +436,7 @@ class RemoveWishlistProduct(BaseMutation):
wishlist = Field(WishlistType) wishlist = Field(WishlistType)
@staticmethod @staticmethod
def mutate(parent, info, product_uuid, wishlist_uuid): # type: ignore [override] def mutate(parent, info, product_uuid, wishlist_uuid):
user = info.context.user user = info.context.user
try: try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid) wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -463,7 +463,7 @@ class RemoveAllWishlistProducts(BaseMutation):
wishlist = Field(WishlistType) wishlist = Field(WishlistType)
@staticmethod @staticmethod
def mutate(parent, info, wishlist_uuid): # type: ignore [override] def mutate(parent, info, wishlist_uuid):
user = info.context.user user = info.context.user
try: try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid) wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -494,7 +494,7 @@ class BuyWishlist(BaseMutation):
transaction = Field(TransactionType, required=False) transaction = Field(TransactionType, required=False)
@staticmethod @staticmethod
def mutate(parent, info, wishlist_uuid, force_balance=False, force_payment=False): # type: ignore [override] def mutate(parent, info, wishlist_uuid, force_balance=False, force_payment=False):
user = info.context.user user = info.context.user
try: try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid) wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -557,7 +557,7 @@ class BuyProduct(BaseMutation):
attributes=None, attributes=None,
force_balance=False, force_balance=False,
force_payment=False, force_payment=False,
): # type: ignore [override] ):
user = info.context.user user = info.context.user
order = Order.objects.create(user=user, status="MOMENTAL") order = Order.objects.create(user=user, status="MOMENTAL")
order.add_product( order.add_product(
@ -589,7 +589,7 @@ class FeedbackProductAction(BaseMutation):
feedback = Field(FeedbackType, required=False) feedback = Field(FeedbackType, required=False)
@staticmethod @staticmethod
def mutate(parent, info, order_product_uuid, action, comment=None, rating=None): # type: ignore [override] def mutate(parent, info, order_product_uuid, action, comment=None, rating=None):
user = info.context.user user = info.context.user
try: try:
order_product = OrderProduct.objects.get(uuid=order_product_uuid) order_product = OrderProduct.objects.get(uuid=order_product_uuid)
@ -620,7 +620,7 @@ class CreateAddress(BaseMutation):
address = Field(AddressType) address = Field(AddressType)
@staticmethod @staticmethod
def mutate(parent, info, raw_data): # type: ignore [override] def mutate(parent, info, raw_data):
user = info.context.user if info.context.user.is_authenticated else None user = info.context.user if info.context.user.is_authenticated else None
address = Address.objects.create(raw_data=raw_data, user=user) address = Address.objects.create(raw_data=raw_data, user=user)
@ -635,7 +635,7 @@ class DeleteAddress(BaseMutation):
success = Boolean() success = Boolean()
@staticmethod @staticmethod
def mutate(parent, info, uuid): # type: ignore [override] def mutate(parent, info, uuid):
try: try:
address = Address.objects.get(uuid=uuid) address = Address.objects.get(uuid=uuid)
if ( if (
@ -663,7 +663,7 @@ class AutocompleteAddress(BaseMutation):
suggestions = GenericScalar() suggestions = GenericScalar()
@staticmethod @staticmethod
def mutate(parent, info, q, limit): # type: ignore [override] def mutate(parent, info, q, limit):
if 1 > limit > 10: if 1 > limit > 10:
raise BadRequest(_("limit must be between 1 and 10")) raise BadRequest(_("limit must be between 1 and 10"))
try: try:
@ -688,7 +688,7 @@ class ContactUs(BaseMutation):
error = String() error = String()
@staticmethod @staticmethod
def mutate(parent, info, email, name, subject, message, phone_number=None): # type: ignore [override] def mutate(parent, info, email, name, subject, message, phone_number=None):
try: try:
contact_us_email.delay( contact_us_email.delay(
{ {
@ -717,7 +717,7 @@ class Search(BaseMutation):
description = _("elasticsearch - works like a charm") description = _("elasticsearch - works like a charm")
@staticmethod @staticmethod
def mutate(parent, info, query): # type: ignore [override] def mutate(parent, info, query):
data = process_query(query=query, request=info.context) data = process_query(query=query, request=info.context)
# noinspection PyTypeChecker # noinspection PyTypeChecker

View file

@ -22,7 +22,6 @@ from graphene import (
from graphene.types.generic import GenericScalar from graphene.types.generic import GenericScalar
from graphene_django import DjangoObjectType from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField from graphene_django.filter import DjangoFilterConnectionField
from graphene_django.utils import camelize
from mptt.querysets import TreeQuerySet from mptt.querysets import TreeQuerySet
from engine.core.models import ( from engine.core.models import (
@ -56,11 +55,12 @@ from engine.core.utils.seo_builders import (
website_schema, website_schema,
) )
from engine.payments.graphene.object_types import TransactionType from engine.payments.graphene.object_types import TransactionType
from evibes.utils.renderers import camelize
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class SEOMetaType(ObjectType): # type: ignore [misc] class SEOMetaType(ObjectType):
title = String() title = String()
description = String() description = String()
canonical = String() canonical = String()
@ -71,7 +71,7 @@ class SEOMetaType(ObjectType): # type: ignore [misc]
hreflang = String() hreflang = String()
class AttributeType(DjangoObjectType): # type: ignore [misc] class AttributeType(DjangoObjectType):
values = List(lambda: AttributeValueType, description=_("attribute values")) values = List(lambda: AttributeValueType, description=_("attribute values"))
class Meta: class Meta:
@ -91,7 +91,7 @@ class AttributeType(DjangoObjectType): # type: ignore [misc]
return base_qs return base_qs
class AttributeGroupType(DjangoObjectType): # type: ignore [misc] class AttributeGroupType(DjangoObjectType):
attributes = List(lambda: AttributeType, description=_("grouped attributes")) attributes = List(lambda: AttributeType, description=_("grouped attributes"))
class Meta: class Meta:
@ -112,7 +112,7 @@ class AttributeGroupType(DjangoObjectType): # type: ignore [misc]
return qs return qs
class BrandType(DjangoObjectType): # type: ignore [misc] class BrandType(DjangoObjectType):
categories = List(lambda: CategoryType, description=_("categories")) categories = List(lambda: CategoryType, description=_("categories"))
seo_meta = Field(SEOMetaType, description=_("SEO Meta snapshot")) seo_meta = Field(SEOMetaType, description=_("SEO Meta snapshot"))
@ -198,17 +198,17 @@ class BrandType(DjangoObjectType): # type: ignore [misc]
} }
class FilterableAttributeType(ObjectType): # type: ignore [misc] class FilterableAttributeType(ObjectType):
attribute_name = String(required=True) attribute_name = String(required=True)
possible_values = List(String, required=True) possible_values = List(String, required=True)
class MinMaxPriceType(ObjectType): # type: ignore [misc] class MinMaxPriceType(ObjectType):
min_price = Float() min_price = Float()
max_price = Float() max_price = Float()
class CategoryType(DjangoObjectType): # type: ignore [misc] class CategoryType(DjangoObjectType):
children = List( children = List(
lambda: CategoryType, lambda: CategoryType,
description=_("categories"), description=_("categories"),
@ -358,7 +358,7 @@ class CategoryType(DjangoObjectType): # type: ignore [misc]
} }
class VendorType(DjangoObjectType): # type: ignore [misc] class VendorType(DjangoObjectType):
markup_percent = Float(description=_("markup percentage")) markup_percent = Float(description=_("markup percentage"))
class Meta: class Meta:
@ -369,7 +369,7 @@ class VendorType(DjangoObjectType): # type: ignore [misc]
description = _("vendors") description = _("vendors")
class AddressType(DjangoObjectType): # type: ignore [misc] class AddressType(DjangoObjectType):
latitude = Float(description=_("Latitude (Y coordinate)")) latitude = Float(description=_("Latitude (Y coordinate)"))
longitude = Float(description=_("Longitude (X coordinate)")) longitude = Float(description=_("Longitude (X coordinate)"))
@ -399,7 +399,7 @@ class AddressType(DjangoObjectType): # type: ignore [misc]
return self.location.y if self.location else None return self.location.y if self.location else None
class FeedbackType(DjangoObjectType): # type: ignore [misc] class FeedbackType(DjangoObjectType):
comment = String(description=_("comment")) comment = String(description=_("comment"))
rating = Int( rating = Int(
description=_("rating value from 1 to 10, inclusive, or 0 if not set.") description=_("rating value from 1 to 10, inclusive, or 0 if not set.")
@ -413,7 +413,7 @@ class FeedbackType(DjangoObjectType): # type: ignore [misc]
description = _("represents feedback from a user.") description = _("represents feedback from a user.")
class OrderProductType(DjangoObjectType): # type: ignore [misc] class OrderProductType(DjangoObjectType):
attributes = GenericScalar(description=_("attributes")) attributes = GenericScalar(description=_("attributes"))
notifications = GenericScalar(description=_("notifications")) notifications = GenericScalar(description=_("notifications"))
download_url = String( download_url = String(
@ -451,7 +451,7 @@ class OrderProductType(DjangoObjectType): # type: ignore [misc]
return self.download_url return self.download_url
class OrderType(DjangoObjectType): # type: ignore [misc] class OrderType(DjangoObjectType):
order_products = DjangoFilterConnectionField( order_products = DjangoFilterConnectionField(
OrderProductType, description=_("a list of order products in this order") OrderProductType, description=_("a list of order products in this order")
) )
@ -508,7 +508,7 @@ class OrderType(DjangoObjectType): # type: ignore [misc]
return None return None
class ProductImageType(DjangoObjectType): # type: ignore [misc] class ProductImageType(DjangoObjectType):
image = String(description=_("image url")) image = String(description=_("image url"))
class Meta: class Meta:
@ -522,7 +522,7 @@ class ProductImageType(DjangoObjectType): # type: ignore [misc]
return info.context.build_absolute_uri(self.image.url) if self.image else "" return info.context.build_absolute_uri(self.image.url) if self.image else ""
class ProductType(DjangoObjectType): # type: ignore [misc] class ProductType(DjangoObjectType):
category = Field(CategoryType, description=_("category")) category = Field(CategoryType, description=_("category"))
images = DjangoFilterConnectionField(ProductImageType, description=_("images")) images = DjangoFilterConnectionField(ProductImageType, description=_("images"))
feedbacks = DjangoFilterConnectionField(FeedbackType, description=_("feedbacks")) feedbacks = DjangoFilterConnectionField(FeedbackType, description=_("feedbacks"))
@ -646,7 +646,7 @@ class ProductType(DjangoObjectType): # type: ignore [misc]
return self.discount_price return self.discount_price
class AttributeValueType(DjangoObjectType): # type: ignore [misc] class AttributeValueType(DjangoObjectType):
value = String(description=_("attribute value")) value = String(description=_("attribute value"))
class Meta: class Meta:
@ -657,7 +657,7 @@ class AttributeValueType(DjangoObjectType): # type: ignore [misc]
description = _("attribute value") description = _("attribute value")
class PromoCodeType(DjangoObjectType): # type: ignore [misc] class PromoCodeType(DjangoObjectType):
discount = Float() discount = Float()
discount_type = String() discount_type = String()
@ -679,13 +679,13 @@ class PromoCodeType(DjangoObjectType): # type: ignore [misc]
float(self.discount_percent) float(self.discount_percent)
if self.discount_percent if self.discount_percent
else float(self.discount_amount) else float(self.discount_amount)
) # type: ignore [arg-type] )
def resolve_discount_type(self: PromoCode, _info) -> str: def resolve_discount_type(self: PromoCode, _info) -> str:
return "percent" if self.discount_percent else "amount" return "percent" if self.discount_percent else "amount"
class PromotionType(DjangoObjectType): # type: ignore [misc] class PromotionType(DjangoObjectType):
products = DjangoFilterConnectionField( products = DjangoFilterConnectionField(
ProductType, description=_("products on sale") ProductType, description=_("products on sale")
) )
@ -698,7 +698,7 @@ class PromotionType(DjangoObjectType): # type: ignore [misc]
description = _("promotions") description = _("promotions")
class StockType(DjangoObjectType): # type: ignore [misc] class StockType(DjangoObjectType):
vendor = Field(VendorType, description=_("vendor")) vendor = Field(VendorType, description=_("vendor"))
product = Field(ProductType, description=_("product")) product = Field(ProductType, description=_("product"))
@ -710,7 +710,7 @@ class StockType(DjangoObjectType): # type: ignore [misc]
description = _("stocks") description = _("stocks")
class WishlistType(DjangoObjectType): # type: ignore [misc] class WishlistType(DjangoObjectType):
products = DjangoFilterConnectionField( products = DjangoFilterConnectionField(
ProductType, description=_("wishlisted products") ProductType, description=_("wishlisted products")
) )
@ -722,7 +722,7 @@ class WishlistType(DjangoObjectType): # type: ignore [misc]
description = _("wishlists") description = _("wishlists")
class ProductTagType(DjangoObjectType): # type: ignore [misc] class ProductTagType(DjangoObjectType):
product_set = DjangoFilterConnectionField( product_set = DjangoFilterConnectionField(
ProductType, description=_("tagged products") ProductType, description=_("tagged products")
) )
@ -735,7 +735,7 @@ class ProductTagType(DjangoObjectType): # type: ignore [misc]
description = _("product tags") description = _("product tags")
class CategoryTagType(DjangoObjectType): # type: ignore [misc] class CategoryTagType(DjangoObjectType):
category_set = DjangoFilterConnectionField( category_set = DjangoFilterConnectionField(
CategoryType, description=_("tagged categories") CategoryType, description=_("tagged categories")
) )
@ -748,7 +748,7 @@ class CategoryTagType(DjangoObjectType): # type: ignore [misc]
description = _("categories tags") description = _("categories tags")
class ConfigType(ObjectType): # type: ignore [misc] class ConfigType(ObjectType):
project_name = String(description=_("project name")) project_name = String(description=_("project name"))
company_name = String(description=_("company name")) company_name = String(description=_("company name"))
company_address = String(description=_("company address")) company_address = String(description=_("company address"))
@ -768,7 +768,7 @@ class ConfigType(ObjectType): # type: ignore [misc]
description = _("company configuration") description = _("company configuration")
class LanguageType(ObjectType): # type: ignore [misc] class LanguageType(ObjectType):
code = String(description=_("language code")) code = String(description=_("language code"))
name = String(description=_("language name")) name = String(description=_("language name"))
flag = String(description=_("language flag, if exists :)")) flag = String(description=_("language flag, if exists :)"))
@ -777,34 +777,34 @@ class LanguageType(ObjectType): # type: ignore [misc]
description = _("supported languages") description = _("supported languages")
class SearchProductsResultsType(ObjectType): # type: ignore [misc] class SearchProductsResultsType(ObjectType):
uuid = UUID() uuid = UUID()
name = String() name = String()
slug = String() slug = String()
image = String() image = String()
class SearchCategoriesResultsType(ObjectType): # type: ignore [misc] class SearchCategoriesResultsType(ObjectType):
uuid = UUID() uuid = UUID()
name = String() name = String()
slug = String() slug = String()
image = String() image = String()
class SearchBrandsResultsType(ObjectType): # type: ignore [misc] class SearchBrandsResultsType(ObjectType):
uuid = UUID() uuid = UUID()
name = String() name = String()
slug = String() slug = String()
image = String() image = String()
class SearchPostsResultsType(ObjectType): # type: ignore [misc] class SearchPostsResultsType(ObjectType):
uuid = UUID() uuid = UUID()
name = String() name = String()
slug = String() slug = String()
class SearchResultsType(ObjectType): # type: ignore [misc] class SearchResultsType(ObjectType):
products = List( products = List(
description=_("products search results"), of_type=SearchProductsResultsType description=_("products search results"), of_type=SearchProductsResultsType
) )
@ -817,6 +817,6 @@ class SearchResultsType(ObjectType): # type: ignore [misc]
posts = List(description=_("posts search results"), of_type=SearchPostsResultsType) posts = List(description=_("posts search results"), of_type=SearchPostsResultsType)
class BulkProductInput(InputObjectType): # type: ignore [misc] class BulkProductInput(InputObjectType):
uuid = UUID(required=True) uuid = UUID(required=True)
attributes = GenericScalar(required=False) attributes = GenericScalar(required=False)

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -95,17 +95,17 @@ class Command(BaseCommand):
) )
def handle(self, *args: list[Any], **options: dict[str, str | list[str]]) -> None: def handle(self, *args: list[Any], **options: dict[str, str | list[str]]) -> None:
langs: list[str] = options.get("target_languages", []) # type: ignore [assignment] langs: list[str] = options.get("target_languages", [])
if "ALL" in langs: if "ALL" in langs:
langs = list(dict(settings.LANGUAGES).keys()) langs = list(dict(settings.LANGUAGES).keys())
apps_to_scan: set[str] = set(options["target_apps"]) apps_to_scan: set[str] = set(options["target_apps"])
if "ALL" in apps_to_scan: if "ALL" in apps_to_scan:
apps_to_scan = set(TRANSLATABLE_APPS) apps_to_scan = set(TRANSLATABLE_APPS)
root_path: str = options.get("root_path") or "/app/" # type: ignore [assignment] root_path: str = options.get("root_path") or "/app/"
configs = list(apps.get_app_configs()) configs = list(apps.get_app_configs())
# noinspection PyTypeChecker # noinspection PyTypeChecker
configs.append(RootDirectory()) # type: ignore [arg-type] configs.append(RootDirectory())
errors = 0 errors = 0

View file

@ -30,7 +30,7 @@ def placeholderize(text: str) -> tuple[str, list[str]]:
""" """
placeholders: list[str] = [] placeholders: list[str] = []
def _repl(match: re.Match) -> str: # type: ignore [type-arg] def _repl(match: re.Match) -> str:
idx = len(placeholders) idx = len(placeholders)
placeholders.append(match.group(0)) placeholders.append(match.group(0))
return f"__PH_{idx}__" return f"__PH_{idx}__"
@ -107,9 +107,9 @@ class Command(BaseCommand):
) )
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
target_langs: list[str] = options["target_languages"] # type: ignore [assignment] target_langs: list[str] = options["target_languages"]
if "ALL" in target_langs: if "ALL" in target_langs:
target_langs = DEEPL_TARGET_LANGUAGES_MAPPING.keys() # type: ignore [assignment] target_langs = DEEPL_TARGET_LANGUAGES_MAPPING.keys()
target_apps = set(options["target_apps"]) target_apps = set(options["target_apps"])
if "ALL" in target_apps: if "ALL" in target_apps:
target_apps = { target_apps = {
@ -125,7 +125,7 @@ class Command(BaseCommand):
try: try:
import readline import readline
except ImportError: except ImportError:
readline = None # type: ignore [assignment] readline = None
for target_lang in target_langs: for target_lang in target_langs:
api_code = DEEPL_TARGET_LANGUAGES_MAPPING.get(target_lang) api_code = DEEPL_TARGET_LANGUAGES_MAPPING.get(target_lang)
@ -176,16 +176,16 @@ class Command(BaseCommand):
if readline: if readline:
def hook() -> None: def hook() -> None:
readline.insert_text(default) # type: ignore [attr-defined] # noqa: B023 readline.insert_text(default) # noqa: B023
readline.redisplay() # type: ignore [attr-defined] readline.redisplay()
readline.set_pre_input_hook(hook) # type: ignore [attr-defined] readline.set_pre_input_hook(hook)
prompt = f"Enter translation for '{e.msgid}': " prompt = f"Enter translation for '{e.msgid}': "
user_in = input(prompt).strip() user_in = input(prompt).strip()
if readline: if readline:
readline.set_pre_input_hook(None) # type: ignore [attr-defined] readline.set_pre_input_hook(None)
if user_in: if user_in:
e.msgstr = user_in e.msgstr = user_in

View file

@ -19,7 +19,7 @@ class Command(BaseCommand):
) )
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
size: int = options["size"] # type: ignore [assignment] size: int = options["size"]
while True: while True:
batch_ids = list( batch_ids = list(
Product.objects.filter(orderproduct__isnull=True).values_list( Product.objects.filter(orderproduct__isnull=True).values_list(

View file

@ -19,7 +19,7 @@ class Command(BaseCommand):
) )
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None: def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
size: int = options["size"] # type: ignore [assignment] size: int = options["size"]
while True: while True:
batch_ids = list( batch_ids = list(
Product.objects.filter( Product.objects.filter(

View file

@ -11,7 +11,7 @@ class Command(BaseCommand):
self.style.SUCCESS("Starting fetching products task in worker container...") self.style.SUCCESS("Starting fetching products task in worker container...")
) )
update_products_task.delay() # type: ignore [attr-defined] update_products_task.delay()
self.stdout.write( self.stdout.write(
self.style.SUCCESS( self.style.SUCCESS(

View file

@ -14,7 +14,7 @@ class AddressManager(models.Manager):
if not kwargs.get("raw_data"): if not kwargs.get("raw_data"):
raise ValueError("'raw_data' (address string) must be provided.") raise ValueError("'raw_data' (address string) must be provided.")
params: dict[str, str | int] = { # type: ignore [annotation-unchecked] params: dict[str, str | int] = {
"format": "json", "format": "json",
"addressdetails": 1, "addressdetails": 1,
"q": kwargs.get("raw_data"), "q": kwargs.get("raw_data"),

View file

@ -70,8 +70,8 @@ from evibes.utils.misc import create_object
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc] class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a group of attributes, which can be hierarchical." "Represents a group of attributes, which can be hierarchical."
" This class is used to manage and organize attribute groups." " This class is used to manage and organize attribute groups."
" An attribute group can have a parent group, forming a hierarchical structure." " An attribute group can have a parent group, forming a hierarchical structure."
@ -106,8 +106,8 @@ class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel):
verbose_name_plural = _("attribute groups") verbose_name_plural = _("attribute groups")
class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [misc] class Vendor(ExportModelOperationsMixin("vendor"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a vendor entity capable of storing information about external vendors and their interaction requirements." "Represents a vendor entity capable of storing information about external vendors and their interaction requirements."
" The Vendor class is used to define and manage information related to an external vendor." " The Vendor class is used to define and manage information related to an external vendor."
" It stores the vendor's name, authentication details required for communication," " It stores the vendor's name, authentication details required for communication,"
@ -164,7 +164,7 @@ class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [
def __str__(self) -> str: def __str__(self) -> str:
return self.name return self.name
def save( # type: ignore [override] def save(
self, self,
*, *,
force_insert: bool = False, force_insert: bool = False,
@ -198,8 +198,8 @@ class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [
] ]
class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type: ignore [misc] class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a product tag used for classifying or identifying products." "Represents a product tag used for classifying or identifying products."
" The ProductTag class is designed to uniquely identify and classify products through a combination" " The ProductTag class is designed to uniquely identify and classify products through a combination"
" of an internal tag identifier and a user-friendly display name." " of an internal tag identifier and a user-friendly display name."
@ -230,8 +230,8 @@ class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type:
verbose_name_plural = _("product tags") verbose_name_plural = _("product tags")
class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel): # type: ignore [misc] class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a category tag used for products." "Represents a category tag used for products."
" This class models a category tag that can be used to associate and classify products." " This class models a category tag that can be used to associate and classify products."
" It includes attributes for an internal tag identifier and a user-friendly display name." " It includes attributes for an internal tag identifier and a user-friendly display name."
@ -261,8 +261,8 @@ class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel): # typ
verbose_name_plural = _("category tags") verbose_name_plural = _("category tags")
class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel): # type: ignore [misc, django-manager-missing] class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a category entity to organize and group related items in a hierarchical structure." "Represents a category entity to organize and group related items in a hierarchical structure."
" Categories may have hierarchical relationships with other categories, supporting parent-child relationships." " Categories may have hierarchical relationships with other categories, supporting parent-child relationships."
" The class includes fields for metadata and visual representation," " The class includes fields for metadata and visual representation,"
@ -437,7 +437,7 @@ class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel): #
): ):
bucket["possible_values"].append(value) bucket["possible_values"].append(value)
return list(by_attr.values()) # type: ignore [arg-type] return list(by_attr.values())
@cached_property @cached_property
def image_url(self) -> str: def image_url(self) -> str:
@ -452,8 +452,8 @@ class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel): #
ordering = ["tree_id", "lft"] ordering = ["tree_id", "lft"]
class Brand(ExportModelOperationsMixin("brand"), NiceModel): # type: ignore [misc] class Brand(ExportModelOperationsMixin("brand"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a Brand object in the system. " "Represents a Brand object in the system. "
"This class handles information and attributes related to a brand, including its name, logos, " "This class handles information and attributes related to a brand, including its name, logos, "
"description, associated categories, a unique slug, and priority order. " "description, associated categories, a unique slug, and priority order. "
@ -522,8 +522,8 @@ class Brand(ExportModelOperationsMixin("brand"), NiceModel): # type: ignore [mi
verbose_name_plural = _("brands") verbose_name_plural = _("brands")
class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [misc] class Stock(ExportModelOperationsMixin("stock"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents the stock of a product managed in the system." "Represents the stock of a product managed in the system."
" This class provides details about the relationship between vendors, products, and their stock information, " " This class provides details about the relationship between vendors, products, and their stock information, "
"as well as inventory-related properties like price, purchase price, quantity, SKU, and digital assets." "as well as inventory-related properties like price, purchase price, quantity, SKU, and digital assets."
@ -588,8 +588,8 @@ class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [mi
verbose_name_plural = _("stock entries") verbose_name_plural = _("stock entries")
class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore [misc] class Product(ExportModelOperationsMixin("product"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a product with attributes such as category, brand, tags, digital status, name, description, part number, and slug." "Represents a product with attributes such as category, brand, tags, digital status, name, description, part number, and slug."
" Provides related utility properties to retrieve ratings, feedback counts, price, quantity, and total orders." " Provides related utility properties to retrieve ratings, feedback counts, price, quantity, and total orders."
" Designed for use in a system that handles e-commerce or inventory management." " Designed for use in a system that handles e-commerce or inventory management."
@ -695,7 +695,7 @@ class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore
@cached_property @cached_property
def discount_price(self) -> float | None: def discount_price(self) -> float | None:
return self.promos.first().discount_percent if self.promos.exists() else None # type: ignore [union-attr] return self.promos.first().discount_percent if self.promos.exists() else None
@property @property
def rating(self) -> float: def rating(self) -> float:
@ -736,8 +736,8 @@ class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore
self.__dict__["personal_orders_only"] = value self.__dict__["personal_orders_only"] = value
class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ignore [misc] class Attribute(ExportModelOperationsMixin("attribute"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents an attribute in the system." "Represents an attribute in the system."
" This class is used to define and manage attributes," " This class is used to define and manage attributes,"
" which are customizable pieces of data that can be associated with other entities." " which are customizable pieces of data that can be associated with other entities."
@ -795,8 +795,8 @@ class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ig
verbose_name_plural = _("attributes") verbose_name_plural = _("attributes")
class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel): # type: ignore [misc] class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a specific value for an attribute that is linked to a product. " "Represents a specific value for an attribute that is linked to a product. "
"It links the 'attribute' to a unique 'value', allowing " "It links the 'attribute' to a unique 'value', allowing "
"better organization and dynamic representation of product characteristics." "better organization and dynamic representation of product characteristics."
@ -833,8 +833,8 @@ class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel):
verbose_name_plural = _("attribute values") verbose_name_plural = _("attribute values")
class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel): # type: ignore [misc] class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a product image associated with a product in the system. " "Represents a product image associated with a product in the system. "
"This class is designed to manage images for products, including functionality " "This class is designed to manage images for products, including functionality "
"for uploading image files, associating them with specific products, and " "for uploading image files, associating them with specific products, and "
@ -886,8 +886,8 @@ class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel): # t
verbose_name_plural = _("product images") verbose_name_plural = _("product images")
class Promotion(ExportModelOperationsMixin("promotion"), NiceModel): # type: ignore [misc] class Promotion(ExportModelOperationsMixin("promotion"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a promotional campaign for products with a discount. " "Represents a promotional campaign for products with a discount. "
"This class is used to define and manage promotional campaigns that offer a " "This class is used to define and manage promotional campaigns that offer a "
"percentage-based discount for products. The class includes attributes for " "percentage-based discount for products. The class includes attributes for "
@ -932,8 +932,8 @@ class Promotion(ExportModelOperationsMixin("promotion"), NiceModel): # type: ig
return str(self.id) return str(self.id)
class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel): # type: ignore [misc] class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a user's wishlist for storing and managing desired products. " "Represents a user's wishlist for storing and managing desired products. "
"The class provides functionality to manage a collection of products, " "The class provides functionality to manage a collection of products, "
"supporting operations such as adding and removing products, " "supporting operations such as adding and removing products, "
@ -1003,8 +1003,8 @@ class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel): # type: igno
return self return self
class Documentary(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc] class Documentary(ExportModelOperationsMixin("attribute_group"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a documentary record tied to a product. " "Represents a documentary record tied to a product. "
"This class is used to store information about documentaries related to specific " "This class is used to store information about documentaries related to specific "
"products, including file uploads and their metadata. It contains methods and " "products, including file uploads and their metadata. It contains methods and "
@ -1034,8 +1034,8 @@ class Documentary(ExportModelOperationsMixin("attribute_group"), NiceModel): #
return self.document.name.split(".")[-1] or _("unresolved") return self.document.name.split(".")[-1] or _("unresolved")
class Address(ExportModelOperationsMixin("address"), NiceModel): # type: ignore [misc] class Address(ExportModelOperationsMixin("address"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents an address entity that includes location details and associations with a user. " "Represents an address entity that includes location details and associations with a user. "
"Provides functionality for geographic and address data storage, as well " "Provides functionality for geographic and address data storage, as well "
"as integration with geocoding services. " "as integration with geocoding services. "
@ -1099,8 +1099,8 @@ class Address(ExportModelOperationsMixin("address"), NiceModel): # type: ignore
return f"{base} for {self.user.email}" if self.user else base return f"{base} for {self.user.email}" if self.user else base
class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel): # type: ignore [misc] class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents a promotional code that can be used for discounts, managing its validity, " "Represents a promotional code that can be used for discounts, managing its validity, "
"type of discount, and application. " "type of discount, and application. "
"The PromoCode class stores details about a promotional code, including its unique " "The PromoCode class stores details about a promotional code, including its unique "
@ -1211,13 +1211,13 @@ class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel): # type: ig
if self.discount_type == "percent": if self.discount_type == "percent":
promo_amount -= round( promo_amount -= round(
promo_amount * (float(self.discount_percent) / 100), 2 promo_amount * (float(self.discount_percent) / 100), 2
) # type: ignore [arg-type] )
order.attributes.update( order.attributes.update(
{"promocode_uuid": str(self.uuid), "final_price": promo_amount} {"promocode_uuid": str(self.uuid), "final_price": promo_amount}
) )
order.save() order.save()
elif self.discount_type == "amount": elif self.discount_type == "amount":
promo_amount -= round(float(self.discount_amount), 2) # type: ignore [arg-type] promo_amount -= round(float(self.discount_amount), 2)
order.attributes.update( order.attributes.update(
{"promocode_uuid": str(self.uuid), "final_price": promo_amount} {"promocode_uuid": str(self.uuid), "final_price": promo_amount}
) )
@ -1230,8 +1230,8 @@ class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel): # type: ig
return promo_amount return promo_amount
class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [misc] class Order(ExportModelOperationsMixin("order"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents an order placed by a user." "Represents an order placed by a user."
" This class models an order within the application," " This class models an order within the application,"
" including its various attributes such as billing and shipping information," " including its various attributes such as billing and shipping information,"
@ -1341,7 +1341,7 @@ class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [mi
( (
self.user.attributes.get("is_business", False) self.user.attributes.get("is_business", False)
and self.user.attributes.get("business_identificator") and self.user.attributes.get("business_identificator")
) # type: ignore [union-attr] )
if self.user if self.user
else False else False
) )
@ -1410,7 +1410,7 @@ class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [mi
if promotions.exists(): if promotions.exists():
buy_price -= round( buy_price -= round(
product.price * (promotions.first().discount_percent / 100), 2 product.price * (promotions.first().discount_percent / 100), 2
) # type: ignore [union-attr] )
order_product, is_created = OrderProduct.objects.get_or_create( order_product, is_created = OrderProduct.objects.get_or_create(
product=product, product=product,
@ -1800,8 +1800,8 @@ class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [mi
return None return None
class Feedback(ExportModelOperationsMixin("feedback"), NiceModel): # type: ignore [misc] class Feedback(ExportModelOperationsMixin("feedback"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Manages user feedback for products. " "Manages user feedback for products. "
"This class is designed to capture and store user feedback for specific products " "This class is designed to capture and store user feedback for specific products "
"that they have purchased. It contains attributes to store user comments, " "that they have purchased. It contains attributes to store user comments, "
@ -1849,8 +1849,8 @@ class Feedback(ExportModelOperationsMixin("feedback"), NiceModel): # type: igno
verbose_name_plural = _("feedbacks") verbose_name_plural = _("feedbacks")
class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # type: ignore [misc] class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents products associated with orders and their attributes. " "Represents products associated with orders and their attributes. "
"The OrderProduct model maintains information about a product that is part of an order, " "The OrderProduct model maintains information about a product that is part of an order, "
"including details such as purchase price, quantity, product attributes, and status. It " "including details such as purchase price, quantity, product attributes, and status. It "
@ -1969,12 +1969,12 @@ class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # t
@property @property
def total_price(self: Self) -> float: def total_price(self: Self) -> float:
return round(float(self.buy_price) * self.quantity, 2) # type: ignore [arg-type] return round(float(self.buy_price) * self.quantity, 2)
@property @property
def download_url(self: Self) -> str: def download_url(self: Self) -> str:
if self.product and self.product.stocks: if self.product and self.product.stocks:
if self.product.is_digital and self.product.stocks.first().digital_asset: # type: ignore [union-attr] if self.product.is_digital and self.product.stocks.first().digital_asset:
if hasattr(self, "download"): if hasattr(self, "download"):
return self.download.url return self.download.url
else: else:
@ -2010,7 +2010,7 @@ class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # t
class CustomerRelationshipManagementProvider( class CustomerRelationshipManagementProvider(
ExportModelOperationsMixin("crm_provider"), NiceModel ExportModelOperationsMixin("crm_provider"), NiceModel
): # type: ignore [misc] ):
name = CharField(max_length=128, unique=True, verbose_name=_("name")) name = CharField(max_length=128, unique=True, verbose_name=_("name"))
integration_url = URLField( integration_url = URLField(
blank=True, null=True, help_text=_("URL of the integration") blank=True, null=True, help_text=_("URL of the integration")
@ -2053,7 +2053,7 @@ class CustomerRelationshipManagementProvider(
verbose_name_plural = _("CRMs") verbose_name_plural = _("CRMs")
class OrderCrmLink(ExportModelOperationsMixin("order_crm_link"), NiceModel): # type: ignore class OrderCrmLink(ExportModelOperationsMixin("order_crm_link"), NiceModel):
order = ForeignKey(to=Order, on_delete=PROTECT, related_name="crm_links") order = ForeignKey(to=Order, on_delete=PROTECT, related_name="crm_links")
crm = ForeignKey( crm = ForeignKey(
to=CustomerRelationshipManagementProvider, to=CustomerRelationshipManagementProvider,
@ -2070,8 +2070,8 @@ class OrderCrmLink(ExportModelOperationsMixin("order_crm_link"), NiceModel): #
verbose_name_plural = _("orders CRM links") verbose_name_plural = _("orders CRM links")
class DigitalAssetDownload(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc] class DigitalAssetDownload(ExportModelOperationsMixin("attribute_group"), NiceModel):
__doc__ = _( # type: ignore __doc__ = _(
"Represents the downloading functionality for digital assets associated with orders. " "Represents the downloading functionality for digital assets associated with orders. "
"The DigitalAssetDownload class provides the ability to manage and access " "The DigitalAssetDownload class provides the ability to manage and access "
"downloads related to order products. It maintains information about the " "downloads related to order products. It maintains information about the "

View file

@ -50,7 +50,7 @@ class AttributeGroupDetailSerializer(ModelSerializer):
class CategoryDetailListSerializer(ListSerializer): class CategoryDetailListSerializer(ListSerializer):
def to_representation(self, data): # type: ignore[override] def to_representation(self, data):
items = list(data) items = list(data)
with suppress(Exception): with suppress(Exception):
Category.bulk_prefetch_filterable_attributes(items) Category.bulk_prefetch_filterable_attributes(items)
@ -92,7 +92,7 @@ class CategoryDetailSerializer(ModelSerializer):
CategorySimpleSerializer(children, many=True, context=self.context).data CategorySimpleSerializer(children, many=True, context=self.context).data
if obj.children.exists() if obj.children.exists()
else [] else []
) # type: ignore [return-value] )
class BrandDetailSerializer(ModelSerializer): class BrandDetailSerializer(ModelSerializer):

View file

@ -25,9 +25,9 @@ from engine.core.models import (
from engine.core.serializers.utility import AddressSerializer from engine.core.serializers.utility import AddressSerializer
class AttributeGroupSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class AttributeGroupSimpleSerializer(ModelSerializer):
parent = PrimaryKeyRelatedField(read_only=True) # type: ignore [assignment, var-annotated] parent = PrimaryKeyRelatedField(read_only=True)
children = PrimaryKeyRelatedField(many=True, read_only=True) # type: ignore [assignment, var-annotated] children = PrimaryKeyRelatedField(many=True, read_only=True)
class Meta: class Meta:
model = AttributeGroup model = AttributeGroup
@ -39,7 +39,7 @@ class AttributeGroupSimpleSerializer(ModelSerializer): # type: ignore [type-arg
] ]
class CategorySimpleSerializer(ModelSerializer): # type: ignore [type-arg] class CategorySimpleSerializer(ModelSerializer):
children = SerializerMethodField() children = SerializerMethodField()
class Meta: class Meta:
@ -63,10 +63,10 @@ class CategorySimpleSerializer(ModelSerializer): # type: ignore [type-arg]
CategorySimpleSerializer(children, many=True, context=self.context).data CategorySimpleSerializer(children, many=True, context=self.context).data
if obj.children.exists() if obj.children.exists()
else [] else []
) # type: ignore [return-value] )
class BrandSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class BrandSimpleSerializer(ModelSerializer):
class Meta: class Meta:
model = Brand model = Brand
fields = [ fields = [
@ -77,7 +77,7 @@ class BrandSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class ProductTagSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class ProductTagSimpleSerializer(ModelSerializer):
class Meta: class Meta:
model = ProductTag model = ProductTag
fields = [ fields = [
@ -87,8 +87,8 @@ class ProductTagSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class ProductImageSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class ProductImageSimpleSerializer(ModelSerializer):
product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg] product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
class Meta: class Meta:
model = ProductImage model = ProductImage
@ -101,7 +101,7 @@ class ProductImageSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class AttributeSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class AttributeSimpleSerializer(ModelSerializer):
group = AttributeGroupSimpleSerializer(read_only=True) group = AttributeGroupSimpleSerializer(read_only=True)
class Meta: class Meta:
@ -114,9 +114,9 @@ class AttributeSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class AttributeValueSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class AttributeValueSimpleSerializer(ModelSerializer):
attribute = AttributeSimpleSerializer(read_only=True) attribute = AttributeSimpleSerializer(read_only=True)
product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg] product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
class Meta: class Meta:
model = AttributeValue model = AttributeValue
@ -128,7 +128,7 @@ class AttributeValueSimpleSerializer(ModelSerializer): # type: ignore [type-arg
] ]
class ProductSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class ProductSimpleSerializer(ModelSerializer):
brand = BrandSimpleSerializer(read_only=True) brand = BrandSimpleSerializer(read_only=True)
category = CategorySimpleSerializer(read_only=True) category = CategorySimpleSerializer(read_only=True)
tags = ProductTagSimpleSerializer(many=True, read_only=True) tags = ProductTagSimpleSerializer(many=True, read_only=True)
@ -185,7 +185,7 @@ class ProductSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
return obj.discount_price return obj.discount_price
class VendorSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class VendorSimpleSerializer(ModelSerializer):
class Meta: class Meta:
model = Vendor model = Vendor
fields = [ fields = [
@ -194,7 +194,7 @@ class VendorSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class StockSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class StockSimpleSerializer(ModelSerializer):
vendor = VendorSimpleSerializer(read_only=True) vendor = VendorSimpleSerializer(read_only=True)
product = ProductSimpleSerializer(read_only=True) product = ProductSimpleSerializer(read_only=True)
@ -211,7 +211,7 @@ class StockSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class PromoCodeSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class PromoCodeSimpleSerializer(ModelSerializer):
class Meta: class Meta:
model = PromoCode model = PromoCode
fields = [ fields = [
@ -220,7 +220,7 @@ class PromoCodeSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class PromotionSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class PromotionSimpleSerializer(ModelSerializer):
products = ProductSimpleSerializer(many=True, read_only=True) products = ProductSimpleSerializer(many=True, read_only=True)
class Meta: class Meta:
@ -233,8 +233,8 @@ class PromotionSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class WishlistSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class WishlistSimpleSerializer(ModelSerializer):
user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg] user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
products = ProductSimpleSerializer(many=True, read_only=True) products = ProductSimpleSerializer(many=True, read_only=True)
class Meta: class Meta:
@ -246,8 +246,8 @@ class WishlistSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class FeedbackSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class FeedbackSimpleSerializer(ModelSerializer):
order_product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg] order_product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
class Meta: class Meta:
model = Feedback model = Feedback
@ -258,7 +258,7 @@ class FeedbackSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class OrderProductSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class OrderProductSimpleSerializer(ModelSerializer):
product = ProductSimpleSerializer(read_only=True) product = ProductSimpleSerializer(read_only=True)
class Meta: class Meta:
@ -272,8 +272,8 @@ class OrderProductSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class OrderSimpleSerializer(ModelSerializer): # type: ignore [type-arg] class OrderSimpleSerializer(ModelSerializer):
user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg] user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
promo_code = PromoCodeSimpleSerializer(read_only=True) promo_code = PromoCodeSimpleSerializer(read_only=True)
order_products = OrderProductSimpleSerializer(many=True, read_only=True) order_products = OrderProductSimpleSerializer(many=True, read_only=True)
billing_address = AddressSerializer(read_only=True, required=False) billing_address = AddressSerializer(read_only=True, required=False)

View file

@ -18,19 +18,19 @@ from rest_framework.serializers import ListSerializer, ModelSerializer, Serializ
from engine.core.models import Address from engine.core.models import Address
class AddressAutocompleteInputSerializer(Serializer): # type: ignore [type-arg] class AddressAutocompleteInputSerializer(Serializer):
q = CharField(required=True) q = CharField(required=True)
limit = IntegerField(required=False, min_value=1, max_value=10, default=5) limit = IntegerField(required=False, min_value=1, max_value=10, default=5)
class AddressSuggestionSerializer(Serializer): # type: ignore [type-arg] class AddressSuggestionSerializer(Serializer):
display_name = CharField() display_name = CharField()
lat = FloatField() lat = FloatField()
lon = FloatField() lon = FloatField()
address = DictField(child=CharField()) address = DictField(child=CharField())
class AddressSerializer(ModelSerializer): # type: ignore [type-arg] class AddressSerializer(ModelSerializer):
latitude = FloatField(source="location.y", read_only=True) latitude = FloatField(source="location.y", read_only=True)
longitude = FloatField(source="location.x", read_only=True) longitude = FloatField(source="location.x", read_only=True)
@ -59,7 +59,7 @@ class AddressSerializer(ModelSerializer): # type: ignore [type-arg]
] ]
class AddressCreateSerializer(ModelSerializer): # type: ignore [type-arg] class AddressCreateSerializer(ModelSerializer):
raw_data = CharField( raw_data = CharField(
write_only=True, write_only=True,
max_length=512, max_length=512,
@ -76,10 +76,10 @@ class AddressCreateSerializer(ModelSerializer): # type: ignore [type-arg]
user = None user = None
if self.context["request"].user.is_authenticated: if self.context["request"].user.is_authenticated:
user = self.context["request"].user user = self.context["request"].user
return Address.objects.create(raw_data=raw, user=user, **validated_data) # type: ignore [no-untyped-call] return Address.objects.create(raw_data=raw, user=user, **validated_data)
class DoFeedbackSerializer(Serializer): # type: ignore [type-arg] class DoFeedbackSerializer(Serializer):
comment = CharField(required=True) comment = CharField(required=True)
rating = IntegerField(min_value=1, max_value=10, default=10) rating = IntegerField(min_value=1, max_value=10, default=10)
action = CharField(default="add") action = CharField(default="add")
@ -94,13 +94,13 @@ class DoFeedbackSerializer(Serializer): # type: ignore [type-arg]
return data return data
class CacheOperatorSerializer(Serializer): # type: ignore [type-arg] class CacheOperatorSerializer(Serializer):
key = CharField(required=True) key = CharField(required=True)
data = JSONField(required=False) # type: ignore [assignment] data = JSONField(required=False)
timeout = IntegerField(required=False) timeout = IntegerField(required=False)
class ContactUsSerializer(Serializer): # type: ignore [type-arg] class ContactUsSerializer(Serializer):
email = CharField(required=True) email = CharField(required=True)
name = CharField(required=True) name = CharField(required=True)
subject = CharField(required=True) subject = CharField(required=True)
@ -108,13 +108,13 @@ class ContactUsSerializer(Serializer): # type: ignore [type-arg]
message = CharField(required=True) message = CharField(required=True)
class LanguageSerializer(Serializer): # type: ignore [type-arg] class LanguageSerializer(Serializer):
code = CharField(required=True) code = CharField(required=True)
name = CharField(required=True) name = CharField(required=True)
flag = CharField() flag = CharField()
class RecursiveField(Field): # type: ignore [type-arg] class RecursiveField(Field):
def to_representation(self, value: Any) -> Any: def to_representation(self, value: Any) -> Any:
parent = self.parent parent = self.parent
if isinstance(parent, ListSerializer): if isinstance(parent, ListSerializer):
@ -127,45 +127,45 @@ class RecursiveField(Field): # type: ignore [type-arg]
return data return data
class AddOrderProductSerializer(Serializer): # type: ignore [type-arg] class AddOrderProductSerializer(Serializer):
product_uuid = CharField(required=True) product_uuid = CharField(required=True)
attributes = ListField(required=False, child=DictField(), default=list) attributes = ListField(required=False, child=DictField(), default=list)
class BulkAddOrderProductsSerializer(Serializer): # type: ignore [type-arg] class BulkAddOrderProductsSerializer(Serializer):
products = ListField(child=AddOrderProductSerializer(), required=True) products = ListField(child=AddOrderProductSerializer(), required=True)
class RemoveOrderProductSerializer(Serializer): # type: ignore [type-arg] class RemoveOrderProductSerializer(Serializer):
product_uuid = CharField(required=True) product_uuid = CharField(required=True)
attributes = JSONField(required=False, default=dict) attributes = JSONField(required=False, default=dict)
class BulkRemoveOrderProductsSerializer(Serializer): # type: ignore [type-arg] class BulkRemoveOrderProductsSerializer(Serializer):
products = ListField(child=RemoveOrderProductSerializer(), required=True) products = ListField(child=RemoveOrderProductSerializer(), required=True)
class AddWishlistProductSerializer(Serializer): # type: ignore [type-arg] class AddWishlistProductSerializer(Serializer):
product_uuid = CharField(required=True) product_uuid = CharField(required=True)
class RemoveWishlistProductSerializer(Serializer): # type: ignore [type-arg] class RemoveWishlistProductSerializer(Serializer):
product_uuid = CharField(required=True) product_uuid = CharField(required=True)
class BulkAddWishlistProductSerializer(Serializer): # type: ignore [type-arg] class BulkAddWishlistProductSerializer(Serializer):
product_uuids = ListField( product_uuids = ListField(
child=CharField(required=True), allow_empty=False, max_length=64 child=CharField(required=True), allow_empty=False, max_length=64
) )
class BulkRemoveWishlistProductSerializer(Serializer): # type: ignore [type-arg] class BulkRemoveWishlistProductSerializer(Serializer):
product_uuids = ListField( product_uuids = ListField(
child=CharField(required=True), allow_empty=False, max_length=64 child=CharField(required=True), allow_empty=False, max_length=64
) )
class BuyOrderSerializer(Serializer): # type: ignore [type-arg] class BuyOrderSerializer(Serializer):
force_balance = BooleanField(required=False, default=False) force_balance = BooleanField(required=False, default=False)
force_payment = BooleanField(required=False, default=False) force_payment = BooleanField(required=False, default=False)
promocode_uuid = CharField(required=False) promocode_uuid = CharField(required=False)
@ -174,7 +174,7 @@ class BuyOrderSerializer(Serializer): # type: ignore [type-arg]
chosen_products = AddOrderProductSerializer(many=True, required=False) chosen_products = AddOrderProductSerializer(many=True, required=False)
class BuyUnregisteredOrderSerializer(Serializer): # type: ignore [type-arg] class BuyUnregisteredOrderSerializer(Serializer):
products = AddOrderProductSerializer(many=True, required=True) products = AddOrderProductSerializer(many=True, required=True)
promocode_uuid = UUIDField(required=False) promocode_uuid = UUIDField(required=False)
customer_name = CharField(required=True) customer_name = CharField(required=True)
@ -185,7 +185,7 @@ class BuyUnregisteredOrderSerializer(Serializer): # type: ignore [type-arg]
payment_method = CharField(required=True) payment_method = CharField(required=True)
class BuyAsBusinessOrderSerializer(Serializer): # type: ignore [type-arg] class BuyAsBusinessOrderSerializer(Serializer):
products = AddOrderProductSerializer(many=True, required=True) products = AddOrderProductSerializer(many=True, required=True)
business_identificator = CharField(required=True) business_identificator = CharField(required=True)
promocode_uuid = UUIDField(required=False) promocode_uuid = UUIDField(required=False)

View file

@ -156,8 +156,8 @@ def process_order_changes(instance: Order, created: bool, **kwargs: dict[Any, An
) )
order_product.order.user.payments_balance.amount -= ( order_product.order.user.payments_balance.amount -= (
order_product.buy_price order_product.buy_price
) # type: ignore [union-attr, operator] )
order_product.order.user.payments_balance.save() # type: ignore [union-attr] order_product.order.user.payments_balance.save()
order_product.save() order_product.save()
continue continue
@ -169,14 +169,15 @@ def process_order_changes(instance: Order, created: bool, **kwargs: dict[Any, An
price=order_product.buy_price price=order_product.buy_price
) )
.first() .first()
.vendor.name.lower() # type: ignore [union-attr, attr-defined, misc] .vendor.name.lower()
) )
vendor = create_object( vendor = create_object(
f"core.vendors.{vendor_name}", f"{vendor_name.title()}Vendor" f"engine.core.vendors.{vendor_name}",
f"{vendor_name.title()}Vendor",
) )
vendor.buy_order_product(order_product) # type: ignore [attr-defined] vendor.buy_order_product(order_product)
except Exception as e: except Exception as e:
order_product.add_error( order_product.add_error(

View file

@ -12,7 +12,7 @@ class SitemapLanguageMixin:
return getattr(req, "LANGUAGE_CODE", settings.LANGUAGE_CODE) return getattr(req, "LANGUAGE_CODE", settings.LANGUAGE_CODE)
class StaticPagesSitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-arg] class StaticPagesSitemap(SitemapLanguageMixin, Sitemap):
protocol = "https" protocol = "https"
changefreq = "monthly" changefreq = "monthly"
priority = 0.8 priority = 0.8
@ -58,7 +58,7 @@ class StaticPagesSitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-a
return obj.get("lastmod") return obj.get("lastmod")
class ProductSitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-arg] class ProductSitemap(SitemapLanguageMixin, Sitemap):
protocol = "https" protocol = "https"
changefreq = "daily" changefreq = "daily"
priority = 0.9 priority = 0.9
@ -84,7 +84,7 @@ class ProductSitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-arg]
return f"/{self._lang()}/product/{obj.slug if obj.slug else '404-non-existent-product'}" return f"/{self._lang()}/product/{obj.slug if obj.slug else '404-non-existent-product'}"
class CategorySitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-arg] class CategorySitemap(SitemapLanguageMixin, Sitemap):
protocol = "https" protocol = "https"
changefreq = "weekly" changefreq = "weekly"
priority = 0.7 priority = 0.7
@ -109,7 +109,7 @@ class CategorySitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-arg]
return f"/{self._lang()}/catalog/{obj.slug if obj.slug else '404-non-existent-category'}" return f"/{self._lang()}/catalog/{obj.slug if obj.slug else '404-non-existent-category'}"
class BrandSitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-arg] class BrandSitemap(SitemapLanguageMixin, Sitemap):
protocol = "https" protocol = "https"
changefreq = "weekly" changefreq = "weekly"
priority = 0.6 priority = 0.6

View file

@ -8,7 +8,7 @@ register = template.Library()
def _to_float(val: object) -> float: def _to_float(val: object) -> float:
conv: float = 0.0 conv: float = 0.0
with suppress(Exception): with suppress(Exception):
return float(val) # type: ignore [arg-type] return float(val)
return conv return conv

View file

@ -66,15 +66,15 @@ def get_random_code() -> str:
return get_random_string(20) return get_random_string(20)
def get_product_uuid_as_path(instance, filename: str = "") -> str: # type: ignore [no-untyped-def] def get_product_uuid_as_path(instance, filename: str = "") -> str:
return "products" + "/" + str(instance.product.uuid) + "/" + filename return "products" + "/" + str(instance.product.uuid) + "/" + filename
def get_vendor_name_as_path(instance, filename: str = "") -> str: # type: ignore [no-untyped-def] def get_vendor_name_as_path(instance, filename: str = "") -> str:
return "vendors_responses/" + str(instance.name) + "/" + filename return "vendors_responses/" + str(instance.name) + "/" + filename
def get_brand_name_as_path(instance, filename: str = "") -> str: # type: ignore [no-untyped-def] def get_brand_name_as_path(instance, filename: str = "") -> str:
return "brands/" + str(instance.name) + "/" + filename return "brands/" + str(instance.name) + "/" + filename
@ -150,7 +150,7 @@ def get_project_parameters() -> Any:
return parameters return parameters
def resolve_translations_for_elasticsearch(instance, field_name: str) -> None: # type: ignore [no-untyped-def] def resolve_translations_for_elasticsearch(instance, field_name: str) -> None:
""" """
Resolves translations for a given field in an Elasticsearch-compatible Resolves translations for a given field in an Elasticsearch-compatible
format. It checks if the localized version of the field contains data, format. It checks if the localized version of the field contains data,
@ -211,7 +211,7 @@ def is_status_code_success(status_code: int) -> bool:
def get_dynamic_email_connection() -> EmailBackend: def get_dynamic_email_connection() -> EmailBackend:
return mail.get_connection( # type: ignore [no-any-return] return mail.get_connection(
host=config.EMAIL_HOST, host=config.EMAIL_HOST,
port=config.EMAIL_PORT, port=config.EMAIL_PORT,
username=config.EMAIL_HOST_USER, username=config.EMAIL_HOST_USER,

View file

@ -43,14 +43,14 @@ def web_cache(
request: Request | Context, key: str, data: dict[str, Any], timeout: int request: Request | Context, key: str, data: dict[str, Any], timeout: int
) -> dict[str, Any]: ) -> dict[str, Any]:
if not data and not timeout: if not data and not timeout:
return {"data": get_cached_value(request.user, key)} # type: ignore [assignment, arg-type] return {"data": get_cached_value(request.user, key)}
if (data and not timeout) or (timeout and not data): if (data and not timeout) or (timeout and not data):
raise BadRequest(_("both data and timeout are required")) raise BadRequest(_("both data and timeout are required"))
if not 0 < int(timeout) < 216000: if not 0 < int(timeout) < 216000:
raise BadRequest( raise BadRequest(
_("invalid timeout value, it must be between 0 and 216000 seconds") _("invalid timeout value, it must be between 0 and 216000 seconds")
) )
return {"data": set_cached_value(request.user, key, data, timeout)} # type: ignore [assignment, arg-type] return {"data": set_cached_value(request.user, key, data, timeout)}
def set_default_cache() -> None: def set_default_cache() -> None:

View file

@ -160,7 +160,7 @@ def get_top_returned_products(
p = product_by_id[pid] p = product_by_id[pid]
img = "" img = ""
with suppress(Exception): with suppress(Exception):
img = p.images.first().image_url if p.images.exists() else "" # type: ignore [union-attr] img = p.images.first().image_url if p.images.exists() else ""
result.append( result.append(
{ {
"name": p.name, "name": p.name,

View file

@ -121,7 +121,7 @@ def send_order_finished_email(order_pk: str) -> tuple[bool, str]:
"order_products": ops, "order_products": ops,
"project_name": settings.PROJECT_NAME, "project_name": settings.PROJECT_NAME,
"contact_email": config.EMAIL_FROM, "contact_email": config.EMAIL_FROM,
"total_price": round(sum(0.0 or op.buy_price for op in ops), 2), # type: ignore [misc] "total_price": round(sum(0.0 or op.buy_price for op in ops), 2),
"display_system_attributes": order.user.has_perm("core.view_order"), "display_system_attributes": order.user.has_perm("core.view_order"),
"today": datetime.today(), "today": datetime.today(),
}, },

View file

@ -16,7 +16,7 @@ def get_vendors_integrations(name: str | None = None) -> list[AbstractVendor]:
for vendor in vendors: for vendor in vendors:
try: try:
module_name, class_name = vendor.integration_path.rsplit(".", 1) # type: ignore [union-attr] module_name, class_name = vendor.integration_path.rsplit(".", 1)
vendors_integrations.append(create_object(module_name, class_name)) vendors_integrations.append(create_object(module_name, class_name))
except Exception as e: except Exception as e:
logger.warning( logger.warning(

View file

@ -11,11 +11,11 @@ def validate_category_image_dimensions(
if image: if image:
try: try:
width, height = get_image_dimensions(image.file) # type: ignore [arg-type] width, height = get_image_dimensions(image.file)
except (FileNotFoundError, OSError, ValueError): except (FileNotFoundError, OSError, ValueError):
return return
if int(width) > max_width or int(height) > max_height: # type: ignore [arg-type] if int(width) > max_width or int(height) > max_height:
raise ValidationError( raise ValidationError(
_( _(
f"image dimensions should not exceed w{max_width} x h{max_height} pixels" f"image dimensions should not exceed w{max_width} x h{max_height} pixels"

View file

@ -343,7 +343,7 @@ class AbstractVendor:
f"No rate found for {currency} in {rates} with probider {provider}..." f"No rate found for {currency} in {rates} with probider {provider}..."
) )
return float(round(price / rate, 2)) if rate else float(round(price, 2)) # type: ignore [arg-type, operator] return float(round(price / rate, 2)) if rate else float(round(price, 2))
@staticmethod @staticmethod
def round_price_marketologically(price: float) -> float: def round_price_marketologically(price: float) -> float:
@ -536,7 +536,7 @@ class AbstractVendor:
Attribute.objects.filter(name=key, group=attr_group) Attribute.objects.filter(name=key, group=attr_group)
.order_by("uuid") .order_by("uuid")
.first() .first()
) # type: ignore [assignment] )
fields_to_update: list[str] = [] fields_to_update: list[str] = []
if not attribute.is_active: if not attribute.is_active:
attribute.is_active = True attribute.is_active = True

View file

@ -4,6 +4,7 @@ import os
import traceback import traceback
from contextlib import suppress from contextlib import suppress
from datetime import date, timedelta from datetime import date, timedelta
from typing import Any
import requests import requests
from constance import config from constance import config
@ -31,8 +32,6 @@ from django.utils.translation import gettext_lazy as _
from django.views.decorators.cache import cache_page from django.views.decorators.cache import cache_page
from django.views.decorators.vary import vary_on_headers from django.views.decorators.vary import vary_on_headers
from django_ratelimit.decorators import ratelimit from django_ratelimit.decorators import ratelimit
from djangorestframework_camel_case.render import CamelCaseJSONRenderer
from djangorestframework_camel_case.util import camelize
from drf_spectacular.utils import extend_schema_view from drf_spectacular.utils import extend_schema_view
from drf_spectacular.views import ( from drf_spectacular.views import (
SpectacularAPIView, SpectacularAPIView,
@ -42,12 +41,9 @@ from drf_spectacular.views import (
from graphene_file_upload.django import FileUploadGraphQLView from graphene_file_upload.django import FileUploadGraphQLView
from rest_framework import status from rest_framework import status
from rest_framework.permissions import AllowAny from rest_framework.permissions import AllowAny
from rest_framework.renderers import MultiPartRenderer
from rest_framework.request import Request from rest_framework.request import Request
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework_xml.renderers import XMLRenderer
from rest_framework_yaml.renderers import YAMLRenderer
from sentry_sdk import capture_exception from sentry_sdk import capture_exception
from engine.core.docs.drf.views import ( from engine.core.docs.drf.views import (
@ -91,6 +87,7 @@ from engine.core.utils.commerce import (
from engine.core.utils.emailing import contact_us_email from engine.core.utils.emailing import contact_us_email
from engine.core.utils.languages import get_flag_by_language from engine.core.utils.languages import get_flag_by_language
from engine.payments.serializers import TransactionProcessSerializer from engine.payments.serializers import TransactionProcessSerializer
from evibes.utils.renderers import camelize
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -104,7 +101,7 @@ def sitemap_index(request, *args, **kwargs):
# noinspection PyTypeChecker # noinspection PyTypeChecker
sitemap_index.__doc__ = _( # type: ignore [assignment] sitemap_index.__doc__ = _( # pyright: ignore[reportUnknownVariableType]
"Handles the request for the sitemap index and returns an XML response. " "Handles the request for the sitemap index and returns an XML response. "
"It ensures the response includes the appropriate content type header for XML." "It ensures the response includes the appropriate content type header for XML."
) )
@ -119,7 +116,7 @@ def sitemap_detail(request, *args, **kwargs):
# noinspection PyTypeChecker # noinspection PyTypeChecker
sitemap_detail.__doc__ = _( # type: ignore [assignment] sitemap_detail.__doc__ = _( # pyright: ignore[reportUnknownVariableType]
"Handles the detailed view response for a sitemap. " "Handles the detailed view response for a sitemap. "
"This function processes the request, fetches the appropriate " "This function processes the request, fetches the appropriate "
"sitemap detail response, and sets the Content-Type header for XML." "sitemap detail response, and sets the Content-Type header for XML."
@ -155,20 +152,14 @@ class CustomRedocView(SpectacularRedocView):
@extend_schema_view(**LANGUAGE_SCHEMA) @extend_schema_view(**LANGUAGE_SCHEMA)
class SupportedLanguagesView(APIView): class SupportedLanguagesView(APIView):
__doc__ = _( __doc__ = _( # pyright: ignore[reportUnknownVariableType]
"Returns a list of supported languages and their corresponding information." "Returns a list of supported languages and their corresponding information."
) # type: ignore [assignment] )
serializer_class = LanguageSerializer serializer_class = LanguageSerializer
permission_classes = [ permission_classes = [
AllowAny, AllowAny,
] ]
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
def get(self, request: Request, *args, **kwargs) -> Response: def get(self, request: Request, *args, **kwargs) -> Response:
return Response( return Response(
@ -189,18 +180,12 @@ class SupportedLanguagesView(APIView):
@extend_schema_view(**PARAMETERS_SCHEMA) @extend_schema_view(**PARAMETERS_SCHEMA)
class WebsiteParametersView(APIView): class WebsiteParametersView(APIView):
__doc__ = _("Returns the parameters of the website as a JSON object.") # type: ignore [assignment] __doc__ = _("Returns the parameters of the website as a JSON object.")
serializer_class = None serializer_class = None
permission_classes = [ permission_classes = [
AllowAny, AllowAny,
] ]
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
def get(self, request: Request, *args, **kwargs) -> Response: def get(self, request: Request, *args, **kwargs) -> Response:
return Response( return Response(
@ -212,26 +197,20 @@ class WebsiteParametersView(APIView):
class CacheOperatorView(APIView): class CacheOperatorView(APIView):
__doc__ = _( __doc__ = _(
"Handles cache operations such as reading and setting cache data with a specified key and timeout." "Handles cache operations such as reading and setting cache data with a specified key and timeout."
) # type: ignore [assignment] )
serializer_class = CacheOperatorSerializer serializer_class = CacheOperatorSerializer
permission_classes = [ permission_classes = [
AllowAny, AllowAny,
] ]
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
def post(self, request: Request, *args, **kwargs) -> Response: def post(self, request: Request, *args, **kwargs) -> Response:
return Response( return Response(
data=web_cache( data=web_cache(
request, request,
request.data.get("key"), # type: ignore [arg-type] request.data.get("key"),
request.data.get("data", {}), request.data.get("data", {}),
request.data.get("timeout"), # type: ignore [arg-type] request.data.get("timeout"),
), ),
status=status.HTTP_200_OK, status=status.HTTP_200_OK,
) )
@ -239,21 +218,15 @@ class CacheOperatorView(APIView):
@extend_schema_view(**CONTACT_US_SCHEMA) @extend_schema_view(**CONTACT_US_SCHEMA)
class ContactUsView(APIView): class ContactUsView(APIView):
__doc__ = _("Handles `contact us` form submissions.") # type: ignore [assignment] __doc__ = _("Handles `contact us` form submissions.")
serializer_class = ContactUsSerializer serializer_class = ContactUsSerializer
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
@method_decorator(ratelimit(key="ip", rate="2/h", method="POST", block=True)) @method_decorator(ratelimit(key="ip", rate="2/h", method="POST", block=True))
def post(self, request: Request, *args, **kwargs) -> Response: def post(self, request: Request, *args, **kwargs) -> Response:
serializer = self.serializer_class(data=request.data) serializer = self.serializer_class(data=request.data)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
contact_us_email.delay(serializer.validated_data) # type: ignore [attr-defined] contact_us_email.delay(serializer.validated_data)
return Response(data=serializer.data, status=status.HTTP_200_OK) return Response(data=serializer.data, status=status.HTTP_200_OK)
@ -262,17 +235,11 @@ class ContactUsView(APIView):
class RequestCursedURLView(APIView): class RequestCursedURLView(APIView):
__doc__ = _( __doc__ = _(
"Handles requests for processing and validating URLs from incoming POST requests." "Handles requests for processing and validating URLs from incoming POST requests."
) # type: ignore [assignment] )
permission_classes = [ permission_classes = [
AllowAny, AllowAny,
] ]
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
@method_decorator(ratelimit(key="ip", rate="10/h")) @method_decorator(ratelimit(key="ip", rate="10/h"))
def post(self, request: Request, *args, **kwargs) -> Response: def post(self, request: Request, *args, **kwargs) -> Response:
@ -304,14 +271,7 @@ class RequestCursedURLView(APIView):
@extend_schema_view(**SEARCH_SCHEMA) @extend_schema_view(**SEARCH_SCHEMA)
class GlobalSearchView(APIView): class GlobalSearchView(APIView):
__doc__ = _("Handles global search queries.") # type: ignore [assignment] __doc__ = _("Handles global search queries.")
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
def get(self, request: Request, *args, **kwargs) -> Response: def get(self, request: Request, *args, **kwargs) -> Response:
return Response( return Response(
@ -327,7 +287,7 @@ class GlobalSearchView(APIView):
@extend_schema_view(**BUY_AS_BUSINESS_SCHEMA) @extend_schema_view(**BUY_AS_BUSINESS_SCHEMA)
class BuyAsBusinessView(APIView): class BuyAsBusinessView(APIView):
__doc__ = _("Handles the logic of buying as a business without registration.") # type: ignore [assignment] __doc__ = _("Handles the logic of buying as a business without registration.")
# noinspection PyUnusedLocal # noinspection PyUnusedLocal
@method_decorator( @method_decorator(
@ -374,7 +334,7 @@ class BuyAsBusinessView(APIView):
@extend_schema_view(**DOWNLOAD_DIGITAL_ASSET_SCHEMA) @extend_schema_view(**DOWNLOAD_DIGITAL_ASSET_SCHEMA)
class DownloadDigitalAssetView(APIView): class DownloadDigitalAssetView(APIView):
__doc__ = _( # type: ignore [assignment] __doc__ = _(
"Handles the downloading of a digital asset associated with an order.\n" "Handles the downloading of a digital asset associated with an order.\n"
"This function attempts to serve the digital asset file located in the " "This function attempts to serve the digital asset file located in the "
"storage directory of the project. If the file is not found, an HTTP 404 " "storage directory of the project. If the file is not found, an HTTP 404 "
@ -409,7 +369,7 @@ class DownloadDigitalAssetView(APIView):
if not order_product.download.order_product.product: if not order_product.download.order_product.product:
raise BadRequest(_("the order product does not have a product")) raise BadRequest(_("the order product does not have a product"))
file_path = order_product.download.order_product.product.stocks.first().digital_asset.path # type: ignore [union-attr] file_path = order_product.download.order_product.product.stocks.first().digital_asset.path
content_type, encoding = mimetypes.guess_type(file_path) content_type, encoding = mimetypes.guess_type(file_path)
if not content_type: if not content_type:
@ -444,7 +404,9 @@ class DownloadDigitalAssetView(APIView):
) )
def favicon_view(request: HttpRequest, *args, **kwargs) -> HttpResponse | FileResponse: def favicon_view(
request: HttpRequest, *args: list[Any], **kwargs: dict[str, Any]
) -> HttpResponse | FileResponse | None:
try: try:
favicon_path = os.path.join(settings.BASE_DIR, "static/favicon.png") favicon_path = os.path.join(settings.BASE_DIR, "static/favicon.png")
return FileResponse(open(favicon_path, "rb"), content_type="image/x-icon") return FileResponse(open(favicon_path, "rb"), content_type="image/x-icon")
@ -453,7 +415,7 @@ def favicon_view(request: HttpRequest, *args, **kwargs) -> HttpResponse | FileRe
# noinspection PyTypeChecker # noinspection PyTypeChecker
favicon_view.__doc__ = _( # type: ignore [assignment] favicon_view.__doc__ = _(
"Handles requests for the favicon of a website.\n" "Handles requests for the favicon of a website.\n"
"This function attempts to serve the favicon file located in the static directory of the project. " "This function attempts to serve the favicon file located in the static directory of the project. "
"If the favicon file is not found, an HTTP 404 error is raised to indicate the resource is unavailable." "If the favicon file is not found, an HTTP 404 error is raised to indicate the resource is unavailable."
@ -465,7 +427,7 @@ def index(request: HttpRequest, *args, **kwargs) -> HttpResponse | HttpResponseR
# noinspection PyTypeChecker # noinspection PyTypeChecker
index.__doc__ = _( # type: ignore [assignment] index.__doc__ = _(
"Redirects the request to the admin index page. " "Redirects the request to the admin index page. "
"The function handles incoming HTTP requests and redirects them to the Django " "The function handles incoming HTTP requests and redirects them to the Django "
"admin interface index page. It uses Django's `redirect` function for handling " "admin interface index page. It uses Django's `redirect` function for handling "
@ -478,9 +440,7 @@ def version(request: HttpRequest, *args, **kwargs) -> HttpResponse:
# noinspection PyTypeChecker # noinspection PyTypeChecker
version.__doc__ = _( # type: ignore [assignment] version.__doc__ = _("Returns current version of the eVibes. ")
"Returns current version of the eVibes. "
)
def dashboard_callback(request: HttpRequest, context: Context) -> Context: def dashboard_callback(request: HttpRequest, context: Context) -> Context:
@ -631,7 +591,7 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
with suppress(Exception): with suppress(Exception):
quick_links_section = settings.UNFOLD.get("SIDEBAR", {}).get("navigation", [])[ quick_links_section = settings.UNFOLD.get("SIDEBAR", {}).get("navigation", [])[
1 1
] # type: ignore[assignment] ]
for item in quick_links_section.get("items", []): for item in quick_links_section.get("items", []):
title = item.get("title") title = item.get("title")
link = item.get("link") link = item.get("link")
@ -661,7 +621,7 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
if product: if product:
img = ( img = (
product.images.first().image_url if product.images.exists() else "" product.images.first().image_url if product.images.exists() else ""
) # type: ignore [union-attr] )
most_wished = { most_wished = {
"name": product.name, "name": product.name,
"image": img, "image": img,
@ -684,7 +644,7 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
if not pid or pid not in product_by_id: if not pid or pid not in product_by_id:
continue continue
p = product_by_id[pid] p = product_by_id[pid]
img = p.images.first().image_url if p.images.exists() else "" # type: ignore [union-attr] img = p.images.first().image_url if p.images.exists() else ""
most_wished_list.append( most_wished_list.append(
{ {
"name": p.name, "name": p.name,
@ -783,7 +743,7 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
if product: if product:
img = ( img = (
product.images.first().image_url if product.images.exists() else "" product.images.first().image_url if product.images.exists() else ""
) # type: ignore [union-attr] )
most_popular = { most_popular = {
"name": product.name, "name": product.name,
"image": img, "image": img,
@ -806,7 +766,7 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
if not pid or pid not in product_by_id: if not pid or pid not in product_by_id:
continue continue
p = product_by_id[pid] p = product_by_id[pid]
img = p.images.first().image_url if p.images.exists() else "" # type: ignore [union-attr] img = p.images.first().image_url if p.images.exists() else ""
most_popular_list.append( most_popular_list.append(
{ {
"name": p.name, "name": p.name,
@ -905,6 +865,4 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
return context return context
dashboard_callback.__doc__ = _( # type: ignore [assignment] dashboard_callback.__doc__ = _("Returns custom variables for Dashboard. ")
"Returns custom variables for Dashboard. "
)

View file

@ -11,19 +11,15 @@ from django.utils.decorators import method_decorator
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from django_ratelimit.decorators import ratelimit from django_ratelimit.decorators import ratelimit
from djangorestframework_camel_case.render import CamelCaseJSONRenderer
from drf_spectacular.utils import extend_schema_view from drf_spectacular.utils import extend_schema_view
from rest_framework import status from rest_framework import status
from rest_framework.decorators import action from rest_framework.decorators import action
from rest_framework.exceptions import PermissionDenied from rest_framework.exceptions import PermissionDenied
from rest_framework.permissions import AllowAny from rest_framework.permissions import AllowAny
from rest_framework.renderers import MultiPartRenderer
from rest_framework.request import Request from rest_framework.request import Request
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.serializers import Serializer from rest_framework.serializers import Serializer
from rest_framework.viewsets import ModelViewSet from rest_framework.viewsets import ModelViewSet
from rest_framework_xml.renderers import XMLRenderer
from rest_framework_yaml.renderers import YAMLRenderer
from engine.core.docs.drf.viewsets import ( from engine.core.docs.drf.viewsets import (
ADDRESS_SCHEMA, ADDRESS_SCHEMA,
@ -139,7 +135,7 @@ logger = logging.getLogger(__name__)
class EvibesViewSet(ModelViewSet): class EvibesViewSet(ModelViewSet):
__doc__ = _( # type: ignore __doc__ = _(
"Defines a viewset for managing Evibes-related operations. " "Defines a viewset for managing Evibes-related operations. "
"The EvibesViewSet class inherits from ModelViewSet and provides functionality " "The EvibesViewSet class inherits from ModelViewSet and provides functionality "
"for handling actions and operations on Evibes entities. It includes support " "for handling actions and operations on Evibes entities. It includes support "
@ -150,18 +146,12 @@ class EvibesViewSet(ModelViewSet):
action_serializer_classes: dict[str, Type[Serializer]] = {} action_serializer_classes: dict[str, Type[Serializer]] = {}
additional: dict[str, str] = {} additional: dict[str, str] = {}
permission_classes = [EvibesPermission] permission_classes = [EvibesPermission]
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
def get_serializer_class(self) -> Type[Serializer]: def get_serializer_class(self) -> Type[Serializer]:
# noinspection PyTypeChecker # noinspection PyTypeChecker
return self.action_serializer_classes.get( return self.action_serializer_classes.get(
self.action, super().get_serializer_class() self.action, super().get_serializer_class()
) # type: ignore [arg-type] )
@extend_schema_view(**ATTRIBUTE_GROUP_SCHEMA) @extend_schema_view(**ATTRIBUTE_GROUP_SCHEMA)

View file

@ -11,7 +11,7 @@ from django.utils.safestring import SafeString
class JSONTableWidget(forms.Widget): class JSONTableWidget(forms.Widget):
template_name = "json_table_widget.html" template_name = "json_table_widget.html"
def format_value(self, value: str | dict[str, Any]) -> str | dict[str, Any]: # type: ignore [override] def format_value(self, value: str | dict[str, Any]) -> str | dict[str, Any]:
if isinstance(value, dict): if isinstance(value, dict):
return value return value
try: try:
@ -40,8 +40,8 @@ class JSONTableWidget(forms.Widget):
json_data = {} json_data = {}
try: try:
keys = data.getlist(f"{name}_key") # type: ignore [attr-defined] keys = data.getlist(f"{name}_key")
values = data.getlist(f"{name}_value") # type: ignore [attr-defined] values = data.getlist(f"{name}_value")
for key, value in zip(keys, values, strict=True): for key, value in zip(keys, values, strict=True):
if key.strip(): if key.strip():
try: try:

View file

@ -9,7 +9,7 @@ from engine.payments.forms import GatewayForm, TransactionForm
from engine.payments.models import Balance, Gateway, Transaction from engine.payments.models import Balance, Gateway, Transaction
class TransactionInline(TabularInline): # type: ignore [type-arg] class TransactionInline(TabularInline):
model = Transaction model = Transaction
form = TransactionForm form = TransactionForm
extra = 1 extra = 1
@ -23,7 +23,7 @@ class TransactionInline(TabularInline): # type: ignore [type-arg]
@register(Balance) @register(Balance)
class BalanceAdmin(ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] class BalanceAdmin(ActivationActionsMixin, ModelAdmin):
inlines = (TransactionInline,) inlines = (TransactionInline,)
list_display = ("user", "amount") list_display = ("user", "amount")
search_fields = ("user__email",) search_fields = ("user__email",)
@ -35,7 +35,7 @@ class BalanceAdmin(ActivationActionsMixin, ModelAdmin): # type: ignore [misc, t
@register(Transaction) @register(Transaction)
class TransactionAdmin(ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg] class TransactionAdmin(ActivationActionsMixin, ModelAdmin):
list_display = ("balance", "amount", "order", "modified", "created") list_display = ("balance", "amount", "order", "modified", "created")
search_fields = ("balance__user__email", "currency", "payment_method") search_fields = ("balance__user__email", "currency", "payment_method")
list_filter = ("currency", "payment_method") list_filter = ("currency", "payment_method")
@ -44,7 +44,7 @@ class TransactionAdmin(ActivationActionsMixin, ModelAdmin): # type: ignore [mis
@register(Gateway) @register(Gateway)
class GatewayAdmin(ActivationActionsMixin, ModelAdmin): # type: ignore [misc] class GatewayAdmin(ActivationActionsMixin, ModelAdmin):
list_display = ( list_display = (
"name", "name",
"can_be_used", "can_be_used",
@ -57,8 +57,8 @@ class GatewayAdmin(ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
ordering = ("name",) ordering = ("name",)
form = GatewayForm form = GatewayForm
def can_be_used(self, obj: Gateway) -> bool: # type: ignore[override] def can_be_used(self, obj: Gateway) -> bool:
return obj.can_be_used return obj.can_be_used
can_be_used.boolean = True # type: ignore[attr-defined] can_be_used.boolean = True
can_be_used.short_description = _("can be used") # type: ignore[attr-defined] can_be_used.short_description = _("can be used")

View file

@ -4,7 +4,7 @@ from engine.core.widgets import JSONTableWidget
from engine.payments.models import Gateway, Transaction from engine.payments.models import Gateway, Transaction
class TransactionForm(forms.ModelForm): # type: ignore [type-arg] class TransactionForm(forms.ModelForm):
class Meta: class Meta:
model = Transaction model = Transaction
fields = "__all__" fields = "__all__"
@ -13,7 +13,7 @@ class TransactionForm(forms.ModelForm): # type: ignore [type-arg]
} }
class GatewayForm(forms.ModelForm): # type: ignore [type-arg] class GatewayForm(forms.ModelForm):
class Meta: class Meta:
model = Gateway model = Gateway
fields = "__all__" fields = "__all__"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-01-30 03:27+0000\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: BRITISH ENGLISH <CONTACT@FUREUNOIR.COM>\n" "Language-Team: BRITISH ENGLISH <CONTACT@FUREUNOIR.COM>\n"
@ -13,11 +13,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: engine/payments/admin.py:17 engine/payments/models.py:56 #: engine/payments/admin.py:17 engine/payments/models.py:68
msgid "transaction" msgid "transaction"
msgstr "المعاملات" msgstr "المعاملات"
#: engine/payments/admin.py:18 engine/payments/models.py:57 #: engine/payments/admin.py:18 engine/payments/models.py:69
msgid "transactions" msgid "transactions"
msgstr "المعاملات" msgstr "المعاملات"
@ -37,19 +37,19 @@ msgstr "الإيداع"
msgid "withdraw" msgid "withdraw"
msgstr "سحب" msgstr "سحب"
#: engine/payments/docs/drf/views.py:13 #: engine/payments/docs/drf/views.py:17
msgid "deposit to balance" msgid "deposit to balance"
msgstr "الإيداع في الرصيد" msgstr "الإيداع في الرصيد"
#: engine/payments/docs/drf/views.py:14 #: engine/payments/docs/drf/views.py:18
msgid "deposit some money to balance" msgid "deposit some money to balance"
msgstr "إيداع بعض الأموال لتحقيق التوازن" msgstr "إيداع بعض الأموال لتحقيق التوازن"
#: engine/payments/docs/drf/views.py:29 #: engine/payments/docs/drf/views.py:33
msgid "payment limits" msgid "payment limits"
msgstr "حدود الدفع" msgstr "حدود الدفع"
#: engine/payments/docs/drf/views.py:30 #: engine/payments/docs/drf/views.py:35
msgid "" msgid ""
"retrieve minimal and maximal allowed deposit amounts across available " "retrieve minimal and maximal allowed deposit amounts across available "
"gateways" "gateways"
@ -69,88 +69,88 @@ msgstr "استرداد معاملة واحدة (للقراءة فقط)"
msgid "Transaction UUID" msgid "Transaction UUID"
msgstr "معرّف المعاملة UUID" msgstr "معرّف المعاملة UUID"
#: engine/payments/models.py:36 #: engine/payments/models.py:42
msgid "order to process after paid" msgid "order to process after paid"
msgstr "طلب المعالجة بعد الدفع" msgstr "طلب المعالجة بعد الدفع"
#: engine/payments/models.py:39 #: engine/payments/models.py:45
msgid "processing details" msgid "processing details"
msgstr "تفاصيل المعالجة" msgstr "تفاصيل المعالجة"
#: engine/payments/models.py:75 #: engine/payments/models.py:91
msgid "balance" msgid "balance"
msgstr "الرصيد" msgstr "الرصيد"
#: engine/payments/models.py:76 #: engine/payments/models.py:92
msgid "balances" msgid "balances"
msgstr "الموازين" msgstr "الموازين"
#: engine/payments/models.py:86 #: engine/payments/models.py:102
msgid "name" msgid "name"
msgstr "الاسم" msgstr "الاسم"
#: engine/payments/models.py:91 #: engine/payments/models.py:107
msgid "default currency" msgid "default currency"
msgstr "العملة الافتراضية" msgstr "العملة الافتراضية"
#: engine/payments/models.py:98 #: engine/payments/models.py:114
msgid "currencies" msgid "currencies"
msgstr "العملات" msgstr "العملات"
#: engine/payments/models.py:100 #: engine/payments/models.py:116
msgid "comma separated list of currencies supported by this gateway, " msgid "comma separated list of currencies supported by this gateway, "
msgstr "قائمة مفصولة بفاصلة بالعملات التي تدعمها هذه البوابة," msgstr "قائمة مفصولة بفاصلة بالعملات التي تدعمها هذه البوابة,"
#: engine/payments/models.py:106 #: engine/payments/models.py:122
msgid "minimum transaction amount" msgid "minimum transaction amount"
msgstr "الحد الأدنى لمبلغ المعاملة" msgstr "الحد الأدنى لمبلغ المعاملة"
#: engine/payments/models.py:109 #: engine/payments/models.py:125
msgid "maximum transaction amount" msgid "maximum transaction amount"
msgstr "الحد الأقصى لمبلغ المعاملة" msgstr "الحد الأقصى لمبلغ المعاملة"
#: engine/payments/models.py:115 #: engine/payments/models.py:131
msgid "daily limit" msgid "daily limit"
msgstr "الحد اليومي" msgstr "الحد اليومي"
#: engine/payments/models.py:116 #: engine/payments/models.py:132
msgid "daily sum limit of transactions' amounts. 0 means no limit" msgid "daily sum limit of transactions' amounts. 0 means no limit"
msgstr "حد المجموع اليومي لمبالغ المعاملات. 0 يعني عدم وجود حد" msgstr "حد المجموع اليومي لمبالغ المعاملات. 0 يعني عدم وجود حد"
#: engine/payments/models.py:122 #: engine/payments/models.py:138
msgid "monthly limit" msgid "monthly limit"
msgstr "الحد الشهري" msgstr "الحد الشهري"
#: engine/payments/models.py:123 #: engine/payments/models.py:139
msgid "monthly sum limit of transactions' amounts. 0 means no limit" msgid "monthly sum limit of transactions' amounts. 0 means no limit"
msgstr "حد المجموع الشهري لمبالغ المعاملات. 0 يعني عدم وجود حد" msgstr "حد المجموع الشهري لمبالغ المعاملات. 0 يعني عدم وجود حد"
#: engine/payments/models.py:125 #: engine/payments/models.py:142
msgid "priority" msgid "priority"
msgstr "الأولوية" msgstr "الأولوية"
#: engine/payments/models.py:126 #: engine/payments/models.py:145
msgid "integration variables" msgid "integration variables"
msgstr "متغيرات التكامل" msgstr "متغيرات التكامل"
#: engine/payments/models.py:132 #: engine/payments/models.py:152
msgid "payment gateway" msgid "payment gateway"
msgstr "بوابة الدفع" msgstr "بوابة الدفع"
#: engine/payments/models.py:133 #: engine/payments/models.py:153
msgid "payment gateways" msgid "payment gateways"
msgstr "بوابات الدفع" msgstr "بوابات الدفع"
#: engine/payments/models.py:169 #: engine/payments/models.py:198
msgid "gateway integration path is not set" msgid "gateway integration path is not set"
msgstr "لم يتم تعيين مسار تكامل البوابة" msgstr "لم يتم تعيين مسار تكامل البوابة"
#: engine/payments/models.py:174 #: engine/payments/models.py:204
#, python-format #, python-format
msgid "invalid integration path: %(path)s" msgid "invalid integration path: %(path)s"
msgstr "مسار تكامل غير صالح: %(path)s" msgstr "مسار تكامل غير صالح: %(path)s"
#: engine/payments/signals.py:41 #: engine/payments/signals.py:45
msgid "the transaction amount didn't fit into allowed limits: " msgid "the transaction amount didn't fit into allowed limits: "
msgstr "لم يتناسب مبلغ المعاملة مع الحدود المسموح بها:" msgstr "لم يتناسب مبلغ المعاملة مع الحدود المسموح بها:"
@ -204,12 +204,12 @@ msgstr "مطلوب مزود للحصول على الأسعار من"
msgid "couldn't find provider {provider}" msgid "couldn't find provider {provider}"
msgstr "تعذر العثور على مزود {provider}" msgstr "تعذر العثور على مزود {provider}"
#: engine/payments/utils/emailing.py:28 #: engine/payments/utils/emailing.py:31
#, python-brace-format #, python-brace-format
msgid "{settings.PROJECT_NAME} | balance deposit" msgid "{settings.PROJECT_NAME} | balance deposit"
msgstr "{settings.PROJECT_NAME} | إيداع الرصيد" msgstr "{settings.PROJECT_NAME} | إيداع الرصيد"
#: engine/payments/views.py:24 #: engine/payments/views.py:28
msgid "" msgid ""
"This class provides an API endpoint to handle deposit transactions.\n" "This class provides an API endpoint to handle deposit transactions.\n"
"It supports the creation of a deposit transaction after validating the " "It supports the creation of a deposit transaction after validating the "
@ -222,7 +222,7 @@ msgstr ""
"مصادقة المستخدم، يتم إرجاع استجابة مناسبة. عند التحقق والتنفيذ بنجاح، يتم " "مصادقة المستخدم، يتم إرجاع استجابة مناسبة. عند التحقق والتنفيذ بنجاح، يتم "
"توفير استجابة بتفاصيل المعاملة." "توفير استجابة بتفاصيل المعاملة."
#: engine/payments/views.py:50 #: engine/payments/views.py:61
msgid "" msgid ""
"Handles incoming callback requests to the API.\n" "Handles incoming callback requests to the API.\n"
"This class processes and routes incoming HTTP POST requests to the " "This class processes and routes incoming HTTP POST requests to the "
@ -235,17 +235,17 @@ msgstr ""
"المناسب بناءً على معلمة البوابة المقدمة. وهو مصمم للتعامل مع أحداث رد الاتصال " "المناسب بناءً على معلمة البوابة المقدمة. وهو مصمم للتعامل مع أحداث رد الاتصال "
"الواردة من أنظمة خارجية وتوفير استجابة HTTP مناسبة تشير إلى النجاح أو الفشل." "الواردة من أنظمة خارجية وتوفير استجابة HTTP مناسبة تشير إلى النجاح أو الفشل."
#: engine/payments/views.py:61 #: engine/payments/views.py:75
#, python-brace-format #, python-brace-format
msgid "Transaction {transaction.uuid} has no gateway" msgid "Transaction {transaction.uuid} has no gateway"
msgstr "لا تحتوي المعاملة {transaction.uuid} على بوابة" msgstr "لا تحتوي المعاملة {transaction.uuid} على بوابة"
#: engine/payments/views.py:64 #: engine/payments/views.py:82
#, python-brace-format #, python-brace-format
msgid "Gateway {transaction.gateway} has no integration" msgid "Gateway {transaction.gateway} has no integration"
msgstr "البوابة {transaction.gateway} ليس لها تكامل" msgstr "البوابة {transaction.gateway} ليس لها تكامل"
#: engine/payments/views.py:76 #: engine/payments/views.py:96
msgid "" msgid ""
"This endpoint returns minimal and maximal allowed deposit amounts across " "This endpoint returns minimal and maximal allowed deposit amounts across "
"available gateways." "available gateways."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-01-30 03:27+0000\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: BRITISH ENGLISH <CONTACT@FUREUNOIR.COM>\n" "Language-Team: BRITISH ENGLISH <CONTACT@FUREUNOIR.COM>\n"
@ -13,11 +13,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: engine/payments/admin.py:17 engine/payments/models.py:56 #: engine/payments/admin.py:17 engine/payments/models.py:68
msgid "transaction" msgid "transaction"
msgstr "Transakce" msgstr "Transakce"
#: engine/payments/admin.py:18 engine/payments/models.py:57 #: engine/payments/admin.py:18 engine/payments/models.py:69
msgid "transactions" msgid "transactions"
msgstr "Transakce" msgstr "Transakce"
@ -37,19 +37,19 @@ msgstr "Vklad"
msgid "withdraw" msgid "withdraw"
msgstr "Stáhnout" msgstr "Stáhnout"
#: engine/payments/docs/drf/views.py:13 #: engine/payments/docs/drf/views.py:17
msgid "deposit to balance" msgid "deposit to balance"
msgstr "Vklad do zůstatku" msgstr "Vklad do zůstatku"
#: engine/payments/docs/drf/views.py:14 #: engine/payments/docs/drf/views.py:18
msgid "deposit some money to balance" msgid "deposit some money to balance"
msgstr "Vložte nějaké peníze na účet" msgstr "Vložte nějaké peníze na účet"
#: engine/payments/docs/drf/views.py:29 #: engine/payments/docs/drf/views.py:33
msgid "payment limits" msgid "payment limits"
msgstr "Limity plateb" msgstr "Limity plateb"
#: engine/payments/docs/drf/views.py:30 #: engine/payments/docs/drf/views.py:35
msgid "" msgid ""
"retrieve minimal and maximal allowed deposit amounts across available " "retrieve minimal and maximal allowed deposit amounts across available "
"gateways" "gateways"
@ -69,88 +69,88 @@ msgstr "Získání jedné transakce (pouze pro čtení)"
msgid "Transaction UUID" msgid "Transaction UUID"
msgstr "UUID transakce" msgstr "UUID transakce"
#: engine/payments/models.py:36 #: engine/payments/models.py:42
msgid "order to process after paid" msgid "order to process after paid"
msgstr "Objednávka ke zpracování po zaplacení" msgstr "Objednávka ke zpracování po zaplacení"
#: engine/payments/models.py:39 #: engine/payments/models.py:45
msgid "processing details" msgid "processing details"
msgstr "Podrobnosti o zpracování" msgstr "Podrobnosti o zpracování"
#: engine/payments/models.py:75 #: engine/payments/models.py:91
msgid "balance" msgid "balance"
msgstr "Bilance" msgstr "Bilance"
#: engine/payments/models.py:76 #: engine/payments/models.py:92
msgid "balances" msgid "balances"
msgstr "Váhy" msgstr "Váhy"
#: engine/payments/models.py:86 #: engine/payments/models.py:102
msgid "name" msgid "name"
msgstr "název" msgstr "název"
#: engine/payments/models.py:91 #: engine/payments/models.py:107
msgid "default currency" msgid "default currency"
msgstr "výchozí měna" msgstr "výchozí měna"
#: engine/payments/models.py:98 #: engine/payments/models.py:114
msgid "currencies" msgid "currencies"
msgstr "měny" msgstr "měny"
#: engine/payments/models.py:100 #: engine/payments/models.py:116
msgid "comma separated list of currencies supported by this gateway, " msgid "comma separated list of currencies supported by this gateway, "
msgstr "seznam měn podporovaných touto bránou oddělený čárkou," msgstr "seznam měn podporovaných touto bránou oddělený čárkou,"
#: engine/payments/models.py:106 #: engine/payments/models.py:122
msgid "minimum transaction amount" msgid "minimum transaction amount"
msgstr "minimální částka transakce" msgstr "minimální částka transakce"
#: engine/payments/models.py:109 #: engine/payments/models.py:125
msgid "maximum transaction amount" msgid "maximum transaction amount"
msgstr "maximální částka transakce" msgstr "maximální částka transakce"
#: engine/payments/models.py:115 #: engine/payments/models.py:131
msgid "daily limit" msgid "daily limit"
msgstr "denní limit" msgstr "denní limit"
#: engine/payments/models.py:116 #: engine/payments/models.py:132
msgid "daily sum limit of transactions' amounts. 0 means no limit" msgid "daily sum limit of transactions' amounts. 0 means no limit"
msgstr "denní limit součtu částek transakcí. 0 znamená žádný limit" msgstr "denní limit součtu částek transakcí. 0 znamená žádný limit"
#: engine/payments/models.py:122 #: engine/payments/models.py:138
msgid "monthly limit" msgid "monthly limit"
msgstr "měsíční limit" msgstr "měsíční limit"
#: engine/payments/models.py:123 #: engine/payments/models.py:139
msgid "monthly sum limit of transactions' amounts. 0 means no limit" msgid "monthly sum limit of transactions' amounts. 0 means no limit"
msgstr "měsíční limit součtu částek transakcí. 0 znamená žádný limit" msgstr "měsíční limit součtu částek transakcí. 0 znamená žádný limit"
#: engine/payments/models.py:125 #: engine/payments/models.py:142
msgid "priority" msgid "priority"
msgstr "priorita" msgstr "priorita"
#: engine/payments/models.py:126 #: engine/payments/models.py:145
msgid "integration variables" msgid "integration variables"
msgstr "integrační proměnné" msgstr "integrační proměnné"
#: engine/payments/models.py:132 #: engine/payments/models.py:152
msgid "payment gateway" msgid "payment gateway"
msgstr "platební brána" msgstr "platební brána"
#: engine/payments/models.py:133 #: engine/payments/models.py:153
msgid "payment gateways" msgid "payment gateways"
msgstr "platební brány" msgstr "platební brány"
#: engine/payments/models.py:169 #: engine/payments/models.py:198
msgid "gateway integration path is not set" msgid "gateway integration path is not set"
msgstr "cesta integrace brány není nastavena" msgstr "cesta integrace brány není nastavena"
#: engine/payments/models.py:174 #: engine/payments/models.py:204
#, python-format #, python-format
msgid "invalid integration path: %(path)s" msgid "invalid integration path: %(path)s"
msgstr "neplatná cesta integrace: %(path)s" msgstr "neplatná cesta integrace: %(path)s"
#: engine/payments/signals.py:41 #: engine/payments/signals.py:45
msgid "the transaction amount didn't fit into allowed limits: " msgid "the transaction amount didn't fit into allowed limits: "
msgstr "Částka transakce se nevešla do povolených limitů:" msgstr "Částka transakce se nevešla do povolených limitů:"
@ -204,12 +204,12 @@ msgstr "Je třeba mít poskytovatele, od kterého lze získat sazby"
msgid "couldn't find provider {provider}" msgid "couldn't find provider {provider}"
msgstr "Nepodařilo se najít poskytovatele {provider}" msgstr "Nepodařilo se najít poskytovatele {provider}"
#: engine/payments/utils/emailing.py:28 #: engine/payments/utils/emailing.py:31
#, python-brace-format #, python-brace-format
msgid "{settings.PROJECT_NAME} | balance deposit" msgid "{settings.PROJECT_NAME} | balance deposit"
msgstr "{settings.PROJECT_NAME} | zůstatek vkladu" msgstr "{settings.PROJECT_NAME} | zůstatek vkladu"
#: engine/payments/views.py:24 #: engine/payments/views.py:28
msgid "" msgid ""
"This class provides an API endpoint to handle deposit transactions.\n" "This class provides an API endpoint to handle deposit transactions.\n"
"It supports the creation of a deposit transaction after validating the " "It supports the creation of a deposit transaction after validating the "
@ -222,7 +222,7 @@ msgstr ""
"uživatel není ověřen, je vrácena odpovídající odpověď. Při úspěšném ověření " "uživatel není ověřen, je vrácena odpovídající odpověď. Při úspěšném ověření "
"a provedení je poskytnuta odpověď s údaji o transakci." "a provedení je poskytnuta odpověď s údaji o transakci."
#: engine/payments/views.py:50 #: engine/payments/views.py:61
msgid "" msgid ""
"Handles incoming callback requests to the API.\n" "Handles incoming callback requests to the API.\n"
"This class processes and routes incoming HTTP POST requests to the " "This class processes and routes incoming HTTP POST requests to the "
@ -236,17 +236,17 @@ msgstr ""
"zpracovávala události zpětného volání přicházející z externích systémů a " "zpracovávala události zpětného volání přicházející z externích systémů a "
"poskytovala příslušnou odpověď HTTP označující úspěch nebo selhání." "poskytovala příslušnou odpověď HTTP označující úspěch nebo selhání."
#: engine/payments/views.py:61 #: engine/payments/views.py:75
#, python-brace-format #, python-brace-format
msgid "Transaction {transaction.uuid} has no gateway" msgid "Transaction {transaction.uuid} has no gateway"
msgstr "Transakce {transaction.uuid} nemá žádnou bránu" msgstr "Transakce {transaction.uuid} nemá žádnou bránu"
#: engine/payments/views.py:64 #: engine/payments/views.py:82
#, python-brace-format #, python-brace-format
msgid "Gateway {transaction.gateway} has no integration" msgid "Gateway {transaction.gateway} has no integration"
msgstr "Brána {transaction.gateway} nemá žádnou integraci" msgstr "Brána {transaction.gateway} nemá žádnou integraci"
#: engine/payments/views.py:76 #: engine/payments/views.py:96
msgid "" msgid ""
"This endpoint returns minimal and maximal allowed deposit amounts across " "This endpoint returns minimal and maximal allowed deposit amounts across "
"available gateways." "available gateways."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: EVIBES 2025.4\n" "Project-Id-Version: EVIBES 2025.4\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-12-10 21:44+0300\n" "POT-Creation-Date: 2025-12-18 17:19+0300\n"
"PO-Revision-Date: 2025-01-30 03:27+0000\n" "PO-Revision-Date: 2025-01-30 03:27+0000\n"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n" "Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: BRITISH ENGLISH <CONTACT@FUREUNOIR.COM>\n" "Language-Team: BRITISH ENGLISH <CONTACT@FUREUNOIR.COM>\n"
@ -13,11 +13,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: engine/payments/admin.py:17 engine/payments/models.py:56 #: engine/payments/admin.py:17 engine/payments/models.py:68
msgid "transaction" msgid "transaction"
msgstr "Transaktion" msgstr "Transaktion"
#: engine/payments/admin.py:18 engine/payments/models.py:57 #: engine/payments/admin.py:18 engine/payments/models.py:69
msgid "transactions" msgid "transactions"
msgstr "Transaktioner" msgstr "Transaktioner"
@ -37,19 +37,19 @@ msgstr "Indskud"
msgid "withdraw" msgid "withdraw"
msgstr "Træk dig tilbage" msgstr "Træk dig tilbage"
#: engine/payments/docs/drf/views.py:13 #: engine/payments/docs/drf/views.py:17
msgid "deposit to balance" msgid "deposit to balance"
msgstr "Indbetaling til saldo" msgstr "Indbetaling til saldo"
#: engine/payments/docs/drf/views.py:14 #: engine/payments/docs/drf/views.py:18
msgid "deposit some money to balance" msgid "deposit some money to balance"
msgstr "Sæt nogle penge ind på saldoen" msgstr "Sæt nogle penge ind på saldoen"
#: engine/payments/docs/drf/views.py:29 #: engine/payments/docs/drf/views.py:33
msgid "payment limits" msgid "payment limits"
msgstr "Grænser for betaling" msgstr "Grænser for betaling"
#: engine/payments/docs/drf/views.py:30 #: engine/payments/docs/drf/views.py:35
msgid "" msgid ""
"retrieve minimal and maximal allowed deposit amounts across available " "retrieve minimal and maximal allowed deposit amounts across available "
"gateways" "gateways"
@ -69,88 +69,88 @@ msgstr "Hent en enkelt transaktion (skrivebeskyttet)"
msgid "Transaction UUID" msgid "Transaction UUID"
msgstr "Transaktions-UUID" msgstr "Transaktions-UUID"
#: engine/payments/models.py:36 #: engine/payments/models.py:42
msgid "order to process after paid" msgid "order to process after paid"
msgstr "Ordre til behandling efter betaling" msgstr "Ordre til behandling efter betaling"
#: engine/payments/models.py:39 #: engine/payments/models.py:45
msgid "processing details" msgid "processing details"
msgstr "Behandling af detaljer" msgstr "Behandling af detaljer"
#: engine/payments/models.py:75 #: engine/payments/models.py:91
msgid "balance" msgid "balance"
msgstr "Balance" msgstr "Balance"
#: engine/payments/models.py:76 #: engine/payments/models.py:92
msgid "balances" msgid "balances"
msgstr "Vægte" msgstr "Vægte"
#: engine/payments/models.py:86 #: engine/payments/models.py:102
msgid "name" msgid "name"
msgstr "Navn" msgstr "Navn"
#: engine/payments/models.py:91 #: engine/payments/models.py:107
msgid "default currency" msgid "default currency"
msgstr "Standardvaluta" msgstr "Standardvaluta"
#: engine/payments/models.py:98 #: engine/payments/models.py:114
msgid "currencies" msgid "currencies"
msgstr "Valutaer" msgstr "Valutaer"
#: engine/payments/models.py:100 #: engine/payments/models.py:116
msgid "comma separated list of currencies supported by this gateway, " msgid "comma separated list of currencies supported by this gateway, "
msgstr "kommasepareret liste over valutaer, der understøttes af denne gateway," msgstr "kommasepareret liste over valutaer, der understøttes af denne gateway,"
#: engine/payments/models.py:106 #: engine/payments/models.py:122
msgid "minimum transaction amount" msgid "minimum transaction amount"
msgstr "mindste transaktionsbeløb" msgstr "mindste transaktionsbeløb"
#: engine/payments/models.py:109 #: engine/payments/models.py:125
msgid "maximum transaction amount" msgid "maximum transaction amount"
msgstr "maksimalt transaktionsbeløb" msgstr "maksimalt transaktionsbeløb"
#: engine/payments/models.py:115 #: engine/payments/models.py:131
msgid "daily limit" msgid "daily limit"
msgstr "daglig grænse" msgstr "daglig grænse"
#: engine/payments/models.py:116 #: engine/payments/models.py:132
msgid "daily sum limit of transactions' amounts. 0 means no limit" msgid "daily sum limit of transactions' amounts. 0 means no limit"
msgstr "daglig sumgrænse for transaktionsbeløb. 0 betyder ingen grænse" msgstr "daglig sumgrænse for transaktionsbeløb. 0 betyder ingen grænse"
#: engine/payments/models.py:122 #: engine/payments/models.py:138
msgid "monthly limit" msgid "monthly limit"
msgstr "månedlig grænse" msgstr "månedlig grænse"
#: engine/payments/models.py:123 #: engine/payments/models.py:139
msgid "monthly sum limit of transactions' amounts. 0 means no limit" msgid "monthly sum limit of transactions' amounts. 0 means no limit"
msgstr "månedlig sumgrænse for transaktionsbeløb. 0 betyder ingen grænse" msgstr "månedlig sumgrænse for transaktionsbeløb. 0 betyder ingen grænse"
#: engine/payments/models.py:125 #: engine/payments/models.py:142
msgid "priority" msgid "priority"
msgstr "prioritet" msgstr "prioritet"
#: engine/payments/models.py:126 #: engine/payments/models.py:145
msgid "integration variables" msgid "integration variables"
msgstr "Integrationsvariabler" msgstr "Integrationsvariabler"
#: engine/payments/models.py:132 #: engine/payments/models.py:152
msgid "payment gateway" msgid "payment gateway"
msgstr "betalingsgateway" msgstr "betalingsgateway"
#: engine/payments/models.py:133 #: engine/payments/models.py:153
msgid "payment gateways" msgid "payment gateways"
msgstr "Betalingsgateways" msgstr "Betalingsgateways"
#: engine/payments/models.py:169 #: engine/payments/models.py:198
msgid "gateway integration path is not set" msgid "gateway integration path is not set"
msgstr "gateway-integrationsstien er ikke indstillet" msgstr "gateway-integrationsstien er ikke indstillet"
#: engine/payments/models.py:174 #: engine/payments/models.py:204
#, python-format #, python-format
msgid "invalid integration path: %(path)s" msgid "invalid integration path: %(path)s"
msgstr "Ugyldig integrationssti: %(path)s." msgstr "Ugyldig integrationssti: %(path)s."
#: engine/payments/signals.py:41 #: engine/payments/signals.py:45
msgid "the transaction amount didn't fit into allowed limits: " msgid "the transaction amount didn't fit into allowed limits: "
msgstr "Transaktionsbeløbet passede ikke ind i de tilladte grænser:" msgstr "Transaktionsbeløbet passede ikke ind i de tilladte grænser:"
@ -204,12 +204,12 @@ msgstr "Der er brug for en udbyder at få priser fra"
msgid "couldn't find provider {provider}" msgid "couldn't find provider {provider}"
msgstr "Kunne ikke finde udbyder {provider}." msgstr "Kunne ikke finde udbyder {provider}."
#: engine/payments/utils/emailing.py:28 #: engine/payments/utils/emailing.py:31
#, python-brace-format #, python-brace-format
msgid "{settings.PROJECT_NAME} | balance deposit" msgid "{settings.PROJECT_NAME} | balance deposit"
msgstr "{settings.PROJECT_NAME} | Saldoindbetaling" msgstr "{settings.PROJECT_NAME} | Saldoindbetaling"
#: engine/payments/views.py:24 #: engine/payments/views.py:28
msgid "" msgid ""
"This class provides an API endpoint to handle deposit transactions.\n" "This class provides an API endpoint to handle deposit transactions.\n"
"It supports the creation of a deposit transaction after validating the " "It supports the creation of a deposit transaction after validating the "
@ -224,7 +224,7 @@ msgstr ""
"passende svar. Ved vellykket validering og udførelse leveres et svar med " "passende svar. Ved vellykket validering og udførelse leveres et svar med "
"transaktionsoplysningerne." "transaktionsoplysningerne."
#: engine/payments/views.py:50 #: engine/payments/views.py:61
msgid "" msgid ""
"Handles incoming callback requests to the API.\n" "Handles incoming callback requests to the API.\n"
"This class processes and routes incoming HTTP POST requests to the " "This class processes and routes incoming HTTP POST requests to the "
@ -238,17 +238,17 @@ msgstr ""
"designet til at håndtere tilbagekaldshændelser, der kommer fra eksterne " "designet til at håndtere tilbagekaldshændelser, der kommer fra eksterne "
"systemer, og give et passende HTTP-svar, der angiver succes eller fiasko." "systemer, og give et passende HTTP-svar, der angiver succes eller fiasko."
#: engine/payments/views.py:61 #: engine/payments/views.py:75
#, python-brace-format #, python-brace-format
msgid "Transaction {transaction.uuid} has no gateway" msgid "Transaction {transaction.uuid} has no gateway"
msgstr "Transaktion {transaction.uuid} har ingen gateway" msgstr "Transaktion {transaction.uuid} har ingen gateway"
#: engine/payments/views.py:64 #: engine/payments/views.py:82
#, python-brace-format #, python-brace-format
msgid "Gateway {transaction.gateway} has no integration" msgid "Gateway {transaction.gateway} has no integration"
msgstr "Gateway {transaction.gateway} har ingen integration" msgstr "Gateway {transaction.gateway} har ingen integration"
#: engine/payments/views.py:76 #: engine/payments/views.py:96
msgid "" msgid ""
"This endpoint returns minimal and maximal allowed deposit amounts across " "This endpoint returns minimal and maximal allowed deposit amounts across "
"available gateways." "available gateways."

Some files were not shown because too many files have changed in this diff Show more