Merge branch 'main' into storefront-nuxt
This commit is contained in:
commit
3191220ee9
236 changed files with 28294 additions and 27507 deletions
|
|
@ -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",)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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/>")
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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 "علامات المشاركة"
|
||||
|
||||
|
|
|
|||
|
|
@ -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ů"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 "תגיות פוסט"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 "投稿タグ"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 ""
|
||||
|
||||
|
|
|
|||
|
|
@ -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 "게시물 태그"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 "Тэги постов"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 "ป้ายกำกับโพสต์"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 "帖子标签"
|
||||
|
||||
|
|
|
|||
|
|
@ -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. "
|
||||
|
|
|
|||
|
|
@ -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 "
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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"),
|
||||
|
|
|
|||
|
|
@ -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 "
|
||||
|
|
|
|||
|
|
@ -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):
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
4
engine/core/vendors/__init__.py
vendored
4
engine/core/vendors/__init__.py
vendored
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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. ")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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__"
|
||||
|
|
|
|||
|
|
@ -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."
|
||||
|
|
|
|||
|
|
@ -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."
|
||||
|
|
|
|||
|
|
@ -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
Loading…
Reference in a new issue