././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/LICENSE0000644000000000000000000000207300000000000012141 0ustar0000000000000000The MIT License (MIT) Copyright (c) 2013-2023 SUNSCRAPERS Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/README.rst0000644000000000000000000000765700000000000012640 0ustar0000000000000000====== djoser ====== .. image:: https://img.shields.io/pypi/v/djoser.svg :target: https://pypi.org/project/djoser .. image:: https://github.com/sunscrapers/djoser/workflows/Tests/badge.svg :target: https://github.com/sunscrapers/djoser/actions?query=branch%3Amaster+workflow%Tests++ :alt: Build Status .. image:: https://codecov.io/gh/sunscrapers/djoser/branch/master/graph/badge.svg :target: https://codecov.io/gh/sunscrapers/djoser .. image:: https://img.shields.io/pypi/dm/djoser :target: https://img.shields.io/pypi/dm/djoser .. image:: https://readthedocs.org/projects/djoser/badge/?version=latest :target: https://djoser.readthedocs.io/en/latest/ :alt: Docs REST implementation of `Django `_ authentication system. **djoser** library provides a set of `Django Rest Framework `_ views to handle basic actions such as registration, login, logout, password reset and account activation. It works with `custom user model `_. Instead of reusing Django code (e.g. ``PasswordResetForm``), we reimplemented few things to fit better into `Single Page App `_ architecture. Developed by `SUNSCRAPERS `_ with passion & patience. .. image:: https://asciinema.org/a/94J4eG2tSBD2iEfF30a6vGtXw.png :target: https://asciinema.org/a/94J4eG2tSBD2iEfF30a6vGtXw Requirements ============ To be able to run **djoser** you have to meet the following requirements: - Python>=3.8 - Django>=3.0.0 - Django REST Framework>=3.12 Installation ============ Simply install using ``pip``: .. code-block:: bash $ pip install djoser And continue with the steps described at `configuration `_ guide. Documentation ============= Documentation is available to study at `https://djoser.readthedocs.io `_ and in ``docs`` directory. Contributing and development ============================ To start developing on **djoser**, clone the repository: .. code-block:: bash $ git clone git@github.com:sunscrapers/djoser.git We use `poetry `_ as dependency management and packaging tool. .. code-block:: bash $ cd djoser $ poetry install --all-extras This will create a virtualenv with all development dependencies. To run the test just type: .. code-block:: bash $ poetry run py.test testproject We also prepared a convenient ``Makefile`` to automate commands above: .. code-block:: bash $ make init $ make test To activate the virtual environment run .. code-block:: bash $ poetry shell Without poetry -------------- New versions of ``pip`` can use ``pyproject.toml`` to build the package and install its dependencies. .. code-block:: bash $ pip install .[test] .. code-block:: bash $ cd testproject $ ./manage.py test Example project --------------- You can also play with test project by running following commands: .. code-block:: bash $ make migrate $ make runserver Commiting your code ------------------- Before sending patches please make sure you have `pre-commit `_ activated in your local git repository: .. code-block:: bash $ pre-commit install This will ensure that your code is cleaned before you commit it. Similar projects ================ List of projects related to Django, REST and authentication: - `django-rest-registration `_ - `django-oauth-toolkit `_ Please, keep in mind that while using custom authentication and TokenCreateSerializer validation, there is a path that **ignores intentional return of None** from authenticate() and try to find User using parameters. Probably, that will be changed in the future. ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/__init__.py0000644000000000000000000000002600000000000014527 0ustar0000000000000000__version__ = "2.2.0" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/auth_backends.py0000644000000000000000000000203000000000000015560 0ustar0000000000000000from django.contrib.auth import get_user_model from django.contrib.auth.backends import ModelBackend from djoser.conf import settings UserModel = get_user_model() class LoginFieldBackend(ModelBackend): """Allows to log in by a different value than the default Django USERNAME_FIELD.""" def authenticate(self, request, username=None, password=None, **kwargs): if username is None: username = kwargs.get(UserModel.USERNAME_FIELD) if username is None or password is None: return get_kwargs = { settings.LOGIN_FIELD: username, } try: user = UserModel._default_manager.get(**get_kwargs) except UserModel.DoesNotExist: # Run the default password hasher once to reduce the timing # difference between an existing and a nonexistent user (#20760). UserModel().set_password(password) else: if user.check_password(password) and self.user_can_authenticate(user): return user ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/compat.py0000644000000000000000000000041300000000000014253 0ustar0000000000000000from djoser.conf import settings __all__ = ["settings"] def get_user_email(user): email_field_name = get_user_email_field_name(user) return getattr(user, email_field_name, None) def get_user_email_field_name(user): return user.get_email_field_name() ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/conf.py0000644000000000000000000001565200000000000013730 0ustar0000000000000000# flake8: noqa E501 from django.apps import apps from django.conf import settings as django_settings from django.test.signals import setting_changed from django.utils.functional import LazyObject from django.utils.module_loading import import_string DJOSER_SETTINGS_NAMESPACE = "DJOSER" auth_module, user_model = django_settings.AUTH_USER_MODEL.rsplit(".", 1) User = apps.get_model(auth_module, user_model) class ObjDict(dict): def __getattribute__(self, item): try: val = self[item] if isinstance(val, str): val = import_string(val) elif isinstance(val, (list, tuple)): val = [import_string(v) if isinstance(v, str) else v for v in val] self[item] = val except KeyError: val = super().__getattribute__(item) return val default_settings = { "USER_ID_FIELD": User._meta.pk.name, "LOGIN_FIELD": User.USERNAME_FIELD, "SEND_ACTIVATION_EMAIL": False, "SEND_CONFIRMATION_EMAIL": False, "USER_CREATE_PASSWORD_RETYPE": False, "SET_PASSWORD_RETYPE": False, "PASSWORD_RESET_CONFIRM_RETYPE": False, "SET_USERNAME_RETYPE": False, "USERNAME_RESET_CONFIRM_RETYPE": False, "PASSWORD_RESET_SHOW_EMAIL_NOT_FOUND": False, "USERNAME_RESET_SHOW_EMAIL_NOT_FOUND": False, "PASSWORD_CHANGED_EMAIL_CONFIRMATION": False, "USERNAME_CHANGED_EMAIL_CONFIRMATION": False, "TOKEN_MODEL": "rest_framework.authtoken.models.Token", "SERIALIZERS": ObjDict( { "activation": "djoser.serializers.ActivationSerializer", "password_reset": "djoser.serializers.SendEmailResetSerializer", "password_reset_confirm": "djoser.serializers.PasswordResetConfirmSerializer", "password_reset_confirm_retype": "djoser.serializers.PasswordResetConfirmRetypeSerializer", "set_password": "djoser.serializers.SetPasswordSerializer", "set_password_retype": "djoser.serializers.SetPasswordRetypeSerializer", "set_username": "djoser.serializers.SetUsernameSerializer", "set_username_retype": "djoser.serializers.SetUsernameRetypeSerializer", "username_reset": "djoser.serializers.SendEmailResetSerializer", "username_reset_confirm": "djoser.serializers.UsernameResetConfirmSerializer", "username_reset_confirm_retype": "djoser.serializers.UsernameResetConfirmRetypeSerializer", "user_create": "djoser.serializers.UserCreateSerializer", "user_create_password_retype": "djoser.serializers.UserCreatePasswordRetypeSerializer", "user_delete": "djoser.serializers.UserDeleteSerializer", "user": "djoser.serializers.UserSerializer", "current_user": "djoser.serializers.UserSerializer", "token": "djoser.serializers.TokenSerializer", "token_create": "djoser.serializers.TokenCreateSerializer", } ), "EMAIL": ObjDict( { "activation": "djoser.email.ActivationEmail", "confirmation": "djoser.email.ConfirmationEmail", "password_reset": "djoser.email.PasswordResetEmail", "password_changed_confirmation": "djoser.email.PasswordChangedConfirmationEmail", "username_changed_confirmation": "djoser.email.UsernameChangedConfirmationEmail", "username_reset": "djoser.email.UsernameResetEmail", } ), "EMAIL_FRONTEND_DOMAIN": None, "EMAIL_FRONTEND_PROTOCOL": None, "EMAIL_FRONTEND_SITE_NAME": None, "CONSTANTS": ObjDict({"messages": "djoser.constants.Messages"}), "LOGOUT_ON_PASSWORD_CHANGE": False, "CREATE_SESSION_ON_LOGIN": False, "SOCIAL_AUTH_TOKEN_STRATEGY": "djoser.social.token.jwt.TokenStrategy", "SOCIAL_AUTH_ALLOWED_REDIRECT_URIS": [], "HIDE_USERS": True, "PERMISSIONS": ObjDict( { "activation": ["rest_framework.permissions.AllowAny"], "password_reset": ["rest_framework.permissions.AllowAny"], "password_reset_confirm": ["rest_framework.permissions.AllowAny"], "set_password": ["djoser.permissions.CurrentUserOrAdmin"], "username_reset": ["rest_framework.permissions.AllowAny"], "username_reset_confirm": ["rest_framework.permissions.AllowAny"], "set_username": ["djoser.permissions.CurrentUserOrAdmin"], "user_create": ["rest_framework.permissions.AllowAny"], "user_delete": ["djoser.permissions.CurrentUserOrAdmin"], "user": ["djoser.permissions.CurrentUserOrAdmin"], "user_list": ["djoser.permissions.CurrentUserOrAdmin"], "token_create": ["rest_framework.permissions.AllowAny"], "token_destroy": ["rest_framework.permissions.IsAuthenticated"], } ), "WEBAUTHN": ObjDict( { "RP_NAME": "localhost", "RP_ID": "localhost", "ORIGIN": "http://localhost:8000", "CHALLENGE_LENGTH": 32, "UKEY_LENGTH": 20, "SIGNUP_SERIALIZER": "djoser.webauthn.serializers.WebauthnCreateUserSerializer", "LOGIN_SERIALIZER": "djoser.webauthn.serializers.WebauthnLoginSerializer", } ), } SETTINGS_TO_IMPORT = ["TOKEN_MODEL", "SOCIAL_AUTH_TOKEN_STRATEGY"] class Settings: def __init__(self, default_settings, explicit_overriden_settings: dict = None): if explicit_overriden_settings is None: explicit_overriden_settings = {} overriden_settings = ( getattr(django_settings, DJOSER_SETTINGS_NAMESPACE, {}) or explicit_overriden_settings ) self._load_default_settings() self._override_settings(overriden_settings) self._init_settings_to_import() def _load_default_settings(self): for setting_name, setting_value in default_settings.items(): if setting_name.isupper(): setattr(self, setting_name, setting_value) def _override_settings(self, overriden_settings: dict): for setting_name, setting_value in overriden_settings.items(): value = setting_value if isinstance(setting_value, dict): value = getattr(self, setting_name, {}) value.update(ObjDict(setting_value)) setattr(self, setting_name, value) def _init_settings_to_import(self): for setting_name in SETTINGS_TO_IMPORT: value = getattr(self, setting_name) if isinstance(value, str): setattr(self, setting_name, import_string(value)) class LazySettings(LazyObject): def _setup(self, explicit_overriden_settings=None): self._wrapped = Settings(default_settings, explicit_overriden_settings) settings = LazySettings() def reload_djoser_settings(*args, **kwargs): global settings setting, value = kwargs["setting"], kwargs["value"] if setting == DJOSER_SETTINGS_NAMESPACE: settings._setup(explicit_overriden_settings=value) setting_changed.connect(reload_djoser_settings) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/constants.py0000644000000000000000000000137600000000000015015 0ustar0000000000000000from django.utils.translation import gettext_lazy as _ class Messages: INVALID_CREDENTIALS_ERROR = _("Unable to log in with provided credentials.") INACTIVE_ACCOUNT_ERROR = _( "User account is disabled." ) # not in use since Django 1.10 INVALID_TOKEN_ERROR = _("Invalid token for given user.") INVALID_UID_ERROR = _("Invalid user id or user doesn't exist.") STALE_TOKEN_ERROR = _("Stale token for given user.") PASSWORD_MISMATCH_ERROR = _("The two password fields didn't match.") USERNAME_MISMATCH_ERROR = _("The two {0} fields didn't match.") INVALID_PASSWORD_ERROR = _("Invalid password.") EMAIL_NOT_FOUND = _("User with given email does not exist.") CANNOT_CREATE_USER_ERROR = _("Unable to create account.") ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/email.py0000644000000000000000000001276400000000000014073 0ustar0000000000000000from django.contrib.auth.tokens import default_token_generator from django.contrib.sites.shortcuts import get_current_site from djoser import utils from django.conf import settings as django_settings from djoser.conf import settings from django.core import mail from django.template.context import make_context from django.template.loader import get_template from django.views.generic.base import ContextMixin class BaseEmailMessage(mail.EmailMultiAlternatives, ContextMixin): _node_map = { "subject": "subject", "text_body": "body", "html_body": "html", } template_name = None def __init__(self, request=None, context=None, template_name=None, *args, **kwargs): super().__init__(*args, **kwargs) self.request = request self.context = {} if context is None else context self.html = None if template_name is not None: self.template_name = template_name def get_context_data(self, **kwargs): ctx = super().get_context_data(**kwargs) context = dict(ctx, **self.context) if self.request: site = get_current_site(self.request) domain = context.get("domain") or ( getattr(django_settings, "DOMAIN", "") or site.domain ) protocol = context.get("protocol") or ( "https" if self.request.is_secure() else "http" ) site_name = context.get("site_name") or ( getattr(django_settings, "SITE_NAME", "") or site.name ) user = context.get("user") or self.request.user else: domain = context.get("domain") or getattr(django_settings, "DOMAIN", "") protocol = context.get("protocol") or "http" site_name = context.get("site_name") or getattr( django_settings, "SITE_NAME", "" ) user = context.get("user") context.update( { "domain": domain, "protocol": protocol, "site_name": site_name, "user": user, } ) return context def render(self): context = make_context(self.get_context_data(), request=self.request) template = get_template(self.template_name) with context.bind_template(template.template): for node in template.template.nodelist: self._process_node(node, context) self._attach_body() # custom interface incompatible with django, `to` is a required param def send(self, to, fail_silently=False, **kwargs): self.render() self.to = to self.cc = kwargs.pop("cc", []) self.bcc = kwargs.pop("bcc", []) self.reply_to = kwargs.pop("reply_to", []) self.from_email = kwargs.pop("from_email", django_settings.DEFAULT_FROM_EMAIL) self.request = None super().send(fail_silently=fail_silently) def _process_node(self, node, context): attr = self._node_map.get(getattr(node, "name", "")) if attr is not None: setattr(self, attr, node.render(context).strip()) def _attach_body(self): if self.body and self.html: self.attach_alternative(self.html, "text/html") elif self.html: self.body = self.html self.content_subtype = "html" class BaseDjoserEmail(BaseEmailMessage): def get_context_data(self): context = super().get_context_data() overridable = { "protocol": settings.EMAIL_FRONTEND_PROTOCOL, "domain": settings.EMAIL_FRONTEND_DOMAIN, "site_name": settings.EMAIL_FRONTEND_SITE_NAME, } for context_key, context_value in overridable.items(): if context_value: context.update({context_key: context_value}) context.pop("view", None) return context class ActivationEmail(BaseDjoserEmail): template_name = "email/activation.html" def get_context_data(self): # ActivationEmail can be deleted context = super().get_context_data() user = context.get("user") context["uid"] = utils.encode_uid(user.pk) context["token"] = default_token_generator.make_token(user) context["url"] = settings.ACTIVATION_URL.format(**context) return context class ConfirmationEmail(BaseDjoserEmail): template_name = "email/confirmation.html" class PasswordResetEmail(BaseDjoserEmail): template_name = "email/password_reset.html" def get_context_data(self): # PasswordResetEmail can be deleted context = super().get_context_data() user = context.get("user") context["uid"] = utils.encode_uid(user.pk) context["token"] = default_token_generator.make_token(user) context["url"] = settings.PASSWORD_RESET_CONFIRM_URL.format(**context) return context class PasswordChangedConfirmationEmail(BaseDjoserEmail): template_name = "email/password_changed_confirmation.html" class UsernameChangedConfirmationEmail(BaseDjoserEmail): template_name = "email/username_changed_confirmation.html" class UsernameResetEmail(BaseDjoserEmail): template_name = "email/username_reset.html" def get_context_data(self): context = super().get_context_data() user = context.get("user") context["uid"] = utils.encode_uid(user.pk) context["token"] = default_token_generator.make_token(user) context["url"] = settings.USERNAME_RESET_CONFIRM_URL.format(**context) return context ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1731171467.683026 djoser-2.3.1/djoser/locale/ca/LC_MESSAGES/django.mo0000644000000000000000000000713600000000000017635 0ustar0000000000000000I<7<t#&,:L:4.%E k+%[2jj2d(L@A #Q u # - + 8 7D 8|  &  : 1N ) = $ , ': Vb ~ j8 ; $ $4)%(site_name)s - Your account has been successfully created and activated!%(site_name)s - Your password has been successfully changed!%(site_name)s - Your username has been successfully changed!Account activation on %(site_name)sInvalid password.Invalid token for given user.Invalid user id or user doesn't exist.Password reset on %(site_name)sPlease go to the following page and choose a new password:Please go to the following page and choose a new username:Please go to the following page to activate account:Stale token for given user.Thanks for using our site!The %(site_name)s teamThe two password fields didn't match.The two {0} fields didn't match.Unable to create account.Unable to log in with provided credentials.User account is disabled.User with given email does not exist.Username reset on %(site_name)sYou're receiving this email because you need to finish activation process on %(site_name)s.You're receiving this email because you requested a password reset for your user account at %(site_name)s.You're receiving this email because you requested a username reset for your user account at %(site_name)s.Your account has been created and is ready to use!Your password has been changed!Your username has been changed!Your username, in case you've forgotten:Project-Id-Version: djoser Report-Msgid-Bugs-To: POT-Creation-Date: 2024-06-03 13:31+0200 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: # Oscar Fonts Language: ca Language-Team: Catalan Plural-Forms: nplurals=2; plural=(n != 1) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.8.0 %(site_name)s - El vostre compte s'ha creat correctament i ja està activat!%(site_name)s - La vostra contrasenya s'ha canviat correctament!%(site_name)s - El vostre nom d'usuari s'ha canviat correctament!Activació del compte %(site_name)sContrasenya incorrecta.El token de l'usuari no és vàlid.Id d'usuari no vàlid o l'usuari no existeix.Restabliment de contrasenya a %(site_name)sAneu a la pàgina següent i trieu una nova contrasenya:Aneu a la pàgina següent i trieu un nou nom d'usuari:Aneu a la pàgina següent per activar el vostre compte:El token d'usuari ha caducat.Gràcies per utilitzar el nostre lloc!L'equip de %(site_name)sEl contingut dels dos camps de contrasenyes no coincideix.El contingut dels dos camps de {0} no coincideix.No és possible crear el compte d'usuari.No es pot iniciar sessió amb les credencials proporcionades.El compte d'usuari està desactivat.No existeix un usuari amb el correu indicat.Nom d'usuari restablert a %(site_name)sHeu rebut aquest correu per tal de finalitzar el procés d'activació a %(site_name)s.Heu rebut aquest correu perquè heu sol·licitat un restabliment de contrasenya per al vostre compte d'usuari a %(site_name)s.Heu rebut aquest correu perquè heu sol·licitat el restabliment del vostre nom d'usuari a %(site_name)s.S'ha creat el vostre compte i està llest per utilitzar-lo!S'ha canviat la vostra constrasenya!S'ha canviat el vostre nom d'usuari!El vostre nom d'usuari, en cas que l'hàgiu oblidat:././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/locale/ca/LC_MESSAGES/django.po0000644000000000000000000001564300000000000017642 0ustar0000000000000000# Copyright (C) Sunscrapers # This file is distributed under the same license as the djoser package. # # Translators: # Oscar Fonts , 2024 # msgid "" msgstr "" "Project-Id-Version: djoser\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-06-03 13:31+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: # Oscar Fonts \n" "Language-Team: Catalan\n" "Language: ca\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: djoser/constants.py:5 msgid "Unable to log in with provided credentials." msgstr "No es pot iniciar sessió amb les credencials proporcionades." #: djoser/constants.py:6 msgid "User account is disabled." msgstr "El compte d'usuari està desactivat." #: djoser/constants.py:7 msgid "Invalid token for given user." msgstr "El token de l'usuari no és vàlid." #: djoser/constants.py:8 msgid "Invalid user id or user doesn't exist." msgstr "Id d'usuari no vàlid o l'usuari no existeix." #: djoser/constants.py:9 msgid "Stale token for given user." msgstr "El token d'usuari ha caducat." #: djoser/constants.py:10 msgid "The two password fields didn't match." msgstr "El contingut dels dos camps de contrasenyes no coincideix." #: djoser/constants.py:11 #, python-brace-format msgid "The two {0} fields didn't match." msgstr "El contingut dels dos camps de {0} no coincideix." #: djoser/constants.py:12 msgid "Invalid password." msgstr "Contrasenya incorrecta." #: djoser/constants.py:13 msgid "User with given email does not exist." msgstr "No existeix un usuari amb el correu indicat." #: djoser/constants.py:14 msgid "Unable to create account." msgstr "No és possible crear el compte d'usuari." #: djoser/templates/email/activation.html:4 #, python-format msgid "Account activation on %(site_name)s" msgstr "Activació del compte %(site_name)s" #: djoser/templates/email/activation.html:8 #: djoser/templates/email/activation.html:19 #, python-format msgid "" "You're receiving this email because you need to finish activation process on " "%(site_name)s." msgstr "" "Heu rebut aquest correu per tal de finalitzar el procés d'activació a " "%(site_name)s." #: djoser/templates/email/activation.html:10 #: djoser/templates/email/activation.html:21 msgid "Please go to the following page to activate account:" msgstr "Aneu a la pàgina següent per activar el vostre compte:" #: djoser/templates/email/activation.html:13 #: djoser/templates/email/activation.html:24 #: djoser/templates/email/confirmation.html:10 #: djoser/templates/email/confirmation.html:18 #: djoser/templates/email/password_changed_confirmation.html:10 #: djoser/templates/email/password_changed_confirmation.html:18 #: djoser/templates/email/password_reset.html:14 #: djoser/templates/email/password_reset.html:26 #: djoser/templates/email/username_changed_confirmation.html:10 #: djoser/templates/email/username_changed_confirmation.html:18 #: djoser/templates/email/username_reset.html:14 #: djoser/templates/email/username_reset.html:26 msgid "Thanks for using our site!" msgstr "Gràcies per utilitzar el nostre lloc!" #: djoser/templates/email/activation.html:15 #: djoser/templates/email/activation.html:26 #: djoser/templates/email/confirmation.html:12 #: djoser/templates/email/confirmation.html:20 #: djoser/templates/email/password_changed_confirmation.html:12 #: djoser/templates/email/password_changed_confirmation.html:20 #: djoser/templates/email/password_reset.html:16 #: djoser/templates/email/password_reset.html:28 #: djoser/templates/email/username_changed_confirmation.html:12 #: djoser/templates/email/username_changed_confirmation.html:20 #: djoser/templates/email/username_reset.html:16 #: djoser/templates/email/username_reset.html:28 #, python-format msgid "The %(site_name)s team" msgstr "L'equip de %(site_name)s" #: djoser/templates/email/confirmation.html:4 #, python-format msgid "" "%(site_name)s - Your account has been successfully created and activated!" msgstr "%(site_name)s - El vostre compte s'ha creat correctament i ja està activat!" #: djoser/templates/email/confirmation.html:8 #: djoser/templates/email/confirmation.html:16 msgid "Your account has been created and is ready to use!" msgstr "S'ha creat el vostre compte i està llest per utilitzar-lo!" #: djoser/templates/email/password_changed_confirmation.html:4 #, python-format msgid "%(site_name)s - Your password has been successfully changed!" msgstr "%(site_name)s - La vostra contrasenya s'ha canviat correctament!" #: djoser/templates/email/password_changed_confirmation.html:8 #: djoser/templates/email/password_changed_confirmation.html:16 msgid "Your password has been changed!" msgstr "S'ha canviat la vostra constrasenya!" #: djoser/templates/email/password_reset.html:4 #, python-format msgid "Password reset on %(site_name)s" msgstr "Restabliment de contrasenya a %(site_name)s" #: djoser/templates/email/password_reset.html:8 #: djoser/templates/email/password_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" "Heu rebut aquest correu perquè heu sol·licitat un restabliment de contrasenya per al vostre " "compte d'usuari a %(site_name)s." #: djoser/templates/email/password_reset.html:10 #: djoser/templates/email/password_reset.html:22 msgid "Please go to the following page and choose a new password:" msgstr "Aneu a la pàgina següent i trieu una nova contrasenya:" #: djoser/templates/email/password_reset.html:12 #: djoser/templates/email/password_reset.html:24 #: djoser/templates/email/username_reset.html:12 #: djoser/templates/email/username_reset.html:24 msgid "Your username, in case you've forgotten:" msgstr "El vostre nom d'usuari, en cas que l'hàgiu oblidat:" #: djoser/templates/email/username_changed_confirmation.html:4 #, python-format msgid "%(site_name)s - Your username has been successfully changed!" msgstr "%(site_name)s - El vostre nom d'usuari s'ha canviat correctament!" #: djoser/templates/email/username_changed_confirmation.html:8 #: djoser/templates/email/username_changed_confirmation.html:16 msgid "Your username has been changed!" msgstr "S'ha canviat el vostre nom d'usuari!" #: djoser/templates/email/username_reset.html:4 #, python-format msgid "Username reset on %(site_name)s" msgstr "Nom d'usuari restablert a %(site_name)s" #: djoser/templates/email/username_reset.html:8 #: djoser/templates/email/username_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a username reset for your " "user account at %(site_name)s." msgstr "" "Heu rebut aquest correu perquè heu sol·licitat el restabliment del vostre nom d'usuari " " a %(site_name)s." #: djoser/templates/email/username_reset.html:10 #: djoser/templates/email/username_reset.html:22 msgid "Please go to the following page and choose a new username:" msgstr "Aneu a la pàgina següent i trieu un nou nom d'usuari:" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171467.6870263 djoser-2.3.1/djoser/locale/de/LC_MESSAGES/django.mo0000644000000000000000000000614200000000000017636 0ustar0000000000000000I# &+R:r4%0 Vw+%r[j2_(~K:0-?-A?oM.+, X .s - - < %; a 4 a# h 8 :' %(site_name)s - Your account has been successfully created and activated!Account activation on %(site_name)sInvalid password.Invalid token for given user.Invalid user id or user doesn't exist.Password reset on %(site_name)sPlease go to the following page and choose a new password:Please go to the following page to activate account:Stale token for given user.Thanks for using our site!The %(site_name)s teamThe two password fields didn't match.The two {0} fields didn't match.Unable to create account.Unable to log in with provided credentials.User account is disabled.User model does not contain specified email field. Please see http://djoser.readthedocs.io/en/latest/settings.html#USER_EMAIL_FIELD_NAME for more details.User with given email does not exist.You're receiving this email because you need to finish activation process on %(site_name)s.You're receiving this email because you requested a password reset for your user account at %(site_name)s.Your account has been created and is ready to use!Your username, in case you've forgotten:Project-Id-Version: djoser Report-Msgid-Bugs-To: POT-Creation-Date: 2020-01-13 17:40+0100 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Bertram Bühner Language: de Language-Team: German Plural-Forms: nplurals=2; plural=(n > 1) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.8.0 %(site_name)s - Ihr Benutzerkonto wurde erfolgreich erstellt und aktiviert!Aktivierung des Benutzerkontos auf %(site_name)sDas Passwort ist ungültig.Das Token für diesen Benutzer ist ungültig.Die User-ID ist ungültig oder dieser Benutzer existiert nicht.Zurücksetzen des Passworts auf %(site_name)sBitte geben Sie auf der folgenden Seite ein neues Passwort ein:Bitte begeben Sie sich auf folgende Seite, um die Aktivierung abzuschließen:Das Token für diesen Benutzer ist abgelaufen.Vielen Dank für die Nutzung unserer Seite!Das Team von %(site_name)sDie beiden Passwörter stimmen nicht überein.Die beiden {0}-Felder stimmen nicht überein.Das Benutzerkonto kann nicht angelegt werden.Eine Anmeldung ist mit den angegebenen Daten nicht möglich.Dieses Benutzerkonto ist deaktiviert.Das user-model enthält kein E-Mail-Feld. Weitere Details unter http://djoser.readthedocs.io/en/latest/settings.html#USER_EMAIL_FIELD_NAME .Es existiert kein Benutzer mit dieser E-Mailadresse.Sie erhalten diese E-Mail, da Sie den Aktivierungsprozess auf %(site_name)s.abschließen müssen.Sie erhalten diese E-Mail, da Sie das Zurücksetzen Ihres Passworts auf %(site_name)s angefordert haben.Ihr Benutzerkonto wurde erstellt und ist freigeschaltet!Ihr Benutzername - falls Sie ihn vergessen haben - lautet:././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/locale/de/LC_MESSAGES/django.po0000644000000000000000000001124100000000000017635 0ustar0000000000000000# Copyright (C) Sunscrapers # This file is distributed under the same license as the djoser package. # # Translators: # Bertram Bühner , 2020 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: djoser\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-13 17:40+0100\n" "Last-Translator: Bertram Bühner \n" "Language-Team: German\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: constants.py:4 msgid "Unable to log in with provided credentials." msgstr "Eine Anmeldung ist mit den angegebenen Daten nicht möglich." #: constants.py:5 msgid "User account is disabled." msgstr "Dieses Benutzerkonto ist deaktiviert." #: constants.py:6 msgid "Invalid token for given user." msgstr "Das Token für diesen Benutzer ist ungültig." #: constants.py:7 msgid "Invalid user id or user doesn't exist." msgstr "Die User-ID ist ungültig oder dieser Benutzer existiert nicht." #: constants.py:8 msgid "Stale token for given user." msgstr "Das Token für diesen Benutzer ist abgelaufen." #: constants.py:9 msgid "The two password fields didn't match." msgstr "Die beiden Passwörter stimmen nicht überein." #: constants.py:10 #, python-brace-format msgid "The two {0} fields didn't match." msgstr "Die beiden {0}-Felder stimmen nicht überein." #: constants.py:11 msgid "Invalid password." msgstr "Das Passwort ist ungültig." #: constants.py:12 msgid "User with given email does not exist." msgstr "Es existiert kein Benutzer mit dieser E-Mailadresse." #: constants.py:13 msgid "Unable to create account." msgstr "Das Benutzerkonto kann nicht angelegt werden." #: constants.py:15 msgid "" "User model does not contain specified email field. Please see http://djoser." "readthedocs.io/en/latest/settings.html#USER_EMAIL_FIELD_NAME for more " "details." msgstr "" "Das user-model enthält kein E-Mail-Feld. Weitere Details unter " "http://djoser.readthedocs.io/en/latest/settings.html#USER_EMAIL_FIELD_NAME " "." #: templates/email/activation.html:4 #, python-format msgid "Account activation on %(site_name)s" msgstr "Aktivierung des Benutzerkontos auf %(site_name)s" #: templates/email/activation.html:8 templates/email/activation.html:19 #, python-format msgid "" "You're receiving this email because you need to finish activation process on " "%(site_name)s." msgstr "" "Sie erhalten diese E-Mail, da Sie den Aktivierungsprozess auf %(site_name)s." "abschließen müssen." #: templates/email/activation.html:10 templates/email/activation.html:22 msgid "Please go to the following page to activate account:" msgstr "Bitte begeben Sie sich auf folgende Seite, um die Aktivierung abzuschließen:" #: templates/email/activation.html:13 templates/email/activation.html:25 #: templates/email/confirmation.html:10 templates/email/confirmation.html:18 #: templates/email/password_reset.html:14 #: templates/email/password_reset.html:26 msgid "Thanks for using our site!" msgstr "Vielen Dank für die Nutzung unserer Seite!" #: templates/email/activation.html:15 templates/email/activation.html:27 #: templates/email/confirmation.html:12 templates/email/confirmation.html:20 #: templates/email/password_reset.html:16 #: templates/email/password_reset.html:28 #, python-format msgid "The %(site_name)s team" msgstr "Das Team von %(site_name)s" #: templates/email/confirmation.html:4 #, python-format msgid "" "%(site_name)s - Your account has been successfully created and activated!" msgstr "" "%(site_name)s - Ihr Benutzerkonto wurde erfolgreich erstellt und aktiviert!" #: templates/email/confirmation.html:8 templates/email/confirmation.html:16 msgid "Your account has been created and is ready to use!" msgstr "Ihr Benutzerkonto wurde erstellt und ist freigeschaltet!" #: templates/email/password_reset.html:4 #, python-format msgid "Password reset on %(site_name)s" msgstr "Zurücksetzen des Passworts auf %(site_name)s" #: templates/email/password_reset.html:8 templates/email/password_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" "Sie erhalten diese E-Mail, da Sie das Zurücksetzen Ihres Passworts auf " "%(site_name)s angefordert haben." #: templates/email/password_reset.html:10 #: templates/email/password_reset.html:22 msgid "Please go to the following page and choose a new password:" msgstr "Bitte geben Sie auf der folgenden Seite ein neues Passwort ein:" #: templates/email/password_reset.html:12 #: templates/email/password_reset.html:24 msgid "Your username, in case you've forgotten:" msgstr "Ihr Benutzername - falls Sie ihn vergessen haben - lautet:" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171467.6870263 djoser-2.3.1/djoser/locale/es/LC_MESSAGES/django.mo0000644000000000000000000000723200000000000017656 0ustar0000000000000000I<7<t#&,:L:4.%E k+%[2jj2d(|A};C&? f #} . 0 Q WS B ! ! 2 :M 2 ) = +# ,O ,| c g mu 3 "(:6c%(site_name)s - Your account has been successfully created and activated!%(site_name)s - Your password has been successfully changed!%(site_name)s - Your username has been successfully changed!Account activation on %(site_name)sInvalid password.Invalid token for given user.Invalid user id or user doesn't exist.Password reset on %(site_name)sPlease go to the following page and choose a new password:Please go to the following page and choose a new username:Please go to the following page to activate account:Stale token for given user.Thanks for using our site!The %(site_name)s teamThe two password fields didn't match.The two {0} fields didn't match.Unable to create account.Unable to log in with provided credentials.User account is disabled.User with given email does not exist.Username reset on %(site_name)sYou're receiving this email because you need to finish activation process on %(site_name)s.You're receiving this email because you requested a password reset for your user account at %(site_name)s.You're receiving this email because you requested a username reset for your user account at %(site_name)s.Your account has been created and is ready to use!Your password has been changed!Your username has been changed!Your username, in case you've forgotten:Project-Id-Version: djoser Report-Msgid-Bugs-To: POT-Creation-Date: 2020-04-18 20:06-0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Ariel Torti Language: es Language-Team: Spanish Plural-Forms: nplurals=2; plural=(n != 1) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.8.0 %(site_name)s - ¡Su cuenta ha sido creada y activada con éxito!%(site_name)s - ¡Su contraseña se ha cambiado con éxito!%(site_name)s - ¡Su nombre de usuario ha sido cambiado con éxito!Activación de la cuenta %(site_name)sContraseña inválida.El token del usuario no es válido.Id de usuario inválido o usuario inexistente.Restablecimiento de contraseña en %(site_name)sPor favor diríjase a la siguiente página para seleccionar su nueva contraseña:Por favor diríjase a la siguiente página para seleccionar un nuevo nombre de usuario:Por favor diríjase a la siguiente página para activar su cuenta:El token del usuario ha caducado.¡Gracias por usar nuestro sitio!El equipo de %(site_name)sEl contenido de los dos campos de contraseña no coincide.El contenido de los dos campos de {0} no coincide.No es posible crear la cuenta de usuario.No es posible iniciar sesión con las credenciales indicadas.Esta cuenta de usuario está deshabilitada.No existe un usuario con el correo indicado.Restablecimiento de usuario en %(site_name)sUsted ha recibido este correo porque necesita finalizar el proceso de activación en %(site_name)s.Usted ha recibido este correo porque solicitó un cambio de contraseña para su cuenta en %(site_name)sUsted ha recibido este correo porque solicitó un cambio de nombre de usuario para su cuenta en %(site_name)s¡Se ha creado su cuenta y está lista para su uso!¡Su contraseña ha sido cambiada!¡Su nombre de usuario ha sido cambiado!Su nombre de usuario, en caso de que lo haya olvidado:././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/locale/es/LC_MESSAGES/django.po0000644000000000000000000001574000000000000017664 0ustar0000000000000000# Copyright (C) Sunscrapers # This file is distributed under the same license as the djoser package. # # Translators: # Ariel Torti , 2020 # Oscar Fonts , 2024 # msgid "" msgstr "" "Project-Id-Version: djoser\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-04-18 20:06-0300\n" "Last-Translator: Ariel Torti \n" "Language-Team: Spanish\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: djoser/constants.py:5 msgid "Unable to log in with provided credentials." msgstr "No es posible iniciar sesión con las credenciales indicadas." #: djoser/constants.py:6 msgid "User account is disabled." msgstr "Esta cuenta de usuario está deshabilitada." #: djoser/constants.py:7 msgid "Invalid token for given user." msgstr "El token del usuario no es válido." #: djoser/constants.py:8 msgid "Invalid user id or user doesn't exist." msgstr "Id de usuario inválido o usuario inexistente." #: djoser/constants.py:9 msgid "Stale token for given user." msgstr "El token del usuario ha caducado." #: djoser/constants.py:10 msgid "The two password fields didn't match." msgstr "El contenido de los dos campos de contraseña no coincide." #: djoser/constants.py:11 #, python-brace-format msgid "The two {0} fields didn't match." msgstr "El contenido de los dos campos de {0} no coincide." #: djoser/constants.py:12 msgid "Invalid password." msgstr "Contraseña inválida." #: djoser/constants.py:13 msgid "User with given email does not exist." msgstr "No existe un usuario con el correo indicado." #: djoser/constants.py:14 msgid "Unable to create account." msgstr "No es posible crear la cuenta de usuario." #: djoser/templates/email/activation.html:4 #, python-format msgid "Account activation on %(site_name)s" msgstr "Activación de la cuenta %(site_name)s" #: djoser/templates/email/activation.html:8 #: djoser/templates/email/activation.html:19 #, python-format msgid "" "You're receiving this email because you need to finish activation process on " "%(site_name)s." msgstr "" "Usted ha recibido este correo porque necesita finalizar el proceso de activación en " "%(site_name)s." #: djoser/templates/email/activation.html:10 #: djoser/templates/email/activation.html:21 msgid "Please go to the following page to activate account:" msgstr "Por favor diríjase a la siguiente página para activar su cuenta:" #: djoser/templates/email/activation.html:13 #: djoser/templates/email/activation.html:24 #: djoser/templates/email/confirmation.html:10 #: djoser/templates/email/confirmation.html:18 #: djoser/templates/email/password_changed_confirmation.html:10 #: djoser/templates/email/password_changed_confirmation.html:18 #: djoser/templates/email/password_reset.html:14 #: djoser/templates/email/password_reset.html:26 #: djoser/templates/email/username_changed_confirmation.html:10 #: djoser/templates/email/username_changed_confirmation.html:18 #: djoser/templates/email/username_reset.html:14 #: djoser/templates/email/username_reset.html:26 msgid "Thanks for using our site!" msgstr "¡Gracias por usar nuestro sitio!" #: djoser/templates/email/activation.html:15 #: djoser/templates/email/activation.html:26 #: djoser/templates/email/confirmation.html:12 #: djoser/templates/email/confirmation.html:20 #: djoser/templates/email/password_changed_confirmation.html:12 #: djoser/templates/email/password_changed_confirmation.html:20 #: djoser/templates/email/password_reset.html:16 #: djoser/templates/email/password_reset.html:28 #: djoser/templates/email/username_changed_confirmation.html:12 #: djoser/templates/email/username_changed_confirmation.html:20 #: djoser/templates/email/username_reset.html:16 #: djoser/templates/email/username_reset.html:28 #, python-format msgid "The %(site_name)s team" msgstr "El equipo de %(site_name)s" #: djoser/templates/email/confirmation.html:4 #, python-format msgid "" "%(site_name)s - Your account has been successfully created and activated!" msgstr "%(site_name)s - ¡Su cuenta ha sido creada y activada con éxito!" #: djoser/templates/email/confirmation.html:8 #: djoser/templates/email/confirmation.html:16 msgid "Your account has been created and is ready to use!" msgstr "¡Se ha creado su cuenta y está lista para su uso!" #: djoser/templates/email/password_changed_confirmation.html:4 #, python-format msgid "%(site_name)s - Your password has been successfully changed!" msgstr "%(site_name)s - ¡Su contraseña se ha cambiado con éxito!" #: djoser/templates/email/password_changed_confirmation.html:8 #: djoser/templates/email/password_changed_confirmation.html:16 msgid "Your password has been changed!" msgstr "¡Su contraseña ha sido cambiada!" #: djoser/templates/email/password_reset.html:4 #, python-format msgid "Password reset on %(site_name)s" msgstr "Restablecimiento de contraseña en %(site_name)s" #: djoser/templates/email/password_reset.html:8 #: djoser/templates/email/password_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" "Usted ha recibido este correo porque solicitó un cambio de contraseña para su " "cuenta en %(site_name)s" #: djoser/templates/email/password_reset.html:10 #: djoser/templates/email/password_reset.html:22 msgid "Please go to the following page and choose a new password:" msgstr "Por favor diríjase a la siguiente página para seleccionar su nueva contraseña:" #: djoser/templates/email/password_reset.html:12 #: djoser/templates/email/password_reset.html:24 #: djoser/templates/email/username_reset.html:12 #: djoser/templates/email/username_reset.html:24 msgid "Your username, in case you've forgotten:" msgstr "Su nombre de usuario, en caso de que lo haya olvidado:" #: djoser/templates/email/username_changed_confirmation.html:4 #, python-format msgid "%(site_name)s - Your username has been successfully changed!" msgstr "%(site_name)s - ¡Su nombre de usuario ha sido cambiado con éxito!" #: djoser/templates/email/username_changed_confirmation.html:8 #: djoser/templates/email/username_changed_confirmation.html:16 msgid "Your username has been changed!" msgstr "¡Su nombre de usuario ha sido cambiado!" #: djoser/templates/email/username_reset.html:4 #, python-format msgid "Username reset on %(site_name)s" msgstr "Restablecimiento de usuario en %(site_name)s" #: djoser/templates/email/username_reset.html:8 #: djoser/templates/email/username_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a username reset for your " "user account at %(site_name)s." msgstr "" "Usted ha recibido este correo porque solicitó un cambio de nombre de usuario para su " "cuenta en %(site_name)s" #: djoser/templates/email/username_reset.html:10 #: djoser/templates/email/username_reset.html:22 msgid "Please go to the following page and choose a new username:" msgstr "Por favor diríjase a la siguiente página para seleccionar un nuevo nombre de usuario:" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171467.7270267 djoser-2.3.1/djoser/locale/fr/LC_MESSAGES/django.mo0000644000000000000000000000742500000000000017662 0ustar0000000000000000I<7<t#&,:L:4.%E k+%[2jj2d(uEvAF&E l > C 3 K: P @ * #C g 7 .  9 &@ Cg 8 h uM z ;>$z)K%(site_name)s - Your account has been successfully created and activated!%(site_name)s - Your password has been successfully changed!%(site_name)s - Your username has been successfully changed!Account activation on %(site_name)sInvalid password.Invalid token for given user.Invalid user id or user doesn't exist.Password reset on %(site_name)sPlease go to the following page and choose a new password:Please go to the following page and choose a new username:Please go to the following page to activate account:Stale token for given user.Thanks for using our site!The %(site_name)s teamThe two password fields didn't match.The two {0} fields didn't match.Unable to create account.Unable to log in with provided credentials.User account is disabled.User with given email does not exist.Username reset on %(site_name)sYou're receiving this email because you need to finish activation process on %(site_name)s.You're receiving this email because you requested a password reset for your user account at %(site_name)s.You're receiving this email because you requested a username reset for your user account at %(site_name)s.Your account has been created and is ready to use!Your password has been changed!Your username has been changed!Your username, in case you've forgotten:Project-Id-Version: djoser Report-Msgid-Bugs-To: POT-Creation-Date: 2021-04-21 09:07+0200 PO-Revision-Date: 2019-05-14 19:03+0200 Last-Translator: Julie Rymer Language: fr Language-Team: French Plural-Forms: nplurals=2; plural=(n > 1) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.8.0 %(site_name)s - Votre compte a été créé et activé avec succès !%(site_name)s - Votre mot de passe a été changé avec succès !%(site_name)s - Votre nom d'utilisateur a été changé avec succès !Activation du compte sur %(site_name)sMot de passe invalide.Le jeton d'authentification est invalide pour cet utilisateur.L'id de l'utilisateur est invalide ou cet utilisateur n'existe pas.Réinitialisation du mot de passe sur %(site_name)sMerci de cliquer sur le lien suivant pour choisir un nouveau mot de passe :Merci de cliquer sur le lien suivant pour choisir un nouveau nom d'utilisateur :Veuillez cliquer sur le lien suivant pour activer votre compte :Le jeton pour cet utilisateur est expiré.Merci d'avoir utilisé notre site !L'équipe %(site_name)sLe contenu des deux champs mot de passe est différent.Le contenu des deux champs {0} est différent.Création de compte impossible.Impossible de se connecter avec les identifiants fournis.Ce compte utilisateur est désactivé.Cette adresse email ne correspond à aucun utilisateur enregistré.Réinitialisation du nom d'utilisateur sur %(site_name)sVous recevez cet email car vous devez finir le processus d'activation de votre compte sur %(site_name)s.Vous recevez cet email car vous avez demandé la réinitialisation du mot de passe de votre compte sur %(site_name)s.Vous recevez cet email car vous avez demandé la réinitialisation du nom d'utilisateur de votre compte sur %(site_name)s.Votre compte a été créé et est prêt a être utilisé !Votre mot de passe a été changé !Votre nom d'utilisateur a été changé !Votre nom d'utilisateur, au cas où vous l'auriez oublié, est le suivant :././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/locale/fr/LC_MESSAGES/django.po0000644000000000000000000001523300000000000017661 0ustar0000000000000000# Copyright (C) Sunscrapers # This file is distributed under the same license as the djoser package. # # Translators: # Julie Rymer , 2019 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: djoser\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-04-21 09:07+0200\n" "PO-Revision-Date: 2019-05-14 19:03+0200\n" "Last-Translator: Julie Rymer \n" "Language-Team: French\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: constants.py:5 msgid "Unable to log in with provided credentials." msgstr "Impossible de se connecter avec les identifiants fournis." #: constants.py:6 msgid "User account is disabled." msgstr "Ce compte utilisateur est désactivé." #: constants.py:7 msgid "Invalid token for given user." msgstr "Le jeton d'authentification est invalide pour cet utilisateur." #: constants.py:8 msgid "Invalid user id or user doesn't exist." msgstr "L'id de l'utilisateur est invalide ou cet utilisateur n'existe pas." #: constants.py:9 msgid "Stale token for given user." msgstr "Le jeton pour cet utilisateur est expiré." #: constants.py:10 msgid "The two password fields didn't match." msgstr "Le contenu des deux champs mot de passe est différent." #: constants.py:11 #, python-brace-format msgid "The two {0} fields didn't match." msgstr "Le contenu des deux champs {0} est différent." #: constants.py:12 msgid "Invalid password." msgstr "Mot de passe invalide." #: constants.py:13 msgid "User with given email does not exist." msgstr "Cette adresse email ne correspond à aucun utilisateur enregistré." #: constants.py:14 msgid "Unable to create account." msgstr "Création de compte impossible." #: templates/email/activation.html:4 #, python-format msgid "Account activation on %(site_name)s" msgstr "Activation du compte sur %(site_name)s" #: templates/email/activation.html:8 templates/email/activation.html:19 #, python-format msgid "" "You're receiving this email because you need to finish activation process on " "%(site_name)s." msgstr "" "Vous recevez cet email car vous devez finir le processus d'activation de " "votre compte sur %(site_name)s." #: templates/email/activation.html:10 templates/email/activation.html:21 msgid "Please go to the following page to activate account:" msgstr "Veuillez cliquer sur le lien suivant pour activer votre compte :" #: templates/email/activation.html:13 templates/email/activation.html:24 #: templates/email/confirmation.html:10 templates/email/confirmation.html:18 #: templates/email/password_changed_confirmation.html:10 #: templates/email/password_changed_confirmation.html:18 #: templates/email/password_reset.html:14 #: templates/email/password_reset.html:26 #: templates/email/username_changed_confirmation.html:10 #: templates/email/username_changed_confirmation.html:18 #: templates/email/username_reset.html:14 #: templates/email/username_reset.html:26 msgid "Thanks for using our site!" msgstr "Merci d'avoir utilisé notre site !" #: templates/email/activation.html:15 templates/email/activation.html:26 #: templates/email/confirmation.html:12 templates/email/confirmation.html:20 #: templates/email/password_changed_confirmation.html:12 #: templates/email/password_changed_confirmation.html:20 #: templates/email/password_reset.html:16 #: templates/email/password_reset.html:28 #: templates/email/username_changed_confirmation.html:12 #: templates/email/username_changed_confirmation.html:20 #: templates/email/username_reset.html:16 #: templates/email/username_reset.html:28 #, python-format msgid "The %(site_name)s team" msgstr "L'équipe %(site_name)s" #: templates/email/confirmation.html:4 #, python-format msgid "" "%(site_name)s - Your account has been successfully created and activated!" msgstr "%(site_name)s - Votre compte a été créé et activé avec succès !" #: templates/email/confirmation.html:8 templates/email/confirmation.html:16 msgid "Your account has been created and is ready to use!" msgstr "Votre compte a été créé et est prêt a être utilisé !" #: templates/email/password_changed_confirmation.html:4 #, python-format msgid "%(site_name)s - Your password has been successfully changed!" msgstr "%(site_name)s - Votre mot de passe a été changé avec succès !" #: templates/email/password_changed_confirmation.html:8 #: templates/email/password_changed_confirmation.html:16 msgid "Your password has been changed!" msgstr "Votre mot de passe a été changé !" #: templates/email/password_reset.html:4 #, python-format msgid "Password reset on %(site_name)s" msgstr "Réinitialisation du mot de passe sur %(site_name)s" #: templates/email/password_reset.html:8 templates/email/password_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" "Vous recevez cet email car vous avez demandé la réinitialisation du mot de " "passe de votre compte sur %(site_name)s." #: templates/email/password_reset.html:10 #: templates/email/password_reset.html:22 msgid "Please go to the following page and choose a new password:" msgstr "" "Merci de cliquer sur le lien suivant pour choisir un nouveau mot de passe :" #: templates/email/password_reset.html:12 #: templates/email/password_reset.html:24 #: templates/email/username_reset.html:12 #: templates/email/username_reset.html:24 msgid "Your username, in case you've forgotten:" msgstr "" "Votre nom d'utilisateur, au cas où vous l'auriez oublié, est le suivant :" #: templates/email/username_changed_confirmation.html:4 #, python-format msgid "%(site_name)s - Your username has been successfully changed!" msgstr "%(site_name)s - Votre nom d'utilisateur a été changé avec succès !" #: templates/email/username_changed_confirmation.html:8 #: templates/email/username_changed_confirmation.html:16 msgid "Your username has been changed!" msgstr "Votre nom d'utilisateur a été changé !" #: templates/email/username_reset.html:4 #, python-format msgid "Username reset on %(site_name)s" msgstr "Réinitialisation du nom d'utilisateur sur %(site_name)s" #: templates/email/username_reset.html:8 templates/email/username_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a username reset for your " "user account at %(site_name)s." msgstr "" "Vous recevez cet email car vous avez demandé la réinitialisation du nom " "d'utilisateur de votre compte sur %(site_name)s." #: templates/email/username_reset.html:10 #: templates/email/username_reset.html:22 msgid "Please go to the following page and choose a new username:" msgstr "" "Merci de cliquer sur le lien suivant pour choisir un nouveau nom " "d'utilisateur :" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171467.6870263 djoser-2.3.1/djoser/locale/id/LC_MESSAGES/django.mo0000644000000000000000000000671700000000000017652 0ustar0000000000000000I<7<t#&,:L:4.%E k+%[2jj2d(n?o69 ? 0W 0 . 7 : 5[ ) *  $  9 3S  / 1 [ mb p *A l # %(site_name)s - Your account has been successfully created and activated!%(site_name)s - Your password has been successfully changed!%(site_name)s - Your username has been successfully changed!Account activation on %(site_name)sInvalid password.Invalid token for given user.Invalid user id or user doesn't exist.Password reset on %(site_name)sPlease go to the following page and choose a new password:Please go to the following page and choose a new username:Please go to the following page to activate account:Stale token for given user.Thanks for using our site!The %(site_name)s teamThe two password fields didn't match.The two {0} fields didn't match.Unable to create account.Unable to log in with provided credentials.User account is disabled.User with given email does not exist.Username reset on %(site_name)sYou're receiving this email because you need to finish activation process on %(site_name)s.You're receiving this email because you requested a password reset for your user account at %(site_name)s.You're receiving this email because you requested a username reset for your user account at %(site_name)s.Your account has been created and is ready to use!Your password has been changed!Your username has been changed!Your username, in case you've forgotten:Project-Id-Version: djoser Report-Msgid-Bugs-To: POT-Creation-Date: 2023-03-06 13:34+0800 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Kira Language: id Language-Team: Indonesian Plural-Forms: nplurals=1; plural=0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.8.0 %(site_name)s - Akun Anda telah berhasil dibuat dan diaktifkan!%(site_name)s - Kata sandi Anda telah berhasil diubah!%(site_name)s - Nama pengguna Anda telah berhasil diubah!Aktivasi akun di %(site_name)sKata sandi tidak valid.Token tidak valid untuk pengguna yang diberikan.ID pengguna tidak valid atau pengguna tidak ada.Pengaturan ulang kata sandi pada %(site_name)sSilakan buka halaman berikut dan pilih kata sandi baru:Silakan buka halaman berikut dan pilih nama pengguna baru:Silakan buka halaman berikut untuk mengaktifkan akun:Token basi untuk pengguna yang diberikan.Terima kasih telah menggunakan situs kami!Tim %(site_name)sKedua bidang kata sandi tidak cocok.Dua bidang {0} tidak cocok.Tidak dapat membuat akun.Tidak dapat masuk dengan kredensial yang diberikan.Akun pengguna dinonaktifkan.Pengguna dengan email yang diberikan tidak ada.Pengaturan ulang nama pengguna pada %(site_name)sAnda menerima email ini karena Anda harus menyelesaikan proses aktivasi pada %(site_name)s.Anda menerima email ini karena Anda meminta pengaturan ulang kata sandi untuk akun pengguna di %(site_name)s.Anda menerima email ini karena Anda meminta pengaturan ulang nama pengguna untuk akun pengguna di %(site_name)s.Akun Anda telah dibuat dan siap digunakan!Kata sandi Anda telah diubah!Nama pengguna Anda telah diubah!Nama pengguna Anda, jika Anda lupa:././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/locale/id/LC_MESSAGES/django.po0000644000000000000000000001557700000000000017661 0ustar0000000000000000# Copyright (C) Sunscrapers # This file is distributed under the same license as the djoser package. # Kira , 2023. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: djoser\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2023-03-06 13:34+0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Kira \n" "Language-Team: Indonesian\n" "Language: id\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" #: .\djoser\constants.py:5 msgid "Unable to log in with provided credentials." msgstr "Tidak dapat masuk dengan kredensial yang diberikan." #: .\djoser\constants.py:6 msgid "User account is disabled." msgstr "Akun pengguna dinonaktifkan." #: .\djoser\constants.py:7 msgid "Invalid token for given user." msgstr "Token tidak valid untuk pengguna yang diberikan." #: .\djoser\constants.py:8 msgid "Invalid user id or user doesn't exist." msgstr "ID pengguna tidak valid atau pengguna tidak ada." #: .\djoser\constants.py:9 msgid "Stale token for given user." msgstr "Token basi untuk pengguna yang diberikan." #: .\djoser\constants.py:10 msgid "The two password fields didn't match." msgstr "Kedua bidang kata sandi tidak cocok." #: .\djoser\constants.py:11 #, python-brace-format msgid "The two {0} fields didn't match." msgstr "Dua bidang {0} tidak cocok." #: .\djoser\constants.py:12 msgid "Invalid password." msgstr "Kata sandi tidak valid." #: .\djoser\constants.py:13 msgid "User with given email does not exist." msgstr "Pengguna dengan email yang diberikan tidak ada." #: .\djoser\constants.py:14 msgid "Unable to create account." msgstr "Tidak dapat membuat akun." #: .\djoser\templates\email\activation.html:4 #, python-format msgid "Account activation on %(site_name)s" msgstr "Aktivasi akun di %(site_name)s" #: .\djoser\templates\email\activation.html:8 #: .\djoser\templates\email\activation.html:19 #, python-format msgid "" "You're receiving this email because you need to finish activation process on " "%(site_name)s." msgstr "" "Anda menerima email ini karena Anda harus menyelesaikan proses aktivasi pada " "%(site_name)s." #: .\djoser\templates\email\activation.html:10 #: .\djoser\templates\email\activation.html:21 msgid "Please go to the following page to activate account:" msgstr "Silakan buka halaman berikut untuk mengaktifkan akun:" #: .\djoser\templates\email\activation.html:13 #: .\djoser\templates\email\activation.html:24 #: .\djoser\templates\email\confirmation.html:10 #: .\djoser\templates\email\confirmation.html:18 #: .\djoser\templates\email\password_changed_confirmation.html:10 #: .\djoser\templates\email\password_changed_confirmation.html:18 #: .\djoser\templates\email\password_reset.html:14 #: .\djoser\templates\email\password_reset.html:26 #: .\djoser\templates\email\username_changed_confirmation.html:10 #: .\djoser\templates\email\username_changed_confirmation.html:18 #: .\djoser\templates\email\username_reset.html:14 #: .\djoser\templates\email\username_reset.html:26 msgid "Thanks for using our site!" msgstr "Terima kasih telah menggunakan situs kami!" #: .\djoser\templates\email\activation.html:15 #: .\djoser\templates\email\activation.html:26 #: .\djoser\templates\email\confirmation.html:12 #: .\djoser\templates\email\confirmation.html:20 #: .\djoser\templates\email\password_changed_confirmation.html:12 #: .\djoser\templates\email\password_changed_confirmation.html:20 #: .\djoser\templates\email\password_reset.html:16 #: .\djoser\templates\email\password_reset.html:28 #: .\djoser\templates\email\username_changed_confirmation.html:12 #: .\djoser\templates\email\username_changed_confirmation.html:20 #: .\djoser\templates\email\username_reset.html:16 #: .\djoser\templates\email\username_reset.html:28 #, python-format msgid "The %(site_name)s team" msgstr "Tim %(site_name)s" #: .\djoser\templates\email\confirmation.html:4 #, python-format msgid "" "%(site_name)s - Your account has been successfully created and activated!" msgstr "" "%(site_name)s - Akun Anda telah berhasil dibuat dan diaktifkan!" #: .\djoser\templates\email\confirmation.html:8 #: .\djoser\templates\email\confirmation.html:16 msgid "Your account has been created and is ready to use!" msgstr "Akun Anda telah dibuat dan siap digunakan!" #: .\djoser\templates\email\password_changed_confirmation.html:4 #, python-format msgid "%(site_name)s - Your password has been successfully changed!" msgstr "%(site_name)s - Kata sandi Anda telah berhasil diubah!" #: .\djoser\templates\email\password_changed_confirmation.html:8 #: .\djoser\templates\email\password_changed_confirmation.html:16 msgid "Your password has been changed!" msgstr "Kata sandi Anda telah diubah!" #: .\djoser\templates\email\password_reset.html:4 #, python-format msgid "Password reset on %(site_name)s" msgstr "Pengaturan ulang kata sandi pada %(site_name)s" #: .\djoser\templates\email\password_reset.html:8 #: .\djoser\templates\email\password_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" "Anda menerima email ini karena Anda meminta pengaturan ulang kata sandi " "untuk akun pengguna di %(site_name)s." #: .\djoser\templates\email\password_reset.html:10 #: .\djoser\templates\email\password_reset.html:22 msgid "Please go to the following page and choose a new password:" msgstr "Silakan buka halaman berikut dan pilih kata sandi baru:" #: .\djoser\templates\email\password_reset.html:12 #: .\djoser\templates\email\password_reset.html:24 #: .\djoser\templates\email\username_reset.html:12 #: .\djoser\templates\email\username_reset.html:24 msgid "Your username, in case you've forgotten:" msgstr "Nama pengguna Anda, jika Anda lupa:" #: .\djoser\templates\email\username_changed_confirmation.html:4 #, python-format msgid "%(site_name)s - Your username has been successfully changed!" msgstr "%(site_name)s - Nama pengguna Anda telah berhasil diubah!" #: .\djoser\templates\email\username_changed_confirmation.html:8 #: .\djoser\templates\email\username_changed_confirmation.html:16 msgid "Your username has been changed!" msgstr "Nama pengguna Anda telah diubah!" #: .\djoser\templates\email\username_reset.html:4 #, python-format msgid "Username reset on %(site_name)s" msgstr "Pengaturan ulang nama pengguna pada %(site_name)s" #: .\djoser\templates\email\username_reset.html:8 #: .\djoser\templates\email\username_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a username reset for your " "user account at %(site_name)s." msgstr "" "Anda menerima email ini karena Anda meminta pengaturan ulang nama pengguna " "untuk akun pengguna di %(site_name)s." #: .\djoser\templates\email\username_reset.html:10 #: .\djoser\templates\email\username_reset.html:22 msgid "Please go to the following page and choose a new username:" msgstr "Silakan buka halaman berikut dan pilih nama pengguna baru:" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1731171467.683026 djoser-2.3.1/djoser/locale/ja/LC_MESSAGES/django.mo0000644000000000000000000000546000000000000017642 0ustar0000000000000000|I}#&B:b4 %  Fg+%[jI2(|A>*-9Ag,IL *m(H>" 3a ? * Y JZ G +  %(site_name)s - Your account has been successfully created and activated!Account activation on %(site_name)sInvalid password.Invalid token for given user.Invalid user id or user doesn't exist.Password reset on %(site_name)sPlease go to the following page and choose a new password:Please go to the following page to activate account:Stale token for given user.Thanks for using our site!The %(site_name)s teamThe two password fields didn't match.The two {0} fields didn't match.Unable to create account.Unable to log in with provided credentials.User account is disabled.User with given email does not exist.You're receiving this email because you need to finish activation process on %(site_name)s.You're receiving this email because you requested a password reset for your user account at %(site_name)s.Your account has been created and is ready to use!Your username, in case you've forgotten:Project-Id-Version: djoser Report-Msgid-Bugs-To: POT-Creation-Date: 2020-12-31 13:52-0700 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Daiki Nakashita Language: ja Language-Team: Japanese Plural-Forms: nplurals=2; plural=(n > 1) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.8.0 %(site_name)s - アカウントの有効化が完了しました!%(site_name)s でアカウントを有効化してくださいパスワードが間違っています。有効なトークンではありません。ユーザーIDまたはユーザー自体が存在しません。%(site_name)s のパスワードリセットこちらのページで新規パスワードを登録してください:こちらのページでアカウントの有効化を行ってください:有効期限切れのトークンです。ご利用ありがとうございます!%(site_name)s チーム入力された2つのパスワードが一致しませんでした。入力された2つの {0} が一致しませんでした。アカウントを作成できませんでした。入力された情報でログインできませんでした。使用不可能なアカウントです。入力されたemailを使用しているユーザーは見つかりませんでした。%(site_name)s でアカウントを有効化する必要があります。%(site_name)s のパスワードリセットを受け付けました。アカウントが有効になりました!ユーザーネーム:././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/locale/ja/LC_MESSAGES/django.po0000644000000000000000000001077600000000000017653 0ustar0000000000000000# Copyright (C) Sunscrapers # This file is distributed under the same license as the djoser package. # msgid "" msgstr "" "Project-Id-Version: djoser\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-31 13:52-0700\n" "Last-Translator: Daiki Nakashita \n" "Language-Team: Japanese\n" "Language: ja\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: djoser/constants.py:4 msgid "Unable to log in with provided credentials." msgstr "入力された情報でログインできませんでした。" #: djoser/constants.py:5 msgid "User account is disabled." msgstr "使用不可能なアカウントです。" #: djoser/constants.py:6 msgid "Invalid token for given user." msgstr "有効なトークンではありません。" #: djoser/constants.py:7 msgid "Invalid user id or user doesn't exist." msgstr "ユーザーIDまたはユーザー自体が存在しません。" #: djoser/constants.py:8 msgid "Stale token for given user." msgstr "有効期限切れのトークンです。" #: djoser/constants.py:9 msgid "The two password fields didn't match." msgstr "入力された2つのパスワードが一致しませんでした。" #: djoser/constants.py:10 #, python-brace-format msgid "The two {0} fields didn't match." msgstr "入力された2つの {0} が一致しませんでした。" #: djoser/constants.py:11 msgid "Invalid password." msgstr "パスワードが間違っています。" #: djoser/constants.py:12 msgid "User with given email does not exist." msgstr "入力されたemailを使用しているユーザーは見つかりませんでした。" #: djoser/constants.py:13 msgid "Unable to create account." msgstr "アカウントを作成できませんでした。" #: djoser/templates/email/activation.html:4 #, python-format msgid "Account activation on %(site_name)s" msgstr "%(site_name)s でアカウントを有効化してください" #: templates/email/activation.html:8 templates/email/activation.html:19 #, python-format msgid "" "You're receiving this email because you need to finish activation process on " "%(site_name)s." msgstr "" "%(site_name)s でアカウントを有効化する必要があります。" #: djoser/templates/email/activation.html:10 #: djoser/templates/email/activation.html:22 msgid "Please go to the following page to activate account:" msgstr "こちらのページでアカウントの有効化を行ってください:" #: djoser/templates/email/activation.html:13 #: djoser/templates/email/activation.html:25 #: djoser/templates/email/confirmation.html:10 #: djoser/templates/email/confirmation.html:18 #: djoser/templates/email/password_reset.html:14 #: djoser/templates/email/password_reset.html:26 msgid "Thanks for using our site!" msgstr "ご利用ありがとうございます!" #: djoser/templates/email/activation.html:15 #: djoser/templates/email/activation.html:27 #: djoser/templates/email/confirmation.html:12 #: djoser/templates/email/confirmation.html:20 #: djoser/templates/email/password_reset.html:16 #: djoser/templates/email/password_reset.html:28 #, python-format msgid "The %(site_name)s team" msgstr "%(site_name)s チーム" #: djoser/templates/email/confirmation.html:4 #, python-format msgid "" "%(site_name)s - Your account has been successfully created and activated!" msgstr "%(site_name)s - アカウントの有効化が完了しました!" #: djoser/templates/email/confirmation.html:8 #: djoser/templates/email/confirmation.html:16 msgid "Your account has been created and is ready to use!" msgstr "アカウントが有効になりました!" #: djoser/templates/email/password_reset.html:4 #, python-format msgid "Password reset on %(site_name)s" msgstr "%(site_name)s のパスワードリセット" #: djoser/templates/email/password_reset.html:8 #: djoser/templates/email/password_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" "%(site_name)s のパスワードリセットを受け付けました。" #: djoser/templates/email/password_reset.html:10 #: djoser/templates/email/password_reset.html:22 msgid "Please go to the following page and choose a new password:" msgstr "こちらのページで新規パスワードを登録してください:" #: djoser/templates/email/password_reset.html:12 #: djoser/templates/email/password_reset.html:24 msgid "Your username, in case you've forgotten:" msgstr "ユーザーネーム:" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171467.6910262 djoser-2.3.1/djoser/locale/ka/LC_MESSAGES/django.mo0000644000000000000000000001065100000000000017641 0ustar0000000000000000I# &+R:r4%0 Vw*%q[j2^(JX,P`}{MZ s x 8 M 0 iM J Q T 8 $ b6pc%(site_name)s - Your account has been successfully created and activated!Account activation on %(site_name)sInvalid password.Invalid token for given user.Invalid user id or user doesn't exist.Password reset on %(site_name)sPlease go to the following page and choose a new password:Please go to the following page to activate account:Stale token for given user.Thanks for using our site!The %(site_name)s teamThe two password fields didn't match.The two {0} fields didn't match.Unable to create account.Unable to login with provided credentials.User account is disabled.User model does not contain specified email field. Please see http://djoser.readthedocs.io/en/latest/settings.html#USER_EMAIL_FIELD_NAME for more details.User with given email does not exist.You're receiving this email because you need to finish activation process on %(site_name)s.You're receiving this email because you requested a password reset for your user account at %(site_name)s.Your account has been created and is ready to use!Your username, in case you've forgotten:Project-Id-Version: 1.4.0 Report-Msgid-Bugs-To: POT-Creation-Date: 2019-01-25 09:44+0100 PO-Revision-Date: 2019-01-29 14:25+0100 Last-Translator: Szymon Pyżalski Language: ka_GE Language-Team: http://sunscrapers.com Plural-Forms: nplurals=1; plural=0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.8.0 %(site_name)s - თქვენი ანგარიში წარმატებით შეიქმნილია და გააკტიურებულია.ანგარიშის აკტივაცია საიტზე %(site_name)sარასწორი პაროლი.ნიშანი ტოკენი ამ მომხმარებელისთვისსახელი არასწორია ან მომხმარებელი არ არსებობს.პაროლის აღდგენა საიტზე %(site_name)s.მოჰყევით ამ ლინკს და მიუთითეთ ახალი პაროლი:მიჰყევით ამ ლინკს რათა გაააკტიუროთ ანგარიში:ნიშანი მოძველებულია.მადლობა საითის გამოიყენებასსაიტის %(site_name)s გუნდიპაროლის ორი ველი ერთმანეთს არ ემთხვევა.ორი {0} ერთმანეთს არ ემთხვევა.ანგარიშის შექმნა შეუძლებულია.შესვლა ამ სახელით და პაროლით არ არის შესაძლებელი.ანგარიში გამორთულია.მომხმარებელის მოდელი არ შეიცავს მითითებულ იმეილის ველს. ნახე http://djoser.readthedocs.io/en/latest/settings.html#USER_EMAIL_FIELD_NAME მეტი დეტალებისთვისმომხმარებელი ამ იმეილით არ არსებობს.თქვენ იღებთ ამ იმეილს, რადგან საჭიროა დაამთავროთ აკტივაციი პროცესი საიტზე %(site_name)s.ამ ემაილს იღებთ, რანდან თქვნენ მოთხოვეთ პაროლის აღდგენა თქვენი ანგარიშისთვის %(site_name)s საიტზე.თქვენი ანგარიში შეიქმნილია და მზად არის გამოყენებისთვის!თქვენი მომხმარებლის სახელი, იმ შემთხვევისათვის თუ დაგავიწყდათ:././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/locale/ka/LC_MESSAGES/django.po0000644000000000000000000001362200000000000017645 0ustar0000000000000000# Copyright (C) Sunscrapers # This file is distributed under the same license as the djoser package. # msgid "" msgstr "" "Project-Id-Version: 1.4.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-01-25 09:44+0100\n" "PO-Revision-Date: 2019-01-29 14:25+0100\n" "Last-Translator: Szymon Pyżalski \n" "Language-Team: http://sunscrapers.com\n" "Language: ka_GE\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: constants.py:4 msgid "Unable to login with provided credentials." msgstr "შესვლა ამ სახელით და პაროლით არ არის შესაძლებელი." #: constants.py:5 msgid "User account is disabled." msgstr "ანგარიში გამორთულია." #: constants.py:6 msgid "Invalid token for given user." msgstr "ნიშანი ტოკენი ამ მომხმარებელისთვის" #: constants.py:7 msgid "Invalid user id or user doesn't exist." msgstr "სახელი არასწორია ან მომხმარებელი არ არსებობს." #: constants.py:8 msgid "Stale token for given user." msgstr "ნიშანი მოძველებულია." #: constants.py:9 msgid "The two password fields didn't match." msgstr "პაროლის ორი ველი ერთმანეთს არ ემთხვევა." #: constants.py:10 #, python-brace-format msgid "The two {0} fields didn't match." msgstr "ორი {0} ერთმანეთს არ ემთხვევა." #: constants.py:11 msgid "Invalid password." msgstr "არასწორი პაროლი." #: constants.py:12 msgid "User with given email does not exist." msgstr "მომხმარებელი ამ იმეილით არ არსებობს." #: constants.py:13 msgid "Unable to create account." msgstr "ანგარიშის შექმნა შეუძლებულია." #: constants.py:15 msgid "" "User model does not contain specified email field. Please see http://djoser." "readthedocs.io/en/latest/settings.html#USER_EMAIL_FIELD_NAME for more " "details." msgstr "მომხმარებელის მოდელი არ შეიცავს მითითებულ იმეილის ველს. ნახე " "http://djoser.readthedocs.io/en/latest/settings.html#USER_EMAIL_FIELD_NAME " "მეტი დეტალებისთვის" #: templates/email/activation.html:4 #, python-format msgid "Account activation on %(site_name)s" msgstr "ანგარიშის აკტივაცია საიტზე %(site_name)s" #: templates/email/activation.html:8 templates/email/activation.html:19 #, python-format msgid "" "You're receiving this email because you need to finish activation process on " "%(site_name)s." msgstr "თქვენ იღებთ ამ იმეილს, რადგან საჭიროა დაამთავროთ აკტივაციი პროცესი საიტზე %(site_name)s." #: templates/email/activation.html:10 templates/email/activation.html:22 msgid "Please go to the following page to activate account:" msgstr "მიჰყევით ამ ლინკს რათა გაააკტიუროთ ანგარიში:" #: templates/email/activation.html:13 templates/email/activation.html:25 #: templates/email/confirmation.html:10 templates/email/confirmation.html:18 #: templates/email/password_reset.html:14 #: templates/email/password_reset.html:26 msgid "Thanks for using our site!" msgstr "მადლობა საითის გამოიყენებას" #: templates/email/activation.html:15 templates/email/activation.html:27 #: templates/email/confirmation.html:12 templates/email/confirmation.html:20 #: templates/email/password_reset.html:16 #: templates/email/password_reset.html:28 #, python-format msgid "The %(site_name)s team" msgstr "საიტის %(site_name)s გუნდი" #: templates/email/confirmation.html:4 #, python-format msgid "" "%(site_name)s - Your account has been successfully created and activated!" msgstr "%(site_name)s - თქვენი ანგარიში წარმატებით შეიქმნილია და გააკტიურებულია." #: templates/email/confirmation.html:8 templates/email/confirmation.html:16 msgid "Your account has been created and is ready to use!" msgstr "თქვენი ანგარიში შეიქმნილია და მზად არის გამოყენებისთვის!" #: templates/email/password_reset.html:4 #, python-format msgid "Password reset on %(site_name)s" msgstr "პაროლის აღდგენა საიტზე %(site_name)s." #: templates/email/password_reset.html:8 templates/email/password_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "ამ ემაილს იღებთ, რანდან თქვნენ მოთხოვეთ პაროლის აღდგენა თქვენი ანგარიშისთვის " "%(site_name)s საიტზე." #: templates/email/password_reset.html:10 #: templates/email/password_reset.html:22 msgid "Please go to the following page and choose a new password:" msgstr "მოჰყევით ამ ლინკს და მიუთითეთ ახალი პაროლი:" #: templates/email/password_reset.html:12 #: templates/email/password_reset.html:24 msgid "Your username, in case you've forgotten:" msgstr "თქვენი მომხმარებლის სახელი, იმ შემთხვევისათვის თუ დაგავიწყდათ:" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171467.7230265 djoser-2.3.1/djoser/locale/me/LC_MESSAGES/django.mo0000644000000000000000000000340500000000000017646 0ustar0000000000000000 |I#'K:k4[ ji2(T0G/@M^W]5<4%(site_name)s - Your account has been successfully created and activated!Account activation on %(site_name)sPassword reset on %(site_name)sPlease go to the following page and choose a new password:Please go to the following page to activate account:Thanks for using our site!The %(site_name)s teamYou're receiving this email because you need to finish activation process on %(site_name)s.You're receiving this email because you requested a password reset for your user account at %(site_name)s.Your account has been created and is ready to use!Your username, in case you've forgotten:Project-Id-Version: djoser Report-Msgid-Bugs-To: POT-Creation-Date: 2020-01-13 17:40+0100 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Nikola Kadić Language: me Language-Team: Serbian MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.8.0 %(site_name) - Vaš korisnički nalog je uspješno kreiran i aktiviran!Aktivacija korisničkog naloga za %(site_name)sIzmjena lozinke za %(site_name)Molimo vas otvorite sljedeću stranicu i izaberite novu lozinku:Molimo vas otvorite sljedeću stranicu da biste aktivirali korisnički nalog:Hvala što koristite naš sajt!Tim %(site_name)Dobili ste ovaj email jer treba da dovršite proces aktivacije naloga na %(site_name)s.Dobili ste ovaj mejl jer ste zahtijevali izmjenu lozinke za korisnički nalog za %(site_name)Vaš korisnički nalog je kreiran i spreman za korišćenje!Vaše korisničko ime, u slučaju da ste zaboravili:././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/locale/me/LC_MESSAGES/django.po0000644000000000000000000000775400000000000017664 0ustar0000000000000000# Copyright (C) Sunscrapers # This file is distributed under the same license as the djoser package. # # Translators: # Nikola Kadić , 2020 # msgid "" msgstr "" "Project-Id-Version: djoser\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-01-13 17:40+0100\n" "Last-Translator: Nikola Kadić \n" "Language-Team: Serbian\n" "Language: me\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: constants.py:4 msgid "Unable to log in with provided credentials." msgstr "" #: constants.py:5 msgid "User account is disabled." msgstr "" #: constants.py:6 msgid "Invalid token for given user." msgstr "" #: constants.py:7 msgid "Invalid user id or user doesn't exist." msgstr "" #: constants.py:8 msgid "Stale token for given user." msgstr "" #: constants.py:9 msgid "The two password fields didn't match." msgstr "" #: constants.py:10 #, python-brace-format msgid "The two {0} fields didn't match." msgstr "" #: constants.py:11 msgid "Invalid password." msgstr "" #: constants.py:12 msgid "User with given email does not exist." msgstr "" #: constants.py:13 msgid "Unable to create account." msgstr "" #: constants.py:15 msgid "" "User model does not contain specified email field. Please see http://djoser." "readthedocs.io/en/latest/settings.html#USER_EMAIL_FIELD_NAME for more " "details." msgstr "" "" #: templates/email/activation.html:4 #, python-format msgid "Account activation on %(site_name)s" msgstr "Aktivacija korisničkog naloga za %(site_name)s" #: templates/email/activation.html:8 templates/email/activation.html:19 #, python-format msgid "" "You're receiving this email because you need to finish activation process on " "%(site_name)s." msgstr "" "Dobili ste ovaj email jer treba da dovršite proces aktivacije naloga na %(site_name)s." #: templates/email/activation.html:10 templates/email/activation.html:22 msgid "Please go to the following page to activate account:" msgstr "Molimo vas otvorite sljedeću stranicu da biste aktivirali korisnički nalog:" #: templates/email/activation.html:13 templates/email/activation.html:25 #: templates/email/confirmation.html:10 templates/email/confirmation.html:18 #: templates/email/password_reset.html:14 #: templates/email/password_reset.html:26 msgid "Thanks for using our site!" msgstr "Hvala što koristite naš sajt!" #: templates/email/activation.html:15 templates/email/activation.html:27 #: templates/email/confirmation.html:12 templates/email/confirmation.html:20 #: templates/email/password_reset.html:16 #: templates/email/password_reset.html:28 #, python-format msgid "The %(site_name)s team" msgstr "Tim %(site_name)" #: templates/email/confirmation.html:4 #, python-format msgid "" "%(site_name)s - Your account has been successfully created and activated!" msgstr "" "%(site_name) - Vaš korisnički nalog je uspješno kreiran i aktiviran!" #: templates/email/confirmation.html:8 templates/email/confirmation.html:16 msgid "Your account has been created and is ready to use!" msgstr "Vaš korisnički nalog je kreiran i spreman za korišćenje!" #: templates/email/password_reset.html:4 #, python-format msgid "Password reset on %(site_name)s" msgstr "Izmjena lozinke za %(site_name)" #: templates/email/password_reset.html:8 templates/email/password_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" "Dobili ste ovaj mejl jer ste zahtijevali izmjenu lozinke za korisnički nalog za %(site_name)" #: templates/email/password_reset.html:10 #: templates/email/password_reset.html:22 msgid "Please go to the following page and choose a new password:" msgstr "Molimo vas otvorite sljedeću stranicu i izaberite novu lozinku:" #: templates/email/password_reset.html:12 #: templates/email/password_reset.html:24 msgid "Your username, in case you've forgotten:" msgstr "Vaše korisničko ime, u slučaju da ste zaboravili:" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171467.7270267 djoser-2.3.1/djoser/locale/pl/LC_MESSAGES/django.mo0000644000000000000000000000540400000000000017661 0ustar0000000000000000|I}#&B:b4 %  Fg+%[jI2((;9(u%:%45<j*+ 5 K 3l  - g hI 7  %(site_name)s - Your account has been successfully created and activated!Account activation on %(site_name)sInvalid password.Invalid token for given user.Invalid user id or user doesn't exist.Password reset on %(site_name)sPlease go to the following page and choose a new password:Please go to the following page to activate account:Stale token for given user.Thanks for using our site!The %(site_name)s teamThe two password fields didn't match.The two {0} fields didn't match.Unable to create account.Unable to log in with provided credentials.User account is disabled.User with given email does not exist.You're receiving this email because you need to finish activation process on %(site_name)s.You're receiving this email because you requested a password reset for your user account at %(site_name)s.Your account has been created and is ready to use!Your username, in case you've forgotten:Project-Id-Version: 1.4.0 Report-Msgid-Bugs-To: POT-Creation-Date: 2019-01-28 15:21+0100 PO-Revision-Date: 2019-01-29 14:25+0100 Last-Translator: Szymon Pyżalski Language: pl_PL Language-Team: http://sunscrapers.com Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.8.0 %(site_name)s - Twoje konto zostało stworzone i aktywowaneAktywacja konta na stronie %(site_name)sBłedne hasło.Błędny token dla tego użytkownika.Błędna nazwa użytkownika, lub użytkownik nie istnieje.Reset hasła na stronie %(site_name)sPrzejdź do poniższej strony i wybierz nowe hasło:Proszę przejdź na poniższą stronę, by aktywować konto:Przestarzały token dla tego użytkownika.Dziękujemy za korzystanie z naszej strony!Zespół strony %(site_name)sPola hasła nie pasują.Pola {0} nie pasują.Nie udało się stworzyć konta.Nie udało się zalogować przy pomocy tych danych.Konto wyłączone.Użytkownik z tym adresem email nie istnieje.Otrzymałeś tego emaila, ponieważ potrzebujesz dokończyć proces aktywacji na stronie %(site_name)s.Otrzymałeś tego emaila, ponieważ prosiłeś o reset hasła do Twojego konta na stronie %(site_name)s.Twoje konto zostało utworzone i jest gotowe do użyciaTwoja nazwa użytkownika:././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/locale/pl/LC_MESSAGES/django.po0000644000000000000000000001100300000000000017654 0ustar0000000000000000# Copyright (C) Sunscrapers # This file is distributed under the same license as the djoser package. # msgid "" msgstr "" "Project-Id-Version: 1.4.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-01-28 15:21+0100\n" "PO-Revision-Date: 2019-01-29 14:25+0100\n" "Last-Translator: Szymon Pyżalski \n" "Language-Team: http://sunscrapers.com\n" "Language: pl_PL\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n" "%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n" "%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: djoser/constants.py:4 msgid "Unable to log in with provided credentials." msgstr "Nie udało się zalogować przy pomocy tych danych." #: djoser/constants.py:5 msgid "User account is disabled." msgstr "Konto wyłączone." #: djoser/constants.py:6 msgid "Invalid token for given user." msgstr "Błędny token dla tego użytkownika." #: djoser/constants.py:7 msgid "Invalid user id or user doesn't exist." msgstr "Błędna nazwa użytkownika, lub użytkownik nie istnieje." #: djoser/constants.py:8 msgid "Stale token for given user." msgstr "Przestarzały token dla tego użytkownika." #: djoser/constants.py:9 msgid "The two password fields didn't match." msgstr "Pola hasła nie pasują." #: djoser/constants.py:10 #, python-brace-format msgid "The two {0} fields didn't match." msgstr "Pola {0} nie pasują." #: djoser/constants.py:11 msgid "Invalid password." msgstr "Błedne hasło." #: djoser/constants.py:12 msgid "User with given email does not exist." msgstr "Użytkownik z tym adresem email nie istnieje." #: djoser/constants.py:13 msgid "Unable to create account." msgstr "Nie udało się stworzyć konta." #: djoser/templates/email/activation.html:4 #, python-format msgid "Account activation on %(site_name)s" msgstr "Aktywacja konta na stronie %(site_name)s" #: templates/email/activation.html:8 templates/email/activation.html:19 #, python-format msgid "" "You're receiving this email because you need to finish activation process on " "%(site_name)s." msgstr "Otrzymałeś tego emaila, ponieważ potrzebujesz dokończyć proces aktywacji na " "stronie %(site_name)s." #: djoser/templates/email/activation.html:10 #: djoser/templates/email/activation.html:22 msgid "Please go to the following page to activate account:" msgstr "Proszę przejdź na poniższą stronę, by aktywować konto:" #: djoser/templates/email/activation.html:13 #: djoser/templates/email/activation.html:25 #: djoser/templates/email/confirmation.html:10 #: djoser/templates/email/confirmation.html:18 #: djoser/templates/email/password_reset.html:14 #: djoser/templates/email/password_reset.html:26 msgid "Thanks for using our site!" msgstr "Dziękujemy za korzystanie z naszej strony!" #: djoser/templates/email/activation.html:15 #: djoser/templates/email/activation.html:27 #: djoser/templates/email/confirmation.html:12 #: djoser/templates/email/confirmation.html:20 #: djoser/templates/email/password_reset.html:16 #: djoser/templates/email/password_reset.html:28 #, python-format msgid "The %(site_name)s team" msgstr "Zespół strony %(site_name)s" #: djoser/templates/email/confirmation.html:4 #, python-format msgid "" "%(site_name)s - Your account has been successfully created and activated!" msgstr "%(site_name)s - Twoje konto zostało stworzone i aktywowane" #: djoser/templates/email/confirmation.html:8 #: djoser/templates/email/confirmation.html:16 msgid "Your account has been created and is ready to use!" msgstr "Twoje konto zostało utworzone i jest gotowe do użycia" #: djoser/templates/email/password_reset.html:4 #, python-format msgid "Password reset on %(site_name)s" msgstr "Reset hasła na stronie %(site_name)s" #: djoser/templates/email/password_reset.html:8 #: djoser/templates/email/password_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "Otrzymałeś tego emaila, ponieważ prosiłeś o reset hasła do Twojego " "konta na stronie %(site_name)s." #: djoser/templates/email/password_reset.html:10 #: djoser/templates/email/password_reset.html:22 msgid "Please go to the following page and choose a new password:" msgstr "Przejdź do poniższej strony i wybierz nowe hasło:" #: djoser/templates/email/password_reset.html:12 #: djoser/templates/email/password_reset.html:24 msgid "Your username, in case you've forgotten:" msgstr "Twoja nazwa użytkownika:" ././@PaxHeader0000000000000000000000000000003300000000000011451 xustar000000000000000027 mtime=1731171467.683026 djoser-2.3.1/djoser/locale/pt_BR/LC_MESSAGES/django.mo0000644000000000000000000000522400000000000020254 0ustar0000000000000000|I}#&B:b4 %  Fg+%[jI2(;$ *(F#oA;);Y&l&!6% .9 [h q 96 #p %(site_name)s - Your account has been successfully created and activated!Account activation on %(site_name)sInvalid password.Invalid token for given user.Invalid user id or user doesn't exist.Password reset on %(site_name)sPlease go to the following page and choose a new password:Please go to the following page to activate account:Stale token for given user.Thanks for using our site!The %(site_name)s teamThe two password fields didn't match.The two {0} fields didn't match.Unable to create account.Unable to log in with provided credentials.User account is disabled.User with given email does not exist.You're receiving this email because you need to finish activation process on %(site_name)s.You're receiving this email because you requested a password reset for your user account at %(site_name)s.Your account has been created and is ready to use!Your username, in case you've forgotten:Project-Id-Version: djoser commit 298825d on master Report-Msgid-Bugs-To: POT-Creation-Date: 2020-03-18 21:45-0300 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Matheus Gomes Language: pt_BR Language-Team: Brasileiro Plural-Forms: nplurals=2; plural=(n > 1) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.8.0 %(site_name)s - Sua conta foi criada e ativada com sucesso!Ativação de conta em %(site_name)sSenha inválida.Token inválido para o usuário fornecido.ID de usuário inválido ou inexistente.Redefina sua senha em %(site_name)sPor favor, visite a seguinte página para definir uma senha nova:Por favor, visite a seguinte página para ativar sua conta:Token expirado para o usuário fornecido.Obrigado por usar nosso site!Time %(site_name)sOs campos de senha não estão iguais.Os dois campos {0} não estão iguais.Não foi possível criar a conta.Não foi possível fazer login com os dados inseridos.A conta do usuário está desativada.Não existe um usuário com o email fornecido.Você está recebendo este email porque você precisa terminar o processo em %(site_name)s.Você está recebendo este email porque você solicitou a redefinição de senha para sua conta em %(site_name)s.Sua conta foi criada com sucesso e está pronta para uso!Caso tenha esquecido, seu usuário:././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/locale/pt_BR/LC_MESSAGES/django.po0000644000000000000000000001055100000000000020256 0ustar0000000000000000# Copyright (C) Sunscrapers # This file is distributed under the same license as the djoser package. # msgid "" msgstr "" "Project-Id-Version: djoser commit 298825d on master\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-03-18 21:45-0300\n" "Last-Translator: Matheus Gomes \n" "Language-Team: Brasileiro\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: djoser/constants.py:4 msgid "Unable to log in with provided credentials." msgstr "Não foi possível fazer login com os dados inseridos." #: djoser/constants.py:5 msgid "User account is disabled." msgstr "A conta do usuário está desativada." #: djoser/constants.py:6 msgid "Invalid token for given user." msgstr "Token inválido para o usuário fornecido." #: djoser/constants.py:7 msgid "Invalid user id or user doesn't exist." msgstr "ID de usuário inválido ou inexistente." #: djoser/constants.py:8 msgid "Stale token for given user." msgstr "Token expirado para o usuário fornecido." #: djoser/constants.py:9 msgid "The two password fields didn't match." msgstr "Os campos de senha não estão iguais." #: djoser/constants.py:10 #, python-brace-format msgid "The two {0} fields didn't match." msgstr "Os dois campos {0} não estão iguais." #: djoser/constants.py:11 msgid "Invalid password." msgstr "Senha inválida." #: djoser/constants.py:12 msgid "User with given email does not exist." msgstr "Não existe um usuário com o email fornecido." #: djoser/constants.py:13 msgid "Unable to create account." msgstr "Não foi possível criar a conta." #: djoser/templates/email/activation.html:4 #, python-format msgid "Account activation on %(site_name)s" msgstr "Ativação de conta em %(site_name)s" #: templates/email/activation.html:8 templates/email/activation.html:19 #, python-format msgid "" "You're receiving this email because you need to finish activation process on " "%(site_name)s." msgstr "" "Você está recebendo este email porque você precisa terminar o processo em " "%(site_name)s." #: djoser/templates/email/activation.html:10 #: djoser/templates/email/activation.html:22 msgid "Please go to the following page to activate account:" msgstr "Por favor, visite a seguinte página para ativar sua conta:" #: djoser/templates/email/activation.html:13 #: djoser/templates/email/activation.html:25 #: djoser/templates/email/confirmation.html:10 #: djoser/templates/email/confirmation.html:18 #: djoser/templates/email/password_reset.html:14 #: djoser/templates/email/password_reset.html:26 msgid "Thanks for using our site!" msgstr "Obrigado por usar nosso site!" #: djoser/templates/email/activation.html:15 #: djoser/templates/email/activation.html:27 #: djoser/templates/email/confirmation.html:12 #: djoser/templates/email/confirmation.html:20 #: djoser/templates/email/password_reset.html:16 #: djoser/templates/email/password_reset.html:28 #, python-format msgid "The %(site_name)s team" msgstr "Time %(site_name)s" #: djoser/templates/email/confirmation.html:4 #, python-format msgid "" "%(site_name)s - Your account has been successfully created and activated!" msgstr "%(site_name)s - Sua conta foi criada e ativada com sucesso!" #: djoser/templates/email/confirmation.html:8 #: djoser/templates/email/confirmation.html:16 msgid "Your account has been created and is ready to use!" msgstr "Sua conta foi criada com sucesso e está pronta para uso!" #: djoser/templates/email/password_reset.html:4 #, python-format msgid "Password reset on %(site_name)s" msgstr "Redefina sua senha em %(site_name)s" #: djoser/templates/email/password_reset.html:8 #: djoser/templates/email/password_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a password reset for your " "user account at %(site_name)s." msgstr "" "Você está recebendo este email porque você solicitou a redefinição de senha " "para sua conta em %(site_name)s." #: djoser/templates/email/password_reset.html:10 #: djoser/templates/email/password_reset.html:22 msgid "Please go to the following page and choose a new password:" msgstr "Por favor, visite a seguinte página para definir uma senha nova:" #: djoser/templates/email/password_reset.html:12 #: djoser/templates/email/password_reset.html:24 msgid "Your username, in case you've forgotten:" msgstr "Caso tenha esquecido, seu usuário:" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171467.7270267 djoser-2.3.1/djoser/locale/ru_RU/LC_MESSAGES/django.mo0000644000000000000000000000720700000000000020305 0ustar0000000000000000|I}#&B:b4 %  Fg+%[jI2(x6S&K*}~' O G S ,p = @ d I t @ k EA%(site_name)s - Your account has been successfully created and activated!Account activation on %(site_name)sInvalid password.Invalid token for given user.Invalid user id or user doesn't exist.Password reset on %(site_name)sPlease go to the following page and choose a new password:Please go to the following page to activate account:Stale token for given user.Thanks for using our site!The %(site_name)s teamThe two password fields didn't match.The two {0} fields didn't match.Unable to create account.Unable to log in with provided credentials.User account is disabled.User with given email does not exist.You're receiving this email because you need to finish activation process on %(site_name)s.You're receiving this email because you requested a password reset for your user account at %(site_name)s.Your account has been created and is ready to use!Your username, in case you've forgotten:Project-Id-Version: 1.4.0 Report-Msgid-Bugs-To: POT-Creation-Date: 2019-01-28 15:21+0100 PO-Revision-Date: 2019-05-14 12:05+0300 Last-Translator: Sergey Ozeranskiy Language: ru_RU Language-Team: Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : 2) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Generated-By: Babel 2.8.0 %(site_name)s - Ваша учетная запись была успешно создана и активирована!Активация аккаунта на %(site_name)sНеправильный пароль.Неверный токен для данного пользователя.Неверный идентификатор пользователя или пользователь не существует.Сброс пароля на %(site_name)sПожалуйста, перейдите на следующую страницу и создайте новый пароль:Пожалуйста, перейдите на следующую страницу, чтобы активировать учетную запись:Устаревший токен для данного пользователя.Спасибо за использование нашего сайта!Команда %(site_name)sДва пароля не совпадают.Два значения поля {0} не совпадают.Невозможно создать учетную запись.Невозможно войти с предоставленными учетными данными.Учетная запись пользователя не активна.Пользователь с данным адресом электронной почты не существует.Вы получили это письмо, потому что вам нужно завершить процесс активации учетной записи на %(site_name)s.Вы получили это письмо, потому что вы или кто-то другой запросили сброс пароля для учетной записи пользователя на %(site_name)s.Ваша учетная запись была создана и готова к использованию!Ваше имя пользователя, если вы забыли:././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/locale/ru_RU/LC_MESSAGES/django.po0000644000000000000000000001275500000000000020314 0ustar0000000000000000# Copyright (C) Sunscrapers # This file is distributed under the same license as the djoser package. # msgid "" msgstr "" "Project-Id-Version: 1.4.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-01-28 15:21+0100\n" "PO-Revision-Date: 2019-05-14 12:05+0300\n" "Last-Translator: Sergey Ozeranskiy \n" "Language-Team: \n" "Language: ru_RU\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n" "%100<12 || n%100>14) ? 1 : 2);\n" "X-Generator: Poedit 2.2.1\n" "X-Poedit-Basepath: ../../../..\n" "X-Poedit-SearchPath-0: .\n" #: djoser/constants.py:4 msgid "Unable to log in with provided credentials." msgstr "Невозможно войти с предоставленными учетными данными." #: djoser/constants.py:5 msgid "User account is disabled." msgstr "Учетная запись пользователя не активна." #: djoser/constants.py:6 msgid "Invalid token for given user." msgstr "Неверный токен для данного пользователя." #: djoser/constants.py:7 msgid "Invalid user id or user doesn't exist." msgstr "Неверный идентификатор пользователя или пользователь не существует." #: djoser/constants.py:8 msgid "Stale token for given user." msgstr "Устаревший токен для данного пользователя." #: djoser/constants.py:9 msgid "The two password fields didn't match." msgstr "Два пароля не совпадают." #: djoser/constants.py:10 #, python-brace-format msgid "The two {0} fields didn't match." msgstr "Два значения поля {0} не совпадают." #: djoser/constants.py:11 msgid "Invalid password." msgstr "Неправильный пароль." #: djoser/constants.py:12 msgid "User with given email does not exist." msgstr "Пользователь с данным адресом электронной почты не существует." #: djoser/constants.py:13 msgid "Unable to create account." msgstr "Невозможно создать учетную запись." #: djoser/templates/email/activation.html:4 #, python-format msgid "Account activation on %(site_name)s" msgstr "Активация аккаунта на %(site_name)s" #: djoser/templates/email/activation.html:8 djoser/templates/email/activation.html:19 #, python-format msgid "" "You're receiving this email because you need to finish activation process on " "%(site_name)s." msgstr "" "Вы получили это письмо, потому что вам нужно завершить процесс активации учетной " "записи на %(site_name)s." #: djoser/templates/email/activation.html:10 djoser/templates/email/activation.html:22 msgid "Please go to the following page to activate account:" msgstr "" "Пожалуйста, перейдите на следующую страницу, чтобы активировать учетную запись:" #: djoser/templates/email/activation.html:13 djoser/templates/email/activation.html:25 #: djoser/templates/email/confirmation.html:10 #: djoser/templates/email/confirmation.html:18 #: djoser/templates/email/password_reset.html:14 #: djoser/templates/email/password_reset.html:26 msgid "Thanks for using our site!" msgstr "Спасибо за использование нашего сайта!" #: djoser/templates/email/activation.html:15 djoser/templates/email/activation.html:27 #: djoser/templates/email/confirmation.html:12 #: djoser/templates/email/confirmation.html:20 #: djoser/templates/email/password_reset.html:16 #: djoser/templates/email/password_reset.html:28 #, python-format msgid "The %(site_name)s team" msgstr "Команда %(site_name)s" #: djoser/templates/email/confirmation.html:4 #, python-format msgid "%(site_name)s - Your account has been successfully created and activated!" msgstr "%(site_name)s - Ваша учетная запись была успешно создана и активирована!" #: djoser/templates/email/confirmation.html:8 #: djoser/templates/email/confirmation.html:16 msgid "Your account has been created and is ready to use!" msgstr "Ваша учетная запись была создана и готова к использованию!" #: djoser/templates/email/password_reset.html:4 #, python-format msgid "Password reset on %(site_name)s" msgstr "Сброс пароля на %(site_name)s" #: djoser/templates/email/password_reset.html:8 #: djoser/templates/email/password_reset.html:20 #, python-format msgid "" "You're receiving this email because you requested a password reset for your user " "account at %(site_name)s." msgstr "" "Вы получили это письмо, потому что вы или кто-то другой запросили сброс пароля для " "учетной записи пользователя на %(site_name)s." #: djoser/templates/email/password_reset.html:10 #: djoser/templates/email/password_reset.html:22 msgid "Please go to the following page and choose a new password:" msgstr "Пожалуйста, перейдите на следующую страницу и создайте новый пароль:" #: djoser/templates/email/password_reset.html:12 #: djoser/templates/email/password_reset.html:24 msgid "Your username, in case you've forgotten:" msgstr "Ваше имя пользователя, если вы забыли:" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/permissions.py0000644000000000000000000000107600000000000015351 0ustar0000000000000000from rest_framework import permissions from rest_framework.permissions import SAFE_METHODS class CurrentUserOrAdmin(permissions.IsAuthenticated): def has_object_permission(self, request, view, obj): user = request.user return user.is_staff or obj.pk == user.pk class CurrentUserOrAdminOrReadOnly(permissions.IsAuthenticated): def has_object_permission(self, request, view, obj): user = request.user if type(obj) == type(user) and obj == user: return True return request.method in SAFE_METHODS or user.is_staff ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/serializers.py0000644000000000000000000002545200000000000015336 0ustar0000000000000000from django.contrib.auth import authenticate, get_user_model from django.contrib.auth.password_validation import validate_password from django.core import exceptions as django_exceptions from django.db import IntegrityError, transaction from rest_framework import exceptions, serializers from rest_framework.exceptions import ValidationError from rest_framework.settings import api_settings from djoser import utils from djoser.compat import get_user_email, get_user_email_field_name from djoser.conf import settings User = get_user_model() class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = tuple(User.REQUIRED_FIELDS) + ( settings.USER_ID_FIELD, settings.LOGIN_FIELD, ) read_only_fields = (settings.LOGIN_FIELD,) def update(self, instance, validated_data): email_field = get_user_email_field_name(User) instance.email_changed = False if settings.SEND_ACTIVATION_EMAIL and email_field in validated_data: instance_email = get_user_email(instance) if instance_email != validated_data[email_field]: instance.is_active = False instance.email_changed = True instance.save(update_fields=["is_active"]) return super().update(instance, validated_data) class UserCreateMixin: def create(self, validated_data): try: user = self.perform_create(validated_data) except IntegrityError: self.fail("cannot_create_user") return user def perform_create(self, validated_data): with transaction.atomic(): user = User.objects.create_user(**validated_data) if settings.SEND_ACTIVATION_EMAIL: user.is_active = False user.save(update_fields=["is_active"]) return user class UserCreateSerializer(UserCreateMixin, serializers.ModelSerializer): password = serializers.CharField(style={"input_type": "password"}, write_only=True) default_error_messages = { "cannot_create_user": settings.CONSTANTS.messages.CANNOT_CREATE_USER_ERROR } class Meta: model = User fields = tuple(User.REQUIRED_FIELDS) + ( settings.LOGIN_FIELD, settings.USER_ID_FIELD, "password", ) def validate(self, attrs): user = User(**attrs) password = attrs.get("password") try: validate_password(password, user) except django_exceptions.ValidationError as e: serializer_error = serializers.as_serializer_error(e) raise serializers.ValidationError( {"password": serializer_error[api_settings.NON_FIELD_ERRORS_KEY]} ) return attrs class UserCreatePasswordRetypeSerializer(UserCreateSerializer): default_error_messages = { "password_mismatch": settings.CONSTANTS.messages.PASSWORD_MISMATCH_ERROR } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["re_password"] = serializers.CharField( style={"input_type": "password"} ) def validate(self, attrs): self.fields.pop("re_password", None) re_password = attrs.pop("re_password") attrs = super().validate(attrs) if attrs["password"] == re_password: return attrs else: self.fail("password_mismatch") class TokenCreateSerializer(serializers.Serializer): password = serializers.CharField(required=False, style={"input_type": "password"}) default_error_messages = { "invalid_credentials": settings.CONSTANTS.messages.INVALID_CREDENTIALS_ERROR, } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.user = None self.fields[settings.LOGIN_FIELD] = serializers.CharField(required=False) def validate(self, attrs): password = attrs.get("password") # https://github.com/sunscrapers/djoser/issues/389 # https://github.com/sunscrapers/djoser/issues/429 # https://github.com/sunscrapers/djoser/issues/795 params = {User.USERNAME_FIELD: attrs.get(settings.LOGIN_FIELD)} self.user = authenticate( request=self.context.get("request"), **params, password=password ) if not self.user: self.fail("invalid_credentials") return attrs class UserFunctionsMixin: def get_user(self, is_active=True): try: user = User._default_manager.get( is_active=is_active, **{self.email_field: self.data.get(self.email_field, "")}, ) if user.has_usable_password(): return user except User.DoesNotExist: pass if ( settings.PASSWORD_RESET_SHOW_EMAIL_NOT_FOUND or settings.USERNAME_RESET_SHOW_EMAIL_NOT_FOUND ): self.fail("email_not_found") class SendEmailResetSerializer(serializers.Serializer, UserFunctionsMixin): default_error_messages = { "email_not_found": settings.CONSTANTS.messages.EMAIL_NOT_FOUND } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.email_field = get_user_email_field_name(User) self.fields[self.email_field] = serializers.EmailField() class UidAndTokenSerializer(serializers.Serializer): uid = serializers.CharField() token = serializers.CharField() default_error_messages = { "invalid_token": settings.CONSTANTS.messages.INVALID_TOKEN_ERROR, "invalid_uid": settings.CONSTANTS.messages.INVALID_UID_ERROR, } def validate(self, attrs): validated_data = super().validate(attrs) # uid validation have to be here, because validate_ # doesn't work with modelserializer try: uid = utils.decode_uid(self.initial_data.get("uid", "")) self.user = User.objects.get(pk=uid) except (User.DoesNotExist, ValueError, TypeError, OverflowError): key_error = "invalid_uid" raise ValidationError( {"uid": [self.error_messages[key_error]]}, code=key_error ) is_token_valid = self.context["view"].token_generator.check_token( self.user, self.initial_data.get("token", "") ) if is_token_valid: return validated_data else: key_error = "invalid_token" raise ValidationError( {"token": [self.error_messages[key_error]]}, code=key_error ) class ActivationSerializer(UidAndTokenSerializer): default_error_messages = { "stale_token": settings.CONSTANTS.messages.STALE_TOKEN_ERROR } def validate(self, attrs): attrs = super().validate(attrs) if not self.user.is_active: return attrs raise exceptions.PermissionDenied(self.error_messages["stale_token"]) class PasswordSerializer(serializers.Serializer): new_password = serializers.CharField(style={"input_type": "password"}) def validate(self, attrs): user = getattr(self, "user", None) or self.context["request"].user # why assert? There are ValidationError / fail everywhere assert user is not None try: validate_password(attrs["new_password"], user) except django_exceptions.ValidationError as e: raise serializers.ValidationError({"new_password": list(e.messages)}) return super().validate(attrs) class PasswordRetypeSerializer(PasswordSerializer): re_new_password = serializers.CharField(style={"input_type": "password"}) default_error_messages = { "password_mismatch": settings.CONSTANTS.messages.PASSWORD_MISMATCH_ERROR } def validate(self, attrs): attrs = super().validate(attrs) if attrs["new_password"] == attrs["re_new_password"]: return attrs else: self.fail("password_mismatch") class CurrentPasswordSerializer(serializers.Serializer): current_password = serializers.CharField(style={"input_type": "password"}) default_error_messages = { "invalid_password": settings.CONSTANTS.messages.INVALID_PASSWORD_ERROR } def validate_current_password(self, value): is_password_valid = self.context["request"].user.check_password(value) if is_password_valid: return value else: self.fail("invalid_password") class UsernameSerializer(serializers.ModelSerializer): class Meta: model = User fields = (settings.LOGIN_FIELD,) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.username_field = settings.LOGIN_FIELD self._default_username_field = User.USERNAME_FIELD self.fields[f"new_{self.username_field}"] = self.fields.pop(self.username_field) def save(self, **kwargs): if self.username_field != self._default_username_field: kwargs[User.USERNAME_FIELD] = self.validated_data.get( f"new_{self.username_field}" ) return super().save(**kwargs) class UsernameRetypeSerializer(UsernameSerializer): default_error_messages = { "username_mismatch": settings.CONSTANTS.messages.USERNAME_MISMATCH_ERROR.format( settings.LOGIN_FIELD ) } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields["re_new_" + settings.LOGIN_FIELD] = serializers.CharField() def validate(self, attrs): attrs = super().validate(attrs) new_username = attrs[settings.LOGIN_FIELD] if new_username != attrs[f"re_new_{settings.LOGIN_FIELD}"]: self.fail("username_mismatch") else: return attrs class TokenSerializer(serializers.ModelSerializer): auth_token = serializers.CharField(source="key") class Meta: model = settings.TOKEN_MODEL fields = ("auth_token",) class SetPasswordSerializer(PasswordSerializer, CurrentPasswordSerializer): pass class SetPasswordRetypeSerializer(PasswordRetypeSerializer, CurrentPasswordSerializer): pass class PasswordResetConfirmSerializer(UidAndTokenSerializer, PasswordSerializer): pass class PasswordResetConfirmRetypeSerializer( UidAndTokenSerializer, PasswordRetypeSerializer ): pass class UsernameResetConfirmSerializer(UidAndTokenSerializer, UsernameSerializer): pass class UsernameResetConfirmRetypeSerializer( UidAndTokenSerializer, UsernameRetypeSerializer ): pass class UserDeleteSerializer(CurrentPasswordSerializer): pass class SetUsernameSerializer(UsernameSerializer, CurrentPasswordSerializer): class Meta: model = User fields = (settings.LOGIN_FIELD, "current_password") class SetUsernameRetypeSerializer(SetUsernameSerializer, UsernameRetypeSerializer): pass ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/signals.py0000644000000000000000000000041700000000000014434 0ustar0000000000000000from django.dispatch import Signal # New user has registered. Args: user, request. user_registered = Signal() # User has activated his or her account. Args: user, request. user_activated = Signal() # User has been updated. Args: user, request. user_updated = Signal() ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/social/__init__.py0000644000000000000000000000000000000000000015771 0ustar0000000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/social/backends/__init__.py0000644000000000000000000000000000000000000017543 0ustar0000000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/social/backends/facebook.py0000644000000000000000000000020400000000000017563 0ustar0000000000000000from social_core.backends.facebook import FacebookOAuth2 class FacebookOAuth2Override(FacebookOAuth2): REDIRECT_STATE = False ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/social/serializers.py0000644000000000000000000000373600000000000016611 0ustar0000000000000000from rest_framework import serializers from social_core import exceptions from social_django.utils import load_backend, load_strategy from djoser.conf import settings class ProviderAuthSerializer(serializers.Serializer): # GET auth token access = serializers.CharField(read_only=True) refresh = serializers.CharField(read_only=True) user = serializers.CharField(read_only=True) def create(self, validated_data): user = validated_data["user"] return settings.SOCIAL_AUTH_TOKEN_STRATEGY.obtain(user) def validate(self, attrs): request = self.context["request"] if "state" in request.GET: self._validate_state(request.GET["state"]) strategy = load_strategy(request) redirect_uri = strategy.session_get("redirect_uri") backend_name = self.context["view"].kwargs["provider"] backend = load_backend(strategy, backend_name, redirect_uri=redirect_uri) try: user = backend.auth_complete() except exceptions.AuthException as e: raise serializers.ValidationError(str(e)) return {"user": user} def _validate_state(self, value): request = self.context["request"] strategy = load_strategy(request) redirect_uri = strategy.session_get("redirect_uri") backend_name = self.context["view"].kwargs["provider"] backend = load_backend(strategy, backend_name, redirect_uri=redirect_uri) try: backend.validate_state() except exceptions.AuthMissingParameter: raise serializers.ValidationError( "State could not be found in request data." ) except exceptions.AuthStateMissing: raise serializers.ValidationError( "State could not be found in server-side session data." ) except exceptions.AuthStateForbidden: raise serializers.ValidationError("Invalid state has been provided.") return value ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/social/token/__init__.py0000644000000000000000000000000000000000000017111 0ustar0000000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/social/token/jwt.py0000644000000000000000000000047400000000000016175 0ustar0000000000000000class TokenStrategy: @classmethod def obtain(cls, user): from rest_framework_simplejwt.tokens import RefreshToken refresh = RefreshToken.for_user(user) return { "access": str(refresh.access_token), "refresh": str(refresh), "user": user, } ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/social/urls.py0000644000000000000000000000032200000000000015226 0ustar0000000000000000from django.urls import re_path from djoser.social import views urlpatterns = [ re_path( r"^o/(?P\S+)/$", views.ProviderAuthView.as_view(), name="provider-auth", ) ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/social/views.py0000644000000000000000000000211300000000000015376 0ustar0000000000000000from rest_framework import generics, permissions, status from rest_framework.response import Response from social_django.utils import load_backend, load_strategy from djoser.conf import settings from djoser.social.serializers import ProviderAuthSerializer class ProviderAuthView(generics.CreateAPIView): permission_classes = [permissions.AllowAny] serializer_class = ProviderAuthSerializer def get(self, request, *args, **kwargs): redirect_uri = request.GET.get("redirect_uri") if redirect_uri not in settings.SOCIAL_AUTH_ALLOWED_REDIRECT_URIS: return Response( "redirect_uri must be in SOCIAL_AUTH_ALLOWED_REDIRECT_URIS", status=status.HTTP_400_BAD_REQUEST, ) strategy = load_strategy(request) strategy.session_set("redirect_uri", redirect_uri) backend_name = self.kwargs["provider"] backend = load_backend(strategy, backend_name, redirect_uri=redirect_uri) authorization_url = backend.auth_url() return Response(data={"authorization_url": authorization_url}) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/templates/email/activation.html0000644000000000000000000000176600000000000020546 0ustar0000000000000000{% load i18n %} {% block subject %} {% blocktrans %}Account activation on {{ site_name }}{% endblocktrans %} {% endblock subject %} {% block text_body %} {% blocktrans %}You're receiving this email because you need to finish activation process on {{ site_name }}.{% endblocktrans %} {% trans "Please go to the following page to activate account:" %} {{ protocol }}://{{ domain }}/{{ url|safe }} {% trans "Thanks for using our site!" %} {% blocktrans %}The {{ site_name }} team{% endblocktrans %} {% endblock text_body %} {% block html_body %}

{% blocktrans %}You're receiving this email because you need to finish activation process on {{ site_name }}.{% endblocktrans %}

{% trans "Please go to the following page to activate account:" %}

{{ protocol }}://{{ domain }}/{{ url|safe }}

{% trans "Thanks for using our site!" %}

{% blocktrans %}The {{ site_name }} team{% endblocktrans %}

{% endblock html_body %} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/templates/email/confirmation.html0000644000000000000000000000115000000000000021060 0ustar0000000000000000{% load i18n %} {% block subject %} {% blocktrans %}{{ site_name }} - Your account has been successfully created and activated!{% endblocktrans %} {% endblock %} {% block text_body %} {% trans "Your account has been created and is ready to use!" %} {% trans "Thanks for using our site!" %} {% blocktrans %}The {{ site_name }} team{% endblocktrans %} {% endblock text_body %} {% block html_body %}

{% trans "Your account has been created and is ready to use!" %}

{% trans "Thanks for using our site!" %}

{% blocktrans %}The {{ site_name }} team{% endblocktrans %}

{% endblock html_body %} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/templates/email/password_changed_confirmation.html0000644000000000000000000000106500000000000024460 0ustar0000000000000000{% load i18n %} {% block subject %} {% blocktrans %}{{ site_name }} - Your password has been successfully changed!{% endblocktrans %} {% endblock %} {% block text_body %} {% trans "Your password has been changed!" %} {% trans "Thanks for using our site!" %} {% blocktrans %}The {{ site_name }} team{% endblocktrans %} {% endblock text_body %} {% block html_body %}

{% trans "Your password has been changed!" %}

{% trans "Thanks for using our site!" %}

{% blocktrans %}The {{ site_name }} team{% endblocktrans %}

{% endblock html_body %} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/templates/email/password_reset.html0000644000000000000000000000230000000000000021432 0ustar0000000000000000{% load i18n %} {% block subject %} {% blocktrans %}Password reset on {{ site_name }}{% endblocktrans %} {% endblock subject %} {% block text_body %} {% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %} {% trans "Please go to the following page and choose a new password:" %} {{ protocol }}://{{ domain }}/{{ url|safe }} {% trans "Your username, in case you've forgotten:" %} {{ user.get_username }} {% trans "Thanks for using our site!" %} {% blocktrans %}The {{ site_name }} team{% endblocktrans %} {% endblock text_body %} {% block html_body %}

{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %}

{% trans "Please go to the following page and choose a new password:" %}

{{ protocol }}://{{ domain }}/{{ url|safe }}

{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }}

{% trans "Thanks for using our site!" %}

{% blocktrans %}The {{ site_name }} team{% endblocktrans %}

{% endblock html_body %} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/templates/email/username_changed_confirmation.html0000644000000000000000000000106500000000000024435 0ustar0000000000000000{% load i18n %} {% block subject %} {% blocktrans %}{{ site_name }} - Your username has been successfully changed!{% endblocktrans %} {% endblock %} {% block text_body %} {% trans "Your username has been changed!" %} {% trans "Thanks for using our site!" %} {% blocktrans %}The {{ site_name }} team{% endblocktrans %} {% endblock text_body %} {% block html_body %}

{% trans "Your username has been changed!" %}

{% trans "Thanks for using our site!" %}

{% blocktrans %}The {{ site_name }} team{% endblocktrans %}

{% endblock html_body %} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/templates/email/username_reset.html0000644000000000000000000000230000000000000021407 0ustar0000000000000000{% load i18n %} {% block subject %} {% blocktrans %}Username reset on {{ site_name }}{% endblocktrans %} {% endblock subject %} {% block text_body %} {% blocktrans %}You're receiving this email because you requested a username reset for your user account at {{ site_name }}.{% endblocktrans %} {% trans "Please go to the following page and choose a new username:" %} {{ protocol }}://{{ domain }}/{{ url|safe }} {% trans "Your username, in case you've forgotten:" %} {{ user.get_username }} {% trans "Thanks for using our site!" %} {% blocktrans %}The {{ site_name }} team{% endblocktrans %} {% endblock text_body %} {% block html_body %}

{% blocktrans %}You're receiving this email because you requested a username reset for your user account at {{ site_name }}.{% endblocktrans %}

{% trans "Please go to the following page and choose a new username:" %}

{{ protocol }}://{{ domain }}/{{ url|safe }}

{% trans "Your username, in case you've forgotten:" %} {{ user.get_username }}

{% trans "Thanks for using our site!" %}

{% blocktrans %}The {{ site_name }} team{% endblocktrans %}

{% endblock html_body %} ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/urls/__init__.py0000644000000000000000000000007100000000000015514 0ustar0000000000000000from .base import urlpatterns __all__ = ["urlpatterns"] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/urls/authtoken.py0000644000000000000000000000036000000000000015760 0ustar0000000000000000from django.urls import re_path from djoser import views urlpatterns = [ re_path(r"^token/login/?$", views.TokenCreateView.as_view(), name="login"), re_path(r"^token/logout/?$", views.TokenDestroyView.as_view(), name="logout"), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/urls/base.py0000644000000000000000000000036400000000000014674 0ustar0000000000000000from django.contrib.auth import get_user_model from rest_framework.routers import DefaultRouter from djoser import views router = DefaultRouter() router.register("users", views.UserViewSet) User = get_user_model() urlpatterns = router.urls ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/urls/jwt.py0000644000000000000000000000053600000000000014567 0ustar0000000000000000from django.urls import re_path from rest_framework_simplejwt import views urlpatterns = [ re_path(r"^jwt/create/?", views.TokenObtainPairView.as_view(), name="jwt-create"), re_path(r"^jwt/refresh/?", views.TokenRefreshView.as_view(), name="jwt-refresh"), re_path(r"^jwt/verify/?", views.TokenVerifyView.as_view(), name="jwt-verify"), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/utils.py0000644000000000000000000000224400000000000014134 0ustar0000000000000000from django.contrib.auth import login, logout, user_logged_in, user_logged_out from django.utils.encoding import force_bytes, force_str from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode from djoser.conf import settings def encode_uid(pk): return force_str(urlsafe_base64_encode(force_bytes(pk))) def decode_uid(pk): return force_str(urlsafe_base64_decode(pk)) def login_user(request, user): token, _ = settings.TOKEN_MODEL.objects.get_or_create(user=user) if settings.CREATE_SESSION_ON_LOGIN: login(request, user) user_logged_in.send(sender=user.__class__, request=request, user=user) return token def logout_user(request): if settings.TOKEN_MODEL: settings.TOKEN_MODEL.objects.filter(user=request.user).delete() user_logged_out.send( sender=request.user.__class__, request=request, user=request.user ) if settings.CREATE_SESSION_ON_LOGIN: logout(request) class ActionViewMixin: def post(self, request, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) return self._action(serializer) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7909062 djoser-2.3.1/djoser/views.py0000644000000000000000000003124300000000000014132 0ustar0000000000000000from django.contrib.auth import get_user_model, update_session_auth_hash from django.contrib.auth.tokens import default_token_generator from django.utils.timezone import now from rest_framework import generics, status, views, viewsets from rest_framework.decorators import action from rest_framework.exceptions import NotFound from rest_framework.response import Response from rest_framework.serializers import Serializer from djoser import signals, utils from djoser.compat import get_user_email from djoser.conf import settings User = get_user_model() class TokenCreateView(utils.ActionViewMixin, generics.GenericAPIView): """Use this endpoint to obtain user authentication token.""" serializer_class = settings.SERIALIZERS.token_create permission_classes = settings.PERMISSIONS.token_create def _action(self, serializer): token = utils.login_user(self.request, serializer.user) token_serializer_class = settings.SERIALIZERS.token return Response( data=token_serializer_class(token).data, status=status.HTTP_200_OK ) class TokenDestroyView(views.APIView): """Use this endpoint to logout user (remove user authentication token).""" serializer_class = Serializer permission_classes = settings.PERMISSIONS.token_destroy def post(self, request): utils.logout_user(request) return Response(status=status.HTTP_204_NO_CONTENT) class UserViewSet(viewsets.ModelViewSet): serializer_class = settings.SERIALIZERS.user queryset = User.objects.all() permission_classes = settings.PERMISSIONS.user token_generator = default_token_generator lookup_field = settings.USER_ID_FIELD def permission_denied(self, request, **kwargs): if ( settings.HIDE_USERS and request.user.is_authenticated and self.action in ["update", "partial_update", "list", "retrieve"] ): raise NotFound() super().permission_denied(request, **kwargs) def get_queryset(self): user = self.request.user queryset = super().get_queryset() if settings.HIDE_USERS and self.action == "list" and not user.is_staff: queryset = queryset.filter(pk=user.pk) return queryset def get_permissions(self): if self.action == "create": self.permission_classes = settings.PERMISSIONS.user_create elif self.action == "activation": self.permission_classes = settings.PERMISSIONS.activation elif self.action == "resend_activation": self.permission_classes = settings.PERMISSIONS.password_reset elif self.action == "list": self.permission_classes = settings.PERMISSIONS.user_list elif self.action == "reset_password": self.permission_classes = settings.PERMISSIONS.password_reset elif self.action == "reset_password_confirm": self.permission_classes = settings.PERMISSIONS.password_reset_confirm elif self.action == "set_password": self.permission_classes = settings.PERMISSIONS.set_password elif self.action == "set_username": self.permission_classes = settings.PERMISSIONS.set_username elif self.action == "reset_username": self.permission_classes = settings.PERMISSIONS.username_reset elif self.action == "reset_username_confirm": self.permission_classes = settings.PERMISSIONS.username_reset_confirm elif self.action == "destroy" or ( self.action == "me" and self.request and self.request.method == "DELETE" ): self.permission_classes = settings.PERMISSIONS.user_delete return super().get_permissions() def get_serializer_class(self): if self.action == "create": if settings.USER_CREATE_PASSWORD_RETYPE: return settings.SERIALIZERS.user_create_password_retype return settings.SERIALIZERS.user_create elif self.action == "destroy" or ( self.action == "me" and self.request and self.request.method == "DELETE" ): return settings.SERIALIZERS.user_delete elif self.action == "activation": return settings.SERIALIZERS.activation elif self.action == "resend_activation": return settings.SERIALIZERS.password_reset elif self.action == "reset_password": return settings.SERIALIZERS.password_reset elif self.action == "reset_password_confirm": if settings.PASSWORD_RESET_CONFIRM_RETYPE: return settings.SERIALIZERS.password_reset_confirm_retype return settings.SERIALIZERS.password_reset_confirm elif self.action == "set_password": if settings.SET_PASSWORD_RETYPE: return settings.SERIALIZERS.set_password_retype return settings.SERIALIZERS.set_password elif self.action == "set_username": if settings.SET_USERNAME_RETYPE: return settings.SERIALIZERS.set_username_retype return settings.SERIALIZERS.set_username elif self.action == "reset_username": return settings.SERIALIZERS.username_reset elif self.action == "reset_username_confirm": if settings.USERNAME_RESET_CONFIRM_RETYPE: return settings.SERIALIZERS.username_reset_confirm_retype return settings.SERIALIZERS.username_reset_confirm elif self.action == "me": return settings.SERIALIZERS.current_user return self.serializer_class def get_instance(self): return self.request.user def perform_create(self, serializer, *args, **kwargs): user = serializer.save(*args, **kwargs) signals.user_registered.send( sender=self.__class__, user=user, request=self.request ) context = {"user": user} to = [get_user_email(user)] if settings.SEND_ACTIVATION_EMAIL: settings.EMAIL.activation(self.request, context).send(to) elif settings.SEND_CONFIRMATION_EMAIL: settings.EMAIL.confirmation(self.request, context).send(to) def perform_update(self, serializer, *args, **kwargs): super().perform_update(serializer, *args, **kwargs) user = serializer.instance signals.user_updated.send( sender=self.__class__, user=user, request=self.request ) # should we send activation email after update? if settings.SEND_ACTIVATION_EMAIL and not user.is_active: context = {"user": user} to = [get_user_email(user)] settings.EMAIL.activation(self.request, context).send(to) def destroy(self, request, *args, **kwargs): instance = self.get_object() serializer = self.get_serializer(instance, data=request.data) serializer.is_valid(raise_exception=True) if instance == request.user: utils.logout_user(self.request) self.perform_destroy(instance) return Response(status=status.HTTP_204_NO_CONTENT) @action(["get", "put", "patch", "delete"], detail=False) def me(self, request, *args, **kwargs): self.get_object = self.get_instance if request.method == "GET": return self.retrieve(request, *args, **kwargs) elif request.method == "PUT": return self.update(request, *args, **kwargs) elif request.method == "PATCH": return self.partial_update(request, *args, **kwargs) elif request.method == "DELETE": return self.destroy(request, *args, **kwargs) @action(["post"], detail=False) def activation(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.user user.is_active = True user.save() signals.user_activated.send( sender=self.__class__, user=user, request=self.request ) if settings.SEND_CONFIRMATION_EMAIL: context = {"user": user} to = [get_user_email(user)] settings.EMAIL.confirmation(self.request, context).send(to) return Response(status=status.HTTP_204_NO_CONTENT) @action(["post"], detail=False) def resend_activation(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.get_user(is_active=False) if not settings.SEND_ACTIVATION_EMAIL: return Response(status=status.HTTP_400_BAD_REQUEST) if user: context = {"user": user} to = [get_user_email(user)] settings.EMAIL.activation(self.request, context).send(to) return Response(status=status.HTTP_204_NO_CONTENT) @action(["post"], detail=False) def set_password(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.request.user.set_password(serializer.data["new_password"]) self.request.user.save() if settings.PASSWORD_CHANGED_EMAIL_CONFIRMATION: context = {"user": self.request.user} to = [get_user_email(self.request.user)] settings.EMAIL.password_changed_confirmation(self.request, context).send(to) if settings.LOGOUT_ON_PASSWORD_CHANGE: utils.logout_user(self.request) elif settings.CREATE_SESSION_ON_LOGIN: update_session_auth_hash(self.request, self.request.user) return Response(status=status.HTTP_204_NO_CONTENT) @action(["post"], detail=False) def reset_password(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.get_user() if user: context = {"user": user} to = [get_user_email(user)] settings.EMAIL.password_reset(self.request, context).send(to) return Response(status=status.HTTP_204_NO_CONTENT) @action(["post"], detail=False) def reset_password_confirm(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) serializer.user.set_password(serializer.data["new_password"]) if hasattr(serializer.user, "last_login"): serializer.user.last_login = now() serializer.user.save() if settings.PASSWORD_CHANGED_EMAIL_CONFIRMATION: context = {"user": serializer.user} to = [get_user_email(serializer.user)] settings.EMAIL.password_changed_confirmation(self.request, context).send(to) return Response(status=status.HTTP_204_NO_CONTENT) @action(["post"], detail=False, url_path=f"set_{User.USERNAME_FIELD}") def set_username(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = self.request.user new_username = serializer.data["new_" + User.USERNAME_FIELD] setattr(user, User.USERNAME_FIELD, new_username) user.save() if settings.USERNAME_CHANGED_EMAIL_CONFIRMATION: context = {"user": user} to = [get_user_email(user)] settings.EMAIL.username_changed_confirmation(self.request, context).send(to) return Response(status=status.HTTP_204_NO_CONTENT) @action(["post"], detail=False, url_path=f"reset_{User.USERNAME_FIELD}") def reset_username(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.get_user() if user: context = {"user": user} to = [get_user_email(user)] settings.EMAIL.username_reset(self.request, context).send(to) return Response(status=status.HTTP_204_NO_CONTENT) @action(["post"], detail=False, url_path=f"reset_{User.USERNAME_FIELD}_confirm") def reset_username_confirm(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) new_username = serializer.data["new_" + User.USERNAME_FIELD] setattr(serializer.user, User.USERNAME_FIELD, new_username) if hasattr(serializer.user, "last_login"): serializer.user.last_login = now() serializer.user.save() if settings.USERNAME_CHANGED_EMAIL_CONFIRMATION: context = {"user": serializer.user} to = [get_user_email(serializer.user)] settings.EMAIL.username_changed_confirmation(self.request, context).send(to) return Response(status=status.HTTP_204_NO_CONTENT) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7949064 djoser-2.3.1/djoser/webauthn/__init__.py0000644000000000000000000000000000000000000016334 0ustar0000000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7949064 djoser-2.3.1/djoser/webauthn/apps.py0000644000000000000000000000014200000000000015547 0ustar0000000000000000from django.apps import AppConfig class WebauthnConfig(AppConfig): name = "djoser.webauthn" ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7949064 djoser-2.3.1/djoser/webauthn/migrations/0001_initial.py0000644000000000000000000000267700000000000021070 0ustar0000000000000000# Generated by Django 2.2.4 on 2019-09-05 05:11 import django.db.models.deletion from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [migrations.swappable_dependency(settings.AUTH_USER_MODEL)] operations = [ migrations.CreateModel( name="CredentialOptions", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("challenge", models.TextField()), ("username", models.TextField(unique=True)), ("display_name", models.TextField()), ("ukey", models.TextField(unique=True)), ("credential_id", models.TextField()), ("sign_count", models.IntegerField(null=True)), ("public_key", models.TextField()), ( "user", models.OneToOneField( null=True, on_delete=django.db.models.deletion.CASCADE, related_name="credential_options", to=settings.AUTH_USER_MODEL, ), ), ], ) ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7949064 djoser-2.3.1/djoser/webauthn/migrations/__init__.py0000644000000000000000000000000000000000000020510 0ustar0000000000000000././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7949064 djoser-2.3.1/djoser/webauthn/models.py0000644000000000000000000000105200000000000016070 0ustar0000000000000000from django.conf import settings from django.db import models class CredentialOptions(models.Model): challenge = models.TextField() username = models.TextField(unique=True) display_name = models.TextField() ukey = models.TextField(unique=True) user = models.OneToOneField( settings.AUTH_USER_MODEL, related_name="credential_options", null=True, on_delete=models.CASCADE, ) credential_id = models.TextField() sign_count = models.IntegerField(null=True) public_key = models.TextField() ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7949064 djoser-2.3.1/djoser/webauthn/serializers.py0000644000000000000000000000400200000000000017137 0ustar0000000000000000from django.contrib.auth import get_user_model from rest_framework import serializers from djoser.conf import settings from djoser.serializers import UserCreateMixin from .models import CredentialOptions from .utils import create_challenge, create_ukey User = get_user_model() class WebauthnSignupSerializer(serializers.ModelSerializer): class Meta: model = CredentialOptions fields = ("username", "display_name") def create(self, validated_data): validated_data.update( { "challenge": create_challenge( length=settings.WEBAUTHN["CHALLENGE_LENGTH"] ), "ukey": create_ukey(length=settings.WEBAUTHN["UKEY_LENGTH"]), } ) return super().create(validated_data) def validate_username(self, username): if User.objects.filter(username=username).exists(): raise serializers.ValidationError(f"User {username} already exists.") return username class WebauthnCreateUserSerializer(UserCreateMixin, serializers.ModelSerializer): class Meta: model = User fields = tuple(User.REQUIRED_FIELDS) + ( settings.LOGIN_FIELD, User._meta.pk.name, ) class WebauthnLoginSerializer(serializers.Serializer): default_error_messages = { "invalid_credentials": settings.CONSTANTS.messages.INVALID_CREDENTIALS_ERROR } def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields[settings.LOGIN_FIELD] = serializers.CharField(required=True) def validate_username(self, username): try: search_kwargs = { settings.LOGIN_FIELD: username, "credential_options__isnull": False, } self.user = user = User.objects.get(**search_kwargs) except User.DoesNotExist: self.fail("invalid_credentials") if not user.is_active: self.fail("invalid_credentials") return username ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7949064 djoser-2.3.1/djoser/webauthn/urls.py0000644000000000000000000000100500000000000015570 0ustar0000000000000000from django.urls import re_path from . import views urlpatterns = [ re_path( r"^signup_request/$", views.SignupRequestView.as_view(), name="webauthn_signup_request", ), re_path( r"^signup/(?P.+)/$", views.SignupView.as_view(), name="webauthn_signup" ), re_path( r"^login_request/$", views.LoginRequestView.as_view(), name="webauthn_login_request", ), re_path(r"^login/$", views.LoginView.as_view(), name="webauthn_login"), ] ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7949064 djoser-2.3.1/djoser/webauthn/utils.py0000644000000000000000000000044500000000000015752 0ustar0000000000000000import string from random import SystemRandom random = SystemRandom() challenge_characters = string.ascii_letters + string.digits def create_challenge(length): return "".join(random.choices(challenge_characters, k=length)) def create_ukey(length): return create_challenge(length) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171455.7949064 djoser-2.3.1/djoser/webauthn/views.py0000644000000000000000000001322100000000000015743 0ustar0000000000000000from django.contrib.auth import get_user_model from django.shortcuts import get_object_or_404 from rest_framework import status from rest_framework.permissions import AllowAny from rest_framework.response import Response from rest_framework.settings import api_settings from rest_framework.views import APIView from webauthn import ( WebAuthnAssertionOptions, WebAuthnAssertionResponse, WebAuthnMakeCredentialOptions, WebAuthnRegistrationResponse, WebAuthnUser, ) from webauthn.webauthn import ( AuthenticationRejectedException, RegistrationRejectedException, ) from djoser import signals from djoser.compat import get_user_email from djoser.conf import settings from djoser.utils import login_user from .models import CredentialOptions from .serializers import WebauthnLoginSerializer, WebauthnSignupSerializer from .utils import create_challenge User = get_user_model() class SignupRequestView(APIView): permission_classes = (AllowAny,) serializer_class = WebauthnSignupSerializer def post(self, request): serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) co = serializer.save() credential_registration_dict = WebAuthnMakeCredentialOptions( challenge=co.challenge, rp_name=settings.WEBAUTHN["RP_NAME"], rp_id=settings.WEBAUTHN["RP_ID"], user_id=co.ukey, username=co.username, display_name=co.display_name, icon_url="", ) return Response(credential_registration_dict.registration_dict) class SignupView(APIView): permission_classes = (AllowAny,) serializer_class = settings.WEBAUTHN.SIGNUP_SERIALIZER def post(self, request, ukey): co = get_object_or_404(CredentialOptions, ukey=ukey) user_serializer = self.serializer_class(data=request.data) user_serializer.is_valid(raise_exception=True) webauthn_registration_response = WebAuthnRegistrationResponse( rp_id=settings.WEBAUTHN["RP_ID"], origin=settings.WEBAUTHN["ORIGIN"], registration_response=request.data, challenge=co.challenge, none_attestation_permitted=True, ) try: webauthn_credential = webauthn_registration_response.verify() except RegistrationRejectedException: return Response( {api_settings.NON_FIELD_ERRORS_KEY: "WebAuthn verification failed."}, status=status.HTTP_400_BAD_REQUEST, ) user = user_serializer.save() co.challenge = "" co.user = user co.sign_count = webauthn_credential.sign_count co.credential_id = webauthn_credential.credential_id.decode() co.public_key = webauthn_credential.public_key.decode() co.save() signals.user_registered.send( sender=self.__class__, user=user, request=self.request ) if settings.SEND_ACTIVATION_EMAIL and not user.is_active: context = {"user": user} to = [get_user_email(user)] settings.EMAIL.activation(self.request, context).send(to) return Response(user_serializer.data, status=status.HTTP_201_CREATED) class LoginRequestView(APIView): permission_classes = (AllowAny,) serializer_class = WebauthnLoginSerializer def post(self, request): serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) co = CredentialOptions.objects.get( username=serializer.validated_data["username"] ) co.challenge = create_challenge(32) co.save() webauthn_user = WebAuthnUser( user_id=co.ukey, username=co.username, display_name=co.display_name, icon_url="", credential_id=co.credential_id, public_key=co.public_key, sign_count=co.sign_count, rp_id=settings.WEBAUTHN["RP_ID"], ) webauthn_assertion_options = WebAuthnAssertionOptions( webauthn_user, co.challenge ) return Response(webauthn_assertion_options.assertion_dict) # this name looks good :) class LoginView(APIView): permission_classes = (AllowAny,) serializer_class = settings.WEBAUTHN.LOGIN_SERIALIZER def post(self, request): serializer = self.serializer_class(data=request.data) serializer.is_valid(raise_exception=True) user = serializer.user co = user.credential_options webuathn_user = WebAuthnUser( user_id=co.ukey, username=user.username, display_name=co.display_name, icon_url="", credential_id=co.credential_id, public_key=co.public_key, sign_count=co.sign_count, rp_id=settings.WEBAUTHN["RP_ID"], ) webauthn_assertion_response = WebAuthnAssertionResponse( webuathn_user, request.data, co.challenge, settings.WEBAUTHN["ORIGIN"], uv_required=False, ) try: sign_count = webauthn_assertion_response.verify() except AuthenticationRejectedException: return Response( {api_settings.NON_FIELD_ERRORS_KEY: "WebAuthn verification failed."}, status=status.HTTP_400_BAD_REQUEST, ) co.sign_count = sign_count co.challenge = "" co.save() token_serializer_class = settings.SERIALIZERS.token token = login_user(request, user) return Response( token_serializer_class(token).data, status=status.HTTP_201_CREATED ) ././@PaxHeader0000000000000000000000000000003400000000000011452 xustar000000000000000028 mtime=1731171466.4870126 djoser-2.3.1/pyproject.toml0000644000000000000000000000607600000000000014057 0ustar0000000000000000[tool.poetry] name = "djoser" version = "2.3.1" description = "REST implementation of Django authentication system." authors = [ "Sunscrapers ", ] maintainers = [ "Tomasz Wojcik ", ] license = "MIT" classifiers = [ "Development Status :: 5 - Production/Stable", "Framework :: Django", "Framework :: Django :: 3.1", "Framework :: Django :: 3.2", "Framework :: Django :: 4.0", "Framework :: Django :: 4.1", "Framework :: Django :: 4.2", "Framework :: Django :: 5.0", # 5.0b1 in Djoser test suite "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Operating System :: OS Independent", "Programming Language :: Python", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", ] repository = "https://github.com/sunscrapers/djoser" documentation = "https://djoser.readthedocs.io/" readme = "README.rst" include = ["djoser/locale/**/*.mo"] packages = [ { include = "djoser" }, ] [tool.poetry.dependencies] python = "^3.8" djangorestframework-simplejwt = "^5.0" social-auth-app-django = "^5.0.0" djet = { version = "^0.3.0", optional = true } webauthn = { version = "<1.0", optional = true } django = ">=3.0.0" [tool.poetry.extras] # https://python-poetry.org/docs/pyproject/#extras djet = ["djet"] webauthn = ["webauthn"] # poetry add --group test [tool.poetry.group.test.dependencies] pytest = "^7.2.2" coverage = "^7.2.2" pytest-cov = "^4.0.0" pytest-django = "^4.5.2" tox = "^4.4.8" babel = "^2.12.1" pytest-mock = "^3.14.0" [tool.poetry.group.code-quality.dependencies] black = "^23.1.0" ruff = "^0.0.241" docformatter = "^1.5.1" pyupgrade = "^3.3.1" pre-commit = "^3.0.4" pre-commit-hooks = "^4.4.0" [tool.poetry.group.docs.dependencies] sphinx = "^6.1.3" toml = "^0.10.2" sphinx-rtd-theme = "^1.2.0" [tool.black] line-length = 88 target-version = ["py38", "py39", "py310", "py311"] include = '\.pyi?$' exclude = ''' ( /( \.cache | \.eggs | \.git | \.hg | \.mypy_cache | \.pytest_cache | \.tox | \.venv | __pycache__ | _build | buck-out | build | dist | docs | migrations )/ ) ''' [tool.ruff] select = ["E", "F"] ignore = [] fixable = ["A", "B", "C", "D", "E", "F"] unfixable = [] exclude = [ ".bzr", ".direnv", ".eggs", ".git", ".hg", ".mypy_cache", ".nox", ".pants.d", ".ruff_cache", ".svn", ".tox", ".venv", "__pypackages__", "_build", "buck-out", "build", "dist", "node_modules", "venv", "migrations" ] line-length = 88 target-version = "py38" [tool.docformatter] recursive = true pre-summary-newline = true make-summary-multi-line = true wrap-summaries = 88 wrap-descriptions = 88 in-place = true [tool.pytest.ini_options] minversion = "7.0" DJANGO_SETTINGS_MODULE = "testproject.settings" python_paths = "testproject" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" djoser-2.3.1/setup.py0000644000000000000000000001303600000000000012647 0ustar0000000000000000# -*- coding: utf-8 -*- from setuptools import setup packages = \ ['djoser', 'djoser.social', 'djoser.social.backends', 'djoser.social.token', 'djoser.urls', 'djoser.webauthn', 'djoser.webauthn.migrations'] package_data = \ {'': ['*'], 'djoser': ['locale/ca/LC_MESSAGES/*', 'locale/de/LC_MESSAGES/*', 'locale/es/LC_MESSAGES/*', 'locale/fr/LC_MESSAGES/*', 'locale/id/LC_MESSAGES/*', 'locale/ja/LC_MESSAGES/*', 'locale/ka/LC_MESSAGES/*', 'locale/me/LC_MESSAGES/*', 'locale/pl/LC_MESSAGES/*', 'locale/pt_BR/LC_MESSAGES/*', 'locale/ru_RU/LC_MESSAGES/*', 'templates/email/*']} install_requires = \ ['django>=3.0.0', 'djangorestframework-simplejwt>=5.0,<6.0', 'social-auth-app-django>=5.0.0,<6.0.0'] extras_require = \ {'djet': ['djet>=0.3.0,<0.4.0'], 'webauthn': ['webauthn<1.0']} setup_kwargs = { 'name': 'djoser', 'version': '2.3.1', 'description': 'REST implementation of Django authentication system.', 'long_description': '======\ndjoser\n======\n\n.. image:: https://img.shields.io/pypi/v/djoser.svg\n :target: https://pypi.org/project/djoser\n\n.. image:: https://github.com/sunscrapers/djoser/workflows/Tests/badge.svg\n :target: https://github.com/sunscrapers/djoser/actions?query=branch%3Amaster+workflow%Tests++\n :alt: Build Status\n\n.. image:: https://codecov.io/gh/sunscrapers/djoser/branch/master/graph/badge.svg\n :target: https://codecov.io/gh/sunscrapers/djoser\n\n.. image:: https://img.shields.io/pypi/dm/djoser\n :target: https://img.shields.io/pypi/dm/djoser\n\n.. image:: https://readthedocs.org/projects/djoser/badge/?version=latest\n :target: https://djoser.readthedocs.io/en/latest/\n :alt: Docs\n\nREST implementation of `Django `_ authentication\nsystem. **djoser** library provides a set of `Django Rest Framework `_\nviews to handle basic actions such as registration, login, logout, password\nreset and account activation. It works with\n`custom user model `_.\n\nInstead of reusing Django code (e.g. ``PasswordResetForm``), we reimplemented\nfew things to fit better into `Single Page App `_\narchitecture.\n\nDeveloped by `SUNSCRAPERS `_ with passion & patience.\n\n.. image:: https://asciinema.org/a/94J4eG2tSBD2iEfF30a6vGtXw.png\n :target: https://asciinema.org/a/94J4eG2tSBD2iEfF30a6vGtXw\n\nRequirements\n============\n\nTo be able to run **djoser** you have to meet the following requirements:\n\n- Python>=3.8\n- Django>=3.0.0\n- Django REST Framework>=3.12\n\nInstallation\n============\n\nSimply install using ``pip``:\n\n.. code-block:: bash\n\n $ pip install djoser\n\nAnd continue with the steps described at\n`configuration `_\nguide.\n\nDocumentation\n=============\n\nDocumentation is available to study at\n`https://djoser.readthedocs.io `_\nand in ``docs`` directory.\n\nContributing and development\n============================\n\nTo start developing on **djoser**, clone the repository:\n\n.. code-block:: bash\n\n $ git clone git@github.com:sunscrapers/djoser.git\n\nWe use `poetry `_ as dependency management and packaging tool.\n\n.. code-block:: bash\n\n $ cd djoser\n $ poetry install --all-extras\n\nThis will create a virtualenv with all development dependencies.\n\nTo run the test just type:\n\n.. code-block:: bash\n\n $ poetry run py.test testproject\n\nWe also prepared a convenient ``Makefile`` to automate commands above:\n\n.. code-block:: bash\n\n $ make init\n $ make test\n\nTo activate the virtual environment run\n\n.. code-block:: bash\n\n $ poetry shell\n\nWithout poetry\n--------------\n\nNew versions of ``pip`` can use ``pyproject.toml`` to build the package and install its dependencies.\n\n.. code-block:: bash\n\n $ pip install .[test]\n\n.. code-block:: bash\n\n $ cd testproject\n $ ./manage.py test\n\nExample project\n---------------\n\nYou can also play with test project by running following commands:\n\n.. code-block:: bash\n\n $ make migrate\n $ make runserver\n\nCommiting your code\n-------------------\n\nBefore sending patches please make sure you have `pre-commit `_ activated in your local git repository:\n\n.. code-block:: bash\n\n $ pre-commit install\n\nThis will ensure that your code is cleaned before you commit it.\n\nSimilar projects\n================\n\nList of projects related to Django, REST and authentication:\n\n- `django-rest-registration `_\n- `django-oauth-toolkit `_\n\nPlease, keep in mind that while using custom authentication and TokenCreateSerializer\nvalidation, there is a path that **ignores intentional return of None** from authenticate()\nand try to find User using parameters. Probably, that will be changed in the future.\n', 'author': 'Sunscrapers', 'author_email': 'info@sunscrapers.com', 'maintainer': 'Tomasz Wojcik', 'maintainer_email': 'djoser@tomwojcik.com', 'url': 'https://github.com/sunscrapers/djoser', 'packages': packages, 'package_data': package_data, 'install_requires': install_requires, 'extras_require': extras_require, 'python_requires': '>=3.8,<4.0', } setup(**setup_kwargs) djoser-2.3.1/PKG-INFO0000644000000000000000000001317400000000000012235 0ustar0000000000000000Metadata-Version: 2.1 Name: djoser Version: 2.3.1 Summary: REST implementation of Django authentication system. Home-page: https://github.com/sunscrapers/djoser License: MIT Author: Sunscrapers Author-email: info@sunscrapers.com Maintainer: Tomasz Wojcik Maintainer-email: djoser@tomwojcik.com Requires-Python: >=3.8,<4.0 Classifier: Development Status :: 5 - Production/Stable Classifier: Framework :: Django Classifier: Framework :: Django :: 3.1 Classifier: Framework :: Django :: 3.2 Classifier: Framework :: Django :: 4.0 Classifier: Framework :: Django :: 4.1 Classifier: Framework :: Django :: 4.2 Classifier: Framework :: Django :: 5.0 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: MIT License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.10 Classifier: Programming Language :: Python :: 3.11 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Provides-Extra: djet Provides-Extra: webauthn Requires-Dist: django (>=3.0.0) Requires-Dist: djangorestframework-simplejwt (>=5.0,<6.0) Requires-Dist: djet (>=0.3.0,<0.4.0) ; extra == "djet" Requires-Dist: social-auth-app-django (>=5.0.0,<6.0.0) Requires-Dist: webauthn (<1.0) ; extra == "webauthn" Project-URL: Documentation, https://djoser.readthedocs.io/ Project-URL: Repository, https://github.com/sunscrapers/djoser Description-Content-Type: text/x-rst ====== djoser ====== .. image:: https://img.shields.io/pypi/v/djoser.svg :target: https://pypi.org/project/djoser .. image:: https://github.com/sunscrapers/djoser/workflows/Tests/badge.svg :target: https://github.com/sunscrapers/djoser/actions?query=branch%3Amaster+workflow%Tests++ :alt: Build Status .. image:: https://codecov.io/gh/sunscrapers/djoser/branch/master/graph/badge.svg :target: https://codecov.io/gh/sunscrapers/djoser .. image:: https://img.shields.io/pypi/dm/djoser :target: https://img.shields.io/pypi/dm/djoser .. image:: https://readthedocs.org/projects/djoser/badge/?version=latest :target: https://djoser.readthedocs.io/en/latest/ :alt: Docs REST implementation of `Django `_ authentication system. **djoser** library provides a set of `Django Rest Framework `_ views to handle basic actions such as registration, login, logout, password reset and account activation. It works with `custom user model `_. Instead of reusing Django code (e.g. ``PasswordResetForm``), we reimplemented few things to fit better into `Single Page App `_ architecture. Developed by `SUNSCRAPERS `_ with passion & patience. .. image:: https://asciinema.org/a/94J4eG2tSBD2iEfF30a6vGtXw.png :target: https://asciinema.org/a/94J4eG2tSBD2iEfF30a6vGtXw Requirements ============ To be able to run **djoser** you have to meet the following requirements: - Python>=3.8 - Django>=3.0.0 - Django REST Framework>=3.12 Installation ============ Simply install using ``pip``: .. code-block:: bash $ pip install djoser And continue with the steps described at `configuration `_ guide. Documentation ============= Documentation is available to study at `https://djoser.readthedocs.io `_ and in ``docs`` directory. Contributing and development ============================ To start developing on **djoser**, clone the repository: .. code-block:: bash $ git clone git@github.com:sunscrapers/djoser.git We use `poetry `_ as dependency management and packaging tool. .. code-block:: bash $ cd djoser $ poetry install --all-extras This will create a virtualenv with all development dependencies. To run the test just type: .. code-block:: bash $ poetry run py.test testproject We also prepared a convenient ``Makefile`` to automate commands above: .. code-block:: bash $ make init $ make test To activate the virtual environment run .. code-block:: bash $ poetry shell Without poetry -------------- New versions of ``pip`` can use ``pyproject.toml`` to build the package and install its dependencies. .. code-block:: bash $ pip install .[test] .. code-block:: bash $ cd testproject $ ./manage.py test Example project --------------- You can also play with test project by running following commands: .. code-block:: bash $ make migrate $ make runserver Commiting your code ------------------- Before sending patches please make sure you have `pre-commit `_ activated in your local git repository: .. code-block:: bash $ pre-commit install This will ensure that your code is cleaned before you commit it. Similar projects ================ List of projects related to Django, REST and authentication: - `django-rest-registration `_ - `django-oauth-toolkit `_ Please, keep in mind that while using custom authentication and TokenCreateSerializer validation, there is a path that **ignores intentional return of None** from authenticate() and try to find User using parameters. Probably, that will be changed in the future.