././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4808931 django-registration-3.3/0000755000076700000240000000000000000000000014316 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1516537948.0 django-registration-3.3/AUTHORS0000644000076700000240000000211600000000000015366 0ustar00jamesstaffThe primary author of django-registration is James Bennett, who may be found online at . Over the many years of django-registration's development, however, many others have contributed code, documentation and translations, and django-registration would not be what it is without their help. Below is a list of contributors who can be identified from the development history: * Samuel Adam * A. Al-Ibrahim * Adam Alton * Luis Felipe Álvarez Burgos * Florian Apolloner * Carles Barrobés * Nico den Boer * Rune Bromer * Joost Cassee * Flavio Curella * Baptiste Darthenay * Nebojsa Djordjevic * Liang Feng * Ilya Filippov * Rapahel Hertzog * Recep Kirmizi * Domen Kožar * Meir Kriheli * Björn Kristinsson * Panos Laganakos * Nicola Larosa * Jannis Leidel * Jon Lønne * João Luiz Lorencetti * Italo Maia * Mohsen Mansouryar * Leonardo Manuel Rocha * Nuno Mariz * Andy Mikhailenko * Vladislav Mitov * Marko Mrdjenovic * Michael Niewöhner * Shinya Okano * Young Gyu Park * Duncan Parkes * Patrick Samson * Daniel Samuels * Ernesto Rico Schmidt * Emil Stenström * Jarek Zgoda ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653721498.0 django-registration-3.3/LICENSE0000644000076700000240000000276300000000000015333 0ustar00jamesstaffCopyright (c) 2007-2022, James Bennett All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the author nor the names of other contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1581881094.0 django-registration-3.3/MANIFEST.in0000644000076700000240000000020700000000000016053 0ustar00jamesstaffinclude LICENSE include MANIFEST.in include AUTHORS recursive-include docs * include tox.ini include runtests.py graft src graft tests ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4810357 django-registration-3.3/PKG-INFO0000644000076700000240000000323600000000000015417 0ustar00jamesstaffMetadata-Version: 2.1 Name: django-registration Version: 3.3 Summary: An extensible user-registration application for Django Home-page: https://github.com/ubernostrum/django-registration/ Author: James Bennett Author-email: james@b-list.org Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Web Environment Classifier: Framework :: Django Classifier: Framework :: Django :: 3.1 Classifier: Framework :: Django :: 3.2 Classifier: Framework :: Django :: 4.0 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Topic :: Utilities Requires-Python: >=3.7 License-File: LICENSE .. -*-restructuredtext-*- .. image:: https://github.com/ubernostrum/django-registration/workflows/CI/badge.svg :alt: CI status image :target: https://github.com/ubernostrum/django-registration/actions?query=workflow%3ACI This is a user-registration application for `Django `_. There are two registration workflows (one-step, and two-step with activation) built in, and it's designed to be extensible and support building additional workflows. To get started, check out `the documentation `_. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1607766037.0 django-registration-3.3/README.rst0000644000076700000240000000110200000000000015777 0ustar00jamesstaff.. -*-restructuredtext-*- .. image:: https://github.com/ubernostrum/django-registration/workflows/CI/badge.svg :alt: CI status image :target: https://github.com/ubernostrum/django-registration/actions?query=workflow%3ACI This is a user-registration application for `Django `_. There are two registration workflows (one-step, and two-step with activation) built in, and it's designed to be extensible and support building additional workflows. To get started, check out `the documentation `_. ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4438365 django-registration-3.3/docs/0000755000076700000240000000000000000000000015246 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1516537948.0 django-registration-3.3/docs/Makefile0000644000076700000240000000571300000000000016714 0ustar00jamesstaff# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d _build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf _build/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) _build/html @echo @echo "Build finished. The HTML pages are in _build/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) _build/dirhtml @echo @echo "Build finished. The HTML pages are in _build/dirhtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) _build/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) _build/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) _build/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in _build/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) _build/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in _build/qthelp, like this:" @echo "# qcollectiongenerator _build/qthelp/django-registration.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile _build/qthelp/django-registration.qhc" latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) _build/latex @echo @echo "Build finished; the LaTeX files are in _build/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) _build/changes @echo @echo "The overview file is in _build/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) _build/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in _build/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) _build/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in _build/doctest/output.txt." ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1580075032.0 django-registration-3.3/docs/activation-workflow.rst0000644000076700000240000002314100000000000022012 0ustar00jamesstaff.. _activation-workflow: .. module:: django_registration.backends.activation The two-step activation workflow ================================ The two-step activation workflow, found in `django_registration.backends.activation`, implements a two-step registration process: a user signs up, an inactive account is created, and an email is sent containing an activation link which must be clicked to make the account active. Behavior and configuration -------------------------- A default URLconf is provided, which you can :func:`~django.urls.include` in your URL configuration; that URLconf is `django_registration.backends.activation.urls`. For example, to place user registration under the URL prefix `/accounts/`, you could place the following in your root URLconf: .. code-block:: python from django.urls import include, path urlpatterns = [ # Other URL patterns ... path('accounts/', include('django_registration.backends.activation.urls')), path('accounts/', include('django.contrib.auth.urls')), # More URL patterns ... ] That also sets up the views from `django.contrib.auth` (login, logout, password reset, etc.). This workflow makes use of up to three settings (click for details on each): * :data:`~django.conf.settings.ACCOUNT_ACTIVATION_DAYS` * :data:`~django.conf.settings.REGISTRATION_OPEN` * :data:`~django.conf.settings.REGISTRATION_SALT` (see also :ref:`note below `) By default, this workflow uses :class:`~django_registration.forms.RegistrationForm` as its form class for user registration; this can be overridden by passing the keyword argument `form_class` to the registration view. Views ----- .. currentmodule:: django_registration.backends.activation.views Two views are provided to implement the signup/activation process. These subclass :ref:`the base views of django-registration `, so anything that can be overridden/customized there can equally be overridden/customized here. There are some additional customization points specific to this implementation, which are listed below. For an overview of the templates used by these views (other than those specified below), and their context variables, see :ref:`the quick start guide `. .. class:: RegistrationView A subclass of :class:`django_registration.views.RegistrationView` implementing the signup portion of this workflow. Important customization points unique to this class are: .. method:: create_inactive_user(form) Creates and returns an inactive user account, and calls :meth:`send_activation_email()` to send the email with the activation key. The argument `form` is a valid registration form instance passed from :meth:`~django_registration.views.RegistrationView.register()`. :param django_registration.forms.RegistrationForm form: The registration form. :rtype: django.contrib.auth.models.AbstractUser .. method:: get_activation_key(user) Given an instance of the user model, generates and returns an activation key (a string) for that user account. :param django.contrib.auth.models.AbstractUser user: The new user account. :rtype: str .. method:: get_email_context(activation_key) Returns a dictionary of values to be used as template context when generating the activation email. :param str activation_key: The activation key for the new user account. :rtype: dict .. method:: send_activation_email(user) Given an inactive user account, generates and sends the activation email for that account. :param django.contrib.auth.models.AbstractUser user: The new user account. :rtype: None .. attribute:: email_body_template A string specifying the template to use for the body of the activation email. Default is `"django_registration/activation_email_body.txt"`. .. attribute:: email_subject_template A string specifying the template to use for the subject of the activation email. Default is `"django_registration/activation_email_subject.txt"`. Note that, to avoid `header-injection vulnerabilities `_, the result of rendering this template will be forced into a single line of text, stripping newline characters. .. class:: ActivationView A subclass of :class:`django_registration.views.ActivationView` implementing the activation portion of this workflow. Errors in activating the user account will raise :exc:`~django_registration.exceptions.ActivationError`, with one of the following values for the exception's `code`: `"already_activated"` Indicates the account has already been activated. `"bad_username"` Indicates the username decoded from the activation key is invalid (does not correspond to any user account). `"expired"` Indicates the account/activation key has expired. `"invalid_key"` Generic indicator that the activation key was invalid. Important customization points unique to this class are: .. method:: get_user(username) Given a username (determined by the activation key), looks up and returns the corresponding instance of the user model. If no such account exists, raises :exc:`~django_registration.exceptions.ActivationError` as described above. In the base implementation, checks the :attr:`~django.contrib.auth.models.User.is_active` field to avoid re-activating already-active accounts, and raises :exc:`~django_registration.exceptions.ActivationError` with code `already_activated` to indicate this case. :param str username: The username of the new user account. :rtype: django.contrib.auth.models.AbstractUser :raises django_registration.exceptions.ActivationError: if no matching inactive user account exists. .. method:: validate_key(activation_key) Given the activation key, verifies that it carries a valid signature and a timestamp no older than the number of days specified in the setting `ACCOUNT_ACTIVATION_DAYS`, and returns the username from the activation key. Raises :exc:`~django_registration.exceptions.ActivationError`, as described above, if the activation key has an invalid signature or if the timestamp is too old. :param str activation_key: The activation key for the new user account. :rtype: str :raises django_registration.exceptions.ActivationError: if the activation key has an invalid signature or is expired. .. note:: **URL patterns for activation** Although the actual value used in the activation key is the new user account's username, the URL pattern for :class:`~views.ActivationView` does not need to match all possible legal characters in a username. The activation key that will be sent to the user (and thus matched in the URL) is produced by :func:`django.core.signing.dumps()`, which base64-encodes its output. Thus, the only characters this pattern needs to match are those from `the URL-safe base64 alphabet `_, plus the colon ("`:`") which is used as a separator. The default URL pattern for the activation view in `django_registration.backends.activation.urls` handles this for you. How it works ------------ When a user signs up, the activation workflow creates a new user instance to represent the account, and sets the `is_active` field to :data:`False`. It then sends an email to the address provided during signup, containing a link to activate the account. When the user clicks the link, the activation view sets `is_active` to :data:`True`, after which the user can log in. The activation key is the username of the new account, signed using `Django's cryptographic signing tools `_ (specifically, :func:`~django.core.signing.dumps()` is used, to produce a guaranteed-URL-safe value). The activation process includes verification of the signature prior to activation, as well as verifying that the user is activating within the permitted window (as specified in the setting :data:`~django.conf.settings.ACCOUNT_ACTIVATION_DAYS`, mentioned above), through use of Django's :class:`~django.core.signing.TimestampSigner`. Security considerations ----------------------- The activation key emailed to the user in the activation workflow is a value obtained by using Django's cryptographic signing tools. The activation key is of the form:: encoded_username:timestamp:signature where `encoded_username` is the username of the new account, `timestamp` is the timestamp of the time the user registered, and `signature` is an HMAC of the username and timestamp. The username and HMAC will be URL-safe base64 encoded; the timestamp will be base62 encoded. Django's implementation uses the value of the :data:`~django.conf.settings.SECRET_KEY` setting as the key for HMAC; additionally, it permits the specification of a salt value which can be used to "namespace" different uses of HMAC across a Django-powered site. .. _salt-security: The activation workflow will use the value (a string) of the setting :data:`~django.conf.settings.REGISTRATION_SALT` as the salt, defaulting to the string `"registration"` if that setting is not specified. This value does *not* need to be kept secret (only :data:`~django.conf.settings.SECRET_KEY` does); it serves only to ensure that other parts of a site which also produce signed values from user input could not be used as a way to generate activation keys for arbitrary usernames (and vice-versa). ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653721512.0 django-registration-3.3/docs/conf.py0000644000076700000240000000241300000000000016545 0ustar00jamesstaffimport os import sys on_rtd = os.environ.get("READTHEDOCS", None) == "True" extensions = ["sphinx.ext.intersphinx"] templates_path = ["_templates"] source_suffix = ".rst" master_doc = "index" project = "django-registration" copyright = "2007-2022, James Bennett" version = "3.3" release = "3.3" exclude_trees = ["_build"] pygments_style = "sphinx" htmlhelp_basename = "django-registrationdoc" latex_documents = [ ( "index", "django-registration.tex", "django-registration Documentation", "James Bennett", "manual", ) ] intersphinx_mapping = { "django": ( "https://docs.djangoproject.com/en/stable/", "https://docs.djangoproject.com/en/stable/_objects/", ), "python": ("https://docs.python.org/3", None), } if not on_rtd: import sphinx_rtd_theme html_theme = "sphinx_rtd_theme" html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # Spelling check needs an additional module that is not installed by default. # Add it only if spelling check is requested so docs can be generated without it. if "spelling" in sys.argv: extensions.append("sphinxcontrib.spelling") # Spelling language. spelling_lang = "en_US" # Location of word list. spelling_word_list_filename = "spelling_wordlist.txt" ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1580073510.0 django-registration-3.3/docs/custom-user.rst0000644000076700000240000002306700000000000020276 0ustar00jamesstaff.. _custom-user: Custom user models ================== Django's built-in auth system provides a default model for user accounts, but also supports replacing that default with `a custom user model `_. Many projects choose to use a custom user model from the start of their development, even if it begins as a copy of the default model, in order to avoid the difficulty of migrating to a custom user model later on. In general, django-registration will work with a custom user model, though at least some additional configuration is always required in order to do so. If you are using a custom user model, please read this document thoroughly *before* using django-registration, in order to ensure you've taken all the necessary steps to ensure support. The process for using a custom user model with django-registration can be summarized as follows: 1. Compare your custom user model to the assumptions made by the built-in registration workflows. 2. If your user model is compatible with those assumptions, write a short subclass of :class:`~django_registration.forms.RegistrationForm` pointed at your user model, and instruct django-registration to use that form. 3. If your user model is *not* compatible with those assumptions, either write subclasses of the appropriate views in django-registration which will be compatible with your user model, or modify your user model to be compatible with the built-in views. These steps are covered in more detail below. Compatibility of the built-in workflows with custom user models --------------------------------------------------------------- Django provides a number of helpers to make it easier for code to generically work with custom user models, and django-registration makes use of these. However, the built-in registration workflows must still make *some* assumptions about the structure of your user model in order to work with it. If you intend to use one of django-registration's built-in registration workflows, please carefully read the appropriate section to see what it expects from your user model. The two-step activation workflow ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :ref:`The two-step activation workflow ` requires that the following be true of your user model: * Your user model must set the attribute :attr:`~django.contrib.auth.models.CustomUser.USERNAME_FIELD` to indicate the field used as the username. * Your user model must have a field (of some textual type, ideally :class:`~django.db.models.EmailField`) for storing an email address, and it must define the method :meth:`~django.contrib.auth.models.AbstractBaseUser.get_email_field_name` to indicate the name of the email field. * The username and email fields must be distinct. If you wish to use the email address as the username, you will need to write your own completely custom registration form. * Your user model must have a field named :attr:`~django.contrib.auth.models.User.is_active`, and that field must be a :class:`~django.db.models.BooleanField` indicating whether the user's account is active. If your user model is a subclass of Django's :class:`~django.contrib.auth.models.AbstractBaseUser`, all of the above will be automatically handled for you. If your custom user model defines additional fields beyond the minimum requirements, you'll either need to ensure that all of those fields are optional (i.e., can be `NULL` in your database, or provide a suitable default value defined in the model), or specify the correct list of fields to display in your :class:`~django_registration.forms.RegistrationForm` subclass. The one-step workflow ~~~~~~~~~~~~~~~~~~~~~ :ref:`The one-step workflow ` places the following requirements on your user model: * Your user model must set the attribute :attr:`~django.contrib.auth.models.CustomUser.USERNAME_FIELD` to indicate the field used as the username. * It must define a textual field named `password` for storing the user's password. Also note that the base :class:`~django_registration.forms.RegistrationForm` includes and requires an email field, so either provide that field on your model and set the :meth:`~django.contrib.auth.models.AbstractBaseUser.get_email_field_name` attribute to indicate which field it is, or subclass :class:`~django_registration.forms.RegistrationForm` and override to remove the `email` field or make it optional. If your user model is a subclass of Django's :class:`~django.contrib.auth.models.AbstractBaseUser`, all of the above will be automatically handled for you. If your custom user model defines additional fields beyond the minimum requirements, you'll either need to ensure that all of those fields are optional (i.e., can be `NULL` in your database, or provide a suitable default value defined in the model), or specify the correct list of fields to display in your :class:`~django_registration.forms.RegistrationForm` subclass. Because the one-step workflow logs in the new account immediately after creating it, you also must either use Django's :class:`~django.contrib.auth.backends.ModelBackend` as an `authentication backend `_, or use an authentication backend which accepts a combination of `USERNAME_FIELD` and `password` as sufficient credentials to authenticate a user. Writing your form subclass -------------------------- The base :class:`~django_registration.views.RegistrationView` contains code which compares the declared model of your registration form with the user model of your Django installation. If these are not the same model, the view will deliberately crash by raising an :exc:`~django.core.exceptions.ImproperlyConfigured` exception, with an error message alerting you to the problem. This will happen automatically if you attempt to use django-registration with a custom user model and also attempt to use the default, unmodified :class:`~django-registration.forms.RegistrationForm`. This is, again, a deliberate design feature of django-registration, and not a bug: django-registration has no way of knowing in advance if your user model is compatible with the assumptions made by the built-in registration workflows (see above), so it requires you to take the explicit step of replacing the default registration form as a way of confirming you've manually checked the compatibility of your user model. In the case where your user model is compatible with the default behavior of django-registration, you will be able to subclass :class:`~django_registration.forms.RegistrationForm`, set it to use your custom user model as the model, and then configure the views in django-registration to use your form subclass. For example, you might do the following (in a `forms.py` module somewhere in your codebase -- do **not** directly edit django-registration's code): .. code-block:: python from django_registration.forms import RegistrationForm from mycustomuserapp.models import MyCustomUser class MyCustomUserForm(RegistrationForm): class Meta(RegistrationForm.Meta): model = MyCustomUser You may also need to specify the fields to include in the form, if the set of fields to include is different from the default set specified by the base :class:`~django_registration.forms.RegistrationForm`. Then in your URL configuration (example here uses the two-step activation workflow), configure the registration view to use the form class you wrote: .. code-block:: python from django.urls import include, path from django_registration.backends.activation.views import RegistrationView from mycustomuserapp.forms import MyCustomUserForm urlpatterns = [ # ... other URL patterns here path('accounts/register/', RegistrationView.as_view( form_class=MyCustomUserForm ), name='django_registration_register', ), path('accounts/', include('django_registration.backends.activation.urls') ), # ... more URL patterns ] Incompatible user models ------------------------ If your custom user model is not compatible with the built-in workflows of django-registration, you have several options. One is to subclass the built-in form and view classes of django-registration and make the necessary adjustments to achieve compatibility with your user model. For example, if you want to use the two-step activation workflow, but your user model uses a completely different way of marking accounts active/inactive (compared to the the assumed `is_active` field), you might write subclasses of that workflow's :class:`~django_registration.backends.activation.views.RegistrationView` and :class:`~django_registration.backends.activation.views.ActivationView` which make use of your user model's mechanism for marking accounts active/inactive, and then use those views along with an appropriate subclass of :class:`~django_registration.forms.RegistrationForm`. Or, if the incompatibilities are relatively minor and you don't mind making the change, you might use Django's migration framework to adjust your custom user model to match the assumptions made by django-registration's built-in workflows, thus allowing them to be used unmodified. Finally, it may sometimes be the case that a given user model requires a completely custom set of form and view classes to support. Typically, this will also involve an account-registration process far enough from what django-registration's built-in workflows provide that you would be writing your own workflow in any case.././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/docs/deprecations.rst0000644000076700000240000000044100000000000020457 0ustar00jamesstaff.. _deprecations: Feature and API deprecation cycle ================================= This document will list any features or APIs of django-registration which are deprecated and scheduled to be removed in future releases. As of |release|, no features or APIs are currently deprecated.././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/docs/exceptions.rst0000644000076700000240000000210500000000000020157 0ustar00jamesstaff.. _exceptions: .. module:: django_registration.exceptions Exception classes ================= django-registration provides two base exception classes to signal errors which occur during the signup or activation processes. .. exception:: RegistrationError(message, code, params) Base exception class for all exceptions raised in django-registration. No code in django-registration will raise this exception directly; it serves solely to provide a distinguishing parent class for other errors. Arguments passed when the exception is raised will be stored and exposed as attributes of the same names on the exception object: :param str message: A human-readable error message. :param str code: A short but unique identifier used by subclasses to distinguish different error conditions. :param dict params: Arbitrary key-value data to associate with the error. .. exception:: ActivationError(message, code, params) Exception class to indicate errors during account activation. Subclass of :exc:`RegistrationError` and inherits its attributes.././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653721574.0 django-registration-3.3/docs/faq.rst0000644000076700000240000002450200000000000016552 0ustar00jamesstaff.. _faq: Frequently-asked questions ========================== The following are miscellaneous common questions and answers related to installing/using django-registration, culled from bug reports, emails and other sources. General ------- This doesn't work with custom user models! It crashes as soon as I try to use one! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ django-registration can work perfectly well with a custom user model, but this does require you to do a bit more work. Please thoroughly read :ref:`the documentation for how to use custom user models ` before filing a bug. Please also note that, as explained in that documentation, by default django-registration will crash if you try to use a custom user model without following the documentation. This is not a bug; it is done deliberately to ensure you read and follow the documentation. How can I support social-media and other auth schemes, like Facebook or GitHub? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ By using `django-allauth `_. No single application can or should provide a universal API for every authentication system ever developed; django-registration sticks to making it easy to implement typical signup workflows using Django's default model-based authentication system, while apps like `django-allauth` handle integration with third-party authentication services far more effectively. What license is django-registration under? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ django-registration is offered under a three-clause BSD-style license; this is `an OSI-approved open-source license `_, and allows you a large degree of freedom in modifying and redistributing the code. For the full terms, see the file `LICENSE` which came with your copy of django-registration; if you did not receive a copy of this file, you can view it online at . What versions of Django and Python are supported? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As of django-registration |release|, Django 3.2 and 4.0 are supported, on Python 3.7 (Django 3.2 only), 3.8, 3.9, and 3.10. Note that Django 3.2's support for Python 3.10 was added in Django 3.2.9, so you may experience issues with Python 3.10 and earlier Django 3.2 versions. I found a bug or want to make an improvement! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. important:: **Reporting security issues** If you believe you have found a security issue in django-registration, please do *not* use the public GitHub issue tracker to report it. Instead, you can `contact the author privately `_ to report the issue. The canonical development repository for django-registration is online at . Issues and pull requests can both be filed there. If you'd like to contribute to django-registration, that's great! Just please remember that pull requests should include tests and documentation for any changes made, and that following `PEP 8 `_ is mandatory. Pull requests without documentation won't be merged, and PEP 8 style violations or test coverage below 100% are both configured to break the build. How secure is django-registration? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Over the course of django-registration's history so far, there has been one security issue reported which required a new release to remedy. This doesn't mean, though, that django-registration is perfectly secure: much will depend on ensuring best practices in deployment and server configuration, and there could always be security issues that just haven't been recognized yet. django-registration does, however, try to avoid common security issues: * django-registration |release| only supports versions of Django which were receiving upstream security support at the time of release. * django-registration does not attempt to generate or store passwords, and does not transmit credentials which could be used to log in (the only "credential" ever sent out by django-registration is an activation key used in the two-step activation workflow, and that key can only be used to make an account active; it cannot be used to log in). * django-registration works with Django's own security features (including cryptographic features) where possible, rather than reinventing its own. For more details, see :ref:`the security guide `. How do I run the tests? ~~~~~~~~~~~~~~~~~~~~~~~ django-registration's tests are run using `tox `_, but typical installation of django-registration (via `pip install django-registration`) will not install the tests. To run the tests, download the source (`.tar.gz`) distribution of django-registration |release| from `its page on the Python Package Index `_, unpack it (`tar zxvf django-registration-|release|.tar.gz` on most Unix-like operating systems), and in the unpacked directory run `tox`. Note that you will need to have `tox` installed already (`pip install tox`), and to run the full test matrix you will need to have each supported version of Python available. To run only the tests for a specific Python version and Django version, you can invoke `tox` with the `-e` flag. For example, to run tests for Python 3.6 and Django 2.0: `tox -e py36-django20`. Installation and setup ---------------------- How do I install django-registration? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Full instructions are available in :ref:`the installation guide `. For configuration, see :ref:`the quick start guide `. Does django-registration come with any sample templates I can use right away? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ No, for two reasons: 1. Providing default templates with an application is ranges from hard to impossible, because different sites can have such wildly different design and template structure. Any attempt to provide templates which would work with all the possibilities would probably end up working with none of them. 2. A number of things in django-registration depend on the specific registration workflow you use, including the variables which end up in template contexts. Since django-registration has no way of knowing in advance what workflow you're going to be using, it also has no way of knowing what your templates will need to look like. Fortunately, however, django-registration has good documentation which explains what context variables will be available to templates, and so it should be easy for anyone who knows Django's template system to create templates which integrate with their own site. Configuration ------------- Do I need to rewrite the views to change the way they behave? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Not always. Any behavior controlled by an attribute on a class-based view can be changed by passing a different value for that attribute in the URLconf. See `Django's class-based view documentation `_ for examples of this. For more complex or fine-grained control, you will likely want to subclass :class:`~django_registration.views.RegistrationView` or :class:`~django_registration.views.ActivationView`, or both, add your custom logic to your subclasses, and then create a URLconf which makes use of your subclasses. I don't want to write my own URLconf because I don't want to write patterns for all the auth views! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You're in luck, then; Django provides a URLconf for this, at `django.contrib.auth.urls`. I don't like the names you've given to the URL patterns! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In that case, you should feel free to set up your own URLconf which uses the names you want. I'm using a custom user model; how do I make that work? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ See :ref:`the custom user documentation `. Tips and tricks --------------- How do I close user signups? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you haven't modified the behavior of the :meth:`~django_registration.views.RegistrationView.registration_allowed` method in :class:`~django_registration.views.RegistrationView`, you can use the setting :data:`~django.conf.settings.REGISTRATION_OPEN` to control this; when the setting is `True`, or isn't supplied, user registration will be permitted. When the setting is `False`, user registration will not be permitted. How do I log a user in immediately after registration or activation? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Take a look at the implementation of :ref:`the one-step workflow `, which logs a user in immediately after registration. How do I manually activate a user? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In :ref:`the two-step activation workflow `, toggle the `is_active` field of the user in the admin. How do I delete expired unactivated accounts? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Perform a query for those accounts, and call the `delete()` method of the resulting `QuerySet`. Since django-registration doesn't know in advance what your definition of "expired" will be, it leaves this step to you. How do I allow Unicode in usernames? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Use Python 3. Django's username validation allows any word character plus some additional characters, but the definition of "word character" depends on the Python version in use. On Python 2, only ASCII will be permitted; on Python 3, usernames containing word characters matched by a regex with the :data:`re.UNICODE` flag will be accepted. How do I tell why an account's activation failed? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you're using :ref:`the two-step activation workflow `, the template context will contain a variable `activation_error` containing the information passed when the :exc:`~django_registration.exceptions.ActivationError` was raised. This will indicate what caused the failure.././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1580076236.0 django-registration-3.3/docs/forms.rst0000644000076700000240000001064400000000000017133 0ustar00jamesstaff.. _forms: .. module:: django_registration.forms Base form classes ================= Several form classes are provided with django-registration, covering common cases for gathering account information and implementing common constraints for user registration. These forms were designed with django-registration's built-in registration workflows in mind, but may also be useful in other situations. .. class:: RegistrationForm A form for registering an account. This is a subclass of Django's built-in :class:`~django.contrib.auth.forms.UserCreationForm`, and has the following fields, all of which are required: `username` The username to use for the new account. `email` The email address to use for the new account. `password1` The password to use for the new account. `password2` The password to use for the new account, repeated to catch typos. .. note:: **Validation of usernames** Django supplies a default regex-based validator for usernames in its base :class:`~django.contrib.auth.models.AbstractBaseUser` implementation, allowing any word character along with the following set of additional characters: `.`, `@`, `+`, and `-`. Because it's a subclass of Django's :class:`~django.contrib.auth.forms.UserCreationForm`, :class:`RegistrationForm` will inherit the base validation defined by Django. It also applies some custom validators to the username: :class:`~django_registration.validators.ReservedNameValidator`, and :func:`~django_registration.validators.validate_confusables`. .. note:: **Validation of email addresses** django-registration applies two additional validators -- :class:`~django_registration.validators.HTML5EmailValidator` and :func:`~django_registration.validators.validate_confusables_email` -- to the email address. The HTML5 validator uses `the HTML5 email-validation rule `_ (as implemented on HTML's `input type="email"`), which is more restrictive than the email RFCs. The purpose of this validator is twofold: to match the behavior of HTML5, and to simplify django-registration's other validators. The full RFC grammar for email addresses is enormously complex despite most of its features rarely if ever being used legitimately, so disallowing those features allows other validators to interact with a much simpler format, ensuring performance, reliability and safety. .. note:: **Custom user models** If you are using `a custom user model `_, you **must** subclass this form and tell it to use your custom user model instead of Django's default user model. If you do not, django-registration will deliberately crash with an error message reminding you to do this. See :ref:`the custom user compatibility guide ` for details. .. class:: RegistrationFormCaseInsensitive A subclass of :class:`RegistrationForm` which enforces case-insensitive uniqueness of usernames, by applying :class:`~django_registration.validators.CaseInsensitiveUnique` to the username field. .. note:: **Unicode case handling** This form will normalize the username value to form NFKC, matching Django's default approach to Unicode normalization. it will then case fold the value, and use a case-insensitive (`iexact`) lookup to determine if a user with the same username already exists; the results of this query may depend on the quality of your database's Unicode implementation, and on configuration details. The results may also be surprising to developers who are primarily used to English/ASCII text, as Unicode's case rules can be quite complex. .. class:: RegistrationFormTermsOfService A subclass of :class:`RegistrationForm` which adds one additional, required field: `tos` A checkbox indicating agreement to the site's terms of service/user agreement. .. class:: RegistrationFormUniqueEmail A subclass of :class:`RegistrationForm` which enforces uniqueness of email addresses in addition to uniqueness of usernames, by applying :class:`~django_registration.validators.CaseInsensitiveUnique` to the email field. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1600763542.0 django-registration-3.3/docs/index.rst0000644000076700000240000000324300000000000017111 0ustar00jamesstaff.. _index: django-registration |release| ============================= django-registration is an extensible application providing user registration functionality for `Django `_-powered Web sites. Although nearly all aspects of the registration process are customizable, out-of-the-box support is provided for two common use cases: * Two-phase registration, consisting of initial signup followed by a confirmation email with instructions for activating the new account. * One-phase registration, where a user signs up and is immediately active and logged in. To get up and running quickly, :ref:`install django-registration `, then read :ref:`the quick start guide `, which describes the steps necessary to configure django-registration for the built-in workflows. For more detailed information, including how to customize the registration process (and support for alternate registration systems), read through the documentation listed below. .. toctree:: :caption: Installation and configuration :maxdepth: 1 install quickstart .. toctree:: :caption: Built-in registration workflows :maxdepth: 1 activation-workflow one-step-workflow .. toctree:: :caption: For developers :maxdepth: 1 views forms custom-user validators exceptions settings signals deprecations .. toctree:: :caption: Other documentation :maxdepth: 1 security upgrade faq .. seealso:: * `Django's authentication documentation `_. Django's authentication system is used by django-registration's default configuration. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653721545.0 django-registration-3.3/docs/install.rst0000644000076700000240000000345100000000000017451 0ustar00jamesstaff.. _install: Installation guide ================== The |release| release of django-registration supports Django 3.2 and 4.0 on Python 3.7 (Django 3.2 only), 3.8, 3.9, and 3.10. Note that Django 3.2's support for Python 3.10 was added in Django 3.2.9, so you may experience issues with Python 3.10 and earlier Django 3.2 versions. Normal installation ------------------- The preferred method of installing django-registration is via `pip`, the standard Python package-installation tool. If you don't have `pip`, instructions are available for `how to obtain and install it `_, though if you're using a supported version of Python, `pip` should have come bundled with your installation of Python. Once you have `pip`, type:: pip install django-registration If you don't have a copy of a compatible version of Django, this will also automatically install one for you, and will install a third-party library required by some of django-registration's validation code. Installing from a source checkout --------------------------------- If you want to work on django-registration, you can obtain a source checkout. The development repository for django-registration is at . If you have `git `_ installed, you can obtain a copy of the repository by typing:: git clone https://github.com/ubernostrum/django-registration.git From there, you can use git commands to check out the specific revision you want, and perform an "editable" install (allowing you to change code as you work on it) by typing:: pip install -e . Next steps ---------- To get up and running quickly, check out :ref:`the quick start guide `. For full documentation, see :ref:`the documentation index `.././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1516537948.0 django-registration-3.3/docs/make.bat0000644000076700000240000000565100000000000016662 0ustar00jamesstaff@ECHO OFF REM Command file for Sphinx documentation set SPHINXBUILD=sphinx-build set ALLSPHINXOPTS=-d _build/doctrees %SPHINXOPTS% . if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. changes to make an overview over all changed/added/deprecated items echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (_build\*) do rmdir /q /s %%i del /q /s _build\* goto end ) if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% _build/html echo. echo.Build finished. The HTML pages are in _build/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% _build/dirhtml echo. echo.Build finished. The HTML pages are in _build/dirhtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% _build/pickle echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% _build/json echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% _build/htmlhelp echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in _build/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% _build/qthelp echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in _build/qthelp, like this: echo.^> qcollectiongenerator _build\qthelp\django-registration.qhcp echo.To view the help file: echo.^> assistant -collectionFile _build\qthelp\django-registration.ghc goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% _build/latex echo. echo.Build finished; the LaTeX files are in _build/latex. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% _build/changes echo. echo.The overview file is in _build/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% _build/linkcheck echo. echo.Link check complete; look for any errors in the above output ^ or in _build/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% _build/doctest echo. echo.Testing of doctests in the sources finished, look at the ^ results in _build/doctest/output.txt. goto end ) :end ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1600671777.0 django-registration-3.3/docs/one-step-workflow.rst0000644000076700000240000000565300000000000021413 0ustar00jamesstaff.. _one-step-workflow: .. module:: django_registration.backends.one_step The one-step workflow ===================== As an alternative to :ref:`the two-step (registration and activation) workflow `, django-registration bundles a one-step registration workflow in `django_registration.backends.one_step`. This workflow consists of as few steps as possible: 1. A user signs up by filling out a registration form. 2. The user's account is created and is active immediately, with no intermediate confirmation or activation step. 3. The new user is logged in immediately. Configuration ------------- To use this workflow, include the URLconf `django_registration.backends.one_step.urls` somewhere in your site's own URL configuration. For example: .. code-block:: python from django.urls import include, path urlpatterns = [ # Other URL patterns ... path('accounts/', include('django_registration.backends.one_step.urls')), path('accounts/', include('django.contrib.auth.urls')), # More URL patterns ... ] To control whether registration of new accounts is allowed, you can specify the setting :data:`~django.conf.settings.REGISTRATION_OPEN`. Upon successful registration, the user will be redirected to the site's home page -- the URL `/`. This can be changed by subclassing :class:`django_registration.backends.one_step.views.RegistrationView` and overriding the method :meth:`~django_registration.views.RegistrationView.get_success_url` or setting the attribute :attr:`~django_registration.views.RegistrationView.success_url`. You can also do this in a URLconf. For example: .. code-block:: python from django.conf.urls import include, url from django_registration.backends.one_step.views import RegistrationView urlpatterns = [ # Other URL patterns ... path('accounts/register/', RegistrationView.as_view(success_url='/profile/'), name='django_registration_register'), path('accounts/', include('django_registration.backends.one_step.urls')), path('accounts/', include('django.contrib.auth.urls')), # More URL patterns ... ] The default form class used for account registration will be :class:`django_registration.forms.RegistrationForm`, although this can be overridden by supplying a custom URL pattern for the registration view and passing the keyword argument `form_class`, or by subclassing :class:`django_registration.backends.one_step.views.RegistrationView` and either overriding :attr:`~django_registration.views.RegistrationView.form_class` or implementing :meth:`~django_registration.views.RegistrationView.get_form_class()`, and specifying the custom subclass in your URL patterns. Templates --------- The one-step workflow uses two templates: * `django_registration/registration_form.html`. * `django_registration/registration_closed.html` See :ref:`the quick start guide ` for details of these templates. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1624231636.0 django-registration-3.3/docs/quickstart.rst0000644000076700000240000002765300000000000020207 0ustar00jamesstaff.. _quickstart: Quick start guide ================= First you'll need to have Django and django-registration installed; for details on that, see :ref:`the installation guide `. The next steps will depend on which registration workflow you'd like to use. There are two workflows built into django-registration: * :ref:`The two-step activation workflow `, which implements a two-step process: a user signs up, then is emailed an activation link and must click it to activate the account. * :ref:`The one-step workflow `, in which a user signs up and their account is immediately active and logged in. If you want a signup process other than what's provided by these built-in workflows, please see the documentation for the base :ref:`view ` and :ref:`form ` classes, which you can subclass to implement your own preferred user registration flow and rules. The guide below covers use of the built-in workflows. Regardless of which registration workflow you choose to use, you should add `"django_registration"` to your :data:`~django.conf.settings.INSTALLED_APPS` setting. .. important:: **Django's authentication system must be installed** Before proceeding with either of the recommended built-in workflows, you'll need to ensure `django.contrib.auth` has been installed (by adding it to :data:`~django.conf.settings.INSTALLED_APPS` and running `manage.py migrate` to install needed database tables). Also, if you're making use of `a custom user model `_, you'll probably want to pause and read :ref:`the custom user compatibility guide ` before using django-registration. .. note:: **Additional steps for account security** While django-registration does what it can to secure the user signup process, its scope is deliberately limited; please read :ref:`the security documentation ` for recommendations on steps to secure user accounts beyond what django-registration alone can do. Configuring the two-step activation workflow -------------------------------------------- The configuration process for using the two-step activation workflow is straightforward: you'll need to specify a couple of settings, connect some URLs and create a few templates. Required settings ~~~~~~~~~~~~~~~~~ Begin by adding the following setting to your Django settings file: :data:`~django.conf.settings.ACCOUNT_ACTIVATION_DAYS` This is the number of days users will have to activate their accounts after registering. If a user does not activate within that period, the account will remain permanently inactive unless a site administrator manually activates it. For example, you might have something like the following in your Django settings:: ACCOUNT_ACTIVATION_DAYS = 7 # One-week activation window Setting up URLs ~~~~~~~~~~~~~~~ Each bundled registration workflow in django-registration includes a Django URLconf which sets up URL patterns for :ref:`the views in django-registration `. The URLconf for the two-step activation workflow can be found at `django_registration.backends.activation.urls`. For example, to place the registration URLs under the prefix `/accounts/`, you could add the following to your project's root URLconf: .. code-block:: python from django.urls import include, path urlpatterns = [ # Other URL patterns ... path('accounts/', include('django_registration.backends.activation.urls')), path('accounts/', include('django.contrib.auth.urls')), # More URL patterns ... ] Users would then be able to register by visiting the URL `/accounts/register/`, log in (once activated) at `/accounts/login/`, etc. The sample URL configuration above also sets up the built-in auth views included in Django (login, logout, password reset, etc.) via the `django.contrib.auth.urls` URLconf. The following URL names are defined by `django_registration.backends.activation.urls`: * `django_registration_register` is the account-registration view. * `django_registration_complete` is the post-registration success message. * `django_registration_activate` is the account-activation view. * `django_registration_activation_complete` is the post-activation success message. * `django_registration_disallowed` is a message indicating registration is not currently permitted. .. _default-templates: Required templates ~~~~~~~~~~~~~~~~~~ You will also need to create several templates required by django-registration, and possibly additional templates required by views in `django.contrib.auth`. The templates required by django-registration are as follows; note that, with the exception of the templates used for account activation emails, all of these are rendered using a :class:`~django.template.RequestContext` and so will also receive any additional variables provided by `context processors `_. .. _default-form-template: `django_registration/registration_form.html` ```````````````````````````````````````````` Used to show the form users will fill out to register. By default, has the following context: `form` The registration form. This will likely be a subclass of :class:`~django_registration.forms.RegistrationForm`; consult `Django's forms documentation `_ for information on how to display this in a template. `django_registration/registration_complete.html` ```````````````````````````````````````````````` Used after successful completion of the registration form. This template has no context variables of its own, and should inform the user that an email containing account-activation information has been sent. `django_registration/registration_closed.html` `````````````````````````````````````````````````` Used when registration of new user accounts is disabled. This template has no context variables of its own. `django_registration/activation_failed.html` ```````````````````````````````````````````` Used if account activation fails. Has the following context: `activation_error` A :class:`dict` containing the information supplied to the :exc:`~django_registration.exceptions.ActivationError` which occurred during activation. See the documentation for that exception for a description of the keys, and the documentation for :class:`~django_registration.backends.activation.views.ActivationView` for the specific values used in different failure situations. `django_registration/activation_complete.html` `````````````````````````````````````````````` Used after successful account activation. This template has no context variables of its own, and should inform the user that their account is now active. `django_registration/activation_email_subject.txt` `````````````````````````````````````````````````` Used to generate the subject line of the activation email. Because the subject line of an email must be a single line of text, any output from this template will be forcibly condensed to a single line before being used. This template has the following context: `activation_key` The activation key for the new account, as a string. `expiration_days` The number of days remaining during which the account may be activated, as an integer. `request` The :class:`~django.http.HttpRequest` object representing the request in which the user registered. `scheme` The protocol scheme used during registration, as a string; will be either `'http'` or `'https'`. `site` An object representing the site on which the user registered; depending on whether `django.contrib.sites` is installed, this may be an instance of either :class:`django.contrib.sites.models.Site` (if the sites application is installed) or :class:`django.contrib.sites.requests.RequestSite` (if not). Consult `the documentation for the Django sites framework `_ for details regarding these objects' interfaces. `user` The newly-created user object. `django_registration/activation_email_body.txt` ``````````````````````````````````````````````` Used to generate the body of the activation email. Should display a link the user can click to activate the account. This template has the following context: `activation_key` The activation key for the new account, as a string. `expiration_days` The number of days remaining during which the account may be activated, as an integer. `request` The :class:`~django.http.HttpRequest` object representing the request in which the user registered. `scheme` The protocol scheme used during registration, as a string; will be either `'http'` or `'https'`. `site` An object representing the site on which the user registered; depending on whether `django.contrib.sites` is installed, this may be an instance of either :class:`django.contrib.sites.models.Site` (if the sites application is installed) or :class:`django.contrib.sites.requests.RequestSite` (if not). Consult `the documentation for the Django sites framework `_ for details regarding these objects. `user` The newly-created user object. Note that the templates used to generate the account activation email use the extension `.txt`, not `.html`. Due to widespread antipathy toward and interoperability problems with HTML email, django-registration produces plain-text email, and so these templates should output plain text rather than HTML. To make use of the views from `django.contrib.auth` (which are set up for you by the example URL configuration above), you will also need to create the templates required by those views. Consult `the documentation for Django's authentication system `_ for details regarding these templates. Configuring the one-step workflow -------------------------------------------- Also included is a :ref:`one-step registration workflow `, where a user signs up and their account is immediately active and logged in. You will need to configure URLs to use the one-step workflow; the easiest way is to :func:`~django.urls.include` the URLconf `django_registration.backends.one_step.urls` somewhere in your URL configuration. For example, to place the URLs under the prefix `/accounts/` in your URL structure: .. code-block:: python from django.urls import include, path urlpatterns = [ # Other URL patterns ... path('accounts/', include('django_registration.backends.one_step.urls')), path('accounts/', include('django.contrib.auth.urls')), # More URL patterns ... ] Users could then register accounts by visiting the URL `/accounts/register/`. The following URL names are defined by `django_registration.backends.one_step.urls`: * `django_registration_register` is the account-registration view. * `django_registration_complete` is the post-registration success message. * `django_registration_disallowed` is a message indicating registration is not currently permitted. This URLconf will also configure the appropriate URLs for the rest of the built-in `django.contrib.auth` views (log in, log out, password reset, etc.). Finally, you will need to create following templates: * `django_registration/registration_form.html` * `django_registration/registration_complete.html` * `django_registration/registration_closed.html` See :ref:`the documentation above ` for details of these templates. To make use of the views from `django.contrib.auth` (which are set up for you by the example URL configuration above), you will also need to create the templates required by those views. Consult `the documentation for Django's authentication system `_ for details regarding these templates. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1580076461.0 django-registration-3.3/docs/security.rst0000644000076700000240000001606700000000000017661 0ustar00jamesstaff.. _security: Security guide ============== .. important:: **Reporting security issues** If you believe you have found a security issue in django-registration, please do *not* use the public GitHub issue tracker to report it. Instead, you can `contact the author privately `_ to report the issue. Anything related to users or user accounts has security implications and represents a large source of potential security issues. This document is not an exhaustive guide to those implications and issues, and makes no guarantees that your particular use of Django or django-registration will be safe; instead, it provides a set of recommendations, and explanations for why django-registration does certain things or recommends particular approaches. Using this software responsibly is, ultimately, up to you. Before continuing with this document, you should ensure that you've read and understood `Django's security documentation `_. Django provides a good overview of common security issues in the general field of web development, and an explanation of how it helps to protect against them or provides tools to help you do so. You should also ensure you're following Django's security recommendations. You can check for many common issues by running:: python manage.py check --tag security on your codebase. Recommendation: use the two-step activation workflow ---------------------------------------------------- Two user-signup workflows are included in django-registration, along with support for writing your own. If you choose to use one of the included workflows, :ref:`the two-step activation workflow ` is the recommended default. The activation workflow provides a verification step -- the user must click a link sent to the email address they used to register -- which can serve as an impediment to automated account creation for malicious purposes. The activation workflow generates an activation key which consists of the new account's username and the timestamp of the signup, verified using `Django's cryptographic signing tools `_ which in turn use `the HMAC implementation from the Python standard library `_. Thus, django-registration is not inventing or building any new cryptography, but only using existing/vetted implementations in an approved and standard manner. Additionally, the activation workflow takes steps to ensure that its use of HMAC does not act as an `oracle `_. Several parts of Django use the signing tools, and third-party applications are free to use them as well, so django-registration makes use of the ability to supply a salt value for the purpose of "namespacing" HMAC usage. Thus an activation token generated by django-registration's activation workflow should not be usable for attacks against other HMAC-carrying values generated by the same installation of Django. Restrictions on user names: reserved names ------------------------------------------ By default, django-registration applies a list of reserved names, and does not permit users to create accounts using those names (see :class:`~django_registration.validators.ReservedNameValidator`). The default list of reserved names includes many names that could cause confusion or even inappropriate access. These reserved names fall into several categories: * Usernames which could allow a user to impersonate or be seen as a site administrator. For example, `'admin'` or `'administrator'`. * Usernames corresponding to standard/protocol-specific email addresses (relevant for sites where creating an account also creates an email address with that username). For example, `'webmaster'`. * Usernames corresponding to standard/sensitive subdomain names (relevant for sites where creating an account also creates a subdomain corresponding to the username). For example, `'ftp'` or `'autodiscover'`. * Usernames which correspond to sensitive URLs (relevant for sites where user profiles appear at a URL containing the username). For example, `'contact'` or `'buy'`. It is strongly recommended that you leave the reserved-name validation enabled. Restrictions on user names and email addresses: Unicode ------------------------------------------------------- By default, django-registration permits the use of a wide range of Unicode in usernames and email addresses. However, to prevent some types of Unicode-related attacks, django-registration will not permit certain specific uses of Unicode characters. For example, while the username `'admin'` cannot normally be registered (see above), a user might still attempt to register a name that appears visually identical, by substituting a Cyrillic 'a' or other similar-appearing character for the first character. This is a `homograph attack `_. To prevent homograph attacks, django-registration applies the following rule to usernames, and to the local-part and the domain of email addresses: * If the submitted value is mixed-script (contains characters from multiple different scripts, as in the above example which would mix Cyrillic and Latin characters), and * If the submitted value contains characters appearing in the Unicode Visually Confusable Characters file, * Then the value will be rejected. See :func:`~django_registration.validators.validate_confusables` and :func:`~django_registration.validators.validate_confusables_email`. This should not interfere with legitimate use of Unicode, or of non-English/non-Latin characters in usernames and email addresses. To avoid a common false-positive situation, the local-part and domain of an email address are checked independently of each other. It is strongly recommended that you leave this validation enabled. Additional steps to secure user accounts ---------------------------------------- The scope of django-registration is solely the implementation of user-signup workflows, which limits the ways in which django-registration alone can protect your users. Other features of Django itself, or of other third-party applications, can provide significant increases in protection. In particular, it is recommended that you: * Prevent the use of common passwords. You can catch some common passwords by enabling Django's :class:`~django.contrib.auth.password_validation.CommonPasswordValidator`, which uses a list of twenty thousand common passwords. A more comprehensive option is the password validator and other utilities from `pwned-passwords-django `_, which checks against a database containing (as of mid-2018) over half a billion passwords found in data breaches. * Use two-factor authentication via authenticator applications or hardware security keys (*not* SMS). The package `django-two-factor `_ provides integration for two-factor authentication into Django's auth framework. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535974254.0 django-registration-3.3/docs/settings.rst0000644000076700000240000000345200000000000017644 0ustar00jamesstaff.. _settings: .. module:: django.conf.settings Custom settings =============== Although the choice of registration workflow does not necessarily require changes to your Django settings (as registration workflows are selected by including the appropriate URL patterns in your root URLconf), the built-in workflows of django-registration make use of several custom settings. .. data:: ACCOUNT_ACTIVATION_DAYS An :class:`int` indicating how long (in days) after signup an account has in which to activate. Used by: * :ref:`The two-step activation workflow ` .. data:: REGISTRATION_OPEN A :class:`bool` indicating whether registration of new accounts is currently permitted. A default of `True` is assumed when this setting is not supplied, so specifying it is optional unless you want to temporarily close registration (in which case, set it to `False`). Used by: * :ref:`The two-step activation workflow ` * :ref:`The one-step workflow ` Third-party workflows wishing to use an alternate method of determining whether registration is allowed should subclass :class:`django_registration.views.RegistrationView` (or a subclass of it from an existing workflow) and override :meth:`~django_registration.views.RegistrationView.registration_allowed`. .. data:: REGISTRATION_SALT A :class:`str` used as an additional "salt" in the process of generating signed activation keys. This setting is optional, and a default of `"registration"` will be used if not specified. The value of this setting does not need to be kept secret; see :ref:`the note about this salt value and security ` for details. Used by: * :ref:`The two-step activation workflow ` ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535974282.0 django-registration-3.3/docs/signals.rst0000644000076700000240000000516400000000000017446 0ustar00jamesstaff.. _signals: .. module:: django_registration.signals Signals used by django-registration =================================== Much of django-registration's customizability comes through the ability to write and use different workflows for user registration. However, there are many cases where only a small bit of additional logic needs to be injected into the registration process, and writing a custom workflow to support this represents an unnecessary amount of work. A more lightweight customization option is provided through two custom signals which the built-in registration workflows send, and custom workflows are encouraged to send, at specific points during the registration process; functions listening for these signals can then add whatever logic is needed. For general documentation on signals and the Django dispatcher, consult `Django's signals documentation `_. This documentation assumes that you are familiar with how signals work and the process of writing and connecting functions which will listen for signals. .. data:: user_activated Sent when a user account is activated (not applicable to all workflows). Provides the following arguments: `sender` The :class:`~django_registration.views.ActivationView` subclass used to activate the user. `user` A user-model instance representing the activated account. `request` The :class:`~django.http.HttpRequest` in which the account was activated. This signal is automatically sent for you by the base :class:`~django_registration.views.ActivationView`, so unless you've overridden its :meth:`~django.views.generic.base.TemplateView.get` method in a subclass you should not need to explicitly send it. .. data:: user_registered Sent when a new user account is registered. Provides the following arguments: `sender` The :class:`~django_registration.views.RegistrationView` subclass used to register the account. `user` A user-model instance representing the new account. `request` The :class:`~django.http.HttpRequest` in which the new account was registered. This signal is **not** automatically sent for you by the base :class:`~django_registration.views.RegistrationView`. It is sent by the subclasses implemented for the three included registration workflows, but if you write your own subclass of :class:`~django_registration.views.RegistrationView`, you'll need to send this signal as part of the implementation of the :meth:`~django_registration.views.RegistrationView.register` method.././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653722691.0 django-registration-3.3/docs/spelling_wordlist.txt0000644000076700000240000000115600000000000021556 0ustar00jamesstaffа a admin apps auth authenticator autoconfig backend backends Backend Backends blog boolean bugfixes checkbox cleanupregistration codebase confusable cryptographic customizability customizable dev django Facebook favicon filenames hostnames https ico interoperability login logout lookup metaclass Morgenstern namespace namespacing noreply online parsers paypal pаypаl pre regex registrationview runtime serializable signup signups spambots subclassed subclasses subclassing subdomain subdomains timestamp timestamped tuple txt unactivated username usernames Usernames validator validators versa workflow workflows www ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653722284.0 django-registration-3.3/docs/upgrade.rst0000644000076700000240000003304100000000000017430 0ustar00jamesstaff.. _upgrade: Upgrading from previous versions ================================ The current release series of django-registration is the 3.x series, which is not backwards-compatible with the django-registration 2.x release series. Changes within the 3.x series ----------------------------- Within the 3.x release series, there have been several minor changes and improvements, documented here along with the version in which they occurred. django-registration 3.3 ~~~~~~~~~~~~~~~~~~~~~~~ This release contains no new features or bugfixes. The supported Python and Django versions are changed to: * Django 3.2 and 4.0, on Python 3.7 (Django 3.2 only), 3.8, 3.9, and 3.10. django-registration 3.2 ~~~~~~~~~~~~~~~~~~~~~~~ This release contains no new features or bugfixes. The supported Python and Django versions are changed to: * Django 2.2, 3.1, and 3.2, on Python 3.6, 3.7, 3.8, and 3.9. Python 3.5 reached the end of its upstream support cycle in September 2020, and is no longer supported. Django 3.0 reached the end of its upstream support cycle in May 2021, and is no longer supported. django-registration 3.1.2 ~~~~~~~~~~~~~~~~~~~~~~~~~ This release fixes a security issue with low severity. Prior to 3.1.2, django-registration did not apply Django's :func:`~django.views.decorators.debug.sensitive_post_parameters` decorator to the base :class:`~django_registration.views.RegistrationView`. This meant that if detailed error reports, such as `Django's error reports emailed to site staff `_, were enabled, and a server-side error occurred during account registration, the generated error report would include all fields submitted in the HTTP request, some of which are potentially sensitive depending on the user-account model and registration workflow in use. This issue is CVE-2021-21416 and GitHub security advisory GHSA-58c7-px5v-82hh. Thanks to Martin Morgenstern for reporting this issue. Django-registration 3.1 ~~~~~~~~~~~~~~~~~~~~~~~ * When an attempt was made to use django-registration with a custom user model, but *without* explicitly subclassing :class:`~django_registration.forms.RegistrationForm` to point to that user model, previously the result would be a cryptic exception and error message raised from within Django, complaining about trying to work with the swapped-out user model. :class:`~django_registration.views.RegistrationView` now explicitly raises :exc:`~django.core.exceptions.ImproperlyConfigured` with an informative error message to make it clear what has happened, and directs the developer to the documentation for using custom user models in django-registration. * A new validator, :class:`~django_registration.validators.HTML5EmailValidator`, is included and is applied by default to the email field of :class:`~django_registration.forms.RegistrationForm`. The HTML5 email address grammar is more restrictive than the RFC grammar, but primarily in disallowing rare and problematic features. * Support for Python 2 was dropped, as Python 2 is EOL as of 2020-01-01. As a result, support for Django 1.11 (EOL April 2020) was also dropped; the minimum supported Django version is now 2.2. django-registration 3.0.1 ~~~~~~~~~~~~~~~~~~~~~~~~~ * The :ref:`custom validators ` are now serializable. * Although no code changes were required, this release officially marks itself compatible with Python 3.7 and with django 2.2. Changes between django-registration 2.x and 3.x ----------------------------------------------- Module renaming ~~~~~~~~~~~~~~~ Prior to 3.x, django-registration installed a Python module named `registration`. To avoid silent incompatibilities, and to conform to more recent best practices, django-registration 3.x now installs a module named `django_registration`. Attempts to import from the `registration` module will immediately fail with :exc:`ImportError`. Many installations will be able to adapt by replacing references to `registration` with references to `django_registration`. Removal of model-based workflow ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The two-step model-based signup workflow, which has been present since the first public release of django-registration in 2007, has now been removed. In its place, it is recommended that you use :ref:`the two-step activation workflow ` instead, as that workflow requires no server-side storage of additional data beyond the user account itself. Renaming of two-step activation workflow ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :ref:`The two-step activation workflow ` was previously found at `registration.backends.hmac`; it has been renamed and is now found at `registration.backends.activation`. Renaming of one-step workflow ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :ref:`The one-step workflow ` was previously found at `registration.backends.simple`; it has been renamed and is now found at `registration.backends.one_step`. Removal of auth URLs ~~~~~~~~~~~~~~~~~~~~ Prior to 3.x, django-registration's default URLconf modules for its built-in workflows would attempt to include the Django auth views (login, logout, password reset, etc.) for you. This became untenable with the rewrite of Django's auth views to be class-based, as it required detecting the set of auth views and choosing a set of URL patterns at runtime. As a result, auth views are no longer automatically configured for you; if you want them, :func:`~django.urls.include` the URLconf `django.contrib.auth.urls` at a location of your choosing. Distinguishing activation failure conditions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Prior to 3.x, failures to activate a user account (in workflows which use activation) all simply returned `None` in place of the activated account. This meant it was not possible to determine, from inspecting the result, what exactly caused the failure. In django-registration 3.x, activation failures raise an exception -- :exc:`~django_registration.exceptions.ActivationError` -- with a message and code (such as `"expired"`), to indicate the cause of failure. This exception is caught by :class:`~django_registration.views.ActivationView` and turned into the template context variable `activation_error`. Changes to custom user support ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Support for custom user models has been brought more in line with the features Django offers. This affects compatibility of custom user models with django-registration's default forms and views. In particular, custom user models should now provide, in addition to :attr:`~django.contrib.auth.CustomUser.USERNAME_FIELD`, the :meth:`~django.contrib.auth.models.AbstractBaseUser.get_username` and :meth:`~django.contrib.auth.models.AbstractBaseUser.get_email_field_name` methods. See :ref:`the custom user documentation ` for details. Changes to `success_url` ~~~~~~~~~~~~~~~~~~~~~~~~~~ Both the registration and activation views mimic Django's own generic views in supporting a choice of ways to specify where to redirect after a successful registration or activation; you can either set the attribute :attr:`~django_registration.views.RegistrationView.success_url` on the view class, or implement the method :meth:`~django_registration.views.RegistrationView.get_success_url` . However, there is a key difference between the base Django generic-view version of this, and the version in django-registration: when calling a :meth:`~django_registration.views.RegistrationView.get_success_url` method, django-registration passes the user account as an argument. This is incompatible with the behavior of Django's base :class:`~django.views.generic.edit.FormMixin`, which expects :meth:`~django.views.generic.edit.FormMixin.get_success_url` to take zero arguments. Also, earlier versions of django-registration allowed :attr:`~django_registration.views.RegistrationView.success_url` and :meth:`~django_registration.views.RegistrationView.get_success_url` to provide either a string URL, or a tuple of `(viewname, args, kwargs)` to pass to Django's :func:`~django.urls.reverse` helper, in order to work around issues caused by calling :func:`~django.urls.reverse` at the level of a class attribute. In django-registration 3.x, the `user` argument to :meth:`~django_registration.views.RegistrationView.get_success_url` is now optional, meaning :class:`~django.views.generic.edit.FormMixin`'s default behavior is now compatible with any :meth:`~django_registration.views.RegistrationView.get_success_url` implementation that doesn't require the user object; as a result, implementations which don't rely on the user object should either switch to specifying :attr:`~django_registration.views.RegistrationView.success_url` as an attribute, or change their own signature to `get_success_url(self, user=None)`. Also, the ability to supply the 3-tuple of arguments for :func:`~django.urls.reverse` has been removed; both :attr:`~django_registration.views.RegistrationView.success_url` and :meth:`~django_registration.views.RegistrationView.get_success_url` now *must* be/return either a string, or a lazy object that resolves to a string. To avoid class-level calls to :func:`~django.urls.reverse`, use `django.urls.reverse_lazy()` instead. Removed "no free email" form ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Earlier versions of django-registration included a form class, `RegistrationFormNoFreeEmail`, which attempted to forbid user signups using common free/throwaway email providers. Since this is a pointless task (the number of possible domains of such providers is ever-growing), this form class has been removed. Template names ~~~~~~~~~~~~~~ Since django-registration's Python module has been renamed from `registration` to `django_registration`, its default template folder has also been renamed, from `registration` to `django_registration`. Additionally, the following templates have undergone name changes: * The default template name for the body of the activation email in the two-step activation workflow is now `django_registration/activation_email_body.txt` (previously, it was `registration/activation_email.txt`) * The default template name for :class:`~django_registration.views.ActivationView` and its subclasses is now `django_registration/activation_failed.html` (previously, it was `registration/activate.html`). Renaming of URL patterns ~~~~~~~~~~~~~~~~~~~~~~~~ Prior to 3.x, django-registration's included URLconf modules provided URL pattern names beginning with `"registration"`. For example: `"registration_register"`. In 3.x, these are all renamed to begin with `"django_registration"`. For example: `"django_registration_register"`. Removal of `cleanupregistration` management command ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The "cleanupregistration" management command, and the RegistrationProfile.objects.delete_expired_users() and RegistrationProfile.objects.expired() methods, were removed in django-registration 3.0. Deployments which need a way to identify and delete expired accounts should determine how they wish to do so and implement their own methods for this. Other changes ~~~~~~~~~~~~~ The URLconf `registration.urls` has been removed; it was an alias for the URLconf of the model-based workflow, which has also been removed. The compatibility alias `registration.backends.default`, which also pointed to the model-based workflow, has been removed. Changes during the 2.x release series ------------------------------------- One major change occurred between django-registration 2.0 and 2.1: the addition in version 2.1 of the :class:`~django_registration.validators.ReservedNameValidator`, which is now used by default on :class:`~django_registration.forms.RegistrationForm` and its subclasses. This is technically backwards-incompatible, since a set of usernames which previously could be registered now cannot be registered, but was included because the security benefits outweigh the edge cases of the now-disallowed usernames. If you need to allow users to register with usernames forbidden by this validator, see its documentation for notes on how to customize or disable it. In 2.2, the behavior of the `RegistrationProfile.expired()` method was clarified to accommodate user expectations; it does *not* return (and thus, `RegistrationProfile.delete_expired_users()` does not delete) profiles of users who had successfully activated. In django-registration 2.3, the new validators :func:`~django_registration.validators.validate_confusables` and :func:`~django_registration.validators.validate_confusables_email` were added, and are applied by default to the username field and email field, respectively, of registration forms. This may cause some usernames which previously were accepted to no longer be accepted, but like the reserved-name validator this change was made because its security benefits significantly outweigh the edge cases in which it might disallow an otherwise-acceptable username or email address. If for some reason you need to allow registration with usernames or email addresses containing potentially dangerous use of Unicode, you can subclass the registration form and remove these validators, though doing so is not recommended. Versions prior to 2.0 --------------------- A 1.0 release of django-registration existed, but the 2.x series was compatible with it. Prior to 1.0, the most widely-adopted version of django-registration was 0.8; the changes from 0.8 to 2.x were large and significant, and if any installations on 0.8 still exist and wish to upgrade to more recent versions, it is likely the most effective route will be to discard all code using 0.8 and start over from scratch with a 3.x release. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1577949953.0 django-registration-3.3/docs/validators.rst0000644000076700000240000002014400000000000020151 0ustar00jamesstaff.. _validators: .. module:: django_registration.validators Validation utilities ==================== To ease the process of validating user registration data, django-registration includes some validation-related data and utilities. Error messages -------------- Several error messages are available as constants. All of them are marked for translation; most have translations already provided in django-registration. .. data:: DUPLICATE_EMAIL Error message raised by :class:`~django_registration.forms.RegistrationFormUniqueEmail` when the supplied email address is not unique. .. data:: DUPLICATE_USERNAME Error message raised by :class:`~django_registration.validators.CaseInsensitiveValidator` when the supplied username is not unique. This is the same string raised by Django's default :class:`~django.contrib.auth.models.User` model for a non-unique username. .. data:: RESERVED_NAME Error message raised by :class:`~django_registration.validators.ReservedNameValidator` when it is given a value that is a reserved name. .. data:: TOS_REQUIRED Error message raised by :class:`~django_registration.forms.RegistrationFormTermsOfService` when the terms-of-service field is not checked. Rejecting "reserved" usernames ------------------------------ By default, django-registration treats some usernames as reserved. .. note:: **Why reserved names are reserved** Many Web applications enable per-user URLs (to display account information), and some may also create email addresses or even subdomains, based on a user's username. While this is often useful, it also represents a risk: a user might register a name which conflicts with an important URL, email address or subdomain, and this might give that user control over it. django-registration includes a list of reserved names, and rejects them as usernames by default, in order to avoid this issue. .. class:: ReservedNameValidator(reserved_names) A callable validator class (see `Django's validators documentation `_) which prohibits the use of a reserved name as the value. By default, this validator is applied to the username field of :class:`django_registration.forms.RegistrationForm` and all of its subclasses. This validator is attached to the list of validators for the username field, so to remove it (not recommended), subclass :class:`~django_registration.forms.RegistrationForm` and override `__init__()` to change the set of validators on the username field. If you want to supply your own custom list of reserved names, you can subclass :class:`~django_registration.forms.RegistrationForm` and set the attribute `reserved_names` to the list of values you want to disallow. The default list of reserved names, if you don't specify one, is :data:`~django_registration.validators.DEFAULT_RESERVED_NAMES`. The validator will also reject any value beginning with the string `".well-known"` (see `RFC 5785 `_). :param list reserved_names: A list of reserved names to forbid. :raises django.core.exceptions.ValidationError: if the provided value is reserved. Several constants are provided which are used by this validator: .. data:: CA_ADDRESSES A list of email usernames commonly used by certificate authorities when verifying identity. .. data:: NOREPLY_ADDRESSES A list of common email usernames used for automated messages from a Web site (such as "noreply" and "mailer-daemon"). .. data:: PROTOCOL_HOSTNAMES A list of protocol-specific hostnames sites commonly want to reserve, such as "www" and "mail". .. data:: OTHER_SENSITIVE_NAMES Other names, not covered by any of the other lists, which have the potential to conflict with common URLs or subdomains, such as "blog" and "docs". .. data:: RFC_2142 A list of common email usernames specified by `RFC 2142 `_. .. data:: SENSITIVE_FILENAMES A list of common filenames with important meanings, such that usernames should not be allowed to conflict with them (such as "favicon.ico" and "robots.txt"). .. data:: SPECIAL_HOSTNAMES A list of hostnames with reserved or special meaning (such as "autoconfig", used by some email clients to automatically discover configuration data for a domain). .. data:: DEFAULT_RESERVED_NAMES A list made of the concatenation of all of the above lists, used as the default set of reserved names for :class:`~django_registration.validators.ReservedNameValidator`. Protecting against homograph attacks ------------------------------------ By default, Django permits a broad range of Unicode to be used in usernames; while this is useful for serving a worldwide audience, it also creates the possibility of `homograph attacks `_ through the use of characters which are easily visually confused for each other (for example: "pаypаl" containing a Cyrillic "а", visually indistinguishable in many fonts from a Latin "а"). To protect against this, django-registration applies some validation rules to usernames and email addresses. .. function:: validate_confusables(value) A custom validator which prohibits the use of dangerously-confusable usernames. This validator will reject any mixed-script value (as defined by Unicode 'Script' property) which also contains one or more characters that appear in the Unicode Visually Confusable Characters file. This validator is enabled by default on the username field of registration forms. :param str value: The username value to validate (non-string usernames will not be checked) :raises django.core.exceptions.ValidationError: if the value is mixed-script confusable .. function:: validate_confusables_email(value) A custom validator which prohibits the use of dangerously-confusable email address. This validator will reject any email address where either the local-part of the domain is -- when considered in isolation -- dangerously confusable. A string is dangerously confusable if it is a mixed-script value (as defined by Unicode 'Script' property) which also contains one or more characters that appear in the Unicode Visually Confusable Characters file. This validator is enabled by default on the email field of registration forms. :param str value: The email address to validate :raises django.core.exceptions.ValidationError: if the value is mixed-script confusable Other validators ---------------- .. class:: CaseInsensitiveUnique(model, field_name) A callable validator class (see `Django's validators documentation `_) which enforces case-insensitive uniqueness on a given field of a particular model. Used by :class:`~django_registration.forms.RegistrationFormCaseInsensitive` for case-insensitive username uniqueness, and :class:`~django_registration.forms.RegistrationFormUniqueEmail` for unique email addresses. :param django.db.models.Model model: The model class to query against for uniqueness checks. :param str field_name: The field name to perform the uniqueness check against. :raises django.core.exceptions.ValidationError: if the value is not unique. .. class:: HTML5EmailValidator A callable validator class (see `Django's validators documentation `_) which enforces the `HTML5 email address format `_. The format used by HTML5's `input type="email"` is deliberately more restrictive than what is permitted by the latest email RFCs; specifically, HTML5's validation rule disallows a number of rare and problematic features -- such as embedded comments and quoted-string inclusion of otherwise-illegal characters -- which are technically legal to have in an email address but which now mostly serve to confuse or complicate parsers, rather than to provide actual utility. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1580075525.0 django-registration-3.3/docs/views.rst0000644000076700000240000001425400000000000017143 0ustar00jamesstaff.. _views: .. module:: django_registration.views Base view classes ================= In order to allow the utmost flexibility in customizing and supporting different workflows, django-registration makes use of Django's support for `class-based views `_. Included in django-registration are two base classes which can be subclassed to implement many types of registration workflows. The built-in workflows in django-registration provide their own subclasses of these views, and the documentation for those workflows will indicate customization points specific to those subclasses. The following reference covers useful attributes and methods of the base classes, for use in writing your own custom registration workflows. .. class:: RegistrationView A subclass of Django's :class:`~django.views.generic.edit.FormView` which provides the infrastructure for supporting user registration. Standard attributes and methods of :class:`~django.views.generic.edit.FormView` can be overridden to control behavior as described in Django's documentation, with the exception of :meth:`get_success_url`, which must use the signature documented below. When writing your own subclass, one method is required: .. method:: register(form) Implement your registration logic here. `form` will be the (already-validated) form filled out by the user during the registration process (i.e., a valid instance of :class:`~django_registration.forms.RegistrationForm` or a subclass of it). This method should return the newly-registered user instance, and should send the signal :data:`django_registration.signals.user_registered`. Note that this is not automatically done for you when writing your own custom subclass, so you must send this signal manually. :param django_registration.forms.RegistrationForm form: The registration form to use. :rtype: django.contrib.auth.models.AbstractUser Useful optional places to override or customize on subclasses are: .. attribute:: disallowed_url The URL to redirect to when registration is disallowed. Can be a hard-coded string, the string resulting from calling Django's :func:`~django.urls.reverse` helper, or the lazy object produced by Django's :func:`~django.urls.reverse_lazy` helper. Default value is the result of calling :func:`~django.urls.reverse_lazy` with the URL name `'registration_disallowed'`. .. attribute:: form_class The form class to use for user registration. Can be overridden on a per-request basis (see below). Should be the actual class object; by default, this class is :class:`django_registration.forms.RegistrationForm`. .. attribute:: success_url The URL to redirect to after successful registration. Can be a hard-coded string, the string resulting from calling Django's :func:`~django.urls.reverse` helper, or the lazy object produced by Django's :func:`~django.urls.reverse_lazy` helper. Can be overridden on a per-request basis (see below). Default value is `None`; subclasses must override and provide this. .. attribute:: template_name The template to use for user registration. Should be a string. Default value is `'django_registration/registration_form.html'`. .. method:: get_form_class() Select a form class to use on a per-request basis. If not overridden, will use :attr:`~form_class`. Should be the actual class object. :rtype: django_registration.forms.RegistrationForm .. method:: get_success_url(user) Return a URL to redirect to after successful registration, on a per-request or per-user basis. If not overridden, will use :attr:`~success_url`. Should return a value of the same type as :attr:`success_url` (see above). :param django.contrib.auth.models.AbstractUser user: The new user account. :rtype: str .. method:: registration_allowed() Should indicate whether user registration is allowed, either in general or for this specific request. Default value is the value of the setting :data:`~django.conf.settings.REGISTRATION_OPEN`. :rtype: bool .. class:: ActivationView A subclass of Django's :class:`~django.views.generic.base.TemplateView` which provides support for a separate account-activation step, in workflows which require that. One method is required: .. method:: activate(*args, **kwargs) Implement your activation logic here. You are free to configure your URL patterns to pass any set of positional or keyword arguments to :class:`ActivationView`, and they will in turn be passed to this method. This method should return the newly-activated user instance (if activation was successful), or raise :class:`~django_registration.exceptions.ActivationError` (if activation was not successful). :rtype: django.contrib.auth.models.AbstractUser :raises django_registration.exceptions.ActivationError: if activation fails. Useful places to override or customize on an :class:`ActivationView` subclass are: .. attribute:: success_url The URL to redirect to after successful activation. Can be a hard-coded string, the string resulting from calling Django's :func:`~django.urls.reverse` helper, or the lazy object produced by Django's :func:`~django.urls.reverse_lazy` helper. Can be overridden on a per-request basis (see below). Default value is `None`; subclasses must override and provide this. .. attribute:: template_name The template to use after failed user activation. Should be a string. Default value is `'django_registration/activation_failed.html'`. .. method:: get_success_url(user) Return a URL to redirect to after successful activation, on a per-request or per-user basis. If not overridden, will use :attr:`~success_url`. Should return a value of the same type as :attr:`success_url` (see above). :param django.contrib.auth.models.AbstractUser user: The activated user account. :rtype: str ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1624320753.0 django-registration-3.3/runtests.py0000644000076700000240000000525000000000000016561 0ustar00jamesstaff""" A standalone test runner script, configuring the minimum settings required for tests to execute. Re-use at your own risk: many Django applications will require different settings and/or templates to run their tests. """ import os import sys from django.utils.crypto import get_random_string APP_DIR = os.path.abspath(os.path.dirname(__file__)) # Minimum settings required for the app's tests. SETTINGS_DICT = { "BASE_DIR": APP_DIR, "INSTALLED_APPS": ( "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.sites", "django_registration", "tests", ), # Test cases will override this liberally. "ROOT_URLCONF": "django_registration.backends.activation.urls", "DATABASES": { "default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"} }, "DEFAULT_AUTO_FIELD": "django.db.models.AutoField", "MIDDLEWARE": ( "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", ), "SECRET_KEY": get_random_string(12), "SITE_ID": 1, "TEMPLATES": [ { "BACKEND": "django.template.backends.django.DjangoTemplates", "DIRS": [os.path.join(APP_DIR, "tests/templates")], "OPTIONS": { "context_processors": [ "django.contrib.auth.context_processors.auth", "django.template.context_processors.debug", "django.template.context_processors.i18n", "django.template.context_processors.media", "django.template.context_processors.static", "django.template.context_processors.tz", "django.contrib.messages.context_processors.messages", ] }, } ], } def run_tests(): # Making Django run this way is a two-step process. First, call # settings.configure() to give Django settings to work with: from django.conf import settings settings.configure(**SETTINGS_DICT) # Then, call django.setup() to initialize the application cache # and other bits: import django django.setup() # Now we instantiate a test runner... from django.test.utils import get_runner TestRunner = get_runner(settings) # And then we run tests and return the results. test_runner = TestRunner(verbosity=2, interactive=True) failures = test_runner.run_tests(["tests"]) sys.exit(bool(failures)) if __name__ == "__main__": run_tests() ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4817152 django-registration-3.3/setup.cfg0000644000076700000240000000063200000000000016140 0ustar00jamesstaff[metadata] license_file = LICENSE [coverage:paths] source = src .tox/*/site-packages [coverage:report] fail_under = 100 exclude_lines = pragma: no cover def __str__ raise NotImplementedError [flake8] extend-ignore = E203 max-complexity = 10 max-line-length = 88 [isort] profile = black [check-manifest] ignore = __pycache__ *.pyc ignore-bad-ideas = *.mo [egg_info] tag_build = tag_date = 0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653721593.0 django-registration-3.3/setup.py0000644000076700000240000000270600000000000016035 0ustar00jamesstaffimport os from setuptools import find_packages, setup setup( name="django-registration", zip_safe=False, # eggs are the devil. version="3.3", description="An extensible user-registration application for Django", long_description=open(os.path.join(os.path.dirname(__file__), "README.rst")).read(), author="James Bennett", author_email="james@b-list.org", url="https://github.com/ubernostrum/django-registration/", include_package_data=True, package_dir={"": "src"}, packages=find_packages("src"), classifiers=[ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: Django", "Framework :: Django :: 3.1", "Framework :: Django :: 3.2", "Framework :: Django :: 4.0", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules", "Programming Language :: Python", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Topic :: Utilities", ], python_requires=">=3.7", install_requires=["Django>=3.2", "confusable_homoglyphs~=3.0"], ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4232383 django-registration-3.3/src/0000755000076700000240000000000000000000000015105 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4463608 django-registration-3.3/src/django_registration/0000755000076700000240000000000000000000000021141 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/__init__.py0000644000076700000240000000000000000000000023240 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4495573 django-registration-3.3/src/django_registration/backends/0000755000076700000240000000000000000000000022713 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/backends/__init__.py0000644000076700000240000000000000000000000025012 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.450617 django-registration-3.3/src/django_registration/backends/activation/0000755000076700000240000000000000000000000025054 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/backends/activation/__init__.py0000644000076700000240000000055400000000000027171 0ustar00jamesstaff""" A two-step (signup, then activation) registration workflow, using HMAC-signed tokens. To use, include() the provided URLconf -- registration.backends.hmac.urls -- somewhere in your URL configuration. For more details, see the documentation in the docs/ directory of the source-code distribution, or online at https://django-registration.readthedocs.io/ """ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1607759404.0 django-registration-3.3/src/django_registration/backends/activation/urls.py0000644000076700000240000000214500000000000026415 0ustar00jamesstaff""" URLconf for registration and activation, using django-registration's HMAC activation workflow. """ from django.urls import path from django.views.generic.base import TemplateView from . import views urlpatterns = [ path( "activate/complete/", TemplateView.as_view( template_name="django_registration/activation_complete.html" ), name="django_registration_activation_complete", ), path( "activate//", views.ActivationView.as_view(), name="django_registration_activate", ), path( "register/", views.RegistrationView.as_view(), name="django_registration_register", ), path( "register/complete/", TemplateView.as_view( template_name="django_registration/registration_complete.html" ), name="django_registration_complete", ), path( "register/closed/", TemplateView.as_view( template_name="django_registration/registration_closed.html" ), name="django_registration_disallowed", ), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1607759404.0 django-registration-3.3/src/django_registration/backends/activation/views.py0000644000076700000240000001314600000000000026570 0ustar00jamesstaff""" A two-step (registration followed by activation) workflow, implemented by emailing an HMAC-verified timestamped activation token to the user on signup. """ from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.sites.shortcuts import get_current_site from django.core import signing from django.template.loader import render_to_string from django.urls import reverse_lazy from django.utils.translation import gettext_lazy as _ from django_registration import signals from django_registration.exceptions import ActivationError from django_registration.views import ActivationView as BaseActivationView from django_registration.views import RegistrationView as BaseRegistrationView REGISTRATION_SALT = getattr(settings, "REGISTRATION_SALT", "registration") class RegistrationView(BaseRegistrationView): """ Register a new (inactive) user account, generate an activation key and email it to the user. This is different from the model-based activation workflow in that the activation key is the username, signed using Django's TimestampSigner, with HMAC verification on activation. """ email_body_template = "django_registration/activation_email_body.txt" email_subject_template = "django_registration/activation_email_subject.txt" success_url = reverse_lazy("django_registration_complete") def register(self, form): new_user = self.create_inactive_user(form) signals.user_registered.send( sender=self.__class__, user=new_user, request=self.request ) return new_user def create_inactive_user(self, form): """ Create the inactive user account and send an email containing activation instructions. """ new_user = form.save(commit=False) new_user.is_active = False new_user.save() self.send_activation_email(new_user) return new_user def get_activation_key(self, user): """ Generate the activation key which will be emailed to the user. """ return signing.dumps(obj=user.get_username(), salt=REGISTRATION_SALT) def get_email_context(self, activation_key): """ Build the template context used for the activation email. """ scheme = "https" if self.request.is_secure() else "http" return { "scheme": scheme, "activation_key": activation_key, "expiration_days": settings.ACCOUNT_ACTIVATION_DAYS, "site": get_current_site(self.request), } def send_activation_email(self, user): """ Send the activation email. The activation key is the username, signed using TimestampSigner. """ activation_key = self.get_activation_key(user) context = self.get_email_context(activation_key) context["user"] = user subject = render_to_string( template_name=self.email_subject_template, context=context, request=self.request, ) # Force subject to a single line to avoid header-injection # issues. subject = "".join(subject.splitlines()) message = render_to_string( template_name=self.email_body_template, context=context, request=self.request, ) user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL) class ActivationView(BaseActivationView): """ Given a valid activation key, activate the user's account. Otherwise, show an error message stating the account couldn't be activated. """ ALREADY_ACTIVATED_MESSAGE = _( "The account you tried to activate has already been activated." ) BAD_USERNAME_MESSAGE = _("The account you attempted to activate is invalid.") EXPIRED_MESSAGE = _("This account has expired.") INVALID_KEY_MESSAGE = _("The activation key you provided is invalid.") success_url = reverse_lazy("django_registration_activation_complete") def activate(self, *args, **kwargs): username = self.validate_key(kwargs.get("activation_key")) user = self.get_user(username) user.is_active = True user.save() return user def validate_key(self, activation_key): """ Verify that the activation key is valid and within the permitted activation time window, returning the username if valid or raising ``ActivationError`` if not. """ try: username = signing.loads( activation_key, salt=REGISTRATION_SALT, max_age=settings.ACCOUNT_ACTIVATION_DAYS * 86400, ) return username except signing.SignatureExpired: raise ActivationError(self.EXPIRED_MESSAGE, code="expired") except signing.BadSignature: raise ActivationError( self.INVALID_KEY_MESSAGE, code="invalid_key", params={"activation_key": activation_key}, ) def get_user(self, username): """ Given the verified username, look up and return the corresponding user account if it exists, or raising ``ActivationError`` if it doesn't. """ User = get_user_model() try: user = User.objects.get(**{User.USERNAME_FIELD: username}) if user.is_active: raise ActivationError( self.ALREADY_ACTIVATED_MESSAGE, code="already_activated" ) return user except User.DoesNotExist: raise ActivationError(self.BAD_USERNAME_MESSAGE, code="bad_username") ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4517224 django-registration-3.3/src/django_registration/backends/one_step/0000755000076700000240000000000000000000000024527 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/backends/one_step/__init__.py0000644000076700000240000000057400000000000026646 0ustar00jamesstaff""" A one-step registration workflow, in which a user signs up and is immediately active and logged in. To use, include() the provided URLconf -- registration.backends.simple.urls -- somewhere in your URL configuration. For more details, see the documentation in the docs/ directory of the source-code distribution, or online at https://django-registration.readthedocs.io/ """ ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1607759404.0 django-registration-3.3/src/django_registration/backends/one_step/urls.py0000644000076700000240000000134500000000000026071 0ustar00jamesstaff""" URLconf for registration using django-registration's one-step workflow. """ from django.urls import path from django.views.generic.base import TemplateView from . import views urlpatterns = [ path( "register/", views.RegistrationView.as_view(), name="django_registration_register", ), path( "register/closed/", TemplateView.as_view( template_name="django_registration/registration_closed.html" ), name="django_registration_disallowed", ), path( "register/complete/", TemplateView.as_view( template_name="django_registration/registration_complete.html" ), name="django_registration_complete", ), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1607759404.0 django-registration-3.3/src/django_registration/backends/one_step/views.py0000644000076700000240000000212000000000000026231 0ustar00jamesstaff""" A one-step (user signs up and is immediately active and logged in) workflow. """ from django.contrib.auth import authenticate, get_user_model, login from django.urls import reverse_lazy from django_registration import signals from django_registration.views import RegistrationView as BaseRegistrationView User = get_user_model() class RegistrationView(BaseRegistrationView): """ Registration via the simplest possible process: a user supplies a username, email address and password (the bare minimum for a useful account), and is immediately signed up and logged in. """ success_url = reverse_lazy("django_registration_complete") def register(self, form): new_user = form.save() new_user = authenticate( **{ User.USERNAME_FIELD: new_user.get_username(), "password": form.cleaned_data["password1"], } ) login(self.request, new_user) signals.user_registered.send( sender=self.__class__, user=new_user, request=self.request ) return new_user ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1570956603.0 django-registration-3.3/src/django_registration/exceptions.py0000644000076700000240000000074500000000000023702 0ustar00jamesstaff""" Exception classes used in registration workflows. """ class RegistrationError(Exception): """ Base class for registration errors. """ def __init__(self, message, code=None, params=None): super(RegistrationError, self).__init__(message, code, params) self.message = message self.code = code self.params = params class ActivationError(RegistrationError): """ Base class for account-activation errors. """ pass ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1607759404.0 django-registration-3.3/src/django_registration/forms.py0000644000076700000240000000647600000000000022656 0ustar00jamesstaff""" Forms and validation code for user registration. Note that all of these forms assume your user model is similar in structure to Django's default User class. If your user model is significantly different, you may need to write your own form class; see the documentation for notes on custom user models with django-registration. """ from django import forms from django.contrib.auth import get_user_model from django.contrib.auth.forms import UserCreationForm from django.utils.translation import gettext_lazy as _ from . import validators User = get_user_model() class RegistrationForm(UserCreationForm): """ Form for registering a new user account. Validates that the requested username is not already in use, and requires the password to be entered twice to catch typos. Subclasses should feel free to add any additional validation they need, but should take care when overriding ``save()`` to respect the ``commit=False`` argument, as several registration workflows will make use of it to create inactive user accounts. """ class Meta(UserCreationForm.Meta): fields = [ User.USERNAME_FIELD, User.get_email_field_name(), "password1", "password2", ] error_css_class = "error" required_css_class = "required" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) email_field = User.get_email_field_name() if hasattr(self, "reserved_names"): reserved_names = self.reserved_names else: reserved_names = validators.DEFAULT_RESERVED_NAMES username_validators = [ validators.ReservedNameValidator(reserved_names), validators.validate_confusables, ] self.fields[User.USERNAME_FIELD].validators.extend(username_validators) self.fields[email_field].validators.extend( (validators.HTML5EmailValidator(), validators.validate_confusables_email) ) self.fields[email_field].required = True class RegistrationFormCaseInsensitive(RegistrationForm): """ Subclass of ``RegistrationForm`` enforcing case-insensitive uniqueness of usernames. """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields[User.USERNAME_FIELD].validators.append( validators.CaseInsensitiveUnique( User, User.USERNAME_FIELD, validators.DUPLICATE_USERNAME ) ) class RegistrationFormTermsOfService(RegistrationForm): """ Subclass of ``RegistrationForm`` which adds a required checkbox for agreeing to a site's Terms of Service. """ tos = forms.BooleanField( widget=forms.CheckboxInput, label=_("I have read and agree to the Terms of Service"), error_messages={"required": validators.TOS_REQUIRED}, ) class RegistrationFormUniqueEmail(RegistrationForm): """ Subclass of ``RegistrationForm`` which enforces uniqueness of email addresses. """ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) email_field = User.get_email_field_name() self.fields[email_field].validators.append( validators.CaseInsensitiveUnique( User, email_field, validators.DUPLICATE_EMAIL ) ) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4337804 django-registration-3.3/src/django_registration/locale/0000755000076700000240000000000000000000000022400 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4242094 django-registration-3.3/src/django_registration/locale/ar/0000755000076700000240000000000000000000000023002 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4527535 django-registration-3.3/src/django_registration/locale/ar/LC_MESSAGES/0000755000076700000240000000000000000000000024567 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/ar/LC_MESSAGES/django.mo0000644000076700000240000000412700000000000026372 0ustar00jamesstaffx-y_N6V;') *8ARg}5CQ1l:@+l, "(  2?   I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2007-09-19 19:30-0500 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit أقر بقراءة والموافقة على شروط الخدمةيمنع التسجيل باستخدام عناوين بريد الكترونية مجانية. يرجى تزويد عنوان بريد الكتروني مختلف.عنوان البريد الالكتروني مسجل مسبقا. يرجى تزويد عنوان بريد الكتروني مختلف.اسم المستخدم مسجل مسبقا. يرجى اختيار اسم اخر.يمكن أن يحتوي اسم المستخدم على احرف، ارقام وشرطات سطرية فقطيجب الموافقة على الشروط للتسجيليجب ادخال كلمة المرور مطابقة كل مرةرمز التفعيلعنوان البريد الالكترونيكلمة المرورتأكيد كلمة المرورملف التسجيل الشخصيملفات التسجيل الشخصيةمستخدماسم المستخدم././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/ar/LC_MESSAGES/django.po0000644000076700000240000000474300000000000026401 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-19 19:30-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: forms.py:38 msgid "username" msgstr "اسم المستخدم" #: forms.py:41 msgid "email address" msgstr "عنوان البريد الالكتروني" #: forms.py:43 msgid "password" msgstr "كلمة المرور" #: forms.py:45 msgid "password (again)" msgstr "تأكيد كلمة المرور" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "يمكن أن يحتوي اسم المستخدم على احرف، ارقام وشرطات سطرية فقط" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "اسم المستخدم مسجل مسبقا. يرجى اختيار اسم اخر." #: forms.py:68 msgid "You must type the same password each time" msgstr "يجب ادخال كلمة المرور مطابقة كل مرة" #: forms.py:96 msgid "I have read and agree to the Terms of Service" msgstr "أقر بقراءة والموافقة على شروط الخدمة" #: forms.py:105 msgid "You must agree to the terms to register" msgstr "يجب الموافقة على الشروط للتسجيل" #: forms.py:124 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "عنوان البريد الالكتروني مسجل مسبقا. يرجى تزويد عنوان بريد الكتروني مختلف." #: forms.py:149 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "يمنع التسجيل باستخدام عناوين بريد الكترونية مجانية. يرجى تزويد عنوان بريد الكتروني مختلف." #: models.py:188 msgid "user" msgstr "مستخدم" #: models.py:189 msgid "activation key" msgstr "رمز التفعيل" #: models.py:194 msgid "registration profile" msgstr "ملف التسجيل الشخصي" #: models.py:195 msgid "registration profiles" msgstr "ملفات التسجيل الشخصية" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4246056 django-registration-3.3/src/django_registration/locale/bg/0000755000076700000240000000000000000000000022770 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.453515 django-registration-3.3/src/django_registration/locale/bg/LC_MESSAGES/0000755000076700000240000000000000000000000024555 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/bg/LC_MESSAGES/django.mo0000644000076700000240000000437600000000000026366 0ustar00jamesstaffx-y_N6V;') *8ARg}sbbyZ{h_; % CP)p+"   I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2007-09-19 19:30-0500 PO-Revision-Date: 2008-03-05 12:37+0200 Last-Translator: Vladislav Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Bookmarks: -1,-1,-1,-1,10,-1,-1,-1,-1,-1 Прочел съм и съм съгласен с условията за експлоатацияРегистрациите с безплатни адреси е забранен. Моля въведете различен адрес за електронна пощаАдреса на електронната поща е използван. Моля въведете друг адрес.Потребителското име е заето. Моля изберето друго.Потребителските имена могат да съдържат букви, цифри и подчертавкиТрябва да сте съгласни с условията за да се регистрирате.Грешка при проверка на паролата.Ключ за активацияЕлектронна пощаПаролаПарола (проверка)регистрационен профилрегистрационни профилиПотребителПотребителско име ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/bg/LC_MESSAGES/django.po0000644000076700000240000000517200000000000026364 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-19 19:30-0500\n" "PO-Revision-Date: 2008-03-05 12:37+0200\n" "Last-Translator: Vladislav \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Bookmarks: -1,-1,-1,-1,10,-1,-1,-1,-1,-1\n" #: forms.py:38 msgid "username" msgstr "Потребителско име " #: forms.py:41 msgid "email address" msgstr "Електронна поща" #: forms.py:43 msgid "password" msgstr "Парола" #: forms.py:45 msgid "password (again)" msgstr "Парола (проверка)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "Потребителските имена могат да съдържат букви, цифри и подчертавки" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "Потребителското име е заето. Моля изберето друго." #: forms.py:68 msgid "You must type the same password each time" msgstr "Грешка при проверка на паролата." #: forms.py:96 msgid "I have read and agree to the Terms of Service" msgstr "Прочел съм и съм съгласен с условията за експлоатация" #: forms.py:105 msgid "You must agree to the terms to register" msgstr "Трябва да сте съгласни с условията за да се регистрирате." #: forms.py:124 msgid "This email address is already in use. Please supply a different email address." msgstr "Адреса на електронната поща е използван. Моля въведете друг адрес." #: forms.py:149 msgid "Registration using free email addresses is prohibited. Please supply a different email address." msgstr "Регистрациите с безплатни адреси е забранен. Моля въведете различен адрес за електронна поща" #: models.py:188 msgid "user" msgstr "Потребител" #: models.py:189 msgid "activation key" msgstr "Ключ за активация" #: models.py:194 msgid "registration profile" msgstr "регистрационен профил" #: models.py:195 msgid "registration profiles" msgstr "регистрационни профили" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4249005 django-registration-3.3/src/django_registration/locale/ca/0000755000076700000240000000000000000000000022763 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4543266 django-registration-3.3/src/django_registration/locale/ca/LC_MESSAGES/0000755000076700000240000000000000000000000024550 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/ca/LC_MESSAGES/django.mo0000644000076700000240000000364100000000000026353 0ustar00jamesstaff<)-(9_S%N>(g'pj$Bgw2~ `,RPD >"as     A user with that username already exists.Activate usersE-mailI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.UsernameYou must agree to the terms to registeractivation keyregistration profileregistration profilesuserProject-Id-Version: django-registration 0.8 Report-Msgid-Bugs-To: POT-Creation-Date: 2011-07-17 11:04+0200 PO-Revision-Date: 2010-09-24 23:21+0100 Last-Translator: Carles Barrobés i Meix Language-Team: Català Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Catalan Ja existeix un usuari amb aquest nomActivar usuarisE-mailHe llegit i estic d'acord amb les condicions d'úsContrasenyaContrasenya (de nou)Re-enviar e-mails d'activacióEstà prohibit registrar-se utilitzant adreces d'e-mail gratuïtes. Sisplau entreu-ne una altra.Els dos camps de contrasenya no coincideixenAquesta adreça d'e-mail ja està sent utilitzada. Sisplau, entreu-ne una altra.Aquest valor ha de contenir només lletres, números i guions baixosNom d'usuariHeu d'estar d'acord amb les condicions d'ús per registrar-vosclau d'activacióperfil de registreperfils de registreusuari././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/ca/LC_MESSAGES/django.po0000644000076700000240000000462600000000000026362 0ustar00jamesstaff# Catalan translation for django-registration. # Copyright (C) 2007-2010, James Bennet # This file is distributed under the same license as the django-registration package. # Carles Barrobés , 2010. # msgid "" msgstr "" "Project-Id-Version: django-registration 0.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2011-07-17 11:04+0200\n" "PO-Revision-Date: 2010-09-24 23:21+0100\n" "Last-Translator: Carles Barrobés i Meix \n" "Language-Team: Català\n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Catalan\n" #: admin.py:23 msgid "Activate users" msgstr "Activar usuaris" #: admin.py:43 msgid "Re-send activation emails" msgstr "Re-enviar e-mails d'activació" #: forms.py:35 msgid "Username" msgstr "Nom d'usuari" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "Aquest valor ha de contenir només lletres, números i guions baixos" #: forms.py:39 msgid "E-mail" msgstr "E-mail" #: forms.py:41 msgid "Password" msgstr "Contrasenya" #: forms.py:43 msgid "Password (again)" msgstr "Contrasenya (de nou)" #: forms.py:55 msgid "A user with that username already exists." msgstr "Ja existeix un usuari amb aquest nom" #: forms.py:67 msgid "The two password fields didn't match." msgstr "Els dos camps de contrasenya no coincideixen" #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "He llegit i estic d'acord amb les condicions d'ús" #: forms.py:79 msgid "You must agree to the terms to register" msgstr "Heu d'estar d'acord amb les condicions d'ús per registrar-vos" #: forms.py:95 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "" "Aquesta adreça d'e-mail ja està sent utilitzada. Sisplau, entreu-ne una " "altra." #: forms.py:122 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" "Està prohibit registrar-se utilitzant adreces d'e-mail gratuïtes. Sisplau " "entreu-ne una altra." #: models.py:168 msgid "user" msgstr "usuari" #: models.py:169 msgid "activation key" msgstr "clau d'activació" #: models.py:174 msgid "registration profile" msgstr "perfil de registre" #: models.py:175 msgid "registration profiles" msgstr "perfils de registre" #~ msgid "Email address" #~ msgstr "Adreça d'e-mail" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4253423 django-registration-3.3/src/django_registration/locale/cs/0000755000076700000240000000000000000000000023005 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4549284 django-registration-3.3/src/django_registration/locale/cs/LC_MESSAGES/0000755000076700000240000000000000000000000024572 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/cs/LC_MESSAGES/django.mo0000644000076700000240000000365300000000000026400 0ustar00jamesstaff<) -&/@_Z%N>/'nQ)0Zo4 !aNSmEFNav     A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.You must agree to the terms to registeractivation keyregistration profileregistration profilesuserusernameProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2009-10-12 14:09-0500 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Implayo s.r.o. Language-Team: LANGUAGE Language: cs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Uživatel s tímto jménem již existuje.Aktivovat uživateleE-mailová adresaPřečetl jsem si a souhlasím s podmínkami službyHesloHeslo (znovu)Znovu odeslat aktivační e-mailyPoužívání volných e-mailových adres je zakázáno. Prosím zadejte jinou e-mailovou adresu.Zadaná 2 hesla se neshodují.Tato e-mailová adresa se již používá. Prosím zadejte jinou e-mailovou adresu.Tato hodnota může obsahovat pouze písmena, čísla a podtržítka.Musíte odsouhlasit podmínky služby pro pokračování v registraci.aktivační klíčregistrační profilregistrační profilyuživateluživatelské jméno././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/cs/LC_MESSAGES/django.po0000644000076700000240000000453100000000000026377 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , 2011. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-10-12 14:09-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Implayo s.r.o. \n" "Language-Team: LANGUAGE \n" "Language: cs\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.py:23 msgid "Activate users" msgstr "Aktivovat uživatele" #: admin.py:43 msgid "Re-send activation emails" msgstr "Znovu odeslat aktivační e-maily" #: forms.py:35 msgid "username" msgstr "uživatelské jméno" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "Tato hodnota může obsahovat pouze písmena, čísla a podtržítka." #: forms.py:39 msgid "Email address" msgstr "E-mailová adresa" #: forms.py:41 msgid "Password" msgstr "Heslo" #: forms.py:43 msgid "Password (again)" msgstr "Heslo (znovu)" #: forms.py:55 msgid "A user with that username already exists." msgstr "Uživatel s tímto jménem již existuje." #: forms.py:67 msgid "The two password fields didn't match." msgstr "Zadaná 2 hesla se neshodují." #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "Přečetl jsem si a souhlasím s podmínkami služby" #: forms.py:79 msgid "You must agree to the terms to register" msgstr "Musíte odsouhlasit podmínky služby pro pokračování v registraci." #: forms.py:95 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "" "Tato e-mailová adresa se již používá. Prosím zadejte jinou e-mailovou " "adresu." #: forms.py:122 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" "Používání volných e-mailových adres je zakázáno. Prosím zadejte " "jinou e-mailovou adresu." #: models.py:165 msgid "user" msgstr "uživatel" #: models.py:166 msgid "activation key" msgstr "aktivační klíč" #: models.py:171 msgid "registration profile" msgstr "registrační profil" #: models.py:172 msgid "registration profiles" msgstr "registrační profily" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4256532 django-registration-3.3/src/django_registration/locale/da/0000755000076700000240000000000000000000000022764 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4557793 django-registration-3.3/src/django_registration/locale/da/LC_MESSAGES/0000755000076700000240000000000000000000000024551 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/da/LC_MESSAGES/django.mo0000644000076700000240000000341300000000000026351 0ustar00jamesstaff<) -&/@_Z%N>/n'w3 +(9bk}Z @8T 0     A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.UsernameYou must agree to the terms to registeractivation keyregistration profileregistration profilesuserProject-Id-Version: django-registration 0.8 Report-Msgid-Bugs-To: POT-Creation-Date: PO-Revision-Date: Last-Translator: Rune Bromer Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Der findes allerede en bruger med dette brugernavn.Aktiver brugereE-mailadresseI har l¾st og accepterer betingelserne.PasswordPassword (gentag)Gensend aktiveringsemailsRegistrering med gratis emailadresser er ikke muligt. V¾lg venligst en anden emailadresseDe 2 passwordfelter er ikke ens.Denne emailadresse er allerede i brug. Benyt venligst en anden. V¾rdien mŒ kun indeholde bogstaver, tal og underscore.BrugernavnDu skal acceptere betingelserne for at registereAktiveringsn¿gleRegistreringsprofilRegistreringprofilerbruger././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/da/LC_MESSAGES/django.po0000644000076700000240000000426400000000000026361 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Rune Bromer , 2007-2009. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: django-registration 0.8 \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: \n" "PO-Revision-Date: \n" "Last-Translator: Rune Bromer \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.py:23 msgid "Activate users" msgstr "Aktiver brugere" #: admin.py:43 msgid "Re-send activation emails" msgstr "Gensend aktiveringsemails" #: forms.py:35 msgid "Username" msgstr "Brugernavn" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "V¾rdien mŒ kun indeholde bogstaver, tal og underscore." #: forms.py:39 msgid "Email address" msgstr "E-mailadresse" #: forms.py:41 msgid "Password" msgstr "Password" #: forms.py:43 msgid "Password (again)" msgstr "Password (gentag)" #: forms.py:55 msgid "A user with that username already exists." msgstr "Der findes allerede en bruger med dette brugernavn." #: forms.py:67 msgid "The two password fields didn't match." msgstr "De 2 passwordfelter er ikke ens." #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "I har l¾st og accepterer betingelserne." #: forms.py:79 msgid "You must agree to the terms to register" msgstr "Du skal acceptere betingelserne for at registere" #: forms.py:95 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "" "Denne emailadresse er allerede i brug. Benyt venligst en anden. " #: forms.py:122 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" "Registrering med gratis emailadresser er ikke muligt. V¾lg venligst en " "anden emailadresse" #: models.py:165 msgid "user" msgstr "bruger" #: models.py:166 msgid "activation key" msgstr "Aktiveringsn¿gle" #: models.py:171 msgid "registration profile" msgstr "Registreringsprofil" #: models.py:172 msgid "registration profiles" msgstr "Registreringprofiler" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.425982 django-registration-3.3/src/django_registration/locale/de/0000755000076700000240000000000000000000000022770 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4563468 django-registration-3.3/src/django_registration/locale/de/LC_MESSAGES/0000755000076700000240000000000000000000000024555 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/de/LC_MESSAGES/django.mo0000644000076700000240000000371700000000000026364 0ustar00jamesstaff<) -&/@_Z%N>/n'wF)%Oc;r!t,eWD /G<     A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.UsernameYou must agree to the terms to registeractivation keyregistration profileregistration profilesuserProject-Id-Version: django-registration 0.8 Report-Msgid-Bugs-To: POT-Creation-Date: 2009-10-18 21:32+0200 PO-Revision-Date: 2007-09-29 16:50+0200 Last-Translator: Jannis Leidel Language-Team: Deutsch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Dieser Benutzername ist bereits vergeben.Benutzer aktivierenE-Mail-AdresseIch habe die Nutzungsvereinbarung gelesen und stimme ihr zuPasswortPasswort (wiederholen)Aktivierungs-E-Mail erneut sendenDie Registrierung mit einer kostenlosen E-Mail-Adresse ist untersagt. Bitte geben Sie eine andere E-Mail-Adresse an.Die beiden Passwörter sind nicht identisch.Diese E-Mail-Adresse wird schon genutzt. Bitte geben Sie eine andere E-Mail-Adresse an.Dieser Wert darf nur Buchstaben, Ziffern und Unterstriche enthalten.BenutzernameSie müssen der Nutzungsvereinbarung zustimmen, um sich zu registrierenAktivierungsschlüsselRegistrierungsprofilRegistrierungsprofileBenutzer././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/de/LC_MESSAGES/django.po0000644000076700000240000000457200000000000026367 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Jannis Leidel , 2007-2009. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: django-registration 0.8 \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-10-18 21:32+0200\n" "PO-Revision-Date: 2007-09-29 16:50+0200\n" "Last-Translator: Jannis Leidel \n" "Language-Team: Deutsch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.py:23 msgid "Activate users" msgstr "Benutzer aktivieren" #: admin.py:43 msgid "Re-send activation emails" msgstr "Aktivierungs-E-Mail erneut senden" #: forms.py:35 msgid "Username" msgstr "Benutzername" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "Dieser Wert darf nur Buchstaben, Ziffern und Unterstriche enthalten." #: forms.py:39 msgid "Email address" msgstr "E-Mail-Adresse" #: forms.py:41 msgid "Password" msgstr "Passwort" #: forms.py:43 msgid "Password (again)" msgstr "Passwort (wiederholen)" #: forms.py:55 msgid "A user with that username already exists." msgstr "Dieser Benutzername ist bereits vergeben." #: forms.py:67 msgid "The two password fields didn't match." msgstr "Die beiden Passwörter sind nicht identisch." #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "Ich habe die Nutzungsvereinbarung gelesen und stimme ihr zu" #: forms.py:79 msgid "You must agree to the terms to register" msgstr "Sie müssen der Nutzungsvereinbarung zustimmen, um sich zu registrieren" #: forms.py:95 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "" "Diese E-Mail-Adresse wird schon genutzt. Bitte geben Sie eine andere E-Mail-" "Adresse an." #: forms.py:122 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" "Die Registrierung mit einer kostenlosen E-Mail-Adresse ist untersagt. Bitte " "geben Sie eine andere E-Mail-Adresse an." #: models.py:165 msgid "user" msgstr "Benutzer" #: models.py:166 msgid "activation key" msgstr "Aktivierungsschlüssel" #: models.py:171 msgid "registration profile" msgstr "Registrierungsprofil" #: models.py:172 msgid "registration profiles" msgstr "Registrierungsprofile" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4262803 django-registration-3.3/src/django_registration/locale/el/0000755000076700000240000000000000000000000023000 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.457074 django-registration-3.3/src/django_registration/locale/el/LC_MESSAGES/0000755000076700000240000000000000000000000024565 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/el/LC_MESSAGES/django.mo0000644000076700000240000000457000000000000026372 0ustar00jamesstaffx-y_N6V;') *8ARg}5WbY'oD! 3 Q `    I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2007-09-19 19:30-0500 PO-Revision-Date: 2007-11-14 21:50+0200 Last-Translator: FULL NAME Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Διάβασα και συμφωνώ με τους Όρους της ΥπηρεσίαςΗ εγγραφή μέσω δωρεάν διευθύνσεων ηλεκτρονικού ταχυδρομείου απαγορεύεται. Παρακαλώ δώστε κάποια άλλη.Η συγκεκριμένη διεύθυνση ηλεκτρονικού ταχυδρομείου χρησιμοποιείται ήδη. Παρακαλώ δώστε κάποια άλλη.Αυτό το όνομα χρήστη χρησιμοποίειται ήδη. Παρακαλώ διαλέξτε ένα άλλο.Τα ονόματα χρηστών μπορούν να περιλαμβάνουν μόνο γράμματα, αριθμούς και υπογραμμίσειςΠρέπει να συμφωνείται με τους όρους για να εγγραφείτεΠρέπει να εισάγετε το ίδιο συνθηματικό κάθε φοράκλειδί ενεργοποίησηςδιεύθυνση ηλεκτρονικού ταχυδρομείουσυνθηματικόσυνθηματικό (ξανά)προφίλ εγγραφήςπροφίλ εγγραφώνχρήστηςόνομα χρήστη././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/el/LC_MESSAGES/django.po0000644000076700000240000000543600000000000026377 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Panos Laganakos , 2007. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-19 19:30-0500\n" "PO-Revision-Date: 2007-11-14 21:50+0200\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: forms.py:38 msgid "username" msgstr "όνομα χρήστη" #: forms.py:41 msgid "email address" msgstr "διεύθυνση ηλεκτρονικού ταχυδρομείου" #: forms.py:43 msgid "password" msgstr "συνθηματικό" #: forms.py:45 msgid "password (again)" msgstr "συνθηματικό (ξανά)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "Τα ονόματα χρηστών μπορούν να περιλαμβάνουν μόνο γράμματα, αριθμούς και υπογραμμίσεις" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "Αυτό το όνομα χρήστη χρησιμοποίειται ήδη. Παρακαλώ διαλέξτε ένα άλλο." #: forms.py:68 msgid "You must type the same password each time" msgstr "Πρέπει να εισάγετε το ίδιο συνθηματικό κάθε φορά" #: forms.py:96 msgid "I have read and agree to the Terms of Service" msgstr "Διάβασα και συμφωνώ με τους Όρους της Υπηρεσίας" #: forms.py:105 msgid "You must agree to the terms to register" msgstr "Πρέπει να συμφωνείται με τους όρους για να εγγραφείτε" #: forms.py:124 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "" "Η συγκεκριμένη διεύθυνση ηλεκτρονικού ταχυδρομείου χρησιμοποιείται ήδη. " "Παρακαλώ δώστε κάποια άλλη." #: forms.py:149 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" "Η εγγραφή μέσω δωρεάν διευθύνσεων ηλεκτρονικού ταχυδρομείου απαγορεύεται. ""Παρακαλώ δώστε κάποια άλλη." #: models.py:188 msgid "user" msgstr "χρήστης" #: models.py:189 msgid "activation key" msgstr "κλειδί ενεργοποίησης" #: models.py:194 msgid "registration profile" msgstr "προφίλ εγγραφής" #: models.py:195 msgid "registration profiles" msgstr "προφίλ εγγραφών" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4266484 django-registration-3.3/src/django_registration/locale/en/0000755000076700000240000000000000000000000023002 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4576514 django-registration-3.3/src/django_registration/locale/en/LC_MESSAGES/0000755000076700000240000000000000000000000024567 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/en/LC_MESSAGES/django.mo0000644000076700000240000000055700000000000026375 0ustar00jamesstaff$,859Project-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2009-10-12 14:09-0500 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/en/LC_MESSAGES/django.po0000644000076700000240000000327100000000000026374 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-10-12 14:09-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.py:23 msgid "Activate users" msgstr "" #: admin.py:43 msgid "Re-send activation emails" msgstr "" #: forms.py:35 msgid "username" msgstr "" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "" #: forms.py:39 msgid "Email address" msgstr "" #: forms.py:41 msgid "Password" msgstr "" #: forms.py:43 msgid "Password (again)" msgstr "" #: forms.py:55 msgid "A user with that username already exists." msgstr "" #: forms.py:67 msgid "The two password fields didn't match." msgstr "" #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "" #: forms.py:79 msgid "You must agree to the terms to register" msgstr "" #: forms.py:95 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "" #: forms.py:122 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" #: models.py:165 msgid "user" msgstr "" #: models.py:166 msgid "activation key" msgstr "" #: models.py:171 msgid "registration profile" msgstr "" #: models.py:172 msgid "registration profiles" msgstr "" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4269307 django-registration-3.3/src/django_registration/locale/es/0000755000076700000240000000000000000000000023007 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4584212 django-registration-3.3/src/django_registration/locale/es/LC_MESSAGES/0000755000076700000240000000000000000000000024574 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/es/LC_MESSAGES/django.mo0000644000076700000240000000363500000000000026402 0ustar00jamesstaffx-y_N6V;') *8ARg}{,v4b>NM13  8D[n   I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: django-registration 0.3 Report-Msgid-Bugs-To: POT-Creation-Date: 2008-03-11 00:19-0400 PO-Revision-Date: 2017-06-01 11:06-0400 Last-Translator: Ernesto Rico Schmidt Language-Team: Español MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language: es X-Generator: Poedit 1.8.12 He leído y acepto los términos de servicioEl registro usando una dirección de correo electrónico gratis está prohibido.Por favor proporciona otra dirección.La dirección de correo electrónico ya está siendo usada. Por favor proporciona otra dirección.Este nombre de usuario ya está ocupado. Por favor escoge otroLos nombres de usuarios sólo pueden contener letras, números y guiones bajosTienes que aceptar los términos para registrarteTienes que introducir la misma contraseña cada vezclave de activacióndirección de coreo electrónicocontraseñacontraseña (otra vez)perfil de registroperfiles de registrousuarionombre de usuario././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1600671777.0 django-registration-3.3/src/django_registration/locale/es/LC_MESSAGES/django.po0000644000076700000240000000451700000000000026405 0ustar00jamesstaff# Spanish translation for django-registration. # Copyright (C) 2007, James Bennet # This file is distributed under the same license as the registration package. # Ernesto Rico Schmidt , 2008. # msgid "" msgstr "" "Project-Id-Version: django-registration 0.3\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-11 00:19-0400\n" "PO-Revision-Date: 2017-06-01 11:06-0400\n" "Last-Translator: Ernesto Rico Schmidt \n" "Language-Team: Español \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "X-Generator: Poedit 1.8.12\n" #: forms.py:38 msgid "username" msgstr "nombre de usuario" #: forms.py:41 msgid "email address" msgstr "dirección de correo electrónico" #: forms.py:43 msgid "password" msgstr "contraseña" #: forms.py:45 msgid "password (again)" msgstr "contraseña (otra vez)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "Los nombres de usuario sólo pueden contener letras, números y guiones bajos" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "Este nombre de usuario ya está ocupado. Por favor escoge otro" #: forms.py:71 msgid "You must type the same password each time" msgstr "Tienes que introducir la misma contraseña cada vez" #: forms.py:100 msgid "I have read and agree to the Terms of Service" msgstr "He leído y acepto los términos de servicio" #: forms.py:109 msgid "You must agree to the terms to register" msgstr "Tienes que aceptar los términos para registrarte" #: forms.py:128 msgid "" "This email address is already in use. Please supply a different email address." msgstr "" "La dirección de correo electrónico ya está siendo usada. Por favor proporciona " "otra dirección." #: forms.py:153 msgid "" "Registration using free email addresses is prohibited. Please supply a different " "email address." msgstr "" "El registro usando una dirección de correo electrónico gratis está prohibido. Por " "favor proporciona otra dirección." #: models.py:188 msgid "user" msgstr "usuario" #: models.py:189 msgid "activation key" msgstr "clave de activación" #: models.py:194 msgid "registration profile" msgstr "perfil de registro" #: models.py:195 msgid "registration profiles" msgstr "perfiles de registro" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.427165 django-registration-3.3/src/django_registration/locale/es_AR/0000755000076700000240000000000000000000000023371 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4590087 django-registration-3.3/src/django_registration/locale/es_AR/LC_MESSAGES/0000755000076700000240000000000000000000000025156 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/es_AR/LC_MESSAGES/django.mo0000644000076700000240000000347100000000000026762 0ustar00jamesstaffx-y_N6V;') *8ARg}5<iKh>I@=)~  '   I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2007-09-19 19:30-0500 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit He leído y estoy de acuerdo con las Condiciones de ServicioLa registración con un e-mail gratuito está prohibida. Por favor de una dirección de e-mail diferente.Esa dirección de e-mail ya está en uso. Por favor provea otra dirección.Ese nombre de usuario ya está asignado. Por favor elija otro.El nombre de usuario solo puede contener letras, números y guiones bajosDebe estar de acuerdo con las Condiciones para poder registrarseDebe tipear la misma contraseña cada vezclave de activacióndirección de e-mailcontraseñacontraseña (nuevamente)perfil de registroperfiles de registrousuarionombre de usuario././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/es_AR/LC_MESSAGES/django.po0000644000076700000240000000433100000000000026761 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) 2008 Leonardo Manuel Rocha # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-19 19:30-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: forms.py:38 msgid "username" msgstr "nombre de usuario" #: forms.py:41 msgid "email address" msgstr "dirección de e-mail" #: forms.py:43 msgid "password" msgstr "contraseña" #: forms.py:45 msgid "password (again)" msgstr "contraseña (nuevamente)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "El nombre de usuario solo puede contener letras, números y guiones bajos" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "Ese nombre de usuario ya está asignado. Por favor elija otro." #: forms.py:68 msgid "You must type the same password each time" msgstr "Debe tipear la misma contraseña cada vez" #: forms.py:96 msgid "I have read and agree to the Terms of Service" msgstr "He leído y estoy de acuerdo con las Condiciones de Servicio" #: forms.py:105 msgid "You must agree to the terms to register" msgstr "Debe estar de acuerdo con las Condiciones para poder registrarse" #: forms.py:124 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "Esa dirección de e-mail ya está en uso. Por favor provea otra " "dirección." #: forms.py:149 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "La registración con un e-mail gratuito está prohibida. Por favor " "de una dirección de e-mail diferente." #: models.py:188 msgid "user" msgstr "usuario" #: models.py:189 msgid "activation key" msgstr "clave de activación" #: models.py:194 msgid "registration profile" msgstr "perfil de registro" #: models.py:195 msgid "registration profiles" msgstr "perfiles de registro" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4273999 django-registration-3.3/src/django_registration/locale/fa/0000755000076700000240000000000000000000000022766 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.459777 django-registration-3.3/src/django_registration/locale/fa/LC_MESSAGES/0000755000076700000240000000000000000000000024553 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/fa/LC_MESSAGES/django.mo0000644000076700000240000000462200000000000026356 0ustar00jamesstaff<) -&/@_Z%N>/'nO WsB8if?h * 'K s ~     A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.You must agree to the terms to registeractivation keyregistration profileregistration profilesuserusernameProject-Id-Version: django-registration 2.2 Report-Msgid-Bugs-To: POT-Creation-Date: 2009-10-12 14:09-0500 PO-Revision-Date: 2017-07-18 14:35+0430 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Language-Team: فارسی X-Generator: Poedit 2.0.2 Last-Translator: Hassan Sabbah Plural-Forms: nplurals=1; plural=0; Language: fa کاربری با این نام کاربری از گذشته موجود است.فعال سازی کاربراننشانی ایمیلمن شرایط استفاده از خدمات را خوانده و پسندیده امگذرواژهگذرواژه (تکرار)فرستادن دوباره ی ایمیل های فعال سازینام نویسی با ایمیل های رایگان ممنوع است. لطفا نشانی ایمیل دیگری بکار ببرید.دو رشته ی گذرواژه یکسان نبودند.این نشانی ایمیل هم اکنون در حال استفاده است. خواهش می کنم نشانی ایمیل دیگری بکار ببرید.این رشته باید تنها دارای حروف، اعداد و زیرین خط ( ـ ) باشد.شما برای نام نویسی باید شرایط استفاده از خدمات را بپسندیدکلید فعال سازیپروفایل نام نویسیپروفایل های نام نویسیکاربرنام کاربری././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/fa/LC_MESSAGES/django.po0000644000076700000240000000550200000000000026357 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Hassan Sabbah , 2017. # msgid "" msgstr "" "Project-Id-Version: django-registration 2.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-10-12 14:09-0500\n" "PO-Revision-Date: 2017-07-18 14:25+0430\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language-Team: فارسی \n" "X-Generator: Poedit 2.0.2\n" "Last-Translator: Hassan Sabbah \n" "Plural-Forms: nplurals=1; plural=0;\n" "Language: fa\n" #: admin.py:23 msgid "Activate users" msgstr "فعال سازی کاربران" #: admin.py:43 msgid "Re-send activation emails" msgstr "فرستادن دوباره ی ایمیل های فعال سازی" #: forms.py:35 msgid "username" msgstr "نام کاربری" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "این رشته باید تنها دارای حروف، اعداد و زیرین خط ( ـ ) باشد." #: forms.py:39 msgid "Email address" msgstr "نشانی ایمیل" #: forms.py:41 msgid "Password" msgstr "گذرواژه" #: forms.py:43 msgid "Password (again)" msgstr "گذرواژه (تکرار)" #: forms.py:55 msgid "A user with that username already exists." msgstr "کاربری با این نام کاربری از گذشته موجود است." #: forms.py:67 msgid "The two password fields didn't match." msgstr "دو رشته ی گذرواژه یکسان نبودند." #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "من شرایط استفاده از خدمات را خوانده و پسندیده ام" #: forms.py:79 msgid "You must agree to the terms to register" msgstr "شما برای نام نویسی باید شرایط استفاده از خدمات را بپسندید" #: forms.py:95 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "" "این نشانی ایمیل هم اکنون در حال استفاده است. خواهش می کنم نشانی ایمیل " "دیگری بکار ببرید." #: forms.py:122 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" "نام نویسی با ایمیل های رایگان ممنوع است. لطفا نشانی ایمیل دیگری بکار " "ببرید." #: models.py:165 msgid "user" msgstr "کاربر" #: models.py:166 msgid "activation key" msgstr "کلید فعال سازی" #: models.py:171 msgid "registration profile" msgstr "پروفایل نام نویسی" #: models.py:172 msgid "registration profiles" msgstr "پروفایل های نام نویسی" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4277294 django-registration-3.3/src/django_registration/locale/fr/0000755000076700000240000000000000000000000023007 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4603813 django-registration-3.3/src/django_registration/locale/fr/LC_MESSAGES/0000755000076700000240000000000000000000000024574 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/fr/LC_MESSAGES/django.mo0000644000076700000240000000373400000000000026402 0ustar00jamesstaff<) -&/@_Z%N>/n'wQ)0Zr< ,d,|LF=CO      A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.UsernameYou must agree to the terms to registeractivation keyregistration profileregistration profilesuserProject-Id-Version: django-registration 0.8 alpha-1 Report-Msgid-Bugs-To: POT-Creation-Date: 2010-07-01 14:33+0200 PO-Revision-Date: 2010-07-01 14:30+0200 Last-Translator: Patrick Samson Language-Team: Français MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Un utilisateur avec ce nom existe déjà.Active les utilisateursAdresse courrielJ'ai lu et accepté les Conditions Générales d'UtilisationMot de passeMot de passe (vérification)Envoie à nouveau les courriels d'activationL'inscription avec adresse courriel de compte gratuit est interdite. Veuillez en indiquer une autre.Les deux mots de passe ne correspondent pas.Cette adresse courriel est déjà utilisée. Veuillez en indiquer une autre.Cette valeur ne doit contenir que des lettres, chiffres et tirets bas.Nom d'utilisateurVous devez accepter les conditions d'utilisation pour vous inscrireclé d'activationprofil d'inscriptionprofils d'inscriptionutilisateur././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1600671777.0 django-registration-3.3/src/django_registration/locale/fr/LC_MESSAGES/django.po0000644000076700000240000000701100000000000026375 0ustar00jamesstaff# django-registration French translation. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the django-registration package. # Samuel Adam , 2007. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: django-registration 0.8 alpha-1 \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-01 14:33+0200\n" "PO-Revision-Date: 2010-07-01 14:30+0200\n" "Last-Translator: Patrick Samson \n" "Language-Team: Français \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: .\admin.py:23 msgid "Activate users" msgstr "Active les utilisateurs" #: .\admin.py:43 msgid "Re-send activation emails" msgstr "Envoie à nouveau les courriels d'activation" #: .\forms.py:35 msgid "Username" msgstr "Nom d'utilisateur" #: .\forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "Cette valeur ne doit contenir que des lettres, chiffres et tirets bas." #: .\forms.py:39 msgid "Email address" msgstr "Adresse courriel" #: .\forms.py:41 msgid "Password" msgstr "Mot de passe" #: .\forms.py:43 msgid "Password (again)" msgstr "Mot de passe (vérification)" #: .\forms.py:55 msgid "A user with that username already exists." msgstr "Un utilisateur avec ce nom existe déjà." #: .\forms.py:67 msgid "The two password fields didn't match." msgstr "Les deux mots de passe ne correspondent pas." #: .\forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "J'ai lu et accepté les Conditions Générales d'Utilisation" #: .\forms.py:79 msgid "You must agree to the terms to register" msgstr "Vous devez accepter les conditions d'utilisation pour vous inscrire" #: .\forms.py:95 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "Cette adresse courriel est déjà utilisée. Veuillez en indiquer une autre." #: .\forms.py:122 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" "L'inscription avec adresse courriel de compte gratuit est interdite. " "Veuillez en indiquer une autre." #: .\models.py:165 msgid "user" msgstr "utilisateur" #: .\models.py:166 msgid "activation key" msgstr "clé d'activation" #: .\models.py:171 msgid "registration profile" msgstr "profil d'inscription" #: .\models.py:172 msgid "registration profiles" msgstr "profils d'inscription" #: backends/activation/views.py:115 msgid "The account you tried to activate has already been activated." msgstr "Le compte que vous essayez d'activer a déjà été activé." #: backends/activation/views.py:117 msgid "The account you attempted to activate is invalid." msgstr "Le compte que vous essayez d'activer n'est pas valide." #: backends/activation/views.py:118 msgid "This account has expired." msgstr "Ce compte a expiré." #: backends/activation/views.py:119 msgid "The activation key you provided is invalid." msgstr "La clé d'activation fournie n'est pas valide." #: validators.py:16 msgid "This name cannot be registered. Please choose a different name." msgstr "Ce nom ne peut être enregistré. Veuillez en choisir un différent." #: validators.py:18 msgid "" "This email address cannot be registered. Please supply a different email " "address." msgstr "" "Cette adresse courriel ne peut être enregistrée. Veuillez en indiquer une autre." #: validators.py:29 msgid "This name is reserved and cannot be registered." msgstr "Ce nom est réservé et ne peut être enregistré." ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4281209 django-registration-3.3/src/django_registration/locale/he/0000755000076700000240000000000000000000000022774 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4609768 django-registration-3.3/src/django_registration/locale/he/LC_MESSAGES/0000755000076700000240000000000000000000000024561 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/he/LC_MESSAGES/django.mo0000644000076700000240000000355000000000000026363 0ustar00jamesstaffx-y_N6V;') *8ARg}*1tg]:e-f9 3 MX   I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: registration Report-Msgid-Bugs-To: POT-Creation-Date: 2008-02-10 02:01+0200 PO-Revision-Date: 2008-02-10 02:05+0200 Last-Translator: Meir Kriheli Language-Team: Hebrew MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bitקראתי והסכמתי לתנאי השימושהרישום בעזרת תיבת דואר אלקטרוני חינמית אסור. נא לספק כתובת אחרת.כתובת הדואר האלקטרוני תפוסה כבר. נא לספק כתובת דואר אחרת.שם המשתמש תפוס כבר. נא לבחור אחר.שמות משתמש יכולים להכיל רק אותיות, ספרות וקווים תחתוניםעליך להסכים לתנאי השימושיש להקליד את אותה הסיסמה פעמייםמפתח הפעלהדואר אלקטרוניסיסמהסיסמה (שוב)פרופיל רישוםפרופילי רישוםמשתמששם משתמש././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/he/LC_MESSAGES/django.po0000644000076700000240000000440100000000000026362 0ustar00jamesstaff# translation of registration. # Copyright (C) 2008 THE registration'S COPYRIGHT HOLDER # This file is distributed under the same license as the registration package. # <>, 2008. # , fuzzy # <>, 2008. # # msgid "" msgstr "" "Project-Id-Version: registration\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-02-10 02:01+0200\n" "PO-Revision-Date: 2008-02-10 02:05+0200\n" "Last-Translator: Meir Kriheli \n" "Language-Team: Hebrew\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit" #: forms.py:38 msgid "username" msgstr "שם משתמש" #: forms.py:41 msgid "email address" msgstr "דואר אלקטרוני" #: forms.py:43 msgid "password" msgstr "סיסמה" #: forms.py:45 msgid "password (again)" msgstr "סיסמה (שוב)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "שמות משתמש יכולים להכיל רק אותיות, ספרות וקווים תחתונים" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "שם המשתמש תפוס כבר. נא לבחור אחר." #: forms.py:64 msgid "You must type the same password each time" msgstr "יש להקליד את אותה הסיסמה פעמיים" #: forms.py:93 msgid "I have read and agree to the Terms of Service" msgstr "קראתי והסכמתי לתנאי השימוש" #: forms.py:102 msgid "You must agree to the terms to register" msgstr "עליך להסכים לתנאי השימוש" #: forms.py:121 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "" "כתובת הדואר האלקטרוני תפוסה כבר. נא לספק כתובת דואר אחרת." #: forms.py:146 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" "הרישום בעזרת תיבת דואר אלקטרוני חינמית אסור. נא לספק כתובת אחרת." #: models.py:188 msgid "user" msgstr "משתמש" #: models.py:189 msgid "activation key" msgstr "מפתח הפעלה" #: models.py:194 msgid "registration profile" msgstr "פרופיל רישום" #: models.py:195 msgid "registration profiles" msgstr "פרופילי רישום" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4284616 django-registration-3.3/src/django_registration/locale/hr/0000755000076700000240000000000000000000000023011 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4615705 django-registration-3.3/src/django_registration/locale/hr/LC_MESSAGES/0000755000076700000240000000000000000000000024576 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/hr/LC_MESSAGES/django.mo0000644000076700000240000000362300000000000026401 0ustar00jamesstaff<) -&/@_Z%N>/'nU!4V j/w"kPLp?;9Mcz    A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.You must agree to the terms to registeractivation keyregistration profileregistration profilesuserusernameProject-Id-Version: 0.8.1beta Report-Msgid-Bugs-To: POT-Creation-Date: 2010-12-01 14:09-0500 PO-Revision-Date: 2010-12-01 15:49+0100 Last-Translator: Enis Afgan Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Croatian X-Poedit-Country: CROATIA Ovo korisničko ime već postoji.Aktiviraj korisnikeEmail adresaPročitao sam i slažem se s uvijetima uporabe.LozinkaLozinka (ponovno)Ponovno pošlji aktivacijski emailRegistracija gdje se koristi besplati email servis nije dopuštena. Molimo da koristite drugu email adresu.Oba polja za lozinku nisu ista.Ova email adresa je već korištena. Molimo da koristite drugu email adresu.Ova vrijednost mora sadržavati samo slova, brojeve i podvlake.Morate se složiti sa uvijetima uporabe prije registracije.Aktivacijski ključRegistracijski profilRegistracijski profiliKorisnikKorisničko ime././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/hr/LC_MESSAGES/django.po0000644000076700000240000000443100000000000026402 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: 0.8.1beta\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-01 14:09-0500\n" "PO-Revision-Date: 2010-12-01 15:49+0100\n" "Last-Translator: Enis Afgan \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Croatian\n" "X-Poedit-Country: CROATIA\n" #: admin.py:23 msgid "Activate users" msgstr "Aktiviraj korisnike" #: admin.py:43 msgid "Re-send activation emails" msgstr "Ponovno pošlji aktivacijski email" #: forms.py:35 msgid "username" msgstr "Korisničko ime" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "Ova vrijednost mora sadržavati samo slova, brojeve i podvlake." #: forms.py:39 msgid "Email address" msgstr "Email adresa" #: forms.py:41 msgid "Password" msgstr "Lozinka" #: forms.py:43 msgid "Password (again)" msgstr "Lozinka (ponovno)" #: forms.py:55 msgid "A user with that username already exists." msgstr "Ovo korisničko ime već postoji." #: forms.py:67 msgid "The two password fields didn't match." msgstr "Oba polja za lozinku nisu ista." #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "Pročitao sam i slažem se s uvijetima uporabe." #: forms.py:79 msgid "You must agree to the terms to register" msgstr "Morate se složiti sa uvijetima uporabe prije registracije." #: forms.py:95 msgid "This email address is already in use. Please supply a different email address." msgstr "Ova email adresa je već korištena. Molimo da koristite drugu email adresu." #: forms.py:122 msgid "Registration using free email addresses is prohibited. Please supply a different email address." msgstr "Registracija gdje se koristi besplati email servis nije dopuštena. Molimo da koristite drugu email adresu." #: models.py:165 msgid "user" msgstr "Korisnik" #: models.py:166 msgid "activation key" msgstr "Aktivacijski ključ" #: models.py:171 msgid "registration profile" msgstr "Registracijski profil" #: models.py:172 msgid "registration profiles" msgstr "Registracijski profili"././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.428784 django-registration-3.3/src/django_registration/locale/is/0000755000076700000240000000000000000000000023013 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4622452 django-registration-3.3/src/django_registration/locale/is/LC_MESSAGES/0000755000076700000240000000000000000000000024600 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/is/LC_MESSAGES/django.mo0000644000076700000240000000270400000000000026402 0ustar00jamesstaffH-I_wN6&)] 8'0MXG@!/Qa is    I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.You must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2009-01-22 12:49+0100 PO-Revision-Date: 2009-01-22 12:49+0100 Last-Translator: Björn Kristinsson Language-Team: Icelandic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ég hef lesið og samþykki skilmálanaÓheimilt er að nota ókeypis netföng. Vinsamlegast notaðu annað netfang.Þetta netfang er þegar á skrá. Vinsamlegast notaðu annað netfang.Þetta notendanafn er þegar á skrá. Vinsamlega reyndu annað.Lykilorðin verða að vera eins einkennislykillnetfanglykilorðlykilorð (aftur)skráningarprófíllskráningarprófílarnotandinotandanafn././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/is/LC_MESSAGES/django.po0000644000076700000240000000355300000000000026410 0ustar00jamesstaff# Icelandic translation of django-registration # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the django-registration # package. # Björn Kristinsson , 2009. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-01-22 12:49+0100\n" "PO-Revision-Date: 2009-01-22 12:49+0100\n" "Last-Translator: Björn Kristinsson \n" "Language-Team: Icelandic\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: forms.py:36 msgid "username" msgstr "notandanafn" #: forms.py:39 msgid "email address" msgstr "netfang" #: forms.py:41 msgid "password" msgstr "lykilorð" #: forms.py:43 msgid "password (again)" msgstr "lykilorð (aftur)" #: forms.py:55 msgid "This username is already taken. Please choose another." msgstr "Þetta notendanafn er þegar á skrá. Vinsamlega reyndu annað." #: forms.py:67 msgid "You must type the same password each time" msgstr "Lykilorðin verða að vera eins " #: forms.py:90 msgid "I have read and agree to the Terms of Service" msgstr "Ég hef lesið og samþykki skilmálana" #: forms.py:107 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "Þetta netfang er þegar á skrá. Vinsamlegast notaðu annað netfang." #: forms.py:133 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "Óheimilt er að nota ókeypis netföng. Vinsamlegast notaðu annað netfang." #: models.py:218 msgid "user" msgstr "notandi" #: models.py:219 msgid "activation key" msgstr "einkennislykill" #: models.py:224 msgid "registration profile" msgstr "skráningarprófíll" #: models.py:225 msgid "registration profiles" msgstr "skráningarprófílar" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4291332 django-registration-3.3/src/django_registration/locale/it/0000755000076700000240000000000000000000000023014 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.462931 django-registration-3.3/src/django_registration/locale/it/LC_MESSAGES/0000755000076700000240000000000000000000000024601 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/it/LC_MESSAGES/django.mo0000644000076700000240000000375500000000000026412 0ustar00jamesstaff<) -&/@_Z%N>/n'w! ?/`M$JC b/n     A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.UsernameYou must agree to the terms to registeractivation keyregistration profileregistration profilesuserProject-Id-Version: django-registration 0.8 alpha-1 Report-Msgid-Bugs-To: POT-Creation-Date: 2010-07-01 14:33+0200 PO-Revision-Date: 2011-08-04 12:41-0600 Last-Translator: Flavio Curella Language-Team: Italiano MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Poedit-Language: Italian X-Poedit-Country: ITALY Questo nome utente è già usato.Attiva utentiindirizzo emailDichiaro di aver letto e di approvare le Condizioni di ServizioPasswordPassword (di nuovo)Re-invia email di attivazioneLa registrazione con indirizzi email gratis non è permessa. Inserisci un altro indirizzo email.Le password inserite non coincidono.Questo indirizzo email è già in uso. Inserisci un altro indirizzo email.Questo valore può contenere solo lettere, numeri e sottolineature.Nome utentePer registrarsi bisogna approvare le condizionichiave di attivazioneprofilo di registrazioneprofili di registrazioneutente././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/it/LC_MESSAGES/django.po0000644000076700000240000000473500000000000026414 0ustar00jamesstaff# translation of django.po to Italian # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Nicola Larosa , 2008. # Flavio Curella , 2011 msgid "" msgstr "" "Project-Id-Version: django-registration 0.8 alpha-1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-07-01 14:33+0200\n" "PO-Revision-Date: 2011-08-04 12:41-0600\n" "Last-Translator: Flavio Curella \n" "Language-Team: Italiano \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" "X-Poedit-Language: Italian\n" "X-Poedit-Country: ITALY\n" #: .\admin.py:23 msgid "Activate users" msgstr "Attiva utenti" #: .\admin.py:43 msgid "Re-send activation emails" msgstr "Re-invia email di attivazione" #: .\forms.py:35 msgid "Username" msgstr "Nome utente" #: .\forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "Questo valore può contenere solo lettere, numeri e sottolineature." #: .\forms.py:39 msgid "Email address" msgstr "indirizzo email" #: .\forms.py:41 msgid "Password" msgstr "Password" #: .\forms.py:43 msgid "Password (again)" msgstr "Password (di nuovo)" #: .\forms.py:55 msgid "A user with that username already exists." msgstr "Questo nome utente è già usato." #: .\forms.py:67 msgid "The two password fields didn't match." msgstr "Le password inserite non coincidono." #: .\forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "Dichiaro di aver letto e di approvare le Condizioni di Servizio" #: .\forms.py:79 msgid "You must agree to the terms to register" msgstr "Per registrarsi bisogna approvare le condizioni" #: .\forms.py:95 msgid "This email address is already in use. Please supply a different email address." msgstr "Questo indirizzo email è già in uso. Inserisci un altro indirizzo email." #: .\forms.py:122 msgid "Registration using free email addresses is prohibited. Please supply a different email address." msgstr "La registrazione con indirizzi email gratis non è permessa. Inserisci un altro indirizzo email." #: .\models.py:165 msgid "user" msgstr "utente" #: .\models.py:166 msgid "activation key" msgstr "chiave di attivazione" #: .\models.py:171 msgid "registration profile" msgstr "profilo di registrazione" #: .\models.py:172 msgid "registration profiles" msgstr "profili di registrazione" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4295013 django-registration-3.3/src/django_registration/locale/ja/0000755000076700000240000000000000000000000022772 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4637647 django-registration-3.3/src/django_registration/locale/ja/LC_MESSAGES/0000755000076700000240000000000000000000000024557 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/ja/LC_MESSAGES/django.mo0000644000076700000240000000376300000000000026367 0ustar00jamesstaffx-y_N6V;') *8ARg}F6 uf TqE< !Ik     I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: django-registration 0.4 Report-Msgid-Bugs-To: POT-Creation-Date: 2007-09-19 19:30-0500 PO-Revision-Date: 2008-01-31 10:20+0900 Last-Translator: Shinya Okano Language-Team: Japanese MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit サービス利用規約を読み、同意します。自由なメールアドレスを使用した登録は禁止されています。他のメールアドレスを指定してください。このメールアドレスは既に使用されています。他のメールアドレスを指定して下さい。このユーザ名は既に使用されています。他のユーザ名を指定してください。ユーザ名には半角英数とアンダースコアのみが使用できます。登録するためには規約に同意する必要があります。同じパスワードを入力する必要があります。アクティベーションキーメールアドレスパスワードパスワード (確認)登録プロファイル登録プロファイルユーザユーザ名././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/ja/LC_MESSAGES/django.po0000644000076700000240000000457100000000000026370 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Shinya Okano , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: django-registration 0.4 \n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-19 19:30-0500\n" "PO-Revision-Date: 2008-01-31 10:20+0900\n" "Last-Translator: Shinya Okano \n" "Language-Team: Japanese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: forms.py:38 msgid "username" msgstr "ユーザ名" #: forms.py:41 msgid "email address" msgstr "メールアドレス" #: forms.py:43 msgid "password" msgstr "パスワード" #: forms.py:45 msgid "password (again)" msgstr "パスワード (確認)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "ユーザ名には半角英数とアンダースコアのみが使用できます。" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "このユーザ名は既に使用されています。他のユーザ名を指定してください。" #: forms.py:68 msgid "You must type the same password each time" msgstr "同じパスワードを入力する必要があります。" #: forms.py:96 msgid "I have read and agree to the Terms of Service" msgstr "サービス利用規約を読み、同意します。" #: forms.py:105 msgid "You must agree to the terms to register" msgstr "登録するためには規約に同意する必要があります。" #: forms.py:124 msgid "This email address is already in use. Please supply a different email address." msgstr "このメールアドレスは既に使用されています。他のメールアドレスを指定して下さい。" #: forms.py:149 msgid "Registration using free email addresses is prohibited. Please supply a different email address." msgstr "自由なメールアドレスを使用した登録は禁止されています。他のメールアドレスを指定してください。" #: models.py:188 msgid "user" msgstr "ユーザ" #: models.py:189 msgid "activation key" msgstr "アクティベーションキー" #: models.py:194 msgid "registration profile" msgstr "登録プロファイル" #: models.py:195 msgid "registration profiles" msgstr "登録プロファイル" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4297903 django-registration-3.3/src/django_registration/locale/ko/0000755000076700000240000000000000000000000023011 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4647207 django-registration-3.3/src/django_registration/locale/ko/LC_MESSAGES/0000755000076700000240000000000000000000000024576 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1617253201.0 django-registration-3.3/src/django_registration/locale/ko/LC_MESSAGES/django.mo0000644000076700000240000000375600000000000026410 0ustar00jamesstaff 0)1-[_1=+YQN?@/'B24dg?% ?2$rPON8=(   A user with that username already exists.I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.The account you attempted to activate is invalid.The account you tried to activate has already been activated.The activation key you provided is invalid.This account has expired.This email address cannot be registered. Please supply a different email address.This email address is already in use. Please supply a different email address.This name cannot be registered. Please choose a different name.This name is reserved and cannot be registered.You must agree to the terms to registerProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Sam Kim Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 이미 같은 아이디로 사용자가 등록되어 있습니다.약관을 읽었고 그 내용에 동의합니다.무료 이메일 계정으로 등록하실 수 없습니다.다른 이메일을 등록해 주세요.유효하지 않은 계정을 활성화 하려고 했습니다.이미 활성화 된 계정입니다.당신이 제공한 활성화 키는 유효하지 않습니다.이 계정은 만료되었습니다.이메일이 등록될 수 없습니다. 다른 이메일을 사용해주세요.이메일이 이미 사용중입니다. 다른 이메일을 등록해주세요.이 이름은 등록될 수 없습니다. 다른 이름을 사용해주세요.이 이름은 이미 예약되어 등록될 수 없습니다.약관에 동의 하셔야만 합니다.././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1617253201.0 django-registration-3.3/src/django_registration/locale/ko/LC_MESSAGES/django.po0000644000076700000240000000503400000000000026402 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Young Gyu Park , 2009. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2020-12-18 17:55+0900\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Sam Kim \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: .\backends\activation\views.py:114 msgid "The account you tried to activate has already been activated." msgstr "이미 활성화 된 계정입니다." #: .\backends\activation\views.py:116 msgid "The account you attempted to activate is invalid." msgstr "유효하지 않은 계정을 활성화 하려고 했습니다." #: .\backends\activation\views.py:117 msgid "This account has expired." msgstr "이 계정은 만료되었습니다." #: .\backends\activation\views.py:118 msgid "The activation key you provided is invalid." msgstr "당신이 제공한 활성화 키는 유효하지 않습니다." #: .\forms.py:90 msgid "I have read and agree to the Terms of Service" msgstr "약관을 읽었고 그 내용에 동의합니다." #: .\validators.py:15 msgid "This name cannot be registered. Please choose a different name." msgstr "이 이름은 등록될 수 없습니다. 다른 이름을 사용해주세요." #: .\validators.py:17 msgid "" "This email address cannot be registered. Please supply a different email " "address." msgstr "이메일이 등록될 수 없습니다. 다른 이메일을 사용해주세요." #: .\validators.py:21 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "이메일이 이미 사용중입니다. 다른 이메일을 등록해주세요." #: .\validators.py:23 msgid "A user with that username already exists." msgstr "이미 같은 아이디로 사용자가 등록되어 있습니다." #: .\validators.py:25 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "무료 이메일 계정으로 등록하실 수 없습니다.다른 이메일을 등록해 주세요." #: .\validators.py:28 msgid "This name is reserved and cannot be registered." msgstr "이 이름은 이미 예약되어 등록될 수 없습니다." #: .\validators.py:29 msgid "You must agree to the terms to register" msgstr "약관에 동의 하셔야만 합니다." ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4300427 django-registration-3.3/src/django_registration/locale/nb/0000755000076700000240000000000000000000000022777 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4655397 django-registration-3.3/src/django_registration/locale/nb/LC_MESSAGES/0000755000076700000240000000000000000000000024564 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/nb/LC_MESSAGES/django.mo0000644000076700000240000000354300000000000026370 0ustar00jamesstaff<) -&/@_Z%N>/n'wB9![ k#y^"-PPB /2F\     A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.UsernameYou must agree to the terms to registeractivation keyregistration profileregistration profilesuserProject-Id-Version: django-registration 0.8 Report-Msgid-Bugs-To: POT-Creation-Date: 2010-12-15 21:37+0100 PO-Revision-Date: 2010-12-15 21:37+0100 Last-Translator: jonklo Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Det eksisterer allerede en bruker med dette brukernavnet.Aktiver brukereE-postadresseJeg har lest og godtar betingelsenePassordPassord (gjenta)Send ny aktiveringsmailRegistrering med gratis e-postadresse er ikke tillatt. Vennligst oppgi en annen e-postadresse.De to passordfeltene er ikke like.Denne e-postadressen er allerede i bruk. Vennligst oppgi en annen e-postadresse.Dette feltet kan bare inneholde bokstaver, nummer og understreker.BrukernavnDu må godta betingelsene for å registrere degaktiveringsnøkkelregistrasjonsprofilregistrasjonsprofilerbruker././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/nb/LC_MESSAGES/django.po0000644000076700000240000000437700000000000026401 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # jonklo , 2010. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: django-registration 0.8\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-12-15 21:37+0100\n" "PO-Revision-Date: 2010-12-15 21:37+0100\n" "Last-Translator: jonklo \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.py:23 msgid "Activate users" msgstr "Aktiver brukere" #: admin.py:43 msgid "Re-send activation emails" msgstr "Send ny aktiveringsmail" #: forms.py:35 msgid "Username" msgstr "Brukernavn" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "Dette feltet kan bare inneholde bokstaver, nummer og understreker." #: forms.py:39 msgid "Email address" msgstr "E-postadresse" #: forms.py:41 msgid "Password" msgstr "Passord" #: forms.py:43 msgid "Password (again)" msgstr "Passord (gjenta)" #: forms.py:55 msgid "A user with that username already exists." msgstr "Det eksisterer allerede en bruker med dette brukernavnet." #: forms.py:67 msgid "The two password fields didn't match." msgstr "De to passordfeltene er ikke like." #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "Jeg har lest og godtar betingelsene" #: forms.py:79 msgid "You must agree to the terms to register" msgstr "Du må godta betingelsene for å registrere deg" #: forms.py:95 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "Denne e-postadressen er allerede i bruk. Vennligst oppgi en annen " "e-postadresse." #: forms.py:122 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "Registrering med gratis e-postadresse er ikke tillatt. Vennligst " "oppgi en annen e-postadresse." #: models.py:168 msgid "user" msgstr "bruker" #: models.py:169 msgid "activation key" msgstr "aktiveringsnøkkel" #: models.py:174 msgid "registration profile" msgstr "registrasjonsprofil" #: models.py:175 msgid "registration profiles" msgstr "registrasjonsprofiler" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4302948 django-registration-3.3/src/django_registration/locale/nl/0000755000076700000240000000000000000000000023011 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.466411 django-registration-3.3/src/django_registration/locale/nl/LC_MESSAGES/0000755000076700000240000000000000000000000024576 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/nl/LC_MESSAGES/django.mo0000644000076700000240000000355200000000000026402 0ustar00jamesstaffx-y_N6V;') *8ARg}c3b#QWM0B~,   )< Q[   I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: registration Report-Msgid-Bugs-To: POT-Creation-Date: 2008-08-14 13:25+0200 PO-Revision-Date: 2008-08-14 13:25+0200 Last-Translator: Joost Cassee Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); Ik heb de servicevoorwaarden gelezen en ga akkoord.U kunt u niet registreren met een gratis e-mail adres. Kiest u alstublieft een ander e-mail adres.Dit e-mail adres is reeds in gebruik. Kiest u alstublieft een ander e-mail adres.Deze gebruikersnaam is reeds in gebruik. Kiest u alstublieft een andere gebruikersnaam.Gebruikersnamen kunnen alleen letters, nummer en liggende streepjes bevatten.U moet akkoord gaan met de servicevoorwaarden om u te registreren.U moet twee maal hetzelfde wachtwoord typen.activatiecodee-mail adreswachtwoordwachtwoord (opnieuw)registratieprofielregistratieprofielengebruikergebruikersnaam././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/nl/LC_MESSAGES/django.po0000644000076700000240000000434700000000000026410 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: registration\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-08-14 13:25+0200\n" "PO-Revision-Date: 2008-08-14 13:25+0200\n" "Last-Translator: Joost Cassee \n" "Language-Team: LANGUAGE \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" #: forms.py:38 msgid "username" msgstr "gebruikersnaam" #: forms.py:41 msgid "email address" msgstr "e-mail adres" #: forms.py:43 msgid "password" msgstr "wachtwoord" #: forms.py:45 msgid "password (again)" msgstr "wachtwoord (opnieuw)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "Gebruikersnamen kunnen alleen letters, nummer en liggende streepjes bevatten." #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "Deze gebruikersnaam is reeds in gebruik. Kiest u alstublieft een andere gebruikersnaam." #: forms.py:71 msgid "You must type the same password each time" msgstr "U moet twee maal hetzelfde wachtwoord typen." #: forms.py:100 msgid "I have read and agree to the Terms of Service" msgstr "Ik heb de servicevoorwaarden gelezen en ga akkoord." #: forms.py:109 msgid "You must agree to the terms to register" msgstr "U moet akkoord gaan met de servicevoorwaarden om u te registreren." #: forms.py:125 msgid "This email address is already in use. Please supply a different email address." msgstr "Dit e-mail adres is reeds in gebruik. Kiest u alstublieft een ander e-mail adres." #: forms.py:151 msgid "Registration using free email addresses is prohibited. Please supply a different email address." msgstr "U kunt u niet registreren met een gratis e-mail adres. Kiest u alstublieft een ander e-mail adres." #: models.py:191 msgid "user" msgstr "gebruiker" #: models.py:192 msgid "activation key" msgstr "activatiecode" #: models.py:197 msgid "registration profile" msgstr "registratieprofiel" #: models.py:198 msgid "registration profiles" msgstr "registratieprofielen" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.430764 django-registration-3.3/src/django_registration/locale/pl/0000755000076700000240000000000000000000000023013 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4672065 django-registration-3.3/src/django_registration/locale/pl/LC_MESSAGES/0000755000076700000240000000000000000000000024600 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/pl/LC_MESSAGES/django.mo0000644000076700000240000000335100000000000026401 0ustar00jamesstaffx-y_N6V;') *8ARg}1'_>E7L7 *Al ~    I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: 0.4 Report-Msgid-Bugs-To: POT-Creation-Date: 2007-09-19 19:30-0500 PO-Revision-Date: 2007-12-15 12:45+0100 Last-Translator: Jarek Zgoda Language-Team: Polish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Przeczytałem regulamin i akceptuję goNie ma możliwości rejestracji przy użyciu darmowego adresu email. Użyj innego adresu email.Ten adres email jest już używany. Użyj innego adresu email.Ta nazwa użytkownika jest już zajęta. Wybierz inną.Nazwa użytkownika może zawierać tylko litery, cyfry i znaki podkreśleniaMusisz zaakceptować regulamin, aby się zarejestrowaćMusisz wpisać to samo hasło w obu polachklucz aktywacyjnyadres emailhasłohasło (ponownie)profil rejestracjiprofile rejestracjiużytkowniknazwa użytkownika././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/pl/LC_MESSAGES/django.po0000644000076700000240000000424500000000000026407 0ustar00jamesstaff# Polish translation for django-registration. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the django-registration package. # Jarek Zgoda , 2007. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: 0.4\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-19 19:30-0500\n" "PO-Revision-Date: 2007-12-15 12:45+0100\n" "Last-Translator: Jarek Zgoda \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: forms.py:38 msgid "username" msgstr "nazwa użytkownika" #: forms.py:41 msgid "email address" msgstr "adres email" #: forms.py:43 msgid "password" msgstr "hasło" #: forms.py:45 msgid "password (again)" msgstr "hasło (ponownie)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "" "Nazwa użytkownika może zawierać tylko litery, cyfry i znaki podkreślenia" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "Ta nazwa użytkownika jest już zajęta. Wybierz inną." #: forms.py:68 msgid "You must type the same password each time" msgstr "Musisz wpisać to samo hasło w obu polach" #: forms.py:96 msgid "I have read and agree to the Terms of Service" msgstr "Przeczytałem regulamin i akceptuję go" #: forms.py:105 msgid "You must agree to the terms to register" msgstr "Musisz zaakceptować regulamin, aby się zarejestrować" #: forms.py:124 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "Ten adres email jest już używany. Użyj innego adresu email." #: forms.py:149 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" "Nie ma możliwości rejestracji przy użyciu darmowego adresu email. Użyj " "innego adresu email." #: models.py:188 msgid "user" msgstr "użytkownik" #: models.py:189 msgid "activation key" msgstr "klucz aktywacyjny" #: models.py:194 msgid "registration profile" msgstr "profil rejestracji" #: models.py:195 msgid "registration profiles" msgstr "profile rejestracji" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4311607 django-registration-3.3/src/django_registration/locale/pt/0000755000076700000240000000000000000000000023023 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4679842 django-registration-3.3/src/django_registration/locale/pt/LC_MESSAGES/0000755000076700000240000000000000000000000024610 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/pt/LC_MESSAGES/django.mo0000644000076700000240000000354700000000000026420 0ustar00jamesstaff<) -&/@_Z%N>/n'wB9![o.uR!3LU@ 5$8J \     A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.UsernameYou must agree to the terms to registeractivation keyregistration profileregistration profilesuserProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2010-03-26 10:54+0000 PO-Revision-Date: 2011-01-24 12:20+0000 Last-Translator: Nuno Mariz Language-Team: Nuno Mariz MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Um utilizador com o mesmo nome já se encontra registado.Ativar utilizadoresEmailEu li e concordo com as Condiçoes de ServiçoPasswordPassword (novamente)Reenviar emails de ativaçãoO registo com emails gratuitos é proibido. Por favor forneça um email diferente.As duas passwords não coincidem.Este email já se encontra registado. Por favor forneça um email diferente.Este valor apenas deverá conter letras, números e underscores.UtilizadorDeverá concordar com as condições para se registarchave de ativaçãoperfil de registoperfis de registoutilizador././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/pt/LC_MESSAGES/django.po0000644000076700000240000000436200000000000026417 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-03-26 10:54+0000\n" "PO-Revision-Date: 2011-01-24 12:20+0000\n" "Last-Translator: Nuno Mariz \n" "Language-Team: Nuno Mariz \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.py:23 msgid "Activate users" msgstr "Ativar utilizadores" #: admin.py:43 msgid "Re-send activation emails" msgstr "Reenviar emails de ativação" #: forms.py:35 msgid "Username" msgstr "Utilizador" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "Este valor apenas deverá conter letras, números e underscores." #: forms.py:39 msgid "Email address" msgstr "Email" #: forms.py:41 msgid "Password" msgstr "Password" #: forms.py:43 msgid "Password (again)" msgstr "Password (novamente)" #: forms.py:55 msgid "A user with that username already exists." msgstr "Um utilizador com o mesmo nome já se encontra registado." #: forms.py:67 msgid "The two password fields didn't match." msgstr "As duas passwords não coincidem." #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "Eu li e concordo com as Condiçoes de Serviço" #: forms.py:79 msgid "You must agree to the terms to register" msgstr "Deverá concordar com as condições para se registar" #: forms.py:95 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "Este email já se encontra registado. Por favor forneça um email diferente." #: forms.py:122 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "O registo com emails gratuitos é proibido. Por favor forneça um email diferente." #: models.py:168 msgid "user" msgstr "utilizador" #: models.py:169 msgid "activation key" msgstr "chave de ativação" #: models.py:174 msgid "registration profile" msgstr "perfil de registo" #: models.py:175 msgid "registration profiles" msgstr "perfis de registo" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4314759 django-registration-3.3/src/django_registration/locale/pt_BR/0000755000076700000240000000000000000000000023406 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4686952 django-registration-3.3/src/django_registration/locale/pt_BR/LC_MESSAGES/0000755000076700000240000000000000000000000025173 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/pt_BR/LC_MESSAGES/django.mo0000644000076700000240000000340400000000000026773 0ustar00jamesstaff h-i_N6F;}')  (9Ndi5r2n]J;D4)1^  I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspassword (again)registration profileregistration profilesuserusernameProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2007-09-19 19:30-0500 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eu lí e concordo com os Termos de Uso do serviçoRegistrar-se com contas de email gratuitos está proibido. Por favor, informe um endereço de email diferente.Este endereço de email já está em uso. Por favor, informe um endereço de email diferente.Este nome de usuário já existe. Por favor, escolha outro.Nomes de usuário apenas podem conter letras, números, e underscoreVocê deve concordar com os termos para registrar-seVocê deve escrever a mesma senha nos dois camposchave de ativaçãoendereço de emailsenha (novamente)profile de registroprofiles de registrousuáriousuário././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/pt_BR/LC_MESSAGES/django.po0000644000076700000240000000425100000000000026777 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-19 19:30-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: forms.py:38 msgid "username" msgstr "usuário" #: forms.py:41 msgid "email address" msgstr "endereço de email" #: forms.py:43 msgid "password" msgstr "senha" #: forms.py:45 msgid "password (again)" msgstr "senha (novamente)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "Nomes de usuário apenas podem conter letras, números, e underscore" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "Este nome de usuário já existe. Por favor, escolha outro." #: forms.py:68 msgid "You must type the same password each time" msgstr "Você deve escrever a mesma senha nos dois campos" #: forms.py:96 msgid "I have read and agree to the Terms of Service" msgstr "Eu lí e concordo com os Termos de Uso do serviço" #: forms.py:105 msgid "You must agree to the terms to register" msgstr "Você deve concordar com os termos para registrar-se" #: forms.py:124 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "Este endereço de email já está em uso. Por favor, informe um endereço de email diferente." #: forms.py:149 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "Registrar-se com contas de email gratuitos é proibido. Por favor, informe um endereço de email diferente." #: models.py:188 msgid "user" msgstr "usuário" #: models.py:189 msgid "activation key" msgstr "chave de ativação" #: models.py:194 msgid "registration profile" msgstr "perfil de registro" #: models.py:195 msgid "registration profiles" msgstr "perfis de registro" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4320323 django-registration-3.3/src/django_registration/locale/ru/0000755000076700000240000000000000000000000023026 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4695127 django-registration-3.3/src/django_registration/locale/ru/LC_MESSAGES/0000755000076700000240000000000000000000000024613 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/ru/LC_MESSAGES/django.mo0000644000076700000240000000464600000000000026424 0ustar00jamesstaff<) -&/@_Z%N>/n'w5P4e,] %29L8fo4\! '= 'e       A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.UsernameYou must agree to the terms to registeractivation keyregistration profileregistration profilesuserProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2009-10-21 20:12+0600 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: FULL NAME Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Пользователь с таким именем уже существует.Активировать учетные записиАдрес электронной почтыЯ прочитал Правила Использования и согласен с нимиПарольПароль (снова)Выслать ключи активации зановоРегистрация с использованием свободных почтовых серверов запрещена. Пожалуйста, введите другой адрес электронной почты.Введенные пароли не совпадают.Этот адрес электронной почты уже используется. Пожалуйста, введите другой адрес.Это поле может содержать только буквы, цифры и подчеркиванияИмя пользователяДля регистрации Вы должны согласиться с Правиламиключ активациикарточка регистрациикарточки регистрациипользователь././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/ru/LC_MESSAGES/django.po0000644000076700000240000000547500000000000026430 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-10-21 20:12+0600\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.py:23 msgid "Activate users" msgstr "Активировать учетные записи" #: admin.py:43 msgid "Re-send activation emails" msgstr "Выслать ключи активации заново" #: forms.py:35 msgid "Username" msgstr "Имя пользователя" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "Это поле может содержать только буквы, цифры и подчеркивания" #: forms.py:39 msgid "Email address" msgstr "Адрес электронной почты" #: forms.py:41 msgid "Password" msgstr "Пароль" #: forms.py:43 msgid "Password (again)" msgstr "Пароль (снова)" #: forms.py:55 msgid "A user with that username already exists." msgstr "Пользователь с таким именем уже существует." #: forms.py:67 msgid "The two password fields didn't match." msgstr "Введенные пароли не совпадают." #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "Я прочитал Правила Использования и согласен с ними" #: forms.py:79 msgid "You must agree to the terms to register" msgstr "Для регистрации Вы должны согласиться с Правилами" #: forms.py:95 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "" "Этот адрес электронной почты уже используется. Пожалуйста, введите другой " "адрес." #: forms.py:122 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" "Регистрация с использованием свободных почтовых серверов запрещена. " "Пожалуйста, введите другой адрес электронной почты." #: models.py:165 msgid "user" msgstr "пользователь" #: models.py:166 msgid "activation key" msgstr "ключ активации" #: models.py:171 msgid "registration profile" msgstr "карточка регистрации" #: models.py:172 msgid "registration profiles" msgstr "карточки регистрации" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4324427 django-registration-3.3/src/django_registration/locale/sl/0000755000076700000240000000000000000000000023016 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.470099 django-registration-3.3/src/django_registration/locale/sl/LC_MESSAGES/0000755000076700000240000000000000000000000024603 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/sl/LC_MESSAGES/django.mo0000644000076700000240000000354100000000000026405 0ustar00jamesstaff<) -&/@_Z%N>/'nm1L~%QG3d74/ FP    A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.You must agree to the terms to registeractivation keyregistration profileregistration profilesuserusernameProject-Id-Version: 0.8.1beta Report-Msgid-Bugs-To: POT-Creation-Date: 2009-10-12 14:09-0500 PO-Revision-Date: 2011-11-05 21:20+0100 Last-Translator: Marko Mrdjenovic Language-Team: Slovenian MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Poedit-Language: Slovenian X-Poedit-Country: SLOVENIA Uporabnik s tem uporabniškim imenom že obstaja.Aktiviraj uporabnikeE-naslovStrinjam se s pogoji uporabeGesloGeslo (ponovno)Ponovno pošlji aktivacijsko e-poštoRegistracija ni mogoča z brezplačnimi e-naslovi. Prosimo vnesite drug e-naslov.Polji z gesli se ne ujemata.E-naslov je že v uporabi, prosimo vnesite drugega.Vrednost lahko vsebuje samo črke, cifre in podčrtaje.Za registracijo se morate strinjati s pogoji uporabeAktivacijski ključRegistracijski profilRegistracijski profiliUporabnikuporabniško ime././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/sl/LC_MESSAGES/django.po0000644000076700000240000000435100000000000026410 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: 0.8.1beta\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-10-12 14:09-0500\n" "PO-Revision-Date: 2011-11-05 21:20+0100\n" "Last-Translator: Marko Mrdjenovic \n" "Language-Team: Slovenian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-Language: Slovenian\n" "X-Poedit-Country: SLOVENIA\n" #: admin.py:23 msgid "Activate users" msgstr "Aktiviraj uporabnike" #: admin.py:43 msgid "Re-send activation emails" msgstr "Ponovno pošlji aktivacijsko e-pošto" #: forms.py:35 msgid "username" msgstr "uporabniško ime" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "Vrednost lahko vsebuje samo črke, cifre in podčrtaje." #: forms.py:39 msgid "Email address" msgstr "E-naslov" #: forms.py:41 msgid "Password" msgstr "Geslo" #: forms.py:43 msgid "Password (again)" msgstr "Geslo (ponovno)" #: forms.py:55 msgid "A user with that username already exists." msgstr "Uporabnik s tem uporabniškim imenom že obstaja." #: forms.py:67 msgid "The two password fields didn't match." msgstr "Polji z gesli se ne ujemata." #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "Strinjam se s pogoji uporabe" #: forms.py:79 msgid "You must agree to the terms to register" msgstr "Za registracijo se morate strinjati s pogoji uporabe" #: forms.py:95 msgid "This email address is already in use. Please supply a different email address." msgstr "E-naslov je že v uporabi, prosimo vnesite drugega." #: forms.py:122 msgid "Registration using free email addresses is prohibited. Please supply a different email address." msgstr "Registracija ni mogoča z brezplačnimi e-naslovi. Prosimo vnesite drug e-naslov." #: models.py:165 msgid "user" msgstr "Uporabnik" #: models.py:166 msgid "activation key" msgstr "Aktivacijski ključ" #: models.py:171 msgid "registration profile" msgstr "Registracijski profil" #: models.py:172 msgid "registration profiles" msgstr "Registracijski profili" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4327981 django-registration-3.3/src/django_registration/locale/sr/0000755000076700000240000000000000000000000023024 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003100000000000010207 xustar0025 mtime=1653723062.4707 django-registration-3.3/src/django_registration/locale/sr/LC_MESSAGES/0000755000076700000240000000000000000000000024611 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/sr/LC_MESSAGES/django.mo0000644000076700000240000000365600000000000026422 0ustar00jamesstaffx-y_N6V;') *8ARg}3ndK1SME3 FSZj   I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: django-registration trunk Report-Msgid-Bugs-To: POT-Creation-Date: 2008-04-05 13:51+0200 PO-Revision-Date: 2008-04-05 14:00+0100 Last-Translator: Nebojsa Djordjevic Language-Team: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2; X-Poedit-Language: Serbian X-Poedit-Country: YUGOSLAVIA Pročitao sam i slažem se sa uslovima korišćenjaRegistracija korišćenjem besplatnig e-mail adresa je zabranjena. Morate uneti drugu e-mail adresu.Ova e-mail adresa je već u upotrebi. Morate koristiti drugu e-mail adresu.Korisničko ime je već zauzeto. Izaberite drugo.Korisničko ime može da se sastoji samo od slova, brojeva i donje crte ("_")Morate se složiti sa uslovima korišćenja da bi ste se registrovaliUnete šifre se ne slažuaktivacioni ključemail adresašifrašifra (ponovo)registracioni profilregistracioni profilikorisnikkorisničko ime././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/sr/LC_MESSAGES/django.po0000644000076700000240000000446500000000000026424 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: django-registration trunk\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-04-05 13:51+0200\n" "PO-Revision-Date: 2008-04-05 14:00+0100\n" "Last-Translator: Nebojsa Djordjevic \n" "Language-Team: \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<10 || n%100>=20) ? 1 : 2;\n" "X-Poedit-Language: Serbian\n" "X-Poedit-Country: YUGOSLAVIA\n" #: forms.py:38 msgid "username" msgstr "korisničko ime" #: forms.py:41 msgid "email address" msgstr "email adresa" #: forms.py:43 msgid "password" msgstr "šifra" #: forms.py:45 msgid "password (again)" msgstr "šifra (ponovo)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "Korisničko ime može da se sastoji samo od slova, brojeva i donje crte (\"_\")" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "Korisničko ime je već zauzeto. Izaberite drugo." #: forms.py:71 msgid "You must type the same password each time" msgstr "Unete šifre se ne slažu" #: forms.py:100 msgid "I have read and agree to the Terms of Service" msgstr "Pročitao sam i slažem se sa uslovima korišćenja" #: forms.py:109 msgid "You must agree to the terms to register" msgstr "Morate se složiti sa uslovima korišćenja da bi ste se registrovali" #: forms.py:128 msgid "This email address is already in use. Please supply a different email address." msgstr "Ova e-mail adresa je već u upotrebi. Morate koristiti drugu e-mail adresu." #: forms.py:153 msgid "Registration using free email addresses is prohibited. Please supply a different email address." msgstr "Registracija korišćenjem besplatnig e-mail adresa je zabranjena. Morate uneti drugu e-mail adresu." #: models.py:188 msgid "user" msgstr "korisnik" #: models.py:189 msgid "activation key" msgstr "aktivacioni ključ" #: models.py:194 msgid "registration profile" msgstr "registracioni profil" #: models.py:195 msgid "registration profiles" msgstr "registracioni profili" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4331124 django-registration-3.3/src/django_registration/locale/sv/0000755000076700000240000000000000000000000023030 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.471269 django-registration-3.3/src/django_registration/locale/sv/LC_MESSAGES/0000755000076700000240000000000000000000000024615 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/sv/LC_MESSAGES/django.mo0000644000076700000240000000322700000000000026420 0ustar00jamesstaffx-y_N6V;') *8ARg}7$B9+2eF3 4 F S]nu ~    I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2008-03-23 18:59+0100 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: Emil Stenström Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Jag har läst och accepterar avtaletGratis e-postadresser är inte tillåtna, använd en annan adress.Den e-postadressen är upptagen, använd an annan adress.Det användarnamnet är upptaget. Prova ett annat.Användarnamn får bara innehålla bokstäver, siffror och understreckDu måste acceptera avtalet för att registrera digBåda lösenord måste vara likaAktiveringsnyckelE-postadressLösenordLösenord (igen)ProfilProfilerAnvändareAnvändarnamn././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/sv/LC_MESSAGES/django.po0000644000076700000240000000412100000000000026415 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-03-23 18:59+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: Emil Stenström \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: .\forms.py:38 msgid "username" msgstr "Användarnamn" #: .\forms.py:41 msgid "email address" msgstr "E-postadress" #: .\forms.py:43 msgid "password" msgstr "Lösenord" #: .\forms.py:45 msgid "password (again)" msgstr "Lösenord (igen)" #: .\forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "Användarnamn får bara innehålla bokstäver, siffror och understreck" #: .\forms.py:59 msgid "This username is already taken. Please choose another." msgstr "Det användarnamnet är upptaget. Prova ett annat." #: .\forms.py:71 msgid "You must type the same password each time" msgstr "Båda lösenord måste vara lika" #: .\forms.py:100 msgid "I have read and agree to the Terms of Service" msgstr "Jag har läst och accepterar avtalet" #: .\forms.py:109 msgid "You must agree to the terms to register" msgstr "Du måste acceptera avtalet för att registrera dig" #: .\forms.py:128 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "Den e-postadressen är upptagen, använd an annan adress." #: .\forms.py:153 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "Gratis e-postadresser är inte tillåtna, använd en annan adress." #: .\models.py:188 msgid "user" msgstr "Användare" #: .\models.py:189 msgid "activation key" msgstr "Aktiveringsnyckel" #: .\models.py:194 msgid "registration profile" msgstr "Profil" #: .\models.py:195 msgid "registration profiles" msgstr "Profiler" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4333723 django-registration-3.3/src/django_registration/locale/tr_TR/0000755000076700000240000000000000000000000023432 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4718616 django-registration-3.3/src/django_registration/locale/tr_TR/LC_MESSAGES/0000755000076700000240000000000000000000000025217 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/tr_TR/LC_MESSAGES/django.mo0000644000076700000240000000363100000000000027021 0ustar00jamesstaff<) -&/@_Z%N>/n'wI7(` {0*f#cHD0&Wl{      A user with that username already exists.Activate usersEmail addressI have read and agree to the Terms of ServicePasswordPassword (again)Re-send activation emailsRegistration using free email addresses is prohibited. Please supply a different email address.The two password fields didn't match.This email address is already in use. Please supply a different email address.This value must contain only letters, numbers and underscores.UsernameYou must agree to the terms to registeractivation keyregistration profileregistration profilesuserProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2010-11-11 12:48+0200 PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE Last-Translator: RECEP KIRMIZI Language-Team: LANGUAGE Language: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bu kullanıcı adına sahip bir kullanıcı bulunmakta.Kullanıcıları aktive etEposta adresiAnlaşma kurallarını okudum ve kabul ediyorum.ParolaParola (tekrar)Aktivasyon e-postalarını yeniden gönderÜcretsiz eposta adresleri ile kayıt kabul edilmemektedir. Lütfen farklı bir eposta adresi veriniz.İki parola birbiri ile uyuşmadı.Bu eposta adresi kullanımda. Lütfen farklı bir eposta adresi veriniz.Bu alan sadece harfler, numaralar ve alt çizgiler barındırabilir.Kullanıcı adıKayıt olmak için kuralları kabul etmelisiniz.aktivasyon anahtarıkayıt profilikayıt profillerikullanıcı././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/tr_TR/LC_MESSAGES/django.po0000644000076700000240000000446700000000000027034 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-11-11 12:48+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: RECEP KIRMIZI \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: admin.py:23 msgid "Activate users" msgstr "Kullanıcıları aktive et" #: admin.py:43 msgid "Re-send activation emails" msgstr "Aktivasyon e-postalarını yeniden gönder" #: forms.py:35 msgid "Username" msgstr "Kullanıcı adı" #: forms.py:36 msgid "This value must contain only letters, numbers and underscores." msgstr "Bu alan sadece harfler, numaralar ve alt çizgiler barındırabilir." #: forms.py:39 msgid "Email address" msgstr "Eposta adresi" #: forms.py:41 msgid "Password" msgstr "Parola" #: forms.py:43 msgid "Password (again)" msgstr "Parola (tekrar)" #: forms.py:55 msgid "A user with that username already exists." msgstr "Bu kullanıcı adına sahip bir kullanıcı bulunmakta." #: forms.py:67 msgid "The two password fields didn't match." msgstr "İki parola birbiri ile uyuşmadı." #: forms.py:78 msgid "I have read and agree to the Terms of Service" msgstr "Anlaşma kurallarını okudum ve kabul ediyorum." #: forms.py:79 msgid "You must agree to the terms to register" msgstr "Kayıt olmak için kuralları kabul etmelisiniz." #: forms.py:95 msgid "" "This email address is already in use. Please supply a different email " "address." msgstr "Bu eposta adresi kullanımda. Lütfen farklı bir eposta adresi veriniz." #: forms.py:122 msgid "" "Registration using free email addresses is prohibited. Please supply a " "different email address." msgstr "" "Ücretsiz eposta adresleri ile kayıt kabul edilmemektedir. Lütfen farklı bir " "eposta adresi veriniz." #: models.py:168 msgid "user" msgstr "kullanıcı" #: models.py:169 msgid "activation key" msgstr "aktivasyon anahtarı" #: models.py:174 msgid "registration profile" msgstr "kayıt profili" #: models.py:175 msgid "registration profiles" msgstr "kayıt profilleri" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4336238 django-registration-3.3/src/django_registration/locale/zh_CN/0000755000076700000240000000000000000000000023401 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4724345 django-registration-3.3/src/django_registration/locale/zh_CN/LC_MESSAGES/0000755000076700000240000000000000000000000025166 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/zh_CN/LC_MESSAGES/django.mo0000644000076700000240000000320500000000000026765 0ustar00jamesstaffx-y_N6V;') *8ARg}9$PJ;-0$ & 3@G Z gt {   I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2007-09-19 19:30-0500 PO-Revision-Date: 2008-03-20 23:22+0800 Last-Translator: hutuworm Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 我已阅读并同意该服务条款禁止使用免费 Email 地址注册,请提供一个另外的 Email 地址。该 Email 地址已有人使用,请提供一个另外的 Email 地址。该用户名已被占用,请另选一个。用户名只能包含字母、数字和下划线您必须同意注册条款您必须输入两遍同样的密码激活密钥Email 地址密码密码(重复)注册信息注册信息用户用户名././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/zh_CN/LC_MESSAGES/django.po0000644000076700000240000000377500000000000027004 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-19 19:30-0500\n" "PO-Revision-Date: 2008-03-20 23:22+0800\n" "Last-Translator: hutuworm \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: forms.py:38 msgid "username" msgstr "用户名" #: forms.py:41 msgid "email address" msgstr "Email 地址" #: forms.py:43 msgid "password" msgstr "密码" #: forms.py:45 msgid "password (again)" msgstr "密码(重复)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "用户名只能包含字母、数字和下划线" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "该用户名已被占用,请另选一个。" #: forms.py:68 msgid "You must type the same password each time" msgstr "您必须输入两遍同样的密码" #: forms.py:96 msgid "I have read and agree to the Terms of Service" msgstr "我已阅读并同意该服务条款" #: forms.py:105 msgid "You must agree to the terms to register" msgstr "您必须同意注册条款" #: forms.py:124 msgid "This email address is already in use. Please supply a different email address." msgstr "该 Email 地址已有人使用,请提供一个另外的 Email 地址。" #: forms.py:149 msgid "Registration using free email addresses is prohibited. Please supply a different email address." msgstr "禁止使用免费 Email 地址注册,请提供一个另外的 Email 地址。" #: models.py:188 msgid "user" msgstr "用户" #: models.py:189 msgid "activation key" msgstr "激活密钥" #: models.py:194 msgid "registration profile" msgstr "注册信息" #: models.py:195 msgid "registration profiles" msgstr "注册信息" ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4338815 django-registration-3.3/src/django_registration/locale/zh_TW/0000755000076700000240000000000000000000000023433 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4730172 django-registration-3.3/src/django_registration/locale/zh_TW/LC_MESSAGES/0000755000076700000240000000000000000000000025220 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/zh_TW/LC_MESSAGES/django.mo0000644000076700000240000000320500000000000027017 0ustar00jamesstaffx-y_N6V;') *8ARg}9$PJ;-0$ & 3@G Z gt {   I have read and agree to the Terms of ServiceRegistration using free email addresses is prohibited. Please supply a different email address.This email address is already in use. Please supply a different email address.This username is already taken. Please choose another.Usernames can only contain letters, numbers and underscoresYou must agree to the terms to registerYou must type the same password each timeactivation keyemail addresspasswordpassword (again)registration profileregistration profilesuserusernameProject-Id-Version: PACKAGE VERSION Report-Msgid-Bugs-To: POT-Creation-Date: 2007-09-19 19:30-0500 PO-Revision-Date: 2008-03-20 23:22+0800 Last-Translator: hutuworm Language-Team: LANGUAGE MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 我已閱讀並同意該服務條款禁止使用免費 Email 地址注冊,請提供一個另外的 Email 地址。該 Email 地址已有人使用,請提供一個另外的 Email 地址。該用戶名已被佔用,請另選一個。用戶名只能包含字母、數字和下劃線您必須同意注冊條款您必須輸入兩遍同樣的密碼激活密鑰Email 地址密碼密碼(重復)注冊信息注冊信息用戶用戶名././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/locale/zh_TW/LC_MESSAGES/django.po0000644000076700000240000000377500000000000027036 0ustar00jamesstaff# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2007-09-19 19:30-0500\n" "PO-Revision-Date: 2008-03-20 23:22+0800\n" "Last-Translator: hutuworm \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: forms.py:38 msgid "username" msgstr "用戶名" #: forms.py:41 msgid "email address" msgstr "Email 地址" #: forms.py:43 msgid "password" msgstr "密碼" #: forms.py:45 msgid "password (again)" msgstr "密碼(重復)" #: forms.py:54 msgid "Usernames can only contain letters, numbers and underscores" msgstr "用戶名只能包含字母、數字和下劃線" #: forms.py:59 msgid "This username is already taken. Please choose another." msgstr "該用戶名已被佔用,請另選一個。" #: forms.py:68 msgid "You must type the same password each time" msgstr "您必須輸入兩遍同樣的密碼" #: forms.py:96 msgid "I have read and agree to the Terms of Service" msgstr "我已閱讀並同意該服務條款" #: forms.py:105 msgid "You must agree to the terms to register" msgstr "您必須同意注冊條款" #: forms.py:124 msgid "This email address is already in use. Please supply a different email address." msgstr "該 Email 地址已有人使用,請提供一個另外的 Email 地址。" #: forms.py:149 msgid "Registration using free email addresses is prohibited. Please supply a different email address." msgstr "禁止使用免費 Email 地址注冊,請提供一個另外的 Email 地址。" #: models.py:188 msgid "user" msgstr "用戶" #: models.py:189 msgid "activation key" msgstr "激活密鑰" #: models.py:194 msgid "registration profile" msgstr "注冊信息" #: models.py:195 msgid "registration profiles" msgstr "注冊信息" ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.473596 django-registration-3.3/src/django_registration/migrations/0000755000076700000240000000000000000000000023315 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1607759404.0 django-registration-3.3/src/django_registration/migrations/0001_initial.py0000644000076700000240000000135100000000000025760 0ustar00jamesstaff# -*- coding: utf-8 -*- from __future__ import unicode_literals from django.conf import settings from django.db import migrations # django-registration 2.x included a model-based signup workflow which # needed to create a model to store data. In django-registration 3.x, # that workflow no longer exists. # # To avoid breaking existing sites with migrations which had # dependencies on that migration, and ensure they can safely reverse # and replay migrations, this migration is preserved, but is now a # no-op. class Migration(migrations.Migration): dependencies = [migrations.swappable_dependency(settings.AUTH_USER_MODEL)] operations = [ migrations.RunPython(migrations.RunPython.noop, migrations.RunPython.noop) ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/src/django_registration/migrations/__init__.py0000644000076700000240000000000000000000000025414 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1607775753.0 django-registration-3.3/src/django_registration/signals.py0000644000076700000240000000046000000000000023153 0ustar00jamesstaff""" Custom signals sent during the registration and activation processes. """ from django.dispatch import Signal # A new user has registered. # Provided args: user, request user_registered = Signal() # A user has activated his or her account. # Provided args: user, request user_activated = Signal() ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1607759404.0 django-registration-3.3/src/django_registration/validators.py0000644000076700000240000002200200000000000023657 0ustar00jamesstaff""" Error messages, data and custom validation code used in django-registration's various user-registration form classes. """ import re import unicodedata from confusable_homoglyphs import confusables from django.core.exceptions import ValidationError from django.core.validators import EmailValidator, RegexValidator from django.utils.deconstruct import deconstructible from django.utils.translation import gettext_lazy as _ CONFUSABLE = _("This name cannot be registered. " "Please choose a different name.") CONFUSABLE_EMAIL = _( "This email address cannot be registered. " "Please supply a different email address." ) DUPLICATE_EMAIL = _( "This email address is already in use. " "Please supply a different email address." ) DUPLICATE_USERNAME = _("A user with that username already exists.") FREE_EMAIL = _( "Registration using free email addresses is prohibited. " "Please supply a different email address." ) RESERVED_NAME = _("This name is reserved and cannot be registered.") TOS_REQUIRED = _("You must agree to the terms to register") # WHATWG HTML5 spec, section 4.10.5.1.5. HTML5_EMAIL_RE = ( r"^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]" r"+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}" r"[a-zA-Z0-9])?(?:\.[a-zA-Z0-9]" r"(?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$" ) # Below we construct a large but non-exhaustive list of names which # users probably should not be able to register with, due to various # risks: # # * For a site which creates email addresses from username, important # common addresses must be reserved. # # * For a site which creates subdomains from usernames, important # common hostnames/domain names must be reserved. # # * For a site which uses the username to generate a URL to the user's # profile, common well-known filenames must be reserved. # # etc., etc. # # Credit for basic idea and most of the list to Geoffrey Thomas's blog # post about names to reserve: # https://ldpreload.com/blog/names-to-reserve SPECIAL_HOSTNAMES = [ # Hostnames with special/reserved meaning. "autoconfig", # Thunderbird autoconfig "autodiscover", # MS Outlook/Exchange autoconfig "broadcasthost", # Network broadcast hostname "isatap", # IPv6 tunnel autodiscovery "localdomain", # Loopback "localhost", # Loopback "wpad", # Proxy autodiscovery ] PROTOCOL_HOSTNAMES = [ # Common protocol hostnames. "ftp", "imap", "mail", "news", "pop", "pop3", "smtp", "usenet", "uucp", "webmail", "www", ] CA_ADDRESSES = [ # Email addresses known used by certificate authorities during # verification. "admin", "administrator", "hostmaster", "info", "is", "it", "mis", "postmaster", "root", "ssladmin", "ssladministrator", "sslwebmaster", "sysadmin", "webmaster", ] RFC_2142 = [ # RFC-2142-defined names not already covered. "abuse", "marketing", "noc", "sales", "security", "support", ] NOREPLY_ADDRESSES = [ # Common no-reply email addresses. "mailer-daemon", "nobody", "noreply", "no-reply", ] SENSITIVE_FILENAMES = [ # Sensitive filenames. "clientaccesspolicy.xml", # Silverlight cross-domain policy file. "crossdomain.xml", # Flash cross-domain policy file. "favicon.ico", "humans.txt", "keybase.txt", # Keybase ownership-verification URL. "robots.txt", ".htaccess", ".htpasswd", ] OTHER_SENSITIVE_NAMES = [ # Other names which could be problems depending on URL/subdomain # structure. "account", "accounts", "auth", "authorize", "blog", "buy", "cart", "clients", "contact", "contactus", "contact-us", "copyright", "dashboard", "doc", "docs", "download", "downloads", "enquiry", "faq", "help", "inquiry", "license", "login", "logout", "me", "myaccount", "oauth", "pay", "payment", "payments", "plans", "portfolio", "preferences", "pricing", "privacy", "profile", "register", "secure", "settings", "signin", "signup", "ssl", "status", "store", "subscribe", "terms", "tos", "user", "users", "weblog", "work", ] DEFAULT_RESERVED_NAMES = ( SPECIAL_HOSTNAMES + PROTOCOL_HOSTNAMES + CA_ADDRESSES + RFC_2142 + NOREPLY_ADDRESSES + SENSITIVE_FILENAMES + OTHER_SENSITIVE_NAMES ) @deconstructible class ReservedNameValidator: """ Validator which disallows many reserved names as form field values. """ def __init__(self, reserved_names=DEFAULT_RESERVED_NAMES): self.reserved_names = reserved_names def __call__(self, value): # GH issue 82: this validator only makes sense when the # username field is a string type. if not isinstance(value, str): return if value in self.reserved_names or value.startswith(".well-known"): raise ValidationError(RESERVED_NAME, code="invalid") def __eq__(self, other): return self.reserved_names == other.reserved_names @deconstructible class CaseInsensitiveUnique: """ Validator which performs a case-insensitive uniqueness check. """ def __init__(self, model, field_name, error_message): self.model = model self.field_name = field_name self.error_message = error_message def __call__(self, value): # Only run if the username is a string. if not isinstance(value, str): return value = unicodedata.normalize("NFKC", value).casefold() if self.model._default_manager.filter( **{"{}__iexact".format(self.field_name): value} ).exists(): raise ValidationError(self.error_message, code="unique") def __eq__(self, other): return ( self.model == other.model and self.field_name == other.field_name and self.error_message == other.error_message ) @deconstructible class HTML5EmailValidator(RegexValidator): """ Validator which applies HTML5's email address rules. """ message = EmailValidator.message regex = re.compile(HTML5_EMAIL_RE) def validate_confusables(value): """ Validator which disallows 'dangerous' usernames likely to represent homograph attacks. A username is 'dangerous' if it is mixed-script (as defined by Unicode 'Script' property) and contains one or more characters appearing in the Unicode Visually Confusable Characters file. """ if not isinstance(value, str): return if confusables.is_dangerous(value): raise ValidationError(CONFUSABLE, code="invalid") def validate_confusables_email(value): """ Validator which disallows 'dangerous' email addresses likely to represent homograph attacks. An email address is 'dangerous' if either the local-part or the domain, considered on their own, are mixed-script and contain one or more characters appearing in the Unicode Visually Confusable Characters file. """ # Email addresses are extremely difficult. # # The current RFC governing syntax of email addresses is RFC 5322 # which, as the HTML5 specification succinctly states, "defines a # syntax for e-mail addresses that is simultaneously too strict # ... too vague ... and too lax ... to be of practical use". # # In order to be useful, this validator must consider only the # addr-spec portion of an email address, and must examine the # local-part and the domain of that addr-spec # separately. Unfortunately, there are no good general-purpose # Python libraries currently available (that the author of # django-registration is aware of), supported on all versions of # Python django-registration supports, which can reliably provide # an RFC-complient parse of either a full address or an addr-spec # which allows the local-part and domain to be treated separately. # # To work around this shortcoming, RegistrationForm applies the # HTML5 email validation rule, which HTML5 admits (in section # 4.10.5.1.5) is a "willful violation" of RFC 5322, to the # submitted email address. This will reject many technically-valid # but problematic email addresses, including those which make use # of comments, or which embed otherwise-illegal characters via # quoted-string. # # That in turn allows this validator to take a much simpler # approach: it considers any value containing exactly one '@' # (U+0040) to be an addr-spec, and consders everything prior to # the '@' to be the local-part and everything after to be the # domain, and performs validation on them. Any value not # containing exactly one '@' is assumed not to be an addr-spec, # and is thus "accepted" by not being validated at all. if value.count("@") != 1: return local_part, domain = value.split("@") if confusables.is_dangerous(local_part) or confusables.is_dangerous(domain): raise ValidationError(CONFUSABLE_EMAIL, code="invalid") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1617253201.0 django-registration-3.3/src/django_registration/views.py0000644000076700000240000001246400000000000022657 0ustar00jamesstaff""" Base view classes for all registration workflows. """ from django.conf import settings from django.contrib.auth import get_user_model from django.core.exceptions import ImproperlyConfigured from django.http import HttpResponseRedirect from django.urls import reverse_lazy from django.utils.decorators import method_decorator from django.utils.encoding import force_str from django.views.decorators.debug import sensitive_post_parameters from django.views.generic.base import TemplateView from django.views.generic.edit import FormView from . import signals from .exceptions import ActivationError from .forms import RegistrationForm USER_MODEL_MISMATCH = """ You are attempting to use the registration view {view} with the form class {form}, but the model used by that form ({form_model}) is not your Django installation's user model ({user_model}). Most often this occurs because you are using a custom user model, but forgot to specify a custom registration form class for it. Specifying a custom registration form class is required when using a custom user model. Please see django-registration's documentation on custom user models for more details. """ class RegistrationView(FormView): """ Base class for user registration views. """ disallowed_url = reverse_lazy("django_registration_disallowed") form_class = RegistrationForm success_url = None template_name = "django_registration/registration_form.html" @method_decorator(sensitive_post_parameters()) def dispatch(self, *args, **kwargs): """ Check that user signup is allowed before even bothering to dispatch or do other processing. """ if not self.registration_allowed(): return HttpResponseRedirect(force_str(self.disallowed_url)) return super().dispatch(*args, **kwargs) def get_form(self, form_class=None): """ Returns an instance of the form to be used in this view. This is an override of the base version of this method in Django's FormMixin, to immediately and loudly break if the model of this view's form class is not the user model Django has been configured to use. Most often this will be the case because Django has been configured to use a custom user model, but the developer has forgotten to also configure an appropriate custom registration form to match it. """ if form_class is None: form_class = self.get_form_class() form_model = form_class._meta.model user_model = get_user_model() if form_model._meta.label != user_model._meta.label: raise ImproperlyConfigured( USER_MODEL_MISMATCH.format( view=self.__class__, form=form_class, form_model=form_model, user_model=user_model, ) ) return form_class(**self.get_form_kwargs()) def get_success_url(self, user=None): """ Return the URL to redirect to after successful redirection. """ # This is overridden solely to allow django-registration to # support passing the user account as an argument; otherwise, # the base FormMixin implementation, which accepts no # arguments, could be called and end up raising a TypeError. return super().get_success_url() def form_valid(self, form): return HttpResponseRedirect(self.get_success_url(self.register(form))) def registration_allowed(self): """ Override this to enable/disable user registration, either globally or on a per-request basis. """ return getattr(settings, "REGISTRATION_OPEN", True) def register(self, form): """ Implement user-registration logic here. Access to both the request and the registration form is available here. """ raise NotImplementedError class ActivationView(TemplateView): """ Base class for user activation views. """ success_url = None template_name = "django_registration/activation_failed.html" def get_success_url(self, user=None): """ Return the URL to redirect to after successful redirection. """ return force_str(self.success_url) def get(self, *args, **kwargs): """ The base activation logic; subclasses should leave this method alone and implement activate(), which is called from this method. """ extra_context = {} try: activated_user = self.activate(*args, **kwargs) except ActivationError as e: extra_context["activation_error"] = { "message": e.message, "code": e.code, "params": e.params, } else: signals.user_activated.send( sender=self.__class__, user=activated_user, request=self.request ) return HttpResponseRedirect(force_str(self.get_success_url(activated_user))) context_data = self.get_context_data() context_data.update(extra_context) return self.render_to_response(context_data) def activate(self, *args, **kwargs): """ Implement account-activation logic here. """ raise NotImplementedError ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4492652 django-registration-3.3/src/django_registration.egg-info/0000755000076700000240000000000000000000000022633 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653723061.0 django-registration-3.3/src/django_registration.egg-info/PKG-INFO0000644000076700000240000000323600000000000023734 0ustar00jamesstaffMetadata-Version: 2.1 Name: django-registration Version: 3.3 Summary: An extensible user-registration application for Django Home-page: https://github.com/ubernostrum/django-registration/ Author: James Bennett Author-email: james@b-list.org Classifier: Development Status :: 5 - Production/Stable Classifier: Environment :: Web Environment Classifier: Framework :: Django Classifier: Framework :: Django :: 3.1 Classifier: Framework :: Django :: 3.2 Classifier: Framework :: Django :: 4.0 Classifier: Intended Audience :: Developers Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: OS Independent Classifier: Programming Language :: Python Classifier: Topic :: Software Development :: Libraries :: Python Modules Classifier: Programming Language :: Python Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Classifier: Programming Language :: Python :: 3.9 Classifier: Programming Language :: Python :: 3.10 Classifier: Topic :: Utilities Requires-Python: >=3.7 License-File: LICENSE .. -*-restructuredtext-*- .. image:: https://github.com/ubernostrum/django-registration/workflows/CI/badge.svg :alt: CI status image :target: https://github.com/ubernostrum/django-registration/actions?query=workflow%3ACI This is a user-registration application for `Django `_. There are two registration workflows (one-step, and two-step with activation) built in, and it's designed to be extensible and support building additional workflows. To get started, check out `the documentation `_. ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653723062.0 django-registration-3.3/src/django_registration.egg-info/SOURCES.txt0000644000076700000240000001270400000000000024523 0ustar00jamesstaffAUTHORS LICENSE MANIFEST.in README.rst runtests.py setup.cfg setup.py tox.ini docs/Makefile docs/activation-workflow.rst docs/conf.py docs/custom-user.rst docs/deprecations.rst docs/exceptions.rst docs/faq.rst docs/forms.rst docs/index.rst docs/install.rst docs/make.bat docs/one-step-workflow.rst docs/quickstart.rst docs/security.rst docs/settings.rst docs/signals.rst docs/spelling_wordlist.txt docs/upgrade.rst docs/validators.rst docs/views.rst src/django_registration/__init__.py src/django_registration/exceptions.py src/django_registration/forms.py src/django_registration/signals.py src/django_registration/validators.py src/django_registration/views.py src/django_registration.egg-info/PKG-INFO src/django_registration.egg-info/SOURCES.txt src/django_registration.egg-info/dependency_links.txt src/django_registration.egg-info/not-zip-safe src/django_registration.egg-info/requires.txt src/django_registration.egg-info/top_level.txt src/django_registration/backends/__init__.py src/django_registration/backends/activation/__init__.py src/django_registration/backends/activation/urls.py src/django_registration/backends/activation/views.py src/django_registration/backends/one_step/__init__.py src/django_registration/backends/one_step/urls.py src/django_registration/backends/one_step/views.py src/django_registration/locale/ar/LC_MESSAGES/django.mo src/django_registration/locale/ar/LC_MESSAGES/django.po src/django_registration/locale/bg/LC_MESSAGES/django.mo src/django_registration/locale/bg/LC_MESSAGES/django.po src/django_registration/locale/ca/LC_MESSAGES/django.mo src/django_registration/locale/ca/LC_MESSAGES/django.po src/django_registration/locale/cs/LC_MESSAGES/django.mo src/django_registration/locale/cs/LC_MESSAGES/django.po src/django_registration/locale/da/LC_MESSAGES/django.mo src/django_registration/locale/da/LC_MESSAGES/django.po src/django_registration/locale/de/LC_MESSAGES/django.mo src/django_registration/locale/de/LC_MESSAGES/django.po src/django_registration/locale/el/LC_MESSAGES/django.mo src/django_registration/locale/el/LC_MESSAGES/django.po src/django_registration/locale/en/LC_MESSAGES/django.mo src/django_registration/locale/en/LC_MESSAGES/django.po src/django_registration/locale/es/LC_MESSAGES/django.mo src/django_registration/locale/es/LC_MESSAGES/django.po src/django_registration/locale/es_AR/LC_MESSAGES/django.mo src/django_registration/locale/es_AR/LC_MESSAGES/django.po src/django_registration/locale/fa/LC_MESSAGES/django.mo src/django_registration/locale/fa/LC_MESSAGES/django.po src/django_registration/locale/fr/LC_MESSAGES/django.mo src/django_registration/locale/fr/LC_MESSAGES/django.po src/django_registration/locale/he/LC_MESSAGES/django.mo src/django_registration/locale/he/LC_MESSAGES/django.po src/django_registration/locale/hr/LC_MESSAGES/django.mo src/django_registration/locale/hr/LC_MESSAGES/django.po src/django_registration/locale/is/LC_MESSAGES/django.mo src/django_registration/locale/is/LC_MESSAGES/django.po src/django_registration/locale/it/LC_MESSAGES/django.mo src/django_registration/locale/it/LC_MESSAGES/django.po src/django_registration/locale/ja/LC_MESSAGES/django.mo src/django_registration/locale/ja/LC_MESSAGES/django.po src/django_registration/locale/ko/LC_MESSAGES/django.mo src/django_registration/locale/ko/LC_MESSAGES/django.po src/django_registration/locale/nb/LC_MESSAGES/django.mo src/django_registration/locale/nb/LC_MESSAGES/django.po src/django_registration/locale/nl/LC_MESSAGES/django.mo src/django_registration/locale/nl/LC_MESSAGES/django.po src/django_registration/locale/pl/LC_MESSAGES/django.mo src/django_registration/locale/pl/LC_MESSAGES/django.po src/django_registration/locale/pt/LC_MESSAGES/django.mo src/django_registration/locale/pt/LC_MESSAGES/django.po src/django_registration/locale/pt_BR/LC_MESSAGES/django.mo src/django_registration/locale/pt_BR/LC_MESSAGES/django.po src/django_registration/locale/ru/LC_MESSAGES/django.mo src/django_registration/locale/ru/LC_MESSAGES/django.po src/django_registration/locale/sl/LC_MESSAGES/django.mo src/django_registration/locale/sl/LC_MESSAGES/django.po src/django_registration/locale/sr/LC_MESSAGES/django.mo src/django_registration/locale/sr/LC_MESSAGES/django.po src/django_registration/locale/sv/LC_MESSAGES/django.mo src/django_registration/locale/sv/LC_MESSAGES/django.po src/django_registration/locale/tr_TR/LC_MESSAGES/django.mo src/django_registration/locale/tr_TR/LC_MESSAGES/django.po src/django_registration/locale/zh_CN/LC_MESSAGES/django.mo src/django_registration/locale/zh_CN/LC_MESSAGES/django.po src/django_registration/locale/zh_TW/LC_MESSAGES/django.mo src/django_registration/locale/zh_TW/LC_MESSAGES/django.po src/django_registration/migrations/0001_initial.py src/django_registration/migrations/__init__.py tests/__init__.py tests/base.py tests/models.py tests/test_activation_workflow.py tests/test_forms.py tests/test_one_step_workflow.py tests/test_views.py tests/views.py tests/migrations/0001_initial.py tests/migrations/__init__.py tests/templates/django_registration/activation_complete.html tests/templates/django_registration/activation_email_body.txt tests/templates/django_registration/activation_email_subject.txt tests/templates/django_registration/activation_failed.html tests/templates/django_registration/registration_closed.html tests/templates/django_registration/registration_complete.html tests/templates/django_registration/registration_form.html tests/urls/__init__.py tests/urls/custom_user_activation.py tests/urls/custom_user_one_step.py tests/urls/view_tests.py././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653723061.0 django-registration-3.3/src/django_registration.egg-info/dependency_links.txt0000644000076700000240000000000100000000000026701 0ustar00jamesstaff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653723060.0 django-registration-3.3/src/django_registration.egg-info/not-zip-safe0000644000076700000240000000000100000000000025061 0ustar00jamesstaff ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653723062.0 django-registration-3.3/src/django_registration.egg-info/requires.txt0000644000076700000240000000004700000000000025234 0ustar00jamesstaffDjango>=3.2 confusable_homoglyphs~=3.0 ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653723062.0 django-registration-3.3/src/django_registration.egg-info/top_level.txt0000644000076700000240000000002400000000000025361 0ustar00jamesstaffdjango_registration ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4759846 django-registration-3.3/tests/0000755000076700000240000000000000000000000015460 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/tests/__init__.py0000644000076700000240000000000000000000000017557 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1580077358.0 django-registration-3.3/tests/base.py0000644000076700000240000002041200000000000016743 0ustar00jamesstaff""" Base classes for other test cases to inherit from. """ from contextlib import contextmanager from django.contrib.auth import get_user_model from django.core import mail from django.http import HttpRequest from django.test import TestCase, override_settings from django.urls import reverse from django_registration import signals from django_registration.forms import RegistrationForm # django-registration needs to test that signals are sent at # registration and activation. Django -- as of 2.1 -- does not have a # test assertion built in to test whether a signal was or was not # sent. The code below is from a pull request submitted upstream to # Django to add assertSignalSent and assertSignalNotSent assertions to # Django's base test case class, and will be removed once it's been # integrated into Django and django-registration is only supporting # versions of Django which include it. class _AssertSignalSentContext: def __init__(self, test_case, signal, required_kwargs=None): self.test_case = test_case self.signal = signal self.required_kwargs = required_kwargs def _listener(self, sender, **kwargs): self.signal_sent = True self.received_kwargs = kwargs self.sender = sender def __enter__(self): self.signal_sent = False self.received_kwargs = {} self.sender = None self.signal.connect(self._listener) return self def __exit__(self, exc_type, exc_value, traceback): self.signal.disconnect(self._listener) if not self.signal_sent: self.test_case.fail("Signal was not sent.") return if self.required_kwargs is not None: missing_kwargs = [] for k in self.required_kwargs: if k not in self.received_kwargs: missing_kwargs.append(k) if missing_kwargs: self.test_case.fail( "Signal missing required arguments: " "%s" % ",".join(missing_kwargs) ) class _AssertSignalNotSentContext(_AssertSignalSentContext): def __exit__(self, exc_type, exc_value, traceback): self.signal.disconnect(self._listener) if self.signal_sent: self.test_case.fail("Signal was unexpectedly sent.") @override_settings(ACCOUNT_ACTIVATION_DAYS=7, REGISTRATION_OPEN=True) class RegistrationTestCase(TestCase): """ Base class for test cases, defining valid data for registering a user account and looking up the account after creation. """ @property def valid_data(self): User = get_user_model() return { User.USERNAME_FIELD: "alice", "email": "alice@example.com", "password1": "swordfish", "password2": "swordfish", } @property def user_lookup_kwargs(self): User = get_user_model() return {User.USERNAME_FIELD: "alice"} @contextmanager def assertSignalSent(self, signal, required_kwargs=None): with _AssertSignalSentContext(self, signal, required_kwargs) as cm: yield cm @contextmanager def assertSignalNotSent(self, signal): with _AssertSignalNotSentContext(self, signal) as cm: yield cm class WorkflowTestCase(RegistrationTestCase): """ Base class for the test cases which exercise the built-in workflows, including logic common to all of them (and which needs to be tested for each one). """ def test_registration_open(self): """ ``REGISTRATION_OPEN``, when ``True``, permits registration. """ resp = self.client.get(reverse("django_registration_register")) self.assertEqual(200, resp.status_code) @override_settings(REGISTRATION_OPEN=False) def test_registration_closed(self): """ ``REGISTRATION_OPEN``, when ``False``, disallows registration. """ resp = self.client.get(reverse("django_registration_register")) self.assertRedirects(resp, reverse("django_registration_disallowed")) resp = self.client.post( reverse("django_registration_register"), data=self.valid_data ) self.assertRedirects(resp, reverse("django_registration_disallowed")) def test_registration_get(self): """ HTTP ``GET`` to the registration view uses the appropriate template and populates a registration form into the context. """ resp = self.client.get(reverse("django_registration_register")) self.assertEqual(200, resp.status_code) self.assertTemplateUsed(resp, "django_registration/registration_form.html") self.assertTrue(isinstance(resp.context["form"], RegistrationForm)) def test_registration(self): """ Registration creates a new account. """ with self.assertSignalSent(signals.user_registered): resp = self.client.post( reverse("django_registration_register"), data=self.valid_data ) self.assertRedirects(resp, reverse("django_registration_complete")) user_model = get_user_model() new_user = user_model.objects.get(**self.user_lookup_kwargs) self.assertTrue(new_user.check_password(self.valid_data["password1"])) self.assertEqual(new_user.email, self.valid_data["email"]) def test_registration_failure(self): """ Registering with invalid data fails. """ data = self.valid_data.copy() data.update(password2="notsecret") with self.assertSignalNotSent(signals.user_registered): resp = self.client.post(reverse("django_registration_register"), data=data) self.assertEqual(200, resp.status_code) self.assertFalse(resp.context["form"].is_valid()) self.assertTrue(resp.context["form"].has_error("password2")) def test_registration_signal(self): User = get_user_model() with self.assertSignalSent(signals.user_registered) as cm: self.client.post( reverse("django_registration_register"), data=self.valid_data ) self.assertEqual( cm.received_kwargs["user"].get_username(), self.valid_data[User.USERNAME_FIELD], ) self.assertTrue(isinstance(cm.received_kwargs["request"], HttpRequest)) class ActivationTestCase(WorkflowTestCase): """ Base class for testing the built-in workflows which involve an activation step. """ # First few methods repeat parent class, but with added checks for # is_active status and sending of activation emails. def test_registration(self): """ Registration creates a new inactive account and sends an activation email. """ with self.assertSignalSent(signals.user_registered): super().test_registration() user_model = get_user_model() new_user = user_model.objects.get(**self.user_lookup_kwargs) # New user must not be active. self.assertFalse(new_user.is_active) # An activation email was sent. self.assertEqual(len(mail.outbox), 1) self.assertTrue("http" in mail.outbox[0].subject) def test_registration_failure(self): """ Registering with invalid data fails. """ with self.assertSignalNotSent(signals.user_registered): super().test_registration_failure() # Activation email was not sent. self.assertEqual(0, len(mail.outbox)) def test_registration_no_sites(self): """ Registration still functions properly when ``django.contrib.sites`` is not installed; the fallback will be a ``RequestSite`` instance. """ with self.modify_settings(INSTALLED_APPS={"remove": ["django.contrib.sites"]}): with self.assertSignalSent(signals.user_registered): resp = self.client.post( reverse("django_registration_register"), data=self.valid_data ) self.assertEqual(302, resp.status_code) user_model = get_user_model() new_user = user_model.objects.get(**self.user_lookup_kwargs) self.assertTrue(new_user.check_password(self.valid_data["password1"])) self.assertEqual(new_user.email, self.valid_data["email"]) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4767246 django-registration-3.3/tests/migrations/0000755000076700000240000000000000000000000017634 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1578221039.0 django-registration-3.3/tests/migrations/0001_initial.py0000644000076700000240000000632700000000000022307 0ustar00jamesstaff# Generated by Django 3.0.1 on 2020-01-05 01:03 import django.contrib.auth.models import django.contrib.auth.validators import django.utils.timezone from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [] # type: list operations = [ migrations.CreateModel( name="CustomUser", fields=[ ( "id", models.AutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("password", models.CharField(max_length=128, verbose_name="password")), ( "last_login", models.DateTimeField( blank=True, null=True, verbose_name="last login" ), ), ("age", models.IntegerField(blank=True, null=True)), ( "username", models.CharField( error_messages={ "unique": "A user with that username already exists." }, help_text="Required. 150 characters or fewer.", max_length=150, unique=True, validators=[ django.contrib.auth.validators.UnicodeUsernameValidator() ], verbose_name="username", ), ), ( "first_name", models.CharField( blank=True, max_length=30, verbose_name="first name" ), ), ( "last_name", models.CharField( blank=True, max_length=150, verbose_name="last name" ), ), ( "email", models.EmailField( blank=True, max_length=254, verbose_name="email address" ), ), ( "is_staff", models.BooleanField( default=False, help_text="Whether the user can log into the admin.", verbose_name="staff status", ), ), ( "is_active", models.BooleanField( default=True, help_text="Whether this user should be treated as active.", verbose_name="active", ), ), ( "date_joined", models.DateTimeField( default=django.utils.timezone.now, verbose_name="date joined" ), ), ], options={"abstract": False}, managers=[("objects", django.contrib.auth.models.UserManager())], ), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1578215035.0 django-registration-3.3/tests/migrations/__init__.py0000644000076700000240000000000000000000000021733 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1578220899.0 django-registration-3.3/tests/models.py0000644000076700000240000000337100000000000017321 0ustar00jamesstafffrom django.contrib.auth.base_user import AbstractBaseUser from django.contrib.auth.models import UserManager from django.contrib.auth.validators import UnicodeUsernameValidator from django.core.mail import send_mail from django.db import models from django.utils import timezone from django.utils.translation import gettext_lazy as _ class CustomUser(AbstractBaseUser): """ A model for use in testing django-registration's support for custom user models. Do not use this in your own projects. """ EMAIL_FIELD = "email" REQUIRED_FIELDS = ["email"] USERNAME_FIELD = "username" age = models.IntegerField(blank=True, null=True) username = models.CharField( _("username"), max_length=150, unique=True, help_text=_("Required. 150 characters or fewer."), validators=[UnicodeUsernameValidator()], error_messages={"unique": _("A user with that username already exists.")}, ) first_name = models.CharField(_("first name"), max_length=30, blank=True) last_name = models.CharField(_("last name"), max_length=150, blank=True) email = models.EmailField(_("email address"), blank=True) is_staff = models.BooleanField( _("staff status"), default=False, help_text=_("Whether the user can log into the admin."), ) is_active = models.BooleanField( _("active"), default=True, help_text=_("Whether this user should be treated as active."), ) date_joined = models.DateTimeField(_("date joined"), default=timezone.now) objects = UserManager() def email_user(self, subject, message, from_email=None, **kwargs): """Send an email to this user.""" send_mail(subject, message, from_email, [self.email], **kwargs) ././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.434721 django-registration-3.3/tests/templates/0000755000076700000240000000000000000000000017456 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000003300000000000010211 xustar0027 mtime=1653723062.479126 django-registration-3.3/tests/templates/django_registration/0000755000076700000240000000000000000000000023512 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/tests/templates/django_registration/activation_complete.html0000644000076700000240000000000000000000000030417 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/tests/templates/django_registration/activation_email_body.txt0000644000076700000240000000000000000000000030566 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/tests/templates/django_registration/activation_email_subject.txt0000644000076700000240000000001400000000000031275 0ustar00jamesstaff{{ scheme }}././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/tests/templates/django_registration/activation_failed.html0000644000076700000240000000000000000000000030033 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/tests/templates/django_registration/registration_closed.html0000644000076700000240000000000000000000000030431 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/tests/templates/django_registration/registration_complete.html0000644000076700000240000000000000000000000030770 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1535893229.0 django-registration-3.3/tests/templates/django_registration/registration_form.html0000644000076700000240000000000000000000000030123 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1600673246.0 django-registration-3.3/tests/test_activation_workflow.py0000644000076700000240000002241200000000000023165 0ustar00jamesstaff""" Tests for the signed-token activation registration workflow. """ import datetime import time from django.apps import apps from django.conf import settings from django.contrib.auth import get_user_model from django.core import signing from django.http import HttpRequest from django.test import modify_settings, override_settings from django.urls import reverse from django_registration import signals from django_registration.backends.activation.views import ( REGISTRATION_SALT, ActivationView, ) from .base import ActivationTestCase @modify_settings(INSTALLED_APPS={"remove": "django_registration"}) @override_settings(ROOT_URLCONF="django_registration.backends.activation.urls") class ActivationBackendViewTests(ActivationTestCase): """ Tests for the signed-token activation registration workflow. """ def test_activation(self): """ Activation of an account functions properly. """ user_model = get_user_model() resp = self.client.post( reverse("django_registration_register"), data=self.valid_data ) activation_key = signing.dumps( obj=self.valid_data[user_model.USERNAME_FIELD], salt=REGISTRATION_SALT ) with self.assertSignalSent(signals.user_activated): resp = self.client.get( reverse( "django_registration_activate", args=(), kwargs={"activation_key": activation_key}, ) ) self.assertRedirects(resp, reverse("django_registration_activation_complete")) def test_repeat_activation(self): """ Once activated, attempting to re-activate an account (even with a valid key) does nothing. """ user_model = get_user_model() resp = self.client.post( reverse("django_registration_register"), data=self.valid_data ) activation_key = signing.dumps( obj=self.valid_data[user_model.USERNAME_FIELD], salt=REGISTRATION_SALT ) with self.assertSignalSent(signals.user_activated): resp = self.client.get( reverse( "django_registration_activate", args=(), kwargs={"activation_key": activation_key}, ) ) # First activation redirects to success. self.assertRedirects(resp, reverse("django_registration_activation_complete")) with self.assertSignalNotSent(signals.user_activated): resp = self.client.get( reverse( "django_registration_activate", args=(), kwargs={"activation_key": activation_key}, ) ) # Second activation fails. self.assertEqual(200, resp.status_code) self.assertTemplateUsed(resp, "django_registration/activation_failed.html") self.assertEqual( resp.context["activation_error"], { "message": ActivationView.ALREADY_ACTIVATED_MESSAGE, "code": "already_activated", "params": None, }, ) def test_bad_key(self): """ An invalid activation key fails to activate. """ user_model = get_user_model() resp = self.client.post( reverse("django_registration_register"), data=self.valid_data ) activation_key = self.valid_data[user_model.USERNAME_FIELD] with self.assertSignalNotSent(signals.user_activated): resp = self.client.get( reverse( "django_registration_activate", args=(), kwargs={"activation_key": activation_key}, ) ) # Second activation fails. self.assertEqual(200, resp.status_code) self.assertTemplateUsed(resp, "django_registration/activation_failed.html") self.assertTrue("activation_error" in resp.context) self.assertEqual( resp.context["activation_error"], { "message": ActivationView.INVALID_KEY_MESSAGE, "code": "invalid_key", "params": {"activation_key": activation_key}, }, ) # The timestamp calculation will error if USE_TZ=True, due to # trying to subtract a naive from an aware datetime. Since time # zones aren't relevant to the test, we just temporarily disable # time-zone support rather than do the more complex dance of # checking the setting and forcing everything to naive or aware. @override_settings(USE_TZ=False) def test_activation_expired(self): """ An expired account can't be activated. """ user_model = get_user_model() self.client.post(reverse("django_registration_register"), data=self.valid_data) # We need to create an activation key valid for the username, # but with a timestamp > ACCOUNT_ACTIVATION_DAYS days in the # past. This requires monkeypatching time.time() to return # that timestamp, since TimestampSigner uses time.time(). # # On Python 3.3+ this is much easier because of the # timestamp() method of datetime objects, but since # django-registration has to run on Python 2.7, we manually # calculate it using a timedelta between the signup date and # the UNIX epoch, and patch time.time() temporarily to return # a date (ACCOUNT_ACTIVATION_DAYS + 1) days in the past. user = user_model.objects.get(**self.user_lookup_kwargs) joined_timestamp = ( user.date_joined - datetime.datetime.fromtimestamp(0) ).total_seconds() expired_timestamp = ( joined_timestamp - (settings.ACCOUNT_ACTIVATION_DAYS + 1) * 86400 ) _old_time = time.time try: time.time = lambda: expired_timestamp activation_key = signing.dumps( obj=self.valid_data[user_model.USERNAME_FIELD], salt=REGISTRATION_SALT, ) finally: time.time = _old_time with self.assertSignalNotSent(signals.user_activated): resp = self.client.get( reverse( "django_registration_activate", args=(), kwargs={"activation_key": activation_key}, ) ) self.assertEqual(200, resp.status_code) self.assertTemplateUsed(resp, "django_registration/activation_failed.html") self.assertTrue("activation_error" in resp.context) self.assertEqual( resp.context["activation_error"], { "message": ActivationView.EXPIRED_MESSAGE, "code": "expired", "params": None, }, ) def test_nonexistent_activation(self): """ A nonexistent username in an activation key will fail to activate. """ activation_key = signing.dumps(obj="parrot", salt=REGISTRATION_SALT) with self.assertSignalNotSent(signals.user_activated): resp = self.client.get( reverse( "django_registration_activate", args=(), kwargs={"activation_key": activation_key}, ) ) self.assertEqual(200, resp.status_code) self.assertTemplateUsed(resp, "django_registration/activation_failed.html") self.assertTrue("activation_error" in resp.context) self.assertEqual( resp.context["activation_error"], { "message": ActivationView.BAD_USERNAME_MESSAGE, "code": "bad_username", "params": None, }, ) def test_activation_signal(self): user_model = get_user_model() self.client.post(reverse("django_registration_register"), data=self.valid_data) activation_key = signing.dumps( obj=self.valid_data[user_model.USERNAME_FIELD], salt=REGISTRATION_SALT ) with self.assertSignalSent( signals.user_activated, required_kwargs=["user", "request"] ) as cm: self.client.get( reverse( "django_registration_activate", args=(), kwargs={"activation_key": activation_key}, ) ) self.assertEqual( cm.received_kwargs["user"].get_username(), self.valid_data[user_model.USERNAME_FIELD], ) self.assertTrue(isinstance(cm.received_kwargs["request"], HttpRequest)) @override_settings(AUTH_USER_MODEL="tests.CustomUser") @override_settings(ROOT_URLCONF="tests.urls.custom_user_activation") class ActivationBackendCustomUserTests(ActivationBackendViewTests): """ Runs the activation workflow's test suite, but with a custom user model. """ def test_custom_user_configured(self): """ Asserts that the user model in use is the custom user model defined in this test suite. """ user_model = get_user_model() custom_user = apps.get_model("tests", "CustomUser") assert user_model is custom_user ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1600673236.0 django-registration-3.3/tests/test_forms.py0000644000076700000240000003217700000000000020231 0ustar00jamesstaff# -*- coding: utf-8 -*- """ Exercise django-registration's built-in form classes. """ import uuid from django.contrib.auth import get_user_model from django.core.exceptions import ValidationError from django.test import modify_settings from django_registration import forms, validators from .base import RegistrationTestCase @modify_settings(INSTALLED_APPS={"remove": "registration"}) class RegistrationFormTests(RegistrationTestCase): """ Test the built-in form classes. """ def test_email_required(self): """ The email address field is required. """ form = forms.RegistrationForm() self.assertTrue(form.fields["email"].required) def test_email_validation(self): """ Stricter-than-RFC email validation is applied. This test is necessary because of the combination of HTML5EmailValidator and validate_confusables_email() in the default validator set for the email field of RegistrationForm; some technically-valid email addresses which nonetheless usually indicate bad faith or at least mischief are to be rejected before the confusables validator is applied. """ user_model = get_user_model() for value in ( "test@example.com", "test+test@example.com", "test.test@example.com", "test_test@example.com", ): user_data = self.valid_data.copy() user_data["email"] = value form = forms.RegistrationForm(data=user_data) self.assertTrue(form.is_valid()) for value in ( "@@@example.com", "test:test@test@example.com", 'test"test@example"test@example.com', ): user_data = self.valid_data.copy() user_data["email"] = value form = forms.RegistrationForm(data=user_data) self.assertFalse(form.is_valid()) self.assertTrue(form.has_error(user_model.get_email_field_name())) self.assertTrue( str(validators.HTML5EmailValidator.message) in form.errors[user_model.get_email_field_name()] ) def test_username_uniqueness(self): """ Username uniqueness is enforced. This test is necessary as of 2.1.x to ensure the base UserCreationForm clean() continues to be called from the overridden clean() in RegistrationForm. """ user_data = self.valid_data.copy() del user_data["password1"] del user_data["password2"] user_data["password"] = "swordfish" user_model = get_user_model() existing_user = user_model(**user_data) existing_user.save() form = forms.RegistrationForm(data=self.valid_data.copy()) self.assertFalse(form.is_valid()) self.assertTrue(form.has_error(user_model.USERNAME_FIELD)) def test_reserved_names(self): """ Reserved names are disallowed. """ user_model = get_user_model() for reserved_name in validators.DEFAULT_RESERVED_NAMES: data = self.valid_data.copy() data[user_model.USERNAME_FIELD] = reserved_name form = forms.RegistrationForm(data=data) self.assertFalse(form.is_valid()) self.assertTrue(form.has_error(user_model.USERNAME_FIELD)) self.assertTrue( str(validators.RESERVED_NAME) in form.errors[user_model.USERNAME_FIELD] ) def test_confusable_usernames(self): """ Usernames containing dangerously confusable use of Unicode are disallowed. """ user_model = get_user_model() for dangerous_value in ( "p\u0430yp\u0430l", "g\u043e\u043egle", "\u03c1ay\u03c1al", ): data = self.valid_data.copy() data[user_model.USERNAME_FIELD] = dangerous_value form = forms.RegistrationForm(data=data) self.assertFalse(form.is_valid()) self.assertTrue(form.has_error(user_model.USERNAME_FIELD)) self.assertTrue( str(validators.CONFUSABLE) in form.errors[user_model.USERNAME_FIELD] ) def test_confusable_emails(self): """ Usernames containing dangerously confusable use of Unicode are disallowed. """ for dangerous_value in ( "p\u0430yp\u0430l@example.com", "g\u043e\u043egle@example.com", "\u03c1y\u03c1al@example.com", "paypal@ex\u0430mple.com", "google@exam\u03c1le.com", ): data = self.valid_data.copy() data["email"] = dangerous_value form = forms.RegistrationForm(data=data) self.assertFalse(form.is_valid()) self.assertTrue(form.has_error("email")) self.assertTrue(str(validators.CONFUSABLE_EMAIL) in form.errors["email"]) def test_custom_reserved_names(self): """ Reserved names can be overridden by an attribute. """ custom_reserved_names = ["foo", "bar", "eggs", "spam"] class CustomReservedNamesForm(forms.RegistrationForm): reserved_names = custom_reserved_names user_model = get_user_model() for reserved_name in custom_reserved_names: data = self.valid_data.copy() data[user_model.USERNAME_FIELD] = reserved_name form = CustomReservedNamesForm(data=data) self.assertFalse(form.is_valid()) self.assertTrue(form.has_error(user_model.USERNAME_FIELD)) self.assertTrue( str(validators.RESERVED_NAME) in form.errors[user_model.USERNAME_FIELD] ) def test_reserved_name_non_string(self): """ GitHub issue #82: reserved-name validator should not attempt to validate a non-string 'username'. """ validator = validators.ReservedNameValidator() for value in (123456, 1.7, uuid.uuid4()): self.assertTrue(validator(value) is None) def test_reserved_name_validator_eq(self): """ Test ReservedNameValidator __eq__ method. __eq__ is necessary for serializing custom user models that use the validator. """ validator = validators.ReservedNameValidator() validator_same = validators.ReservedNameValidator() self.assertTrue(validator.__eq__(validator_same)) validator_different = validators.ReservedNameValidator(reserved_names=[]) self.assertFalse(validator.__eq__(validator_different)) def test_email_validator(self): """ Test the HTMl5 email address validator. """ validator = validators.HTML5EmailValidator() for value in ( "test@example.com", "test+test@example.com", "test.test@example.com", "test_test@example.com", ): self.assertTrue(validator(value) is None) for value in ( "@@@example.com", "test:test@test@example.com", 'test"test@example"test@example.com', ): with self.assertRaisesMessage(ValidationError, str(validator.message)): validator(value) def test_case_insensitive_validator(self): """ Test the case-insensitive username validator. """ user_model = get_user_model() validator = validators.CaseInsensitiveUnique( user_model, user_model.USERNAME_FIELD, validators.DUPLICATE_USERNAME, ) for value in (123456, 1.7, uuid.uuid4()): self.assertTrue(validator(value) is None) base_creation_data = self.valid_data.copy() base_creation_data["password"] = base_creation_data["password1"] del base_creation_data["password1"] del base_creation_data["password2"] test_names = [("alice", "ALICE"), ("ALICE", "alice"), ("Alice", "alice")] test_names.extend([("STRASSBURGER", "straßburger")]) for name, conflict in test_names: creation_data = base_creation_data.copy() creation_data[user_model.USERNAME_FIELD] = name existing_user = user_model(**creation_data) existing_user.save() with self.assertRaisesMessage( ValidationError, str(validators.DUPLICATE_USERNAME) ): validator(conflict) existing_user.delete() def test_case_insensitive_validator_eq(self): """ Test CaseInsensitiveUnique __eq__ method. __eq__ is necessary for serializing custom user models that use the validator. """ user_model = get_user_model() validator = validators.CaseInsensitiveUnique( user_model, user_model.USERNAME_FIELD, validators.DUPLICATE_USERNAME, ) validator_same = validators.CaseInsensitiveUnique( user_model, user_model.USERNAME_FIELD, validators.DUPLICATE_USERNAME, ) self.assertTrue(validator.__eq__(validator_same)) validator_different = validators.CaseInsensitiveUnique( user_model, "not username field", validators.DUPLICATE_USERNAME ) self.assertFalse(validator.__eq__(validator_different)) def test_case_insensitive_form(self): """ Test the case-insensitive registration form. """ base_creation_data = self.valid_data.copy() base_creation_data["password"] = base_creation_data["password1"] del base_creation_data["password1"] del base_creation_data["password2"] test_names = [ ("alice", "ALICE"), ("ALICE", "alice"), ("Alice", "alice"), ("AlIcE", "aLiCe"), ("STRASSBURGER", "straßburger"), ] user_model = get_user_model() for name, conflict in test_names: creation_data = base_creation_data.copy() creation_data[user_model.USERNAME_FIELD] = name existing_user = user_model(**creation_data) existing_user.save() user_data = self.valid_data.copy() user_data[user_model.USERNAME_FIELD] = name form = forms.RegistrationFormCaseInsensitive(data=user_data) self.assertFalse(form.is_valid()) self.assertTrue(form.has_error(user_model.USERNAME_FIELD)) self.assertEqual( [str(validators.DUPLICATE_USERNAME)], form.errors[user_model.USERNAME_FIELD], ) self.assertEqual(1, len(form.errors[user_model.USERNAME_FIELD])) def test_tos_field(self): """ The terms-of-service field on RegistrationFormTermsOfService is required. """ form = forms.RegistrationFormTermsOfService(data=self.valid_data.copy()) self.assertFalse(form.is_valid()) self.assertTrue(form.has_error("tos")) self.assertEqual(form.errors["tos"], [str(validators.TOS_REQUIRED)]) def test_email_uniqueness(self): """ Email uniqueness is enforced by RegistrationFormUniqueEmail. """ user_model = get_user_model() user_model.objects.create( username="bob", email=self.valid_data["email"], password=self.valid_data["password1"], ) form = forms.RegistrationFormUniqueEmail(data=self.valid_data.copy()) self.assertFalse(form.is_valid()) self.assertTrue(form.has_error("email")) self.assertEqual(form.errors["email"], [str(validators.DUPLICATE_EMAIL)]) data = self.valid_data.copy() data.update(email="bob@example.com") form = forms.RegistrationFormUniqueEmail(data=data) self.assertTrue(form.is_valid()) def test_confusables_validator(self): """ Test the confusable-username validator standalone. """ for dangerous_value in ( "p\u0430yp\u0430l", "g\u043e\u043egle", "\u03c1ay\u03c1al", ): with self.assertRaises(ValidationError): validators.validate_confusables(dangerous_value) for safe_value in ( "paypal", "google", "root", "admin", "\u041f\u0451\u0442\u0440", "\u5c71\u672c", 3, ): validators.validate_confusables(safe_value) def test_confusables_email_validator(self): """ Test the confusable-email validator standalone. """ for dangerous_value in ( "p\u0430yp\u0430l@example.com", "g\u043e\u043egle@example.com", "\u03c1ay\u03c1al@example.com", "paypal@ex\u0430mple.com", "google@exam\u03c1le.com", ): with self.assertRaises(ValidationError): validators.validate_confusables_email(dangerous_value) for safe_value in ( "paypal@example.com", "google@example.com", "\u041f\u0451\u0442\u0440@example.com", "\u5c71\u672c@example.com", "username", ): validators.validate_confusables_email(safe_value) ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1578221759.0 django-registration-3.3/tests/test_one_step_workflow.py0000644000076700000240000000433600000000000022645 0ustar00jamesstaff""" Tests for the one-step registration workflow. """ from django.apps import apps from django.contrib.auth import get_user_model from django.test import modify_settings, override_settings from django.urls import reverse from django_registration import signals from .base import WorkflowTestCase @modify_settings(INSTALLED_APPS={"remove": "django_registration"}) @override_settings(ROOT_URLCONF="django_registration.backends.one_step.urls") class OneStepWorkflowViewTests(WorkflowTestCase): """ Tests for the one-step workflow. """ def test_registration(self): """ Registration creates a new account and logs the user in. """ user_model = get_user_model() with self.assertSignalSent( signals.user_registered, required_kwargs=["user", "request"] ) as cm: resp = self.client.post( reverse("django_registration_register"), data=self.valid_data ) self.assertEqual( cm.received_kwargs["user"].get_username(), self.valid_data[user_model.USERNAME_FIELD], ) self.assertRedirects(resp, reverse("django_registration_complete")) new_user = user_model.objects.get(**self.user_lookup_kwargs) self.assertTrue(new_user.check_password(self.valid_data["password1"])) self.assertEqual(new_user.email, self.valid_data["email"]) # New user must be active. self.assertTrue(new_user.is_active) # New user must be logged in. resp = self.client.get(reverse("django_registration_register")) self.assertTrue(resp.context["user"].is_authenticated) @override_settings(AUTH_USER_MODEL="tests.CustomUser") @override_settings(ROOT_URLCONF="tests.urls.custom_user_one_step") class OneStepWorkflowCustomUserTests(OneStepWorkflowViewTests): """ Runs the one-step workflow's test suite, but with a custom user model. """ def test_custom_user_configured(self): """ Asserts that the user model in use is the custom user model defined in this test suite. """ user_model = get_user_model() custom_user = apps.get_model("tests", "CustomUser") assert user_model is custom_user ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1617253201.0 django-registration-3.3/tests/test_views.py0000644000076700000240000001206000000000000020225 0ustar00jamesstaff""" Tests for django-registration's built-in views. """ import logging import sys from django.contrib.auth import get_user_model from django.contrib.auth.models import AnonymousUser from django.core import mail, signing from django.core.exceptions import ImproperlyConfigured from django.test import RequestFactory, override_settings from django.urls import reverse from django_registration import forms from django_registration import views as base_views from django_registration.backends.activation import views as activation_views from django_registration.backends.one_step import views as one_step_views from .base import RegistrationTestCase @override_settings(ROOT_URLCONF="tests.urls.view_tests") class ActivationViewTests(RegistrationTestCase): """ Tests for aspects of the activation view not currently exercised by any built-in workflow. """ @override_settings(ACCOUNT_ACTIVATION_DAYS=7) def test_activation(self): """ Activation of an account functions properly when using a string URL as the success redirect. """ user_model = get_user_model() resp = self.client.post( reverse("django_registration_register"), data=self.valid_data ) activation_key = signing.dumps( obj=self.valid_data[user_model.USERNAME_FIELD], salt=activation_views.REGISTRATION_SALT, ) resp = self.client.get( reverse( "django_registration_activate", args=(), kwargs={"activation_key": activation_key}, ) ) self.assertRedirects(resp, "/activate/complete/") @override_settings(AUTH_USER_MODEL="tests.CustomUser") class CustomUserTests(RegistrationTestCase): """ Test custom-user support. """ def test_user_mismatch_breaks_view(self): """ When RegistrationView detects a mismatch between the model used by its form class and the configured user model, it raises ImproperlyConfigured. """ for view_class in ( base_views.RegistrationView, activation_views.RegistrationView, one_step_views.RegistrationView, ): for form_class in ( forms.RegistrationForm, forms.RegistrationFormCaseInsensitive, forms.RegistrationFormTermsOfService, forms.RegistrationFormUniqueEmail, ): view = view_class() message = base_views.USER_MODEL_MISMATCH.format( view=view.__class__, form=forms.RegistrationForm, form_model=form_class._meta.model, user_model=get_user_model(), ) with self.assertRaisesMessage(ImproperlyConfigured, message): view.get_form() class RegistrationError(Exception): """ Distinct exception class to simulate an unhandled error in the below tests. """ class BuggyRegistrationView(base_views.RegistrationView): """ Registration view that simulates an unhandled exception. """ def registration_allowed(self): raise RegistrationError("catch me if you can") buggy_view = BuggyRegistrationView.as_view() @override_settings(ADMINS=[("Admin", "admin@localhost")]) class SensitiveParameterFilterTests(RegistrationTestCase): """ Test filtering of sensitive POST parameters in error reports for the registration view. """ logger = logging.getLogger("django") factory = RequestFactory() def test_sensitive_post_parameters_are_filtered(self): """ When an unexpected exception occurs during a POST request to the registration view, the default email report to ADMINS must not contain the submitted passwords. """ request = self.factory.post("/raise/", data=self.valid_data) request.user = AnonymousUser() # we cannot use self.assertRaises(...) here because of sys.exc_info() try: buggy_view(request) self.fail("expected exception not thrown") except RegistrationError as error: self.assertEqual(str(error), "catch me if you can") # based on code in Django (tests/view_tests/views.py) self.logger.error( "Internal Server Error: %s" % request.path, exc_info=sys.exc_info(), extra={"status_code": 500, "request": request}, ) self.assertEqual(len(mail.outbox), 1) email = mail.outbox[0] self.assertIn("RegistrationError at /raise/", email.body) self.assertIn("catch me if you can", email.body) self.assertIn("No GET data", email.body) self.assertNotIn("No POST data", email.body) self.assertIn("password1", email.body) self.assertIn("password2", email.body) self.assertNotIn(self.valid_data["password1"], email.body) self.assertNotIn(self.valid_data["password2"], email.body) self.assertNotIn(self.valid_data["email"], email.body) ././@PaxHeader0000000000000000000000000000003400000000000010212 xustar0028 mtime=1653723062.4805567 django-registration-3.3/tests/urls/0000755000076700000240000000000000000000000016445 5ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1578220491.0 django-registration-3.3/tests/urls/__init__.py0000644000076700000240000000000000000000000020544 0ustar00jamesstaff././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1578220645.0 django-registration-3.3/tests/urls/custom_user_activation.py0000644000076700000240000000264100000000000023613 0ustar00jamesstaff""" URLs used to test the activation workflow with a custom user model. You should not use these in any sort of real environment. """ from django.urls import path from django.views.generic.base import TemplateView from django_registration.backends.activation import views from django_registration.forms import RegistrationForm from ..models import CustomUser class CustomUserRegistrationForm(RegistrationForm): class Meta(RegistrationForm.Meta): model = CustomUser urlpatterns = [ path( "activate/complete/", TemplateView.as_view( template_name="django_registration/activation_complete.html" ), name="django_registration_activation_complete", ), path( "activate//", views.ActivationView.as_view(), name="django_registration_activate", ), path( "register/", views.RegistrationView.as_view(form_class=CustomUserRegistrationForm), name="django_registration_register", ), path( "register/complete/", TemplateView.as_view( template_name="django_registration/registration_complete.html" ), name="django_registration_complete", ), path( "register/closed/", TemplateView.as_view( template_name="django_registration/registration_closed.html" ), name="django_registration_disallowed", ), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1578220650.0 django-registration-3.3/tests/urls/custom_user_one_step.py0000644000076700000240000000206400000000000023265 0ustar00jamesstaff""" URLs used to test the one-step workflow with a custom user model. You should not use these in any sort of real environment. """ from django.urls import path from django.views.generic.base import TemplateView from django_registration.backends.one_step import views from django_registration.forms import RegistrationForm from ..models import CustomUser class CustomUserRegistrationForm(RegistrationForm): class Meta(RegistrationForm.Meta): model = CustomUser urlpatterns = [ path( "register/", views.RegistrationView.as_view(form_class=CustomUserRegistrationForm), name="django_registration_register", ), path( "register/closed/", TemplateView.as_view( template_name="django_registration/registration_closed.html" ), name="django_registration_disallowed", ), path( "register/complete/", TemplateView.as_view( template_name="django_registration/registration_complete.html" ), name="django_registration_complete", ), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1607759404.0 django-registration-3.3/tests/urls/view_tests.py0000644000076700000240000000263100000000000021215 0ustar00jamesstaff""" URLs used in the unit tests for django-registration. You should not attempt to use these URLs in any sort of real or development environment. """ from django.urls import path from django.views.generic.base import TemplateView from django_registration.backends.activation.views import RegistrationView from ..views import ActivateWithComplexRedirect urlpatterns = [ path( "", TemplateView.as_view( template_name="django_registration/activation_complete.html" ), name="simple_activation_redirect", ), path( "activate/complete/", TemplateView.as_view( template_name="django_registration/activation_complete.html" ), name="django_registration_activation_complete", ), path( "activate//", ActivateWithComplexRedirect.as_view(), name="django_registration_activate", ), path("register/", RegistrationView.as_view(), name="django_registration_register"), path( "register/complete/", TemplateView.as_view( template_name="django_registration/registration_complete.html" ), name="django_registration_complete", ), path( "register/closed/", TemplateView.as_view( template_name="django_registration/registration_closed.html" ), name="django_registration_disallowed", ), ] ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1570956802.0 django-registration-3.3/tests/views.py0000644000076700000240000000054000000000000017166 0ustar00jamesstaff""" Viw classes to exercise options of the registration view behavior not covered by the built-in workflows. """ from django.urls import reverse_lazy from django_registration.backends.activation.views import ActivationView class ActivateWithComplexRedirect(ActivationView): success_url = reverse_lazy("django_registration_activation_complete") ././@PaxHeader0000000000000000000000000000002600000000000010213 xustar0022 mtime=1653722009.0 django-registration-3.3/tox.ini0000644000076700000240000001473200000000000015640 0ustar00jamesstaff# This is a configuration file for running tests, linters and other # code-quality checks, using Tox (https://tox.readthedocs.io/), which # allows configuring and automatically running many different test # environments and checks, each in a separate Python virtual # environment (and each potentially using a different version of # Python). # # Using this file requires having tox installed -- "pip install tox" # or refer to Tox's own documentation -- and a functioning # installation of at least one targeted Python version. Running "tox" # with no command-line arguments will attempt to run all environments # against all targeted Python versions, and will fail if any Python # versions are missing. To select only certain test environments to # run, use the "-e" command-line flag and pass either a single # environment name, or a comma-separated list of environment names. To # see all available environments with their descriptions, run: # "tox -v 1 --listenvs" # Base configuration: list of environments and Python versions. ################################################################################ # Environment matrix. [tox] envlist = py37-django32 py{38,39,310}-django{32,40} black check-description check-manifest docs flake8 isort spelling # Configuration for running on GitHub Actions via tox-gh-actions. [gh-actions] python = 3.7: py37 3.8: py38 3.9: py39 3.10: py310, black, check-description, check-manifest, docs, flake8, isort, spelling # The base test environment -- runs the unit test suite with coverage. ################################################################################ [testenv] description = Run tests with coverage report. allowlist_externals = find rm # Python silences deprecation warnings by default, but we want to see # them during test runs. setenv = PYTHONWARNINGS=once::DeprecationWarning # Ensure each virtualenv always has latest pip, so output doesn't get # cluttered with messages about needing to upgrade it. Note that tox's # 'download=true' option doesn't quite do the same thing: it ensures # pip/setuptools/wheel get upgraded at virtualenv creation time, but # will not upgrade them when reusing an already-created virtualenv. commands_pre = {envpython} -m pip install --upgrade pip # Many test runs will leave behind some type of artifact -- Python # bytecode, packaging-related files, coverage data -- which should be # removed before the next run in order to ensure a clean starting # point. The commands below run after the main test commands of each # virtualenv, and perform this cleanup. commands_post = find {toxinidir}/tests -type f -name "*.pyc" -delete find {toxinidir}/tests -type d -name "__pycache__" -delete find {toxinidir}/src -type f -name "*.pyc" -delete find {toxinidir}/src -type d -name "__pycache__" -delete find {toxinidir}/src -type f -path "*.egg-info*" -delete find {toxinidir}/src -type d -path "*.egg-info" -delete rm -f {toxinidir}/.coverage commands = coverage run --source django_registration runtests.py coverage report -m deps = coverage django32: Django>=3.2,<4.0 django40: Django>=4.0,<4.1 # Documentation checks. ################################################################################ # Runs an HTML build of the documentation, and fails if there's an # error in building it. [testenv:docs] description = Check that the documentation can build. basepython = python3.10 changedir = {toxinidir}/docs commands = sphinx-build -b html -d {envtmpdir}/doctrees . {envtmpdir}/html deps = sphinx sphinx_rtd_theme # Runs a spelling checker over the documentation, and if misspelled # words are found, fails the build and outputs a list of # them. Requires the 'enchant' C library preinstalled on the target # system. [testenv:spelling] description = Spell-check documentation. basepython = python3.10 changedir = {toxinidir}/docs # This is the only env where we silence deprecation warnings, because # we'd already catch any from our actual codebase elsewhere and in # this env we are asking Sphinx to promote warnings to errors in order # to fail the build on anything caught by the spelling checker. setenv = PYTHONWARNINGS=ignore::DeprecationWarning commands = sphinx-build -W -b spelling -d {envtmpdir}/doctrees . {envtmpdir}/html deps = sphinx sphinx_rtd_theme pyenchant sphinxcontrib-spelling # Linters. ################################################################################ # Runs the Black code formatter over the entire code base, and fails # if Black thinks any files need to be reformatted. [testenv:black] description = Check code formatting using Black. basepython = python3.10 changedir = {toxinidir} deps = black commands = black --line-length 88 --check --diff {toxinidir}/src/django_registration {toxinidir}/tests {toxinidir}/docs {toxinidir} # Runs the flake8 linter over the entire code base, and fails if # flake8 finds any problems. [testenv:flake8] description = Lint code with flake8. basepython = python3.10 changedir = {toxinidir} deps = flake8 commands = flake8 {toxinidir}/src/django_registration {toxinidir}/tests # Runs the isort import linter over the entire code base, and fails if # any problems are found. [testenv:isort] description = Lint imports with isort. basepython = python3.10 changedir = {toxinidir} deps = isort commands = isort --check-only --diff {toxinidir}/src/django_registration {toxinidir}/tests # Packaging checks. ################################################################################ # Builds the package and runs 'twine check' to ensure it will render # correctly when uploaded to the Python Package Index, or fail if not. [testenv:check-description] description = Check that the package description will render on the Python Package Index. basepython = python3.10 changedir = {toxinidir} skip_install = true deps = twine # In this environment we always want latest wheel in addition to # latest pip. commands_pre = {envpython} -m pip install --upgrade pip setuptools wheel commands = {envpython} -m pip wheel -w {envtmpdir}/build --no-deps . twine check {envtmpdir}/build/* # Runs check-manifest, a tool that builds the package and compares the # files in the package to the files under version control, and fails # if any version-controlled files do not end up in the package. [testenv:check-manifest] description = Check that the set of packaged files matches the set of version-controlled files. basepython = python3.10 changedir = {toxinidir} skip_install = true deps = check-manifest commands = check-manifest --verbose