Features: 3.1.0

This commit is contained in:
Egor Pavlovich Gorbunov 2025-10-14 16:46:09 +03:00
parent e0b2f183ce
commit 72a96edda1
262 changed files with 4744 additions and 4468 deletions

View file

@ -34,7 +34,7 @@ class PostAdmin(SummernoteModelAdminMixin, FieldsetsMixin, ActivationActionsMixi
@register(PostTag)
class PostTagAdmin(ModelAdmin): # type: ignore [misc, type-arg]
class PostTagAdmin(ModelAdmin): # type: ignore [type-arg]
list_display = ("tag_name", "name")
search_fields = ("tag_name", "name")
ordering = ("tag_name",)

View file

@ -11,6 +11,6 @@ class BlogConfig(AppConfig):
hide = False
# noinspection PyUnresolvedReferences
def ready(self):
def ready(self) -> None:
import blog.elasticsearch.documents
import blog.signals # noqa: F401

View file

@ -6,7 +6,7 @@ from core.elasticsearch import COMMON_ANALYSIS, ActiveOnlyMixin, add_multilang_f
from core.elasticsearch.documents import BaseDocument
class PostDocument(ActiveOnlyMixin, BaseDocument):
class PostDocument(ActiveOnlyMixin, BaseDocument): # type: ignore [misc]
title = fields.TextField(
attr="title",
analyzer="standard",
@ -30,7 +30,7 @@ class PostDocument(ActiveOnlyMixin, BaseDocument):
model = Post
fields = ["uuid"]
def prepare_title(self, instance):
def prepare_title(self, instance: Post) -> str:
return getattr(instance, "title", "") or ""

View file

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

View file

@ -7,7 +7,7 @@ from blog.serializers import PostSerializer
from core.permissions import EvibesPermission
class PostViewSet(ReadOnlyModelViewSet):
class PostViewSet(ReadOnlyModelViewSet): # type: ignore [type-arg]
"""
Encapsulates operations for managing and retrieving Post entities in a read-only model view set.

View file

@ -1,4 +1,7 @@
from typing import Any
from django import forms
from django.forms.renderers import BaseRenderer
from django.utils.safestring import mark_safe
@ -7,7 +10,10 @@ class MarkdownEditorWidget(forms.Textarea):
css = {"all": ("https://cdnjs.cloudflare.com/ajax/libs/easymde/2.14.0/easymde.min.css",)}
js = ("https://cdnjs.cloudflare.com/ajax/libs/easymde/2.14.0/easymde.min.js",)
def render(self, name, value, attrs=None, renderer=None):
def render(self, name: str, value: str, attrs: dict[Any, Any] | None = None, renderer: BaseRenderer | None = None):
if not attrs:
attrs = {}
attrs["class"] = "markdown-editor"
textarea_html = super().render(name, value, attrs, renderer)
textarea_id = attrs.get("id", f"id_{name}")
init_js = f"""

View file

@ -20,16 +20,16 @@ class NiceModel(Model):
verbose_name=_("is active"),
help_text=_("if set to false, this object can't be seen by users without needed permission"),
)
created = CreationDateTimeField(_("created"), help_text=_("when the object first appeared on the database"))
modified = ModificationDateTimeField(_("modified"), help_text=_("when the object was last modified"))
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(
def save( # type: ignore [override]
self,
*,
force_insert: bool = False,
force_update: bool = False,
using: str | None = None,
update_fields: Collection | None = None,
update_fields: Collection[str] | None = None,
update_modified: bool = True,
) -> None:
self.update_modified = update_modified

View file

@ -1,13 +1,16 @@
from contextlib import suppress
from typing import ClassVar, Type
from typing import Any, ClassVar, Type
from constance.admin import Config
from constance.admin import ConstanceAdmin as BaseConstanceAdmin
from django.apps import apps
from django.apps import AppConfig, apps
from django.conf import settings
from django.contrib.admin import ModelAdmin, TabularInline, action, register, site
from django.contrib.gis.admin import GISModelAdmin
from django.contrib.messages import constants as messages
from django.db.models import Model
from django.db.models.query import QuerySet
from django.http import HttpRequest
from django.utils.translation import gettext_lazy as _
from modeltranslation.translator import NotRegistered, translator
from modeltranslation.utils import get_translation_fields
@ -36,16 +39,15 @@ from core.models import (
Vendor,
Wishlist,
)
from evibes.settings import CONSTANCE_CONFIG
class FieldsetsMixin:
general_fields: list = []
relation_fields: list = []
additional_fields: list = []
general_fields: list[str] | None = []
relation_fields: list[str] | None = []
additional_fields: list[str] | None = []
model: ClassVar[Type[Model]]
def get_fieldsets(self, request, obj=None):
def get_fieldsets(self, request: HttpRequest, obj: Any = None) -> list[tuple[str, dict[str, list[str]]]]:
if request:
pass
@ -54,14 +56,16 @@ class FieldsetsMixin:
fieldsets = []
def add_translations_fieldset(fss):
def add_translations_fieldset(
fss: list[tuple[str, dict[str, list[str]]]],
) -> list[tuple[str, dict[str, list[str]]]]:
with suppress(NotRegistered):
transoptions = translator.get_options_for_model(self.model)
translation_fields = []
for orig in transoptions.local_fields:
translation_fields += get_translation_fields(orig)
if translation_fields:
fss = list(fss) + [(_("translations"), {"fields": translation_fields})]
fss = list(fss) + [(_("translations"), {"fields": translation_fields})] # type: ignore [list-item]
return fss
if self.general_fields:
@ -95,8 +99,8 @@ class FieldsetsMixin:
ts.append(name)
if ts:
fieldsets.append((_("timestamps"), {"fields": ts, "classes": ["collapse"]}))
fieldsets = add_translations_fieldset(fieldsets)
return fieldsets
fieldsets = add_translations_fieldset(fieldsets) # type: ignore [arg-type, assignment]
return fieldsets # type: ignore [return-value]
# noinspection PyUnresolvedReferences
@ -110,29 +114,29 @@ class ActivationActionsMixin:
]
@action(description=_("activate selected %(verbose_name_plural)s").lower(), permissions=["change"])
def activate_selected(self, request, queryset):
def activate_selected(self, request: HttpRequest, queryset: QuerySet[Any]) -> None:
try:
queryset.update(is_active=True)
self.message_user(
self.message_user( # type: ignore [attr-defined]
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)
self.message_user(request=request, message=str(e), level=messages.ERROR) # type: ignore [attr-defined]
@action(description=_("deactivate selected %(verbose_name_plural)s").lower(), permissions=["change"])
def deactivate_selected(self, request, queryset):
def deactivate_selected(self, request: HttpRequest, queryset: QuerySet[Any]) -> None:
try:
queryset.update(is_active=False)
self.message_user(
self.message_user( # type: ignore [attr-defined]
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)
self.message_user(request=request, message=str(e), level=messages.ERROR) # type: ignore [attr-defined]
class AttributeValueInline(TabularInline):
class AttributeValueInline(TabularInline): # type: ignore [type-arg]
model = AttributeValue
extra = 0
autocomplete_fields = ["attribute"]
@ -142,7 +146,7 @@ class AttributeValueInline(TabularInline):
icon = "fa-solid fa-list-ul"
class ProductImageInline(TabularInline):
class ProductImageInline(TabularInline): # type: ignore [type-arg]
model = ProductImage
extra = 0
is_navtab = True
@ -151,7 +155,7 @@ class ProductImageInline(TabularInline):
icon = "fa-regular fa-images"
class StockInline(TabularInline):
class StockInline(TabularInline): # type: ignore [type-arg]
model = Stock
extra = 0
is_navtab = True
@ -160,7 +164,7 @@ class StockInline(TabularInline):
icon = "fa-solid fa-boxes-stacked"
class OrderProductInline(TabularInline):
class OrderProductInline(TabularInline): # type: ignore [type-arg]
model = OrderProduct
extra = 0
readonly_fields = ("product", "quantity", "buy_price")
@ -174,7 +178,7 @@ class OrderProductInline(TabularInline):
return super().get_queryset(request).select_related("product").only("product__name")
class CategoryChildrenInline(TabularInline):
class CategoryChildrenInline(TabularInline): # type: ignore [type-arg]
model = Category
fk_name = "parent"
extra = 0
@ -186,7 +190,7 @@ class CategoryChildrenInline(TabularInline):
@register(AttributeGroup)
class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = AttributeGroup # type: ignore [misc]
list_display = (
@ -210,7 +214,7 @@ class AttributeGroupAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin):
@register(Attribute)
class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = Attribute # type: ignore [misc]
list_display = (
@ -251,7 +255,7 @@ class AttributeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # typ
@register(AttributeValue)
class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class AttributeValueAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = AttributeValue # type: ignore [misc]
list_display = (
@ -336,7 +340,7 @@ class CategoryAdmin(FieldsetsMixin, ActivationActionsMixin, DraggableMPTTAdmin):
@register(Brand)
class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = Brand # type: ignore [misc]
list_display = (
@ -373,7 +377,7 @@ class BrandAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: i
@register(Product)
class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = Product # type: ignore [misc]
list_display = (
@ -436,7 +440,7 @@ class ProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type:
@register(ProductTag)
class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = ProductTag # type: ignore [misc]
list_display = ("tag_name",)
@ -454,7 +458,7 @@ class ProductTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # ty
@register(CategoryTag)
class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = CategoryTag # type: ignore [misc]
list_display = (
@ -480,7 +484,7 @@ class CategoryTagAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # t
@register(Vendor)
class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = Vendor # type: ignore [misc]
list_display = (
@ -518,7 +522,7 @@ class VendorAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type:
@register(Feedback)
class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = Feedback # type: ignore [misc]
list_display = (
@ -551,7 +555,7 @@ class FeedbackAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type
@register(Order)
class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = Order # type: ignore [misc]
list_display = (
@ -602,7 +606,7 @@ class OrderAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: i
@register(OrderProduct)
class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = OrderProduct # type: ignore [misc]
list_display = (
@ -640,7 +644,7 @@ class OrderProductAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): #
@register(PromoCode)
class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = PromoCode # type: ignore [misc]
list_display = (
@ -684,7 +688,7 @@ class PromoCodeAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # typ
@register(Promotion)
class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = Promotion # type: ignore [misc]
list_display = (
@ -711,7 +715,7 @@ class PromotionAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # typ
@register(Stock)
class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = Stock # type: ignore [misc]
list_display = (
@ -755,7 +759,7 @@ class StockAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: i
@register(Wishlist)
class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = Wishlist # type: ignore [misc]
list_display = (
@ -781,7 +785,7 @@ class WishlistAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type
@register(ProductImage)
class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc]
class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = ProductImage # type: ignore [misc]
list_display = (
@ -817,7 +821,7 @@ class ProductImageAdmin(FieldsetsMixin, ActivationActionsMixin, ModelAdmin): #
@register(Address)
class AddressAdmin(FieldsetsMixin, GISModelAdmin):
class AddressAdmin(FieldsetsMixin, GISModelAdmin): # type: ignore [misc]
# noinspection PyClassVar
model = Address # type: ignore [misc]
list_display = (
@ -867,7 +871,7 @@ class AddressAdmin(FieldsetsMixin, GISModelAdmin):
@register(CustomerRelationshipManagementProvider)
class CustomerRelationshipManagementProviderAdmin(FieldsetsMixin, ModelAdmin):
class CustomerRelationshipManagementProviderAdmin(FieldsetsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = CustomerRelationshipManagementProvider # type: ignore [misc]
list_display = (
@ -896,7 +900,7 @@ class CustomerRelationshipManagementProviderAdmin(FieldsetsMixin, ModelAdmin):
@register(OrderCrmLink)
class OrderCrmLinkAdmin(FieldsetsMixin, ModelAdmin):
class OrderCrmLinkAdmin(FieldsetsMixin, ModelAdmin): # type: ignore [misc, type-arg]
# noinspection PyClassVar
model = OrderCrmLink # type: ignore [misc]
list_display = (
@ -938,22 +942,22 @@ class ConstanceConfig:
swapped = False
is_composite_pk = False
def get_change_permission(self):
def get_change_permission(self) -> str:
return f"change_{self.model_name}"
@property
def app_config(self):
def app_config(self) -> AppConfig:
return apps.get_app_config(self.app_label)
@property
def label(self):
def label(self) -> str:
return f"{self.app_label}.{self.object_name}"
@property
def label_lower(self):
def label_lower(self) -> str:
return f"{self.app_label}.{self.model_name}"
def get_ordered_objects(self):
def get_ordered_objects(self) -> bool:
return False
_meta = Meta()
@ -963,6 +967,6 @@ class ConstanceConfig:
site.unregister([Config])
# noinspection PyTypeChecker
site.register([ConstanceConfig], BaseConstanceAdmin) # type: ignore [list-item]
site.site_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore [assignment]
site.site_title = settings.CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore [assignment]
site.site_header = "eVibes"
site.index_title = CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore [assignment]
site.index_title = settings.CONSTANCE_CONFIG["PROJECT_NAME"][0] # type: ignore [assignment]

View file

@ -11,6 +11,6 @@ class CoreConfig(AppConfig):
hide = False
# noinspection PyUnresolvedReferences
def ready(self):
def ready(self) -> None:
import core.elasticsearch.documents
import core.signals # noqa: F401

View file

@ -113,7 +113,7 @@ def process_query(
request: Request | None = None,
indexes: tuple[str, ...] = ("categories", "brands", "products"),
use_transliteration: bool = True,
) -> dict[str, list[dict]] | None:
) -> dict[str, list[dict[str, Any]]] | None:
if not query:
raise ValueError(_("no search term provided."))
@ -235,7 +235,7 @@ def process_query(
):
hit_cache.append(h)
if getattr(h, "uuid", None):
uuids_by_index.setdefault(h.meta.index, []).append(str(h.uuid))
uuids_by_index.setdefault(h.meta.index, []).append({"uuid": str(h.uuid)})
products_by_uuid = {}
brands_by_uuid = {}
@ -329,9 +329,9 @@ def _lang_analyzer(lang_code: str) -> str:
class ActiveOnlyMixin:
def get_queryset(self) -> QuerySet[Any]:
return super().get_queryset().filter(is_active=True)
return super().get_queryset().filter(is_active=True) # type: ignore [no-any-return, misc]
def should_index_object(self, obj) -> bool:
def should_index_object(self, obj) -> bool: # type: ignore [no-untyped-def]
return getattr(obj, "is_active", False)
@ -436,7 +436,7 @@ COMMON_ANALYSIS = {
}
def add_multilang_fields(cls) -> None:
def add_multilang_fields(cls: Any) -> None:
for code, _lang in settings.LANGUAGES:
lc = code.replace("-", "_").lower()
name_field = f"name_{lc}"
@ -480,10 +480,11 @@ def add_multilang_fields(cls) -> None:
setattr(cls, f"prepare_{desc_field}", make_prepare(desc_field))
def populate_index():
def populate_index() -> None:
for doc in registry.get_documents(set(registry.get_models())):
qs = doc().get_indexing_queryset()
doc().update(qs, parallel=True, refresh=True)
return None
def process_system_query(
@ -493,7 +494,7 @@ def process_system_query(
size_per_index: int = 25,
language_code: str | None = None,
use_transliteration: bool = True,
) -> dict[str, list[dict]]:
) -> dict[str, list[dict[str, Any]]]:
if not query:
raise ValueError(_("no search term provided."))
@ -526,7 +527,7 @@ def process_system_query(
**({"fuzziness": fuzzy} if fuzzy else {}),
)
results: dict[str, list[dict]] = {idx: [] for idx in indexes}
results: dict[str, list[dict[str, Any]]] = {idx: [] for idx in indexes}
for idx in indexes:
s = Search(index=[idx]).query(mm).extra(size=size_per_index, track_total_hits=False)

View file

@ -1,3 +1,6 @@
from typing import Any
from django.db.models import Model, QuerySet
from django_elasticsearch_dsl import Document, fields
from django_elasticsearch_dsl.registries import registry
from health_check.db.models import TestModel
@ -6,7 +9,7 @@ from core.elasticsearch import COMMON_ANALYSIS, ActiveOnlyMixin, add_multilang_f
from core.models import Brand, Category, Product
class BaseDocument(Document):
class BaseDocument(Document): # type: ignore [misc]
name = fields.TextField(
attr="name",
analyzer="standard",
@ -39,10 +42,10 @@ class BaseDocument(Document):
"index": {"max_ngram_diff": 20},
}
def prepare_name(self, instance):
def prepare_name(self, instance: Model) -> str:
return getattr(instance, "name", "") or ""
def prepare_description(self, instance):
def prepare_description(self, instance: Model) -> str:
return getattr(instance, "description", "") or ""
@ -103,7 +106,7 @@ class ProductDocument(ActiveOnlyMixin, BaseDocument):
},
)
def get_queryset(self):
def get_queryset(self) -> QuerySet[Product]:
return (
super()
.get_queryset()
@ -156,7 +159,7 @@ add_multilang_fields(BrandDocument)
registry.register_document(BrandDocument)
class TestModelDocument(Document):
class TestModelDocument(Document): # type: ignore [misc]
class Index:
name = "testmodels"
@ -164,7 +167,7 @@ class TestModelDocument(Document):
model = TestModel
fields = ["title"]
ignore_signals = True
related_models: list = []
related_models: list[Any] = []
auto_refresh = False

View file

@ -1,6 +1,7 @@
import json
import logging
import uuid
from typing import Any
from django.core.exceptions import BadRequest
from django.db.models import (
@ -19,6 +20,7 @@ from django.db.models import (
When,
)
from django.db.models.functions import Coalesce
from django.http import HttpRequest
from django.utils.http import urlsafe_base64_decode
from django.utils.translation import gettext_lazy as _
from django_filters import (
@ -31,6 +33,8 @@ from django_filters import (
OrderingFilter,
UUIDFilter,
)
from graphene import Context
from rest_framework.request import Request
from core.elasticsearch import process_query
from core.models import Address, Brand, Category, Feedback, Order, Product, Stock, Wishlist
@ -38,8 +42,8 @@ from core.models import Address, Brand, Category, Feedback, Order, Product, Stoc
logger = logging.getLogger("django")
class CaseInsensitiveListFilter(BaseInFilter, CharFilter):
def filter(self, qs, value):
class CaseInsensitiveListFilter(BaseInFilter, CharFilter): # type: ignore [misc]
def filter(self, qs: QuerySet[Any], value: Any) -> QuerySet[Any]:
if not value:
return qs
@ -61,7 +65,7 @@ class CaseInsensitiveListFilter(BaseInFilter, CharFilter):
# noinspection PyUnusedLocal
class ProductFilter(FilterSet):
class ProductFilter(FilterSet): # type: ignore [misc]
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"))
@ -121,7 +125,15 @@ class ProductFilter(FilterSet):
"order_by",
]
def __init__(self, data=None, queryset=None, *, request=None, prefix=None):
# noinspection PyTypeHints
def __init__(
self,
data: dict[Any, Any] | None = None,
queryset: QuerySet[Product] | None = None,
*,
request: HttpRequest | Request | Context = None,
prefix: str | None = None,
) -> None:
super().__init__(data=data, queryset=queryset, request=request, prefix=prefix)
ordering_param = self.data.get("order_by", "")
if ordering_param:
@ -133,7 +145,7 @@ class ProductFilter(FilterSet):
.annotate(avg_rating=Avg("rating"))
.values("avg_rating")
)
self.queryset = self.queryset.annotate(
self.queryset: QuerySet[Product] = self.queryset.annotate(
rating=Coalesce(
Subquery(feedback_qs, output_field=FloatField()),
Value(0, output_field=FloatField()),
@ -148,7 +160,7 @@ class ProductFilter(FilterSet):
)
)
def search_products(self, queryset: QuerySet[Product], name, value):
def search_products(self, queryset: QuerySet[Product], name: str, value: str) -> QuerySet[Product]:
if not value:
return queryset
@ -156,17 +168,17 @@ class ProductFilter(FilterSet):
return queryset.filter(uuid__in=uuids)
def filter_include_flag(self, queryset, name, value):
def filter_include_flag(self, queryset: QuerySet[Product], name: str, value: str) -> QuerySet[Product]:
if not self.data.get("category_uuid"):
raise BadRequest(_("there must be a category_uuid to use include_subcategories flag"))
return queryset
def filter_include_personal_ordered(self, queryset, name, value):
def filter_include_personal_ordered(self, queryset: QuerySet[Product], name: str, value: str) -> QuerySet[Product]:
if self.data.get("include_personal_ordered", False):
queryset = queryset.filter(stocks__isnull=False, stocks__quantity__gt=0, stocks__price__gt=0)
return queryset
def filter_attributes(self, queryset, name, value):
def filter_attributes(self, queryset: QuerySet[Product], name: str, value: str) -> QuerySet[Product]:
if not value:
return queryset
@ -228,7 +240,7 @@ class ProductFilter(FilterSet):
return queryset
def filter_category(self, queryset, name, value):
def filter_category(self, queryset: QuerySet[Product], name: str, value: str) -> QuerySet[Product]:
if not value:
return queryset
@ -247,7 +259,7 @@ class ProductFilter(FilterSet):
return queryset.filter(category__uuid=value)
@staticmethod
def _infer_type(value):
def _infer_type(value: str) -> Any:
try:
parsed_value = json.loads(value)
if isinstance(parsed_value, list | dict):
@ -271,7 +283,7 @@ class ProductFilter(FilterSet):
return value
@property
def qs(self):
def qs(self) -> QuerySet[Product]:
qs = super().qs
ordering_param = self.data.get("order_by", "")
@ -320,7 +332,8 @@ class ProductFilter(FilterSet):
return qs.distinct()
class OrderFilter(FilterSet):
# noinspection PyUnusedLocal
class OrderFilter(FilterSet): # type: ignore [misc]
search = CharFilter(
method="filter_search",
label=_("Search (ID, product name or part number)"),
@ -367,7 +380,7 @@ class OrderFilter(FilterSet):
"max_buy_time",
]
def filter_search(self, queryset, _name, value):
def filter_search(self, queryset: QuerySet[Order], name: str, value: str):
return queryset.filter(
Q(human_readable_id__icontains=value)
| Q(order_products__product__name__icontains=value)
@ -375,7 +388,7 @@ class OrderFilter(FilterSet):
).distinct()
class WishlistFilter(FilterSet):
class WishlistFilter(FilterSet): # type: ignore [misc]
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
user_email = CharFilter(field_name="user__email", lookup_expr="iexact", label=_("User email"))
user = UUIDFilter(field_name="user__uuid", lookup_expr="exact", label=_("User UUID"))
@ -395,7 +408,7 @@ class WishlistFilter(FilterSet):
# noinspection PyUnusedLocal
class CategoryFilter(FilterSet):
class CategoryFilter(FilterSet): # type: ignore [misc]
search = CharFilter(field_name="name", method="search_categories", label=_("Search"))
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
name = CharFilter(lookup_expr="icontains", label=_("Name"))
@ -424,7 +437,7 @@ class CategoryFilter(FilterSet):
"whole",
]
def search_categories(self, queryset: QuerySet[Product], name, value):
def search_categories(self, queryset: QuerySet[Category], name: str, value: str) -> QuerySet[Category]:
if not value:
return queryset
@ -432,7 +445,7 @@ class CategoryFilter(FilterSet):
return queryset.filter(uuid__in=uuids)
def filter_order_by(self, queryset, _name, value):
def filter_order_by(self, queryset: QuerySet[Category], name: str, value: str) -> QuerySet[Category]:
if not value:
return queryset
@ -456,7 +469,7 @@ class CategoryFilter(FilterSet):
qs = queryset.order_by(order_expression).prefetch_related(None)
def create_ordered_tree_prefetch(max_depth=10):
def create_ordered_tree_prefetch(max_depth=10) -> Prefetch | None:
if field == "?":
def build_random_prefetch(depth):
@ -494,7 +507,7 @@ class CategoryFilter(FilterSet):
return qs
def filter_whole_categories(self, queryset, _name, value):
def filter_whole_categories(self, queryset: QuerySet[Category], name: str, value: str) -> QuerySet[Category]:
has_own_products = Exists(Product.objects.filter(category=OuterRef("pk")))
has_desc_products = Exists(
Product.objects.filter(
@ -509,7 +522,7 @@ class CategoryFilter(FilterSet):
return annotated.filter(has_products=True).distinct()
return annotated.filter(has_products=False).distinct()
def filter_parent_uuid(self, queryset, _name, value):
def filter_parent_uuid(self, queryset: QuerySet[Category], name: str, value: str):
if value in ("", "null", "None"):
return queryset.filter(parent=None)
@ -522,7 +535,7 @@ class CategoryFilter(FilterSet):
# noinspection PyUnusedLocal
class BrandFilter(FilterSet):
class BrandFilter(FilterSet): # type: ignore [misc]
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"))
@ -543,7 +556,7 @@ class BrandFilter(FilterSet):
model = Brand
fields = ["uuid", "name", "slug", "priority"]
def search_brands(self, queryset: QuerySet[Product], name, value):
def search_brands(self, queryset: QuerySet[Brand], name: str, value: str) -> QuerySet[Brand]:
if not value:
return queryset
@ -552,7 +565,7 @@ class BrandFilter(FilterSet):
return queryset.filter(uuid__in=uuids)
class FeedbackFilter(FilterSet):
class FeedbackFilter(FilterSet): # type: ignore [misc]
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID"))
product_uuid = UUIDFilter(
field_name="order_product__product__uuid",
@ -581,7 +594,7 @@ class FeedbackFilter(FilterSet):
fields = ["uuid", "product_uuid", "user_uuid", "order_by"]
class AddressFilter(FilterSet):
class AddressFilter(FilterSet): # type: ignore [misc]
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID"))
user_uuid = UUIDFilter(field_name="user__uuid", lookup_expr="exact", label=_("User UUID"))
user_email = CharFilter(field_name="user__email", lookup_expr="iexact", label=_("User email"))

View file

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

View file

@ -1,4 +1,5 @@
import logging
from typing import Any
import requests
from django.core.cache import cache
@ -31,6 +32,7 @@ from payments.graphene.object_types import TransactionType
logger = logging.getLogger("django")
# noinspection PyUnusedLocal
class CacheOperator(BaseMutation):
class Meta:
description = _("cache I/O")
@ -46,10 +48,11 @@ class CacheOperator(BaseMutation):
data = GenericScalar(description=_("cached data"))
@staticmethod
def mutate(_parent, info, key, data=None, timeout=None):
def mutate(parent, info, key, data=None, timeout=None) -> dict[Any, Any]: # type: ignore [override]
return camelize(web_cache(info.context, key, data, timeout))
# noinspection PyUnusedLocal
class RequestCursedURL(BaseMutation):
class Meta:
description = _("request a CORSed URL")
@ -60,7 +63,7 @@ class RequestCursedURL(BaseMutation):
data = GenericScalar(description=_("camelized JSON data from the requested URL"))
@staticmethod
def mutate(_parent, info, url):
def mutate(parent, info, url) -> dict[str, Any]: # type: ignore [override]
if not is_url_safe(url):
raise BadRequest(_("only URLs starting with http(s):// are allowed"))
try:
@ -75,6 +78,7 @@ class RequestCursedURL(BaseMutation):
return {"data": {"error": str(e)}}
# noinspection PyUnusedLocal,PyTypeChecker
class AddOrderProduct(BaseMutation):
class Meta:
description = _("add a product to the order")
@ -87,7 +91,7 @@ class AddOrderProduct(BaseMutation):
order = Field(OrderType)
@staticmethod
def mutate(_parent, info, product_uuid, order_uuid, attributes=None):
def mutate(parent, info, product_uuid, order_uuid, attributes=None): # type: ignore [override]
user = info.context.user
try:
order = Order.objects.get(uuid=order_uuid)
@ -101,6 +105,7 @@ class AddOrderProduct(BaseMutation):
raise Http404(_(f"order {order_uuid} not found")) from dne
# noinspection PyUnusedLocal
class RemoveOrderProduct(BaseMutation):
class Meta:
description = _("remove a product from the order")
@ -113,7 +118,7 @@ class RemoveOrderProduct(BaseMutation):
order = Field(OrderType)
@staticmethod
def mutate(_parent, info, product_uuid, order_uuid, attributes=None):
def mutate(parent, info, product_uuid, order_uuid, attributes=None) -> AddOrderProduct | None: # type: ignore [override]
user = info.context.user
try:
order = Order.objects.get(uuid=order_uuid)
@ -127,6 +132,7 @@ class RemoveOrderProduct(BaseMutation):
raise Http404(_(f"order {order_uuid} not found")) from dne
# noinspection PyUnusedLocal,PyTypeChecker
class RemoveAllOrderProducts(BaseMutation):
class Meta:
description = _("remove all products from the order")
@ -137,7 +143,7 @@ class RemoveAllOrderProducts(BaseMutation):
order = Field(OrderType)
@staticmethod
def mutate(_parent, info, order_uuid):
def mutate(parent, info, order_uuid): # type: ignore [override]
user = info.context.user
order = Order.objects.get(uuid=order_uuid)
if not (user.has_perm("core.delete_orderproduct") or user == order.user):
@ -148,6 +154,7 @@ class RemoveAllOrderProducts(BaseMutation):
return RemoveAllOrderProducts(order=order)
# noinspection PyUnusedLocal,PyTypeChecker
class RemoveOrderProductsOfAKind(BaseMutation):
class Meta:
description = _("remove a product from the order")
@ -159,7 +166,7 @@ class RemoveOrderProductsOfAKind(BaseMutation):
order = Field(OrderType)
@staticmethod
def mutate(_parent, info, product_uuid, order_uuid):
def mutate(parent, info, product_uuid, order_uuid): # type: ignore [override]
user = info.context.user
order = Order.objects.get(uuid=order_uuid)
if not (user.has_perm("core.delete_orderproduct") or user == order.user):
@ -170,6 +177,7 @@ class RemoveOrderProductsOfAKind(BaseMutation):
return RemoveOrderProductsOfAKind(order=order)
# noinspection PyUnusedLocal,PyTypeChecker
class BuyOrder(BaseMutation):
class Meta:
description = _("buy an order")
@ -189,7 +197,7 @@ class BuyOrder(BaseMutation):
@staticmethod
def mutate(
_parent,
parent,
info,
order_uuid=None,
order_hr_id=None,
@ -199,7 +207,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(_("please provide either order_uuid or order_hr_id - mutually exclusive"))
user = info.context.user
@ -232,6 +240,7 @@ class BuyOrder(BaseMutation):
raise Http404(_(f"order {order_uuid} not found")) from dne
# noinspection PyUnusedLocal,PyTypeChecker
class BulkOrderAction(BaseMutation):
class Meta:
description = _("perform an action on a list of products in the order")
@ -246,13 +255,13 @@ class BulkOrderAction(BaseMutation):
@staticmethod
def mutate(
_parent,
parent,
info,
action,
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(_("please provide either order_uuid or order_hr_id - mutually exclusive"))
user = info.context.user
@ -279,6 +288,7 @@ class BulkOrderAction(BaseMutation):
raise Http404(_(f"order {order_uuid} not found")) from dne
# noinspection PyUnusedLocal,PyTypeChecker
class BulkWishlistAction(BaseMutation):
class Meta:
description = _("perform an action on a list of products in the wishlist")
@ -292,12 +302,12 @@ class BulkWishlistAction(BaseMutation):
@staticmethod
def mutate(
_parent,
parent,
info,
action,
products,
wishlist_uuid=None,
):
): # type: ignore [override]
if not wishlist_uuid:
raise BadRequest(_("please provide wishlist_uuid value"))
user = info.context.user
@ -319,6 +329,7 @@ class BulkWishlistAction(BaseMutation):
raise Http404(_(f"wishlist {wishlist_uuid} not found")) from dne
# noinspection PyUnusedLocal
class BuyUnregisteredOrder(BaseMutation):
class Meta:
description = _("purchase an order without account creation")
@ -338,7 +349,7 @@ class BuyUnregisteredOrder(BaseMutation):
@staticmethod
def mutate(
_parent,
parent,
info,
products,
customer_name,
@ -349,7 +360,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,
@ -362,9 +373,11 @@ class BuyUnregisteredOrder(BaseMutation):
payment_method=payment_method,
is_business=is_business,
)
# noinspection PyTypeChecker
return BuyUnregisteredOrder(transaction=transaction)
# noinspection PyUnusedLocal,PyTypeChecker
class AddWishlistProduct(BaseMutation):
class Meta:
description = _("add a product to the wishlist")
@ -376,7 +389,7 @@ class AddWishlistProduct(BaseMutation):
wishlist = Field(WishlistType)
@staticmethod
def mutate(_parent, info, product_uuid, wishlist_uuid):
def mutate(parent, info, product_uuid, wishlist_uuid): # type: ignore [override]
user = info.context.user
try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -392,6 +405,7 @@ class AddWishlistProduct(BaseMutation):
raise Http404(_(f"wishlist {wishlist_uuid} not found")) from dne
# noinspection PyUnusedLocal,PyTypeChecker
class RemoveWishlistProduct(BaseMutation):
class Meta:
description = _("remove a product from the wishlist")
@ -403,7 +417,7 @@ class RemoveWishlistProduct(BaseMutation):
wishlist = Field(WishlistType)
@staticmethod
def mutate(_parent, info, product_uuid, wishlist_uuid):
def mutate(parent, info, product_uuid, wishlist_uuid): # type: ignore [override]
user = info.context.user
try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -419,6 +433,7 @@ class RemoveWishlistProduct(BaseMutation):
raise Http404(_(f"wishlist {wishlist_uuid} not found")) from dne
# noinspection PyUnusedLocal,PyTypeChecker
class RemoveAllWishlistProducts(BaseMutation):
class Meta:
description = _("remove all products from the wishlist")
@ -429,7 +444,7 @@ class RemoveAllWishlistProducts(BaseMutation):
wishlist = Field(WishlistType)
@staticmethod
def mutate(_parent, info, wishlist_uuid):
def mutate(parent, info, wishlist_uuid): # type: ignore [override]
user = info.context.user
try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -446,6 +461,7 @@ class RemoveAllWishlistProducts(BaseMutation):
raise Http404(_(f"wishlist {wishlist_uuid} not found")) from dne
# noinspection PyUnusedLocal,PyTypeChecker
class BuyWishlist(BaseMutation):
class Meta:
description = _("buy all products from the wishlist")
@ -459,7 +475,7 @@ class BuyWishlist(BaseMutation):
transaction = Field(TransactionType, required=False)
@staticmethod
def mutate(_parent, info, wishlist_uuid, force_balance=False, force_payment=False):
def mutate(parent, info, wishlist_uuid, force_balance=False, force_payment=False): # type: ignore [override]
user = info.context.user
try:
wishlist = Wishlist.objects.get(uuid=wishlist_uuid)
@ -489,6 +505,7 @@ class BuyWishlist(BaseMutation):
raise Http404(_(f"wishlist {wishlist_uuid} not found")) from dne
# noinspection PyUnusedLocal,PyTypeChecker
class BuyProduct(BaseMutation):
class Meta:
description = _("buy a product")
@ -507,13 +524,13 @@ class BuyProduct(BaseMutation):
@staticmethod
def mutate(
_parent,
parent,
info,
product_uuid,
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(product_uuid=product_uuid, attributes=format_attributes(attributes))
@ -527,6 +544,7 @@ class BuyProduct(BaseMutation):
raise TypeError(_(f"wrong type came from order.buy() method: {type(instance)!s}"))
# noinspection PyUnusedLocal,PyTypeChecker
class FeedbackProductAction(BaseMutation):
class Meta:
description = _("add or delete a feedback for orderproduct")
@ -540,7 +558,7 @@ class FeedbackProductAction(BaseMutation):
feedback = Field(FeedbackType, required=False)
@staticmethod
def mutate(_parent, info, order_product_uuid, action, comment=None, rating=None):
def mutate(parent, info, order_product_uuid, action, comment=None, rating=None): # type: ignore [override]
user = info.context.user
try:
order_product = OrderProduct.objects.get(uuid=order_product_uuid)
@ -559,6 +577,7 @@ class FeedbackProductAction(BaseMutation):
raise Http404(_(f"order product {order_product_uuid} not found")) from dne
# noinspection PyUnusedLocal,PyTypeChecker
class CreateProduct(BaseMutation):
class Arguments:
name = String(required=True)
@ -568,7 +587,7 @@ class CreateProduct(BaseMutation):
product = Field(ProductType)
@staticmethod
def mutate(_parent, info, name, category_uuid, description=None):
def mutate(parent, info, name, category_uuid, description=None): # type: ignore [override]
if not info.context.user.has_perm("core.add_product"):
raise PermissionDenied(permission_denied_message)
category = Category.objects.get(uuid=category_uuid)
@ -576,6 +595,7 @@ class CreateProduct(BaseMutation):
return CreateProduct(product=product)
# noinspection PyUnusedLocal,PyTypeChecker
class UpdateProduct(BaseMutation):
class Arguments:
uuid = UUID(required=True)
@ -586,7 +606,7 @@ class UpdateProduct(BaseMutation):
product = Field(ProductType)
@staticmethod
def mutate(_parent, info, uuid, name=None, description=None, category_uuid=None):
def mutate(parent, info, uuid, name=None, description=None, category_uuid=None): # type: ignore [override]
user = info.context.user
if not user.has_perm("core.change_product"):
raise PermissionDenied(permission_denied_message)
@ -601,6 +621,7 @@ class UpdateProduct(BaseMutation):
return UpdateProduct(product=product)
# noinspection PyUnusedLocal,PyTypeChecker
class DeleteProduct(BaseMutation):
class Arguments:
uuid = UUID(required=True)
@ -608,7 +629,7 @@ class DeleteProduct(BaseMutation):
ok = Boolean()
@staticmethod
def mutate(_parent, info, uuid):
def mutate(parent, info, uuid): # type: ignore [override]
user = info.context.user
if not user.has_perm("core.delete_product"):
raise PermissionDenied(permission_denied_message)
@ -617,6 +638,7 @@ class DeleteProduct(BaseMutation):
return DeleteProduct(ok=True)
# noinspection PyUnusedLocal,PyTypeChecker
class CreateAddress(BaseMutation):
class Arguments:
raw_data = String(required=True, description=_("original address string provided by the user"))
@ -624,13 +646,14 @@ class CreateAddress(BaseMutation):
address = Field(AddressType)
@staticmethod
def mutate(_parent, info, raw_data):
def mutate(parent, info, raw_data): # type: ignore [override]
user = info.context.user if info.context.user.is_authenticated else None
address = Address.objects.create(raw_data=raw_data, user=user)
return CreateAddress(address=address)
# noinspection PyUnusedLocal
class DeleteAddress(BaseMutation):
class Arguments:
uuid = UUID(required=True)
@ -638,7 +661,7 @@ class DeleteAddress(BaseMutation):
success = Boolean()
@staticmethod
def mutate(_parent, info, uuid):
def mutate(parent, info, uuid): # type: ignore [override]
try:
address = Address.objects.get(uuid=uuid)
if (
@ -647,6 +670,7 @@ class DeleteAddress(BaseMutation):
or info.context.user == address.user
):
address.delete()
# noinspection PyTypeChecker
return DeleteAddress(success=True)
raise PermissionDenied(permission_denied_message)
@ -656,6 +680,7 @@ class DeleteAddress(BaseMutation):
raise Http404(_(f"{name} does not exist: {uuid}")) from dne
# noinspection PyUnusedLocal
class AutocompleteAddress(BaseMutation):
class Arguments:
q = String()
@ -664,7 +689,7 @@ class AutocompleteAddress(BaseMutation):
suggestions = GenericScalar()
@staticmethod
def mutate(_parent, info, q, limit):
def mutate(parent, info, q, limit): # type: ignore [override]
if 1 > limit > 10:
raise BadRequest(_("limit must be between 1 and 10"))
try:
@ -672,9 +697,11 @@ class AutocompleteAddress(BaseMutation):
except Exception as e:
raise BadRequest(f"geocoding error: {e!s}") from e
# noinspection PyTypeChecker
return AutocompleteAddress(suggestions=suggestions)
# noinspection PyUnusedLocal
class ContactUs(BaseMutation):
class Arguments:
email = String(required=True)
@ -687,7 +714,7 @@ class ContactUs(BaseMutation):
error = String()
@staticmethod
def mutate(_parent, info, email, name, subject, message, phone_number=None):
def mutate(parent, info, email, name, subject, message, phone_number=None): # type: ignore [override]
try:
contact_us_email.delay(
{
@ -698,12 +725,14 @@ class ContactUs(BaseMutation):
"message": message,
}
)
# noinspection PyTypeChecker
return ContactUs(received=True)
except Exception as e:
# noinspection PyTypeChecker
return ContactUs(received=False, error=str(e))
# noinspection PyArgumentList
# noinspection PyArgumentList PyUnusedLocal
class Search(BaseMutation):
class Arguments:
query = String(required=True)
@ -714,9 +743,10 @@ class Search(BaseMutation):
description = _("elasticsearch - works like a charm")
@staticmethod
def mutate(_parent, info, query):
def mutate(parent, info, query): # type: ignore [override]
data = process_query(query=query, request=info.context)
# noinspection PyTypeChecker
return Search(
results=SearchResultsType(
products=data["products"],

View file

@ -3,7 +3,7 @@ from typing import Any
from constance import config
from django.core.cache import cache
from django.db.models import Max, Min
from django.db.models import Max, Min, QuerySet
from django.db.models.functions import Length
from django.utils.translation import gettext_lazy as _
from graphene import (
@ -60,7 +60,7 @@ from payments.graphene.object_types import TransactionType
logger = logging.getLogger("django")
class SEOMetaType(ObjectType):
class SEOMetaType(ObjectType): # type: ignore [misc]
title = String()
description = String()
canonical = String()
@ -71,7 +71,7 @@ class SEOMetaType(ObjectType):
hreflang = String()
class AttributeType(DjangoObjectType):
class AttributeType(DjangoObjectType): # type: ignore [misc]
values = List(lambda: AttributeValueType, description=_("attribute values"))
class Meta:
@ -81,7 +81,7 @@ class AttributeType(DjangoObjectType):
filter_fields = ["uuid"]
description = _("attributes")
def resolve_values(self, info):
def resolve_values(self, info) -> QuerySet[AttributeValue]:
base_qs = AttributeValue.objects.filter(attribute=self)
product_uuid = getattr(info.context, "_product_uuid", None)
@ -91,7 +91,7 @@ class AttributeType(DjangoObjectType):
return base_qs
class AttributeGroupType(DjangoObjectType):
class AttributeGroupType(DjangoObjectType): # type: ignore [misc]
attributes = List(lambda: AttributeType, description=_("grouped attributes"))
class Meta:
@ -101,7 +101,7 @@ class AttributeGroupType(DjangoObjectType):
filter_fields = ["uuid"]
description = _("groups of attributes")
def resolve_attributes(self: AttributeGroup, info):
def resolve_attributes(self: AttributeGroup, info) -> QuerySet[Attribute]:
product_uuid = getattr(info.context, "_product_uuid", None)
qs = self.attributes.all()
@ -112,7 +112,7 @@ class AttributeGroupType(DjangoObjectType):
return qs
class BrandType(DjangoObjectType):
class BrandType(DjangoObjectType): # type: ignore [misc]
categories = List(lambda: CategoryType, description=_("categories"))
seo_meta = Field(SEOMetaType, description=_("SEO Meta snapshot"))
@ -123,18 +123,18 @@ class BrandType(DjangoObjectType):
filter_fields = ["uuid", "name"]
description = _("brands")
def resolve_categories(self: Brand, info):
def resolve_categories(self: Brand, info) -> QuerySet[Category]:
if info.context.user.has_perm("core.view_category"):
return self.categories.all()
return self.categories.filter(is_active=True)
def resolve_big_logo(self: Brand, info):
def resolve_big_logo(self: Brand, info) -> str | None:
return info.context.build_absolute_uri(self.big_logo.url) if self.big_logo else ""
def resolve_small_logo(self: Brand, info):
def resolve_small_logo(self: Brand, info) -> str | None:
return info.context.build_absolute_uri(self.small_logo.url) if self.small_logo else ""
def resolve_seo_meta(self: Brand, info):
def resolve_seo_meta(self: Brand, info) -> dict[str, str | list[Any] | dict[str, str] | None]:
lang = graphene_current_lang()
base = f"https://{config.BASE_DOMAIN}"
canonical = f"{base}/{lang}/brand/{self.slug}"
@ -177,17 +177,17 @@ class BrandType(DjangoObjectType):
}
class FilterableAttributeType(ObjectType):
class FilterableAttributeType(ObjectType): # type: ignore [misc]
attribute_name = String(required=True)
possible_values = List(String, required=True)
class MinMaxPriceType(ObjectType):
class MinMaxPriceType(ObjectType): # type: ignore [misc]
min_price = Float()
max_price = Float()
class CategoryType(DjangoObjectType):
class CategoryType(DjangoObjectType): # type: ignore [misc]
children = List(
lambda: CategoryType,
description=_("categories"),
@ -340,7 +340,7 @@ class CategoryType(DjangoObjectType):
}
class VendorType(DjangoObjectType):
class VendorType(DjangoObjectType): # type: ignore [misc]
markup_percent = Float(description=_("markup percentage"))
class Meta:
@ -351,7 +351,7 @@ class VendorType(DjangoObjectType):
description = _("vendors")
class AddressType(DjangoObjectType):
class AddressType(DjangoObjectType): # type: ignore [misc]
latitude = Float(description=_("Latitude (Y coordinate)"))
longitude = Float(description=_("Longitude (X coordinate)"))
@ -381,7 +381,7 @@ class AddressType(DjangoObjectType):
return self.location.y if self.location else None
class FeedbackType(DjangoObjectType):
class FeedbackType(DjangoObjectType): # type: ignore [misc]
comment = String(description=_("comment"))
rating = Int(description=_("rating value from 1 to 10, inclusive, or 0 if not set."))
@ -393,7 +393,7 @@ class FeedbackType(DjangoObjectType):
description = _("represents feedback from a user.")
class OrderProductType(DjangoObjectType):
class OrderProductType(DjangoObjectType): # type: ignore [misc]
attributes = GenericScalar(description=_("attributes"))
notifications = GenericScalar(description=_("notifications"))
download_url = String(description=_("download url for this order product if applicable"))
@ -429,7 +429,7 @@ class OrderProductType(DjangoObjectType):
return self.download_url
class OrderType(DjangoObjectType):
class OrderType(DjangoObjectType): # type: ignore [misc]
order_products = DjangoFilterConnectionField(
OrderProductType, description=_("a list of order products in this order")
)
@ -482,7 +482,7 @@ class OrderType(DjangoObjectType):
return None
class ProductImageType(DjangoObjectType):
class ProductImageType(DjangoObjectType): # type: ignore [misc]
image = String(description=_("image url"))
class Meta:
@ -496,7 +496,7 @@ class ProductImageType(DjangoObjectType):
return info.context.build_absolute_uri(self.image.url) if self.image else ""
class ProductType(DjangoObjectType):
class ProductType(DjangoObjectType): # type: ignore [misc]
category = Field(CategoryType, description=_("category"))
images = DjangoFilterConnectionField(ProductImageType, description=_("images"))
feedbacks = DjangoFilterConnectionField(FeedbackType, description=_("feedbacks"))
@ -605,7 +605,7 @@ class ProductType(DjangoObjectType):
}
class AttributeValueType(DjangoObjectType):
class AttributeValueType(DjangoObjectType): # type: ignore [misc]
value = String(description=_("attribute value"))
class Meta:
@ -616,7 +616,7 @@ class AttributeValueType(DjangoObjectType):
description = _("attribute value")
class PromoCodeType(DjangoObjectType):
class PromoCodeType(DjangoObjectType): # type: ignore [misc]
discount = Float()
discount_type = String()
@ -640,7 +640,7 @@ class PromoCodeType(DjangoObjectType):
return "percent" if self.discount_percent else "amount"
class PromotionType(DjangoObjectType):
class PromotionType(DjangoObjectType): # type: ignore [misc]
products = DjangoFilterConnectionField(ProductType, description=_("products on sale"))
class Meta:
@ -651,7 +651,7 @@ class PromotionType(DjangoObjectType):
description = _("promotions")
class StockType(DjangoObjectType):
class StockType(DjangoObjectType): # type: ignore [misc]
vendor = Field(VendorType, description=_("vendor"))
product = Field(ProductType, description=_("product"))
@ -663,7 +663,7 @@ class StockType(DjangoObjectType):
description = _("stocks")
class WishlistType(DjangoObjectType):
class WishlistType(DjangoObjectType): # type: ignore [misc]
products = DjangoFilterConnectionField(ProductType, description=_("wishlisted products"))
class Meta:
@ -673,7 +673,7 @@ class WishlistType(DjangoObjectType):
description = _("wishlists")
class ProductTagType(DjangoObjectType):
class ProductTagType(DjangoObjectType): # type: ignore [misc]
product_set = DjangoFilterConnectionField(ProductType, description=_("tagged products"))
class Meta:
@ -684,7 +684,7 @@ class ProductTagType(DjangoObjectType):
description = _("product tags")
class CategoryTagType(DjangoObjectType):
class CategoryTagType(DjangoObjectType): # type: ignore [misc]
category_set = DjangoFilterConnectionField(CategoryType, description=_("tagged categories"))
class Meta:
@ -695,7 +695,7 @@ class CategoryTagType(DjangoObjectType):
description = _("categories tags")
class ConfigType(ObjectType):
class ConfigType(ObjectType): # type: ignore [misc]
project_name = String(description=_("project name"))
base_domain = String(description=_("company email"))
company_name = String(description=_("company name"))
@ -712,7 +712,7 @@ class ConfigType(ObjectType):
description = _("company configuration")
class LanguageType(ObjectType):
class LanguageType(ObjectType): # type: ignore [misc]
code = String(description=_("language code"))
name = String(description=_("language name"))
flag = String(description=_("language flag, if exists :)"))
@ -721,40 +721,40 @@ class LanguageType(ObjectType):
description = _("supported languages")
class SearchProductsResultsType(ObjectType):
class SearchProductsResultsType(ObjectType): # type: ignore [misc]
uuid = UUID()
name = String()
slug = String()
image = String()
class SearchCategoriesResultsType(ObjectType):
class SearchCategoriesResultsType(ObjectType): # type: ignore [misc]
uuid = UUID()
name = String()
slug = String()
image = String()
class SearchBrandsResultsType(ObjectType):
class SearchBrandsResultsType(ObjectType): # type: ignore [misc]
uuid = UUID()
name = String()
slug = String()
image = String()
class SearchPostsResultsType(ObjectType):
class SearchPostsResultsType(ObjectType): # type: ignore [misc]
uuid = UUID()
name = String()
slug = String()
class SearchResultsType(ObjectType):
class SearchResultsType(ObjectType): # type: ignore [misc]
products = List(description=_("products search results"), of_type=SearchProductsResultsType)
categories = List(description=_("products search results"), of_type=SearchCategoriesResultsType)
brands = List(description=_("products search results"), of_type=SearchBrandsResultsType)
posts = List(description=_("posts search results"), of_type=SearchPostsResultsType)
class BulkProductInput(InputObjectType):
class BulkProductInput(InputObjectType): # type: ignore [misc]
uuid = UUID(required=True)
attributes = GenericScalar(required=False)

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -48,82 +48,86 @@ msgstr "تم التعديل"
msgid "when the object was last modified"
msgstr "متى تم تحرير الكائن آخر مرة"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "الترجمات"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "جنرال لواء"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "العلاقات"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "معلومات إضافية"
#: core/admin.py:94
msgid "metadata"
msgstr "البيانات الوصفية"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "الطوابع الزمنية"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "تنشيط المحدد _PH_0__%(verbose_name_plural)s"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "تم تفعيل العناصر المختارة!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "إلغاء التنشيط المحدد _PH_0_%(verbose_name_plural)s"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "تم إلغاء تنشيط العناصر المحددة!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "قيمة السمة"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "قيم السمات"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "الصورة"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "الصور"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "المخزون"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "الأسهم"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "طلب المنتج"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "اطلب المنتجات"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "الأطفال"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "التكوين"
@ -707,7 +711,7 @@ msgstr "حذف علاقة الطلب-المنتج"
msgid "add or remove feedback on an orderproduct relation"
msgstr "إضافة أو إزالة الملاحظات على العلاقة بين الطلب والمنتج"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "لم يتم توفير مصطلح بحث."
@ -881,7 +885,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "يرجى تقديم إما Order_uuid أو order_uid_hr_hr_id - متنافيان!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "جاء نوع خاطئ من طريقة order.buy(): {type(instance)!s}"
@ -957,7 +961,7 @@ msgstr "سلسلة العنوان الأصلي المقدمة من المستخ
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} غير موجود: {uuid}!"
@ -2611,22 +2615,22 @@ msgstr "كل من البيانات والمهلة مطلوبة"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "قيمة المهلة غير صالحة، يجب أن تكون بين 0 و216000 ثانية"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | بادر بالاتصال بنا"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | تأكيد الطلب"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | طلبية تم تسليمها"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | الرمز الترويجي الممنوح"
@ -2862,7 +2866,7 @@ msgstr ""
" \"مجموعة عرض الملاحظات\" الأساسية وتستفيد من نظام تصفية Django للاستعلام عن"
" البيانات."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2879,7 +2883,7 @@ msgstr ""
"عليه. يستخدم ViewSet العديد من المتسلسلات بناءً على الإجراء المحدد الذي يتم "
"تنفيذه ويفرض الأذونات وفقًا لذلك أثناء التفاعل مع بيانات الطلبات."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2892,11 +2896,11 @@ msgstr ""
"من الأذونات، وتبديل المتسلسل بناءً على الإجراء المطلوب. بالإضافة إلى ذلك، "
"توفر إجراءً مفصلاً للتعامل مع الملاحظات على مثيلات OrderProduct"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "يدير العمليات المتعلقة بصور المنتج في التطبيق."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -2904,15 +2908,15 @@ msgstr ""
"يدير استرداد مثيلات PromoCode ومعالجتها من خلال إجراءات واجهة برمجة "
"التطبيقات المختلفة."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "يمثل مجموعة عرض لإدارة الترقيات."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "يتعامل مع العمليات المتعلقة ببيانات المخزون في النظام."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2929,7 +2933,7 @@ msgstr ""
"الأذونات للتأكد من أن المستخدمين يمكنهم فقط إدارة قوائم الرغبات الخاصة بهم "
"ما لم يتم منح أذونات صريحة."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2942,12 +2946,12 @@ msgstr ""
"العناوين. وتتضمن سلوكيات متخصصة لطرق HTTP المختلفة، وتجاوزات المتسلسل، "
"ومعالجة الأذونات بناءً على سياق الطلب."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "خطأ في الترميز الجغرافي: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -50,82 +50,86 @@ msgstr "Upraveno"
msgid "when the object was last modified"
msgstr "Kdy byl objekt naposledy upraven"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Překlady"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Obecné"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Vztahy"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "další informace"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadata"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Časová razítka"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Aktivace vybraného %(verbose_name_plural)s"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Vybrané položky byly aktivovány!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Deaktivace vybraných %(verbose_name_plural)s"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Vybrané položky byly deaktivovány!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Hodnota atributu"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Hodnoty atributů"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Obrázek"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Obrázky"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Stock"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Zásoby"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Objednat produkt"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Objednat produkty"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Děti"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Konfigurace"
@ -732,7 +736,7 @@ msgstr "odstranit vztah objednávka-produkt"
msgid "add or remove feedback on an orderproduct relation"
msgstr "přidat nebo odebrat zpětnou vazbu na vztah objednávka-produkt."
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Nebyl zadán žádný vyhledávací termín."
@ -906,7 +910,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "Zadejte prosím order_uuid nebo order_hr_id - vzájemně se vylučují!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Z metody order.buy() pochází nesprávný typ: {type(instance)!s}"
@ -984,7 +988,7 @@ msgstr "Původní řetězec adresy zadaný uživatelem"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} neexistuje: {uuid}!"
@ -2672,22 +2676,22 @@ msgstr "Jsou vyžadována data i časový limit"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "Nesprávná hodnota timeoutu, musí být v rozmezí 0 až 216000 sekund."
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | kontaktujte nás inicioval"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Potvrzení objednávky"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Objednávka doručena"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promocode uděleno"
@ -2932,7 +2936,7 @@ msgstr ""
"objekty Zpětné vazby na základě oprávnění. Rozšiřuje základní třídu "
"`EvibesViewSet` a využívá systém filtrování Djanga pro dotazování na data."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2950,7 +2954,7 @@ msgstr ""
" Sada ViewSet používá několik serializátorů podle konkrétní prováděné akce a"
" podle toho vynucuje oprávnění při interakci s daty objednávek."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2964,11 +2968,11 @@ msgstr ""
" požadované akce. Kromě toho poskytuje podrobnou akci pro zpracování zpětné "
"vazby na instance OrderProduct"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Spravuje operace související s obrázky produktů v aplikaci."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -2976,15 +2980,15 @@ msgstr ""
"Spravuje načítání a zpracování instancí PromoCode prostřednictvím různých "
"akcí API."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Představuje sadu zobrazení pro správu povýšení."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Zpracovává operace související s údaji o zásobách v systému."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3002,7 +3006,7 @@ msgstr ""
"uživatelé mohou spravovat pouze své vlastní seznamy přání, pokud jim nejsou "
"udělena výslovná oprávnění."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3016,12 +3020,12 @@ msgstr ""
"přepisování serializátoru a zpracování oprávnění na základě kontextu "
"požadavku."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Chyba v zeměpisném kódování: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -49,82 +49,86 @@ msgstr "Modificeret"
msgid "when the object was last modified"
msgstr "Hvornår objektet sidst blev redigeret"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Oversættelser"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Generelt"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relationer"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "Yderligere info"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadata"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Tidsstempler"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Aktivér valgt %(verbose_name_plural)s."
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Udvalgte varer er blevet aktiveret!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Deaktiver valgte %(verbose_name_plural)s."
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Udvalgte varer er blevet deaktiveret!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Attributværdi"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Attributværdier"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Billede"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Billeder"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Lager"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Aktier"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Bestil produkt"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Bestil produkter"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Børn"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Konfig"
@ -734,7 +738,7 @@ msgstr "slette en ordre-produkt-relation"
msgid "add or remove feedback on an orderproduct relation"
msgstr "tilføje eller fjerne feedback på en ordre-produkt-relation"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Der er ikke angivet noget søgeord."
@ -908,7 +912,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "Angiv enten order_uuid eller order_hr_id - det udelukker hinanden!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Forkert type kom fra metoden order.buy(): {type(instance)!s}"
@ -986,7 +990,7 @@ msgstr "Original adressestreng leveret af brugeren"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} findes ikke: {uuid}!"
@ -2694,22 +2698,22 @@ msgstr "Både data og timeout er påkrævet"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "Ugyldig timeout-værdi, den skal være mellem 0 og 216000 sekunder"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | kontakt os påbegyndt"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Ordrebekræftelse"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Order Delivered"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promokode givet"
@ -2958,7 +2962,7 @@ msgstr ""
" basen `EvibesViewSet` og gør brug af Djangos filtreringssystem til at "
"forespørge på data."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2977,7 +2981,7 @@ msgstr ""
"baseret på den specifikke handling, der udføres, og håndhæver tilladelser i "
"overensstemmelse hermed, mens der interageres med ordredata."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2992,11 +2996,11 @@ msgstr ""
"Derudover indeholder det en detaljeret handling til håndtering af feedback "
"på OrderProduct-instanser."
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Håndterer operationer relateret til produktbilleder i applikationen."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3004,15 +3008,15 @@ msgstr ""
"Administrerer hentning og håndtering af PromoCode-instanser gennem "
"forskellige API-handlinger."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Repræsenterer et visningssæt til håndtering af kampagner."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Håndterer operationer relateret til lagerdata i systemet."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3030,7 +3034,7 @@ msgstr ""
"integreret for at sikre, at brugere kun kan administrere deres egne "
"ønskelister, medmindre der er givet eksplicitte tilladelser."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3044,12 +3048,12 @@ msgstr ""
"omfatter specialiseret adfærd for forskellige HTTP-metoder, tilsidesættelse "
"af serializer og håndtering af tilladelser baseret på anmodningskonteksten."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Fejl i geokodning: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -51,82 +51,86 @@ msgstr "Geändert"
msgid "when the object was last modified"
msgstr "Wann das Objekt zuletzt bearbeitet wurde"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Übersetzungen"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Allgemein"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Beziehungen"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "Zusatzinfo"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadaten"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Zeitstempel"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Ausgewählte %(verbose_name_plural)s aktivieren"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Ausgewählte Artikel wurden aktiviert!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Ausgewählte %(verbose_name_plural)s deaktivieren"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Ausgewählte Artikel wurden deaktiviert!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Attribut Wert"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Attribut Werte"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Bild"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Bilder"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Lagerbestand"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Bestände"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Produkt bestellen"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Produkte bestellen"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Kinder"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Konfigurieren Sie"
@ -760,7 +764,7 @@ msgid "add or remove feedback on an orderproduct relation"
msgstr ""
"Feedback zu einer Bestellung-Produkt-Beziehung hinzufügen oder entfernen"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Kein Suchbegriff angegeben."
@ -937,7 +941,7 @@ msgstr ""
"sich gegenseitig aus!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Von der Methode order.buy() kam der falsche Typ: {type(instance)!s}"
@ -1016,7 +1020,7 @@ msgstr "Vom Benutzer angegebene Originaladresse"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} existiert nicht: {uuid}!"
@ -2757,22 +2761,22 @@ msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr ""
"Ungültiger Timeout-Wert, er muss zwischen 0 und 216000 Sekunden liegen"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | Kontakt eingeleitet"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Auftragsbestätigung"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Bestellung ausgeliefert"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | Promocode gewährt"
@ -3029,7 +3033,7 @@ msgstr ""
"implementieren. Es erweitert das Basis `EvibesViewSet` und nutzt das "
"Filtersystem von Django zur Abfrage von Daten."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -3049,7 +3053,7 @@ msgstr ""
"basieren, die durchgeführt wird, und erzwingt die entsprechenden "
"Berechtigungen, während es mit den Bestelldaten interagiert."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -3064,12 +3068,12 @@ msgstr ""
"Außerdem bietet es eine detaillierte Aktion für die Bearbeitung von Feedback"
" zu OrderProduct-Instanzen"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr ""
"Verwaltet Vorgänge im Zusammenhang mit Produktbildern in der Anwendung."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3077,15 +3081,15 @@ msgstr ""
"Verwaltet den Abruf und die Handhabung von PromoCode-Instanzen durch "
"verschiedene API-Aktionen."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Stellt ein Ansichtsset für die Verwaltung von Werbeaktionen dar."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Erledigt Vorgänge im Zusammenhang mit Bestandsdaten im System."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3104,7 +3108,7 @@ msgstr ""
"nur ihre eigenen Wunschlisten verwalten können, sofern keine expliziten "
"Berechtigungen erteilt wurden."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3119,12 +3123,12 @@ msgstr ""
"HTTP-Methoden, Serialisierungsüberschreibungen und die Behandlung von "
"Berechtigungen auf der Grundlage des Anfragekontexts."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Geocodierungsfehler: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -53,82 +53,86 @@ msgstr "Modified"
msgid "when the object was last modified"
msgstr "When the object was last edited"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Translations"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "General"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relations"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "additional info"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadata"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Timestamps"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Activate selected %(verbose_name_plural)s"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Selected items have been activated!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Deactivate selected %(verbose_name_plural)s"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Selected items have been deactivated!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Attribute Value"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Attribute Values"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Image"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Images"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Stock"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Stocks"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Order Product"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Order Products"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Children"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Config"
@ -712,7 +716,7 @@ msgstr "delete an orderproduct relation"
msgid "add or remove feedback on an orderproduct relation"
msgstr "add or remove feedback on an orderproduct relation"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "No search term provided."
@ -885,7 +889,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "Please provide either order_uuid or order_hr_id - mutually exclusive!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Wrong type came from order.buy() method: {type(instance)!s}"
@ -963,7 +967,7 @@ msgstr "Original address string provided by the user"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} does not exist: {uuid}!"
@ -2644,22 +2648,22 @@ msgstr "Both data and timeout are required"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "Invalid timeout value, it must be between 0 and 216000 seconds"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | contact us initiated"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Order Confirmation"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Order Delivered"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promocode granted"
@ -2904,7 +2908,7 @@ msgstr ""
" accessible Feedback objects. It extends the base `EvibesViewSet` and makes "
"use of Django's filtering system for querying data."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2922,7 +2926,7 @@ msgstr ""
" uses multiple serializers based on the specific action being performed and "
"enforces permissions accordingly while interacting with order data."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2936,11 +2940,11 @@ msgstr ""
" requested action. Additionally, it provides a detailed action for handling "
"feedback on OrderProduct instances"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Manages operations related to Product images in the application."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -2948,15 +2952,15 @@ msgstr ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Represents a view set for managing promotions."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Handles operations related to Stock data in the system."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2974,7 +2978,7 @@ msgstr ""
"that users can only manage their own wishlists unless explicit permissions "
"are granted."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2988,12 +2992,12 @@ msgstr ""
"different HTTP methods, serializer overrides, and permission handling based "
"on the request context."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Geocoding error: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -49,82 +49,86 @@ msgstr "Modified"
msgid "when the object was last modified"
msgstr "When the object was last edited"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Translations"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "General"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relations"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "additional info"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadata"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Timestamps"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Activate selected %(verbose_name_plural)s"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Selected items have been activated!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Deactivate selected %(verbose_name_plural)s"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Selected items have been deactivated!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Attribute Value"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Attribute Values"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Image"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Images"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Stock"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Stocks"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Order Product"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Order Products"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Children"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Config"
@ -708,7 +712,7 @@ msgstr "delete an orderproduct relation"
msgid "add or remove feedback on an orderproduct relation"
msgstr "add or remove feedback on an orderproduct relation"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "No search term provided."
@ -881,7 +885,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "Please provide either order_uuid or order_hr_id - mutually exclusive!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Wrong type came from order.buy() method: {type(instance)!s}"
@ -959,7 +963,7 @@ msgstr "Original address string provided by the user"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} does not exist: {uuid}!"
@ -2640,22 +2644,22 @@ msgstr "Both data and timeout are required"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "Invalid timeout value, it must be between 0 and 216000 seconds"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | contact us initiated"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Order Confirmation"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Order Delivered"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promocode granted"
@ -2900,7 +2904,7 @@ msgstr ""
" accessible Feedback objects. It extends the base `EvibesViewSet` and makes "
"use of Django's filtering system for querying data."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2918,7 +2922,7 @@ msgstr ""
" uses multiple serializers based on the specific action being performed and "
"enforces permissions accordingly while interacting with order data."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2932,11 +2936,11 @@ msgstr ""
" requested action. Additionally, it provides a detailed action for handling "
"feedback on OrderProduct instances"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Manages operations related to Product images in the application."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -2944,15 +2948,15 @@ msgstr ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Represents a view set for managing promotions."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Handles operations related to Stock data in the system."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2970,7 +2974,7 @@ msgstr ""
"that users can only manage their own wishlists unless explicit permissions "
"are granted."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2984,12 +2988,12 @@ msgstr ""
"different HTTP methods, serializer overrides, and permission handling based "
"on the request context."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Geocoding error: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -51,82 +51,86 @@ msgstr "Modificado"
msgid "when the object was last modified"
msgstr "Cuándo se editó el objeto por última vez"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Traducciones"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "General"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relaciones"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "información adicional"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadatos"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Marcas de tiempo"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Activar %(verbose_name_plural)s seleccionado"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Los artículos seleccionados se han activado."
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Desactivar %(verbose_name_plural)s seleccionado"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Los artículos seleccionados se han desactivado."
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Atributo Valor"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Valores de los atributos"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Imagen"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Imágenes"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Stock"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Acciones"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Pedir un producto"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Pedir productos"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Niños"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Configurar"
@ -742,7 +746,7 @@ msgstr "suprimir una relación pedido-producto"
msgid "add or remove feedback on an orderproduct relation"
msgstr "añadir o eliminar comentarios en una relación pedido-producto"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "No se proporciona ningún término de búsqueda."
@ -916,7 +920,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "Indique order_uuid o order_hr_id, ¡se excluyen mutuamente!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr ""
"Tipo incorrecto proveniente del método order.buy(): {type(instance)!s}"
@ -995,7 +999,7 @@ msgstr "Cadena de dirección original proporcionada por el usuario"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} no existe: ¡{uuid}!"
@ -2711,22 +2715,22 @@ msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr ""
"Valor de tiempo de espera no válido, debe estar entre 0 y 216000 segundos."
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | contacto iniciado"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Confirmación de pedido"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Pedido entregado"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promocode granted"
@ -2980,7 +2984,7 @@ msgstr ""
"objetos Feedback accesibles. Extiende la base `EvibesViewSet` y hace uso del"
" sistema de filtrado de Django para la consulta de datos."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2999,7 +3003,7 @@ msgstr ""
"acción específica que se esté realizando y aplica los permisos "
"correspondientes al interactuar con los datos del pedido."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -3014,13 +3018,13 @@ msgstr ""
"Además, proporciona una acción detallada para gestionar los comentarios "
"sobre las instancias de OrderProduct."
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr ""
"Gestiona las operaciones relacionadas con las imágenes de productos en la "
"aplicación."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3028,16 +3032,16 @@ msgstr ""
"Gestiona la recuperación y el manejo de instancias de PromoCode a través de "
"varias acciones de la API."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Representa un conjunto de vistas para gestionar promociones."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr ""
"Gestiona las operaciones relacionadas con los datos de Stock en el sistema."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3056,7 +3060,7 @@ msgstr ""
"integrados para garantizar que los usuarios sólo puedan gestionar sus "
"propias listas de deseos a menos que se concedan permisos explícitos."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3070,12 +3074,12 @@ msgstr ""
"comportamientos especializados para diferentes métodos HTTP, anulaciones del"
" serializador y gestión de permisos basada en el contexto de la solicitud."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Error de geocodificación: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -49,82 +49,86 @@ msgstr ""
msgid "when the object was last modified"
msgstr ""
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr ""
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr ""
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr ""
#: core/admin.py:87
msgid "metadata"
#: core/admin.py:76
msgid "additional info"
msgstr ""
#: core/admin.py:94
msgid "metadata"
msgstr ""
#: core/admin.py:101
msgid "timestamps"
msgstr ""
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr ""
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr ""
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr ""
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr ""
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr ""
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr ""
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr ""
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr ""
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr ""
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr ""
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr ""
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr ""
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr ""
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr ""
@ -678,7 +682,7 @@ msgstr ""
msgid "add or remove feedback on an orderproduct relation"
msgstr ""
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr ""
@ -851,7 +855,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr ""
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr ""
@ -927,7 +931,7 @@ msgstr ""
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr ""
@ -2459,22 +2463,22 @@ msgstr ""
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr ""
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr ""
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr ""
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr ""
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr ""
@ -2656,7 +2660,7 @@ msgid ""
"use of Django's filtering system for querying data."
msgstr ""
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2667,7 +2671,7 @@ msgid ""
"enforces permissions accordingly while interacting with order data."
msgstr ""
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2676,25 +2680,25 @@ msgid ""
"feedback on OrderProduct instances"
msgstr ""
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr ""
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
msgstr ""
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr ""
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr ""
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2705,7 +2709,7 @@ msgid ""
"are granted."
msgstr ""
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2714,12 +2718,12 @@ msgid ""
"on the request context."
msgstr ""
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr ""
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -51,82 +51,86 @@ msgstr "Modifié"
msgid "when the object was last modified"
msgstr "Date de la dernière modification de l'objet"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Traductions"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Général"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relations"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "Informations complémentaires"
#: core/admin.py:94
msgid "metadata"
msgstr "Métadonnées"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Horodatage"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Activer la %(verbose_name_plural)s sélectionnée"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Les articles sélectionnés ont été activés !"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Désactiver la %(verbose_name_plural)s sélectionnée"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Les articles sélectionnés ont été désactivés !"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Valeur de l'attribut"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Valeurs des attributs"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Image"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Images"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Stock"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Stocks"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Commander un produit"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Commander des produits"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Les enfants"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Config"
@ -754,7 +758,7 @@ msgstr ""
"ajouter ou supprimer un retour d'information sur une relation commande-"
"produit"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Aucun terme de recherche n'est fourni."
@ -931,7 +935,7 @@ msgstr ""
"mutuellement !"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr ""
"Le mauvais type provient de la méthode order.buy() : {type(instance)!s}"
@ -1013,7 +1017,7 @@ msgstr "Chaîne d'adresse originale fournie par l'utilisateur"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} n'existe pas : {uuid} !"
@ -2758,22 +2762,22 @@ msgstr ""
"La valeur du délai d'attente n'est pas valide, elle doit être comprise entre"
" 0 et 216000 secondes."
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | nous contacter initié"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Confirmation de commande"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Commande livrée"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promocode accordé"
@ -3030,7 +3034,7 @@ msgstr ""
"la classe de base `EvibesViewSet` et utilise le système de filtrage de "
"Django pour l'interrogation des données."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -3050,7 +3054,7 @@ msgstr ""
"autorisations en conséquence lors de l'interaction avec les données de la "
"commande."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -3065,11 +3069,11 @@ msgstr ""
" En outre, il fournit une action détaillée pour gérer le retour "
"d'informations sur les instances OrderProduct."
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Gère les opérations liées aux images des produits dans l'application."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3077,15 +3081,15 @@ msgstr ""
"Gère la récupération et le traitement des instances de PromoCode par le "
"biais de diverses actions API."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Représente un jeu de vues pour la gestion des promotions."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Gère les opérations liées aux données de stock dans le système."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3105,7 +3109,7 @@ msgstr ""
"ne peuvent gérer que leur propre liste de souhaits, sauf si des permissions "
"explicites sont accordées."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3120,12 +3124,12 @@ msgstr ""
" HTTP, des dérogations au sérialiseur et une gestion des autorisations basée"
" sur le contexte de la demande."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Erreur de géocodage : {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -47,82 +47,86 @@ msgstr "משונה"
msgid "when the object was last modified"
msgstr "מתי האובייקט נערך לאחרונה"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "תרגומים"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "כללי"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "יחסים"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "מידע נוסף"
#: core/admin.py:94
msgid "metadata"
msgstr "מטא-נתונים"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "חותמות זמן"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "הפעל את %(verbose_name_plural)s שנבחר"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "הפריטים שנבחרו הופעלו!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "השבת את %(verbose_name_plural)s שנבחר"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "פריטים נבחרים הושבתו!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "ערך התכונה"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "ערכי תכונות"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "תמונה"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "תמונות"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "מלאי"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "מניות"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "הזמן מוצר"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "הזמנת מוצרים"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "ילדים"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "תצורה"
@ -693,7 +697,7 @@ msgstr "מחיקת קשר בין הזמנה למוצר"
msgid "add or remove feedback on an orderproduct relation"
msgstr "הוספה או הסרה של משוב על קשר בין הזמנה למוצר"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "לא צויין מונח חיפוש."
@ -866,7 +870,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "אנא ספק את order_uuid או order_hr_id - אחד מהם בלבד!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "סוג שגוי הגיע משיטת order.buy(): {type(instance)!s}"
@ -942,7 +946,7 @@ msgstr "מחרוזת הכתובת המקורית שסופקה על ידי המש
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} אינו קיים: {uuid}!"
@ -2572,22 +2576,22 @@ msgstr "נדרשים הן הנתונים והן זמן ההמתנה"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "ערך זמן המתנה לא חוקי, הוא חייב להיות בין 0 ל-216000 שניות"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | צור קשר יוזם"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | אישור הזמנה"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | הזמנה נמסרה"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | קוד קידום מכירות מוענק"
@ -2817,7 +2821,7 @@ msgstr ""
" היא מרחיבה את `EvibesViewSet` הבסיסי ומשתמשת במערכת הסינון של Django "
"לשאילתת נתונים."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2834,7 +2838,7 @@ msgstr ""
"בהתאם לפעולה הספציפית המתבצעת ומאכוף הרשאות בהתאם בעת אינטראקציה עם נתוני "
"הזמנה."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2847,25 +2851,25 @@ msgstr ""
"הרשאות והחלפת סריאלייזר בהתאם לפעולה המבוקשת. בנוסף, הוא מספק פעולה מפורטת "
"לטיפול במשוב על מופעים של OrderProduct."
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "מנהל פעולות הקשורות לתמונות מוצרים ביישום."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
msgstr "מנהל את אחזור וטיפול במקרי PromoCode באמצעות פעולות API שונות."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "מייצג קבוצת תצוגות לניהול מבצעים."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "מטפל בפעולות הקשורות לנתוני המלאי במערכת."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2882,7 +2886,7 @@ msgstr ""
"שמשתמשים יוכלו לנהל רק את רשימות המשאלות שלהם, אלא אם כן ניתנו הרשאות "
"מפורשות."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2895,12 +2899,12 @@ msgstr ""
"לישויות כתובת. היא כוללת התנהגויות מיוחדות עבור שיטות HTTP שונות, עקיפת "
"סריאלייזר וטיפול בהרשאות בהתבסס על הקשר הבקשה."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "שגיאת קידוד גיאוגרפי: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -49,82 +49,86 @@ msgstr ""
msgid "when the object was last modified"
msgstr ""
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr ""
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr ""
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr ""
#: core/admin.py:87
msgid "metadata"
#: core/admin.py:76
msgid "additional info"
msgstr ""
#: core/admin.py:94
msgid "metadata"
msgstr ""
#: core/admin.py:101
msgid "timestamps"
msgstr ""
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr ""
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr ""
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr ""
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr ""
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr ""
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr ""
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr ""
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr ""
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr ""
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr ""
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr ""
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr ""
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr ""
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr ""
@ -678,7 +682,7 @@ msgstr ""
msgid "add or remove feedback on an orderproduct relation"
msgstr ""
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr ""
@ -851,7 +855,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr ""
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr ""
@ -927,7 +931,7 @@ msgstr ""
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr ""
@ -2459,22 +2463,22 @@ msgstr ""
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr ""
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr ""
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr ""
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr ""
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr ""
@ -2656,7 +2660,7 @@ msgid ""
"use of Django's filtering system for querying data."
msgstr ""
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2667,7 +2671,7 @@ msgid ""
"enforces permissions accordingly while interacting with order data."
msgstr ""
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2676,25 +2680,25 @@ msgid ""
"feedback on OrderProduct instances"
msgstr ""
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr ""
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
msgstr ""
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr ""
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr ""
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2705,7 +2709,7 @@ msgid ""
"are granted."
msgstr ""
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2714,12 +2718,12 @@ msgid ""
"on the request context."
msgstr ""
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr ""
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -49,82 +49,86 @@ msgstr ""
msgid "when the object was last modified"
msgstr ""
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr ""
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr ""
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr ""
#: core/admin.py:87
msgid "metadata"
#: core/admin.py:76
msgid "additional info"
msgstr ""
#: core/admin.py:94
msgid "metadata"
msgstr ""
#: core/admin.py:101
msgid "timestamps"
msgstr ""
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr ""
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr ""
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr ""
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr ""
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr ""
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr ""
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr ""
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr ""
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr ""
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr ""
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr ""
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr ""
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr ""
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr ""
@ -678,7 +682,7 @@ msgstr ""
msgid "add or remove feedback on an orderproduct relation"
msgstr ""
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr ""
@ -851,7 +855,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr ""
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr ""
@ -927,7 +931,7 @@ msgstr ""
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr ""
@ -2459,22 +2463,22 @@ msgstr ""
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr ""
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr ""
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr ""
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr ""
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr ""
@ -2656,7 +2660,7 @@ msgid ""
"use of Django's filtering system for querying data."
msgstr ""
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2667,7 +2671,7 @@ msgid ""
"enforces permissions accordingly while interacting with order data."
msgstr ""
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2676,25 +2680,25 @@ msgid ""
"feedback on OrderProduct instances"
msgstr ""
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr ""
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
msgstr ""
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr ""
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr ""
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2705,7 +2709,7 @@ msgid ""
"are granted."
msgstr ""
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2714,12 +2718,12 @@ msgid ""
"on the request context."
msgstr ""
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr ""
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -50,82 +50,86 @@ msgstr "Dimodifikasi"
msgid "when the object was last modified"
msgstr "Kapan objek terakhir kali diedit"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Terjemahan"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Umum"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Hubungan"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "info tambahan"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadata"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Stempel waktu"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Aktifkan %(verbose_name_plural)s yang dipilih"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Item yang dipilih telah diaktifkan!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Menonaktifkan %(verbose_name_plural)s yang dipilih"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Item yang dipilih telah dinonaktifkan!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Nilai Atribut"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Nilai Atribut"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Gambar"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Gambar"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Stok"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Saham"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Pesan Produk"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Pesan Produk"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Anak-anak"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Konfigurasi"
@ -753,7 +757,7 @@ msgstr "menghapus relasi pesanan-produk"
msgid "add or remove feedback on an orderproduct relation"
msgstr "menambah atau menghapus umpan balik pada relasi pesanan-produk"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Tidak ada istilah pencarian yang disediakan."
@ -927,7 +931,7 @@ msgstr ""
"Harap berikan order_uuid atau order_hr_id - tidak boleh lebih dari satu!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Tipe yang salah berasal dari metode order.buy(): {type(instance)!s}"
@ -1004,7 +1008,7 @@ msgstr "String alamat asli yang diberikan oleh pengguna"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} tidak ada: {uuid}!"
@ -2715,22 +2719,22 @@ msgstr "Data dan batas waktu diperlukan"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "Nilai batas waktu tidak valid, harus antara 0 dan 216000 detik"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | hubungi kami dimulai"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Konfirmasi Pesanan"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Pesanan Dikirim"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | kode promo diberikan"
@ -2977,7 +2981,7 @@ msgstr ""
"yang dapat diakses. Kelas ini memperluas `EvibesViewSet` dasar dan "
"menggunakan sistem penyaringan Django untuk meminta data."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2996,7 +3000,7 @@ msgstr ""
"beberapa serializer berdasarkan tindakan spesifik yang dilakukan dan "
"memberlakukan izin yang sesuai saat berinteraksi dengan data pesanan."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -3010,11 +3014,11 @@ msgstr ""
"serializer berdasarkan tindakan yang diminta. Selain itu, ini menyediakan "
"tindakan terperinci untuk menangani umpan balik pada instance OrderProduct"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Mengelola operasi yang terkait dengan gambar Produk dalam aplikasi."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3022,15 +3026,15 @@ msgstr ""
"Mengelola pengambilan dan penanganan contoh PromoCode melalui berbagai "
"tindakan API."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Merupakan set tampilan untuk mengelola promosi."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Menangani operasi yang terkait dengan data Stok di dalam sistem."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3048,7 +3052,7 @@ msgstr ""
"diintegrasikan untuk memastikan bahwa pengguna hanya dapat mengelola daftar "
"keinginan mereka sendiri kecuali jika izin eksplisit diberikan."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3062,12 +3066,12 @@ msgstr ""
"khusus untuk metode HTTP yang berbeda, penggantian serializer, dan "
"penanganan izin berdasarkan konteks permintaan."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Kesalahan pengodean geografis: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -51,82 +51,86 @@ msgstr "Modificato"
msgid "when the object was last modified"
msgstr "Quando l'oggetto è stato modificato per l'ultima volta"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Traduzioni"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Generale"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relazioni"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "informazioni aggiuntive"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadati"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Timestamp"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Attivare il %(verbose_name_plural)s selezionato"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Gli articoli selezionati sono stati attivati!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Disattivare il %(verbose_name_plural)s selezionato"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Gli articoli selezionati sono stati disattivati!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Valore dell'attributo"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Valori degli attributi"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Immagine"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Immagini"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Stock"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Le scorte"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Ordina il prodotto"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Ordinare i prodotti"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "I bambini"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Configurazione"
@ -752,7 +756,7 @@ msgstr "eliminare una relazione ordine-prodotto"
msgid "add or remove feedback on an orderproduct relation"
msgstr "aggiungere o rimuovere un feedback su una relazione ordine-prodotto"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Non è stato fornito alcun termine di ricerca."
@ -927,7 +931,7 @@ msgstr ""
"Si prega di fornire order_uuid o order_hr_id, che si escludono a vicenda!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr ""
"Il metodo order.buy() ha fornito un tipo sbagliato: {type(instance)!s}"
@ -1006,7 +1010,7 @@ msgstr "Stringa di indirizzo originale fornita dall'utente"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} non esiste: {uuid}!"
@ -2725,22 +2729,22 @@ msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr ""
"Valore di timeout non valido, deve essere compreso tra 0 e 216000 secondi."
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | contattaci iniziato"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Conferma d'ordine"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Ordine consegnato"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promocode granted"
@ -2992,7 +2996,7 @@ msgstr ""
"accessibili. Estende l'insieme di base `EvibesViewSet` e fa uso del sistema "
"di filtraggio di Django per interrogare i dati."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -3011,7 +3015,7 @@ msgstr ""
"serializzatori in base all'azione specifica da eseguire e applica le "
"autorizzazioni di conseguenza durante l'interazione con i dati degli ordini."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -3026,13 +3030,13 @@ msgstr ""
"richiesta. Inoltre, fornisce un'azione dettagliata per gestire il feedback "
"sulle istanze di OrderProduct."
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr ""
"Gestisce le operazioni relative alle immagini dei prodotti "
"nell'applicazione."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3040,15 +3044,15 @@ msgstr ""
"Gestisce il recupero e la gestione delle istanze di PromoCode attraverso "
"varie azioni API."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Rappresenta un insieme di viste per la gestione delle promozioni."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Gestisce le operazioni relative ai dati delle scorte nel sistema."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3068,7 +3072,7 @@ msgstr ""
"solo la propria lista dei desideri, a meno che non vengano concessi permessi"
" espliciti."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3082,12 +3086,12 @@ msgstr ""
"specializzati per diversi metodi HTTP, override del serializzatore e "
"gestione dei permessi in base al contesto della richiesta."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Errore di geocodifica: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -47,82 +47,86 @@ msgstr "変形"
msgid "when the object was last modified"
msgstr "オブジェクトの最終編集日時"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "翻訳"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "一般"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "関係"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "追加情報"
#: core/admin.py:94
msgid "metadata"
msgstr "メタデータ"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "タイムスタンプ"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "選択した%(verbose_name_plural)sをアクティブにする"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "選択した項目がアクティブになりました!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "選択された%(verbose_name_plural)sを非アクティブにする"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "選択されたアイテムは無効化されました!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "属性値"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "属性値"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "画像"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "画像"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "在庫"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "株式"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "商品のご注文"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "商品のご注文"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "子供たち"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "コンフィグ"
@ -692,7 +696,7 @@ msgstr "注文と商品の関係を削除する"
msgid "add or remove feedback on an orderproduct relation"
msgstr "注文と商品の関係に関するフィードバックを追加または削除する。"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "検索語はありません。"
@ -865,7 +869,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "order_uuidまたはorder_hr_idを入力してください"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "order.buy()メソッドから間違った型が来た:{type(instance)!s}。"
@ -941,7 +945,7 @@ msgstr "ユーザーが提供したオリジナルのアドレス文字列"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name}は存在しません:{uuid}が存在しません!"
@ -2513,22 +2517,22 @@ msgstr "データとタイムアウトの両方が必要"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "無効なタイムアウト値です。"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME}|コンタクト開始| お問い合わせはこちらから"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME}|注文確認| ご注文の確認"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME}|ご注文は配送されますか?"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME}|プロモコード付与"
@ -2745,7 +2749,7 @@ msgstr ""
"オブジェクトのパーミッションベースの処理を実装することです。ベースとなる `EvibesViewSet` を拡張し、Django "
"のフィルタリングシステムを利用してデータを取得します。"
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2758,7 +2762,7 @@ msgstr ""
"注文と関連する操作を管理するための "
"ViewSet。このクラスは、注文オブジェクトを取得、変更、管理する機能を提供します。商品の追加や削除、登録ユーザや未登録ユーザの購入の実行、現在の認証ユーザの保留中の注文の取得など、注文操作を処理するためのさまざまなエンドポイントを含みます。ViewSetは、実行される特定のアクションに基づいて複数のシリアライザを使用し、注文データを操作している間、それに応じてパーミッションを強制します。"
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2770,25 +2774,25 @@ msgstr ""
"操作とカスタムアクションを可能にします。これは、要求されたアクションに基づくフィルタリング、パーミッションチェック、シリアライザーの切り替えを含みます。さらに、OrderProduct"
" インスタンスに関するフィードバックを処理するための詳細なアクションを提供します。"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "アプリケーション内の商品画像に関する操作を管理します。"
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
msgstr "様々なAPIアクションによるプロモコードインスタンスの取得と処理を管理します。"
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "プロモーションを管理するためのビューセットを表します。"
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "システム内のストックデータに関する操作を行う。"
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2800,7 +2804,7 @@ msgid ""
msgstr ""
"ウィッシュリスト操作を管理するためのViewSet。WishlistViewSetは、ユーザーのウィッシュリストと対話するためのエンドポイントを提供し、ウィッシュリスト内の商品の検索、変更、カスタマイズを可能にします。このViewSetは、ウィッシュリスト商品の追加、削除、一括アクションなどの機能を容易にします。明示的なパーミッションが付与されていない限り、ユーザーが自分のウィッシュリストのみを管理できるよう、パーミッションチェックが統合されています。"
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2812,12 +2816,12 @@ msgstr ""
"クラスは、住所エンティティに関連する CRUD 操作、フィルタリング、カスタムアクションを可能にします。異なる HTTP "
"メソッドに特化した振る舞いや、シリアライザのオーバーライド、 リクエストコンテキストに基づいたパーミッション処理などを含みます。"
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "ジオコーディングエラー:{e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -49,82 +49,86 @@ msgstr ""
msgid "when the object was last modified"
msgstr ""
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr ""
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr ""
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr ""
#: core/admin.py:87
msgid "metadata"
#: core/admin.py:76
msgid "additional info"
msgstr ""
#: core/admin.py:94
msgid "metadata"
msgstr ""
#: core/admin.py:101
msgid "timestamps"
msgstr ""
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr ""
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr ""
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr ""
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr ""
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr ""
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr ""
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr ""
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr ""
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr ""
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr ""
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr ""
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr ""
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr ""
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr ""
@ -678,7 +682,7 @@ msgstr ""
msgid "add or remove feedback on an orderproduct relation"
msgstr ""
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr ""
@ -851,7 +855,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr ""
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr ""
@ -927,7 +931,7 @@ msgstr ""
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr ""
@ -2459,22 +2463,22 @@ msgstr ""
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr ""
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr ""
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr ""
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr ""
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr ""
@ -2656,7 +2660,7 @@ msgid ""
"use of Django's filtering system for querying data."
msgstr ""
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2667,7 +2671,7 @@ msgid ""
"enforces permissions accordingly while interacting with order data."
msgstr ""
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2676,25 +2680,25 @@ msgid ""
"feedback on OrderProduct instances"
msgstr ""
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr ""
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
msgstr ""
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr ""
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr ""
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2705,7 +2709,7 @@ msgid ""
"are granted."
msgstr ""
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2714,12 +2718,12 @@ msgid ""
"on the request context."
msgstr ""
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr ""
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -47,82 +47,86 @@ msgstr "수정됨"
msgid "when the object was last modified"
msgstr "개체가 마지막으로 편집된 시기"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "번역"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "일반"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "관계"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "추가 정보"
#: core/admin.py:94
msgid "metadata"
msgstr "메타데이터"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "타임스탬프"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "선택한 %(verbose_name_plural)s 활성화"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "선택한 아이템이 활성화되었습니다!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "선택한 %(verbose_name_plural)s 비활성화하기"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "선택한 아이템이 비활성화되었습니다!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "속성 값"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "속성 값"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "이미지"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "이미지"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "재고"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "주식"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "제품 주문"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "제품 주문"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "어린이"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "구성"
@ -689,7 +693,7 @@ msgstr "주문-제품 관계 삭제"
msgid "add or remove feedback on an orderproduct relation"
msgstr "주문-제품 관계에 대한 피드백 추가 또는 제거"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "검색어가 입력되지 않았습니다."
@ -862,7 +866,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "주문_uuid 또는 주문_hr_id 중 하나를 입력하세요 - 상호 배타적입니다!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "order.buy() 메서드에서 잘못된 유형이 발생했습니다: {type(instance)!s}"
@ -938,7 +942,7 @@ msgstr "사용자가 제공한 원본 주소 문자열"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name}가 존재하지 않습니다: {uuid}!"
@ -2538,22 +2542,22 @@ msgstr "데이터와 시간 초과가 모두 필요합니다."
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "잘못된 시간 초과 값, 0~216000초 사이여야 합니다."
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | 문의 시작됨"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | 주문 확인"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | 주문 배송됨"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | 프로모코드 부여됨"
@ -2769,7 +2773,7 @@ msgstr ""
"구현하는 것입니다. 이 클래스는 기본 `EvibesViewSet`을 확장하고 데이터 쿼리를 위해 Django의 필터링 시스템을 "
"사용합니다."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2784,7 +2788,7 @@ msgstr ""
"엔드포인트가 포함되어 있습니다. 뷰셋은 수행되는 특정 작업에 따라 여러 직렬화기를 사용하며 주문 데이터와 상호 작용하는 동안 그에 따라 "
"권한을 적용합니다."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2796,25 +2800,25 @@ msgstr ""
"수행할 수 있습니다. 여기에는 요청된 작업을 기반으로 필터링, 권한 확인 및 직렬화기 전환이 포함됩니다. 또한 주문 제품 인스턴스에 대한"
" 피드백 처리를 위한 세부 작업도 제공합니다."
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "애플리케이션에서 제품 이미지와 관련된 작업을 관리합니다."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
msgstr "다양한 API 작업을 통해 프로모션 코드 인스턴스의 검색 및 처리를 관리합니다."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "프로모션을 관리하기 위한 보기 세트를 나타냅니다."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "시스템에서 주식 데이터와 관련된 작업을 처리합니다."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2828,7 +2832,7 @@ msgstr ""
"내의 제품을 검색, 수정 및 사용자 지정할 수 있도록 합니다. 이 뷰셋은 위시리스트 제품에 대한 추가, 제거 및 대량 작업과 같은 기능을"
" 용이하게 합니다. 명시적인 권한이 부여되지 않는 한 사용자가 자신의 위시리스트만 관리할 수 있도록 권한 검사가 통합되어 있습니다."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2840,12 +2844,12 @@ msgstr ""
"사용자 정의 작업을 가능하게 합니다. 여기에는 다양한 HTTP 메서드, 직렬화기 재정의, 요청 컨텍스트에 따른 권한 처리를 위한 특수 "
"동작이 포함되어 있습니다."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "지오코딩 오류입니다: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -49,82 +49,86 @@ msgstr "Gewijzigd"
msgid "when the object was last modified"
msgstr "Wanneer het object voor het laatst bewerkt is"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Vertalingen"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Algemeen"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relaties"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "extra informatie"
#: core/admin.py:94
msgid "metadata"
msgstr "Metagegevens"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Tijdstempels"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Activeer geselecteerde %(verbose_name_plural)s"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Geselecteerde items zijn geactiveerd!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Deactiveer geselecteerd %(verbose_name_plural)s"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Geselecteerde items zijn gedeactiveerd!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Attribuut Waarde"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Attribuutwaarden"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Afbeelding"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Afbeeldingen"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Voorraad"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Aandelen"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Product bestellen"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Producten bestellen"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Kinderen"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Config"
@ -753,7 +757,7 @@ msgstr "een order-productrelatie verwijderen"
msgid "add or remove feedback on an orderproduct relation"
msgstr "feedback toevoegen of verwijderen op een order-productrelatie"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Geen zoekterm opgegeven."
@ -927,7 +931,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "Geef order_uuid of order_hr_id - wederzijds exclusief!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Verkeerd type kwam uit order.buy() methode: {type(instance)!s}"
@ -1004,7 +1008,7 @@ msgstr "Originele adresstring geleverd door de gebruiker"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} bestaat niet: {uuid}!"
@ -2734,22 +2738,22 @@ msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr ""
"Ongeldige time-outwaarde, deze moet tussen 0 en 216000 seconden liggen"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | neem contact met ons op"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Orderbevestiging"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Bestelling afgeleverd"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promocode toegekend"
@ -3003,7 +3007,7 @@ msgstr ""
"implementeren. Het breidt de basis `EvibesViewSet` uit en maakt gebruik van "
"Django's filtersysteem voor het opvragen van gegevens."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -3023,7 +3027,7 @@ msgstr ""
"gebaseerd op de specifieke actie die wordt uitgevoerd en dwingt "
"dienovereenkomstig permissies af tijdens de interactie met ordergegevens."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -3038,12 +3042,12 @@ msgstr ""
" een gedetailleerde actie voor het afhandelen van feedback op OrderProduct "
"instanties"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr ""
"Beheert bewerkingen met betrekking tot productafbeeldingen in de applicatie."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3051,16 +3055,16 @@ msgstr ""
"Beheert het ophalen en afhandelen van PromoCode-instanties via verschillende"
" API-acties."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Vertegenwoordigt een view set voor het beheren van promoties."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr ""
"Verwerkt bewerkingen met betrekking tot voorraadgegevens in het systeem."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3079,7 +3083,7 @@ msgstr ""
"verlanglijstjes kunnen beheren, tenzij er expliciete toestemmingen zijn "
"verleend."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3093,12 +3097,12 @@ msgstr ""
"gespecialiseerde gedragingen voor verschillende HTTP methoden, serializer "
"omzeilingen en toestemmingsafhandeling gebaseerd op de verzoekcontext."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Fout bij geocodering: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -50,82 +50,86 @@ msgstr "Modifisert"
msgid "when the object was last modified"
msgstr "Når objektet sist ble redigert"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Oversettelser"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Generelt"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relasjoner"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "ytterligere informasjon"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadata"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Tidsstempler"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Aktiver valgt %(verbose_name_plural)s"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Utvalgte elementer har blitt aktivert!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Deaktiver valgt %(verbose_name_plural)s"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Utvalgte elementer har blitt deaktivert!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Attributtverdi"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Attributtverdier"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Bilde"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Bilder"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Lager"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Aksjer"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Bestill produkt"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Bestill produkter"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Barn"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Konfigurer"
@ -739,7 +743,7 @@ msgstr "slette en ordre-produkt-relasjon"
msgid "add or remove feedback on an orderproduct relation"
msgstr "legge til eller fjerne tilbakemeldinger på en ordre-produkt-relasjon"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Ingen søkeord oppgitt."
@ -914,7 +918,7 @@ msgstr ""
"Vennligst oppgi enten order_uuid eller order_hr_id - gjensidig utelukkende!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Feil type kom fra order.buy()-metoden: {type(instance)!s}"
@ -991,7 +995,7 @@ msgstr "Opprinnelig adressestreng oppgitt av brukeren"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} eksisterer ikke: {uuid}!"
@ -2700,22 +2704,22 @@ msgstr "Både data og tidsavbrudd er påkrevd"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "Ugyldig tidsavbruddsverdi, den må være mellom 0 og 216000 sekunder"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | kontakt oss initiert"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Ordrebekreftelse"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Bestilling levert"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promokode gitt"
@ -2963,7 +2967,7 @@ msgstr ""
"tilbakemeldingsobjekter. Den utvider basisklassen `EvibesViewSet` og bruker "
"Djangos filtreringssystem for å spørre etter data."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2982,7 +2986,7 @@ msgstr ""
"serialisatorer basert på den spesifikke handlingen som utføres, og håndhever"
" tillatelser i samsvar med dette under samhandling med ordredata."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2997,11 +3001,11 @@ msgstr ""
" tillegg inneholder det en detaljert handling for håndtering av "
"tilbakemeldinger på OrderProduct-instanser"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Administrerer operasjoner knyttet til produktbilder i applikasjonen."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3009,15 +3013,15 @@ msgstr ""
"Administrerer henting og håndtering av PromoCode-instanser gjennom ulike "
"API-handlinger."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Representerer et visningssett for håndtering av kampanjer."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Håndterer operasjoner knyttet til lagerdata i systemet."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3035,7 +3039,7 @@ msgstr ""
"integrert for å sikre at brukere bare kan administrere sine egne ønskelister"
" med mindre eksplisitte tillatelser er gitt."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3049,12 +3053,12 @@ msgstr ""
"inkluderer spesialisert atferd for ulike HTTP-metoder, overstyring av "
"serializer og håndtering av tillatelser basert på forespørselskonteksten."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Feil i geokoding: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -51,82 +51,86 @@ msgstr "Zmodyfikowany"
msgid "when the object was last modified"
msgstr "Kiedy obiekt był ostatnio edytowany"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Tłumaczenia"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Ogólne"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relacje"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "dodatkowe informacje"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadane"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Znaczniki czasu"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Aktywuj wybrane %(verbose_name_plural)s"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Wybrane elementy zostały aktywowane!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Dezaktywacja wybranego %(verbose_name_plural)s"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Wybrane elementy zostały dezaktywowane!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Wartość atrybutu"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Wartości atrybutów"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Obraz"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Obrazy"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Stan magazynowy"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Akcje"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Zamów produkt"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Zamawianie produktów"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Dzieci"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Konfiguracja"
@ -746,7 +750,7 @@ msgstr "usunąć relację zamówienie-produkt"
msgid "add or remove feedback on an orderproduct relation"
msgstr "dodawanie lub usuwanie opinii na temat relacji zamówienie-produkt"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Nie podano wyszukiwanego hasła."
@ -919,7 +923,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "Podaj albo order_uuid albo order_hr_id - wzajemnie się wykluczają!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Nieprawidłowy typ pochodzi z metody order.buy(): {type(instance)!s}"
@ -997,7 +1001,7 @@ msgstr "Oryginalny ciąg adresu podany przez użytkownika"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} nie istnieje: {uuid}!"
@ -2713,22 +2717,22 @@ msgstr ""
"Nieprawidłowa wartość limitu czasu, musi zawierać się w przedziale od 0 do "
"216000 sekund."
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | zainicjowany kontakt"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Potwierdzenie zamówienia"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Zamówienie dostarczone"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | przyznany kod promocyjny"
@ -2974,7 +2978,7 @@ msgstr ""
"bazowy `EvibesViewSet` i wykorzystuje system filtrowania Django do "
"odpytywania danych."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2993,7 +2997,7 @@ msgstr ""
"wykorzystuje wiele serializatorów w oparciu o konkretną wykonywaną akcję i "
"odpowiednio egzekwuje uprawnienia podczas interakcji z danymi zamówienia."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -3008,26 +3012,26 @@ msgstr ""
"szczegółową akcję do obsługi informacji zwrotnych na temat instancji "
"OrderProduct"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Zarządza operacjami związanymi z obrazami produktów w aplikacji."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
msgstr ""
"Zarządza pobieraniem i obsługą instancji PromoCode poprzez różne akcje API."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Reprezentuje zestaw widoków do zarządzania promocjami."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Obsługuje operacje związane z danymi Stock w systemie."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3045,7 +3049,7 @@ msgstr ""
"że użytkownicy mogą zarządzać tylko własnymi listami życzeń, chyba że "
"zostaną przyznane wyraźne uprawnienia."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3059,12 +3063,12 @@ msgstr ""
"wyspecjalizowane zachowania dla różnych metod HTTP, zastępowanie serializera"
" i obsługę uprawnień w oparciu o kontekst żądania."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Błąd geokodowania: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -51,82 +51,86 @@ msgstr "Modificado"
msgid "when the object was last modified"
msgstr "Quando o objeto foi editado pela última vez"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Traduções"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Geral"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relações"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "informações adicionais"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadados"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Carimbos de data/hora"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Ativar o %(verbose_name_plural)s selecionado"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Os itens selecionados foram ativados!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Desativar o %(verbose_name_plural)s selecionado"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Os itens selecionados foram desativados!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Valor do atributo"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Valores de atributos"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Imagem"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Imagens"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Estoque"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Ações"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Pedido de produto"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Solicitar produtos"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Crianças"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Configuração"
@ -736,7 +740,7 @@ msgstr "excluir uma relação pedido-produto"
msgid "add or remove feedback on an orderproduct relation"
msgstr "adicionar ou remover feedback em uma relação pedido-produto"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Nenhum termo de pesquisa foi fornecido."
@ -910,7 +914,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "Forneça order_uuid ou order_hr_id - mutuamente exclusivos!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "O tipo errado veio do método order.buy(): {type(instance)!s}"
@ -987,7 +991,7 @@ msgstr "Cadeia de endereços original fornecida pelo usuário"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} não existe: {uuid}!"
@ -2696,22 +2700,22 @@ msgstr "São necessários dados e tempo limite"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "Valor de tempo limite inválido, deve estar entre 0 e 216000 segundos"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | entre em contato conosco iniciado"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Confirmação do pedido"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Pedido entregue"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promocode granted"
@ -2962,7 +2966,7 @@ msgstr ""
"feedback acessíveis. Ela estende a base `EvibesViewSet` e faz uso do sistema"
" de filtragem do Django para consultar dados."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2981,7 +2985,7 @@ msgstr ""
"específica que está sendo executada e impõe as permissões de acordo com a "
"interação com os dados do pedido."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2996,11 +3000,11 @@ msgstr ""
"fornece uma ação detalhada para lidar com feedback sobre instâncias de "
"OrderProduct"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Gerencia operações relacionadas a imagens de produtos no aplicativo."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3008,15 +3012,15 @@ msgstr ""
"Gerencia a recuperação e o manuseio de instâncias de PromoCode por meio de "
"várias ações de API."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Representa um conjunto de visualizações para gerenciar promoções."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Trata de operações relacionadas a dados de estoque no sistema."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3035,7 +3039,7 @@ msgstr ""
"possam gerenciar suas próprias listas de desejos, a menos que sejam "
"concedidas permissões explícitas."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3050,12 +3054,12 @@ msgstr ""
"substituições de serializadores e tratamento de permissões com base no "
"contexto da solicitação."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Erro de geocodificação: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -51,82 +51,86 @@ msgstr "Modificat"
msgid "when the object was last modified"
msgstr "Când a fost editat obiectul ultima dată"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Traduceri"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Generalități"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relații"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "informații suplimentare"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadate"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Timestamps"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Activați %(verbose_name_plural)s selectat"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Articolele selectate au fost activate!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Dezactivați %(verbose_name_plural)s selectat"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Articolele selectate au fost dezactivate!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Atribut Valoare"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Valori ale atributului"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Imagine"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Imagini"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Stoc"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Stocuri"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Comanda Produs"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Comandați produse"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Copii"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Configurare"
@ -747,7 +751,7 @@ msgstr "ștergeți o relație comandă-produs"
msgid "add or remove feedback on an orderproduct relation"
msgstr "adăugarea sau eliminarea feedback-ului într-o relație comandă-produs"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Nu a fost furnizat niciun termen de căutare."
@ -923,7 +927,7 @@ msgstr ""
"Vă rugăm să furnizați fie order_uuid sau order_hr_id - se exclud reciproc!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Metoda order.buy() a generat un tip greșit: {type(instance)!s}"
@ -1001,7 +1005,7 @@ msgstr "Șirul de adrese original furnizat de utilizator"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} nu există: {uuid}!"
@ -2722,22 +2726,22 @@ msgstr "Sunt necesare atât datele, cât și timpul de așteptare"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "Valoare timeout invalidă, trebuie să fie între 0 și 216000 secunde"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | contactați-ne inițiat"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Confirmarea comenzii"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Livrarea comenzii"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promocode acordat"
@ -2989,7 +2993,7 @@ msgstr ""
"Feedback accesibile. Aceasta extinde clasa de bază `EvibesViewSet` și "
"utilizează sistemul de filtrare Django pentru interogarea datelor."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -3009,7 +3013,7 @@ msgstr ""
"de acțiunea specifică efectuată și aplică permisiunile corespunzătoare în "
"timpul interacțiunii cu datele comenzii."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -3024,12 +3028,12 @@ msgstr ""
"solicitată. În plus, oferă o acțiune detaliată pentru gestionarea feedback-"
"ului privind instanțele OrderProduct"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr ""
"Gestionează operațiunile legate de imaginile produselor din aplicație."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3037,16 +3041,16 @@ msgstr ""
"Gestionează recuperarea și gestionarea instanțelor PromoCode prin diverse "
"acțiuni API."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Reprezintă un set de vizualizări pentru gestionarea promoțiilor."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr ""
"Gestionează operațiunile legate de datele privind stocurile din sistem."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3065,7 +3069,7 @@ msgstr ""
"utilizatorii își pot gestiona doar propriile liste de dorințe, cu excepția "
"cazului în care sunt acordate permisiuni explicite."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3080,12 +3084,12 @@ msgstr ""
"serializatorului și gestionarea permisiunilor în funcție de contextul "
"cererii."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Eroare de geocodare: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -51,82 +51,86 @@ msgstr "Модифицированный"
msgid "when the object was last modified"
msgstr "Когда объект был отредактирован в последний раз"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Переводы"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Общие сведения"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Отношения"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "дополнительная информация"
#: core/admin.py:94
msgid "metadata"
msgstr "Метаданные"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Временные метки"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Активировать выбранный %(verbose_name_plural)s"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Выбранные сущности активированы!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Деактивировать выбранный %(verbose_name_plural)s"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Выбранные сущности были деактивированы!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Значение атрибута"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Значения атрибутов"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Изображение"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Изображения"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Наличие"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Наличия"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Заказанный товар"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Заказанные товары"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Дети"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Конфигурация"
@ -746,7 +750,7 @@ msgstr "удалить отношение \"заказ-продукт"
msgid "add or remove feedback on an orderproduct relation"
msgstr "добавлять или удалять отзывы о связи заказ-продукт"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Поисковый запрос не предоставлен."
@ -923,7 +927,7 @@ msgstr ""
"варианты!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Неправильный тип получен из метода order.buy(): {type(instance)!s}"
@ -1001,7 +1005,7 @@ msgstr "Оригинальная строка адреса, предоставл
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} не существует: {uuid}!"
@ -2711,22 +2715,22 @@ msgstr ""
"Неверное значение тайм-аута, оно должно находиться в диапазоне от 0 до "
"216000 секунд"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | свяжитесь с нами по инициативе"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Подтверждение заказа"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Заказ доставлен"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | Промокод предоставлен"
@ -2977,7 +2981,7 @@ msgstr ""
"доступа. Он расширяет базовый `EvibesViewSet` и использует систему "
"фильтрации Django для запроса данных."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2998,7 +3002,7 @@ msgstr ""
"соответствующим образом устанавливает разрешения при взаимодействии с "
"данными заказа."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -3013,12 +3017,12 @@ msgstr ""
" от запрашиваемого действия. Кроме того, он предоставляет подробное действие"
" для обработки отзывов об экземплярах OrderProduct"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr ""
"Управляет операциями, связанными с изображениями продуктов в приложении."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3026,16 +3030,16 @@ msgstr ""
"Управляет получением и обработкой экземпляров PromoCode с помощью различных "
"действий API."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr ""
"Представляет собой набор представлений для управления рекламными акциями."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Выполняет операции, связанные с данными о запасах в системе."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3053,7 +3057,7 @@ msgstr ""
"проверка прав доступа гарантирует, что пользователи смогут управлять только "
"своими списками желаний, если не предоставлены явные права."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3068,12 +3072,12 @@ msgstr ""
"методов HTTP, переопределение сериализатора и обработку разрешений в "
"зависимости от контекста запроса."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Ошибка геокодирования: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -49,82 +49,86 @@ msgstr "Modifierad"
msgid "when the object was last modified"
msgstr "När objektet senast redigerades"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Översättningar"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Allmänt"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Relationer"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "Ytterligare information"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadata"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Tidsstämplar"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Aktivera vald %(verbose_name_plural)s."
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Valda artiklar har aktiverats!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Avaktivera vald %(verbose_name_plural)s."
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Valda objekt har avaktiverats!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Attributvärde"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Attributets värden"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Bild"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Bilder"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Stock"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Stocks"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Beställ produkt"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Beställ produkter"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Barn och ungdomar"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Konfig"
@ -728,7 +732,7 @@ msgstr "ta bort en order-produktrelation"
msgid "add or remove feedback on an orderproduct relation"
msgstr "lägga till eller ta bort feedback om en order-produktrelation"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Ingen sökterm angavs."
@ -905,7 +909,7 @@ msgstr ""
"uteslutande!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "Fel typ kom från order.buy()-metoden: {type(instance)!s}"
@ -982,7 +986,7 @@ msgstr "Originaladresssträng som tillhandahålls av användaren"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} existerar inte: {uuid}!"
@ -2684,22 +2688,22 @@ msgstr "Både data och timeout krävs"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "Ogiltigt timeout-värde, det måste vara mellan 0 och 216000 sekunder"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | kontakta oss initierad"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Orderbekräftelse"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Beställning levererad"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | promocode beviljad"
@ -2944,7 +2948,7 @@ msgstr ""
"basen `EvibesViewSet` och använder Djangos filtreringssystem för att fråga "
"data."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2963,7 +2967,7 @@ msgstr ""
"åtgärd som utförs och verkställer behörigheter i enlighet med detta vid "
"interaktion med orderdata."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2978,11 +2982,11 @@ msgstr ""
"åtgärden. Dessutom innehåller den en detaljerad åtgärd för att hantera "
"feedback på OrderProduct-instanser"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Hanterar åtgärder relaterade till produktbilder i applikationen."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -2990,15 +2994,15 @@ msgstr ""
"Hanterar hämtning och hantering av PromoCode-instanser genom olika API-"
"åtgärder."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Representerar en vyuppsättning för hantering av kampanjer."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Hanterar åtgärder relaterade till lagerdata i systemet."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3016,7 +3020,7 @@ msgstr ""
"integrerade för att säkerställa att användare endast kan hantera sina egna "
"önskelistor om inte uttryckliga behörigheter beviljas."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3030,12 +3034,12 @@ msgstr ""
"innehåller specialiserade beteenden för olika HTTP-metoder, serializer-"
"överskrivningar och behörighetshantering baserat på förfrågningskontexten."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Fel i geokodningen: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -49,82 +49,86 @@ msgstr "แก้ไขแล้ว"
msgid "when the object was last modified"
msgstr "เมื่อครั้งล่าสุดที่มีการแก้ไขวัตถุ"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "การแปล"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "ทั่วไป"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "ความสัมพันธ์"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "ข้อมูลเพิ่มเติม"
#: core/admin.py:94
msgid "metadata"
msgstr "เมตาดาตา"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "เวลาที่บันทึก"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "เปิดใช้งานที่เลือกไว้ %(verbose_name_plural)s"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "รายการที่เลือกไว้ได้รับการเปิดใช้งานแล้ว!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "ยกเลิกการใช้งานที่เลือกไว้ %(verbose_name_plural)s"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "รายการที่เลือกถูกยกเลิกการใช้งานแล้ว!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "ค่าคุณสมบัติ"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "ค่าของแอตทริบิวต์"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "ภาพ"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "รูปภาพ"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "สต็อก"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "หุ้น"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "สั่งซื้อสินค้า"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "สั่งซื้อสินค้า"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "เด็ก"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "การกำหนดค่า"
@ -723,7 +727,7 @@ msgid "add or remove feedback on an orderproduct relation"
msgstr ""
"เพิ่มหรือลบความคิดเห็นเกี่ยวกับความสัมพันธ์ระหว่างคำสั่งซื้อและผลิตภัณฑ์"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "ไม่พบคำค้นหา"
@ -897,7 +901,7 @@ msgstr ""
"กรุณาให้ order_uuid หรือ order_hr_id - ต้องเลือกอย่างใดอย่างหนึ่งเท่านั้น!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "ประเภทไม่ถูกต้องมาจากเมธอด order.buy(): {type(instance)!s}"
@ -974,7 +978,7 @@ msgstr "สตริงที่อยู่ต้นฉบับที่ผู
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} ไม่พบ: {uuid}!"
@ -2647,22 +2651,22 @@ msgstr "จำเป็นต้องมีทั้งข้อมูลแล
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "ค่าหมดเวลาไม่ถูกต้อง ต้องอยู่ระหว่าง 0 ถึง 216000 วินาที"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | ติดต่อเรา เริ่มต้น"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | ยืนยันการสั่งซื้อ"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | จัดส่งเรียบร้อย"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | รหัสโปรโมชั่นได้รับแล้ว"
@ -2907,7 +2911,7 @@ msgstr ""
" และจัดการวัตถุข้อเสนอแนะที่เข้าถึงได้บนพื้นฐานของสิทธิ์ มันขยายคลาสพื้นฐาน "
"`EvibesViewSet` และใช้ระบบกรองของ Django สำหรับการสืบค้นข้อมูล"
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2925,7 +2929,7 @@ msgstr ""
"และการดึงคำสั่งซื้อที่รอดำเนินการของผู้ใช้ที่เข้าสู่ระบบปัจจุบัน ViewSet "
"ใช้ตัวแปลงข้อมูลหลายแบบตามการกระทำที่เฉพาะเจาะจงและบังคับใช้สิทธิ์การเข้าถึงอย่างเหมาะสมขณะโต้ตอบกับข้อมูลคำสั่งซื้อ"
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2940,26 +2944,26 @@ msgstr ""
"นอกจากนี้ยังมีรายละเอียดการดำเนินการสำหรับการจัดการข้อเสนอแนะเกี่ยวกับอินสแตนซ์ของ"
" OrderProduct"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "จัดการการดำเนินงานที่เกี่ยวข้องกับภาพผลิตภัณฑ์ในแอปพลิเคชัน"
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
msgstr ""
"จัดการการดึงและการจัดการของตัวอย่าง PromoCode ผ่านการกระทำของ API ต่าง ๆ"
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "แสดงมุมมองที่ตั้งค่าไว้สำหรับการจัดการโปรโมชั่น"
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "จัดการการดำเนินงานที่เกี่ยวข้องกับข้อมูลสต็อกในระบบ"
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2977,7 +2981,7 @@ msgstr ""
"มีการตรวจสอบสิทธิ์เพื่อรับรองว่าผู้ใช้สามารถจัดการรายการที่ต้องการของตนเองเท่านั้น"
" เว้นแต่จะได้รับสิทธิ์อนุญาตอย่างชัดเจน"
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2991,12 +2995,12 @@ msgstr ""
"รวมถึงพฤติกรรมเฉพาะสำหรับวิธีการ HTTP ที่แตกต่างกัน การแทนที่ตัวแปลงข้อมูล "
"และการจัดการสิทธิ์ตามบริบทของคำขอ"
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "ข้อผิดพลาดในการแปลงพิกัดภูมิศาสตร์: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -51,82 +51,86 @@ msgstr "Değiştirilmiş"
msgid "when the object was last modified"
msgstr "Nesne en son ne zaman düzenlendi"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Çeviriler"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Genel"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "İlişkiler"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "EK BİLGİ"
#: core/admin.py:94
msgid "metadata"
msgstr "Metadata"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Zaman Damgaları"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Seçili %(verbose_name_plural)s'ı etkinleştirin"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Seçilen öğeler etkinleştirildi!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Seçili %(verbose_name_plural)s'ı devre dışı bırak"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Seçilen öğeler devre dışı bırakıldı!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Öznitelik Değeri"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Öznitelik Değerleri"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Resim"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Görüntüler"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Stok"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Stoklar"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Ürün Siparişi"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Sipariş Ürünleri"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Çocuklar"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Konfigürasyon"
@ -743,7 +747,7 @@ msgstr "sipariş-ürün ilişkisini silme"
msgid "add or remove feedback on an orderproduct relation"
msgstr "sipariş-ürün ilişkisine geri bildirim ekleme veya kaldırma"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Arama terimi belirtilmemiştir."
@ -919,7 +923,7 @@ msgstr ""
" dışlayan bilgiler!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "order.buy() metodundan yanlış tip geldi: {type(instance)!s}"
@ -997,7 +1001,7 @@ msgstr "Kullanıcı tarafından sağlanan orijinal adres dizesi"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} mevcut değil: {uuid}!"
@ -2695,22 +2699,22 @@ msgstr "Hem veri hem de zaman aşımı gereklidir"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "Geçersiz zaman aşımı değeri, 0 ile 216000 saniye arasında olmalıdır"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | bi̇zi̇mle i̇leti̇şi̇me geçi̇n"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Sipariş Onayı"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Sipariş Teslim Edildi"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | verilen promosyon kodu"
@ -2960,7 +2964,7 @@ msgstr ""
"genişletir ve verileri sorgulamak için Django'nun filtreleme sistemini "
"kullanır."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2979,7 +2983,7 @@ msgstr ""
"birden fazla serileştirici kullanır ve sipariş verileriyle etkileşime "
"girerken izinleri buna göre zorlar."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2993,11 +2997,11 @@ msgstr ""
" serileştirici değiştirme içerir. Ayrıca, OrderProduct örnekleriyle ilgili "
"geri bildirimleri işlemek için ayrıntılı bir eylem sağlar"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Uygulamadaki Ürün görselleri ile ilgili işlemleri yönetir."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3005,15 +3009,15 @@ msgstr ""
"Çeşitli API eylemleri aracılığıyla PromoCode örneklerinin alınmasını ve "
"işlenmesini yönetir."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Promosyonları yönetmek için bir görünüm kümesini temsil eder."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Sistemdeki Stok verileri ile ilgili işlemleri yürütür."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3031,7 +3035,7 @@ msgstr ""
"verilmediği sürece kullanıcıların yalnızca kendi istek listelerini "
"yönetebilmelerini sağlamak için entegre edilmiştir."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3045,12 +3049,12 @@ msgstr ""
"serileştirici geçersiz kılmaları ve istek bağlamına dayalı izin işleme için "
"özel davranışlar içerir."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Coğrafi kodlama hatası: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -51,82 +51,86 @@ msgstr "Đã sửa đổi"
msgid "when the object was last modified"
msgstr "Khi đối tượng được chỉnh sửa lần cuối"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "Dịch thuật"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "Tổng quát"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "Quan hệ"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "Thông tin bổ sung"
#: core/admin.py:94
msgid "metadata"
msgstr "Siêu dữ liệu"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "Dấu thời gian"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "Kích hoạt %(verbose_name_plural)s đã chọn"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "Các mục đã được chọn đã được kích hoạt!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "Vô hiệu hóa các mục đã chọn %(verbose_name_plural)s"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "Các mục đã chọn đã bị vô hiệu hóa!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "Giá trị thuộc tính"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "Giá trị thuộc tính"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "Hình ảnh"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "Hình ảnh"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "Cổ phiếu"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "Cổ phiếu"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "Đặt hàng sản phẩm"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "Đặt hàng sản phẩm"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "Trẻ em"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "Cấu hình"
@ -749,7 +753,7 @@ msgstr "Xóa mối quan hệ giữa đơn hàng và sản phẩm"
msgid "add or remove feedback on an orderproduct relation"
msgstr "Thêm hoặc xóa phản hồi về mối quan hệ giữa đơn hàng và sản phẩm"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "Không có từ khóa tìm kiếm được cung cấp."
@ -925,7 +929,7 @@ msgstr ""
"trường này là tương hỗ!"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr ""
"Loại sai đã được trả về từ phương thức order.buy(): {type(instance)!s}"
@ -1005,7 +1009,7 @@ msgstr "Dòng địa chỉ gốc do người dùng cung cấp"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} không tồn tại: {uuid}!"
@ -2708,22 +2712,22 @@ msgstr ""
"Giá trị thời gian chờ không hợp lệ, nó phải nằm trong khoảng từ 0 đến "
"216.000 giây."
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME} | Liên hệ với chúng tôi đã được khởi tạo"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME} | Xác nhận đơn hàng"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | Đơn hàng đã được giao"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | mã khuyến mãi được cấp"
@ -2975,7 +2979,7 @@ msgstr ""
"với các đối tượng Feedback có thể truy cập. Nó kế thừa từ lớp cơ sở "
"`EvibesViewSet` và sử dụng hệ thống lọc của Django để truy vấn dữ liệu."
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2994,7 +2998,7 @@ msgstr ""
"serializer khác nhau tùy thuộc vào hành động cụ thể đang được thực hiện và "
"áp dụng quyền truy cập tương ứng khi tương tác với dữ liệu đơn hàng."
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -3009,11 +3013,11 @@ msgstr ""
"hành động được yêu cầu. Ngoài ra, nó cung cấp một hành động chi tiết để xử "
"lý phản hồi cho các thực thể OrderProduct."
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "Quản lý các hoạt động liên quan đến hình ảnh sản phẩm trong ứng dụng."
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
@ -3021,15 +3025,15 @@ msgstr ""
"Quản lý việc truy xuất và xử lý các thực thể PromoCode thông qua các hành "
"động API khác nhau."
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "Đại diện cho một bộ xem để quản lý các chương trình khuyến mãi."
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "Quản lý các hoạt động liên quan đến dữ liệu kho trong hệ thống."
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -3048,7 +3052,7 @@ msgstr ""
" bảo rằng người dùng chỉ có thể quản lý danh sách mong muốn của chính mình "
"trừ khi được cấp quyền rõ ràng."
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -3062,12 +3066,12 @@ msgstr ""
"chuyên biệt cho các phương thức HTTP khác nhau, các tùy chỉnh serializer và "
"xử lý quyền truy cập dựa trên bối cảnh yêu cầu."
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "Lỗi địa chỉ địa lý: {e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -47,82 +47,86 @@ msgstr "改装"
msgid "when the object was last modified"
msgstr "对象最后一次编辑的时间"
#: core/admin.py:63
#: core/admin.py:68
msgid "translations"
msgstr "翻译"
#: core/admin.py:67
#: core/admin.py:72
msgid "general"
msgstr "一般情况"
#: core/admin.py:69
#: core/admin.py:74
msgid "relations"
msgstr "关系"
#: core/admin.py:87
#: core/admin.py:76
msgid "additional info"
msgstr "其他信息"
#: core/admin.py:94
msgid "metadata"
msgstr "元数据"
#: core/admin.py:94
#: core/admin.py:101
msgid "timestamps"
msgstr "时间戳"
#: core/admin.py:109
#: core/admin.py:116
#, python-format
msgid "activate selected %(verbose_name_plural)s"
msgstr "激活选定的 %(verbose_name_plural)s"
#: core/admin.py:114
#: core/admin.py:121
msgid "selected items have been activated."
msgstr "所选项目已激活!"
#: core/admin.py:120
#: core/admin.py:127
#, python-format
msgid "deactivate selected %(verbose_name_plural)s"
msgstr "停用选定的 %(verbose_name_plural)s"
#: core/admin.py:125
#: core/admin.py:132
msgid "selected items have been deactivated."
msgstr "选定项目已停用!"
#: core/admin.py:137 core/graphene/object_types.py:609
#: core/admin.py:144 core/graphene/object_types.py:609
#: core/graphene/object_types.py:616 core/models.py:709 core/models.py:717
msgid "attribute value"
msgstr "属性值"
#: core/admin.py:138 core/graphene/object_types.py:75 core/models.py:718
#: core/admin.py:145 core/graphene/object_types.py:75 core/models.py:718
msgid "attribute values"
msgstr "属性值"
#: core/admin.py:146
#: core/admin.py:153
msgid "image"
msgstr "图片"
#: core/admin.py:147 core/graphene/object_types.py:501
#: core/admin.py:154 core/graphene/object_types.py:501
msgid "images"
msgstr "图片"
#: core/admin.py:155 core/models.py:467
#: core/admin.py:162 core/models.py:467
msgid "stock"
msgstr "库存"
#: core/admin.py:156 core/graphene/object_types.py:663
#: core/admin.py:163 core/graphene/object_types.py:663
msgid "stocks"
msgstr "股票"
#: core/admin.py:166 core/models.py:1675
#: core/admin.py:173 core/models.py:1675
msgid "order product"
msgstr "订购产品"
#: core/admin.py:167 core/graphene/object_types.py:416 core/models.py:1676
#: core/admin.py:174 core/graphene/object_types.py:416 core/models.py:1676
msgid "order products"
msgstr "订购产品"
#: core/admin.py:180 core/admin.py:181
#: core/admin.py:187 core/admin.py:188
msgid "children"
msgstr "儿童"
#: core/admin.py:566
#: core/admin.py:940
msgid "Config"
msgstr "配置"
@ -687,7 +691,7 @@ msgstr "删除订单-产品关系"
msgid "add or remove feedback on an orderproduct relation"
msgstr "添加或删除订单与产品关系中的反馈信息"
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:498
#: core/elasticsearch/__init__.py:118 core/elasticsearch/__init__.py:499
msgid "no search term provided."
msgstr "未提供搜索条件。"
@ -860,7 +864,7 @@ msgid "please provide either order_uuid or order_hr_id - mutually exclusive"
msgstr "请提供 order_uuid 或 order_hr_id互斥"
#: core/graphene/mutations.py:229 core/graphene/mutations.py:486
#: core/graphene/mutations.py:527 core/viewsets.py:679
#: core/graphene/mutations.py:527 core/viewsets.py:680
msgid "wrong type came from order.buy() method: {type(instance)!s}"
msgstr "order.buy() 方法中的类型有误:{type(instance)!s}"
@ -936,7 +940,7 @@ msgstr "用户提供的原始地址字符串"
#: core/graphene/mutations.py:656 core/models.py:857 core/models.py:870
#: core/models.py:1289 core/models.py:1318 core/models.py:1343
#: core/viewsets.py:682
#: core/viewsets.py:683
#, python-brace-format
msgid "{name} does not exist: {uuid}"
msgstr "{name} 不存在:{uuid}"
@ -2502,22 +2506,22 @@ msgstr "需要数据和超时"
msgid "invalid timeout value, it must be between 0 and 216000 seconds"
msgstr "超时值无效,必须介于 0 和 216000 秒之间"
#: core/utils/emailing.py:25
#: core/utils/emailing.py:27
#, python-brace-format
msgid "{config.PROJECT_NAME} | contact us initiated"
msgstr "{config.PROJECT_NAME}| 联系我们"
#: core/utils/emailing.py:74
#: core/utils/emailing.py:73
#, python-brace-format
msgid "{config.PROJECT_NAME} | order confirmation"
msgstr "{config.PROJECT_NAME}| 订单确认"
#: core/utils/emailing.py:109
#: core/utils/emailing.py:105
#, python-brace-format
msgid "{config.PROJECT_NAME} | order delivered"
msgstr "{config.PROJECT_NAME} | 订单已送达"
#: core/utils/emailing.py:197
#: core/utils/emailing.py:188
#, python-brace-format
msgid "{config.PROJECT_NAME} | promocode granted"
msgstr "{config.PROJECT_NAME} | 授予的促销代码"
@ -2721,7 +2725,7 @@ msgstr ""
"处理反馈对象的视图集的表示。该类管理与反馈对象相关的操作,包括列出、筛选和检索详细信息。该视图集的目的是为不同的操作提供不同的序列化器,并对可访问的反馈对象实施基于权限的处理。它扩展了基本的"
" `EvibesViewSet` 并使用 Django 的过滤系统来查询数据。"
#: core/viewsets.py:593
#: core/viewsets.py:594
msgid ""
"ViewSet for managing orders and related operations. This class provides "
"functionality to retrieve, modify, and manage order objects. It includes "
@ -2735,7 +2739,7 @@ msgstr ""
"ViewSet。该类提供了检索、修改和管理订单对象的功能。它包括用于处理订单操作的各种端点如添加或删除产品、为注册用户和未注册用户执行购买操作以及检索当前已验证用户的待处理订单。ViewSet"
" 根据正在执行的特定操作使用多个序列化器,并在与订单数据交互时执行相应的权限。"
#: core/viewsets.py:782
#: core/viewsets.py:784
msgid ""
"Provides a viewset for managing OrderProduct entities. This viewset enables "
"CRUD operations and custom actions specific to the OrderProduct model. It "
@ -2747,25 +2751,25 @@ msgstr ""
"模型的自定义操作。它包括过滤、权限检查和根据请求的操作切换序列化器。此外,它还提供了一个详细的操作,用于处理有关 OrderProduct "
"实例的反馈信息"
#: core/viewsets.py:833
#: core/viewsets.py:835
msgid "Manages operations related to Product images in the application. "
msgstr "管理应用程序中与产品图像相关的操作。"
#: core/viewsets.py:845
#: core/viewsets.py:847
msgid ""
"Manages the retrieval and handling of PromoCode instances through various "
"API actions."
msgstr "通过各种 API 操作管理 PromoCode 实例的检索和处理。"
#: core/viewsets.py:866
#: core/viewsets.py:868
msgid "Represents a view set for managing promotions. "
msgstr "代表用于管理促销活动的视图集。"
#: core/viewsets.py:878
#: core/viewsets.py:880
msgid "Handles operations related to Stock data in the system."
msgstr "处理系统中与库存数据有关的操作。"
#: core/viewsets.py:892
#: core/viewsets.py:894
msgid ""
"ViewSet for managing Wishlist operations. The WishlistViewSet provides "
"endpoints for interacting with a user's wish list, allowing for the "
@ -2778,7 +2782,7 @@ msgstr ""
"用于管理愿望清单操作的 ViewSet。WishlistViewSet 提供了与用户愿望清单交互的端点,允许检索、修改和定制愿望清单中的产品。该 "
"ViewSet 支持添加、删除和批量操作愿望清单产品等功能。此外,还集成了权限检查功能,以确保用户只能管理自己的愿望清单,除非获得明确的权限。"
#: core/viewsets.py:1007
#: core/viewsets.py:1009
msgid ""
"This class provides viewset functionality for managing `Address` objects. "
"The AddressViewSet class enables CRUD operations, filtering, and custom "
@ -2789,12 +2793,12 @@ msgstr ""
"该类为管理 \"地址 \"对象提供了视图集功能。AddressViewSet 类支持与地址实体相关的 CRUD 操作、过滤和自定义操作。它包括针对不同 "
"HTTP 方法的专门行为、序列化器重载以及基于请求上下文的权限处理。"
#: core/viewsets.py:1074
#: core/viewsets.py:1076
#, python-brace-format
msgid "Geocoding error: {e}"
msgstr "地理编码错误:{e}"
#: core/viewsets.py:1081
#: core/viewsets.py:1083
msgid ""
"Handles operations related to Product Tags within the application. This "
"class provides functionality for retrieving, filtering, and serializing "

View file

@ -1,6 +1,7 @@
import os
import threading
import time
from typing import Any
import redis
from django.core.management.base import BaseCommand
@ -11,10 +12,10 @@ from redis.exceptions import ConnectionError # noqa: A004
class Command(BaseCommand):
def handle(self, *args, **options):
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
self.stdout.write("Waiting for services...")
def wait_for_db():
def wait_for_db() -> None:
db_up = False
while not db_up:
try:
@ -31,7 +32,7 @@ class Command(BaseCommand):
time.sleep(1)
self.stdout.write(self.style.SUCCESS("Database available!"))
def wait_for_redis():
def wait_for_redis() -> None:
redis_up = False
while not redis_up:
try:

View file

@ -1,7 +1,9 @@
import contextlib
import os
import re
from argparse import ArgumentParser
from tempfile import NamedTemporaryFile
from typing import Any
import polib
from django.apps import apps
@ -64,7 +66,7 @@ def load_po_sanitized(path: str) -> polib.POFile:
class Command(BaseCommand):
help = "Scan target-language .po files and report any placeholder mismatches, grouped by app."
def add_arguments(self, parser):
def add_arguments(self, parser: ArgumentParser) -> None:
parser.add_argument(
"-l",
"--language",
@ -92,14 +94,14 @@ class Command(BaseCommand):
help="Root path prefix to adjust file links",
)
def handle(self, *args, **options) -> None:
langs: list[str] = options["target_languages"]
def handle(self, *args: list[Any], **options: dict[str, str | list[str]]) -> None:
langs: list[str] = options.get("target_languages", []) # type: ignore [assignment]
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/"
root_path: str = options.get("root_path") or "/app/" # type: ignore [assignment]
configs = list(apps.get_app_configs())
# noinspection PyTypeChecker

View file

@ -1,4 +1,5 @@
from collections import defaultdict
from typing import Any
from django.core.management.base import BaseCommand
@ -6,17 +7,16 @@ from core.models import Category, Product, Stock
class Command(BaseCommand):
def handle(self, *args, **options):
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
self.stdout.write(self.style.SUCCESS("Starting clearing unwanted data..."))
# 1. Clean up duplicate Stock entries per product and vendor:
# Group stocks by (product, vendor)
stocks_by_group = defaultdict(list)
for stock in Stock.objects.all().order_by("modified"):
key = (stock.product_id, stock.vendor)
stocks_by_group[key].append(stock)
stocks_by_group[stock.product_pk].append(stock)
stock_deletions = []
stock_deletions: list[str] = []
for group in stocks_by_group.values():
if len(group) <= 1:
continue
@ -32,20 +32,20 @@ class Command(BaseCommand):
# Mark all stocks (except the designated one) for deletion.
for s in group:
if s.id != record_to_keep.id:
stock_deletions.append(s.id)
if s.uuid != record_to_keep.uuid:
stock_deletions.append(str(s.uuid))
if stock_deletions:
Stock.objects.filter(id__in=stock_deletions).delete()
Stock.objects.filter(uuid__in=stock_deletions).delete()
self.stdout.write(self.style.SUCCESS(f"Deleted {len(stock_deletions)} duplicate stock entries."))
# 2. Clean up duplicate Category entries based on name (case-insensitive)
category_groups = defaultdict(list)
for cat in Category.objects.all().order_by("modified"):
key = cat.name.lower()
key: str = cat.name.lower()
category_groups[key].append(cat)
categories_to_delete = []
categories_to_delete: list[str] = []
total_product_updates = 0
for cat_list in category_groups.values():
if len(cat_list) <= 1:
@ -59,13 +59,13 @@ class Command(BaseCommand):
keep_category = max(cat_list, key=lambda c: c.modified)
for duplicate in cat_list:
if duplicate.id == keep_category.id:
if duplicate.uuid == keep_category.uuid:
continue
total_product_updates += Product.objects.filter(category=duplicate).update(category=keep_category)
categories_to_delete.append(duplicate.id)
categories_to_delete.append(str(duplicate.uuid))
if categories_to_delete:
Category.objects.filter(id__in=categories_to_delete).delete()
Category.objects.filter(uuid__in=categories_to_delete).delete()
self.stdout.write(
self.style.SUCCESS(
f"Replaced category for {total_product_updates} product(s) "
@ -74,7 +74,7 @@ class Command(BaseCommand):
)
# 3. For Products without stocks: set is_active = False.
inactive_products = Product.objects.filter(stock__isnull=True)
inactive_products = Product.objects.filter(stocks__isnull=True)
count_inactive = inactive_products.count()
if count_inactive:
inactive_products.update(is_active=False)

View file

@ -1,13 +1,15 @@
import os
import re
from argparse import ArgumentParser
from tempfile import NamedTemporaryFile
from typing import Any
import polib
import requests
from django.apps import apps
from django.core.management.base import BaseCommand, CommandError
from core.management.commands import RootDirectory, DEEPL_TARGET_LANGUAGES_MAPPING, TRANSLATABLE_APPS
from core.management.commands import DEEPL_TARGET_LANGUAGES_MAPPING, TRANSLATABLE_APPS, RootDirectory
# Patterns to identify placeholders
PLACEHOLDER_REGEXES = [
@ -23,7 +25,7 @@ def placeholderize(text: str) -> tuple[str, list[str]]:
"""
placeholders: list[str] = []
def _repl(match: re.Match) -> str:
def _repl(match: re.Match) -> str: # type: ignore [type-arg]
idx = len(placeholders)
placeholders.append(match.group(0))
return f"__PH_{idx}__"
@ -77,7 +79,7 @@ def load_po_sanitized(path: str) -> polib.POFile | None:
class Command(BaseCommand):
help = "Merge msgid/msgstr from en_GB PO into target-language POs via DeepL, preserving placeholders."
def add_arguments(self, parser):
def add_arguments(self, parser: ArgumentParser) -> None:
parser.add_argument(
"-l",
"--language",
@ -97,10 +99,10 @@ class Command(BaseCommand):
help="App label for translation, e.g. core, payments. Use ALL to translate all apps.",
)
def handle(self, *args, **options) -> None:
target_langs = options["target_languages"]
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
target_langs: list[str] = options["target_languages"] # type: ignore [assignment]
if "ALL" in target_langs:
target_langs = DEEPL_TARGET_LANGUAGES_MAPPING.keys()
target_langs = DEEPL_TARGET_LANGUAGES_MAPPING.keys() # type: ignore [assignment]
target_apps = set(options["target_apps"])
if "ALL" in target_apps:
target_apps = {
@ -152,9 +154,9 @@ class Command(BaseCommand):
default = e.msgid
if readline:
def hook():
readline.insert_text(default) # noqa: B023
readline.redisplay()
def hook() -> None:
readline.insert_text(default) # type: ignore [attr-defined] # noqa: B023
readline.redisplay() # type: ignore [attr-defined]
readline.set_pre_input_hook(hook) # type: ignore [attr-defined]

View file

@ -1,3 +1,6 @@
from argparse import ArgumentParser
from typing import Any
from django.core.management.base import BaseCommand
from core.models import AttributeValue, Product, ProductImage
@ -6,7 +9,7 @@ from core.models import AttributeValue, Product, ProductImage
class Command(BaseCommand):
help = "Delete Product rows with no OrderProduct, in batches"
def add_arguments(self, parser):
def add_arguments(self, parser: ArgumentParser):
parser.add_argument(
"-s",
"--size",
@ -15,8 +18,8 @@ class Command(BaseCommand):
help="Chunk size to delete",
)
def handle(self, *args, **options):
size = options["size"]
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
size: int = options["size"] # type: ignore [assignment]
while True:
batch_ids = list(Product.objects.filter(orderproduct__isnull=True).values_list("pk", flat=True)[:size])
if not batch_ids:

View file

@ -1,3 +1,6 @@
from argparse import ArgumentParser
from typing import Any
from django.core.management.base import BaseCommand
from core.models import AttributeValue, Product, ProductImage
@ -6,7 +9,7 @@ from core.models import AttributeValue, Product, ProductImage
class Command(BaseCommand):
help = "Delete Product rows with special description, in batches"
def add_arguments(self, parser):
def add_arguments(self, parser: ArgumentParser) -> None:
parser.add_argument(
"-s",
"--size",
@ -15,8 +18,8 @@ class Command(BaseCommand):
help="Chunk size to delete",
)
def handle(self, *args, **options):
size = options["size"]
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
size: int = options["size"] # type: ignore [assignment]
while True:
batch_ids = list(
Product.objects.filter(description__iexact="EVIBES_DELETED_PRODUCT").values_list("pk", flat=True)[:size]

View file

@ -1,12 +1,14 @@
from typing import Any
from django.core.management.base import BaseCommand
from core.tasks import update_products_task
class Command(BaseCommand):
def handle(self, *args, **options):
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
self.stdout.write(self.style.SUCCESS("Starting fetching products task in worker container..."))
update_products_task.delay()
update_products_task.delay() # type: ignore [attr-defined]
self.stdout.write(self.style.SUCCESS("Started fetching products task in worker container without errors!"))

View file

@ -1,4 +1,5 @@
import logging
from typing import Any
from django.core.management.base import BaseCommand
@ -9,7 +10,7 @@ logger = logging.getLogger("django")
class Command(BaseCommand):
def handle(self, *args, **options):
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
self.stdout.write(self.style.SUCCESS("Starting fixing stocks' prices..."))
for product in Product.objects.filter(stocks__isnull=False):

View file

@ -1,5 +1,8 @@
from typing import Any
from django.core.management.base import BaseCommand
from django.db import transaction
from django.db.models import QuerySet
from django.utils.crypto import get_random_string
from core.models import Brand, Category, Product
@ -9,7 +12,7 @@ from core.models import Brand, Category, Product
class Command(BaseCommand):
help = "Rebuild slug field for all slugified instances"
def reset_em(self, queryset):
def reset_em(self, queryset: QuerySet[Any]) -> None:
total = queryset.count()
self.stdout.write(f"Starting slug rebuilding for {total} {queryset.model._meta.verbose_name_plural}")
for idx, instance in enumerate(queryset.iterator(), start=1):
@ -35,7 +38,7 @@ class Command(BaseCommand):
)
)
def handle(self, *args, **options):
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
for queryset in [
Brand.objects.all(),
Category.objects.all(),

View file

@ -1,10 +1,12 @@
from typing import Any
from django.core.management.base import BaseCommand
from core.utils.caching import set_default_cache
class Command(BaseCommand):
def handle(self, *args, **options):
def handle(self, *args: list[Any], **options: dict[Any, Any]) -> None:
self.stdout.write(self.style.SUCCESS("Started setting default cache values..."))
set_default_cache()

View file

@ -66,7 +66,7 @@ from payments.models import Transaction
logger = logging.getLogger("django")
class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc, django-manager-missing]
class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents a group of attributes, which can be hierarchical."
" This class is used to manage and organize attribute groups."
@ -94,7 +94,7 @@ class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel):
unique=True,
)
def __str__(self):
def __str__(self) -> str:
return self.name
class Meta:
@ -102,7 +102,7 @@ class AttributeGroup(ExportModelOperationsMixin("attribute_group"), NiceModel):
verbose_name_plural = _("attribute groups")
class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [misc, django-manager-missing]
class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"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."
@ -147,13 +147,13 @@ class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [
def __str__(self) -> str:
return self.name
def save(
def save( # type: ignore [override]
self,
*,
force_insert=False,
force_update=False,
using=None,
update_fields=None,
force_insert: bool = False,
force_update: bool = False,
using: str | None = None,
update_fields: list[str] | tuple[str, ...] | None = None,
update_modified: bool = True,
) -> None:
users = self.users.filter(is_active=True)
@ -180,7 +180,7 @@ class Vendor(ExportModelOperationsMixin("vendor"), NiceModel): # type: ignore [
]
class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type: ignore [misc, django-manager-missing]
class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents a product tag used for classifying or identifying products."
" The ProductTag class is designed to uniquely identify and classify products through a combination"
@ -212,7 +212,7 @@ class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel): # type:
verbose_name_plural = _("product tags")
class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel): # type: ignore [misc, django-manager-missing]
class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents a category tag used for products."
" This class models a category tag that can be used to associate and classify products."
@ -335,7 +335,7 @@ class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel): #
ordering = ["tree_id", "lft"]
class Brand(ExportModelOperationsMixin("brand"), NiceModel): # type: ignore [misc, django-manager-missing]
class Brand(ExportModelOperationsMixin("brand"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents a Brand object in the system. "
"This class handles information and attributes related to a brand, including its name, logos, "
@ -405,7 +405,7 @@ class Brand(ExportModelOperationsMixin("brand"), NiceModel): # type: ignore [mi
verbose_name_plural = _("brands")
class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [misc, django-manager-missing]
class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents the stock of a product managed in the system."
" This class provides details about the relationship between vendors, products, and their stock information, "
@ -468,7 +468,7 @@ class Stock(ExportModelOperationsMixin("stock"), NiceModel): # type: ignore [mi
verbose_name_plural = _("stock entries")
class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore [misc, django-manager-missing]
class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"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."
@ -561,21 +561,21 @@ class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore
return self.name
@property
def rating(self):
def rating(self) -> float:
cache_key = f"product_rating_{self.pk}"
rating = cache.get(cache_key)
if rating is None:
feedbacks = Feedback.objects.filter(order_product__product_id=self.pk)
rating = feedbacks.aggregate(Avg("rating"))["rating__avg"] or 0
cache.set(cache_key, rating, 86400)
return round(rating, 2)
return float(round(rating, 2))
@rating.setter
def rating(self, value):
def rating(self, value: float):
self.__dict__["rating"] = value
@property
def feedbacks_count(self):
def feedbacks_count(self) -> int:
cache_key = f"product_feedbacks_count_{self.pk}"
feedbacks_count = cache.get(cache_key)
if feedbacks_count is None:
@ -616,7 +616,7 @@ class Product(ExportModelOperationsMixin("product"), NiceModel): # type: ignore
self.__dict__["personal_orders_only"] = value
class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ignore [misc, django-manager-missing]
class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents an attribute in the system."
" This class is used to define and manage attributes,"
@ -680,7 +680,7 @@ class Attribute(ExportModelOperationsMixin("attribute"), NiceModel): # type: ig
verbose_name_plural = _("attributes")
class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel): # type: ignore [misc, django-manager-missing]
class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents a specific value for an attribute that is linked to a product. "
"It links the 'attribute' to a unique 'value', allowing "
@ -718,7 +718,7 @@ class AttributeValue(ExportModelOperationsMixin("attribute_value"), NiceModel):
verbose_name_plural = _("attribute values")
class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel): # type: ignore [misc, django-manager-missing]
class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents a product image associated with a product in the system. "
"This class is designed to manage images for products, including functionality "
@ -765,7 +765,7 @@ class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel): # t
verbose_name_plural = _("product images")
class Promotion(ExportModelOperationsMixin("promotion"), NiceModel): # type: ignore [misc, django-manager-missing]
class Promotion(ExportModelOperationsMixin("promotion"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents a promotional campaign for products with a discount. "
"This class is used to define and manage promotional campaigns that offer a "
@ -811,7 +811,7 @@ class Promotion(ExportModelOperationsMixin("promotion"), NiceModel): # type: ig
return str(self.id)
class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel): # type: ignore [misc, django-manager-missing]
class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents a user's wishlist for storing and managing desired products. "
"The class provides functionality to manage a collection of products, "
@ -882,7 +882,7 @@ class Wishlist(ExportModelOperationsMixin("wishlist"), NiceModel): # type: igno
return self
class Documentary(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc, django-manager-missing]
class Documentary(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents a documentary record tied to a product. "
"This class is used to store information about documentaries related to specific "
@ -911,7 +911,7 @@ class Documentary(ExportModelOperationsMixin("attribute_group"), NiceModel): #
return self.document.name.split(".")[-1] or _("unresolved")
class Address(ExportModelOperationsMixin("address"), NiceModel): # type: ignore [misc, django-manager-missing]
class Address(ExportModelOperationsMixin("address"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents an address entity that includes location details and associations with a user. "
"Provides functionality for geographic and address data storage, as well "
@ -970,7 +970,7 @@ 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, django-manager-missing]
class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents a promotional code that can be used for discounts, managing its validity, "
"type of discount, and application. "
@ -1093,7 +1093,7 @@ class PromoCode(ExportModelOperationsMixin("promocode"), NiceModel): # type: ig
return promo_amount
class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [misc, django-manager-missing]
class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents an order placed by a user."
" This class models an order within the application,"
@ -1594,7 +1594,7 @@ class Order(ExportModelOperationsMixin("order"), NiceModel): # type: ignore [mi
return None
class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # type: ignore [misc, django-manager-missing]
class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents products associated with orders and their attributes. "
"The OrderProduct model maintains information about a product that is part of an order, "
@ -1745,7 +1745,7 @@ class OrderProduct(ExportModelOperationsMixin("order_product"), NiceModel): # t
return None
class CustomerRelationshipManagementProvider(ExportModelOperationsMixin("crm_provider"), NiceModel): # type: ignore [misc, django-manager-missing]
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"))
authentication = JSONField(blank=True, null=True, help_text=_("authentication credentials"))
@ -1797,7 +1797,7 @@ class OrderCrmLink(ExportModelOperationsMixin("order_crm_link"), NiceModel): #
verbose_name_plural = _("orders CRM links")
class DigitalAssetDownload(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc, django-manager-missing]
class DigitalAssetDownload(ExportModelOperationsMixin("attribute_group"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Represents the downloading functionality for digital assets associated with orders. "
"The DigitalAssetDownload class provides the ability to manage and access "
@ -1826,7 +1826,7 @@ class DigitalAssetDownload(ExportModelOperationsMixin("attribute_group"), NiceMo
)
class Feedback(ExportModelOperationsMixin("feedback"), NiceModel): # type: ignore [misc, django-manager-missing]
class Feedback(ExportModelOperationsMixin("feedback"), NiceModel): # type: ignore [misc]
__doc__ = _( # type: ignore
"Manages user feedback for products. "
"This class is designed to capture and store user feedback for specific products "

View file

@ -26,7 +26,7 @@ from core.models import (
from core.serializers.utility import AddressSerializer
class AttributeGroupSimpleSerializer(ModelSerializer):
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]
@ -40,7 +40,7 @@ class AttributeGroupSimpleSerializer(ModelSerializer):
]
class CategorySimpleSerializer(ModelSerializer):
class CategorySimpleSerializer(ModelSerializer): # type: ignore [type-arg]
children = SerializerMethodField()
image = SerializerMethodField()
@ -56,10 +56,10 @@ class CategorySimpleSerializer(ModelSerializer):
def get_image(self, obj: Category) -> str | None:
with suppress(ValueError):
return obj.image.url
return str(obj.image.url)
return None
def get_children(self, obj) -> Collection[Any]:
def get_children(self, obj: Category) -> Collection[Any]:
request = self.context.get("request")
if request is not None and request.user.has_perm("view_category"):
children = obj.children.all()
@ -69,7 +69,7 @@ class CategorySimpleSerializer(ModelSerializer):
return CategorySimpleSerializer(children, many=True, context=self.context).data if obj.children.exists() else []
class BrandSimpleSerializer(ModelSerializer):
class BrandSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
small_logo = SerializerMethodField()
big_logo = SerializerMethodField()
@ -84,16 +84,16 @@ class BrandSimpleSerializer(ModelSerializer):
def get_small_logo(self, obj: Brand) -> str | None:
with suppress(ValueError):
return obj.small_logo.url
return str(obj.small_logo.url)
return None
def get_big_logo(self, obj: Brand) -> str | None:
with suppress(ValueError):
return obj.big_logo.url
return str(obj.big_logo.url)
return None
class ProductTagSimpleSerializer(ModelSerializer):
class ProductTagSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
class Meta:
model = ProductTag
fields = [
@ -103,8 +103,8 @@ class ProductTagSimpleSerializer(ModelSerializer):
]
class ProductImageSimpleSerializer(ModelSerializer):
product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
class ProductImageSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg]
class Meta:
model = ProductImage
@ -117,7 +117,7 @@ class ProductImageSimpleSerializer(ModelSerializer):
]
class AttributeSimpleSerializer(ModelSerializer):
class AttributeSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
group = AttributeGroupSimpleSerializer(read_only=True)
class Meta:
@ -130,9 +130,9 @@ class AttributeSimpleSerializer(ModelSerializer):
]
class AttributeValueSimpleSerializer(ModelSerializer):
class AttributeValueSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
attribute = AttributeSimpleSerializer(read_only=True)
product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg]
class Meta:
model = AttributeValue
@ -144,7 +144,7 @@ class AttributeValueSimpleSerializer(ModelSerializer):
]
class ProductSimpleSerializer(ModelSerializer):
class ProductSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
brand = BrandSimpleSerializer(read_only=True)
category = CategorySimpleSerializer(read_only=True)
tags = ProductTagSimpleSerializer(many=True, read_only=True)
@ -196,7 +196,7 @@ class ProductSimpleSerializer(ModelSerializer):
return obj.personal_orders_only
class VendorSimpleSerializer(ModelSerializer):
class VendorSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
class Meta:
model = Vendor
fields = [
@ -205,7 +205,7 @@ class VendorSimpleSerializer(ModelSerializer):
]
class StockSimpleSerializer(ModelSerializer):
class StockSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
vendor = VendorSimpleSerializer(read_only=True)
product = ProductSimpleSerializer(read_only=True)
@ -222,7 +222,7 @@ class StockSimpleSerializer(ModelSerializer):
]
class PromoCodeSimpleSerializer(ModelSerializer):
class PromoCodeSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
class Meta:
model = PromoCode
fields = [
@ -231,7 +231,7 @@ class PromoCodeSimpleSerializer(ModelSerializer):
]
class PromotionSimpleSerializer(ModelSerializer):
class PromotionSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
products = ProductSimpleSerializer(many=True, read_only=True)
class Meta:
@ -244,8 +244,8 @@ class PromotionSimpleSerializer(ModelSerializer):
]
class WishlistSimpleSerializer(ModelSerializer):
user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
class WishlistSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg]
products = ProductSimpleSerializer(many=True, read_only=True)
class Meta:
@ -257,8 +257,8 @@ class WishlistSimpleSerializer(ModelSerializer):
]
class FeedbackSimpleSerializer(ModelSerializer):
order_product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
class FeedbackSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
order_product: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg]
class Meta:
model = Feedback
@ -269,7 +269,7 @@ class FeedbackSimpleSerializer(ModelSerializer):
]
class OrderProductSimpleSerializer(ModelSerializer):
class OrderProductSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
product = ProductSimpleSerializer(read_only=True)
class Meta:
@ -283,8 +283,8 @@ class OrderProductSimpleSerializer(ModelSerializer):
]
class OrderSimpleSerializer(ModelSerializer):
user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True)
class OrderSimpleSerializer(ModelSerializer): # type: ignore [type-arg]
user: PrimaryKeyRelatedField = PrimaryKeyRelatedField(read_only=True) # type: ignore [type-arg]
promo_code = PromoCodeSimpleSerializer(read_only=True)
order_products = OrderProductSimpleSerializer(many=True, read_only=True)
billing_address = AddressSerializer(read_only=True, required=False)

View file

@ -1,3 +1,5 @@
from typing import Any
from django.utils.translation import gettext_lazy as _
from rest_framework.exceptions import ValidationError
from rest_framework.fields import (
@ -16,19 +18,19 @@ from rest_framework.serializers import ListSerializer, ModelSerializer, Serializ
from core.models import Address
class AddressAutocompleteInputSerializer(Serializer):
class AddressAutocompleteInputSerializer(Serializer): # type: ignore [type-arg]
q = CharField(required=True)
limit = IntegerField(required=False, min_value=1, max_value=10, default=5)
class AddressSuggestionSerializer(Serializer):
class AddressSuggestionSerializer(Serializer): # type: ignore [type-arg]
display_name = CharField()
lat = FloatField()
lon = FloatField()
address = DictField(child=CharField())
class AddressSerializer(ModelSerializer):
class AddressSerializer(ModelSerializer): # type: ignore [type-arg]
latitude = FloatField(source="location.y", read_only=True)
longitude = FloatField(source="location.x", read_only=True)
@ -57,7 +59,7 @@ class AddressSerializer(ModelSerializer):
]
class AddressCreateSerializer(ModelSerializer):
class AddressCreateSerializer(ModelSerializer): # type: ignore [type-arg]
raw_data = CharField(
write_only=True,
max_length=512,
@ -69,31 +71,32 @@ class AddressCreateSerializer(ModelSerializer):
model = Address
fields = ["raw_data", "address_line_1", "address_line_2"]
def create(self, validated_data):
def create(self, validated_data: dict[str, Any]) -> Address:
raw = validated_data.pop("raw_data")
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)
return Address.objects.create(raw_data=raw, user=user, **validated_data) # type: ignore [no-untyped-call]
class DoFeedbackSerializer(Serializer):
class DoFeedbackSerializer(Serializer): # type: ignore [type-arg]
comment = CharField(required=True)
rating = IntegerField(min_value=1, max_value=10, default=10)
action = CharField(default="add")
def validate(self, data):
def validate(self, data: dict[str, Any]) -> dict[str, Any]:
if data["action"] == "add" and not all([data["comment"], data["rating"]]):
raise ValidationError(_("you must provide a comment, rating, and order product uuid to add feedback."))
return data
class CacheOperatorSerializer(Serializer):
class CacheOperatorSerializer(Serializer): # type: ignore [type-arg]
key = CharField(required=True)
data = JSONField(required=False) # type: ignore [assignment]
timeout = IntegerField(required=False)
class ContactUsSerializer(Serializer):
class ContactUsSerializer(Serializer): # type: ignore [type-arg]
email = CharField(required=True)
name = CharField(required=True)
subject = CharField(required=True)
@ -101,14 +104,14 @@ class ContactUsSerializer(Serializer):
message = CharField(required=True)
class LanguageSerializer(Serializer):
class LanguageSerializer(Serializer): # type: ignore [type-arg]
code = CharField(required=True)
name = CharField(required=True)
flag = CharField()
class RecursiveField(Field):
def to_representation(self, value):
class RecursiveField(Field): # type: ignore [type-arg]
def to_representation(self, value: Any) -> Any:
parent = self.parent
if isinstance(parent, ListSerializer):
parent = parent.parent
@ -116,45 +119,45 @@ class RecursiveField(Field):
serializer_class = parent.__class__
return serializer_class(value, context=self.context).data
def to_internal_value(self, data):
def to_internal_value(self, data: Any) -> Any:
return data
class AddOrderProductSerializer(Serializer):
class AddOrderProductSerializer(Serializer): # type: ignore [type-arg]
product_uuid = CharField(required=True)
attributes = ListField(required=False, child=DictField(), default=list)
class BulkAddOrderProductsSerializer(Serializer):
class BulkAddOrderProductsSerializer(Serializer): # type: ignore [type-arg]
products = ListField(child=AddOrderProductSerializer(), required=True)
class RemoveOrderProductSerializer(Serializer):
class RemoveOrderProductSerializer(Serializer): # type: ignore [type-arg]
product_uuid = CharField(required=True)
attributes = JSONField(required=False, default=dict)
class BulkRemoveOrderProductsSerializer(Serializer):
class BulkRemoveOrderProductsSerializer(Serializer): # type: ignore [type-arg]
products = ListField(child=RemoveOrderProductSerializer(), required=True)
class AddWishlistProductSerializer(Serializer):
class AddWishlistProductSerializer(Serializer): # type: ignore [type-arg]
product_uuid = CharField(required=True)
class RemoveWishlistProductSerializer(Serializer):
class RemoveWishlistProductSerializer(Serializer): # type: ignore [type-arg]
product_uuid = CharField(required=True)
class BulkAddWishlistProductSerializer(Serializer):
class BulkAddWishlistProductSerializer(Serializer): # type: ignore [type-arg]
product_uuids = ListField(child=CharField(required=True), allow_empty=False, max_length=64)
class BulkRemoveWishlistProductSerializer(Serializer):
class BulkRemoveWishlistProductSerializer(Serializer): # type: ignore [type-arg]
product_uuids = ListField(child=CharField(required=True), allow_empty=False, max_length=64)
class BuyOrderSerializer(Serializer):
class BuyOrderSerializer(Serializer): # type: ignore [type-arg]
force_balance = BooleanField(required=False, default=False)
force_payment = BooleanField(required=False, default=False)
promocode_uuid = CharField(required=False)
@ -163,7 +166,7 @@ class BuyOrderSerializer(Serializer):
chosen_products = AddOrderProductSerializer(many=True, required=False)
class BuyUnregisteredOrderSerializer(Serializer):
class BuyUnregisteredOrderSerializer(Serializer): # type: ignore [type-arg]
products = AddOrderProductSerializer(many=True, required=True)
promocode_uuid = UUIDField(required=False)
customer_name = CharField(required=True)
@ -174,7 +177,7 @@ class BuyUnregisteredOrderSerializer(Serializer):
payment_method = CharField(required=True)
class BuyAsBusinessOrderSerializer(Serializer):
class BuyAsBusinessOrderSerializer(Serializer): # type: ignore [type-arg]
products = AddOrderProductSerializer(many=True, required=True)
business_identificator = CharField(required=True)
promocode_uuid = UUIDField(required=False)

View file

@ -1,6 +1,7 @@
import logging
from contextlib import suppress
from datetime import timedelta
from typing import Any
from django.db import IntegrityError
from django.db.models.signals import post_save
@ -13,7 +14,7 @@ from sentry_sdk import capture_exception
from core.crm import any_crm_integrations
from core.crm.exceptions import CRMException
from core.models import Category, Order, Product, PromoCode, Wishlist, DigitalAssetDownload
from core.models import Category, DigitalAssetDownload, Order, Product, PromoCode, Wishlist
from core.utils import (
generate_human_readable_id,
resolve_translations_for_elasticsearch,
@ -25,8 +26,9 @@ from vibes_auth.models import User
logger = logging.getLogger("django")
# noinspection PyUnusedLocal
@receiver(post_save, sender=User)
def create_order_on_user_creation_signal(instance, created, **_kwargs):
def create_order_on_user_creation_signal(instance: User, created: bool, **kwargs: dict[Any, Any]) -> None:
if created:
try:
Order.objects.create(user=instance, status="PENDING")
@ -40,17 +42,23 @@ def create_order_on_user_creation_signal(instance, created, **_kwargs):
break
# noinspection PyUnusedLocal
@receiver(post_save, sender=User)
def create_wishlist_on_user_creation_signal(instance, created, **_kwargs):
def create_wishlist_on_user_creation_signal(instance: User, created: bool, **kwargs: dict[Any, Any]) -> None:
if created:
Wishlist.objects.create(user=instance)
# noinspection PyUnusedLocal
@receiver(post_save, sender=User)
def create_promocode_on_user_referring(instance, created, **_kwargs):
def create_promocode_on_user_referring(instance: User, created: bool, **kwargs: dict[Any, Any]) -> None:
try:
if not instance.attributes:
instance.attributes = {}
instance.save()
if created and instance.attributes.get("referrer", ""):
referrer_uuid = urlsafe_base64_decode(instance.attributes.get("referrer", ""))
referrer_uuid = urlsafe_base64_decode(instance.attributes.get("referrer", "")).decode()
referrer = User.objects.get(uuid=referrer_uuid)
code = f"WELCOME-{get_random_string(6)}"
PromoCode.objects.create(
@ -65,8 +73,9 @@ def create_promocode_on_user_referring(instance, created, **_kwargs):
logger.error(_(f"error during promocode creation: {e!s}"))
# noinspection PyUnusedLocal
@receiver(post_save, sender=Order)
def process_order_changes(instance, created, **_kwargs):
def process_order_changes(instance: Order, created: bool, **kwargs: dict[Any, Any]):
if type(instance.attributes) is not dict:
instance.attributes = {}
@ -99,9 +108,12 @@ def process_order_changes(instance, created, **_kwargs):
if instance.status in ["CREATED", "PAYMENT"]:
if not instance.is_whole_digital:
send_order_created_email.delay(instance.uuid)
send_order_created_email.delay(instance.uuid) # type: ignore [attr-defined]
for order_product in instance.order_products.filter(status="DELIVERING", product__is_digital=True):
if not order_product.product:
continue
stocks_qs = order_product.product.stocks.filter(digital_asset__isnull=False).exclude(digital_asset="")
stock = stocks_qs.first()
@ -115,8 +127,8 @@ def process_order_changes(instance, created, **_kwargs):
order_product.status = "FINISHED"
if not order_product.download:
DigitalAssetDownload.objects.create(order_product=order_product)
order_product.order.user.payments_balance.amount -= order_product.buy_price
order_product.order.user.payments_balance.save()
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.save()
continue
@ -124,12 +136,12 @@ def process_order_changes(instance, created, **_kwargs):
try:
vendor_name = (
order_product.product.stocks.filter(price=order_product.buy_price).first().vendor.name.lower()
order_product.product.stocks.filter(price=order_product.buy_price).first().vendor.name.lower() # type: ignore [union-attr, attr-defined, misc]
)
vendor = create_object(f"core.vendors.{vendor_name}", f"{vendor_name.title()}Vendor")
vendor.buy_order_product(order_product)
vendor.buy_order_product(order_product) # type: ignore [attr-defined]
except Exception as e:
order_product.add_error(f"Failed to buy {order_product.uuid}. Reason: {e}...")
@ -144,26 +156,29 @@ def process_order_changes(instance, created, **_kwargs):
if instance.status == "FINISHED" and not instance.attributes.get("system_email_sent", False):
instance.attributes["system_email_sent"] = True
instance.save()
send_order_finished_email.delay(instance.uuid)
send_order_finished_email.delay(instance.uuid) # type: ignore [attr-defined]
# noinspection PyUnusedLocal
@receiver(post_save, sender=Product)
def update_product_name_lang(instance, created, **_kwargs):
def update_product_name_lang(instance: Product, created: bool, **kwargs: dict[Any, Any]) -> None:
if created:
pass
resolve_translations_for_elasticsearch(instance, "name")
resolve_translations_for_elasticsearch(instance, "description")
# noinspection PyUnusedLocal
@receiver(post_save, sender=Category)
def update_category_name_lang(instance, created, **_kwargs):
def update_category_name_lang(instance: Category, created: bool, **kwargs: dict[Any, Any]) -> None:
if created:
pass
resolve_translations_for_elasticsearch(instance, "name")
resolve_translations_for_elasticsearch(instance, "description")
# noinspection PyUnusedLocal
@receiver(post_save, sender=PromoCode)
def send_promocode_creation_email(instance, created, **_kwargs):
def send_promocode_creation_email(instance: PromoCode, created: bool, **kwargs: dict[Any, Any]) -> None:
if created:
send_promocode_created_email.delay(instance.uuid)
send_promocode_created_email.delay(instance.uuid) # type: ignore [attr-defined]

View file

@ -1,12 +1,13 @@
from django.conf import settings
from django.contrib.sitemaps import Sitemap
from django.utils.translation import gettext_lazy as _
from core.models import Brand, Category, Product
from core.utils.seo_builders import any_non_digital
from evibes.settings import LANGUAGE_CODE
class StaticPagesSitemap(Sitemap):
class StaticPagesSitemap(Sitemap): # type: ignore [type-arg]
protocol = "https"
changefreq = "monthly"
priority = 0.8
@ -54,7 +55,7 @@ class StaticPagesSitemap(Sitemap):
return obj.get("lastmod")
# class FeaturedProductsSitemap(Sitemap):
# class FeaturedProductsSitemap(Sitemap): # type: ignore [type-arg]
# protocol = "https"
# changefreq = "daily"
# priority = 0.9
@ -80,7 +81,7 @@ class StaticPagesSitemap(Sitemap):
# return f"/{LANGUAGE_CODE}/product/{obj.slug}"
class ProductSitemap(Sitemap):
class ProductSitemap(Sitemap): # type: ignore [type-arg]
protocol = "https"
changefreq = "daily"
priority = 0.9
@ -106,7 +107,7 @@ class ProductSitemap(Sitemap):
return f"/{LANGUAGE_CODE}/product/{obj.slug}"
class CategorySitemap(Sitemap):
class CategorySitemap(Sitemap): # type: ignore [type-arg]
protocol = "https"
changefreq = "weekly"
priority = 0.7
@ -122,7 +123,7 @@ class CategorySitemap(Sitemap):
return f"/{LANGUAGE_CODE}/catalog/{obj.slug}"
class BrandSitemap(Sitemap):
class BrandSitemap(Sitemap): # type: ignore [type-arg]
protocol = "https"
changefreq = "weekly"
priority = 0.6

View file

@ -4,6 +4,7 @@ import shutil
import uuid
from datetime import date, timedelta
from time import sleep
from typing import Any
import requests
from celery.app import shared_task
@ -38,7 +39,7 @@ def update_products_task() -> tuple[bool, str]:
if not update_products_task_running:
cache.set("update_products_task_running", True, 86400)
vendors_classes: list = []
vendors_classes: list[Any] = []
for vendor_class in vendors_classes:
vendor = vendor_class()
@ -69,7 +70,7 @@ def update_orderproducts_task() -> tuple[bool, str]:
message confirming the successful execution of the task.
:rtype: Tuple[bool, str]
"""
vendors_classes: list = []
vendors_classes: list[Any] = []
for vendor_class in vendors_classes:
vendor = vendor_class()
@ -202,7 +203,7 @@ def process_promotions() -> tuple[bool, str]:
if eligible_products.count() < 48:
return False, "Not enough products to choose from [< 48]."
selected_products: list = []
selected_products: list[Any] = []
while len(selected_products) < 48:
product = eligible_products.order_by("?").first()

View file

@ -1,10 +1,12 @@
from typing import Any
from django import template
register = template.Library()
@register.filter
def attributes_length(value, arg):
def attributes_length(value: Any, arg: int) -> bool:
"""Returns True if the value length is more than the argument."""
if isinstance(value, dict):
count = 0

View file

@ -1,3 +0,0 @@
from django.test import TestCase # noqa: F401
# Create your tests here.

View file

@ -1 +1,3 @@
urlpatterns: list = []
from typing import Any
urlpatterns: list[Any] = []

View file

@ -2,13 +2,18 @@ import logging
import re
import secrets
from contextlib import contextmanager
from typing import Any, Generator
from constance import config
from django.conf import settings
from django.core import mail
from django.core.cache import cache
from django.core.mail.backends.smtp import EmailBackend
from django.db import transaction
from django.utils.crypto import get_random_string
from django.utils.translation import get_language
from graphene import Context
from rest_framework.request import Request
from evibes.settings import DEBUG, EXPOSABLE_KEYS, LANGUAGE_CODE
@ -29,7 +34,7 @@ def graphene_current_lang() -> str:
return (get_language() or settings.LANGUAGE_CODE).lower()
def graphene_abs(request, path_or_url: str) -> str:
def graphene_abs(request: Request | Context, path_or_url: str) -> str:
"""
Builds and returns an absolute URI for a given path or URL.
@ -63,20 +68,20 @@ def get_random_code() -> str:
return get_random_string(20)
def get_product_uuid_as_path(instance, filename: str = "") -> str:
def get_product_uuid_as_path(instance, filename: str = "") -> str: # type: ignore [no-untyped-def]
return "products" + "/" + str(instance.product.uuid) + "/" + filename
def get_vendor_name_as_path(instance, filename: str = "") -> str:
def get_vendor_name_as_path(instance, filename: str = "") -> str: # type: ignore [no-untyped-def]
return "vendors_responses/" + str(instance.name) + "/" + filename
def get_brand_name_as_path(instance, filename: str = "") -> str:
def get_brand_name_as_path(instance, filename: str = "") -> str: # type: ignore [no-untyped-def]
return "brands/" + str(instance.name) + "/" + filename
@contextmanager
def atomic_if_not_debug():
def atomic_if_not_debug() -> Generator[None, None, None]:
"""
Context manager to wrap a block of code in an atomic transaction if the DEBUG
setting is not enabled.
@ -97,7 +102,7 @@ def is_url_safe(url: str) -> bool:
return bool(re.match(r"^https://", url, re.IGNORECASE))
def format_attributes(attributes: str | None = None) -> dict:
def format_attributes(attributes: str | None = None) -> dict[str, Any]:
"""
Parses a string of attributes into a dictionary.
@ -125,7 +130,7 @@ def format_attributes(attributes: str | None = None) -> dict:
return result
def get_project_parameters() -> dict:
def get_project_parameters() -> Any:
"""
Fetches project parameters from cache or configuration.
@ -134,7 +139,7 @@ def get_project_parameters() -> dict:
configuration source, formats their keys to lowercase, and then stores
them in the cache for a limited period.
"""
parameters = cache.get("parameters", {})
parameters = cache.get("parameters")
if not parameters:
for key in EXPOSABLE_KEYS:
@ -145,7 +150,7 @@ def get_project_parameters() -> dict:
return parameters
def resolve_translations_for_elasticsearch(instance, field_name: str) -> None:
def resolve_translations_for_elasticsearch(instance, field_name: str) -> None: # type: ignore [no-untyped-def]
"""
Resolves translations for a given field in an Elasticsearch-compatible
format. It checks if the localized version of the field contains data,
@ -199,3 +204,17 @@ def generate_human_readable_token() -> str:
def is_status_code_success(status_code: int) -> bool:
return 200 <= status_code < 300
def get_dynamic_email_connection() -> EmailBackend:
return mail.get_connection( # type: ignore [no-any-return]
host=config.EMAIL_HOST,
port=config.EMAIL_PORT,
username=config.EMAIL_HOST_USER,
password=config.EMAIL_HOST_PASSWORD,
use_tls=config.EMAIL_USE_TLS,
use_ssl=config.EMAIL_USE_SSL,
timeout=30,
fail_silently=False,
backend=config.EMAIL_BACKEND,
)

View file

@ -1,10 +1,8 @@
import json
import logging
from pathlib import Path
from typing import Any
from typing import Any, Type
from django.contrib.auth.base_user import AbstractBaseUser
from django.contrib.auth.models import AnonymousUser
from django.core.cache import cache
from django.core.exceptions import BadRequest
from django.utils.translation import gettext_lazy as _
@ -17,11 +15,11 @@ from vibes_auth.models import User
logger = logging.getLogger("django")
def is_safe_cache_key(key: str):
def is_safe_cache_key(key: str) -> bool:
return key not in UNSAFE_CACHE_KEYS
def get_cached_value(user: User, key: str, default=None) -> None | object:
def get_cached_value(user: Type[User], key: str, default: Any = None) -> Any:
if user.is_staff or user.is_superuser:
return cache.get(key, default)
@ -31,9 +29,7 @@ def get_cached_value(user: User, key: str, default=None) -> None | object:
return None
def set_cached_value(
user: User | AbstractBaseUser | AnonymousUser, key: str, value: object, timeout: int = 3600
) -> None | object:
def set_cached_value(user: Type[User], key: str, value: object, timeout: int = 3600) -> None | object:
if user.is_staff or user.is_superuser:
cache.set(key, value, timeout)
return value
@ -41,14 +37,14 @@ def set_cached_value(
return None
def web_cache(request: Request | Context, key: str, data: dict[str, Any], timeout: int):
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)}
return {"data": get_cached_value(request.user, key)} # type: ignore [assignment, arg-type]
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)}
return {"data": set_cached_value(request.user, key, data, timeout)} # type: ignore [assignment, arg-type]
def set_default_cache() -> None:

View file

@ -1,12 +0,0 @@
from constance import config
from evibes import settings
def set_email_settings():
settings.EMAIL_HOST = config.EMAIL_HOST
settings.EMAIL_PORT = config.EMAIL_PORT
settings.EMAIL_HOST_USER = config.EMAIL_HOST_USER
settings.EMAIL_HOST_PASSWORD = config.EMAIL_HOST_PASSWORD
settings.EMAIL_USE_TLS = config.EMAIL_USE_TLS
settings.EMAIL_USE_SSL = config.EMAIL_USE_SSL

View file

@ -1,5 +1,7 @@
import logging
from typing import Any, Callable
from django.db.models import Model
from django.db.models.constants import LOOKUP_SEP
from django_extensions.db.fields import AutoSlugField
from slugify import slugify
@ -7,7 +9,7 @@ from slugify import slugify
logger = logging.getLogger("django")
def unicode_slugify_function(content):
def unicode_slugify_function(content: Any) -> str:
return slugify(
text=str(content),
allow_unicode=True,
@ -20,7 +22,7 @@ def unicode_slugify_function(content):
class TweakedAutoSlugField(AutoSlugField):
def get_slug_fields(self, model_instance, lookup_value):
def get_slug_fields(self, model_instance: Model, lookup_value: str | Callable[[Any], Any]) -> str | Model:
if callable(lookup_value):
return f"{lookup_value(model_instance)}"
@ -29,9 +31,9 @@ class TweakedAutoSlugField(AutoSlugField):
for elem in lookup_value_path:
try:
attr = getattr(attr, elem)
attr: Any = getattr(attr, elem)
except AttributeError:
attr = ""
attr: Any = ""
if callable(attr):
# noinspection PyCallingNonCallable
return f"{attr()}"

View file

@ -4,22 +4,24 @@ from celery.app import shared_task
from celery.utils.log import get_task_logger
from constance import config
from django.conf import settings
from django.core import mail
from django.core.mail import EmailMessage
from django.template.loader import render_to_string
from django.utils.translation import activate
from django.utils.translation import gettext_lazy as _
from core.models import Order, OrderProduct, PromoCode
from core.utils.constance import set_email_settings
from core.utils import get_dynamic_email_connection
logger = get_task_logger(__name__)
@shared_task(queue="default")
def contact_us_email(contact_info):
set_email_settings()
connection = mail.get_connection()
def contact_us_email(contact_info) -> tuple[bool, str]:
logger.debug(
"Contact us email sent to %s with subject %s",
contact_info.get("email"),
contact_info.get("subject", "Without subject"),
)
email = EmailMessage(
_(f"{config.PROJECT_NAME} | contact us initiated"),
@ -36,7 +38,7 @@ def contact_us_email(contact_info):
),
to=[config.EMAIL_FROM],
from_email=f"{config.PROJECT_NAME} <{config.EMAIL_FROM}>",
connection=connection,
connection=get_dynamic_email_connection(),
)
email.content_subtype = "html"
email.send()
@ -66,9 +68,6 @@ def send_order_created_email(order_pk: str) -> tuple[bool, str]:
activate(language)
set_email_settings()
connection = mail.get_connection()
if not order.is_whole_digital:
email = EmailMessage(
_(f"{config.PROJECT_NAME} | order confirmation"),
@ -83,7 +82,7 @@ def send_order_created_email(order_pk: str) -> tuple[bool, str]:
),
to=[recipient],
from_email=f"{config.PROJECT_NAME} <{config.EMAIL_FROM}>",
connection=connection,
connection=get_dynamic_email_connection(),
)
email.content_subtype = "html"
email.send()
@ -93,7 +92,7 @@ def send_order_created_email(order_pk: str) -> tuple[bool, str]:
@shared_task(queue="default")
def send_order_finished_email(order_pk: str) -> tuple[bool, str]:
def send_digital_assets_email(ops: list[OrderProduct]):
def send_digital_assets_email(ops: list[OrderProduct]) -> None:
if len(ops) <= 0:
return
@ -102,9 +101,6 @@ def send_order_finished_email(order_pk: str) -> tuple[bool, str]:
activate(order.user.language)
set_email_settings()
connection = mail.get_connection()
email = EmailMessage(
_(f"{config.PROJECT_NAME} | order delivered"),
render_to_string(
@ -122,21 +118,19 @@ def send_order_finished_email(order_pk: str) -> tuple[bool, str]:
),
to=[order.user.email],
from_email=f"{config.PROJECT_NAME} <{config.EMAIL_FROM}>",
connection=connection,
connection=get_dynamic_email_connection(),
)
email.content_subtype = "html"
result = email.send()
logger.debug("Order %s: Tried to send email to %s, resulted with %s", order.pk, order.user.email, result)
def send_thank_you_email(ops: list[OrderProduct]):
def send_thank_you_email(ops: list[OrderProduct]) -> None:
if ops:
pass
if not order.user:
return
activate(order.user.language)
set_email_settings()
pass
try:
@ -190,9 +184,6 @@ def send_promocode_created_email(promocode_pk: str) -> tuple[bool, str]:
activate(promocode.user.language)
set_email_settings()
connection = mail.get_connection()
email = EmailMessage(
_(f"{config.PROJECT_NAME} | promocode granted"),
render_to_string(
@ -208,7 +199,7 @@ def send_promocode_created_email(promocode_pk: str) -> tuple[bool, str]:
),
to=[promocode.user.email],
from_email=f"{config.PROJECT_NAME} <{config.EMAIL_FROM}>",
connection=connection,
connection=get_dynamic_email_connection(),
)
email.content_subtype = "html"
result = email.send()

View file

@ -1,5 +1,5 @@
from constance import config
def get_flag_by_language(language):
def get_flag_by_language(language: str) -> str:
return f"https://api.{config.BASE_DOMAIN}/static/flags/{language}.png"

View file

@ -3,12 +3,14 @@ from django.core.files.images import ImageFile, get_image_dimensions
from django.utils.translation import gettext_lazy as _
def validate_category_image_dimensions(image: ImageFile) -> None:
max_width = 99999
max_height = 99999
def validate_category_image_dimensions(
image: ImageFile, max_width: int | None = None, max_height: int | None = None
) -> None:
max_width = max_width or 7680
max_height = max_height or 4320
if image:
width, height = get_image_dimensions(image.file)
width, height = get_image_dimensions(image.file) # type: ignore [arg-type]
if width > max_width or height > max_height:
if int(width) > max_width or int(height) > max_height: # type: ignore [arg-type]
raise ValidationError(_(f"image dimensions should not exceed w{max_width} x h{max_height} pixels"))

View file

@ -231,12 +231,12 @@ class AbstractVendor:
def resolve_price_with_currency(self, price: float | int | Decimal, provider: str, currency: str = "") -> float:
rates = get_rates(provider)
rate = rates.get(currency or self.currency)
rate = rates.get(currency or self.currency) if rates else 1
if not rate:
raise RatesError(f"No rate found for {currency or self.currency} in {rates} with probider {provider}...")
return float(round(price / rate, 2)) if rate else float(round(price, 2)) # type: ignore [arg-type]
return float(round(price / rate, 2)) if rate else float(round(price, 2)) # type: ignore [arg-type, operator]
@staticmethod
def round_price_marketologically(price: float) -> float:
@ -339,9 +339,9 @@ class AbstractVendor:
Product.objects.filter(pk__in=batch_ids).delete()
def delete_belongings(self) -> None:
self.get_products_queryset().delete() # type: ignore [union-attr]
self.get_stocks_queryset().delete() # type: ignore [union-attr]
self.get_attribute_values_queryset().delete() # type: ignore [union-attr]
self.get_products_queryset().delete()
self.get_stocks_queryset().delete()
self.get_attribute_values_queryset().delete()
def get_or_create_attribute_safe(self, *, name: str, attr_group: AttributeGroup) -> Attribute:
key = name[:255]
@ -393,11 +393,11 @@ class AbstractVendor:
attribute = Attribute.objects.filter(name=key, group=attr_group).order_by("uuid").first() # type: ignore [assignment]
attribute.is_active = True
attribute.value_type = attr_value_type
attribute.save() # type: ignore [no-untyped-call]
attribute.save()
except IntegrityError:
return
attribute.save() # type: ignore [no-untyped-call]
attribute.save()
if not is_created:
return

View file

@ -8,7 +8,7 @@ from django.contrib.sitemaps.views import index as _sitemap_index_view
from django.contrib.sitemaps.views import sitemap as _sitemap_detail_view
from django.core.cache import cache
from django.core.exceptions import BadRequest
from django.http import FileResponse, Http404, JsonResponse, HttpRequest, HttpResponseRedirect
from django.http import FileResponse, Http404, HttpRequest, HttpResponse, HttpResponseRedirect, JsonResponse
from django.shortcuts import redirect
from django.utils.decorators import method_decorator
from django.utils.http import urlsafe_base64_decode
@ -181,9 +181,9 @@ class CacheOperatorView(APIView):
return Response(
data=web_cache(
request,
request.data.get("key"),
request.data.get("data"),
request.data.get("timeout"),
request.data.get("key"), # type: ignore [arg-type]
request.data.get("data", {}),
request.data.get("timeout"), # type: ignore [arg-type]
),
status=status.HTTP_200_OK,
)
@ -205,7 +205,7 @@ class ContactUsView(APIView):
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)
contact_us_email.delay(serializer.validated_data) # type: ignore [attr-defined]
return Response(data=serializer.data, status=status.HTTP_200_OK)
@ -227,7 +227,7 @@ class RequestCursedURLView(APIView):
@method_decorator(ratelimit(key="ip", rate="10/h"))
def post(self, request: Request, *args, **kwargs) -> Response:
url = request.data.get("url")
if not is_url_safe(url):
if not is_url_safe(str(url)):
return Response(
data={"error": _("only URLs starting with http(s):// are allowed")},
status=status.HTTP_400_BAD_REQUEST,
@ -235,7 +235,7 @@ class RequestCursedURLView(APIView):
try:
data = cache.get(url, None)
if not data:
response = requests.get(url, headers={"content-type": "application/json"})
response = requests.get(str(url), headers={"content-type": "application/json"})
response.raise_for_status()
data = camelize(response.json())
cache.set(url, data, 86400)
@ -317,7 +317,10 @@ def download_digital_asset_view(request: HttpRequest, *args, **kwargs) -> FileRe
download.num_downloads += 1
download.save()
file_path = download.order_product.product.stocks.first().digital_asset.path
if not download.order_product.product:
raise BadRequest(_("the order product does not have a product"))
file_path = download.order_product.product.stocks.first().digital_asset.path # type: ignore [union-attr]
content_type, encoding = mimetypes.guess_type(file_path)
if not content_type:
@ -357,7 +360,7 @@ download_digital_asset_view.__doc__ = _( # type: ignore [assignment]
)
def favicon_view(request: HttpRequest, *args, **kwargs) -> FileResponse | Http404:
def favicon_view(request: HttpRequest, *args, **kwargs) -> HttpResponse | FileResponse:
try:
favicon_path = os.path.join(settings.BASE_DIR, "static/favicon.png")
return FileResponse(open(favicon_path, "rb"), content_type="image/x-icon")
@ -373,7 +376,7 @@ favicon_view.__doc__ = _( # type: ignore [assignment]
)
def index(request: HttpRequest, *args, **kwargs) -> HttpResponseRedirect:
def index(request: HttpRequest, *args, **kwargs) -> HttpResponse | HttpResponseRedirect:
return redirect("admin:index")

View file

@ -1,5 +1,6 @@
import logging
import uuid
from typing import Type
from uuid import UUID
from constance import config
@ -20,6 +21,7 @@ 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
@ -132,13 +134,14 @@ class EvibesViewSet(ModelViewSet):
"permissions, and rendering formats."
)
action_serializer_classes: dict = {}
additional: dict = {}
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):
return self.action_serializer_classes.get(self.action, super().get_serializer_class())
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)
@ -587,6 +590,7 @@ class FeedbackViewSet(EvibesViewSet):
return qs.filter(is_active=True)
# noinspection PyUnusedLocal
@extend_schema_view(**ORDER_SCHEMA)
class OrderViewSet(EvibesViewSet):
__doc__ = _(
@ -659,9 +663,12 @@ class OrderViewSet(EvibesViewSet):
def buy(self, request: Request, *args, **kwargs) -> Response:
serializer = BuyOrderSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
lookup_val = kwargs.get(self.lookup_field)
order = self.get_object()
if not request.user or request.user.is_anonymous:
return Response(
status=status.HTTP_401_UNAUTHORIZED,
)
try:
order = Order.objects.get(user=request.user, uuid=lookup_val)
instance = order.buy(
force_balance=serializer.validated_data.get("force_balance"),
force_payment=serializer.validated_data.get("force_payment"),
@ -709,9 +716,8 @@ class OrderViewSet(EvibesViewSet):
def add_order_product(self, request: Request, *args, **kwargs) -> Response:
serializer = AddOrderProductSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
lookup_val = kwargs.get(self.lookup_field)
order = self.get_object()
try:
order = Order.objects.get(uuid=lookup_val)
if not (request.user.has_perm("core.add_orderproduct") or request.user == order.user):
raise PermissionDenied(permission_denied_message)
@ -727,9 +733,8 @@ class OrderViewSet(EvibesViewSet):
def remove_order_product(self, request: Request, *args, **kwargs) -> Response:
serializer = RemoveOrderProductSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
lookup_val = kwargs.get(self.lookup_field)
order = self.get_object()
try:
order = Order.objects.get(uuid=lookup_val)
if not (request.user.has_perm("core.delete_orderproduct") or request.user == order.user):
raise PermissionDenied(permission_denied_message)
@ -762,9 +767,8 @@ class OrderViewSet(EvibesViewSet):
def bulk_remove_order_products(self, request: Request, *args, **kwargs) -> Response:
serializer = BulkRemoveOrderProductsSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
lookup_val = kwargs.get(self.lookup_field)
order = self.get_object()
try:
order = Order.objects.get(uuid=lookup_val)
if not (request.user.has_perm("core.delete_orderproduct") or request.user == order.user):
raise PermissionDenied(permission_denied_message)
@ -776,6 +780,7 @@ class OrderViewSet(EvibesViewSet):
return Response(status=status.HTTP_404_NOT_FOUND)
# noinspection PyUnusedLocal
@extend_schema_view(**ORDER_PRODUCT_SCHEMA)
class OrderProductViewSet(EvibesViewSet):
__doc__ = _(
@ -810,7 +815,9 @@ class OrderProductViewSet(EvibesViewSet):
serializer = self.get_serializer(request.data)
serializer.is_valid(raise_exception=True)
try:
order_product = OrderProduct.objects.get(uuid=kwargs.get("pk"))
order_product = OrderProduct.objects.get(uuid=str(kwargs.get("pk")))
if not order_product.order:
return Response(status=status.HTTP_404_NOT_FOUND)
if not (request.user.has_perm("core.change_orderproduct") or request.user == order_product.order.user):
raise PermissionDenied(permission_denied_message)
feedback = order_product.do_feedback(
@ -934,7 +941,7 @@ class WishlistViewSet(EvibesViewSet):
serializer = AddWishlistProductSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
try:
wishlist = Wishlist.objects.get(uuid=kwargs.get("pk"))
wishlist = self.get_object()
if not (request.user.has_perm("core.change_wishlist") or request.user == wishlist.user):
raise PermissionDenied(permission_denied_message)
@ -952,7 +959,7 @@ class WishlistViewSet(EvibesViewSet):
serializer = RemoveWishlistProductSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
try:
wishlist = Wishlist.objects.get(uuid=kwargs.get("pk"))
wishlist = self.get_object()
if not (request.user.has_perm("core.change_wishlist") or request.user == wishlist.user):
raise PermissionDenied(permission_denied_message)
@ -970,7 +977,7 @@ class WishlistViewSet(EvibesViewSet):
serializer = BulkAddWishlistProductSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
try:
wishlist = Wishlist.objects.get(uuid=kwargs.get("pk"))
wishlist = self.get_object()
if not (request.user.has_perm("core.change_wishlist") or request.user == wishlist.user):
raise PermissionDenied(permission_denied_message)
@ -988,7 +995,7 @@ class WishlistViewSet(EvibesViewSet):
serializer = BulkRemoveWishlistProductSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
try:
wishlist = Wishlist.objects.get(uuid=kwargs.get("pk"))
wishlist = self.get_object()
if not (request.user.has_perm("core.change_wishlist") or request.user == wishlist.user):
raise PermissionDenied(permission_denied_message)
@ -1035,7 +1042,7 @@ class AddressViewSet(EvibesViewSet):
def retrieve(self, request: Request, *args, **kwargs) -> Response:
try:
address = Address.objects.get(uuid=kwargs.get("pk"))
address = Address.objects.get(uuid=str(kwargs.get("pk")))
return Response(status=status.HTTP_200_OK, data=self.get_serializer(address).data)
except Address.DoesNotExist:
return Response(status=status.HTTP_404_NOT_FOUND)
@ -1064,9 +1071,9 @@ class AddressViewSet(EvibesViewSet):
try:
suggestions = fetch_address_suggestions(query=q, limit=limit)
serializer = AddressSuggestionSerializer(suggestions, many=True)
suggestion_serializer = AddressSuggestionSerializer(suggestions, many=True)
return Response(
serializer.data,
suggestion_serializer.data,
status=status.HTTP_200_OK,
)
except Exception as e:

View file

@ -1,14 +1,17 @@
import json
from typing import Any
from typing import Any, Mapping
from django import forms
from django.forms.renderers import DjangoTemplates
from django.core.files.uploadedfile import UploadedFile
from django.forms.renderers import BaseRenderer
from django.utils.datastructures import MultiValueDict
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]):
def format_value(self, value: str | dict[str, Any]) -> str | dict[str, Any]: # type: ignore [override]
if isinstance(value, dict):
return value
try:
@ -19,18 +22,23 @@ class JSONTableWidget(forms.Widget):
return value
def render(
self, name: str, value: str | dict[str, Any], attrs: dict | None = None, renderer: DjangoTemplates | None = None
):
self,
name: str,
value: str | dict[str, Any],
attrs: dict[str, Any] | None = None,
renderer: BaseRenderer | None = None,
) -> SafeString:
value = self.format_value(value)
return super().render(name, value, attrs, renderer)
# noinspection PyUnresolvedReferences
def value_from_datadict(self, data: dict[str, Any], files: list, name: str):
def value_from_datadict(
self, data: Mapping[str, Any], files: MultiValueDict[str, UploadedFile], name: str
) -> str | None:
json_data = {}
try:
keys = data.getlist(f"{name}_key")
values = data.getlist(f"{name}_value")
keys = data.getlist(f"{name}_key") # type: ignore [attr-defined]
values = data.getlist(f"{name}_value") # type: ignore [attr-defined]
for key, value in zip(keys, values, strict=True):
if key.strip():
try:

View file

@ -1,3 +1,4 @@
from typing import Any
from urllib.parse import urlparse
from storages.backends.ftp import FTPStorage
@ -7,7 +8,7 @@ class AbsoluteFTPStorage(FTPStorage): # type: ignore
# noinspection PyProtectedMember
# noinspection PyUnresolvedReferences
def _get_config(self):
def _get_config(self) -> Any:
cfg = super()._get_config()
url = urlparse(self.location)
cfg["path"] = url.path or cfg["path"]

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: EVIBES 3.0.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-10-13 13:56+0300\n"
"POT-Creation-Date: 2025-10-13 18:49+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"
@ -38,106 +38,110 @@ msgid "Phone number of the company"
msgstr "رقم هاتف الشركة"
#: evibes/settings/constance.py:28
msgid "!!!DO NOT CHANGE"
msgstr "!!!لا تغير"
#: evibes/settings/constance.py:29
msgid "SMTP host"
msgstr "مضيف SMTP"
#: evibes/settings/constance.py:29
#: evibes/settings/constance.py:30
msgid "SMTP port"
msgstr "منفذ SMTP"
#: evibes/settings/constance.py:30
#: evibes/settings/constance.py:31
msgid "Use TLS (0=No, 1=Yes)"
msgstr "استخدام TLS"
#: evibes/settings/constance.py:31
#: evibes/settings/constance.py:32
msgid "Use SSL (0=No, 1=Yes)"
msgstr "استخدام SSL"
#: evibes/settings/constance.py:32
#: evibes/settings/constance.py:33
msgid "SMTP username"
msgstr "اسم مستخدم SMTP"
#: evibes/settings/constance.py:33
#: evibes/settings/constance.py:34
msgid "SMTP password"
msgstr "كلمة مرور SMTP"
#: evibes/settings/constance.py:34
#: evibes/settings/constance.py:35
msgid "Mail from option"
msgstr "عنوان مرسل البريد الإلكتروني"
#: evibes/settings/constance.py:35
#: evibes/settings/constance.py:36
msgid "Payment gateway URL"
msgstr "عنوان URL لبوابة الدفع"
#: evibes/settings/constance.py:36
#: evibes/settings/constance.py:37
msgid "Payment gateway token"
msgstr "الرمز المميز لبوابة الدفع"
#: evibes/settings/constance.py:37
#: evibes/settings/constance.py:38
msgid "Payment gateway minimum amount"
msgstr "الحد الأدنى لمبلغ بوابة الدفع"
#: evibes/settings/constance.py:38
#: evibes/settings/constance.py:39
msgid "Payment gateway maximum amount"
msgstr "الحد الأقصى لمبلغ بوابة الدفع"
#: evibes/settings/constance.py:39
#: evibes/settings/constance.py:40
msgid "Exchange rate API key"
msgstr "مفتاح API لسعر الصرف"
#: evibes/settings/constance.py:40
#: evibes/settings/constance.py:41
msgid "OpenStreetMap Nominatim API URL"
msgstr "عنوان URL لواجهة برمجة تطبيقات OpenStreetMap Nominatim"
#: evibes/settings/constance.py:41
#: evibes/settings/constance.py:42
msgid "OpenAI API Key"
msgstr "مفتاح واجهة برمجة تطبيقات OpenAI"
#: evibes/settings/constance.py:42
#: evibes/settings/constance.py:43
msgid "Abstract API Key"
msgstr "مفتاح واجهة برمجة التطبيقات المجردة"
#: evibes/settings/constance.py:43
#: evibes/settings/constance.py:44
msgid "HTTP Proxy"
msgstr "وكيل HTTP"
#: evibes/settings/constance.py:44
#: evibes/settings/constance.py:45
msgid "Disable buy functionality"
msgstr "تعطيل وظيفة الشراء"
#: evibes/settings/constance.py:45
#: evibes/settings/constance.py:46
msgid "An entity for storing advertisiment data"
msgstr "كيان لتخزين بيانات الإعلانات"
#: evibes/settings/constance.py:46
#: evibes/settings/constance.py:47
msgid "An entity for storing analytics data"
msgstr "كيان لتخزين بيانات التحليلات"
#: evibes/settings/constance.py:47
#: evibes/settings/constance.py:48
msgid "Save responses from vendors' APIs"
msgstr "حفظ الاستجابات من واجهات برمجة تطبيقات البائعين"
#: evibes/settings/constance.py:53
#: evibes/settings/constance.py:54
msgid "General Options"
msgstr "الخيارات العامة"
#: evibes/settings/constance.py:61
#: evibes/settings/constance.py:62
msgid "Email Options"
msgstr "خيارات البريد الإلكتروني"
#: evibes/settings/constance.py:70
#: evibes/settings/constance.py:72
msgid "Payment Gateway Options"
msgstr "خيارات بوابة الدفع"
#: evibes/settings/constance.py:77
#: evibes/settings/constance.py:79
msgid "Features Options"
msgstr "خيارات الميزات"
#: evibes/settings/constance.py:84
#: evibes/settings/constance.py:86
msgid "SEO Options"
msgstr "خيارات تحسين محركات البحث"
#: evibes/settings/constance.py:88
#: evibes/settings/constance.py:90
msgid "Debugging Options"
msgstr "خيارات التصحيح"

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