Commits

James Bennett committed 7bf38fc

Initial Mercurial import

Comments (0)

Files changed (59)

+The primary author of django-registration is James Bennett
+<james@b-list.org>, who may be found online at
+<http://www.b-list.org/>.
+
+
+Others who have contributed to the application:
+
+* Samuel Adam (French translation)
+* Jannis Leidel (German translation)
+* Rapahel Hertzog (helpful suggestions on packaging and distribution)
+* Panos Laganakos (Greek translation)
+* Ilya Filippov (Russian translation)
+* Jarek Zgoda (Polish translation)
+* Meir Kriheli (Hebrew translation)
+* Italo Maia (Brazilian Portuguese translation)
+* Shinya Okano (Japanese translation)
+* A. Al-Ibrahim (Arabic translation)
+* Ernesto Rico Schmidt (Spanish translation)
+* Vladislav Mitov (Bulgarian translation)
+* Leonardo Manuel Rocha (Argentinean Spanish translation)
+* Emil Stenström (Swedish translation)
+* Liang Feng (Chinese translations)
+* Nebojsa Djordjevic (Serbian translation)
+* Nicola Larosa (Italian translation)
+* Joost Cassee (Dutch translation)
+=============================
+django-registration changelog
+=============================
+
+Version 0.6, 29 July 2008:
+--------------------------
+
+* Packaged from revision 166 in Subversion.
+
+* Fixed a multiple-objects exception in
+  ``RegistrationFormUniqueEmail`` when multiple users already have the
+  same email address.
+
+* Changed the ``success_url`` of the ``register()`` view to use
+  reverse URL resolution.
+
+* Added an ``extra_context`` argument to the ``register`` and
+  ``activate`` views, mimicking its functionality in Django's generic
+  views.
+
+* BACKWARDS-INCOMPATIBLE CHANGE: Switched the admin declaration to be
+  compliant with the newforms-admin refactor; the admin declaration
+  now lives in ``registration/admin.py``.
+
+* BACKWARDS-INCOMPATIBLE CHANGE: Switched form imports from using
+  ``django.newforms`` to using ``django.forms``; the old style now
+  raises a deprecation warning on Django trunk and on Django 1.0
+  alpha.
+
+
+Version 0.5, 4 June 2008:
+-------------------------
+
+* Packaged from revision 155 in Subversion.
+
+* Added Serbian translation.
+
+* Added Italian translation.
+
+* Username/email uniqueness checks are now case-insensitive. This is
+  potentially backwards-incompatible if you relied on them being
+  case-sensitive, but I don't know of any reason why you'd be doing
+  that.
+
+* Included forms now use lazy translations.
+
+* The ``register`` view can now handle files submitted for use in form
+  processing.
+
+* Reactivation of a manually-deactivated account is now prevented by
+  changing the activation key, on successful activation, to a dummy
+  string which will fail on subsequent activation attempts.
+
+
+Version 0.4p2, 10 Feburary 2008:
+--------------------------------
+
+* Added Brazilian Portuguese translation.
+
+* Added Japanese translation.
+
+* Added Hebrew translation.
+
+* Minor documentation fixes.
+
+
+Version 0.4p1, 16 December 2007:
+--------------------------------
+
+* Packaged from revision 129 in Subversion.
+
+* Added Polish translation.
+
+
+Version 0.4, 8 December 2007:
+-----------------------------
+
+* Packaged from revision 122 in Subversion.
+
+* Added Greek translation.
+
+* Added Russian translation.
+
+* Changed ``maxlength`` to ``max_length`` now that Django issues a
+  deprecation warning for it.
+
+* BACKWARDS-INCOMPATIBLE CHANGE: Changed the password validation to be
+  on ``clean()`` instead of ``clean_password2()``. This means that
+  errors from this must be accessed via ``non_field_errors()``.
+
+
+Version 0.3p5, 6 October 2007:
+------------------------------
+
+* Packaged from revision 112 in Subversion.
+
+* Added German translation.
+
+* Fixed a mismatch between the default ``RegistrationForm``'s maximum
+  length on email addresses and the actual maximum length on Django's
+  ``User`` model.
+
+* Fixed a situation where bad input for the ``password1`` field on
+  ``RegistrationForm`` could cause validation of ``password2`` to fail
+  with an exception.
+
+
+Version 0.3p4, 4 October 2007:
+------------------------------
+
+* Packaged from revision 101 in Subversion.
+
+* BACKWARDS-INCOMPATIBLE CHANGE: In response to larger numbers of
+  complaints from people trying to use the example templates as-is,
+  the example templates have been removed.
+
+
+Version 0.3p2, 23 September 2007:
+---------------------------------
+
+* Packaged from revision 100 in Subversion.
+
+* Fixed ``activate`` view to actually take the ``template_name``
+  argument.
+
+
+Version 0.3p1, 22 September 2007:
+---------------------------------
+
+* Packaged from revision 99 in Subversion.
+
+* Fixed a typo in docs/overview.txt.
+
+* Fixed a typo in bin/delete_expired_users.py.
+
+* Added French translation.
+
+
+Version 0.3, 19 September 2007:
+-------------------------------
+
+Packaged from revision 89 in Subversion; download at
+http://django-registration.googlecode.com/files/registration-0.3.tar.gz
+
+* Changed ``register`` and ``activate`` views to accept
+  ``template_name`` keyword argument for selecting a custom template.
+
+* Changed ``register`` view to accept ``form_class`` keyword
+  argument specifying the form to use.
+
+* BACKWARDS-INCOMPATIBLE CHANGE: Changed
+  ``RegistrationManager.create_inactive_user`` to use a template for
+  the subject of the activation email.
+
+* BACKWARDS-INCOMPATIBLE CHANGE: Removed the ``tos`` field from
+  ``RegistrationForm``; if you were relying on it, switch to using
+  ``RegistrationFormTermsOfService`` instead.
+
+* BACKWARDS-INCOMPATIBLE CHANGE: The activation email template now
+  receives the current ``Site`` object as the context variable
+  ``site``, and the ``current_site`` variable, which only held the
+  domain, is no longer available.
+
+* Added script ``bin/delete_expired_users.py`` with instructions on
+  how to use it as a cron job to clean up expired/inactive accounts.
+
+* Marked strings for translation and added ``locale`` directory so
+  that translations can be added.
+
+* Updated to deal with merge of Django's Unicode branch into trunk;
+  now using Unicode-aware functions everywhere.
+
+
+Version 0.2, 29 May 2007:
+-------------------------
+
+Packaged from revision 76 in Subversion; download at
+http://django-registration.googlecode.com/files/registration-0.2.tar.gz
+
+* Added ability to specify a callback in
+  ``RegistrationManager.create_inactive_user`` or in the ``register``
+  view to enable creation of site-specific user profile.
+
+* Separated out the logic of creating the profile into a new method on
+  ``RegistrationManager``: ``create_profile``.
+
+* Added URLConf support for various useful views in
+  ``django.contrib.auth``.
+
+* BACKWARDS-INCOMPATIBLE CHANGE: removed the ``key_generated`` field
+  from ``RegistrationProfile``; activation key expiration is now
+  calculated based on the ``date_joined`` field in the ``User`` model.
+  Drop the ``key_generated`` column from your database when upgrading
+  from 0.1.
+
+
+Version 0.1, 23 May 2007:
+-------------------------
+
+Packaged from revision 56 in Subversion; download at
+http://django-registration.googlecode.com/files/registration-0.1.tar.gz
+
+* First packaged version using distutils.
+
+* Added docs/ directory and overview. 
+Thanks for downloading django-registration.
+
+To install it, run the following command inside this directory:
+
+    python setup.py install
+
+If you have the Python ``easy_install`` utility available, you can
+also type the following to download and install in one step::
+
+   easy_install django-registration
+
+Or if you'd prefer you can simply place the included ``registration``
+directory somewhere on your Python path, or symlink to it from
+somewhere on your Python path; this is useful if you're working from a
+Subversion checkout.
+
+Note that this application requires Python 2.3 or later, and a
+functional installation of Django 1.0 or newer. You can obtain Python
+from http://www.python.org/ and Django from
+http://www.djangoproject.com/.
+Copyright (c) 2007-2008, 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.
+include CHANGELOG.txt
+include INSTALL.txt
+include LICENSE.txt
+include MANIFEST.in
+include README.txt
+include AUTHORS.txt
+recursive-include docs *
+recursive-include registration/bin *
+recursive-include registration/locale *
+========================
+Django user registration
+========================
+
+This is a fairly simple user-registration application for Django_,
+designed to make allowing user signups as painless as possible. It
+requires a functional installation of Django 1.0 or newer, but has no
+other dependencies.
+
+For installation instructions, see the file "INSTALL.txt" in this
+directory; for instructions on how to use this application, and on
+what it provides, see the file "overview.txt" in the "docs/"
+directory.
+=====
+Forms
+=====
+
+
+To ease and automate the process of validating user information during
+registration, several form classes (built using Django's `newforms
+library`_) are provided: a base ``RegistrationForm`` and subclasses
+which provide specific customized functionality. All of the forms
+described below are found in ``registration.forms``.
+
+.. _newforms library: http://www.djangoproject.com/documentation/newforms/
+
+
+``RegistrationForm``
+====================
+
+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 either preserve the base ``save()`` or implement a
+``save()`` which accepts the ``profile_callback`` keyword argument and
+passes it through to
+``RegistrationProfile.objects.create_inactive_user()``.
+    
+Fields:
+
+``username``
+    The new user's requested username. Will be validated according to
+    the same regular expression Django's authentication system uses to
+    validate usernames.
+
+``email``
+    The new user's email address. Must be a well-formed email address.
+
+``password1``
+    The new user's password.
+
+``password2``
+    The password, again, to catch typos.
+
+
+Non-validation methods:
+
+``save()``
+    Creates the new ``User`` and ``RegistrationProfile``, and returns
+    the ``User``.
+    
+    This is essentially a light wrapper around
+    ``RegistrationProfile.objects.create_inactive_user()``, feeding it
+    the form data and a profile callback (see the documentation on
+    ``create_inactive_user()`` for details) if supplied.
+
+
+Subclasses of ``RegistrationForm``
+==================================
+
+As explained above, subclasses may add any additional validation they
+like, but must either preserve the ``save()`` method or implement a
+``save()`` method with an identical signature.
+
+Three subclasses are included as examples, and as ready-made
+implementations of useful customizations:
+
+``RegistrationFormTermsOfService``
+    Subclass of ``RegistrationForm`` which adds a required checkbox
+    for agreeing to a site's Terms of Service.
+
+``RegistrationFormUniqueEmail``
+    Subclass of ``RegistrationForm`` which enforces uniqueness of
+    email addresses.
+
+``RegistrationFormNoFreeEmail``
+    Subclass of ``RegistrationForm`` which disallows registration with
+    email addresses from popular free webmail services; moderately
+    useful for preventing automated spam registrations.
+    
+    To change the list of banned domains, subclass this form and
+    override the attribute ``bad_domains``.
+===================
+Models and managers
+===================
+
+
+Because the two-step process of registration and activation requires
+some means of temporarily storing activation key and retrieving it for
+verification, a simple model --
+``registration.models.RegistrationProfile`` -- is provided in this
+application, and a custom manager --
+``registration.models.RegistrationManager`` -- is included and defines
+several useful methods for interacting with ``RegistrationProfile``.
+
+Both the ``RegistrationProfile`` model and the ``RegistrationManager``
+are found in ``registration.models``.
+
+
+The ``RegistrationProfile`` model
+=================================
+
+A simple profile which stores an activation key for use during user
+account registration.
+
+Generally, you will not want to interact directly with instances of
+this model; the provided manager includes methods for creating and
+activating new accounts, as well as for cleaning out accounts which
+have never been activated.
+
+While it is possible to use this model as the value of the
+``AUTH_PROFILE_MODULE`` setting, it's not recommended that you do
+so. This model's sole purpose is to store data temporarily during
+account registration and activation, and a mechanism for automatically
+creating an instance of a site-specific profile model is provided via
+the ``create_inactive_user`` on ``RegistrationManager``.
+    
+``RegistrationProfile`` objects have the following fields:
+
+``activation_key``
+    A SHA1 hash used as an account's activation key.
+
+``user``
+    The ``User`` object for which activation information is being
+    stored.
+
+``RegistrationProfile`` also has one custom method defined:
+
+``activation_key_expired()``
+    Determines whether this ``RegistrationProfile``'s activation key
+    has expired.
+    
+    Returns ``True`` if the key has expired, ``False`` otherwise.
+    
+    Key expiration is determined by a two-step process:
+    
+    1. If the user has already activated, the key will have been reset
+       to the string ``ALREADY_ACTIVATED``. Re-activating is not
+       permitted, and so this method returns ``True`` in this case.
+    
+    2. Otherwise, the date the user signed up is incremented by the
+       number of days specified in the setting
+       ``ACCOUNT_ACTIVATION_DAYS`` (which should be the number of days
+       after signup during which a user is allowed to activate their
+       account); if the result is less than or equal to the current
+       date, the key has expired and this method returns ``True``.
+
+
+The ``RegistrationManager``
+===========================
+
+Custom manager for the ``RegistrationProfile`` model.
+    
+The methods defined here provide shortcuts for account creation and
+activation (including generation and emailing of activation keys), and
+for cleaning out expired inactive accounts.
+    
+Methods:
+
+``activate_user(activation_key)``
+    Validates an activation key and activates the corresponding
+    ``User`` if valid.
+    
+    If the key is valid and has not expired, returns the ``User``
+    after activating.
+    
+    If the key is not valid or has expired, returns ``False``.
+    
+    If the key is valid but the ``User`` is already active, returns
+    ``False``.
+    
+    To prevent reactivation of an account which has been deactivated
+    by site administrators, the activation key is reset to the string
+    ``ALREADY_ACTIVATED`` after successful activation.
+
+``create_inactive_user(username, password, email, send_email=True, profile_callback=None)``
+    Creates a new, inactive ``User``, generates a
+    ``RegistrationProfile`` and emails its activation key to the
+    ``User``. Returns the new ``User``.
+    
+    To disable the email, call with ``send_email=False``.
+    
+    To enable creation of a custom user profile along with the
+    ``User`` (e.g., the model specified in the ``AUTH_PROFILE_MODULE``
+    setting), define a function which knows how to create and save an
+    instance of that model with appropriate default values, and pass
+    it as the keyword argument ``profile_callback``. This function
+    should accept one keyword argument:
+    
+    ``user``
+        The ``User`` to relate the profile to.
+
+``create_profile(user)``
+    Creates a ``RegistrationProfile`` for a given ``User``. Returns
+    the ``RegistrationProfile``.
+    
+    The activation key for the ``RegistrationProfile`` will be a SHA1
+    hash, generated from a combination of the ``User``'s username and
+    a random salt.
+
+``deleted_expired_users()``
+    Removes expired instances of ``RegistrationProfile`` and their
+    associated ``User`` objects.
+    
+    Accounts to be deleted are identified by searching for instances
+    of ``RegistrationProfile`` with expired activation keys, and then
+    checking to see if their associated ``User`` instances have the
+    field ``is_active`` set to ``False``; any ``User`` who is both
+    inactive and has an expired activation key will be deleted.
+    
+    It is recommended that this method be executed regularly as part
+    of your routine site maintenance; this application provides a
+    custom management command which will call this method, accessible
+    as ``manage.py cleanupregistration``.
+    
+    Regularly clearing out accounts which have never been activated
+    serves two useful purposes:
+    
+    1. It alleviates the ocasional need to reset a
+       ``RegistrationProfile`` and/or re-send an activation email when
+       a user does not receive or does not act upon the initial
+       activation email; since the account will be deleted, the user
+       will be able to simply re-register and receive a new activation
+       key.
+    
+    2. It prevents the possibility of a malicious user registering one
+       or more accounts and never activating them (thus denying the
+       use of those usernames to anyone else); since those accounts
+       will be deleted, the usernames will become available for use
+       again.
+    
+    If you have a troublesome ``User`` and wish to disable their
+    account while keeping it in the database, simply delete the
+    associated ``RegistrationProfile``; an inactive ``User`` which
+    does not have an associated ``RegistrationProfile`` will not be
+    deleted.

docs/overview.txt

+===================
+Django registration
+===================
+
+
+This is a fairly simple user-registration application for Django_,
+designed to make allowing user signups as painless as possible.
+
+.. _Django: http://www.djangoproject.com/
+
+
+Overview
+========
+
+This application enables a common user-registration workflow:
+
+1. User fills out a registration form, selecting a username and
+   password and entering an email address.
+
+2. An inactive account is created, and an activation link is sent to
+   the user's email address.
+
+3. User clicks the activation link, the account becomes active and the
+   user is able to log in and begin contributing to your site.
+
+Various methods of extending and customizing the registration process
+are also provided.
+
+
+Installation
+============
+
+In order to use django-registration, you will need to have a
+functioning installation of Django 1.0 or newer; due to changes needed
+to stabilize Django's APIs prior to the 1.0 release,
+django-registration will not work with older releases of Django.
+
+Also, if you haven't downloaded a copy of django-registration already,
+you'll need to do so. You can download a packaged version of the
+latest release here::
+
+    http://django-registration.googlecode.com/files/django-registration-0.6.tar.gz
+
+Open up the package (on most operating systems you can double-click,
+or you can use the command ``tar zxvf registration-0.6.tar.gz`` to
+manually unpack it), and, at a command line, navigate to the directory
+``registration-0.6``, then type:
+
+    python setup.py install
+
+This will install django-registration into a directory on your Python
+import path. For system-wide installation on Linux/Unix and Mac OS,
+you can use ``sudo``::
+
+    sudo python setup.py install
+
+Alternatively, you do a Subversion checkout to get the latest
+development code (though this may also include bugs which have not yet
+been fixed)::
+
+    svn co http://django-registration.googlecode.com/svn/trunk/registration/
+
+For best results, do this in a directory that's on your Python path.
+
+
+Basic use
+=========
+
+To use the registration system with all its default settings, you'll
+need to do the following:
+
+1. Add ``registration`` to the ``INSTALLED_APPS`` setting of your
+   Django project.
+
+2. Add the setting ``ACCOUNT_ACTIVATION_DAYS`` to your settings file;
+   this should be the number of days activation keys will remain valid
+   after an account is registered.
+
+3. Create the necessary templates (see the section on templates below
+   for details).
+
+4. Add this line to your site's root URLConf::
+   
+       (r'^accounts/', include('registration.urls')),
+
+5. Link people to ``/accounts/register/`` so they can start signing
+   up.
+
+
+Templates used by django-registration
+=====================================
+
+The views included in django-registration make use of five templates:
+
+* ``registration/registration_form.html`` displays the registration
+  form for users to sign up.
+
+* ``registration/registration_complete.html`` is displayed after the
+  activation email has been sent, to tell the new user to check
+  his/her email.
+
+* ``registration/activation_email_subject.txt`` is used for the
+  subject of the activation email.
+
+* ``registration/activation_email.txt`` is used for the body of the
+  activation email.
+
+* ``registration/activate.html`` is displayed when a user attempts to
+  activate his/her account.
+
+Examples of all of these templates are not provided; you will need to
+create them yourself. For views defined in this application, see the
+included `views documentation`_ for details on available context
+variables, and for details on the templates used by the activation
+email see the included `models documentation`_.
+
+Additionally, the URLConf provided with django-registration includes
+URL patterns for useful views in Django's built-in authentication
+application -- this means that a single ``include`` in your root
+URLConf can wire up registration and the auth application's login,
+logout, and password change/reset views. If you choose to use these
+views you will need to provide your own templates for them; consult
+`the Django authentication documentation`_ for details on the
+templates and contexts used by these views.
+
+.. _views documentation: views.txt
+.. _models documentation: models.txt
+.. _the Django authentication documentation: http://www.djangoproject.com/documentation/authentication/
+
+
+How it works
+============
+
+Using the recommended default configuration, the URL
+``/accounts/register/`` will map to the view
+``registration.views.register``, which displays a registration form
+(an instance of ``registration.forms.RegistrationForm``); this form
+asks for a username, email address and password, and verifies that the
+username is available and requires the password to be entered twice
+(to catch typos). It then does three things:
+
+1. Creates an instance of ``django.contrib.models.auth.User``, using
+   the supplied username, email address and password; the
+   ``is_active`` field on the new ``User`` will be set to ``False``,
+   meaning that the account is inactive and the user will not be able
+   to log in yet.
+
+2. Creates an instance of ``registration.models.RegistrationProfile``,
+   stores an activation key (a SHA1 hash generated from the new user's
+   username plus a randomly-generated "salt"), and relates that
+   ``RegistrationProfile`` to the ``User`` it just created.
+
+3. Sends an email to the user (at the address they supplied)
+   containing a link which can be clicked to activate the account.
+
+For details on customizing this process, including use of alternate
+registration form classes and automatic creation of a site-specific
+profile, see the sections on customization below.
+
+After the activation email has been sent,
+``registration.views.register`` issues a redirect to the URL
+``/accounts/register/complete/``. By default, this is mapped to the
+``direct_to_template`` generic view, and displays the template
+``registration/registration_complete.html``; this is intended to show
+a short message telling the user to check his/her email for the
+activation link.
+
+The activation link will map to the view
+``registration.views.activate``, which will attempt to activate the
+account by setting the ``is_active`` field on the ``User`` to
+``True``. If the activation key for the ``User`` has expired (this is
+controlled by the setting ``ACCOUNT_ACTIVATION_DAYS``, as described
+above), the account will not be activated (see the section on
+maintenance below for instructions on cleaning out expired accounts
+which have not been activated).
+
+
+Maintenance
+===========
+
+Inevitably, a site which uses a two-step process for user signup --
+registration followed by activation -- will accumulate a certain
+number of accounts which were registered but never activated. These
+accounts clutter up the database and tie up usernames which might
+otherwise be actively used, so it's desirable to clean them out
+periodically. For this purpose, a script,
+``registration/bin/deleted_expired_users.py``, is provided, which is
+suitable for use as a regular cron job. See that file for notes on how
+to add it to your crontab, and the included models documentation (see
+below) for discussion of how it works and some caveats.
+
+
+Where to go from here
+=====================
+
+Full documentation for all included components is bundled in the
+packaged release; see the following files for details:
+
+* `Forms documentation`_ for details on ``RegistrationForm``,
+  pre-packaged subclasses and available customizations.
+
+* `Models documentation`_ for details on ``RegistrationProfile`` and
+  its custom manager.
+
+* `Views documentation`_ for details on the ``register`` and
+  ``activate`` views, and methods for customizing them.
+
+.. _Forms documentation: forms.txt
+.. _Models documentation: models.txt
+.. _Views documentation: views.txt
+
+
+Development
+===========
+
+The `latest released version`_ of this application is 0.6, and is
+quite stable; it's already been deployed on a number of sites,
+including djangoproject.com. You can also obtain the absolute freshest
+code from `the development repository_`, but be warned that the
+development code may not always be backwards-compatible, and may well
+contain bugs that haven't yet been fixed.
+
+This document covers the 0.6 release of django-registration; new
+features introduced in the development trunk will be added to the
+documentation at the time of the next packaged release.
+
+.. _latest released version: http://django-registration.googlecode.com/files/django-registration-0.6.tar.gz
+.. _the development repository: http://django-registration.googlecode.com/svn/trunk/registration/
+
+
+Changes from previous versions
+==============================
+
+Several new features were added between version 0.2 and version 0.3;
+for details, see the CHANGELOG.txt file distributed with the packaged
+0.3 release.
+
+One important change to note before upgrading an installation of
+version 0.1 is a change to the ``RegistrationProfile`` model; the
+field ``key_generated`` has been removed, since it was redundant with
+the field ``date_joined`` on Django's bundled ``User`` model. Since
+this field became a ``NOT NULL`` column in the database, you will need
+to either drop the ``NOT NULL`` constraint or, preferably, simply drop
+the column. Consult your database's documentation for the correct way
+to handle this.
+
+Between version 0.3 and version 0.4, validation of the password fields
+was moved from ``clean_password2()`` to ``clean_password()``; this
+means that errors from mismatched passwords will now show up in
+``non_field_errors()`` instead of ``errors["password2"]``.
+
+
+Dependencies
+============
+
+The only dependencies for this application are a functioning install
+of Django 1.0 or newer and, of course, a Django project in which you'd
+like to use it.
+
+Your Django project should have ``django.contrib.admin``,
+``django.contrib.auth`` and ``django.contrib.sites`` in its
+``INSTALLED_APPS`` setting.
+
+
+What this application does not do
+=================================
+
+This application does not integrate in any way with OpenID, nor should
+it; one of the key selling points of OpenID is that users **don't**
+have to walk through an explicit registration step for every site or
+service they want to use :)
+
+
+If you spot a bug
+=================
+
+Head over to this application's `project page on Google Code`_ and
+check `the issues list`_ to see if it's already been reported. If not,
+open a new issue and I'll do my best to respond quickly.
+
+.. _project page on Google Code: http://code.google.com/p/django-registration/
+.. _the issues list: http://code.google.com/p/django-registration/issues/list
+=====
+Views
+=====
+
+
+Two views are included which, between them, handle the process of
+first registering and then activating new user accounts; both views
+are found in ``registration.views``.
+
+
+``activate``
+============
+
+Activate a ``User``'s account from an activation key, if their key is
+valid and hasn't expired.
+
+By default, use the template ``registration/activate.html``; to
+change this, pass the name of a template as the keyword argument
+``template_name``.
+
+**Required arguments**
+
+``activation_key``
+    The activation key to validate and use for activating the
+    ``User``.
+    
+**Optional arguments**
+
+``extra_context``
+    A dictionary of variables to add to the template context. Any
+    callable object in this dictionary will be called to produce the
+    end result which appears in the context.
+
+``template_name``
+    A custom template to use.
+
+**Context:**
+
+``account``
+    The ``User`` object corresponding to the account, if the
+    activation was successful. ``False`` if the activation was not
+    successful.
+    
+``expiration_days``
+    The number of days for which activation keys stay valid after
+    registration.
+
+Any extra variables supplied in the ``extra_context`` argument (see
+above).
+
+**Template:**
+    
+registration/activate.html or ``template_name`` keyword argument.
+
+
+``register``
+============
+
+Allow a new user to register an account.
+    
+Following successful registration, issue a redirect; by default, this
+will be whatever URL corresponds to the named URL pattern
+``registration_complete``, which will be
+``/accounts/register/complete/`` if using the included URLConf. To
+change this, point that named pattern at another URL, or pass your
+preferred URL as the keyword argument ``success_url``.
+    
+By default, ``registration.forms.RegistrationForm`` will be used as
+the registration form; to change this, pass a different form class as
+the ``form_class`` keyword argument. The form class you specify must
+have a method ``save`` which will create and return the new ``User``,
+and that method must accept the keyword argument ``profile_callback``
+(see below).
+
+To enable creation of a site-specific user profile object for the new
+user, pass a function which will create the profile object as the
+keyword argument ``profile_callback``. See
+``RegistrationManager.create_inactive_user`` in the file ``models.py``
+for details on how to write this function.
+
+By default, use the template ``registration/registration_form.html``;
+to change this, pass the name of a template as the keyword argument
+``template_name``.
+
+**Required arguments**
+
+None.
+
+**Optional arguments**
+
+``form_class``
+    The form class to use for registration.
+
+``extra_context``
+    A dictionary of variables to add to the template context. Any
+    callable object in this dictionary will be called to produce the
+    end result which appears in the context.
+
+``profile_callback``
+    A function which will be used to create a site-specific profile
+    instance for the new ``User``.
+
+``success_url``
+    The URL to redirect to on successful registration.
+
+``template_name``
+    A custom template to use.
+
+**Context:**
+
+``form``
+    The registration form.
+    
+Any extra variables supplied in the ``extra_context`` argument (see
+above).
+
+**Template:**
+
+registration/registration_form.html or ``template_name`` keyword
+argument.

registration/__init__.py

Empty file added.

registration/admin.py

+from django.contrib import admin
+
+from registration.models import RegistrationProfile
+
+
+class RegistrationAdmin(admin.ModelAdmin):
+    list_display = ('__unicode__', 'activation_key_expired')
+    search_fields = ('user__username', 'user__first_name')
+
+
+admin.site.register(RegistrationProfile, RegistrationAdmin)

registration/bin/delete_expired_users.py

+"""
+A script which removes expired/inactive user accounts from the
+database.
+
+This is intended to be run as a cron job; for example, to have it run
+at midnight each Sunday, you could add lines like the following to
+your crontab::
+
+    DJANGO_SETTINGS_MODULE=yoursite.settings
+    0 0 * * sun python /path/to/registration/bin/delete_expired_users.py
+
+See the method ``delete_expired_users`` of the ``RegistrationManager``
+class in ``registration/models.py`` for further documentation.
+
+"""
+
+if __name__ == '__main__':
+    from registration.models import RegistrationProfile
+    RegistrationProfile.objects.delete_expired_users()

registration/forms.py

+"""
+Forms and validation code for user registration.
+
+"""
+
+
+from django import forms
+from django.utils.translation import ugettext_lazy as _
+from django.contrib.auth.models import User
+
+from registration.models import RegistrationProfile
+
+
+# I put this on all required fields, because it's easier to pick up
+# on them with CSS or JavaScript if they have a class of "required"
+# in the HTML. Your mileage may vary. If/when Django ticket #3515
+# lands in trunk, this will no longer be necessary.
+attrs_dict = { 'class': 'required' }
+
+
+class RegistrationForm(forms.Form):
+    """
+    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 either preserve the base ``save()`` or implement
+    a ``save()`` which accepts the ``profile_callback`` keyword
+    argument and passes it through to
+    ``RegistrationProfile.objects.create_inactive_user()``.
+    
+    """
+    username = forms.RegexField(regex=r'^\w+$',
+                                max_length=30,
+                                widget=forms.TextInput(attrs=attrs_dict),
+                                label=_(u'username'))
+    email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,
+                                                               maxlength=75)),
+                             label=_(u'email address'))
+    password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
+                                label=_(u'password'))
+    password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
+                                label=_(u'password (again)'))
+    
+    def clean_username(self):
+        """
+        Validate that the username is alphanumeric and is not already
+        in use.
+        
+        """
+        try:
+            user = User.objects.get(username__iexact=self.cleaned_data['username'])
+        except User.DoesNotExist:
+            return self.cleaned_data['username']
+        raise forms.ValidationError(_(u'This username is already taken. Please choose another.'))
+
+    def clean(self):
+        """
+        Verifiy that the values entered into the two password fields
+        match. Note that an error here will end up in
+        ``non_field_errors()`` because it doesn't apply to a single
+        field.
+        
+        """
+        if 'password1' in self.cleaned_data and 'password2' in self.cleaned_data:
+            if self.cleaned_data['password1'] != self.cleaned_data['password2']:
+                raise forms.ValidationError(_(u'You must type the same password each time'))
+        return self.cleaned_data
+    
+    def save(self, profile_callback=None):
+        """
+        Create the new ``User`` and ``RegistrationProfile``, and
+        returns the ``User``.
+        
+        This is essentially a light wrapper around
+        ``RegistrationProfile.objects.create_inactive_user()``,
+        feeding it the form data and a profile callback (see the
+        documentation on ``create_inactive_user()`` for details) if
+        supplied.
+        
+        """
+        new_user = RegistrationProfile.objects.create_inactive_user(username=self.cleaned_data['username'],
+                                                                    password=self.cleaned_data['password1'],
+                                                                    email=self.cleaned_data['email'],
+                                                                    profile_callback=profile_callback)
+        return new_user
+
+
+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(attrs=attrs_dict),
+                             label=_(u'I have read and agree to the Terms of Service'))
+    
+    def clean_tos(self):
+        """
+        Validate that the user accepted the Terms of Service.
+        
+        """
+        if self.cleaned_data.get('tos', False):
+            return self.cleaned_data['tos']
+        raise forms.ValidationError(_(u'You must agree to the terms to register'))
+
+
+class RegistrationFormUniqueEmail(RegistrationForm):
+    """
+    Subclass of ``RegistrationForm`` which enforces uniqueness of
+    email addresses.
+    
+    """
+    def clean_email(self):
+        """
+        Validate that the supplied email address is unique for the
+        site.
+        
+        """
+        if User.objects.filter(email__iexact=self.cleaned_data['email']):
+            raise forms.ValidationError(_(u'This email address is already in use. Please supply a different email address.'))
+        return self.cleaned_data['email']
+
+
+class RegistrationFormNoFreeEmail(RegistrationForm):
+    """
+    Subclass of ``RegistrationForm`` which disallows registration with
+    email addresses from popular free webmail services; moderately
+    useful for preventing automated spam registrations.
+    
+    To change the list of banned domains, subclass this form and
+    override the attribute ``bad_domains``.
+    
+    """
+    bad_domains = ['aim.com', 'aol.com', 'email.com', 'gmail.com',
+                   'googlemail.com', 'hotmail.com', 'hushmail.com',
+                   'msn.com', 'mail.ru', 'mailinator.com', 'live.com']
+    
+    def clean_email(self):
+        """
+        Check the supplied email address against a list of known free
+        webmail domains.
+        
+        """
+        email_domain = self.cleaned_data['email'].split('@')[1]
+        if email_domain in self.bad_domains:
+            raise forms.ValidationError(_(u'Registration using free email addresses is prohibited. Please supply a different email address.'))
+        return self.cleaned_data['email']

registration/locale/ar/LC_MESSAGES/django.mo

Binary file added.

registration/locale/ar/LC_MESSAGES/django.po

+# 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "ملفات التسجيل الشخصية"

registration/locale/bg/LC_MESSAGES/django.mo

Binary file added.

registration/locale/bg/LC_MESSAGES/django.po

+# 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 <EMAIL@ADDRESS>, 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 <vladislav.mitov@gmail.com>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "регистрационни профили"
+

registration/locale/de/LC_MESSAGES/django.mo

Binary file added.

registration/locale/de/LC_MESSAGES/django.po

+# 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 <jannis@leidel.info>, 2007.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: django-registration 0.3 \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-19 19:30-0500\n"
+"PO-Revision-Date: 2007-09-29 16:50+0200\n"
+"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
+"Language-Team: Deutsch <de@li.org>\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 "Benutzername"
+
+#: forms.py:41
+msgid "email address"
+msgstr "E-Mail-Adresse"
+
+#: forms.py:43
+msgid "password"
+msgstr "Passwort"
+
+#: forms.py:45
+msgid "password (again)"
+msgstr "Passwort (wiederholen)"
+
+#: forms.py:54
+msgid "Usernames can only contain letters, numbers and underscores"
+msgstr "Benutzernamen können nur Buchstaben, Zahlen und Unterstriche enthalten"
+
+#: forms.py:59
+msgid "This username is already taken. Please choose another."
+msgstr "Dieser Benutzername ist schon vergeben. Bitte einen anderen wählen."
+
+#: forms.py:68
+msgid "You must type the same password each time"
+msgstr "Bitte das gleiche Passwort zur Überprüfung nochmal eingeben"
+
+#: forms.py:96
+msgid "I have read and agree to the Terms of Service"
+msgstr "Ich habe die Nutzungsvereinbarung gelesen und stimme ihr zu"
+
+#: forms.py:105
+msgid "You must agree to the terms to register"
+msgstr "Sie müssen der Nutzungsvereinbarung zustimmen, um sich zu registrieren"
+
+#: forms.py:124
+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:149
+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:188
+msgid "user"
+msgstr "Benutzer"
+
+#: models.py:189
+msgid "activation key"
+msgstr "Aktivierungsschlüssel"
+
+#: models.py:194
+msgid "registration profile"
+msgstr "Registrierungsprofil"
+
+#: models.py:195
+msgid "registration profiles"
+msgstr "Registrierungsprofile"

registration/locale/el/LC_MESSAGES/django.mo

Binary file added.

registration/locale/el/LC_MESSAGES/django.po

+# 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 <panos.laganakos@gmail.com>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 "προφίλ εγγραφών"

registration/locale/en/LC_MESSAGES/django.mo

Binary file added.

registration/locale/en/LC_MESSAGES/django.po

+# 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 <EMAIL@ADDRESS>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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 ""

registration/locale/es/LC_MESSAGES/django.mo

Binary file added.

registration/locale/es/LC_MESSAGES/django.po

+# 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 <e.rico.schmidt@gmail.com>, 2008.
+#
+#, fuzzy
+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: 2008-03-11 00:19-0400\n"
+"Last-Translator: Ernesto Rico Schmidt <e.rico.schmidt@gmail.com>\n"
+"Language-Team: Español <de@li.org>\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 coreo 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 usuarios 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"

registration/locale/es_AR/LC_MESSAGES/django.mo

Binary file added.

registration/locale/es_AR/LC_MESSAGES/django.po

+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2008 Leonardo Manuel Rocha
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <l e o m a r o at g m a i l dot c o m>, 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 <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\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"

registration/locale/fr/LC_MESSAGES/django.mo

Binary file added.

registration/locale/fr/LC_MESSAGES/django.po

+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Samuel Adam <samuel.adam@gmail.com>, 2007.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: django-registration 0.3 \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-19 19:30-0500\n"
+"PO-Revision-Date: 2007-09-20 10:30+0100\n"
+"Last-Translator: Samuel Adam <samuel.adam@gmail.com>\n"
+"Language-Team: Français <fr@li.org>\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 "pseudo"
+
+#: forms.py:41
+msgid "email address"
+msgstr "adresse email"
+
+#: forms.py:43
+msgid "password"
+msgstr "mot de passe"
+
+#: forms.py:45
+msgid "password (again)"
+msgstr "mot de passe (vérification)"
+
+#: forms.py:54
+msgid "Usernames can only contain letters, numbers and underscores"
+msgstr "Le pseudo ne peut contenir que des lettres, chiffres et le caractère souligné."
+
+#: forms.py:59
+msgid "This username is already taken. Please choose another."
+msgstr "Ce pseudo est déjà utilisé. Veuillez en choisir un autre."
+
+#: forms.py:68
+msgid "You must type the same password each time"
+msgstr "Veuillez indiquer le même mot de passe dans les deux champs"
+
+#: forms.py:96
+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:105
+msgid "You must agree to the terms to register"
+msgstr "Vous devez accepter les conditions d'utilisation pour vous inscrire"
+
+#: forms.py:124
+msgid ""
+"This email address is already in use. Please supply a different email "
+"address."
+msgstr "Cette adresse email est déjà utilisée. Veuillez en indiquer une autre."
+
+#: forms.py:149
+msgid ""
+"Registration using free email addresses is prohibited. Please supply a "
+"different email address."
+msgstr "L'inscription avec une adresse email d'un compte gratuit est interdite. Veuillez en indiquer une autre."
+
+#: models.py:188
+msgid "user"
+msgstr "utilisateur"
+
+#: models.py:189
+msgid "activation key"
+msgstr "clé d'activation"
+
+#: models.py:194
+msgid "registration profile"
+msgstr "profil d'inscription"
+
+#: models.py:195
+msgid "registration profiles"
+msgstr "profils d'inscription"

registration/locale/he/LC_MESSAGES/django.mo

Binary file added.

registration/locale/he/LC_MESSAGES/django.po

+# 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 <meir@mksoft.co.il>\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 "פרופילי רישום"
+

registration/locale/it/LC_MESSAGES/django.mo

Binary file added.

registration/locale/it/LC_MESSAGES/django.po

+# translation of django.po to Italiano
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Nicola Larosa <nico@tekNico.net>, 2008.
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-19 19:30-0500\n"
+"PO-Revision-Date: 2008-05-27 15:05+0200\n"
+"Last-Translator: Nicola Larosa <nico@tekNico.net>\n"
+"Language-Team: Italiano\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+
+#: forms.py:38
+msgid "username"
+msgstr "nome utente"
+
+#: forms.py:41
+msgid "email address"
+msgstr "indirizzo email"
+
+#: forms.py:43
+msgid "password"
+msgstr "password"
+
+#: forms.py:45
+msgid "password (again)"
+msgstr "password (di nuovo)"
+
+#: forms.py:54
+msgid "Usernames can only contain letters, numbers and underscores"
+msgstr "I nomi utente possono contenere solo lettere, numeri e sottolineature"
+
+#: forms.py:59
+msgid "This username is already taken. Please choose another."
+msgstr "Questo nome utente è già usato. Scegline un altro."
+
+#: forms.py:68
+msgid "You must type the same password each time"
+msgstr "Bi