Features:

1) Userless orders will be merged on user's registration by their phone number and/or email. Added Viewset action "merge_recently_viewed" so recently viewed products may be stored on server's side.
2) Added comprehensive products' filtering by category(support for including subcategories)
Fixes: I18N
This commit is contained in:
Egor Pavlovich Gorbunov 2025-06-10 05:40:07 +03:00
parent e7bf6cf912
commit 18f3b9d2e8
87 changed files with 5937 additions and 3926 deletions

View file

@ -5,6 +5,7 @@ import uuid
from django.db.models import Avg, FloatField, OuterRef, Q, Subquery, Value
from django.db.models.functions import Coalesce
from django.utils.http import urlsafe_base64_decode
from django.utils.translation import gettext_lazy as _
from django_filters import (
BaseInFilter,
BooleanFilter,
@ -33,20 +34,27 @@ class CaseInsensitiveListFilter(BaseInFilter, CharFilter):
class ProductFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label="UUID")
name = CharFilter(field_name="name", lookup_expr="icontains", label="Name")
categories = CaseInsensitiveListFilter(field_name="category__name", label="Categories")
category_uuid = CharFilter(field_name="category__uuid", lookup_expr="exact", label="Category")
category_slugs = CaseInsensitiveListFilter(field_name="category__slug", label="Categories Slug")
tags = CaseInsensitiveListFilter(field_name="tags__tag_name", label="Tags")
min_price = NumberFilter(field_name="stocks__price", lookup_expr="gte", label="Min Price")
max_price = NumberFilter(field_name="stocks__price", lookup_expr="lte", label="Max Price")
is_active = BooleanFilter(field_name="is_active", label="Is Active")
brand = CharFilter(field_name="brand__name", lookup_expr="iexact", label="Brand")
attributes = CharFilter(method="filter_attributes", label="Attributes")
quantity = NumberFilter(field_name="stocks__quantity", lookup_expr="gt", label="Quantity")
slug = CharFilter(field_name="slug", lookup_expr="exact", label="Slug")
is_digital = BooleanFilter(field_name="is_digital", label="Is Digital")
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID"))
name = CharFilter(field_name="name", lookup_expr="icontains", label=_("Name"))
categories = CaseInsensitiveListFilter(field_name="category__name", label=_("Categories"))
category_uuid = CharFilter(
method="filter_category",
label="Category (UUID)"
)
categories_slugs = CaseInsensitiveListFilter(field_name="category__slug", label=_("Categories Slugs"))
tags = CaseInsensitiveListFilter(field_name="tags__tag_name", label=_("Tags"))
min_price = NumberFilter(field_name="stocks__price", lookup_expr="gte", label=_("Min Price"))
max_price = NumberFilter(field_name="stocks__price", lookup_expr="lte", label=_("Max Price"))
is_active = BooleanFilter(field_name="is_active", label=_("Is Active"))
brand = CharFilter(field_name="brand__name", lookup_expr="iexact", label=_("Brand"))
attributes = CharFilter(method="filter_attributes", label=_("Attributes"))
quantity = NumberFilter(field_name="stocks__quantity", lookup_expr="gt", label=_("Quantity"))
slug = CharFilter(field_name="slug", lookup_expr="exact", label=_("Slug"))
is_digital = BooleanFilter(field_name="is_digital", label=_("Is Digital"))
include_subcategories = BooleanFilter(
method="filter_include_flag",
label=_("Include sub-categories")
)
order_by = OrderingFilter(
fields=(
@ -101,6 +109,10 @@ class ProductFilter(FilterSet):
)
)
def filter_include_flag(self, queryset, name, value):
# just a placeholder method
return queryset
def filter_attributes(self, queryset, _name, value):
if not value:
return queryset
@ -163,6 +175,24 @@ class ProductFilter(FilterSet):
return queryset
def filter_category(self, queryset, name, value):
if not value:
return queryset
include = self.data.get("include_subcategories")
include_children = str(include).lower() in ("1", "true", "t", "yes")
try:
root = Category.objects.get(uuid=value)
except Category.DoesNotExist:
return queryset.none()
if include_children:
descendants = root.get_descendants(include_self=True)
return queryset.filter(category__in=descendants)
else:
return queryset.filter(category__uuid=value)
@staticmethod
def _infer_type(value):
try:
@ -189,21 +219,12 @@ class ProductFilter(FilterSet):
@property
def qs(self):
"""
Override the queryset property to annotate a rating field
when the ordering parameters include rating. This makes ordering
by rating possible.
"""
qs = super().qs
# Check if ordering by rating is requested (could be "rating" or "-rating")
ordering_param = self.data.get("order_by", "")
if ordering_param:
order_fields = [field.strip() for field in ordering_param.split(",")]
if any(field.lstrip("-") == "rating" for field in order_fields):
# Annotate each product with its average rating.
# Here we use a Subquery to calculate the average rating from the Feedback model.
# Adjust the filter in Feedback.objects.filter(...) if your relationships differ.
feedback_qs = (
Feedback.objects.filter(order_product__product_id=OuterRef("pk"))
.values("order_product__product_id")
@ -220,26 +241,18 @@ class ProductFilter(FilterSet):
class OrderFilter(FilterSet):
search = CharFilter(
method='filter_search',
label='Search (ID, product name or part number)',
method="filter_search",
label=_("Search (ID, product name or part number)"),
)
min_buy_time = DateTimeFilter(
field_name='buy_time',
lookup_expr='gte',
label='Bought after (inclusive)'
)
max_buy_time = DateTimeFilter(
field_name='buy_time',
lookup_expr='lte',
label='Bought before (inclusive)'
)
min_buy_time = DateTimeFilter(field_name="buy_time", lookup_expr="gte", label=_("Bought after (inclusive)"))
max_buy_time = DateTimeFilter(field_name="buy_time", lookup_expr="lte", label=_("Bought before (inclusive)"))
uuid = UUIDFilter(field_name='uuid', lookup_expr='exact')
user_email = CharFilter(field_name='user__email', lookup_expr='iexact')
user = UUIDFilter(field_name='user__uuid', lookup_expr='exact')
status = CharFilter(field_name='status', lookup_expr='icontains', label='Status')
human_readable_id = CharFilter(field_name='human_readable_id', lookup_expr='exact')
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"))
status = CharFilter(field_name="status", lookup_expr="icontains", label=_("Status"))
human_readable_id = CharFilter(field_name="human_readable_id", lookup_expr="exact", label=_("Human Readable ID"))
order_by = OrderingFilter(
fields=(
@ -270,21 +283,17 @@ class OrderFilter(FilterSet):
]
def filter_search(self, queryset, _name, value):
return (
queryset
.filter(
Q(human_readable_id__icontains=value) |
Q(order_products__product__name__icontains=value) |
Q(order_products__product__partnumber__icontains=value)
)
.distinct()
)
return queryset.filter(
Q(human_readable_id__icontains=value)
| Q(order_products__product__name__icontains=value)
| Q(order_products__product__partnumber__icontains=value)
).distinct()
class WishlistFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
user_email = CharFilter(field_name="user__email", lookup_expr="iexact")
user = UUIDFilter(field_name="user__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"))
order_by = OrderingFilter(
fields=(("uuid", "uuid"), ("created", "created"), ("modified", "modified"), ("?", "random"))
@ -297,9 +306,10 @@ class WishlistFilter(FilterSet):
class CategoryFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
name = CharFilter(field_name="name", lookup_expr="icontains")
parent_uuid = CharFilter(method="filter_parent_uuid")
slug = CharFilter(field_name="slug", lookup_expr="exact")
name = CharFilter(field_name="name", lookup_expr="icontains", label=_("Name"))
parent_uuid = CharFilter(method="filter_parent_uuid", label=_("Parent"))
slug = CharFilter(field_name="slug", lookup_expr="exact", label=_("Slug"))
tags = CaseInsensitiveListFilter(field_name="tags__tag_name", label=_("Tags"))
order_by = OrderingFilter(
fields=(
@ -311,13 +321,9 @@ class CategoryFilter(FilterSet):
class Meta:
model = Category
fields = ["uuid", "name", "parent_uuid", "slug"]
fields = ["uuid", "name", "parent_uuid", "slug", "tags"]
def filter_parent_uuid(self, queryset, _name, value):
"""
If ?parent_uuid= or ?parent_uuid=null, return items with parent=None.
Otherwise treat `value` as a real UUID and filter parent__uuid=value.
"""
if value in ("", "null", "None"):
return queryset.filter(parent=None)
@ -331,8 +337,8 @@ class CategoryFilter(FilterSet):
class BrandFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
name = CharFilter(field_name="name", lookup_expr="icontains")
categories = CaseInsensitiveListFilter(field_name="categories__uuid", lookup_expr="exact")
name = CharFilter(field_name="name", lookup_expr="icontains", label=_("Name"))
categories = CaseInsensitiveListFilter(field_name="categories__uuid", lookup_expr="exact", label=_("Categories"))
order_by = OrderingFilter(
fields=(
@ -348,9 +354,9 @@ class BrandFilter(FilterSet):
class FeedbackFilter(FilterSet):
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact")
product_uuid = UUIDFilter(field_name="order_product__product__uuid", lookup_expr="exact")
user_uuid = UUIDFilter(field_name="order_product__order__user__uuid", lookup_expr="exact")
uuid = UUIDFilter(field_name="uuid", lookup_expr="exact", label=_("UUID"))
product_uuid = UUIDFilter(field_name="order_product__product__uuid", lookup_expr="exact", label=_("Product UUID"))
user_uuid = UUIDFilter(field_name="order_product__order__user__uuid", lookup_expr="exact", label=_("User UUID"))
order_by = OrderingFilter(
fields=(

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -12,28 +12,29 @@ class Command(BaseCommand):
def add_arguments(self, parser):
parser.add_argument(
'-b', '--base-dir',
"-b",
"--base-dir",
default=settings.BASE_DIR,
help="Root directory to start searching for .po files (default: settings.BASE_DIR)."
help="Root directory to start searching for .po files (default: settings.BASE_DIR).",
)
def handle(self, *args, **options):
base_dir = options['base_dir']
for root, dirs, files in os.walk(base_dir):
base_dir = options["base_dir"]
for root, _dirs, files in os.walk(base_dir):
for fname in files:
if not fname.endswith('.po'):
if not fname.endswith(".po"):
continue
path = os.path.join(root, fname)
self.stdout.write(f"→ Processing {path}")
self._clean_po_file(path)
def _clean_po_file(self, filepath):
with open(filepath, 'r', encoding='utf-8') as f:
with open(filepath, encoding="utf-8") as f:
lines = f.readlines()
entries, curr = [], []
for line in lines:
if line.strip() == '':
if line.strip() == "":
if curr:
entries.append(curr)
curr = []
@ -48,33 +49,30 @@ class Command(BaseCommand):
for ent in entries:
if ent and ent[0].startswith('msgid ""'):
new_lines.extend(ent)
new_lines.append('\n')
new_lines.append("\n")
continue
fuzzy_idx = next(
(i for i, l in enumerate(ent) if l.startswith('#,') and 'fuzzy' in l),
None
)
fuzzy_idx = next((i for i, line in enumerate(ent) if line.startswith("#,") and "fuzzy" in line), None)
if fuzzy_idx is not None:
flag_line = ent[fuzzy_idx]
remaining = [f.strip() for f in flag_line[2:].split(',') if f.strip() != 'fuzzy']
remaining = [f.strip() for f in flag_line[2:].split(",") if f.strip() != "fuzzy"]
if remaining:
ent[fuzzy_idx] = '#, ' + ', '.join(remaining) + '\n'
ent[fuzzy_idx] = "#, " + ", ".join(remaining) + "\n"
else:
del ent[fuzzy_idx]
ent = [l for l in ent if not l.startswith('#| msgid')]
ent = [line for line in ent if not line.startswith("#| msgid")]
ent = ['msgstr ""\n' if l.startswith('msgstr') else l for l in ent]
ent = ['msgstr ""\n' if line.startswith("msgstr") else line for line in ent]
changed = True
new_lines.extend(ent)
new_lines.append('\n')
new_lines.append("\n")
if changed:
with open(filepath, 'w', encoding='utf-8') as f:
with open(filepath, "w", encoding="utf-8") as f:
f.writelines(new_lines)
self.stdout.write(self.style.SUCCESS(f" → Updated {filepath}"))
else:
self.stdout.write(f" (no fuzzy entries found)")
self.stdout.write(" (no fuzzy entries found)")

View file

@ -10,17 +10,9 @@ logger = logging.getLogger("django.request")
class AddressManager(models.Manager):
def create(self, raw_data: str, **kwargs):
"""
Create an Address instance by geocoding the provided raw address string.
Args:
raw_data (str): The raw address input from the user (e.g., '36 Mornington Rd Loughton England').
**kwargs: Additional fields to pass to the Address model (e.g., user).
"""
if not raw_data:
raise ValueError("'raw_data' (address string) must be provided.")
# Query Nominatim
params = {
"format": "json",
"addressdetails": 1,
@ -33,7 +25,6 @@ class AddressManager(models.Manager):
raise ValueError(f"No geocoding result for address: {raw_data}")
data = results[0]
# Parse address components
addr = data.get("address", {})
street = f"{addr.get('road', '') or addr.get('pedestrian', '')}, {addr.get('house_number', '')}"
district = addr.get("city_district") or addr.get("suburb") or ""
@ -42,7 +33,6 @@ class AddressManager(models.Manager):
postal_code = addr.get("postcode") or ""
country = addr.get("country") or ""
# Parse location
try:
lat = float(data.get("lat"))
lon = float(data.get("lon"))
@ -51,16 +41,15 @@ class AddressManager(models.Manager):
location = None
try:
address_line_1 = kwargs.pop('address_line_1')
except KeyError:
address_line_1 = kwargs.pop("address_line_1")
except KeyError as e:
raise ValueError("Missing required field 'address_line_1'") from e
try:
address_line_2 = kwargs.pop('address_line_2')
address_line_2 = kwargs.pop("address_line_2")
except KeyError:
address_line_2 = ""
# Create the model instance, storing both the input string and full API response
return super().get_or_create(
raw_data=raw_data,
address_line=f"{address_line_1}, {address_line_2}",
@ -70,6 +59,6 @@ class AddressManager(models.Manager):
region=region,
postal_code=postal_code,
country=country,
user=kwargs.pop('user'),
user=kwargs.pop("user"),
defaults={"api_response": data, "location": location},
)[0]

View file

@ -206,6 +206,12 @@ class Category(ExportModelOperationsMixin("category"), NiceModel, MPTTModel):
editable=False,
null=True,
)
tags = ManyToManyField(
"core.CategoryTag",
blank=True,
help_text=_("tags that help describe or group this category"),
verbose_name=_("category tags"),
)
def __str__(self):
return self.name
@ -550,8 +556,9 @@ class Order(ExportModelOperationsMixin("order"), NiceModel):
def total_quantity(self) -> int:
return sum([op.quantity for op in self.order_products.all()])
def add_product(self, product_uuid: str | None = None, attributes: Optional[list] = None,
update_quantity: bool = True):
def add_product(
self, product_uuid: str | None = None, attributes: Optional[list] = None, update_quantity: bool = True
):
if attributes is None:
attributes = []
@ -952,6 +959,31 @@ class ProductTag(ExportModelOperationsMixin("product_tag"), NiceModel):
verbose_name_plural = _("product tags")
class CategoryTag(ExportModelOperationsMixin("category_tag"), NiceModel):
is_publicly_visible = True
tag_name = CharField(
blank=False,
null=False,
max_length=255,
help_text=_("internal tag identifier for the product tag"),
verbose_name=_("tag name"),
)
name = CharField(
max_length=255,
help_text=_("user-friendly name for the product tag"),
verbose_name=_("tag display name"),
unique=True,
)
def __str__(self):
return self.tag_name
class Meta:
verbose_name = _("category tag")
verbose_name_plural = _("category tags")
class ProductImage(ExportModelOperationsMixin("product_image"), NiceModel):
is_publicly_visible = True

View file

@ -49,7 +49,7 @@ class EvibesPermission(permissions.BasePermission):
if action == "create" and view.additional.get("create") == "ALLOW":
return True
if action == 'retrieve' and view.additional.get("retrieve") == "ALLOW":
if action == "retrieve" and view.additional.get("retrieve") == "ALLOW":
return True
if action in self.USER_SCOPED_ACTIONS:
@ -75,8 +75,12 @@ class EvibesPermission(permissions.BasePermission):
return bool(perm_prefix and request.user.has_perm(f"{app_label}.{perm_prefix}_{model_name}"))
perm_prefix = self.ACTION_PERM_MAP.get(view.action)
return bool(perm_prefix and request.user.has_perm(
f"{view.queryset.model._meta.app_label}.{perm_prefix}_{view.queryset.model._meta.model_name}"))
return bool(
perm_prefix
and request.user.has_perm(
f"{view.queryset.model._meta.app_label}.{perm_prefix}_{view.queryset.model._meta.model_name}"
)
)
def has_queryset_permission(self, request, view, queryset):
model = view.queryset.model

View file

@ -1,3 +1,4 @@
from django.utils.translation import gettext_lazy as _
from rest_framework.exceptions import ValidationError
from rest_framework.fields import CharField, DictField, FloatField, IntegerField
from rest_framework.serializers import ModelSerializer, Serializer

View file

@ -1,7 +1,17 @@
from modeltranslation.decorators import register
from modeltranslation.translator import TranslationOptions
from core.models import Attribute, AttributeGroup, AttributeValue, Brand, Category, Product, ProductTag, Promotion
from core.models import (
Attribute,
AttributeGroup,
AttributeValue,
Brand,
Category,
CategoryTag,
Product,
ProductTag,
Promotion,
)
@register(AttributeGroup)
@ -39,6 +49,11 @@ class ProductTagOptions(TranslationOptions):
fields = ("name",)
@register(CategoryTag)
class CategoryTagOptions(TranslationOptions):
fields = ("name",)
@register(Promotion)
class PromotionOptions(TranslationOptions):
fields = ("name", "description")

View file

@ -229,10 +229,12 @@ class ProductViewSet(EvibesViewSet):
lookup_val = kwargs.get(self.lookup_field)
try:
product = Product.objects.get(uuid=lookup_val)
feedbacks = Feedback.objects.filter(order_product__product=product) if request.user.has_perm(
"core.view_feedback") else Feedback.objects.filter(order_product__product=product, is_active=True)
return Response(
data=FeedbackDetailSerializer(feedbacks, many=True).data)
feedbacks = (
Feedback.objects.filter(order_product__product=product)
if request.user.has_perm("core.view_feedback")
else Feedback.objects.filter(order_product__product=product, is_active=True)
)
return Response(data=FeedbackDetailSerializer(feedbacks, many=True).data)
except Product.DoesNotExist:
name = "Product"
return Response(status=status.HTTP_404_NOT_FOUND, data={"detail": _(f"{name} does not exist: {uuid}")})
@ -267,8 +269,8 @@ class FeedbackViewSet(EvibesViewSet):
@extend_schema_view(**ORDER_SCHEMA)
class OrderViewSet(EvibesViewSet):
lookup_field = 'lookup_value'
lookup_url_kwarg = 'lookup_value'
lookup_field = "lookup_value"
lookup_url_kwarg = "lookup_value"
queryset = Order.objects.prefetch_related("order_products").all()
filter_backends = [DjangoFilterBackend]
filterset_class = OrderFilter
@ -279,9 +281,7 @@ class OrderViewSet(EvibesViewSet):
"add_order_product": AddOrderProductSerializer,
"remove_order_product": RemoveOrderProductSerializer,
}
additional = {
"retrieve": "ALLOW"
}
additional = {"retrieve": "ALLOW"}
def get_serializer_class(self):
return self.action_serializer_classes.get(self.action, super().get_serializer_class())
@ -308,10 +308,7 @@ class OrderViewSet(EvibesViewSet):
except ValueError:
uuid_q = Q()
obj = get_object_or_404(
qs,
uuid_q | Q(human_readable_id=lookup_val)
)
obj = get_object_or_404(qs, uuid_q | Q(human_readable_id=lookup_val))
self.check_object_permissions(self.request, obj)
return obj

View file

@ -11,7 +11,7 @@ from core.views import CustomGraphQLView, CustomRedocView, CustomSwaggerView, fa
from evibes.settings import SPECTACULAR_PLATFORM_SETTINGS
urlpatterns = [
path('prometheus/', include('django_prometheus.urls')),
path("prometheus/", include("django_prometheus.urls")),
path(r"graphql/", csrf_exempt(CustomGraphQLView.as_view(graphiql=True, schema=schema))),
path(
r"docs/",

View file

@ -8,7 +8,7 @@ from evibes.settings import SPECTACULAR_B2B_SETTINGS
urlpatterns = [
# path(r'graphql/', csrf_exempt(CustomGraphQLView.as_view(graphiql=True, schema=schema))),
path('prometheus/', include('django_prometheus.urls')),
path("prometheus/", include("django_prometheus.urls")),
path(
r"docs/",
SpectacularAPIView.as_view(urlconf="evibes.b2b_urls", custom_settings=SPECTACULAR_B2B_SETTINGS),

View file

@ -69,15 +69,17 @@ class BlockInvalidHostMiddleware:
self.get_response = get_response
def __call__(self, request):
allowed_hosts = ["app:8000",
"worker:8000",
"beat:8000",
"localhost:8000",
"api.localhost:8000",
"b2b.localhost:8000",
"127.0.0.1:8000",
"api.127.0.0.1:8000",
"b2b.127.0.0.1:8000"]
allowed_hosts = [
"app:8000",
"worker:8000",
"beat:8000",
"localhost:8000",
"api.localhost:8000",
"b2b.localhost:8000",
"127.0.0.1:8000",
"api.127.0.0.1:8000",
"b2b.127.0.0.1:8000",
]
if DEBUG:
allowed_hosts += ["*"]

View file

@ -2,22 +2,24 @@ import logging
from os import getenv
from pathlib import Path
EVIBES_VERSION = "2.8.0"
EVIBES_VERSION = "2.8.5"
BASE_DIR = Path(__file__).resolve().parent.parent.parent
SECRET_KEY = getenv("SECRET_KEY")
DEBUG = bool(int(getenv("DEBUG")))
ALLOWED_HOSTS = ["app:8000",
"worker:8000",
"beat:8000",
"localhost:8000",
"api.localhost:8000",
"b2b.localhost:8000",
"127.0.0.1:8000",
"api.127.0.0.1:8000",
"b2b.127.0.0.1:8000"]
ALLOWED_HOSTS = [
"app:8000",
"worker:8000",
"beat:8000",
"localhost:8000",
"api.localhost:8000",
"b2b.localhost:8000",
"127.0.0.1:8000",
"api.127.0.0.1:8000",
"b2b.127.0.0.1:8000",
]
if DEBUG:
ALLOWED_HOSTS += ["*"]
@ -126,7 +128,7 @@ MIDDLEWARE = [
"evibes.middleware.CustomLocaleMiddleware",
"django_hosts.middleware.HostsResponseMiddleware",
"djangorestframework_camel_case.middleware.CamelCaseMiddleWare",
"django_prometheus.middleware.PrometheusAfterMiddleware"
"django_prometheus.middleware.PrometheusAfterMiddleware",
]
TEMPLATES = [

8
poetry.lock generated
View file

@ -4496,13 +4496,13 @@ xmlsec = ["xmlsec (>=0.6.1)"]
[[package]]
name = "zipp"
version = "3.22.0"
version = "3.23.0"
description = "Backport of pathlib-compatible object wrapper for zip files"
optional = false
python-versions = ">=3.9"
files = [
{ file = "zipp-3.22.0-py3-none-any.whl", hash = "sha256:fe208f65f2aca48b81f9e6fd8cf7b8b32c26375266b009b413d45306b6148343" },
{ file = "zipp-3.22.0.tar.gz", hash = "sha256:dd2f28c3ce4bc67507bfd3781d21b7bb2be31103b51a4553ad7d90b84e57ace5" },
{ file = "zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e" },
{ file = "zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166" },
]
[package.extras]
@ -4510,7 +4510,7 @@ check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"]
cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"]
enabler = ["pytest-enabler (>=2.2)"]
test = ["big-O", "importlib_resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
test = ["big-O", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more_itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"]
type = ["pytest-mypy"]
[extras]

View file

@ -1,6 +1,6 @@
[tool.poetry]
name = "eVibes"
version = "2.8.0"
version = "2.8.5"
description = "eVibes is an open-source eCommerce backend service built with Django. Its designed for flexibility, making it ideal for various use cases and learning Django skills. The project is easy to customize, allowing for straightforward editing and extension."
authors = ["fureunoir <contact@fureunoir.com>"]
readme = "README.md"

View file

@ -6,6 +6,7 @@ from core.docs.drf import BASE_ERRORS
from vibes_auth.serializers import (
ActivateEmailSerializer,
ConfirmPasswordResetSerializer,
MergeRecentlyViewedSerializer,
ResetPasswordSerializer,
UserSerializer,
)
@ -38,8 +39,7 @@ USER_SCHEMA = {
request={
"multipart/form-data": {
"type": "object",
"properties": {
"avatar": {"type": "string", "format": "binary"}},
"properties": {"avatar": {"type": "string", "format": "binary"}},
},
},
responses={
@ -67,4 +67,12 @@ USER_SCHEMA = {
**BASE_ERRORS,
},
),
"merge_recently_viewed": extend_schema(
summary=_("merge client-stored recently viewed products"),
request=MergeRecentlyViewedSerializer,
responses={
status.HTTP_202_ACCEPTED: UserSerializer,
**BASE_ERRORS,
},
),
}

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -74,29 +74,29 @@ msgstr "التحقق من الرمز المميز (التحديث أو الوص
msgid "the token is valid"
msgstr "الرمز المميز صالح"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "إنشاء مستخدم جديد"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "استرداد تفاصيل المستخدم"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "تحديث تفاصيل المستخدم"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "حذف مستخدم"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
"إعادة تعيين كلمة مرور المستخدم عن طريق إرسال بريد إلكتروني لإعادة تعيين كلمة "
"المرور"
"إعادة تعيين كلمة مرور المستخدم عن طريق إرسال بريد إلكتروني لإعادة تعيين كلمة"
" المرور"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "التعامل مع تحميل الصورة الرمزية للمستخدم"
@ -105,7 +105,7 @@ msgid "confirm a user's password reset"
msgstr "تأكيد إعادة تعيين كلمة مرور المستخدم"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "كلمات المرور غير متطابقة"
@ -117,6 +117,10 @@ msgstr "تنشيط حساب مستخدم"
msgid "activation link is invalid or account already activated"
msgstr "رابط التفعيل غير صالح أو أن الحساب مفعل بالفعل"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "دمج المنتجات التي تم عرضها مؤخراً المخزنة لدى العميل"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr "معرّف المستخدم الذي تم ترميزه بـ b64 الذي أحال المستخدم الجديد إلينا."
@ -144,8 +148,8 @@ msgstr "رقم هاتف مشوّه: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "تنسيق السمة غير صالح: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "رابط التفعيل غير صالح!"
@ -157,14 +161,14 @@ msgstr "تم تفعيل الحساب بالفعل..."
msgid "something went wrong: {e!s}"
msgstr "حدث خطأ ما: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "الرمز غير صالح!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"المنتجات التي شاهدها هذا المستخدم مؤخرًا (بحد أقصى 48)، بترتيب زمني عكسي."
@ -277,23 +281,23 @@ msgstr "الرمز المميز المدرج في القائمة السوداء"
msgid "blacklisted tokens"
msgstr "الرموز المميزة المدرجة في القائمة السوداء"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "لم يتم العثور على حساب نشط"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "تم إدراج الرمز المميز في القائمة السوداء"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "رمز غير صالح"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "لا توجد مطالبة معرف المستخدم في الرمز المميز"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "المستخدم غير موجود"
@ -416,10 +420,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "الرمز المميز غير صالح"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "تمت إعادة تعيين كلمة المرور بنجاح!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "لقد قمت بتفعيل الحساب بالفعل..."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -74,27 +74,27 @@ msgstr "Ověření tokenu (obnovení nebo přístup)."
msgid "the token is valid"
msgstr "Token je platný"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Vytvoření nového uživatele"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Získání údajů o uživateli"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Aktualizace údajů uživatele"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Odstranění uživatele"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr "Obnovení hesla uživatele odesláním e-mailu s obnovením hesla."
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Zpracování nahrávání avataru pro uživatele"
@ -103,7 +103,7 @@ msgid "confirm a user's password reset"
msgstr "Potvrzení obnovení hesla uživatele"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Hesla se neshodují"
@ -115,6 +115,10 @@ msgstr "Aktivace účtu uživatele"
msgid "activation link is invalid or account already activated"
msgstr "Aktivační odkaz je neplatný nebo je účet již aktivován"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "Sloučení naposledy zobrazených produktů uložených u klienta"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr "Uuid uživatele s kódem b64, který nám nového uživatele doporučil."
@ -142,8 +146,8 @@ msgstr "Chybně zadané telefonní číslo: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Nesprávný formát atributu: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "Aktivační odkaz je neplatný!"
@ -155,14 +159,14 @@ msgstr "Účet byl již aktivován..."
msgid "something went wrong: {e!s}"
msgstr "Něco se pokazilo: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "Token je neplatný!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"Produkty, které si tento uživatel prohlížel naposledy (max. 48), seřazené v "
"opačném pořadí."
@ -276,23 +280,23 @@ msgstr "Token na černé listině"
msgid "blacklisted tokens"
msgstr "Tokeny na černé listině"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "Nebyl nalezen žádný aktivní účet"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Token na černé listině"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Neplatný token"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "V tokenu není deklarace uuid uživatele"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "Uživatel neexistuje"
@ -376,8 +380,7 @@ msgid ""
"if the button above does not work, please copy and paste the following URL\n"
" into your web browser:"
msgstr ""
"Pokud výše uvedené tlačítko nefunguje, zkopírujte a vložte následující "
"adresu URL\n"
"Pokud výše uvedené tlačítko nefunguje, zkopírujte a vložte následující adresu URL\n"
" do webového prohlížeče:"
#: vibes_auth/templates/user_verification_email.html:101
@ -416,10 +419,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "Token je neplatný"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "Heslo bylo úspěšně resetováno!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "Účet jste již aktivovali..."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -74,29 +74,29 @@ msgstr "Bekræft et token (opdatering eller adgang)."
msgid "the token is valid"
msgstr "Tokenet er gyldigt"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Opret en ny bruger"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Hent oplysninger om en bruger"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Opdater en brugers oplysninger"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Slet en bruger"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
"Nulstil en brugers adgangskode ved at sende en e-mail om nulstilling af "
"adgangskode"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Håndter upload af avatar for en bruger"
@ -105,7 +105,7 @@ msgid "confirm a user's password reset"
msgstr "Bekræft nulstilling af en brugers adgangskode"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Adgangskoderne stemmer ikke overens"
@ -117,6 +117,10 @@ msgstr "Aktivér en brugers konto"
msgid "activation link is invalid or account already activated"
msgstr "Aktiveringslinket er ugyldigt, eller kontoen er allerede aktiveret"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "Flet nyligt viste produkter, der er gemt af klienten"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr "Brugerens b64-kodede uuid, som henviste den nye bruger til os."
@ -144,8 +148,8 @@ msgstr "Misdannet telefonnummer: {phone_number}."
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Ugyldigt attributformat: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "Aktiveringslinket er ugyldigt!"
@ -157,14 +161,14 @@ msgstr "Kontoen er allerede aktiveret..."
msgid "something went wrong: {e!s}"
msgstr "Noget gik galt: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "Token er ugyldig!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"De produkter, som denne bruger har set for nylig (maks. 48), i omvendt "
"kronologisk rækkefølge."
@ -278,23 +282,23 @@ msgstr "Sortlistet token"
msgid "blacklisted tokens"
msgstr "Sortlistede tokens"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "Ingen aktiv konto fundet"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Token blacklistet"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Ugyldigt token"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "Ingen bruger-uuid-krav til stede i token"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "Brugeren findes ikke"
@ -379,8 +383,7 @@ msgid ""
"if the button above does not work, please copy and paste the following URL\n"
" into your web browser:"
msgstr ""
"Hvis ovenstående knap ikke virker, bedes du kopiere og indsætte følgende "
"URL\n"
"Hvis ovenstående knap ikke virker, bedes du kopiere og indsætte følgende URL\n"
" i din webbrowser:"
#: vibes_auth/templates/user_verification_email.html:101
@ -419,10 +422,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "Tokenet er ugyldigt"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "Adgangskoden er blevet nulstillet med succes!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "Du har allerede aktiveret kontoen..."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -75,29 +75,29 @@ msgstr "Überprüfen eines Tokens (Aktualisierung oder Zugriff)."
msgid "the token is valid"
msgstr "Das Token ist gültig"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Einen neuen Benutzer anlegen"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Abrufen der Details eines Benutzers"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Aktualisieren der Benutzerdaten"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Einen Benutzer löschen"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
"Zurücksetzen des Kennworts eines Benutzers durch Senden einer E-Mail zum "
"Zurücksetzen des Kennworts"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Avatar-Upload für einen Benutzer verwalten"
@ -106,7 +106,7 @@ msgid "confirm a user's password reset"
msgstr "Bestätigen Sie das Zurücksetzen des Passworts eines Benutzers"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Passwörter stimmen nicht überein"
@ -118,11 +118,16 @@ msgstr "Aktivieren eines Benutzerkontos"
msgid "activation link is invalid or account already activated"
msgstr "Aktivierungslink ist ungültig oder Konto bereits aktiviert"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr ""
"Zusammenführen der vom Kunden gespeicherten, zuletzt angesehenen Produkte"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr ""
"Die b64-kodierte uuid des Benutzers, der den neuen Benutzer an uns verwiesen "
"hat."
"Die b64-kodierte uuid des Benutzers, der den neuen Benutzer an uns verwiesen"
" hat."
#: vibes_auth/graphene/mutations.py:61
msgid "password too weak"
@ -147,8 +152,8 @@ msgstr "Fehlerhafte Telefonnummer: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Ungültiges Attributformat: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "Der Aktivierungslink ist ungültig!"
@ -160,14 +165,14 @@ msgstr "Das Konto wurde bereits aktiviert..."
msgid "something went wrong: {e!s}"
msgstr "Etwas ist schief gelaufen: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "Token ist ungültig!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"Die Produkte, die dieser Benutzer zuletzt angesehen hat (maximal 48), in "
"umgekehrter chronologischer Reihenfolge."
@ -282,23 +287,23 @@ msgstr "Token auf der schwarzen Liste"
msgid "blacklisted tokens"
msgstr "Token auf der schwarzen Liste"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "Kein aktives Konto gefunden"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Token auf der schwarzen Liste"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Ungültiges Token"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "Kein Benutzer uuid-Anspruch im Token vorhanden"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "Benutzer existiert nicht"
@ -344,8 +349,8 @@ msgstr ""
#: vibes_auth/templates/user_reset_password_email.html:88
msgid "if you did not send this request, please ignore this email."
msgstr ""
"Wenn Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-"
"Mail."
"Wenn Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese "
"E-Mail."
#: vibes_auth/templates/user_reset_password_email.html:89
#, python-format
@ -384,8 +389,7 @@ msgid ""
"if the button above does not work, please copy and paste the following URL\n"
" into your web browser:"
msgstr ""
"Wenn die obige Schaltfläche nicht funktioniert, kopieren Sie bitte die "
"folgende URL und fügen Sie sie in Ihren Browser ein\n"
"Wenn die obige Schaltfläche nicht funktioniert, kopieren Sie bitte die folgende URL und fügen Sie sie in Ihren Browser ein\n"
" in Ihren Webbrowser ein:"
#: vibes_auth/templates/user_verification_email.html:101
@ -424,10 +428,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "Das Token ist ungültig"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "Das Passwort wurde erfolgreich zurückgesetzt!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "Sie haben das Konto bereits aktiviert..."

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -78,27 +78,27 @@ msgstr "Verify a token (refresh or access)."
msgid "the token is valid"
msgstr "The token is valid"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Create a new user"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Retrieve a user's details"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Update a user's details"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Delete a user"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr "Reset a user's password by sending a reset password email"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Handle avatar upload for a user"
@ -107,7 +107,7 @@ msgid "confirm a user's password reset"
msgstr "Confirm a user's password reset"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Passwords do not match"
@ -119,6 +119,10 @@ msgstr "Activate a user's account"
msgid "activation link is invalid or account already activated"
msgstr "Activation link is invalid or account already activated"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "Merge client-stored recently viewed products"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr "The user's b64-encoded uuid who referred the new user to us."
@ -146,8 +150,8 @@ msgstr "Malformed phone number: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Invalid attribute format: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "Activation link is invalid!"
@ -159,14 +163,14 @@ msgstr "Account has been already activated..."
msgid "something went wrong: {e!s}"
msgstr "Something went wrong: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "Token is invalid!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"The products this user has viewed most recently (max 48), in reverse-"
"chronological order."
@ -280,23 +284,23 @@ msgstr "Blacklisted token"
msgid "blacklisted tokens"
msgstr "Blacklisted tokens"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "No active account found"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Token blacklisted"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Invalid token"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "No user uuid claim present in token"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "User does not exist"
@ -419,16 +423,13 @@ msgstr ""
msgid "the token is invalid"
msgstr "The token is invalid"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "Password has been reset successfully!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "You have already activated the account..."
#~ msgid "recently viewed products"
#~ msgstr "Recently viewed products"
#~ msgid "recently viwed"
#~ msgstr "Recently viewed"

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -74,27 +74,27 @@ msgstr "Verify a token (refresh or access)."
msgid "the token is valid"
msgstr "The token is valid"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Create a new user"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Retrieve a user's details"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Update a user's details"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Delete a user"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr "Reset a user's password by sending a reset password email"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Handle avatar upload for a user"
@ -103,7 +103,7 @@ msgid "confirm a user's password reset"
msgstr "Confirm a user's password reset"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Passwords do not match"
@ -115,6 +115,10 @@ msgstr "Activate a user's account"
msgid "activation link is invalid or account already activated"
msgstr "Activation link is invalid or account already activated"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "Merge client-stored recently viewed products"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr "The user's b64-encoded uuid who referred the new user to us."
@ -142,8 +146,8 @@ msgstr "Malformed phone number: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Invalid attribute format: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "Activation link is invalid!"
@ -155,14 +159,14 @@ msgstr "Account has been already activated..."
msgid "something went wrong: {e!s}"
msgstr "Something went wrong: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "Token is invalid!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"The products this user has viewed most recently (max 48), in reverse-"
"chronological order."
@ -276,23 +280,23 @@ msgstr "Blacklisted token"
msgid "blacklisted tokens"
msgstr "Blacklisted tokens"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "No active account found"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Token blacklisted"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Invalid token"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "No user uuid claim present in token"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "User does not exist"
@ -415,10 +419,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "The token is invalid"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "Password has been reset successfully!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "You have already activated the account..."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -74,29 +74,29 @@ msgstr "Verificar un token (actualización o acceso)."
msgid "the token is valid"
msgstr "El token es válido"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Crear un nuevo usuario"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Recuperar los datos de un usuario"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Actualizar los datos de un usuario"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Eliminar un usuario"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
"Restablecer la contraseña de un usuario enviando un correo electrónico de "
"restablecimiento de contraseña"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Gestionar la subida de avatares de un usuario"
@ -105,7 +105,7 @@ msgid "confirm a user's password reset"
msgstr "Confirmar el restablecimiento de la contraseña de un usuario"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Las contraseñas no coinciden"
@ -117,6 +117,10 @@ msgstr "Activar la cuenta de un usuario"
msgid "activation link is invalid or account already activated"
msgstr "El enlace de activación no es válido o la cuenta ya está activada"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "Fusionar productos vistos recientemente almacenados por el cliente"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr ""
@ -145,8 +149,8 @@ msgstr "Número de teléfono malformado: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Formato de atributo no válido: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "El enlace de activación no es válido."
@ -158,14 +162,14 @@ msgstr "La cuenta ya ha sido activada..."
msgid "something went wrong: {e!s}"
msgstr "Algo salió mal: {e!s}."
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "¡La ficha no es válida!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"Los productos que este usuario ha visto más recientemente (máx. 48), en "
"orden cronológico inverso."
@ -279,23 +283,23 @@ msgstr "Ficha en la lista negra"
msgid "blacklisted tokens"
msgstr "Fichas en la lista negra"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "No se ha encontrado ninguna cuenta activa"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Ficha en la lista negra"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Token no válido"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "No user uuid claim present in token"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "El usuario no existe"
@ -418,10 +422,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "El token no es válido"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "La contraseña se ha restablecido correctamente."
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "Ya ha activado la cuenta..."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -76,29 +76,29 @@ msgstr "Vérifier un jeton (rafraîchissement ou accès)."
msgid "the token is valid"
msgstr "Le jeton est valide"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Créer un nouvel utilisateur"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Récupérer les données d'un utilisateur"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Mettre à jour les coordonnées d'un utilisateur"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Supprimer un utilisateur"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
"Réinitialiser le mot de passe d'un utilisateur en envoyant un courriel de "
"réinitialisation du mot de passe"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Gérer le téléchargement d'un avatar pour un utilisateur"
@ -107,7 +107,7 @@ msgid "confirm a user's password reset"
msgstr "Confirmer la réinitialisation du mot de passe d'un utilisateur"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Les mots de passe ne correspondent pas"
@ -119,6 +119,10 @@ msgstr "Activer le compte d'un utilisateur"
msgid "activation link is invalid or account already activated"
msgstr "Le lien d'activation n'est pas valide ou le compte est déjà activé"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "Fusionner les produits récemment consultés stockés par le client"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr ""
@ -148,8 +152,8 @@ msgstr "Numéro de téléphone malformé : {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Format d'attribut non valide : {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "Le lien d'activation n'est pas valide !"
@ -161,17 +165,17 @@ msgstr "Le compte a déjà été activé..."
msgid "something went wrong: {e!s}"
msgstr "Quelque chose a mal tourné : {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "Le jeton n'est pas valide !"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"Les produits que cet utilisateur a consultés le plus récemment (max 48), par "
"ordre chronologique inverse."
"Les produits que cet utilisateur a consultés le plus récemment (max 48), par"
" ordre chronologique inverse."
#: vibes_auth/graphene/object_types.py:41 vibes_auth/models.py:108
msgid "groups"
@ -285,23 +289,24 @@ msgstr "Jeton sur liste noire"
msgid "blacklisted tokens"
msgstr "Jetons sur liste noire"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "Aucun compte actif trouvé"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Token sur liste noire"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Jeton non valide"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "Aucune revendication d'uuid d'utilisateur n'est présente dans le jeton"
msgstr ""
"Aucune revendication d'uuid d'utilisateur n'est présente dans le jeton"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "L'utilisateur n'existe pas"
@ -347,7 +352,8 @@ msgstr ""
#: vibes_auth/templates/user_reset_password_email.html:88
msgid "if you did not send this request, please ignore this email."
msgstr "Si vous n'avez pas envoyé cette demande, veuillez ignorer ce courriel."
msgstr ""
"Si vous n'avez pas envoyé cette demande, veuillez ignorer ce courriel."
#: vibes_auth/templates/user_reset_password_email.html:89
#, python-format
@ -370,8 +376,8 @@ msgid ""
"thank you for signing up for %(project_name)s. please activate your account "
"by clicking the button below:"
msgstr ""
"Merci de vous être inscrit à %(project_name)s. Veuillez activer votre compte "
"en cliquant sur le bouton ci-dessous :"
"Merci de vous être inscrit à %(project_name)s. Veuillez activer votre compte"
" en cliquant sur le bouton ci-dessous :"
#: vibes_auth/templates/user_verification_email.html:95
msgid ""
@ -386,8 +392,7 @@ msgid ""
"if the button above does not work, please copy and paste the following URL\n"
" into your web browser:"
msgstr ""
"Si le bouton ci-dessus ne fonctionne pas, veuillez copier et coller l'URL "
"suivante\n"
"Si le bouton ci-dessus ne fonctionne pas, veuillez copier et coller l'URL suivante\n"
" suivante dans votre navigateur web :"
#: vibes_auth/templates/user_verification_email.html:101
@ -426,10 +431,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "Le jeton n'est pas valide"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "Le mot de passe a été réinitialisé avec succès !"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "Vous avez déjà activé le compte..."

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -77,27 +77,27 @@ msgstr ""
msgid "the token is valid"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr ""
@ -106,7 +106,7 @@ msgid "confirm a user's password reset"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr ""
@ -118,6 +118,10 @@ msgstr ""
msgid "activation link is invalid or account already activated"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr ""
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr ""
@ -145,8 +149,8 @@ msgstr ""
msgid "Invalid attribute format: {attribute_pair}"
msgstr ""
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr ""
@ -158,7 +162,7 @@ msgstr ""
msgid "something went wrong: {e!s}"
msgstr ""
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr ""
@ -277,23 +281,23 @@ msgstr ""
msgid "blacklisted tokens"
msgstr ""
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr ""
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr ""
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr ""
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr ""
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr ""
@ -404,10 +408,10 @@ msgstr ""
msgid "the token is invalid"
msgstr ""
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr ""
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr ""

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -75,29 +75,29 @@ msgstr "Verifica di un token (aggiornamento o accesso)."
msgid "the token is valid"
msgstr "Il token è valido"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Creare un nuovo utente"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Recuperare i dettagli di un utente"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Aggiornare i dettagli di un utente"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Eliminare un utente"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
"Reimpostare la password di un utente inviando un'e-mail di reimpostazione "
"della password"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Gestire il caricamento dell'avatar per un utente"
@ -106,7 +106,7 @@ msgid "confirm a user's password reset"
msgstr "Confermare la reimpostazione della password di un utente"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Le password non corrispondono"
@ -118,6 +118,10 @@ msgstr "Attivare l'account di un utente"
msgid "activation link is invalid or account already activated"
msgstr "Il link di attivazione non è valido o l'account è già stato attivato."
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "Unire i prodotti memorizzati dal cliente e visti di recente"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr "L'uuid b64-encoded dell'utente che ci ha segnalato il nuovo utente."
@ -145,8 +149,8 @@ msgstr "Numero di telefono malformato: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Formato attributo non valido: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "Il link di attivazione non è valido!"
@ -158,14 +162,14 @@ msgstr "L'account è già stato attivato..."
msgid "something went wrong: {e!s}"
msgstr "Qualcosa è andato storto: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "Il gettone non è valido!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"I prodotti che questo utente ha visualizzato più di recente (max 48), in "
"ordine cronologico inverso."
@ -281,23 +285,23 @@ msgstr "Token in lista nera"
msgid "blacklisted tokens"
msgstr "Gettoni nella lista nera"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "Nessun conto attivo trovato"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Token nella lista nera"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Token non valido"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "Nessuna richiesta di uuid utente presente nel token"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "L'utente non esiste"
@ -420,10 +424,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "Il token non è valido"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "La password è stata reimpostata con successo!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "Avete già attivato l'account..."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -74,27 +74,27 @@ msgstr "トークンを確認する(リフレッシュまたはアクセス)
msgid "the token is valid"
msgstr "トークンは有効です"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "新規ユーザーの作成"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "ユーザーの詳細を取得する"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "ユーザー情報の更新"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "ユーザーを削除する"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr "パスワード再設定メールを送信して、ユーザーのパスワードを再設定する。"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "ユーザーのアバターアップロードを処理する"
@ -103,7 +103,7 @@ msgid "confirm a user's password reset"
msgstr "ユーザーのパスワード・リセットを確認する"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "パスワードが一致しない"
@ -113,9 +113,11 @@ msgstr "ユーザーアカウントの有効化"
#: vibes_auth/docs/drf/viewsets.py:66
msgid "activation link is invalid or account already activated"
msgstr ""
"アクティベーションリンクが無効であるか、アカウントがすでにアクティベーション"
"されています。"
msgstr "アクティベーションリンクが無効であるか、アカウントがすでにアクティベーションされています。"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "クライアントが最近閲覧した商品をマージする"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
@ -144,8 +146,8 @@ msgstr "不正な電話番号:{phone_number}。"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "無効な属性形式です:{attribute_pair}。"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "アクティベーションリンクが無効です!"
@ -157,14 +159,14 @@ msgstr "アカウントはすでに有効になっています..."
msgid "something went wrong: {e!s}"
msgstr "何かが間違っていた:{e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "トークンが無効です!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr "このユーザーが最近閲覧した商品最大48件を逆順に表示します。"
#: vibes_auth/graphene/object_types.py:41 vibes_auth/models.py:108
@ -276,23 +278,23 @@ msgstr "ブラックリストトークン"
msgid "blacklisted tokens"
msgstr "ブラックリストに載ったトークン"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "アクティブなアカウントが見つかりません"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "トークンのブラックリスト入り"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "無効なトークン"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "トークンにユーザー uuid クレームが存在しない"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "ユーザーが存在しない"
@ -319,9 +321,7 @@ msgstr "こんにちは、%(user_first_name)sです、"
msgid ""
"we have received a request to reset your password. please reset your "
"password by clicking the button below:"
msgstr ""
"パスワードの再設定依頼が届いております。以下のボタンをクリックして、パスワー"
"ドをリセットしてください:"
msgstr "パスワードの再設定依頼が届いております。以下のボタンをクリックして、パスワードをリセットしてください:"
#: vibes_auth/templates/user_reset_password_email.html:84
msgid "reset password"
@ -331,9 +331,7 @@ msgstr "パスワードのリセット"
msgid ""
"if the button above does not work, please copy and paste the following URL "
"into your web browser:"
msgstr ""
"上記のボタンが機能しない場合は、以下のURLをコピーしてウェブブラウザに貼り付け"
"てください:"
msgstr "上記のボタンが機能しない場合は、以下のURLをコピーしてウェブブラウザに貼り付けてください"
#: vibes_auth/templates/user_reset_password_email.html:88
msgid "if you did not send this request, please ignore this email."
@ -359,9 +357,7 @@ msgstr "アカウントの有効化"
msgid ""
"thank you for signing up for %(project_name)s. please activate your account "
"by clicking the button below:"
msgstr ""
"%(project_name)sにご登録いただきありがとうございます。下のボタンをクリックし"
"てアカウントを有効にしてください:"
msgstr "%(project_name)sにご登録いただきありがとうございます。下のボタンをクリックしてアカウントを有効にしてください"
#: vibes_auth/templates/user_verification_email.html:95
msgid ""
@ -376,8 +372,7 @@ msgid ""
"if the button above does not work, please copy and paste the following URL\n"
" into your web browser:"
msgstr ""
"上記のボタンが機能しない場合は、次のURLをコピーしてウェブブラウザに貼り付けて"
"ください。\n"
"上記のボタンが機能しない場合は、次のURLをコピーしてウェブブラウザに貼り付けてください。\n"
" をウェブブラウザに貼り付けてください:"
#: vibes_auth/templates/user_verification_email.html:101
@ -408,18 +403,16 @@ msgstr "{config.PROJECT_NAME}。| パスワードのリセット"
msgid ""
"invalid phone number format. the number must be entered in the format: "
"\"+999999999\". up to 15 digits allowed."
msgstr ""
"電話番号の形式が無効です。電話番号は次の形式で入力してください:"
"\"+999999999\".15桁まで入力可能です。"
msgstr "電話番号の形式が無効です。電話番号は次の形式で入力してください:\"+999999999\".15桁まで入力可能です。"
#: vibes_auth/views.py:57
msgid "the token is invalid"
msgstr "トークンが無効"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "パスワードのリセットに成功しました!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "あなたはすでにアカウントを有効にしています..."

View file

@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -77,27 +77,27 @@ msgstr ""
msgid "the token is valid"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr ""
@ -106,7 +106,7 @@ msgid "confirm a user's password reset"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr ""
@ -118,6 +118,10 @@ msgstr ""
msgid "activation link is invalid or account already activated"
msgstr ""
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr ""
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr ""
@ -145,8 +149,8 @@ msgstr ""
msgid "Invalid attribute format: {attribute_pair}"
msgstr ""
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr ""
@ -158,7 +162,7 @@ msgstr ""
msgid "something went wrong: {e!s}"
msgstr ""
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr ""
@ -277,23 +281,23 @@ msgstr ""
msgid "blacklisted tokens"
msgstr ""
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr ""
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr ""
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr ""
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr ""
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr ""
@ -404,10 +408,10 @@ msgstr ""
msgid "the token is invalid"
msgstr ""
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr ""
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr ""

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -74,29 +74,29 @@ msgstr "Een token verifiëren (verversen of toegang)."
msgid "the token is valid"
msgstr "The token is valid"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Een nieuwe gebruiker maken"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "De gegevens van een gebruiker ophalen"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "De gegevens van een gebruiker bijwerken"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Een gebruiker verwijderen"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
"Het wachtwoord van een gebruiker opnieuw instellen door een e-mail met het "
"wachtwoord opnieuw in te stellen"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Avatar uploaden voor een gebruiker afhandelen"
@ -105,7 +105,7 @@ msgid "confirm a user's password reset"
msgstr "Bevestig het resetten van het wachtwoord van een gebruiker"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Wachtwoorden komen niet overeen"
@ -117,6 +117,10 @@ msgstr "Een gebruikersaccount activeren"
msgid "activation link is invalid or account already activated"
msgstr "Activeringslink is ongeldig of account is al geactiveerd"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "Laatst bekeken producten samenvoegen"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr ""
@ -146,8 +150,8 @@ msgstr "Misvormd telefoonnummer: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Ongeldig attribuutformaat: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "Activeringslink is ongeldig!"
@ -159,14 +163,14 @@ msgstr "Account is al geactiveerd..."
msgid "something went wrong: {e!s}"
msgstr "Er ging iets mis: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "Token is invalid!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"De producten die deze gebruiker het laatst heeft bekeken (max 48), in "
"omgekeerd-chronologische volgorde."
@ -280,23 +284,23 @@ msgstr "Token op zwarte lijst"
msgid "blacklisted tokens"
msgstr "Tokens op de zwarte lijst"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "Geen actieve account gevonden"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Token op zwarte lijst"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Invalid token"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "Geen gebruiker uuid claim aanwezig in token"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "Gebruiker bestaat niet"
@ -324,8 +328,8 @@ msgid ""
"we have received a request to reset your password. please reset your "
"password by clicking the button below:"
msgstr ""
"We hebben een verzoek ontvangen om je wachtwoord opnieuw in te stellen. Klik "
"op de knop hieronder om je wachtwoord opnieuw in te stellen:"
"We hebben een verzoek ontvangen om je wachtwoord opnieuw in te stellen. Klik"
" op de knop hieronder om je wachtwoord opnieuw in te stellen:"
#: vibes_auth/templates/user_reset_password_email.html:84
msgid "reset password"
@ -364,8 +368,8 @@ msgid ""
"thank you for signing up for %(project_name)s. please activate your account "
"by clicking the button below:"
msgstr ""
"Bedankt voor het aanmelden bij %(project_name)s. Activeer je account door op "
"de onderstaande knop te klikken:"
"Bedankt voor het aanmelden bij %(project_name)s. Activeer je account door op"
" de onderstaande knop te klikken:"
#: vibes_auth/templates/user_verification_email.html:95
msgid ""
@ -419,10 +423,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "Het token is ongeldig"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "Wachtwoord is succesvol gereset!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "Je hebt de account al geactiveerd..."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -52,7 +52,8 @@ msgstr "Uzyskanie pary tokenów"
#: vibes_auth/docs/drf/views.py:16
msgid "obtain a token pair (refresh and access) for authentication."
msgstr "Uzyskanie pary tokenów (odświeżenie i dostęp) w celu uwierzytelnienia."
msgstr ""
"Uzyskanie pary tokenów (odświeżenie i dostęp) w celu uwierzytelnienia."
#: vibes_auth/docs/drf/views.py:35
msgid "refresh a token pair"
@ -74,29 +75,29 @@ msgstr "Weryfikacja tokena (odświeżenie lub dostęp)."
msgid "the token is valid"
msgstr "Token jest ważny"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Tworzenie nowego użytkownika"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Pobieranie danych użytkownika"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Aktualizacja danych użytkownika"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Usuwanie użytkownika"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
"Zresetowanie hasła użytkownika poprzez wysłanie wiadomości e-mail "
"resetującej hasło."
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Obsługa przesyłania awatara dla użytkownika"
@ -105,7 +106,7 @@ msgid "confirm a user's password reset"
msgstr "Potwierdzenie zresetowania hasła użytkownika"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Hasła nie są zgodne"
@ -117,6 +118,10 @@ msgstr "Aktywacja konta użytkownika"
msgid "activation link is invalid or account already activated"
msgstr "Link aktywacyjny jest nieprawidłowy lub konto zostało już aktywowane."
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "Scalanie ostatnio oglądanych produktów przechowywanych przez klienta"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr ""
@ -146,8 +151,8 @@ msgstr "Zniekształcony numer telefonu: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Nieprawidłowy format atrybutu: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "Link aktywacyjny jest nieprawidłowy!"
@ -159,14 +164,14 @@ msgstr "Konto zostało już aktywowane..."
msgid "something went wrong: {e!s}"
msgstr "Coś poszło nie tak: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "Token jest nieprawidłowy!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"Produkty ostatnio przeglądane przez tego użytkownika (maks. 48), w "
"kolejności odwrotnej do chronologicznej."
@ -280,23 +285,23 @@ msgstr "Token na czarnej liście"
msgid "blacklisted tokens"
msgstr "Tokeny znajdujące się na czarnej liście"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "Nie znaleziono aktywnego konta"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Token na czarnej liście"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Nieprawidłowy token"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "Brak oświadczenia uuid użytkownika w tokenie"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "Użytkownik nie istnieje"
@ -412,17 +417,17 @@ msgid ""
"invalid phone number format. the number must be entered in the format: "
"\"+999999999\". up to 15 digits allowed."
msgstr ""
"Nieprawidłowy format numeru telefonu. Numer musi być wprowadzony w formacie: "
"\"+999999999\". Dozwolone do 15 cyfr."
"Nieprawidłowy format numeru telefonu. Numer musi być wprowadzony w formacie:"
" \"+999999999\". Dozwolone do 15 cyfr."
#: vibes_auth/views.py:57
msgid "the token is invalid"
msgstr "Token jest nieprawidłowy"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "Hasło zostało pomyślnie zresetowane!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "Konto zostało już aktywowane..."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -74,28 +74,28 @@ msgstr "Verificar um token (atualização ou acesso)."
msgid "the token is valid"
msgstr "O token é válido"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Criar um novo usuário"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Recuperar os detalhes de um usuário"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Atualizar os detalhes de um usuário"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Excluir um usuário"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
"Redefinir a senha de um usuário enviando um e-mail de redefinição de senha"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Manipular o upload do avatar de um usuário"
@ -104,7 +104,7 @@ msgid "confirm a user's password reset"
msgstr "Confirmar a redefinição de senha de um usuário"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "As senhas não correspondem"
@ -116,6 +116,10 @@ msgstr "Ativar a conta de um usuário"
msgid "activation link is invalid or account already activated"
msgstr "O link de ativação é inválido ou a conta já está ativada"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "Mesclar produtos recentemente visualizados armazenados pelo cliente"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr "O uuid codificado em b64 do usuário que nos indicou o novo usuário."
@ -143,8 +147,8 @@ msgstr "Número de telefone malformado: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Formato de atributo inválido: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "O link de ativação é inválido!"
@ -156,17 +160,17 @@ msgstr "A conta já foi ativada..."
msgid "something went wrong: {e!s}"
msgstr "Algo deu errado: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "O token é inválido!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"Os produtos que esse usuário visualizou mais recentemente (máximo de 48), em "
"ordem cronológica inversa."
"Os produtos que esse usuário visualizou mais recentemente (máximo de 48), em"
" ordem cronológica inversa."
#: vibes_auth/graphene/object_types.py:41 vibes_auth/models.py:108
msgid "groups"
@ -277,23 +281,23 @@ msgstr "Token na lista negra"
msgid "blacklisted tokens"
msgstr "Tokens na lista negra"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "Nenhuma conta ativa encontrada"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Token na lista negra"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Token inválido"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "Nenhuma reivindicação de uuid de usuário presente no token"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "O usuário não existe"
@ -333,8 +337,8 @@ msgid ""
"if the button above does not work, please copy and paste the following URL "
"into your web browser:"
msgstr ""
"Se o botão acima não funcionar, copie e cole o seguinte URL em seu navegador "
"da Web:"
"Se o botão acima não funcionar, copie e cole o seguinte URL em seu navegador"
" da Web:"
#: vibes_auth/templates/user_reset_password_email.html:88
msgid "if you did not send this request, please ignore this email."
@ -416,10 +420,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "O token é inválido"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "A senha foi redefinida com sucesso!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "Você já ativou a conta..."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -75,29 +75,29 @@ msgstr "Verificarea unui jeton (reîmprospătare sau acces)."
msgid "the token is valid"
msgstr "Jetonul este valid"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Creați un utilizator nou"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Recuperarea detaliilor unui utilizator"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Actualizarea detaliilor unui utilizator"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Ștergeți un utilizator"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
"Resetați parola unui utilizator prin trimiterea unui e-mail de resetare a "
"parolei"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Gestionarea încărcării avatarului pentru un utilizator"
@ -106,7 +106,7 @@ msgid "confirm a user's password reset"
msgstr "Confirmați resetarea parolei unui utilizator"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Parolele nu se potrivesc"
@ -118,6 +118,10 @@ msgstr "Activați contul unui utilizator"
msgid "activation link is invalid or account already activated"
msgstr "Linkul de activare este invalid sau contul este deja activat"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "Fuzionați produsele recent vizualizate stocate de client"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr ""
@ -146,8 +150,8 @@ msgstr "Număr de telefon malformat: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Format de atribut invalid: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "Linkul de activare este invalid!"
@ -159,14 +163,14 @@ msgstr "Contul a fost deja activat..."
msgid "something went wrong: {e!s}"
msgstr "Ceva nu a mers bine: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "Token-ul nu este valabil!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"Produsele pe care acest utilizator le-a vizualizat cel mai recent (max 48), "
"în ordine cronologică inversă."
@ -280,23 +284,23 @@ msgstr "Token pe lista neagră"
msgid "blacklisted tokens"
msgstr "Jetoane pe lista neagră"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "Nu s-a găsit niciun cont activ"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Token pe lista neagră"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Jeton invalid"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "În jeton nu este prezentă nicio cerere uuid a utilizatorului"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "Utilizatorul nu există"
@ -380,8 +384,7 @@ msgid ""
"if the button above does not work, please copy and paste the following URL\n"
" into your web browser:"
msgstr ""
"Dacă butonul de mai sus nu funcționează, vă rugăm să copiați și să lipiți "
"următoarea adresă URL\n"
"Dacă butonul de mai sus nu funcționează, vă rugăm să copiați și să lipiți următoarea adresă URL\n"
" în browserul dvs. web:"
#: vibes_auth/templates/user_verification_email.html:101
@ -420,10 +423,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "Jetonul nu este valabil"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "Parola a fost resetată cu succes!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "Ați activat deja contul..."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -74,29 +74,29 @@ msgstr "Проверка маркера (обновление или досту
msgid "the token is valid"
msgstr "Токен действителен"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "Создайте нового пользователя"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "Получение информации о пользователе"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "Обновление данных пользователя"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "Удалить пользователя"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr ""
"Сброс пароля пользователя путем отправки электронного сообщения о сбросе "
"пароля"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "Обработка загрузки аватара для пользователя"
@ -105,7 +105,7 @@ msgid "confirm a user's password reset"
msgstr "Подтверждение сброса пароля пользователя"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "Пароли не совпадают"
@ -117,6 +117,11 @@ msgstr "Активация учетной записи пользователя"
msgid "activation link is invalid or account already activated"
msgstr "Ссылка на активацию недействительна или аккаунт уже активирован"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr ""
"Объедините недавно просмотренные продукты, хранящиеся в памяти клиента"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr ""
@ -146,8 +151,8 @@ msgstr "Некорректный номер телефона: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "Недопустимый формат атрибута: {attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "Ссылка на активацию недействительна!"
@ -159,17 +164,17 @@ msgstr "Аккаунт уже активирован..."
msgid "something went wrong: {e!s}"
msgstr "Что-то пошло не так: {e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "Токен недействителен!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr ""
"Продукты, которые этот пользователь просматривал в последнее время (не более "
"48), в обратном хронологическом порядке."
"Продукты, которые этот пользователь просматривал в последнее время (не более"
" 48), в обратном хронологическом порядке."
#: vibes_auth/graphene/object_types.py:41 vibes_auth/models.py:108
msgid "groups"
@ -280,23 +285,23 @@ msgstr "Токен в черном списке"
msgid "blacklisted tokens"
msgstr "Токены, внесенные в черный список"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "Активная учетная запись не найдена"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "Токен занесен в черный список"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "Неверный токен"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "В токене отсутствует утверждение uuid пользователя"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "Пользователь не существует"
@ -381,8 +386,7 @@ msgid ""
"if the button above does not work, please copy and paste the following URL\n"
" into your web browser:"
msgstr ""
"Если кнопка выше не работает, пожалуйста, скопируйте и вставьте следующий "
"URL-адрес\n"
"Если кнопка выше не работает, пожалуйста, скопируйте и вставьте следующий URL-адрес\n"
" в свой веб-браузер:"
#: vibes_auth/templates/user_verification_email.html:101
@ -421,10 +425,10 @@ msgstr ""
msgid "the token is invalid"
msgstr "Токен недействителен"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "Пароль был успешно сброшен!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "Вы уже активировали учетную запись..."

View file

@ -3,7 +3,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2025-06-08 19:42+0100\n"
"POT-Creation-Date: 2025-06-10 03:32+0100\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"
@ -74,27 +74,27 @@ msgstr "验证令牌(刷新或访问)。"
msgid "the token is valid"
msgstr "令牌有效"
#: vibes_auth/docs/drf/viewsets.py:15
#: vibes_auth/docs/drf/viewsets.py:16
msgid "create a new user"
msgstr "创建新用户"
#: vibes_auth/docs/drf/viewsets.py:19
#: vibes_auth/docs/drf/viewsets.py:20
msgid "retrieve a user's details"
msgstr "读取用户详细信息"
#: vibes_auth/docs/drf/viewsets.py:23
#: vibes_auth/docs/drf/viewsets.py:24
msgid "update a user's details"
msgstr "更新用户信息"
#: vibes_auth/docs/drf/viewsets.py:28
#: vibes_auth/docs/drf/viewsets.py:29
msgid "delete a user"
msgstr "删除用户"
#: vibes_auth/docs/drf/viewsets.py:32
#: vibes_auth/docs/drf/viewsets.py:33
msgid "reset a user's password by sending a reset password email"
msgstr "通过发送重置密码电子邮件重置用户密码"
#: vibes_auth/docs/drf/viewsets.py:37
#: vibes_auth/docs/drf/viewsets.py:38
msgid "handle avatar upload for a user"
msgstr "处理用户的头像上传"
@ -103,7 +103,7 @@ msgid "confirm a user's password reset"
msgstr "确认用户密码重置"
#: vibes_auth/docs/drf/viewsets.py:57 vibes_auth/graphene/mutations.py:307
#: vibes_auth/viewsets.py:72
#: vibes_auth/viewsets.py:73
msgid "passwords do not match"
msgstr "密码不匹配"
@ -115,6 +115,10 @@ msgstr "激活用户帐户"
msgid "activation link is invalid or account already activated"
msgstr "激活链接无效或账户已激活"
#: vibes_auth/docs/drf/viewsets.py:71
msgid "merge client-stored recently viewed products"
msgstr "合并客户存储的最近查看的产品"
#: vibes_auth/graphene/mutations.py:41
msgid "the user's b64-encoded uuid who referred the new user to us."
msgstr "将新用户推荐给我们的用户的 b64-encoded uuid。"
@ -142,8 +146,8 @@ msgstr "畸形电话号码: {phone_number}"
msgid "Invalid attribute format: {attribute_pair}"
msgstr "属性格式无效:{attribute_pair}"
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:115
#: vibes_auth/viewsets.py:134
#: vibes_auth/graphene/mutations.py:263 vibes_auth/viewsets.py:116
#: vibes_auth/viewsets.py:135
msgid "activation link is invalid!"
msgstr "激活链接无效!"
@ -155,14 +159,14 @@ msgstr "帐户已激活..."
msgid "something went wrong: {e!s}"
msgstr "出了问题:{e!s}"
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:83
#: vibes_auth/graphene/mutations.py:314 vibes_auth/viewsets.py:84
msgid "token is invalid!"
msgstr "令牌无效!"
#: vibes_auth/graphene/object_types.py:39
msgid ""
"the products this user has viewed most recently (max 48), in reverse"
"chronological order"
"the products this user has viewed most recently (max 48), in "
"reversechronological order"
msgstr "该用户最近查看过的产品(最多 48 个),按倒序排列。"
#: vibes_auth/graphene/object_types.py:41 vibes_auth/models.py:108
@ -274,23 +278,23 @@ msgstr "黑名单令牌"
msgid "blacklisted tokens"
msgstr "黑名单令牌"
#: vibes_auth/serializers.py:106 vibes_auth/serializers.py:128
#: vibes_auth/serializers.py:107 vibes_auth/serializers.py:129
msgid "no active account"
msgstr "未找到活动账户"
#: vibes_auth/serializers.py:199
#: vibes_auth/serializers.py:200
msgid "token_blacklisted"
msgstr "令牌被列入黑名单"
#: vibes_auth/serializers.py:204
#: vibes_auth/serializers.py:205
msgid "invalid token"
msgstr "无效令牌"
#: vibes_auth/serializers.py:210
#: vibes_auth/serializers.py:211
msgid "no user uuid claim present in token"
msgstr "令牌中没有用户 uuid 声明"
#: vibes_auth/serializers.py:212
#: vibes_auth/serializers.py:213
msgid "user does not exist"
msgstr "用户不存在"
@ -399,17 +403,16 @@ msgstr "{config.PROJECT_NAME} 重置密码| 重置密码"
msgid ""
"invalid phone number format. the number must be entered in the format: "
"\"+999999999\". up to 15 digits allowed."
msgstr ""
"电话号码格式无效。电话号码必须按格式输入:\"+999999999\".最多允许 15 位数字。"
msgstr "电话号码格式无效。电话号码必须按格式输入:\"+999999999\".最多允许 15 位数字。"
#: vibes_auth/views.py:57
msgid "the token is invalid"
msgstr "令牌无效"
#: vibes_auth/viewsets.py:87
#: vibes_auth/viewsets.py:88
msgid "password reset successfully"
msgstr "密码已重置成功!"
#: vibes_auth/viewsets.py:120
#: vibes_auth/viewsets.py:121
msgid "account already activated!"
msgstr "您已经激活了账户..."

View file

@ -2,6 +2,8 @@ from django.contrib import auth
from django.contrib.auth.base_user import BaseUserManager
from django.contrib.auth.hashers import make_password
from core.models import Order
class UserManager(BaseUserManager):
use_in_migrations = True
@ -11,6 +13,14 @@ class UserManager(BaseUserManager):
user = self.model(email=email, **extra_fields)
user.password = make_password(password)
user.save(using=self._db)
for order in Order.objects.filter(attributes__icontains=user.email):
if not order.user:
order.user = user
order.save()
for order in Order.objects.filter(attributes__icontains=user.phone_number):
if not order.user:
order.user = user
order.save()
return user
def create_user(self, email=None, password=None, **extra_fields):

View file

@ -13,6 +13,7 @@ from rest_framework.fields import (
BooleanField,
CharField,
EmailField,
ListField,
SerializerMethodField,
)
from rest_framework.serializers import ModelSerializer, Serializer
@ -229,3 +230,7 @@ class ResetPasswordSerializer(Serializer):
class ActivateEmailSerializer(Serializer):
uidb64 = CharField(required=True)
token = CharField(required=True)
class MergeRecentlyViewedSerializer(Serializer):
product_uuids = ListField(required=True, child=CharField(required=True))

View file

@ -22,6 +22,7 @@ from evibes.settings import DEBUG
from vibes_auth.docs.drf.viewsets import USER_SCHEMA
from vibes_auth.models import User
from vibes_auth.serializers import (
MergeRecentlyViewedSerializer,
UserSerializer,
)
from vibes_auth.utils.emailing import send_reset_password_email_task
@ -141,6 +142,17 @@ class UserViewSet(
response_data["access"] = str(tokens.access_token)
return Response(response_data, status=status.HTTP_200_OK)
@action(detail=True, methods=["put"], permission_classes=[IsAuthenticated])
def merge_recently_viewed(self, request, **kwargs):
user = self.get_object()
if request.user != user:
return Response(status=status.HTTP_403_FORBIDDEN)
serializer = MergeRecentlyViewedSerializer(request.data)
serializer.is_valid(raise_exception=True)
for product_uuid in serializer.validated_data["product_uuids"]:
user.add_to_recently_viewed(product_uuid)
return Response(status=status.HTTP_202_ACCEPTED, data=self.serializer_class(user).data)
def retrieve(self, request, pk=None, *args, **kwargs):
instance = self.get_object()
serializer = self.get_serializer(instance)