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

View file

@ -9,5 +9,5 @@ class BlogConfig(AppConfig):
# noinspection PyUnresolvedReferences
def ready(self) -> None:
import engine.blog.elasticsearch.documents
import engine.blog.elasticsearch.documents # 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
class PostDocument(ActiveOnlyMixin, BaseDocument): # type: ignore [misc]
class PostDocument(ActiveOnlyMixin, BaseDocument):
title = fields.TextField(
attr="title",
analyzer="standard",

View file

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

View file

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

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "سرد جميع المشاركات (للقراءة فقط)"
msgid "retrieve a single post (read-only)"
msgstr "استرداد منشور واحد (للقراءة فقط)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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"
msgstr "عنوان المنشور"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "العنوان"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"هل هذا منشور لصفحة ذات عنوان URL ثابت (على سبيل المثال '/مساعدة/التسليم'؟)"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "المنشور"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "المنشورات"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"ملفات تخفيض السعر غير مدعومة Yer - استخدم محتوى تخفيض السعر بدلاً من ذلك!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr "يجب توفير ملف ترميز أو محتوى ترميز مخفض - متنافيان"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "معرّف العلامة الداخلي لعلامة المنشور"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "اسم العلامة"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "اسم سهل الاستخدام لعلامة المنشور"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "اسم عرض العلامة"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "علامة المشاركة"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "علامات المشاركة"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Získání jednoho příspěvku (pouze pro čtení)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"také automatické generování slugu na základě názvu."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Název příspěvku"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Název"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"je to příspěvek pro stránku se statickou adresou URL (např. `/help/"
"delivery`)?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "Příspěvek"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
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"
msgstr ""
"Soubory Markdown nejsou podporovány - místo toho použijte obsah Markdown!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"musí být poskytnut soubor markdown nebo obsah markdown - vzájemně se "
"vylučují."
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "interní identifikátor tagu pro tag příspěvku"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Název štítku"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
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"
msgstr "Zobrazení názvu štítku"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Označení příspěvku"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Štítky příspěvků"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Hent et enkelt indlæg (skrivebeskyttet)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"slugs baseret på titlen."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Indlæggets titel"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Titel"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"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"
msgstr "Indlæg"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Indlæg"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr "Markdown-filer understøttes ikke - brug markdown-indhold i stedet!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"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"
msgstr "intern tag-identifikator for indlægs-tagget"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Tag-navn"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "Brugervenligt navn til posttagget"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Navn på tag-visning"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Tag til indlæg"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Tags til indlæg"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Einen einzelnen Beitrag abrufen (schreibgeschützt)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"Titels."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Titel des Beitrags"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Titel"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"Ist dies ein Beitrag für eine Seite mit statischer URL (z. B. `/help/"
"delivery`)?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "Beitrag"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Beiträge"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"Markdown-Dateien werden nicht unterstützt - verwenden Sie stattdessen "
"Markdown-Inhalte!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"eine Markdown-Datei oder ein Markdown-Inhalt muss bereitgestellt werden - "
"beide schließen sich gegenseitig aus"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "interner Tag-Bezeichner für den Post-Tag"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Tag name"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "Benutzerfreundlicher Name für das Post-Tag"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Tag-Anzeigename"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Tag eintragen"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Tags eintragen"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Retrieve a single post (read-only)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"title."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Post's title"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Title"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "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`)?"
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"
msgstr "Post"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Posts"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - 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 ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"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"
msgstr "internal tag identifier for the post tag"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Tag name"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "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"
msgstr "Tag display name"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Post tag"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Post tags"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Retrieve a single post (read-only)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"title."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Post's title"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Title"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "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`)?"
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"
msgstr "Post"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Posts"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - 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 ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"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"
msgstr "internal tag identifier for the post tag"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Tag name"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "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"
msgstr "Tag display name"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Post tag"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Post tags"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Recuperar una única entrada (sólo lectura)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"automática de slug a partir del título."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Título del mensaje"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Título"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"¿se trata de una entrada para una página con URL estática (por ejemplo, `/"
"help/delivery`)?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "Publicar en"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Puestos"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"No se admiten archivos Markdown - ¡utiliza contenido Markdown en su lugar!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"se debe proporcionar un archivo markdown o contenido markdown - mutuamente "
"excluyentes"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "identificador interno de la etiqueta post"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Nombre de la etiqueta"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
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"
msgstr "Nombre de la etiqueta"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Etiqueta postal"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Etiquetas"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -28,7 +28,7 @@ msgstr ""
msgid "retrieve a single post (read-only)"
msgstr ""
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, "
@ -38,60 +38,60 @@ msgid ""
"title."
msgstr ""
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr ""
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr ""
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr ""
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr ""
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr ""
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr ""
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr ""
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr ""
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr ""
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr ""

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Récupérer un seul message (en lecture seule)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"d'une balise en fonction du titre."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Titre du message"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Titre"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"s'agit-il d'un message pour une page dont l'URL est statique (par exemple `/"
"help/delivery`) ?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "Poste"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Postes"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"Les fichiers Markdown ne sont pas pris en charge - utilisez plutôt du "
"contenu Markdown !"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"un fichier markdown ou un contenu markdown doit être fourni - ils s'excluent "
"mutuellement"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "identifiant interne de la balise post"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Nom du jour"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "Nom convivial pour la balise post"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Nom d'affichage de l'étiquette"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Tag de poste"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Tags de la poste"

View file

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

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -28,7 +28,7 @@ msgstr ""
msgid "retrieve a single post (read-only)"
msgstr ""
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, "
@ -38,60 +38,60 @@ msgid ""
"title."
msgstr ""
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr ""
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr ""
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr ""
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr ""
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr ""
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr ""
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr ""
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr ""
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr ""
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr ""

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -28,7 +28,7 @@ msgstr ""
msgid "retrieve a single post (read-only)"
msgstr ""
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, "
@ -38,60 +38,60 @@ msgid ""
"title."
msgstr ""
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr ""
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr ""
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr ""
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr ""
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr ""
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr ""
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr ""
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr ""
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr ""
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr ""

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Mengambil satu postingan (hanya-baca)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"berdasarkan judul."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Judul postingan"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Judul"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"apakah ini adalah postingan untuk halaman dengan URL statis (misalnya `/help/"
"pengiriman`)?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "Pos"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Posting"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"File penurunan harga tidak didukung - gunakan konten penurunan harga sebagai "
"gantinya!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"file penurunan harga atau konten penurunan harga harus disediakan - tidak "
"boleh ada yang sama"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "pengidentifikasi tag internal untuk tag pos"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Nama tag"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "Nama yang mudah digunakan untuk tag postingan"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Nama tampilan tag"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Tag pos"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Tag pos"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Recuperare un singolo post (solo lettura)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"la generazione automatica dello slug in base al titolo."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Titolo del post"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Titolo"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"Si tratta di un post per una pagina con URL statico (ad esempio `/help/"
"delivery`)?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "Posta"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Messaggi"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr "I file Markdown non sono supportati: usa invece i contenuti Markdown!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"deve essere fornito un file markdown o un contenuto markdown - si escludono "
"a vicenda"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "identificatore interno del tag post"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Nome del tag"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "Nome intuitivo per il tag del post"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Nome del tag"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Post tag"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Tag dei post"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "すべての投稿をリストアップする(読み取り専用)"
msgid "retrieve a single post (read-only)"
msgstr "単一の投稿を取得する(読み取り専用)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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"
msgstr "投稿タイトル"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "タイトル"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr "これは静的URLのページ`/help/delivery`)への投稿ですか?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "ポスト"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "投稿"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"マークダウン・ファイルはサポートされていません - 代わりにマークダウン・コンテ"
"ンツを使用してください!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"マークダウン・ファイルまたはマークダウン・コンテンツを提供しなければならな"
"い。"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "投稿タグの内部タグ識別子"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "タグ名"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "投稿タグのユーザーフレンドリーな名前"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "タグ表示名"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "投稿タグ"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "投稿タグ"

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -28,7 +28,7 @@ msgstr ""
msgid "retrieve a single post (read-only)"
msgstr ""
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"behavior of a blog post. It includes attributes for author, title, content, "
@ -38,60 +38,60 @@ msgid ""
"title."
msgstr ""
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr ""
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr ""
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr ""
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr ""
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr ""
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr ""
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr ""
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr ""
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr ""
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr ""

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "모든 게시물 나열(읽기 전용)"
msgid "retrieve a single post (read-only)"
msgstr "단일 게시물 검색(읽기 전용)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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"
msgstr "게시물 제목"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "제목"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr "정적 URL(예: `/help/delivery`)이 있는 페이지의 게시물인가요?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "게시물"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "게시물"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"마크다운 파일은 지원되지 않습니다 예 - 대신 마크다운 콘텐츠를 사용하세요!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr "마크다운 파일 또는 마크다운 콘텐츠가 제공되어야 합니다."
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "게시물 태그의 내부 태그 식별자"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "태그 이름"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "게시물 태그의 사용자 친화적인 이름"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "태그 표시 이름"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "게시물 태그"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "게시물 태그"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Een enkel bericht ophalen (alleen-lezen)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"slugs op basis van de titel."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Titel van de post"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Titel"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"Is dit een bericht voor een pagina met een statische URL (bijv. `/help/"
"delivery`)?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "Plaats"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Berichten"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"Markdown-bestanden worden niet ondersteund - gebruik in plaats daarvan "
"markdown-inhoud!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"er moet een markdown-bestand of markdown-inhoud worden geleverd - wederzijds "
"exclusief"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "interne tagidentifier voor de posttag"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Tag naam"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "Gebruiksvriendelijke naam voor de posttag"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Tag weergavenaam"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Post tag"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Post tags"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Hent et enkelt innlegg (skrivebeskyttet)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"generering av slug basert på tittelen."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Innleggets tittel"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Title"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"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"
msgstr "Post"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Innlegg"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr "Markdown-filer støttes ikke - bruk markdown-innhold i stedet!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"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"
msgstr "intern tagg-identifikator for innleggstaggen"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Tagg navn"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "Brukervennlig navn for innleggstaggen"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Visningsnavn for taggen"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Post tag"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Tagger for innlegg"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Pobieranie pojedynczego wpisu (tylko do odczytu)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"podstawie tytułu."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Tytuł postu"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Tytuł"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"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"
msgstr "Post"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Posty"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"Pliki Markdown nie są obsługiwane - zamiast tego użyj zawartości Markdown!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"należy dostarczyć plik markdown lub zawartość markdown - wzajemnie się "
"wykluczające"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "wewnętrzny identyfikator tagu posta"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Nazwa tagu"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "Przyjazna dla użytkownika nazwa tagu posta"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Wyświetlana nazwa znacznika"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Tag posta"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Tagi postów"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Recuperar um único post (somente leitura)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"base no título."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Título da postagem"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Título"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"Essa é uma postagem para uma página com URL estático (por exemplo, `/help/"
"delivery`)?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "Postar"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Publicações"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"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 ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"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"
msgstr "identificador de tag interno para a tag de postagem"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Nome da etiqueta"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
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"
msgstr "Nome de exibição da tag"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Etiqueta de postagem"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Tags de postagem"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Recuperează o singură postare (read-only)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"automată a slug-ului pe baza titlului."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Titlul postului"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Titlul"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"este aceasta o postare pentru o pagină cu URL static (de exemplu `/help/"
"delivery`)?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "Post"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Mesaje"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"Fișierele Markdown nu sunt acceptate - utilizați în schimb conținut Markdown!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"trebuie furnizat un fișier markdown sau conținut markdown - se exclud "
"reciproc"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "identificator intern de etichetă pentru eticheta postului"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Nume etichetă"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "Nume ușor de utilizat pentru eticheta postului"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Nume afișare etichetă"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Etichetă post"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Etichete poștale"

View file

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

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Hämta ett enskilt inlägg (skrivskyddat)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"sluggenerering baserat på titeln."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Inläggets titel"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Titel"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"ä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"
msgstr "Post"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Inlägg"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr "Markdown-filer stöds inte - använd markdown-innehåll istället!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"en markdown-fil eller markdown-innehåll måste tillhandahållas - ömsesidigt "
"uteslutande"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "intern taggidentifierare för inläggstaggen"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "Tagg namn"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "Användarvänligt namn för inläggstaggen"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Taggens visningsnamn"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Post tagg"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Taggar för inlägg"

View file

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

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Tek bir gönderiyi al (salt okunur)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"destekler."
#: engine/blog/models.py:24
#: engine/blog/models.py:41
msgid "post title"
msgstr "Gönderinin başlığı"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Başlık"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"Bu, statik URL'ye sahip bir sayfa (örneğin `/help/delivery`) için bir "
"gönderi mi?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "Posta"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "Mesajlar"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr ""
"Markdown dosyaları desteklenmiyor yer - bunun yerine markdown içeriği "
"kullanın!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"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"
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"
msgstr "Etiket adı"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "Gönderi etiketi için kullanıcı dostu ad"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Etiket görünen adı"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Mesaj etiketi"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Gönderi etiketleri"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <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)"
msgstr "Lấy một bài đăng duy nhất (chỉ đọc)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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 "
"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"
msgstr "Tiêu đề bài đăng"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "Tiêu đề"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr ""
"Đây có phải là bài đăng cho một trang có URL tĩnh (ví dụ: `/help/delivery`) "
"không?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "Bài đăng"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
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"
msgstr ""
"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 ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr ""
"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."
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
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"
msgstr "Tên ngày"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
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"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "Hiển thị tên thẻ"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "Thẻ bài viết"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "Thẻ bài viết"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: LANGUAGE <CONTACT@FUREUNOIR.COM>\n"
@ -25,7 +25,7 @@ msgstr "列出所有帖子(只读)"
msgid "retrieve a single post (read-only)"
msgstr "检索单个帖子(只读)"
#: engine/blog/models.py:13
#: engine/blog/models.py:20
msgid ""
"Represents a blog post model. The Post class defines the structure and "
"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"
msgstr "帖子标题"
#: engine/blog/models.py:24
#: engine/blog/models.py:42
msgid "title"
msgstr "标题"
#: engine/blog/models.py:69
#: engine/blog/models.py:89
msgid "is static page"
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`)?"
msgstr "这是静态 URL 页面(如 `/help/delivery`)的帖子吗?"
#: engine/blog/models.py:77
#: engine/blog/models.py:99
msgid "post"
msgstr "职位"
#: engine/blog/models.py:78
#: engine/blog/models.py:100
msgid "posts"
msgstr "职位"
#: engine/blog/models.py:82
#: engine/blog/models.py:105
msgid "markdown files are not supported yet - use markdown content instead"
msgstr "不支持 Markdown 文件,请使用 Markdown 内容!"
#: engine/blog/models.py:84
#: engine/blog/models.py:110
msgid ""
"a markdown file or markdown content must be provided - mutually exclusive"
msgstr "必须提供标记符文件或标记符内容 - 相互排斥"
#: engine/blog/models.py:116
#: engine/blog/models.py:144
msgid "internal tag identifier for the post tag"
msgstr "职位标签的内部标签标识符"
#: engine/blog/models.py:117
#: engine/blog/models.py:145
msgid "tag name"
msgstr "标签名称"
#: engine/blog/models.py:121
#: engine/blog/models.py:149
msgid "user-friendly name for the post tag"
msgstr "方便用户使用的帖子标签名称"
#: engine/blog/models.py:122
#: engine/blog/models.py:150
msgid "tag display name"
msgstr "标签显示名称"
#: engine/blog/models.py:130
#: engine/blog/models.py:158
msgid "post tag"
msgstr "职位标签"
#: engine/blog/models.py:131
#: engine/blog/models.py:159
msgid "post tags"
msgstr "帖子标签"

View file

@ -15,8 +15,8 @@ from markdown_field import MarkdownField
from engine.core.abstract import NiceModel
class Post(NiceModel): # type: ignore [django-manager-missing]
__doc__ = _( # type: ignore [assignment]
class Post(NiceModel):
__doc__ = _( # pyright: ignore[reportUnknownVariableType]
"Represents a blog post model. "
"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. "

View file

@ -11,8 +11,8 @@ from engine.core.permissions import EvibesPermission
@extend_schema_view(**POST_SCHEMA)
class PostViewSet(ReadOnlyModelViewSet): # type: ignore [type-arg]
__doc__ = _( # type: ignore [assignment]
class PostViewSet(ReadOnlyModelViewSet):
__doc__ = _(
"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 "
"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"), help_text=_("when the object first appeared on the database")
) # type: ignore [no-untyped-call]
)
modified = ModificationDateTimeField(
_("modified"), help_text=_("when the object was last modified")
) # type: ignore [no-untyped-call]
)
def save( # type: ignore [override]
def save(
self,
*,
force_insert: bool = False,

View file

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

View file

@ -434,9 +434,9 @@ def _lang_analyzer(lang_code: str) -> str:
class ActiveOnlyMixin:
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)

View file

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

View file

@ -51,7 +51,7 @@ from engine.core.models import (
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]:
if not value:
return qs
@ -74,7 +74,7 @@ class CaseInsensitiveListFilter(BaseInFilter, CharFilter): # type: ignore [misc
# noinspection PyUnusedLocal
class ProductFilter(FilterSet): # type: ignore [misc]
class ProductFilter(FilterSet):
search = CharFilter(field_name="name", method="search_products", label=_("Search"))
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID"))
name = CharFilter(lookup_expr="icontains", label=_("Name"))
@ -188,7 +188,7 @@ class ProductFilter(FilterSet): # type: ignore [misc]
if not value:
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]
if not uuids:
return queryset.none()
@ -392,7 +392,7 @@ class ProductFilter(FilterSet): # type: ignore [misc]
# noinspection PyUnusedLocal
class OrderFilter(FilterSet): # type: ignore [misc]
class OrderFilter(FilterSet):
search = CharFilter(
method="filter_search",
label=_("Search (ID, product name or part number)"),
@ -455,7 +455,7 @@ class OrderFilter(FilterSet): # type: ignore [misc]
).distinct()
class WishlistFilter(FilterSet): # type: ignore [misc]
class WishlistFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
user_email = CharFilter(
field_name="user__email", lookup_expr="iexact", label=_("User email")
@ -479,7 +479,7 @@ class WishlistFilter(FilterSet): # type: ignore [misc]
# noinspection PyUnusedLocal
class CategoryFilter(FilterSet): # type: ignore [misc]
class CategoryFilter(FilterSet):
search = CharFilter(
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",))[
"categories"
]
] # type: ignore
]
return queryset.filter(uuid__in=uuids)
@ -621,7 +621,7 @@ class CategoryFilter(FilterSet): # type: ignore [misc]
# noinspection PyUnusedLocal
class BrandFilter(FilterSet): # type: ignore [misc]
class BrandFilter(FilterSet):
search = CharFilter(field_name="name", method="search_brands", label=_("Search"))
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
name = CharFilter(lookup_expr="icontains", label=_("Name"))
@ -653,12 +653,12 @@ class BrandFilter(FilterSet): # type: ignore [misc]
uuids = [
brand.get("uuid")
for brand in process_query(query=value, indexes=("brands",))["brands"]
] # type: ignore
]
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"))
product_uuid = UUIDFilter(
field_name="order_product__product__uuid",
@ -687,7 +687,7 @@ class FeedbackFilter(FilterSet): # type: ignore [misc]
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"))
user_uuid = UUIDFilter(
field_name="user__uuid", lookup_expr="exact", label=_("User UUID")

View file

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

View file

@ -53,7 +53,7 @@ def resolve_tags(product, tag_uuids):
product.tags.set(tags)
class AttributeInput(InputObjectType): # type: ignore[misc]
class AttributeInput(InputObjectType):
attribute_uuid = UUID(required=False, name="attributeUuid")
group_name = String(required=False, name="groupName")
attribute_name = String(required=False, name="attributeName")
@ -61,7 +61,7 @@ class AttributeInput(InputObjectType): # type: ignore[misc]
value = String(required=True)
class ProductInput(InputObjectType): # type: ignore[misc]
class ProductInput(InputObjectType):
name = NonNull(String)
description = String(required=False)
is_digital = Boolean(required=False, name="isDigital")
@ -85,15 +85,15 @@ class CreateProduct(BaseMutation):
product = Field(ProductType)
@staticmethod
def mutate(parent, info, product_data): # type: ignore [override]
def mutate(parent, info, product_data):
user = info.context.user
if not user.has_perm("core.add_product"):
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
if product_data.get("brand_uuid"):
with suppress(Brand.DoesNotExist): # type: ignore[name-defined]
brand = Brand.objects.get(uuid=product_data["brand_uuid"]) # type: ignore[index]
with suppress(Brand.DoesNotExist):
brand = Brand.objects.get(uuid=product_data["brand_uuid"])
product = Product.objects.create(
name=product_data["name"],
@ -124,7 +124,7 @@ class UpdateProduct(BaseMutation):
product = Field(ProductType)
@staticmethod
def mutate(parent, info, product_uuid, product_data): # type: ignore [override]
def mutate(parent, info, product_uuid, product_data):
user = info.context.user
if not user.has_perm("core.change_product"):
raise PermissionDenied(permission_denied_message)
@ -142,10 +142,10 @@ class UpdateProduct(BaseMutation):
updates[model_field] = product_data[field_in]
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"):
product.brand = Brand.objects.get(uuid=product_data["brand_uuid"]) # type: ignore[index]
product.brand = Brand.objects.get(uuid=product_data["brand_uuid"])
else:
product.brand = None
@ -171,7 +171,7 @@ class DeleteProduct(BaseMutation):
ok = Boolean()
@staticmethod
def mutate(parent, info, product_uuid): # type: ignore [override]
def mutate(parent, info, product_uuid):
user = info.context.user
if not user.has_perm("core.delete_product"):
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 graphene import UUID, Boolean, Field, Int, List, String
from graphene.types.generic import GenericScalar
from graphene_django.utils import camelize
from engine.core.elasticsearch import process_query
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.nominatim import fetch_address_suggestions
from engine.payments.graphene.object_types import TransactionType
from evibes.utils.renderers import camelize
logger = logging.getLogger(__name__)
@ -49,7 +49,7 @@ class CacheOperator(BaseMutation):
data = GenericScalar(description=_("cached data"))
@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))
@ -64,7 +64,7 @@ class RequestCursedURL(BaseMutation):
data = GenericScalar(description=_("camelized JSON data from the requested URL"))
@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):
raise BadRequest(_("only URLs starting with http(s):// are allowed"))
try:
@ -94,7 +94,7 @@ class AddOrderProduct(BaseMutation):
order = Field(OrderType)
@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
try:
order = Order.objects.get(uuid=order_uuid)
@ -123,7 +123,7 @@ class RemoveOrderProduct(BaseMutation):
order = Field(OrderType)
@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
try:
order = Order.objects.get(uuid=order_uuid)
@ -150,7 +150,7 @@ class RemoveAllOrderProducts(BaseMutation):
order = Field(OrderType)
@staticmethod
def mutate(parent, info, order_uuid): # type: ignore [override]
def mutate(parent, info, order_uuid):
user = info.context.user
order = Order.objects.get(uuid=order_uuid)
if not (user.has_perm("core.delete_orderproduct") or user == order.user):
@ -173,7 +173,7 @@ class RemoveOrderProductsOfAKind(BaseMutation):
order = Field(OrderType)
@staticmethod
def mutate(parent, info, product_uuid, order_uuid): # type: ignore [override]
def mutate(parent, info, product_uuid, order_uuid):
user = info.context.user
order = Order.objects.get(uuid=order_uuid)
if not (user.has_perm("core.delete_orderproduct") or user == order.user):
@ -214,7 +214,7 @@ class BuyOrder(BaseMutation):
shipping_address=None,
billing_address=None,
chosen_products=None,
): # type: ignore [override]
):
if not any([order_uuid, order_hr_id]) or all([order_uuid, order_hr_id]):
raise BadRequest(
_(
@ -276,7 +276,7 @@ class BulkOrderAction(BaseMutation):
products,
order_uuid=None,
order_hr_id=None,
): # type: ignore [override]
):
if not any([order_uuid, order_hr_id]) or all([order_uuid, order_hr_id]):
raise BadRequest(
_(
@ -326,7 +326,7 @@ class BulkWishlistAction(BaseMutation):
action,
products,
wishlist_uuid=None,
): # type: ignore [override]
):
if not wishlist_uuid:
raise BadRequest(_("please provide wishlist_uuid value"))
user = info.context.user
@ -379,7 +379,7 @@ class BuyUnregisteredOrder(BaseMutation):
customer_shipping_address=None,
promocode_uuid=None,
is_business=False,
): # type: ignore [override]
):
order = Order.objects.create(status="MOMENTAL")
transaction = order.buy_without_registration(
products=products,
@ -408,7 +408,7 @@ class AddWishlistProduct(BaseMutation):
wishlist = Field(WishlistType)
@staticmethod
def mutate(parent, info, product_uuid, wishlist_uuid): # type: ignore [override]
def mutate(parent, info, product_uuid, wishlist_uuid):
user = info.context.user
try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -436,7 +436,7 @@ class RemoveWishlistProduct(BaseMutation):
wishlist = Field(WishlistType)
@staticmethod
def mutate(parent, info, product_uuid, wishlist_uuid): # type: ignore [override]
def mutate(parent, info, product_uuid, wishlist_uuid):
user = info.context.user
try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -463,7 +463,7 @@ class RemoveAllWishlistProducts(BaseMutation):
wishlist = Field(WishlistType)
@staticmethod
def mutate(parent, info, wishlist_uuid): # type: ignore [override]
def mutate(parent, info, wishlist_uuid):
user = info.context.user
try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -494,7 +494,7 @@ class BuyWishlist(BaseMutation):
transaction = Field(TransactionType, required=False)
@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
try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -557,7 +557,7 @@ class BuyProduct(BaseMutation):
attributes=None,
force_balance=False,
force_payment=False,
): # type: ignore [override]
):
user = info.context.user
order = Order.objects.create(user=user, status="MOMENTAL")
order.add_product(
@ -589,7 +589,7 @@ class FeedbackProductAction(BaseMutation):
feedback = Field(FeedbackType, required=False)
@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
try:
order_product = OrderProduct.objects.get(uuid=order_product_uuid)
@ -620,7 +620,7 @@ class CreateAddress(BaseMutation):
address = Field(AddressType)
@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
address = Address.objects.create(raw_data=raw_data, user=user)
@ -635,7 +635,7 @@ class DeleteAddress(BaseMutation):
success = Boolean()
@staticmethod
def mutate(parent, info, uuid): # type: ignore [override]
def mutate(parent, info, uuid):
try:
address = Address.objects.get(uuid=uuid)
if (
@ -663,7 +663,7 @@ class AutocompleteAddress(BaseMutation):
suggestions = GenericScalar()
@staticmethod
def mutate(parent, info, q, limit): # type: ignore [override]
def mutate(parent, info, q, limit):
if 1 > limit > 10:
raise BadRequest(_("limit must be between 1 and 10"))
try:
@ -688,7 +688,7 @@ class ContactUs(BaseMutation):
error = String()
@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:
contact_us_email.delay(
{
@ -717,7 +717,7 @@ class Search(BaseMutation):
description = _("elasticsearch - works like a charm")
@staticmethod
def mutate(parent, info, query): # type: ignore [override]
def mutate(parent, info, query):
data = process_query(query=query, request=info.context)
# noinspection PyTypeChecker

View file

@ -22,7 +22,6 @@ from graphene import (
from graphene.types.generic import GenericScalar
from graphene_django import DjangoObjectType
from graphene_django.filter import DjangoFilterConnectionField
from graphene_django.utils import camelize
from mptt.querysets import TreeQuerySet
from engine.core.models import (
@ -56,11 +55,12 @@ from engine.core.utils.seo_builders import (
website_schema,
)
from engine.payments.graphene.object_types import TransactionType
from evibes.utils.renderers import camelize
logger = logging.getLogger(__name__)
class SEOMetaType(ObjectType): # type: ignore [misc]
class SEOMetaType(ObjectType):
title = String()
description = String()
canonical = String()
@ -71,7 +71,7 @@ class SEOMetaType(ObjectType): # type: ignore [misc]
hreflang = String()
class AttributeType(DjangoObjectType): # type: ignore [misc]
class AttributeType(DjangoObjectType):
values = List(lambda: AttributeValueType, description=_("attribute values"))
class Meta:
@ -91,7 +91,7 @@ class AttributeType(DjangoObjectType): # type: ignore [misc]
return base_qs
class AttributeGroupType(DjangoObjectType): # type: ignore [misc]
class AttributeGroupType(DjangoObjectType):
attributes = List(lambda: AttributeType, description=_("grouped attributes"))
class Meta:
@ -112,7 +112,7 @@ class AttributeGroupType(DjangoObjectType): # type: ignore [misc]
return qs
class BrandType(DjangoObjectType): # type: ignore [misc]
class BrandType(DjangoObjectType):
categories = List(lambda: CategoryType, description=_("categories"))
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)
possible_values = List(String, required=True)
class MinMaxPriceType(ObjectType): # type: ignore [misc]
class MinMaxPriceType(ObjectType):
min_price = Float()
max_price = Float()
class CategoryType(DjangoObjectType): # type: ignore [misc]
class CategoryType(DjangoObjectType):
children = List(
lambda: CategoryType,
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"))
class Meta:
@ -369,7 +369,7 @@ class VendorType(DjangoObjectType): # type: ignore [misc]
description = _("vendors")
class AddressType(DjangoObjectType): # type: ignore [misc]
class AddressType(DjangoObjectType):
latitude = Float(description=_("Latitude (Y 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
class FeedbackType(DjangoObjectType): # type: ignore [misc]
class FeedbackType(DjangoObjectType):
comment = String(description=_("comment"))
rating = Int(
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.")
class OrderProductType(DjangoObjectType): # type: ignore [misc]
class OrderProductType(DjangoObjectType):
attributes = GenericScalar(description=_("attributes"))
notifications = GenericScalar(description=_("notifications"))
download_url = String(
@ -451,7 +451,7 @@ class OrderProductType(DjangoObjectType): # type: ignore [misc]
return self.download_url
class OrderType(DjangoObjectType): # type: ignore [misc]
class OrderType(DjangoObjectType):
order_products = DjangoFilterConnectionField(
OrderProductType, description=_("a list of order products in this order")
)
@ -508,7 +508,7 @@ class OrderType(DjangoObjectType): # type: ignore [misc]
return None
class ProductImageType(DjangoObjectType): # type: ignore [misc]
class ProductImageType(DjangoObjectType):
image = String(description=_("image url"))
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 ""
class ProductType(DjangoObjectType): # type: ignore [misc]
class ProductType(DjangoObjectType):
category = Field(CategoryType, description=_("category"))
images = DjangoFilterConnectionField(ProductImageType, description=_("images"))
feedbacks = DjangoFilterConnectionField(FeedbackType, description=_("feedbacks"))
@ -646,7 +646,7 @@ class ProductType(DjangoObjectType): # type: ignore [misc]
return self.discount_price
class AttributeValueType(DjangoObjectType): # type: ignore [misc]
class AttributeValueType(DjangoObjectType):
value = String(description=_("attribute value"))
class Meta:
@ -657,7 +657,7 @@ class AttributeValueType(DjangoObjectType): # type: ignore [misc]
description = _("attribute value")
class PromoCodeType(DjangoObjectType): # type: ignore [misc]
class PromoCodeType(DjangoObjectType):
discount = Float()
discount_type = String()
@ -679,13 +679,13 @@ class PromoCodeType(DjangoObjectType): # type: ignore [misc]
float(self.discount_percent)
if self.discount_percent
else float(self.discount_amount)
) # type: ignore [arg-type]
)
def resolve_discount_type(self: PromoCode, _info) -> str:
return "percent" if self.discount_percent else "amount"
class PromotionType(DjangoObjectType): # type: ignore [misc]
class PromotionType(DjangoObjectType):
products = DjangoFilterConnectionField(
ProductType, description=_("products on sale")
)
@ -698,7 +698,7 @@ class PromotionType(DjangoObjectType): # type: ignore [misc]
description = _("promotions")
class StockType(DjangoObjectType): # type: ignore [misc]
class StockType(DjangoObjectType):
vendor = Field(VendorType, description=_("vendor"))
product = Field(ProductType, description=_("product"))
@ -710,7 +710,7 @@ class StockType(DjangoObjectType): # type: ignore [misc]
description = _("stocks")
class WishlistType(DjangoObjectType): # type: ignore [misc]
class WishlistType(DjangoObjectType):
products = DjangoFilterConnectionField(
ProductType, description=_("wishlisted products")
)
@ -722,7 +722,7 @@ class WishlistType(DjangoObjectType): # type: ignore [misc]
description = _("wishlists")
class ProductTagType(DjangoObjectType): # type: ignore [misc]
class ProductTagType(DjangoObjectType):
product_set = DjangoFilterConnectionField(
ProductType, description=_("tagged products")
)
@ -735,7 +735,7 @@ class ProductTagType(DjangoObjectType): # type: ignore [misc]
description = _("product tags")
class CategoryTagType(DjangoObjectType): # type: ignore [misc]
class CategoryTagType(DjangoObjectType):
category_set = DjangoFilterConnectionField(
CategoryType, description=_("tagged categories")
)
@ -748,7 +748,7 @@ class CategoryTagType(DjangoObjectType): # type: ignore [misc]
description = _("categories tags")
class ConfigType(ObjectType): # type: ignore [misc]
class ConfigType(ObjectType):
project_name = String(description=_("project name"))
company_name = String(description=_("company name"))
company_address = String(description=_("company address"))
@ -768,7 +768,7 @@ class ConfigType(ObjectType): # type: ignore [misc]
description = _("company configuration")
class LanguageType(ObjectType): # type: ignore [misc]
class LanguageType(ObjectType):
code = String(description=_("language code"))
name = String(description=_("language name"))
flag = String(description=_("language flag, if exists :)"))
@ -777,34 +777,34 @@ class LanguageType(ObjectType): # type: ignore [misc]
description = _("supported languages")
class SearchProductsResultsType(ObjectType): # type: ignore [misc]
class SearchProductsResultsType(ObjectType):
uuid = UUID()
name = String()
slug = String()
image = String()
class SearchCategoriesResultsType(ObjectType): # type: ignore [misc]
class SearchCategoriesResultsType(ObjectType):
uuid = UUID()
name = String()
slug = String()
image = String()
class SearchBrandsResultsType(ObjectType): # type: ignore [misc]
class SearchBrandsResultsType(ObjectType):
uuid = UUID()
name = String()
slug = String()
image = String()
class SearchPostsResultsType(ObjectType): # type: ignore [misc]
class SearchPostsResultsType(ObjectType):
uuid = UUID()
name = String()
slug = String()
class SearchResultsType(ObjectType): # type: ignore [misc]
class SearchResultsType(ObjectType):
products = List(
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)
class BulkProductInput(InputObjectType): # type: ignore [misc]
class BulkProductInput(InputObjectType):
uuid = UUID(required=True)
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:
langs: list[str] = options.get("target_languages", []) # type: ignore [assignment]
langs: list[str] = options.get("target_languages", [])
if "ALL" in langs:
langs = list(dict(settings.LANGUAGES).keys())
apps_to_scan: set[str] = set(options["target_apps"])
if "ALL" in apps_to_scan:
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())
# noinspection PyTypeChecker
configs.append(RootDirectory()) # type: ignore [arg-type]
configs.append(RootDirectory())
errors = 0

View file

@ -30,7 +30,7 @@ def placeholderize(text: str) -> tuple[str, list[str]]:
"""
placeholders: list[str] = []
def _repl(match: re.Match) -> str: # type: ignore [type-arg]
def _repl(match: re.Match) -> str:
idx = len(placeholders)
placeholders.append(match.group(0))
return f"__PH_{idx}__"
@ -107,9 +107,9 @@ class Command(BaseCommand):
)
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:
target_langs = DEEPL_TARGET_LANGUAGES_MAPPING.keys() # type: ignore [assignment]
target_langs = DEEPL_TARGET_LANGUAGES_MAPPING.keys()
target_apps = set(options["target_apps"])
if "ALL" in target_apps:
target_apps = {
@ -125,7 +125,7 @@ class Command(BaseCommand):
try:
import readline
except ImportError:
readline = None # type: ignore [assignment]
readline = None
for target_lang in target_langs:
api_code = DEEPL_TARGET_LANGUAGES_MAPPING.get(target_lang)
@ -176,16 +176,16 @@ class Command(BaseCommand):
if readline:
def hook() -> None:
readline.insert_text(default) # type: ignore [attr-defined] # noqa: B023
readline.redisplay() # type: ignore [attr-defined]
readline.insert_text(default) # noqa: B023
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}': "
user_in = input(prompt).strip()
if readline:
readline.set_pre_input_hook(None) # type: ignore [attr-defined]
readline.set_pre_input_hook(None)
if 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:
size: int = options["size"] # type: ignore [assignment]
size: int = options["size"]
while True:
batch_ids = 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:
size: int = options["size"] # type: ignore [assignment]
size: int = options["size"]
while True:
batch_ids = list(
Product.objects.filter(

View file

@ -11,7 +11,7 @@ class Command(BaseCommand):
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.style.SUCCESS(

View file

@ -14,7 +14,7 @@ class AddressManager(models.Manager):
if not kwargs.get("raw_data"):
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",
"addressdetails": 1,
"q": kwargs.get("raw_data"),

View file

@ -70,8 +70,8 @@ from evibes.utils.misc import create_object
logger = logging.getLogger(__name__)
class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel):
__doc__ = _(
"Represents a group of attributes, which can be hierarchical."
" This class is used to manage and organize attribute groups."
" 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")
class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class Vendor(ExportModelOperationsMixin("vendor"), NiceModel):
__doc__ = _(
"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."
" 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:
return self.name
def save( # type: ignore [override]
def save(
self,
*,
force_insert: bool = False,
@ -198,8 +198,8 @@ class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [
]
class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel):
__doc__ = _(
"Represents a product tag used for classifying or identifying products."
" 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."
@ -230,8 +230,8 @@ class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type:
verbose_name_plural = _("product tags")
class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel):
__doc__ = _(
"Represents a category tag used for 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."
@ -261,8 +261,8 @@ class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel): # typ
verbose_name_plural = _("category tags")
class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel): # type: ignore [misc, django-manager-missing]
__doc__ = _( # type: ignore
class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel):
__doc__ = _(
"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."
" The class includes fields for metadata and visual representation,"
@ -437,7 +437,7 @@ class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel): #
):
bucket["possible_values"].append(value)
return list(by_attr.values()) # type: ignore [arg-type]
return list(by_attr.values())
@cached_property
def image_url(self) -> str:
@ -452,8 +452,8 @@ class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel): #
ordering = ["tree_id", "lft"]
class Brand(ExportModelOperationsMixin("brand"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class Brand(ExportModelOperationsMixin("brand"), NiceModel):
__doc__ = _(
"Represents a Brand object in the system. "
"This class handles information and attributes related to a brand, including its name, logos, "
"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")
class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class Stock(ExportModelOperationsMixin("stock"), NiceModel):
__doc__ = _(
"Represents the stock of a product managed in the system."
" 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."
@ -588,8 +588,8 @@ class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [mi
verbose_name_plural = _("stock entries")
class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class Product(ExportModelOperationsMixin("product"), NiceModel):
__doc__ = _(
"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."
" 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
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
def rating(self) -> float:
@ -736,8 +736,8 @@ class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore
self.__dict__["personal_orders_only"] = value
class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class Attribute(ExportModelOperationsMixin("attribute"), NiceModel):
__doc__ = _(
"Represents an attribute in the system."
" This class is used to define and manage attributes,"
" 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")
class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel):
__doc__ = _(
"Represents a specific value for an attribute that is linked to a product. "
"It links the 'attribute' to a unique 'value', allowing "
"better organization and dynamic representation of product characteristics."
@ -833,8 +833,8 @@ class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel):
verbose_name_plural = _("attribute values")
class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel):
__doc__ = _(
"Represents a product image associated with a product in the system. "
"This class is designed to manage images for products, including functionality "
"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")
class Promotion(ExportModelOperationsMixin("promotion"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class Promotion(ExportModelOperationsMixin("promotion"), NiceModel):
__doc__ = _(
"Represents a promotional campaign for products with a discount. "
"This class is used to define and manage promotional campaigns that offer a "
"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)
class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel):
__doc__ = _(
"Represents a user's wishlist for storing and managing desired products. "
"The class provides functionality to manage a collection of products, "
"supporting operations such as adding and removing products, "
@ -1003,8 +1003,8 @@ class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel): # type: igno
return self
class Documentary(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class Documentary(ExportModelOperationsMixin("attribute_group"), NiceModel):
__doc__ = _(
"Represents a documentary record tied to a product. "
"This class is used to store information about documentaries related to specific "
"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")
class Address(ExportModelOperationsMixin("address"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class Address(ExportModelOperationsMixin("address"), NiceModel):
__doc__ = _(
"Represents an address entity that includes location details and associations with a user. "
"Provides functionality for geographic and address data storage, as well "
"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
class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel):
__doc__ = _(
"Represents a promotional code that can be used for discounts, managing its validity, "
"type of discount, and application. "
"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":
promo_amount -= round(
promo_amount * (float(self.discount_percent) / 100), 2
) # type: ignore [arg-type]
)
order.attributes.update(
{"promocode_uuid": str(self.uuid), "final_price": promo_amount}
)
order.save()
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(
{"promocode_uuid": str(self.uuid), "final_price": promo_amount}
)
@ -1230,8 +1230,8 @@ class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel): # type: ig
return promo_amount
class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class Order(ExportModelOperationsMixin("order"), NiceModel):
__doc__ = _(
"Represents an order placed by a user."
" This class models an order within the application,"
" 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)
and self.user.attributes.get("business_identificator")
) # type: ignore [union-attr]
)
if self.user
else False
)
@ -1410,7 +1410,7 @@ class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [mi
if promotions.exists():
buy_price -= round(
product.price * (promotions.first().discount_percent / 100), 2
) # type: ignore [union-attr]
)
order_product, is_created = OrderProduct.objects.get_or_create(
product=product,
@ -1800,8 +1800,8 @@ class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [mi
return None
class Feedback(ExportModelOperationsMixin("feedback"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class Feedback(ExportModelOperationsMixin("feedback"), NiceModel):
__doc__ = _(
"Manages user feedback for 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, "
@ -1849,8 +1849,8 @@ class Feedback(ExportModelOperationsMixin("feedback"), NiceModel): # type: igno
verbose_name_plural = _("feedbacks")
class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel):
__doc__ = _(
"Represents products associated with orders and their attributes. "
"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 "
@ -1969,12 +1969,12 @@ class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # t
@property
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
def download_url(self: Self) -> str:
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"):
return self.download.url
else:
@ -2010,7 +2010,7 @@ class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # t
class CustomerRelationshipManagementProvider(
ExportModelOperationsMixin("crm_provider"), NiceModel
): # type: ignore [misc]
):
name = CharField(max_length=128, unique=True, verbose_name=_("name"))
integration_url = URLField(
blank=True, null=True, help_text=_("URL of the integration")
@ -2053,7 +2053,7 @@ class CustomerRelationshipManagementProvider(
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")
crm = ForeignKey(
to=CustomerRelationshipManagementProvider,
@ -2070,8 +2070,8 @@ class OrderCrmLink(ExportModelOperationsMixin("order_crm_link"), NiceModel): #
verbose_name_plural = _("orders CRM links")
class DigitalAssetDownload(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
class DigitalAssetDownload(ExportModelOperationsMixin("attribute_group"), NiceModel):
__doc__ = _(
"Represents the downloading functionality for digital assets associated with orders. "
"The DigitalAssetDownload class provides the ability to manage and access "
"downloads related to order products. It maintains information about the "

View file

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

View file

@ -25,9 +25,9 @@ from engine.core.models import (
from engine.core.serializers.utility import AddressSerializer
class AttributeGroupSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
parent = PrimaryKeyRelatedField(read_only=True) # type: ignore [assignment, var-annotated]
children = PrimaryKeyRelatedField(many=True, read_only=True) # type: ignore [assignment, var-annotated]
class AttributeGroupSimpleSerializer(ModelSerializer):
parent = PrimaryKeyRelatedField(read_only=True)
children = PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
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()
class Meta:
@ -63,10 +63,10 @@ class CategorySimpleSerializer(ModelSerializer): # type: ignore [type-arg]
CategorySimpleSerializer(children, many=True, context=self.context).data
if obj.children.exists()
else []
) # type: ignore [return-value]
)
class BrandSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
class BrandSimpleSerializer(ModelSerializer):
class Meta:
model = Brand
fields = [
@ -77,7 +77,7 @@ class BrandSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
]
class ProductTagSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
class ProductTagSimpleSerializer(ModelSerializer):
class Meta:
model = ProductTag
fields = [
@ -87,8 +87,8 @@ class ProductTagSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
]
class ProductImageSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg]
class ProductImageSimpleSerializer(ModelSerializer):
product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
class Meta:
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)
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)
product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg]
product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
class Meta:
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)
category = CategorySimpleSerializer(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
class VendorSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
class VendorSimpleSerializer(ModelSerializer):
class Meta:
model = Vendor
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)
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:
model = PromoCode
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)
class Meta:
@ -233,8 +233,8 @@ class PromotionSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
]
class WishlistSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg]
class WishlistSimpleSerializer(ModelSerializer):
user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
products = ProductSimpleSerializer(many=True, read_only=True)
class Meta:
@ -246,8 +246,8 @@ class WishlistSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
]
class FeedbackSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
order_product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg]
class FeedbackSimpleSerializer(ModelSerializer):
order_product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
class Meta:
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)
class Meta:
@ -272,8 +272,8 @@ class OrderProductSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
]
class OrderSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg]
class OrderSimpleSerializer(ModelSerializer):
user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
promo_code = PromoCodeSimpleSerializer(read_only=True)
order_products = OrderProductSimpleSerializer(many=True, read_only=True)
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
class AddressAutocompleteInputSerializer(Serializer): # type: ignore [type-arg]
class AddressAutocompleteInputSerializer(Serializer):
q = CharField(required=True)
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()
lat = FloatField()
lon = FloatField()
address = DictField(child=CharField())
class AddressSerializer(ModelSerializer): # type: ignore [type-arg]
class AddressSerializer(ModelSerializer):
latitude = FloatField(source="location.y", 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(
write_only=True,
max_length=512,
@ -76,10 +76,10 @@ class AddressCreateSerializer(ModelSerializer): # type: ignore [type-arg]
user = None
if self.context["request"].user.is_authenticated:
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)
rating = IntegerField(min_value=1, max_value=10, default=10)
action = CharField(default="add")
@ -94,13 +94,13 @@ class DoFeedbackSerializer(Serializer): # type: ignore [type-arg]
return data
class CacheOperatorSerializer(Serializer): # type: ignore [type-arg]
class CacheOperatorSerializer(Serializer):
key = CharField(required=True)
data = JSONField(required=False) # type: ignore [assignment]
data = JSONField(required=False)
timeout = IntegerField(required=False)
class ContactUsSerializer(Serializer): # type: ignore [type-arg]
class ContactUsSerializer(Serializer):
email = CharField(required=True)
name = CharField(required=True)
subject = CharField(required=True)
@ -108,13 +108,13 @@ class ContactUsSerializer(Serializer): # type: ignore [type-arg]
message = CharField(required=True)
class LanguageSerializer(Serializer): # type: ignore [type-arg]
class LanguageSerializer(Serializer):
code = CharField(required=True)
name = CharField(required=True)
flag = CharField()
class RecursiveField(Field): # type: ignore [type-arg]
class RecursiveField(Field):
def to_representation(self, value: Any) -> Any:
parent = self.parent
if isinstance(parent, ListSerializer):
@ -127,45 +127,45 @@ class RecursiveField(Field): # type: ignore [type-arg]
return data
class AddOrderProductSerializer(Serializer): # type: ignore [type-arg]
class AddOrderProductSerializer(Serializer):
product_uuid = CharField(required=True)
attributes = ListField(required=False, child=DictField(), default=list)
class BulkAddOrderProductsSerializer(Serializer): # type: ignore [type-arg]
class BulkAddOrderProductsSerializer(Serializer):
products = ListField(child=AddOrderProductSerializer(), required=True)
class RemoveOrderProductSerializer(Serializer): # type: ignore [type-arg]
class RemoveOrderProductSerializer(Serializer):
product_uuid = CharField(required=True)
attributes = JSONField(required=False, default=dict)
class BulkRemoveOrderProductsSerializer(Serializer): # type: ignore [type-arg]
class BulkRemoveOrderProductsSerializer(Serializer):
products = ListField(child=RemoveOrderProductSerializer(), required=True)
class AddWishlistProductSerializer(Serializer): # type: ignore [type-arg]
class AddWishlistProductSerializer(Serializer):
product_uuid = CharField(required=True)
class RemoveWishlistProductSerializer(Serializer): # type: ignore [type-arg]
class RemoveWishlistProductSerializer(Serializer):
product_uuid = CharField(required=True)
class BulkAddWishlistProductSerializer(Serializer): # type: ignore [type-arg]
class BulkAddWishlistProductSerializer(Serializer):
product_uuids = ListField(
child=CharField(required=True), allow_empty=False, max_length=64
)
class BulkRemoveWishlistProductSerializer(Serializer): # type: ignore [type-arg]
class BulkRemoveWishlistProductSerializer(Serializer):
product_uuids = ListField(
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_payment = BooleanField(required=False, default=False)
promocode_uuid = CharField(required=False)
@ -174,7 +174,7 @@ class BuyOrderSerializer(Serializer): # type: ignore [type-arg]
chosen_products = AddOrderProductSerializer(many=True, required=False)
class BuyUnregisteredOrderSerializer(Serializer): # type: ignore [type-arg]
class BuyUnregisteredOrderSerializer(Serializer):
products = AddOrderProductSerializer(many=True, required=True)
promocode_uuid = UUIDField(required=False)
customer_name = CharField(required=True)
@ -185,7 +185,7 @@ class BuyUnregisteredOrderSerializer(Serializer): # type: ignore [type-arg]
payment_method = CharField(required=True)
class BuyAsBusinessOrderSerializer(Serializer): # type: ignore [type-arg]
class BuyAsBusinessOrderSerializer(Serializer):
products = AddOrderProductSerializer(many=True, required=True)
business_identificator = CharField(required=True)
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.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()
continue
@ -169,14 +169,15 @@ def process_order_changes(instance: Order, created: bool, **kwargs: dict[Any, An
price=order_product.buy_price
)
.first()
.vendor.name.lower() # type: ignore [union-attr, attr-defined, misc]
.vendor.name.lower()
)
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:
order_product.add_error(

View file

@ -12,7 +12,7 @@ class SitemapLanguageMixin:
return getattr(req, "LANGUAGE_CODE", settings.LANGUAGE_CODE)
class StaticPagesSitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-arg]
class StaticPagesSitemap(SitemapLanguageMixin, Sitemap):
protocol = "https"
changefreq = "monthly"
priority = 0.8
@ -58,7 +58,7 @@ class StaticPagesSitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-a
return obj.get("lastmod")
class ProductSitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-arg]
class ProductSitemap(SitemapLanguageMixin, Sitemap):
protocol = "https"
changefreq = "daily"
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'}"
class CategorySitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-arg]
class CategorySitemap(SitemapLanguageMixin, Sitemap):
protocol = "https"
changefreq = "weekly"
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'}"
class BrandSitemap(SitemapLanguageMixin, Sitemap): # type: ignore [type-arg]
class BrandSitemap(SitemapLanguageMixin, Sitemap):
protocol = "https"
changefreq = "weekly"
priority = 0.6

View file

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

View file

@ -66,15 +66,15 @@ def get_random_code() -> str:
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
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
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
@ -150,7 +150,7 @@ def get_project_parameters() -> Any:
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
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:
return mail.get_connection( # type: ignore [no-any-return]
return mail.get_connection(
host=config.EMAIL_HOST,
port=config.EMAIL_PORT,
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
) -> dict[str, Any]:
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):
raise BadRequest(_("both data and timeout are required"))
if not 0 < int(timeout) < 216000:
raise BadRequest(
_("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:

View file

@ -160,7 +160,7 @@ def get_top_returned_products(
p = product_by_id[pid]
img = ""
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(
{
"name": p.name,

View file

@ -121,7 +121,7 @@ def send_order_finished_email(order_pk: str) -> tuple[bool, str]:
"order_products": ops,
"project_name": settings.PROJECT_NAME,
"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"),
"today": datetime.today(),
},

View file

@ -16,7 +16,7 @@ def get_vendors_integrations(name: str | None = None) -> list[AbstractVendor]:
for vendor in vendors:
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))
except Exception as e:
logger.warning(

View file

@ -11,11 +11,11 @@ def validate_category_image_dimensions(
if image:
try:
width, height = get_image_dimensions(image.file) # type: ignore [arg-type]
width, height = get_image_dimensions(image.file)
except (FileNotFoundError, OSError, ValueError):
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(
_(
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}..."
)
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
def round_price_marketologically(price: float) -> float:
@ -536,7 +536,7 @@ class AbstractVendor:
Attribute.objects.filter(name=key, group=attr_group)
.order_by("uuid")
.first()
) # type: ignore [assignment]
)
fields_to_update: list[str] = []
if not attribute.is_active:
attribute.is_active = True

View file

@ -4,6 +4,7 @@ import os
import traceback
from contextlib import suppress
from datetime import date, timedelta
from typing import Any
import requests
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.vary import vary_on_headers
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.views import (
SpectacularAPIView,
@ -42,12 +41,9 @@ from drf_spectacular.views import (
from graphene_file_upload.django import FileUploadGraphQLView
from rest_framework import status
from rest_framework.permissions import AllowAny
from rest_framework.renderers import MultiPartRenderer
from rest_framework.request import Request
from rest_framework.response import Response
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 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.languages import get_flag_by_language
from engine.payments.serializers import TransactionProcessSerializer
from evibes.utils.renderers import camelize
logger = logging.getLogger(__name__)
@ -104,7 +101,7 @@ def sitemap_index(request, *args, **kwargs):
# 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. "
"It ensures the response includes the appropriate content type header for XML."
)
@ -119,7 +116,7 @@ def sitemap_detail(request, *args, **kwargs):
# noinspection PyTypeChecker
sitemap_detail.__doc__ = _( # type: ignore [assignment]
sitemap_detail.__doc__ = _( # pyright: ignore[reportUnknownVariableType]
"Handles the detailed view response for a sitemap. "
"This function processes the request, fetches the appropriate "
"sitemap detail response, and sets the Content-Type header for XML."
@ -155,20 +152,14 @@ class CustomRedocView(SpectacularRedocView):
@extend_schema_view(**LANGUAGE_SCHEMA)
class SupportedLanguagesView(APIView):
__doc__ = _(
__doc__ = _( # pyright: ignore[reportUnknownVariableType]
"Returns a list of supported languages and their corresponding information."
) # type: ignore [assignment]
)
serializer_class = LanguageSerializer
permission_classes = [
AllowAny,
]
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
def get(self, request: Request, *args, **kwargs) -> Response:
return Response(
@ -189,18 +180,12 @@ class SupportedLanguagesView(APIView):
@extend_schema_view(**PARAMETERS_SCHEMA)
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
permission_classes = [
AllowAny,
]
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
def get(self, request: Request, *args, **kwargs) -> Response:
return Response(
@ -212,26 +197,20 @@ class WebsiteParametersView(APIView):
class CacheOperatorView(APIView):
__doc__ = _(
"Handles cache operations such as reading and setting cache data with a specified key and timeout."
) # type: ignore [assignment]
)
serializer_class = CacheOperatorSerializer
permission_classes = [
AllowAny,
]
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
def post(self, request: Request, *args, **kwargs) -> Response:
return Response(
data=web_cache(
request,
request.data.get("key"), # type: ignore [arg-type]
request.data.get("key"),
request.data.get("data", {}),
request.data.get("timeout"), # type: ignore [arg-type]
request.data.get("timeout"),
),
status=status.HTTP_200_OK,
)
@ -239,21 +218,15 @@ class CacheOperatorView(APIView):
@extend_schema_view(**CONTACT_US_SCHEMA)
class ContactUsView(APIView):
__doc__ = _("Handles `contact us` form submissions.") # type: ignore [assignment]
__doc__ = _("Handles `contact us` form submissions.")
serializer_class = ContactUsSerializer
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
@method_decorator(ratelimit(key="ip", rate="2/h", method="POST", block=True))
def post(self, request: Request, *args, **kwargs) -> Response:
serializer = self.serializer_class(data=request.data)
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)
@ -262,17 +235,11 @@ class ContactUsView(APIView):
class RequestCursedURLView(APIView):
__doc__ = _(
"Handles requests for processing and validating URLs from incoming POST requests."
) # type: ignore [assignment]
)
permission_classes = [
AllowAny,
]
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
@method_decorator(ratelimit(key="ip", rate="10/h"))
def post(self, request: Request, *args, **kwargs) -> Response:
@ -304,14 +271,7 @@ class RequestCursedURLView(APIView):
@extend_schema_view(**SEARCH_SCHEMA)
class GlobalSearchView(APIView):
__doc__ = _("Handles global search queries.") # type: ignore [assignment]
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
__doc__ = _("Handles global search queries.")
def get(self, request: Request, *args, **kwargs) -> Response:
return Response(
@ -327,7 +287,7 @@ class GlobalSearchView(APIView):
@extend_schema_view(**BUY_AS_BUSINESS_SCHEMA)
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
@method_decorator(
@ -374,7 +334,7 @@ class BuyAsBusinessView(APIView):
@extend_schema_view(**DOWNLOAD_DIGITAL_ASSET_SCHEMA)
class DownloadDigitalAssetView(APIView):
__doc__ = _( # type: ignore [assignment]
__doc__ = _(
"Handles the downloading of a digital asset associated with an order.\n"
"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 "
@ -409,7 +369,7 @@ class DownloadDigitalAssetView(APIView):
if not order_product.download.order_product.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)
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:
favicon_path = os.path.join(settings.BASE_DIR, "static/favicon.png")
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
favicon_view.__doc__ = _( # type: ignore [assignment]
favicon_view.__doc__ = _(
"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. "
"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
index.__doc__ = _( # type: ignore [assignment]
index.__doc__ = _(
"Redirects the request to the admin index page. "
"The function handles incoming HTTP requests and redirects them to the Django "
"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
version.__doc__ = _( # type: ignore [assignment]
"Returns current version of the eVibes. "
)
version.__doc__ = _("Returns current version of the eVibes. ")
def dashboard_callback(request: HttpRequest, context: Context) -> Context:
@ -631,7 +591,7 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
with suppress(Exception):
quick_links_section = settings.UNFOLD.get("SIDEBAR", {}).get("navigation", [])[
1
] # type: ignore[assignment]
]
for item in quick_links_section.get("items", []):
title = item.get("title")
link = item.get("link")
@ -661,7 +621,7 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
if product:
img = (
product.images.first().image_url if product.images.exists() else ""
) # type: ignore [union-attr]
)
most_wished = {
"name": product.name,
"image": img,
@ -684,7 +644,7 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
if not pid or pid not in product_by_id:
continue
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(
{
"name": p.name,
@ -783,7 +743,7 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
if product:
img = (
product.images.first().image_url if product.images.exists() else ""
) # type: ignore [union-attr]
)
most_popular = {
"name": product.name,
"image": img,
@ -806,7 +766,7 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
if not pid or pid not in product_by_id:
continue
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(
{
"name": p.name,
@ -905,6 +865,4 @@ def dashboard_callback(request: HttpRequest, context: Context) -> Context:
return context
dashboard_callback.__doc__ = _( # type: ignore [assignment]
"Returns custom variables for Dashboard. "
)
dashboard_callback.__doc__ = _("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_filters.rest_framework import DjangoFilterBackend
from django_ratelimit.decorators import ratelimit
from djangorestframework_camel_case.render import CamelCaseJSONRenderer
from drf_spectacular.utils import extend_schema_view
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.exceptions import PermissionDenied
from rest_framework.permissions import AllowAny
from rest_framework.renderers import MultiPartRenderer
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.serializers import Serializer
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 (
ADDRESS_SCHEMA,
@ -139,7 +135,7 @@ logger = logging.getLogger(__name__)
class EvibesViewSet(ModelViewSet):
__doc__ = _( # type: ignore
__doc__ = _(
"Defines a viewset for managing Evibes-related operations. "
"The EvibesViewSet class inherits from ModelViewSet and provides functionality "
"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]] = {}
additional: dict[str, str] = {}
permission_classes = [EvibesPermission]
renderer_classes = [
CamelCaseJSONRenderer,
MultiPartRenderer,
XMLRenderer,
YAMLRenderer,
]
def get_serializer_class(self) -> Type[Serializer]:
# noinspection PyTypeChecker
return self.action_serializer_classes.get(
self.action, super().get_serializer_class()
) # type: ignore [arg-type]
)
@extend_schema_view(**ATTRIBUTE_GROUP_SCHEMA)

View file

@ -11,7 +11,7 @@ from django.utils.safestring import SafeString
class JSONTableWidget(forms.Widget):
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):
return value
try:
@ -40,8 +40,8 @@ class JSONTableWidget(forms.Widget):
json_data = {}
try:
keys = data.getlist(f"{name}_key") # type: ignore [attr-defined]
values = data.getlist(f"{name}_value") # type: ignore [attr-defined]
keys = data.getlist(f"{name}_key")
values = data.getlist(f"{name}_value")
for key, value in zip(keys, values, strict=True):
if key.strip():
try:

View file

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

View file

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

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: BRITISH ENGLISH <CONTACT@FUREUNOIR.COM>\n"
@ -13,11 +13,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\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"
msgstr "Transakce"
#: engine/payments/admin.py:18 engine/payments/models.py:57
#: engine/payments/admin.py:18 engine/payments/models.py:69
msgid "transactions"
msgstr "Transakce"
@ -37,19 +37,19 @@ msgstr "Vklad"
msgid "withdraw"
msgstr "Stáhnout"
#: engine/payments/docs/drf/views.py:13
#: engine/payments/docs/drf/views.py:17
msgid "deposit to balance"
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"
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"
msgstr "Limity plateb"
#: engine/payments/docs/drf/views.py:30
#: engine/payments/docs/drf/views.py:35
msgid ""
"retrieve minimal and maximal allowed deposit amounts across available "
"gateways"
@ -69,88 +69,88 @@ msgstr "Získání jedné transakce (pouze pro čtení)"
msgid "Transaction UUID"
msgstr "UUID transakce"
#: engine/payments/models.py:36
#: engine/payments/models.py:42
msgid "order to process after paid"
msgstr "Objednávka ke zpracování po zaplacení"
#: engine/payments/models.py:39
#: engine/payments/models.py:45
msgid "processing details"
msgstr "Podrobnosti o zpracování"
#: engine/payments/models.py:75
#: engine/payments/models.py:91
msgid "balance"
msgstr "Bilance"
#: engine/payments/models.py:76
#: engine/payments/models.py:92
msgid "balances"
msgstr "Váhy"
#: engine/payments/models.py:86
#: engine/payments/models.py:102
msgid "name"
msgstr "název"
#: engine/payments/models.py:91
#: engine/payments/models.py:107
msgid "default currency"
msgstr "výchozí měna"
#: engine/payments/models.py:98
#: engine/payments/models.py:114
msgid "currencies"
msgstr "měny"
#: engine/payments/models.py:100
#: engine/payments/models.py:116
msgid "comma separated list of currencies supported by this gateway, "
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"
msgstr "minimální částka transakce"
#: engine/payments/models.py:109
#: engine/payments/models.py:125
msgid "maximum transaction amount"
msgstr "maximální částka transakce"
#: engine/payments/models.py:115
#: engine/payments/models.py:131
msgid "daily 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"
msgstr "denní limit součtu částek transakcí. 0 znamená žádný limit"
#: engine/payments/models.py:122
#: engine/payments/models.py:138
msgid "monthly 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"
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"
msgstr "priorita"
#: engine/payments/models.py:126
#: engine/payments/models.py:145
msgid "integration variables"
msgstr "integrační proměnné"
#: engine/payments/models.py:132
#: engine/payments/models.py:152
msgid "payment gateway"
msgstr "platební brána"
#: engine/payments/models.py:133
#: engine/payments/models.py:153
msgid "payment gateways"
msgstr "platební brány"
#: engine/payments/models.py:169
#: engine/payments/models.py:198
msgid "gateway integration path is not set"
msgstr "cesta integrace brány není nastavena"
#: engine/payments/models.py:174
#: engine/payments/models.py:204
#, python-format
msgid "invalid integration path: %(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: "
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}"
msgstr "Nepodařilo se najít poskytovatele {provider}"
#: engine/payments/utils/emailing.py:28
#: engine/payments/utils/emailing.py:31
#, python-brace-format
msgid "{settings.PROJECT_NAME} | balance deposit"
msgstr "{settings.PROJECT_NAME} | zůstatek vkladu"
#: engine/payments/views.py:24
#: engine/payments/views.py:28
msgid ""
"This class provides an API endpoint to handle deposit transactions.\n"
"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í "
"a provedení je poskytnuta odpověď s údaji o transakci."
#: engine/payments/views.py:50
#: engine/payments/views.py:61
msgid ""
"Handles incoming callback requests to the API.\n"
"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 "
"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
msgid "Transaction {transaction.uuid} has no gateway"
msgstr "Transakce {transaction.uuid} nemá žádnou bránu"
#: engine/payments/views.py:64
#: engine/payments/views.py:82
#, python-brace-format
msgid "Gateway {transaction.gateway} has no integration"
msgstr "Brána {transaction.gateway} nemá žádnou integraci"
#: engine/payments/views.py:76
#: engine/payments/views.py:96
msgid ""
"This endpoint returns minimal and maximal allowed deposit amounts across "
"available gateways."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 2025.4\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"
"Last-Translator: EGOR GORBUNOV <CONTACT@FUREUNOIR.COM>\n"
"Language-Team: BRITISH ENGLISH <CONTACT@FUREUNOIR.COM>\n"
@ -13,11 +13,11 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\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"
msgstr "Transaktion"
#: engine/payments/admin.py:18 engine/payments/models.py:57
#: engine/payments/admin.py:18 engine/payments/models.py:69
msgid "transactions"
msgstr "Transaktioner"
@ -37,19 +37,19 @@ msgstr "Indskud"
msgid "withdraw"
msgstr "Træk dig tilbage"
#: engine/payments/docs/drf/views.py:13
#: engine/payments/docs/drf/views.py:17
msgid "deposit to balance"
msgstr "Indbetaling til saldo"
#: engine/payments/docs/drf/views.py:14
#: engine/payments/docs/drf/views.py:18
msgid "deposit some money to balance"
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"
msgstr "Grænser for betaling"
#: engine/payments/docs/drf/views.py:30
#: engine/payments/docs/drf/views.py:35
msgid ""
"retrieve minimal and maximal allowed deposit amounts across available "
"gateways"
@ -69,88 +69,88 @@ msgstr "Hent en enkelt transaktion (skrivebeskyttet)"
msgid "Transaction UUID"
msgstr "Transaktions-UUID"
#: engine/payments/models.py:36
#: engine/payments/models.py:42
msgid "order to process after paid"
msgstr "Ordre til behandling efter betaling"
#: engine/payments/models.py:39
#: engine/payments/models.py:45
msgid "processing details"
msgstr "Behandling af detaljer"
#: engine/payments/models.py:75
#: engine/payments/models.py:91
msgid "balance"
msgstr "Balance"
#: engine/payments/models.py:76
#: engine/payments/models.py:92
msgid "balances"
msgstr "Vægte"
#: engine/payments/models.py:86
#: engine/payments/models.py:102
msgid "name"
msgstr "Navn"
#: engine/payments/models.py:91
#: engine/payments/models.py:107
msgid "default currency"
msgstr "Standardvaluta"
#: engine/payments/models.py:98
#: engine/payments/models.py:114
msgid "currencies"
msgstr "Valutaer"
#: engine/payments/models.py:100
#: engine/payments/models.py:116
msgid "comma separated list of currencies supported by this 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"
msgstr "mindste transaktionsbeløb"
#: engine/payments/models.py:109
#: engine/payments/models.py:125
msgid "maximum transaction amount"
msgstr "maksimalt transaktionsbeløb"
#: engine/payments/models.py:115
#: engine/payments/models.py:131
msgid "daily limit"
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"
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"
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"
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"
msgstr "prioritet"
#: engine/payments/models.py:126
#: engine/payments/models.py:145
msgid "integration variables"
msgstr "Integrationsvariabler"
#: engine/payments/models.py:132
#: engine/payments/models.py:152
msgid "payment gateway"
msgstr "betalingsgateway"
#: engine/payments/models.py:133
#: engine/payments/models.py:153
msgid "payment gateways"
msgstr "Betalingsgateways"
#: engine/payments/models.py:169
#: engine/payments/models.py:198
msgid "gateway integration path is not set"
msgstr "gateway-integrationsstien er ikke indstillet"
#: engine/payments/models.py:174
#: engine/payments/models.py:204
#, python-format
msgid "invalid integration path: %(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: "
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}"
msgstr "Kunne ikke finde udbyder {provider}."
#: engine/payments/utils/emailing.py:28
#: engine/payments/utils/emailing.py:31
#, python-brace-format
msgid "{settings.PROJECT_NAME} | balance deposit"
msgstr "{settings.PROJECT_NAME} | Saldoindbetaling"
#: engine/payments/views.py:24
#: engine/payments/views.py:28
msgid ""
"This class provides an API endpoint to handle deposit transactions.\n"
"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 "
"transaktionsoplysningerne."
#: engine/payments/views.py:50
#: engine/payments/views.py:61
msgid ""
"Handles incoming callback requests to the API.\n"
"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 "
"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
msgid "Transaction {transaction.uuid} has no gateway"
msgstr "Transaktion {transaction.uuid} har ingen gateway"
#: engine/payments/views.py:64
#: engine/payments/views.py:82
#, python-brace-format
msgid "Gateway {transaction.gateway} has no integration"
msgstr "Gateway {transaction.gateway} har ingen integration"
#: engine/payments/views.py:76
#: engine/payments/views.py:96
msgid ""
"This endpoint returns minimal and maximal allowed deposit amounts across "
"available gateways."

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