Add external dependency django-registration
authentic2 depends upon a non-released version of django-registration (absent from pypi). We prefer to distribute it as a part of authentic2 for now.
This commit is contained in:
parent
1fd5a0c219
commit
625a17c2cb
|
@ -1,2 +1,6 @@
|
|||
import sys
|
||||
import os
|
||||
|
||||
sys.path.append(os.path.join(os.path.dirname(__file__), 'vendor'))
|
||||
# The version of Authentic
|
||||
VERSION = "1.9.1"
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
VERSION = (0, 8, 0, 'alpha', 1)
|
||||
|
||||
def get_version():
|
||||
version = '%s.%s' % (VERSION[0], VERSION[1])
|
||||
if VERSION[2]:
|
||||
version = '%s.%s' % (version, VERSION[2])
|
||||
if VERSION[3:] == ('alpha', 0):
|
||||
version = '%s pre-alpha' % version
|
||||
else:
|
||||
if VERSION[3] != 'final':
|
||||
version = "%s %s" % (version, VERSION[3])
|
||||
if VERSION[4] != 0:
|
||||
version = '%s %s' % (version, VERSION[4])
|
||||
return version
|
|
@ -0,0 +1,46 @@
|
|||
from django.contrib import admin
|
||||
from django.contrib.sites.models import RequestSite
|
||||
from django.contrib.sites.models import Site
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from registration.models import RegistrationProfile
|
||||
|
||||
|
||||
class RegistrationAdmin(admin.ModelAdmin):
|
||||
actions = ['activate_users', 'resend_activation_email']
|
||||
list_display = ('user', 'activation_key_expired')
|
||||
raw_id_fields = ['user']
|
||||
search_fields = ('user__username', 'user__first_name', 'user__last_name')
|
||||
|
||||
def activate_users(self, request, queryset):
|
||||
"""
|
||||
Activates the selected users, if they are not alrady
|
||||
activated.
|
||||
|
||||
"""
|
||||
for profile in queryset:
|
||||
RegistrationProfile.objects.activate_user(profile.activation_key)
|
||||
activate_users.short_description = _("Activate users")
|
||||
|
||||
def resend_activation_email(self, request, queryset):
|
||||
"""
|
||||
Re-sends activation emails for the selected users.
|
||||
|
||||
Note that this will *only* send activation emails for users
|
||||
who are eligible to activate; emails will not be sent to users
|
||||
whose activation keys have expired or who have already
|
||||
activated.
|
||||
|
||||
"""
|
||||
if Site._meta.installed:
|
||||
site = Site.objects.get_current()
|
||||
else:
|
||||
site = RequestSite(request)
|
||||
|
||||
for profile in queryset:
|
||||
if not profile.activation_key_expired():
|
||||
profile.send_activation_email(site)
|
||||
resend_activation_email.short_description = _("Re-send activation emails")
|
||||
|
||||
|
||||
admin.site.register(RegistrationProfile, RegistrationAdmin)
|
|
@ -0,0 +1,58 @@
|
|||
"""
|
||||
URL patterns for the views included in ``django.contrib.auth``.
|
||||
|
||||
Including these URLs (via the ``include()`` directive) will set up the
|
||||
following patterns based at whatever URL prefix they are included
|
||||
under:
|
||||
|
||||
* User login at ``login/``.
|
||||
|
||||
* User logout at ``logout/``.
|
||||
|
||||
* The two-step password change at ``password/change/`` and
|
||||
``password/change/done/``.
|
||||
|
||||
* The four-step password reset at ``password/reset/``,
|
||||
``password/reset/confirm/``, ``password/reset/complete/`` and
|
||||
``password/reset/done/``.
|
||||
|
||||
The default registration backend already has an ``include()`` for
|
||||
these URLs, so under the default setup it is not necessary to manually
|
||||
include these views. Other backends may or may not include them;
|
||||
consult a specific backend's documentation for details.
|
||||
|
||||
"""
|
||||
|
||||
from django.conf.urls.defaults import *
|
||||
|
||||
from django.contrib.auth import views as auth_views
|
||||
|
||||
|
||||
urlpatterns = patterns('',
|
||||
url(r'^login/$',
|
||||
auth_views.login,
|
||||
{'template_name': 'registration/login.html'},
|
||||
name='auth_login'),
|
||||
url(r'^logout/$',
|
||||
auth_views.logout,
|
||||
{'template_name': 'registration/logout.html'},
|
||||
name='auth_logout'),
|
||||
url(r'^password/change/$',
|
||||
auth_views.password_change,
|
||||
name='auth_password_change'),
|
||||
url(r'^password/change/done/$',
|
||||
auth_views.password_change_done,
|
||||
name='auth_password_change_done'),
|
||||
url(r'^password/reset/$',
|
||||
auth_views.password_reset,
|
||||
name='auth_password_reset'),
|
||||
url(r'^password/reset/confirm/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$',
|
||||
auth_views.password_reset_confirm,
|
||||
name='auth_password_reset_confirm'),
|
||||
url(r'^password/reset/complete/$',
|
||||
auth_views.password_reset_complete,
|
||||
name='auth_password_reset_complete'),
|
||||
url(r'^password/reset/done/$',
|
||||
auth_views.password_reset_done,
|
||||
name='auth_password_reset_done'),
|
||||
)
|
|
@ -0,0 +1,32 @@
|
|||
from django.core.exceptions import ImproperlyConfigured
|
||||
|
||||
|
||||
# Python 2.7 has an importlib with import_module; for older Pythons,
|
||||
# Django's bundled copy provides it.
|
||||
try:
|
||||
from importlib import import_module
|
||||
except ImportError:
|
||||
from django.utils.importlib import import_module
|
||||
|
||||
def get_backend(path):
|
||||
"""
|
||||
Return an instance of a registration backend, given the dotted
|
||||
Python import path (as a string) to the backend class.
|
||||
|
||||
If the backend cannot be located (e.g., because no such module
|
||||
exists, or because the module does not contain a class of the
|
||||
appropriate name), ``django.core.exceptions.ImproperlyConfigured``
|
||||
is raised.
|
||||
|
||||
"""
|
||||
i = path.rfind('.')
|
||||
module, attr = path[:i], path[i+1:]
|
||||
try:
|
||||
mod = import_module(module)
|
||||
except ImportError, e:
|
||||
raise ImproperlyConfigured('Error loading registration backend %s: "%s"' % (module, e))
|
||||
try:
|
||||
backend_class = getattr(mod, attr)
|
||||
except AttributeError:
|
||||
raise ImproperlyConfigured('Module "%s" does not define a registration backend named "%s"' % (module, attr))
|
||||
return backend_class()
|
|
@ -0,0 +1,139 @@
|
|||
from django.conf import settings
|
||||
from django.contrib.sites.models import RequestSite
|
||||
from django.contrib.sites.models import Site
|
||||
|
||||
from registration import signals
|
||||
from registration.forms import RegistrationForm
|
||||
from registration.models import RegistrationProfile
|
||||
|
||||
|
||||
class DefaultBackend(object):
|
||||
"""
|
||||
A registration backend which follows a simple workflow:
|
||||
|
||||
1. User signs up, inactive account is created.
|
||||
|
||||
2. Email is sent to user with activation link.
|
||||
|
||||
3. User clicks activation link, account is now active.
|
||||
|
||||
Using this backend requires that
|
||||
|
||||
* ``registration`` be listed in the ``INSTALLED_APPS`` setting
|
||||
(since this backend makes use of models defined in this
|
||||
application).
|
||||
|
||||
* The setting ``ACCOUNT_ACTIVATION_DAYS`` be supplied, specifying
|
||||
(as an integer) the number of days from registration during
|
||||
which a user may activate their account (after that period
|
||||
expires, activation will be disallowed).
|
||||
|
||||
* The creation of the templates
|
||||
``registration/activation_email_subject.txt`` and
|
||||
``registration/activation_email.txt``, which will be used for
|
||||
the activation email. See the notes for this backends
|
||||
``register`` method for details regarding these templates.
|
||||
|
||||
Additionally, registration can be temporarily closed by adding the
|
||||
setting ``REGISTRATION_OPEN`` and setting it to
|
||||
``False``. Omitting this setting, or setting it to ``True``, will
|
||||
be interpreted as meaning that registration is currently open and
|
||||
permitted.
|
||||
|
||||
Internally, this is accomplished via storing an activation key in
|
||||
an instance of ``registration.models.RegistrationProfile``. See
|
||||
that model and its custom manager for full documentation of its
|
||||
fields and supported operations.
|
||||
|
||||
"""
|
||||
def register(self, request, **kwargs):
|
||||
"""
|
||||
Given a username, email address and password, register a new
|
||||
user account, which will initially be inactive.
|
||||
|
||||
Along with the new ``User`` object, a new
|
||||
``registration.models.RegistrationProfile`` will be created,
|
||||
tied to that ``User``, containing the activation key which
|
||||
will be used for this account.
|
||||
|
||||
An email will be sent to the supplied email address; this
|
||||
email should contain an activation link. The email will be
|
||||
rendered using two templates. See the documentation for
|
||||
``RegistrationProfile.send_activation_email()`` for
|
||||
information about these templates and the contexts provided to
|
||||
them.
|
||||
|
||||
After the ``User`` and ``RegistrationProfile`` are created and
|
||||
the activation email is sent, the signal
|
||||
``registration.signals.user_registered`` will be sent, with
|
||||
the new ``User`` as the keyword argument ``user`` and the
|
||||
class of this backend as the sender.
|
||||
|
||||
"""
|
||||
username, email, password = kwargs['username'], kwargs['email'], kwargs['password1']
|
||||
if Site._meta.installed:
|
||||
site = Site.objects.get_current()
|
||||
else:
|
||||
site = RequestSite(request)
|
||||
new_user = RegistrationProfile.objects.create_inactive_user(username, email,
|
||||
password, site)
|
||||
signals.user_registered.send(sender=self.__class__,
|
||||
user=new_user,
|
||||
request=request)
|
||||
return new_user
|
||||
|
||||
def activate(self, request, activation_key):
|
||||
"""
|
||||
Given an an activation key, look up and activate the user
|
||||
account corresponding to that key (if possible).
|
||||
|
||||
After successful activation, the signal
|
||||
``registration.signals.user_activated`` will be sent, with the
|
||||
newly activated ``User`` as the keyword argument ``user`` and
|
||||
the class of this backend as the sender.
|
||||
|
||||
"""
|
||||
activated = RegistrationProfile.objects.activate_user(activation_key)
|
||||
if activated:
|
||||
signals.user_activated.send(sender=self.__class__,
|
||||
user=activated,
|
||||
request=request)
|
||||
return activated
|
||||
|
||||
def registration_allowed(self, request):
|
||||
"""
|
||||
Indicate whether account registration is currently permitted,
|
||||
based on the value of the setting ``REGISTRATION_OPEN``. This
|
||||
is determined as follows:
|
||||
|
||||
* If ``REGISTRATION_OPEN`` is not specified in settings, or is
|
||||
set to ``True``, registration is permitted.
|
||||
|
||||
* If ``REGISTRATION_OPEN`` is both specified and set to
|
||||
``False``, registration is not permitted.
|
||||
|
||||
"""
|
||||
return getattr(settings, 'REGISTRATION_OPEN', True)
|
||||
|
||||
def get_form_class(self, request):
|
||||
"""
|
||||
Return the default form class used for user registration.
|
||||
|
||||
"""
|
||||
return RegistrationForm
|
||||
|
||||
def post_registration_redirect(self, request, user):
|
||||
"""
|
||||
Return the name of the URL to redirect to after successful
|
||||
user registration.
|
||||
|
||||
"""
|
||||
return ('registration_complete', (), {})
|
||||
|
||||
def post_activation_redirect(self, request, user):
|
||||
"""
|
||||
Return the name of the URL to redirect to after successful
|
||||
account activation.
|
||||
|
||||
"""
|
||||
return ('registration_activation_complete', (), {})
|
|
@ -0,0 +1,54 @@
|
|||
"""
|
||||
URLconf for registration and activation, using django-registration's
|
||||
default backend.
|
||||
|
||||
If the default behavior of these views is acceptable to you, simply
|
||||
use a line like this in your root URLconf to set up the default URLs
|
||||
for registration::
|
||||
|
||||
(r'^accounts/', include('registration.backends.default.urls')),
|
||||
|
||||
This will also automatically set up the views in
|
||||
``django.contrib.auth`` at sensible default locations.
|
||||
|
||||
If you'd like to customize the behavior (e.g., by passing extra
|
||||
arguments to the various views) or split up the URLs, feel free to set
|
||||
up your own URL patterns for these views instead.
|
||||
|
||||
"""
|
||||
|
||||
|
||||
from django.conf.urls.defaults import *
|
||||
from django.views.generic.simple import direct_to_template
|
||||
|
||||
from registration.views import activate
|
||||
from registration.views import register
|
||||
|
||||
|
||||
urlpatterns = patterns('',
|
||||
url(r'^activate/complete/$',
|
||||
direct_to_template,
|
||||
{'template': 'registration/activation_complete.html'},
|
||||
name='registration_activation_complete'),
|
||||
# Activation keys get matched by \w+ instead of the more specific
|
||||
# [a-fA-F0-9]{40} because a bad activation key should still get to the view;
|
||||
# that way it can return a sensible "invalid key" message instead of a
|
||||
# confusing 404.
|
||||
url(r'^activate/(?P<activation_key>\w+)/$',
|
||||
activate,
|
||||
{'backend': 'registration.backends.default.DefaultBackend'},
|
||||
name='registration_activate'),
|
||||
url(r'^register/$',
|
||||
register,
|
||||
{'backend': 'registration.backends.default.DefaultBackend'},
|
||||
name='registration_register'),
|
||||
url(r'^register/complete/$',
|
||||
direct_to_template,
|
||||
{'template': 'registration/registration_complete.html'},
|
||||
name='registration_complete'),
|
||||
url(r'^register/closed/$',
|
||||
direct_to_template,
|
||||
{'template': 'registration/registration_closed.html'},
|
||||
name='registration_disallowed'),
|
||||
(r'', include('registration.auth_urls')),
|
||||
)
|
|
@ -0,0 +1,64 @@
|
|||
from django.conf import settings
|
||||
from django.contrib.auth import authenticate
|
||||
from django.contrib.auth import login
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
from registration import signals
|
||||
from registration.forms import RegistrationForm
|
||||
|
||||
|
||||
class SimpleBackend(object):
|
||||
"""
|
||||
A registration backend which implements the simplest possible
|
||||
workflow: a user supplies a username, email address and password
|
||||
(the bare minimum for a useful account), and is immediately signed
|
||||
up and logged in.
|
||||
|
||||
"""
|
||||
def register(self, request, **kwargs):
|
||||
"""
|
||||
Create and immediately log in a new user.
|
||||
|
||||
"""
|
||||
username, email, password = kwargs['username'], kwargs['email'], kwargs['password1']
|
||||
User.objects.create_user(username, email, password)
|
||||
|
||||
# authenticate() always has to be called before login(), and
|
||||
# will return the user we just created.
|
||||
new_user = authenticate(username=username, password=password)
|
||||
login(request, new_user)
|
||||
signals.user_registered.send(sender=self.__class__,
|
||||
user=new_user,
|
||||
request=request)
|
||||
return new_user
|
||||
|
||||
def activate(self, **kwargs):
|
||||
raise NotImplementedError
|
||||
|
||||
def registration_allowed(self, request):
|
||||
"""
|
||||
Indicate whether account registration is currently permitted,
|
||||
based on the value of the setting ``REGISTRATION_OPEN``. This
|
||||
is determined as follows:
|
||||
|
||||
* If ``REGISTRATION_OPEN`` is not specified in settings, or is
|
||||
set to ``True``, registration is permitted.
|
||||
|
||||
* If ``REGISTRATION_OPEN`` is both specified and set to
|
||||
``False``, registration is not permitted.
|
||||
|
||||
"""
|
||||
return getattr(settings, 'REGISTRATION_OPEN', True)
|
||||
|
||||
def get_form_class(self, request):
|
||||
return RegistrationForm
|
||||
|
||||
def post_registration_redirect(self, request, user):
|
||||
"""
|
||||
After registration, redirect to the user's account page.
|
||||
|
||||
"""
|
||||
return (user.get_absolute_url(), (), {})
|
||||
|
||||
def post_activation_redirect(self, request, user):
|
||||
raise NotImplementedError
|
|
@ -0,0 +1,38 @@
|
|||
"""
|
||||
URLconf for registration and activation, using django-registration's
|
||||
one-step backend.
|
||||
|
||||
If the default behavior of these views is acceptable to you, simply
|
||||
use a line like this in your root URLconf to set up the default URLs
|
||||
for registration::
|
||||
|
||||
(r'^accounts/', include('registration.backends.simple.urls')),
|
||||
|
||||
This will also automatically set up the views in
|
||||
``django.contrib.auth`` at sensible default locations.
|
||||
|
||||
If you'd like to customize the behavior (e.g., by passing extra
|
||||
arguments to the various views) or split up the URLs, feel free to set
|
||||
up your own URL patterns for these views instead.
|
||||
|
||||
"""
|
||||
|
||||
|
||||
from django.conf.urls.defaults import *
|
||||
from django.views.generic.simple import direct_to_template
|
||||
|
||||
from registration.views import activate
|
||||
from registration.views import register
|
||||
|
||||
|
||||
urlpatterns = patterns('',
|
||||
url(r'^register/$',
|
||||
register,
|
||||
{'backend': 'registration.backends.simple.SimpleBackend'},
|
||||
name='registration_register'),
|
||||
url(r'^register/closed/$',
|
||||
direct_to_template,
|
||||
{'template': 'registration/registration_closed.html'},
|
||||
name='registration_disallowed'),
|
||||
(r'', include('registration.auth_urls')),
|
||||
)
|
|
@ -0,0 +1,123 @@
|
|||
"""
|
||||
Forms and validation code for user registration.
|
||||
|
||||
"""
|
||||
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django import forms
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
||||
# 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 avoid defining a ``save()`` method -- the actual
|
||||
saving of collected user data is delegated to the active
|
||||
registration backend.
|
||||
|
||||
"""
|
||||
username = forms.RegexField(regex=r'^\w+$',
|
||||
max_length=30,
|
||||
widget=forms.TextInput(attrs=attrs_dict),
|
||||
label=_("Username"),
|
||||
error_messages={'invalid': _("This value must contain only letters, numbers and underscores.")})
|
||||
email = forms.EmailField(widget=forms.TextInput(attrs=dict(attrs_dict,
|
||||
maxlength=75)),
|
||||
label=_("E-mail"))
|
||||
password1 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
|
||||
label=_("Password"))
|
||||
password2 = forms.CharField(widget=forms.PasswordInput(attrs=attrs_dict, render_value=False),
|
||||
label=_("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(_("A user with that username already exists."))
|
||||
|
||||
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(_("The two password fields didn't match."))
|
||||
return self.cleaned_data
|
||||
|
||||
|
||||
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'),
|
||||
error_messages={'required': _("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(_("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',
|
||||
'yahoo.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(_("Registration using free email addresses is prohibited. Please supply a different email address."))
|
||||
return self.cleaned_data['email']
|
Binary file not shown.
|
@ -0,0 +1,81 @@
|
|||
# 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 "ملفات التسجيل الشخصية"
|
Binary file not shown.
|
@ -0,0 +1,78 @@
|
|||
# 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 "регистрационни профили"
|
||||
|
Binary file not shown.
|
@ -0,0 +1,92 @@
|
|||
# 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 <rb@konstellation.dk>, 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 <rb@konstellation.dk>\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"
|
Binary file not shown.
|
@ -0,0 +1,93 @@
|
|||
# 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-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 <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"
|
||||
|
||||
#: 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"
|
Binary file not shown.
|
@ -0,0 +1,84 @@
|
|||
# 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 "προφίλ εγγραφών"
|
Binary file not shown.
|
@ -0,0 +1,89 @@
|
|||
# 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: 2009-10-12 14:09-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"
|
||||
|
||||
#: 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 ""
|
Binary file not shown.
|
@ -0,0 +1,85 @@
|
|||
# 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"
|
Binary file not shown.
|
@ -0,0 +1,83 @@
|
|||
# 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"
|
Binary file not shown.
|
@ -0,0 +1,81 @@
|
|||
# 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"
|
Binary file not shown.
|
@ -0,0 +1,86 @@
|
|||
# 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 "פרופילי רישום"
|
||||
|
Binary file not shown.
|
@ -0,0 +1,74 @@
|
|||
# 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 <bjornkri@gmail.com>, 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 <bjornkri@gmail.com>\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"
|
Binary file not shown.
|
@ -0,0 +1,82 @@
|
|||
# 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 "Bisogna inserire la stessa password ogni volta"
|
||||
|
||||
#: forms.py:96
|
||||
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:105
|
||||
msgid "You must agree to the terms to register"
|
||||
msgstr "Per registrarsi bisogna approvare le condizioni"
|
||||
|
||||
#: forms.py:124
|
||||
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:149
|
||||
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:188
|
||||
msgid "user"
|
||||
msgstr "utente"
|
||||
|
||||
#: models.py:189
|
||||
msgid "activation key"
|
||||
msgstr "chiave di attivazione"
|
||||
|
||||
#: models.py:194
|
||||
msgid "registration profile"
|
||||
msgstr "profilo di registrazione"
|
||||
|
||||
#: models.py:195
|
||||
msgid "registration profiles"
|
||||
msgstr "profili di registrazione"
|
||||
|
Binary file not shown.
|
@ -0,0 +1,78 @@
|
|||
# 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 <xxshss@yahoo.co.jp>, 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 <xxshss@yahoo.co.jp>\n"
|
||||
"Language-Team: Japanese <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 "登録プロファイル"
|
||||
|
Binary file not shown.
|
@ -0,0 +1,89 @@
|
|||
# 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 <ygpark2@gmail.com>, 2009.
|
||||
#
|
||||
#, 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: Young Gyu Park <ygpark2@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"
|
||||
|
||||
#: 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 "등록 프로파일"
|
Binary file not shown.
|
@ -0,0 +1,77 @@
|
|||
# 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: 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 <joost@cassee.net>\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"
|
||||
"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"
|
Binary file not shown.
|
@ -0,0 +1,84 @@
|
|||
# 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 <jarek.zgoda@gmail.com>, 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 <jarek.zgoda@gmail.com>\n"
|
||||
"Language-Team: Polish <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 "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"
|
Binary file not shown.
|
@ -0,0 +1,81 @@
|
|||
# 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 "usuário"
|
||||
|
||||
#: forms.py:41
|
||||
msgid "email address"
|
||||
msgstr "endereço de email"
|
||||
|
||||
#: forms.py:43
|
||||
msgid "password"
|
||||
msgstr ""
|
||||
|
||||
#: 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 está 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 "profile de registro"
|
||||
|
||||
#: models.py:195
|
||||
msgid "registration profiles"
|
||||
msgstr "profiles de registro"
|
Binary file not shown.
|
@ -0,0 +1,92 @@
|
|||
# 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: 2009-10-21 20:12+0600\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"
|
||||
|
||||
#: 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 "карточки регистрации"
|
Binary file not shown.
|
@ -0,0 +1,87 @@
|
|||
# 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: 0.8.1beta\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2009-10-12 14:09-0500\n"
|
||||
"PO-Revision-Date: 2009-10-23 15:49+0100\n"
|
||||
"Last-Translator: Domen Kožar <domen@dev.si>\n"
|
||||
"Language-Team: Slovenian <domen@dev.si>\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šlju aktivacijske emaile"
|
||||
|
||||
#: 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 "Elektronska pošta"
|
||||
|
||||
#: 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 z 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 z pogoji uporable"
|
||||
|
||||
#: forms.py:79
|
||||
msgid "You must agree to the terms to register"
|
||||
msgstr "Za registracijo se morate strinjati z pogoji uporabe"
|
||||
|
||||
#: forms.py:95
|
||||
msgid "This email address is already in use. Please supply a different email address."
|
||||
msgstr "Email 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 email naslovi. Prosimo vnesite drug email 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"
|
||||
|
Binary file not shown.
|
@ -0,0 +1,80 @@
|
|||
# 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: 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 <djnesh@gmail.com>\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"
|
||||
|
Binary file not shown.
|
@ -0,0 +1,81 @@
|
|||
# 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: 2008-03-23 18:59+0100\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Emil Stenström <em@kth.se>\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 "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"
|
Binary file not shown.
|
@ -0,0 +1,77 @@
|
|||
# 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-20 23:22+0800\n"
|
||||
"Last-Translator: hutuworm <hutuworm@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"
|
||||
|
||||
#: 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 "注册信息"
|
||||
|
Binary file not shown.
|
@ -0,0 +1,77 @@
|
|||
# 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-20 23:22+0800\n"
|
||||
"Last-Translator: hutuworm <hutuworm@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"
|
||||
|
||||
#: 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 "注冊信息"
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
"""
|
||||
A management command which deletes expired accounts (e.g.,
|
||||
accounts which signed up but never activated) from the database.
|
||||
|
||||
Calls ``RegistrationProfile.objects.delete_expired_users()``, which
|
||||
contains the actual logic for determining which accounts are deleted.
|
||||
|
||||
"""
|
||||
|
||||
from django.core.management.base import NoArgsCommand
|
||||
|
||||
from registration.models import RegistrationProfile
|
||||
|
||||
|
||||
class Command(NoArgsCommand):
|
||||
help = "Delete expired user registrations from the database"
|
||||
|
||||
def handle_noargs(self, **options):
|
||||
RegistrationProfile.objects.delete_expired_users()
|
|
@ -0,0 +1,257 @@
|
|||
import datetime
|
||||
import random
|
||||
import re
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import User
|
||||
from django.db import models
|
||||
from django.db import transaction
|
||||
from django.template.loader import render_to_string
|
||||
from django.utils.hashcompat import sha_constructor
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
||||
SHA1_RE = re.compile('^[a-f0-9]{40}$')
|
||||
|
||||
|
||||
class RegistrationManager(models.Manager):
|
||||
"""
|
||||
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.
|
||||
|
||||
"""
|
||||
def activate_user(self, activation_key):
|
||||
"""
|
||||
Validate an activation key and activate the corresponding
|
||||
``User`` if valid.
|
||||
|
||||
If the key is valid and has not expired, return the ``User``
|
||||
after activating.
|
||||
|
||||
If the key is not valid or has expired, return ``False``.
|
||||
|
||||
If the key is valid but the ``User`` is already active,
|
||||
return ``False``.
|
||||
|
||||
To prevent reactivation of an account which has been
|
||||
deactivated by site administrators, the activation key is
|
||||
reset to the string constant ``RegistrationProfile.ACTIVATED``
|
||||
after successful activation.
|
||||
|
||||
"""
|
||||
# Make sure the key we're trying conforms to the pattern of a
|
||||
# SHA1 hash; if it doesn't, no point trying to look it up in
|
||||
# the database.
|
||||
if SHA1_RE.search(activation_key):
|
||||
try:
|
||||
profile = self.get(activation_key=activation_key)
|
||||
except self.model.DoesNotExist:
|
||||
return False
|
||||
if not profile.activation_key_expired():
|
||||
user = profile.user
|
||||
user.is_active = True
|
||||
user.save()
|
||||
profile.activation_key = self.model.ACTIVATED
|
||||
profile.save()
|
||||
return user
|
||||
return False
|
||||
|
||||
def create_inactive_user(self, username, email, password,
|
||||
site, send_email=True):
|
||||
"""
|
||||
Create a new, inactive ``User``, generate a
|
||||
``RegistrationProfile`` and email its activation key to the
|
||||
``User``, returning the new ``User``.
|
||||
|
||||
By default, an activation email will be sent to the new
|
||||
user. To disable this, pass ``send_email=False``.
|
||||
|
||||
"""
|
||||
new_user = User.objects.create_user(username, email, password)
|
||||
new_user.is_active = False
|
||||
new_user.save()
|
||||
|
||||
registration_profile = self.create_profile(new_user)
|
||||
|
||||
if send_email:
|
||||
registration_profile.send_activation_email(site)
|
||||
|
||||
return new_user
|
||||
create_inactive_user = transaction.commit_on_success(create_inactive_user)
|
||||
|
||||
def create_profile(self, user):
|
||||
"""
|
||||
Create a ``RegistrationProfile`` for a given
|
||||
``User``, and return 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.
|
||||
|
||||
"""
|
||||
salt = sha_constructor(str(random.random())).hexdigest()[:5]
|
||||
username = user.username
|
||||
if isinstance(username, unicode):
|
||||
username = username.encode('utf-8')
|
||||
activation_key = sha_constructor(salt+username).hexdigest()
|
||||
return self.create(user=user,
|
||||
activation_key=activation_key)
|
||||
|
||||
def delete_expired_users(self):
|
||||
"""
|
||||
Remove expired instances of ``RegistrationProfile`` and their
|
||||
associated ``User``s.
|
||||
|
||||
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.
|
||||
|
||||
"""
|
||||
for profile in self.all():
|
||||
if profile.activation_key_expired():
|
||||
user = profile.user
|
||||
if not user.is_active:
|
||||
user.delete()
|
||||
|
||||
|
||||
class RegistrationProfile(models.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.
|
||||
|
||||
"""
|
||||
ACTIVATED = u"ALREADY_ACTIVATED"
|
||||
|
||||
user = models.ForeignKey(User, unique=True, verbose_name=_('user'))
|
||||
activation_key = models.CharField(_('activation key'), max_length=40)
|
||||
|
||||
objects = RegistrationManager()
|
||||
|
||||
class Meta:
|
||||
verbose_name = _('registration profile')
|
||||
verbose_name_plural = _('registration profiles')
|
||||
|
||||
def __unicode__(self):
|
||||
return u"Registration information for %s" % self.user
|
||||
|
||||
def activation_key_expired(self):
|
||||
"""
|
||||
Determine whether this ``RegistrationProfile``'s activation
|
||||
key has expired, returning a boolean -- ``True`` if the key
|
||||
has expired.
|
||||
|
||||
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 constant ``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``.
|
||||
|
||||
"""
|
||||
expiration_date = datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS)
|
||||
return self.activation_key == self.ACTIVATED or \
|
||||
(self.user.date_joined + expiration_date <= datetime.datetime.now())
|
||||
activation_key_expired.boolean = True
|
||||
|
||||
def send_activation_email(self, site):
|
||||
"""
|
||||
Send an activation email to the user associated with this
|
||||
``RegistrationProfile``.
|
||||
|
||||
The activation email will make use of two templates:
|
||||
|
||||
``registration/activation_email_subject.txt``
|
||||
This template will be used for the subject line of the
|
||||
email. Because it is used as the subject line of an email,
|
||||
this template's output **must** be only a single line of
|
||||
text; output longer than one line will be forcibly joined
|
||||
into only a single line.
|
||||
|
||||
``registration/activation_email.txt``
|
||||
This template will be used for the body of the email.
|
||||
|
||||
These templates will each receive the following context
|
||||
variables:
|
||||
|
||||
``activation_key``
|
||||
The activation key for the new account.
|
||||
|
||||
``expiration_days``
|
||||
The number of days remaining during which the account may
|
||||
be activated.
|
||||
|
||||
``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
|
||||
``django.contrib.sites.models.Site`` (if the sites
|
||||
application is installed) or
|
||||
``django.contrib.sites.models.RequestSite`` (if
|
||||
not). Consult the documentation for the Django sites
|
||||
framework for details regarding these objects' interfaces.
|
||||
|
||||
"""
|
||||
ctx_dict = {'activation_key': self.activation_key,
|
||||
'expiration_days': settings.ACCOUNT_ACTIVATION_DAYS,
|
||||
'site': site}
|
||||
subject = render_to_string('registration/activation_email_subject.txt',
|
||||
ctx_dict)
|
||||
# Email subject *must not* contain newlines
|
||||
subject = ''.join(subject.splitlines())
|
||||
|
||||
message = render_to_string('registration/activation_email.txt',
|
||||
ctx_dict)
|
||||
|
||||
self.user.email_user(subject, message, settings.DEFAULT_FROM_EMAIL)
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
from django.dispatch import Signal
|
||||
|
||||
|
||||
# A new user has registered.
|
||||
user_registered = Signal(providing_args=["user", "request"])
|
||||
|
||||
# A user has activated his or her account.
|
||||
user_activated = Signal(providing_args=["user", "request"])
|
|
@ -0,0 +1,45 @@
|
|||
from django.test import TestCase
|
||||
|
||||
import registration
|
||||
|
||||
from registration.tests.backends import *
|
||||
from registration.tests.forms import *
|
||||
from registration.tests.models import *
|
||||
from registration.tests.views import *
|
||||
|
||||
|
||||
class RegistrationVersionInfoTests(TestCase):
|
||||
"""
|
||||
Test django-registration's internal version-reporting
|
||||
infrastructure.
|
||||
|
||||
"""
|
||||
def setUp(self):
|
||||
self.version = registration.VERSION
|
||||
|
||||
def tearDown(self):
|
||||
registration.VERSION = self.version
|
||||
|
||||
def test_get_version(self):
|
||||
"""
|
||||
Test the version-info reporting.
|
||||
|
||||
"""
|
||||
versions = [
|
||||
{'version': (1, 0, 0, 'alpha', 0),
|
||||
'expected': "1.0 pre-alpha"},
|
||||
{'version': (1, 0, 1, 'alpha', 1),
|
||||
'expected': "1.0.1 alpha 1"},
|
||||
{'version': (1, 1, 0, 'beta', 2),
|
||||
'expected': "1.1 beta 2"},
|
||||
{'version': (1, 2, 1, 'rc', 3),
|
||||
'expected': "1.2.1 rc 3"},
|
||||
{'version': (1, 3, 0, 'final', 0),
|
||||
'expected': "1.3"},
|
||||
{'version': (1, 4, 1, 'beta', 0),
|
||||
'expected': "1.4.1 beta"},
|
||||
]
|
||||
|
||||
for version_dict in versions:
|
||||
registration.VERSION = version_dict['version']
|
||||
self.assertEqual(registration.get_version(), version_dict['expected'])
|
|
@ -0,0 +1,476 @@
|
|||
import datetime
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib import admin
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.sessions.middleware import SessionMiddleware
|
||||
from django.contrib.sites.models import Site
|
||||
from django.core import mail
|
||||
from django.core.exceptions import ImproperlyConfigured
|
||||
from django.core.handlers.wsgi import WSGIRequest
|
||||
from django.test import Client
|
||||
from django.test import TestCase
|
||||
|
||||
from registration import forms
|
||||
from registration import signals
|
||||
from registration.admin import RegistrationAdmin
|
||||
from registration.backends import get_backend
|
||||
from registration.backends.default import DefaultBackend
|
||||
from registration.backends.simple import SimpleBackend
|
||||
from registration.models import RegistrationProfile
|
||||
|
||||
|
||||
class _MockRequestClient(Client):
|
||||
"""
|
||||
A ``django.test.Client`` subclass which can return mock
|
||||
``HttpRequest`` objects.
|
||||
|
||||
"""
|
||||
def request(self, **request):
|
||||
"""
|
||||
Rather than issuing a request and returning the response, this
|
||||
simply constructs an ``HttpRequest`` object and returns it.
|
||||
|
||||
"""
|
||||
environ = {
|
||||
'HTTP_COOKIE': self.cookies,
|
||||
'PATH_INFO': '/',
|
||||
'QUERY_STRING': '',
|
||||
'REMOTE_ADDR': '127.0.0.1',
|
||||
'REQUEST_METHOD': 'GET',
|
||||
'SCRIPT_NAME': '',
|
||||
'SERVER_NAME': 'testserver',
|
||||
'SERVER_PORT': '80',
|
||||
'SERVER_PROTOCOL': 'HTTP/1.1',
|
||||
'wsgi.version': (1,0),
|
||||
'wsgi.url_scheme': 'http',
|
||||
'wsgi.errors': self.errors,
|
||||
'wsgi.multiprocess': True,
|
||||
'wsgi.multithread': False,
|
||||
'wsgi.run_once': False,
|
||||
}
|
||||
environ.update(self.defaults)
|
||||
environ.update(request)
|
||||
request = WSGIRequest(environ)
|
||||
|
||||
# We have to manually add a session since we'll be bypassing
|
||||
# the middleware chain.
|
||||
session_middleware = SessionMiddleware()
|
||||
session_middleware.process_request(request)
|
||||
return request
|
||||
|
||||
|
||||
def _mock_request():
|
||||
"""
|
||||
Construct and return a mock ``HttpRequest`` object; this is used
|
||||
in testing backend methods which expect an ``HttpRequest`` but
|
||||
which are not being called from views.
|
||||
|
||||
"""
|
||||
return _MockRequestClient().request()
|
||||
|
||||
|
||||
class BackendRetrievalTests(TestCase):
|
||||
"""
|
||||
Test that utilities for retrieving the active backend work
|
||||
properly.
|
||||
|
||||
"""
|
||||
def test_get_backend(self):
|
||||
"""
|
||||
Verify that ``get_backend()`` returns the correct value when
|
||||
passed a valid backend.
|
||||
|
||||
"""
|
||||
self.failUnless(isinstance(get_backend('registration.backends.default.DefaultBackend'),
|
||||
DefaultBackend))
|
||||
|
||||
def test_backend_error_invalid(self):
|
||||
"""
|
||||
Test that a nonexistent/unimportable backend raises the
|
||||
correct exception.
|
||||
|
||||
"""
|
||||
self.assertRaises(ImproperlyConfigured, get_backend,
|
||||
'registration.backends.doesnotexist.NonExistentBackend')
|
||||
|
||||
def test_backend_attribute_error(self):
|
||||
"""
|
||||
Test that a backend module which exists but does not have a
|
||||
class of the specified name raises the correct exception.
|
||||
|
||||
"""
|
||||
self.assertRaises(ImproperlyConfigured, get_backend,
|
||||
'registration.backends.default.NonexistentBackend')
|
||||
|
||||
|
||||
class DefaultRegistrationBackendTests(TestCase):
|
||||
"""
|
||||
Test the default registration backend.
|
||||
|
||||
Running these tests successfull will require two templates to be
|
||||
created for the sending of activation emails; details on these
|
||||
templates and their contexts may be found in the documentation for
|
||||
the default backend.
|
||||
|
||||
"""
|
||||
backend = DefaultBackend()
|
||||
|
||||
def setUp(self):
|
||||
"""
|
||||
Create an instance of the default backend for use in testing,
|
||||
and set ``ACCOUNT_ACTIVATION_DAYS`` if it's not set already.
|
||||
|
||||
"""
|
||||
self.old_activation = getattr(settings, 'ACCOUNT_ACTIVATION_DAYS', None)
|
||||
if self.old_activation is None:
|
||||
settings.ACCOUNT_ACTIVATION_DAYS = 7
|
||||
|
||||
def tearDown(self):
|
||||
"""
|
||||
Yank out ``ACCOUNT_ACTIVATION_DAYS`` back out if it wasn't
|
||||
originally set.
|
||||
|
||||
"""
|
||||
if self.old_activation is None:
|
||||
settings.ACCOUNT_ACTIVATION_DAYS = self.old_activation
|
||||
|
||||
def test_registration(self):
|
||||
"""
|
||||
Test the registration process: registration creates a new
|
||||
inactive account and a new profile with activation key,
|
||||
populates the correct account data and sends an activation
|
||||
email.
|
||||
|
||||
"""
|
||||
new_user = self.backend.register(_mock_request(),
|
||||
username='bob',
|
||||
email='bob@example.com',
|
||||
password1='secret')
|
||||
|
||||
# Details of the returned user must match what went in.
|
||||
self.assertEqual(new_user.username, 'bob')
|
||||
self.failUnless(new_user.check_password('secret'))
|
||||
self.assertEqual(new_user.email, 'bob@example.com')
|
||||
|
||||
# New user must not be active.
|
||||
self.failIf(new_user.is_active)
|
||||
|
||||
# A registration profile was created, and an activation email
|
||||
# was sent.
|
||||
self.assertEqual(RegistrationProfile.objects.count(), 1)
|
||||
self.assertEqual(len(mail.outbox), 1)
|
||||
|
||||
def test_registration_no_sites(self):
|
||||
"""
|
||||
Test that registration still functions properly when
|
||||
``django.contrib.sites`` is not installed; the fallback will
|
||||
be a ``RequestSite`` instance.
|
||||
|
||||
"""
|
||||
Site._meta.installed = False
|
||||
|
||||
new_user = self.backend.register(_mock_request(),
|
||||
username='bob',
|
||||
email='bob@example.com',
|
||||
password1='secret')
|
||||
|
||||
self.assertEqual(new_user.username, 'bob')
|
||||
self.failUnless(new_user.check_password('secret'))
|
||||
self.assertEqual(new_user.email, 'bob@example.com')
|
||||
|
||||
self.failIf(new_user.is_active)
|
||||
|
||||
self.assertEqual(RegistrationProfile.objects.count(), 1)
|
||||
self.assertEqual(len(mail.outbox), 1)
|
||||
|
||||
Site._meta.installed = True
|
||||
|
||||
def test_valid_activation(self):
|
||||
"""
|
||||
Test the activation process: activating within the permitted
|
||||
window sets the account's ``is_active`` field to ``True`` and
|
||||
resets the activation key.
|
||||
|
||||
"""
|
||||
valid_user = self.backend.register(_mock_request(),
|
||||
username='alice',
|
||||
email='alice@example.com',
|
||||
password1='swordfish')
|
||||
|
||||
valid_profile = RegistrationProfile.objects.get(user=valid_user)
|
||||
activated = self.backend.activate(_mock_request(),
|
||||
valid_profile.activation_key)
|
||||
self.assertEqual(activated.username, valid_user.username)
|
||||
self.failUnless(activated.is_active)
|
||||
|
||||
# Fetch the profile again to verify its activation key has
|
||||
# been reset.
|
||||
valid_profile = RegistrationProfile.objects.get(user=valid_user)
|
||||
self.assertEqual(valid_profile.activation_key,
|
||||
RegistrationProfile.ACTIVATED)
|
||||
|
||||
def test_invalid_activation(self):
|
||||
"""
|
||||
Test the activation process: trying to activate outside the
|
||||
permitted window fails, and leaves the account inactive.
|
||||
|
||||
"""
|
||||
expired_user = self.backend.register(_mock_request(),
|
||||
username='bob',
|
||||
email='bob@example.com',
|
||||
password1='secret')
|
||||
|
||||
expired_user.date_joined = expired_user.date_joined - datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS)
|
||||
expired_user.save()
|
||||
expired_profile = RegistrationProfile.objects.get(user=expired_user)
|
||||
self.failIf(self.backend.activate(_mock_request(),
|
||||
expired_profile.activation_key))
|
||||
self.failUnless(expired_profile.activation_key_expired())
|
||||
|
||||
def test_allow(self):
|
||||
"""
|
||||
Test that the setting ``REGISTRATION_OPEN`` appropriately
|
||||
controls whether registration is permitted.
|
||||
|
||||
"""
|
||||
old_allowed = getattr(settings, 'REGISTRATION_OPEN', True)
|
||||
settings.REGISTRATION_OPEN = True
|
||||
self.failUnless(self.backend.registration_allowed(_mock_request()))
|
||||
|
||||
settings.REGISTRATION_OPEN = False
|
||||
self.failIf(self.backend.registration_allowed(_mock_request()))
|
||||
settings.REGISTRATION_OPEN = old_allowed
|
||||
|
||||
def test_form_class(self):
|
||||
"""
|
||||
Test that the default form class returned is
|
||||
``registration.forms.RegistrationForm``.
|
||||
|
||||
"""
|
||||
self.failUnless(self.backend.get_form_class(_mock_request()) is forms.RegistrationForm)
|
||||
|
||||
def test_post_registration_redirect(self):
|
||||
"""
|
||||
Test that the default post-registration redirect is the named
|
||||
pattern ``registration_complete``.
|
||||
|
||||
"""
|
||||
self.assertEqual(self.backend.post_registration_redirect(_mock_request(), User()),
|
||||
('registration_complete', (), {}))
|
||||
|
||||
def test_registration_signal(self):
|
||||
"""
|
||||
Test that registering a user sends the ``user_registered``
|
||||
signal.
|
||||
|
||||
"""
|
||||
def receiver(sender, **kwargs):
|
||||
self.failUnless('user' in kwargs)
|
||||
self.assertEqual(kwargs['user'].username, 'bob')
|
||||
self.failUnless('request' in kwargs)
|
||||
self.failUnless(isinstance(kwargs['request'], WSGIRequest))
|
||||
received_signals.append(kwargs.get('signal'))
|
||||
|
||||
received_signals = []
|
||||
signals.user_registered.connect(receiver, sender=self.backend.__class__)
|
||||
|
||||
self.backend.register(_mock_request(),
|
||||
username='bob',
|
||||
email='bob@example.com',
|
||||
password1='secret')
|
||||
|
||||
self.assertEqual(len(received_signals), 1)
|
||||
self.assertEqual(received_signals, [signals.user_registered])
|
||||
|
||||
def test_activation_signal_success(self):
|
||||
"""
|
||||
Test that successfully activating a user sends the
|
||||
``user_activated`` signal.
|
||||
|
||||
"""
|
||||
def receiver(sender, **kwargs):
|
||||
self.failUnless('user' in kwargs)
|
||||
self.assertEqual(kwargs['user'].username, 'bob')
|
||||
self.failUnless('request' in kwargs)
|
||||
self.failUnless(isinstance(kwargs['request'], WSGIRequest))
|
||||
received_signals.append(kwargs.get('signal'))
|
||||
|
||||
received_signals = []
|
||||
signals.user_activated.connect(receiver, sender=self.backend.__class__)
|
||||
|
||||
new_user = self.backend.register(_mock_request(),
|
||||
username='bob',
|
||||
email='bob@example.com',
|
||||
password1='secret')
|
||||
profile = RegistrationProfile.objects.get(user=new_user)
|
||||
self.backend.activate(_mock_request(), profile.activation_key)
|
||||
|
||||
self.assertEqual(len(received_signals), 1)
|
||||
self.assertEqual(received_signals, [signals.user_activated])
|
||||
|
||||
def test_activation_signal_failure(self):
|
||||
"""
|
||||
Test that an unsuccessful activation attempt does not send the
|
||||
``user_activated`` signal.
|
||||
|
||||
"""
|
||||
receiver = lambda sender, **kwargs: received_signals.append(kwargs.get('signal'))
|
||||
|
||||
received_signals = []
|
||||
signals.user_activated.connect(receiver, sender=self.backend.__class__)
|
||||
|
||||
new_user = self.backend.register(_mock_request(),
|
||||
username='bob',
|
||||
email='bob@example.com',
|
||||
password1='secret')
|
||||
new_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1)
|
||||
new_user.save()
|
||||
profile = RegistrationProfile.objects.get(user=new_user)
|
||||
self.backend.activate(_mock_request(), profile.activation_key)
|
||||
|
||||
self.assertEqual(len(received_signals), 0)
|
||||
|
||||
def test_email_send_action(self):
|
||||
"""
|
||||
Test re-sending of activation emails via admin action.
|
||||
|
||||
"""
|
||||
admin_class = RegistrationAdmin(RegistrationProfile, admin.site)
|
||||
|
||||
alice = self.backend.register(_mock_request(),
|
||||
username='alice',
|
||||
email='alice@example.com',
|
||||
password1='swordfish')
|
||||
|
||||
admin_class.resend_activation_email(_mock_request(),
|
||||
RegistrationProfile.objects.all())
|
||||
self.assertEqual(len(mail.outbox), 2) # One on registering, one more on the resend.
|
||||
|
||||
RegistrationProfile.objects.filter(user=alice).update(activation_key=RegistrationProfile.ACTIVATED)
|
||||
admin_class.resend_activation_email(_mock_request(),
|
||||
RegistrationProfile.objects.all())
|
||||
self.assertEqual(len(mail.outbox), 2) # No additional email because the account has activated.
|
||||
|
||||
def test_activation_action(self):
|
||||
"""
|
||||
Test manual activation of users view admin action.
|
||||
|
||||
"""
|
||||
admin_class = RegistrationAdmin(RegistrationProfile, admin.site)
|
||||
|
||||
alice = self.backend.register(_mock_request(),
|
||||
username='alice',
|
||||
email='alice@example.com',
|
||||
password1='swordfish')
|
||||
|
||||
admin_class.activate_users(_mock_request(),
|
||||
RegistrationProfile.objects.all())
|
||||
self.failUnless(User.objects.get(username='alice').is_active)
|
||||
|
||||
|
||||
class SimpleRegistrationBackendTests(TestCase):
|
||||
"""
|
||||
Test the simple registration backend, which does signup and
|
||||
immediate activation.
|
||||
|
||||
"""
|
||||
backend = SimpleBackend()
|
||||
|
||||
def test_registration(self):
|
||||
"""
|
||||
Test the registration process: registration creates a new
|
||||
inactive account and a new profile with activation key,
|
||||
populates the correct account data and sends an activation
|
||||
email.
|
||||
|
||||
"""
|
||||
new_user = self.backend.register(_mock_request(),
|
||||
username='bob',
|
||||
email='bob@example.com',
|
||||
password1='secret')
|
||||
|
||||
# Details of the returned user must match what went in.
|
||||
self.assertEqual(new_user.username, 'bob')
|
||||
self.failUnless(new_user.check_password('secret'))
|
||||
self.assertEqual(new_user.email, 'bob@example.com')
|
||||
|
||||
# New user must not be active.
|
||||
self.failUnless(new_user.is_active)
|
||||
|
||||
def test_allow(self):
|
||||
"""
|
||||
Test that the setting ``REGISTRATION_OPEN`` appropriately
|
||||
controls whether registration is permitted.
|
||||
|
||||
"""
|
||||
old_allowed = getattr(settings, 'REGISTRATION_OPEN', True)
|
||||
settings.REGISTRATION_OPEN = True
|
||||
self.failUnless(self.backend.registration_allowed(_mock_request()))
|
||||
|
||||
settings.REGISTRATION_OPEN = False
|
||||
self.failIf(self.backend.registration_allowed(_mock_request()))
|
||||
settings.REGISTRATION_OPEN = old_allowed
|
||||
|
||||
def test_form_class(self):
|
||||
"""
|
||||
Test that the default form class returned is
|
||||
``registration.forms.RegistrationForm``.
|
||||
|
||||
"""
|
||||
self.failUnless(self.backend.get_form_class(_mock_request()) is forms.RegistrationForm)
|
||||
|
||||
def test_post_registration_redirect(self):
|
||||
"""
|
||||
Test that the default post-registration redirect is the public
|
||||
URL of the new user account.
|
||||
|
||||
"""
|
||||
new_user = self.backend.register(_mock_request(),
|
||||
username='bob',
|
||||
email='bob@example.com',
|
||||
password1='secret')
|
||||
|
||||
self.assertEqual(self.backend.post_registration_redirect(_mock_request(), new_user),
|
||||
(new_user.get_absolute_url(), (), {}))
|
||||
|
||||
def test_registration_signal(self):
|
||||
"""
|
||||
Test that registering a user sends the ``user_registered``
|
||||
signal.
|
||||
|
||||
"""
|
||||
def receiver(sender, **kwargs):
|
||||
self.failUnless('user' in kwargs)
|
||||
self.assertEqual(kwargs['user'].username, 'bob')
|
||||
self.failUnless('request' in kwargs)
|
||||
self.failUnless(isinstance(kwargs['request'], WSGIRequest))
|
||||
received_signals.append(kwargs.get('signal'))
|
||||
|
||||
received_signals = []
|
||||
signals.user_registered.connect(receiver, sender=self.backend.__class__)
|
||||
|
||||
self.backend.register(_mock_request(),
|
||||
username='bob',
|
||||
email='bob@example.com',
|
||||
password1='secret')
|
||||
|
||||
self.assertEqual(len(received_signals), 1)
|
||||
self.assertEqual(received_signals, [signals.user_registered])
|
||||
|
||||
def test_activation(self):
|
||||
"""
|
||||
Test that activating against this backend is an error.
|
||||
|
||||
"""
|
||||
self.assertRaises(NotImplementedError, self.backend.activate,
|
||||
request=_mock_request())
|
||||
|
||||
def test_post_activation_redirect(self):
|
||||
"""
|
||||
Test that asking for a post-activation redirect from this
|
||||
backend is an error.
|
||||
|
||||
"""
|
||||
self.assertRaises(NotImplementedError, self.backend.post_activation_redirect,
|
||||
request=_mock_request(), user=User())
|
|
@ -0,0 +1,119 @@
|
|||
from django.contrib.auth.models import User
|
||||
from django.test import TestCase
|
||||
|
||||
from registration import forms
|
||||
|
||||
|
||||
class RegistrationFormTests(TestCase):
|
||||
"""
|
||||
Test the default registration forms.
|
||||
|
||||
"""
|
||||
def test_registration_form(self):
|
||||
"""
|
||||
Test that ``RegistrationForm`` enforces username constraints
|
||||
and matching passwords.
|
||||
|
||||
"""
|
||||
# Create a user so we can verify that duplicate usernames aren't
|
||||
# permitted.
|
||||
User.objects.create_user('alice', 'alice@example.com', 'secret')
|
||||
|
||||
invalid_data_dicts = [
|
||||
# Non-alphanumeric username.
|
||||
{'data': {'username': 'foo/bar',
|
||||
'email': 'foo@example.com',
|
||||
'password1': 'foo',
|
||||
'password2': 'foo'},
|
||||
'error': ('username', [u"This value must contain only letters, numbers and underscores."])},
|
||||
# Already-existing username.
|
||||
{'data': {'username': 'alice',
|
||||
'email': 'alice@example.com',
|
||||
'password1': 'secret',
|
||||
'password2': 'secret'},
|
||||
'error': ('username', [u"A user with that username already exists."])},
|
||||
# Mismatched passwords.
|
||||
{'data': {'username': 'foo',
|
||||
'email': 'foo@example.com',
|
||||
'password1': 'foo',
|
||||
'password2': 'bar'},
|
||||
'error': ('__all__', [u"The two password fields didn't match."])},
|
||||
]
|
||||
|
||||
for invalid_dict in invalid_data_dicts:
|
||||
form = forms.RegistrationForm(data=invalid_dict['data'])
|
||||
self.failIf(form.is_valid())
|
||||
self.assertEqual(form.errors[invalid_dict['error'][0]],
|
||||
invalid_dict['error'][1])
|
||||
|
||||
form = forms.RegistrationForm(data={'username': 'foo',
|
||||
'email': 'foo@example.com',
|
||||
'password1': 'foo',
|
||||
'password2': 'foo'})
|
||||
self.failUnless(form.is_valid())
|
||||
|
||||
def test_registration_form_tos(self):
|
||||
"""
|
||||
Test that ``RegistrationFormTermsOfService`` requires
|
||||
agreement to the terms of service.
|
||||
|
||||
"""
|
||||
form = forms.RegistrationFormTermsOfService(data={'username': 'foo',
|
||||
'email': 'foo@example.com',
|
||||
'password1': 'foo',
|
||||
'password2': 'foo'})
|
||||
self.failIf(form.is_valid())
|
||||
self.assertEqual(form.errors['tos'],
|
||||
[u"You must agree to the terms to register"])
|
||||
|
||||
form = forms.RegistrationFormTermsOfService(data={'username': 'foo',
|
||||
'email': 'foo@example.com',
|
||||
'password1': 'foo',
|
||||
'password2': 'foo',
|
||||
'tos': 'on'})
|
||||
self.failUnless(form.is_valid())
|
||||
|
||||
def test_registration_form_unique_email(self):
|
||||
"""
|
||||
Test that ``RegistrationFormUniqueEmail`` validates uniqueness
|
||||
of email addresses.
|
||||
|
||||
"""
|
||||
# Create a user so we can verify that duplicate addresses
|
||||
# aren't permitted.
|
||||
User.objects.create_user('alice', 'alice@example.com', 'secret')
|
||||
|
||||
form = forms.RegistrationFormUniqueEmail(data={'username': 'foo',
|
||||
'email': 'alice@example.com',
|
||||
'password1': 'foo',
|
||||
'password2': 'foo'})
|
||||
self.failIf(form.is_valid())
|
||||
self.assertEqual(form.errors['email'],
|
||||
[u"This email address is already in use. Please supply a different email address."])
|
||||
|
||||
form = forms.RegistrationFormUniqueEmail(data={'username': 'foo',
|
||||
'email': 'foo@example.com',
|
||||
'password1': 'foo',
|
||||
'password2': 'foo'})
|
||||
self.failUnless(form.is_valid())
|
||||
|
||||
def test_registration_form_no_free_email(self):
|
||||
"""
|
||||
Test that ``RegistrationFormNoFreeEmail`` disallows
|
||||
registration with free email addresses.
|
||||
|
||||
"""
|
||||
base_data = {'username': 'foo',
|
||||
'password1': 'foo',
|
||||
'password2': 'foo'}
|
||||
for domain in forms.RegistrationFormNoFreeEmail.bad_domains:
|
||||
invalid_data = base_data.copy()
|
||||
invalid_data['email'] = u"foo@%s" % domain
|
||||
form = forms.RegistrationFormNoFreeEmail(data=invalid_data)
|
||||
self.failIf(form.is_valid())
|
||||
self.assertEqual(form.errors['email'],
|
||||
[u"Registration using free email addresses is prohibited. Please supply a different email address."])
|
||||
|
||||
base_data['email'] = 'foo@example.com'
|
||||
form = forms.RegistrationFormNoFreeEmail(data=base_data)
|
||||
self.failUnless(form.is_valid())
|
|
@ -0,0 +1,225 @@
|
|||
import datetime
|
||||
import re
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.sites.models import Site
|
||||
from django.core import mail
|
||||
from django.core import management
|
||||
from django.test import TestCase
|
||||
from django.utils.hashcompat import sha_constructor
|
||||
|
||||
from registration.models import RegistrationProfile
|
||||
|
||||
|
||||
class RegistrationModelTests(TestCase):
|
||||
"""
|
||||
Test the model and manager used in the default backend.
|
||||
|
||||
"""
|
||||
user_info = {'username': 'alice',
|
||||
'password': 'swordfish',
|
||||
'email': 'alice@example.com'}
|
||||
|
||||
def setUp(self):
|
||||
self.old_activation = getattr(settings, 'ACCOUNT_ACTIVATION_DAYS', None)
|
||||
settings.ACCOUNT_ACTIVATION_DAYS = 7
|
||||
|
||||
def tearDown(self):
|
||||
settings.ACCOUNT_ACTIVATION_DAYS = self.old_activation
|
||||
|
||||
def test_profile_creation(self):
|
||||
"""
|
||||
Creating a registration profile for a user populates the
|
||||
profile with the correct user and a SHA1 hash to use as
|
||||
activation key.
|
||||
|
||||
"""
|
||||
new_user = User.objects.create_user(**self.user_info)
|
||||
profile = RegistrationProfile.objects.create_profile(new_user)
|
||||
|
||||
self.assertEqual(RegistrationProfile.objects.count(), 1)
|
||||
self.assertEqual(profile.user.id, new_user.id)
|
||||
self.failUnless(re.match('^[a-f0-9]{40}$', profile.activation_key))
|
||||
self.assertEqual(unicode(profile),
|
||||
"Registration information for alice")
|
||||
|
||||
def test_activation_email(self):
|
||||
"""
|
||||
``RegistrationProfile.send_activation_email`` sends an
|
||||
email.
|
||||
|
||||
"""
|
||||
new_user = User.objects.create_user(**self.user_info)
|
||||
profile = RegistrationProfile.objects.create_profile(new_user)
|
||||
profile.send_activation_email(Site.objects.get_current())
|
||||
self.assertEqual(len(mail.outbox), 1)
|
||||
self.assertEqual(mail.outbox[0].to, [self.user_info['email']])
|
||||
|
||||
def test_user_creation(self):
|
||||
"""
|
||||
Creating a new user populates the correct data, and sets the
|
||||
user's account inactive.
|
||||
|
||||
"""
|
||||
new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
**self.user_info)
|
||||
self.assertEqual(new_user.username, 'alice')
|
||||
self.assertEqual(new_user.email, 'alice@example.com')
|
||||
self.failUnless(new_user.check_password('swordfish'))
|
||||
self.failIf(new_user.is_active)
|
||||
|
||||
def test_user_creation_email(self):
|
||||
"""
|
||||
By default, creating a new user sends an activation email.
|
||||
|
||||
"""
|
||||
new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
**self.user_info)
|
||||
self.assertEqual(len(mail.outbox), 1)
|
||||
|
||||
def test_user_creation_no_email(self):
|
||||
"""
|
||||
Passing ``send_email=False`` when creating a new user will not
|
||||
send an activation email.
|
||||
|
||||
"""
|
||||
new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
send_email=False,
|
||||
**self.user_info)
|
||||
self.assertEqual(len(mail.outbox), 0)
|
||||
|
||||
def test_unexpired_account(self):
|
||||
"""
|
||||
``RegistrationProfile.activation_key_expired()`` is ``False``
|
||||
within the activation window.
|
||||
|
||||
"""
|
||||
new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
**self.user_info)
|
||||
profile = RegistrationProfile.objects.get(user=new_user)
|
||||
self.failIf(profile.activation_key_expired())
|
||||
|
||||
def test_expired_account(self):
|
||||
"""
|
||||
``RegistrationProfile.activation_key_expired()`` is ``True``
|
||||
outside the activation window.
|
||||
|
||||
"""
|
||||
new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
**self.user_info)
|
||||
new_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1)
|
||||
new_user.save()
|
||||
profile = RegistrationProfile.objects.get(user=new_user)
|
||||
self.failUnless(profile.activation_key_expired())
|
||||
|
||||
def test_valid_activation(self):
|
||||
"""
|
||||
Activating a user within the permitted window makes the
|
||||
account active, and resets the activation key.
|
||||
|
||||
"""
|
||||
new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
**self.user_info)
|
||||
profile = RegistrationProfile.objects.get(user=new_user)
|
||||
activated = RegistrationProfile.objects.activate_user(profile.activation_key)
|
||||
|
||||
self.failUnless(isinstance(activated, User))
|
||||
self.assertEqual(activated.id, new_user.id)
|
||||
self.failUnless(activated.is_active)
|
||||
|
||||
profile = RegistrationProfile.objects.get(user=new_user)
|
||||
self.assertEqual(profile.activation_key, RegistrationProfile.ACTIVATED)
|
||||
|
||||
def test_expired_activation(self):
|
||||
"""
|
||||
Attempting to activate outside the permitted window does not
|
||||
activate the account.
|
||||
|
||||
"""
|
||||
new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
**self.user_info)
|
||||
new_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1)
|
||||
new_user.save()
|
||||
|
||||
profile = RegistrationProfile.objects.get(user=new_user)
|
||||
activated = RegistrationProfile.objects.activate_user(profile.activation_key)
|
||||
|
||||
self.failIf(isinstance(activated, User))
|
||||
self.failIf(activated)
|
||||
|
||||
new_user = User.objects.get(username='alice')
|
||||
self.failIf(new_user.is_active)
|
||||
|
||||
profile = RegistrationProfile.objects.get(user=new_user)
|
||||
self.assertNotEqual(profile.activation_key, RegistrationProfile.ACTIVATED)
|
||||
|
||||
def test_activation_invalid_key(self):
|
||||
"""
|
||||
Attempting to activate with a key which is not a SHA1 hash
|
||||
fails.
|
||||
|
||||
"""
|
||||
self.failIf(RegistrationProfile.objects.activate_user('foo'))
|
||||
|
||||
def test_activation_already_activated(self):
|
||||
"""
|
||||
Attempting to re-activate an already-activated account fails.
|
||||
|
||||
"""
|
||||
new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
**self.user_info)
|
||||
profile = RegistrationProfile.objects.get(user=new_user)
|
||||
RegistrationProfile.objects.activate_user(profile.activation_key)
|
||||
|
||||
profile = RegistrationProfile.objects.get(user=new_user)
|
||||
self.failIf(RegistrationProfile.objects.activate_user(profile.activation_key))
|
||||
|
||||
def test_activation_nonexistent_key(self):
|
||||
"""
|
||||
Attempting to activate with a non-existent key (i.e., one not
|
||||
associated with any account) fails.
|
||||
|
||||
"""
|
||||
# Due to the way activation keys are constructed during
|
||||
# registration, this will never be a valid key.
|
||||
invalid_key = sha_constructor('foo').hexdigest()
|
||||
self.failIf(RegistrationProfile.objects.activate_user(invalid_key))
|
||||
|
||||
def test_expired_user_deletion(self):
|
||||
"""
|
||||
``RegistrationProfile.objects.delete_expired_users()`` only
|
||||
deletes inactive users whose activation window has expired.
|
||||
|
||||
"""
|
||||
new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
**self.user_info)
|
||||
expired_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
username='bob',
|
||||
password='secret',
|
||||
email='bob@example.com')
|
||||
expired_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1)
|
||||
expired_user.save()
|
||||
|
||||
RegistrationProfile.objects.delete_expired_users()
|
||||
self.assertEqual(RegistrationProfile.objects.count(), 1)
|
||||
self.assertRaises(User.DoesNotExist, User.objects.get, username='bob')
|
||||
|
||||
def test_management_command(self):
|
||||
"""
|
||||
The ``cleanupregistration`` management command properly
|
||||
deletes expired accounts.
|
||||
|
||||
"""
|
||||
new_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
**self.user_info)
|
||||
expired_user = RegistrationProfile.objects.create_inactive_user(site=Site.objects.get_current(),
|
||||
username='bob',
|
||||
password='secret',
|
||||
email='bob@example.com')
|
||||
expired_user.date_joined -= datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS + 1)
|
||||
expired_user.save()
|
||||
|
||||
management.call_command('cleanupregistration')
|
||||
self.assertEqual(RegistrationProfile.objects.count(), 1)
|
||||
self.assertRaises(User.DoesNotExist, User.objects.get, username='bob')
|
|
@ -0,0 +1,82 @@
|
|||
"""
|
||||
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; instead, use
|
||||
``registration/backends/default/urls.py``. This URLconf includes those
|
||||
URLs, and also adds several additional URLs which serve no purpose
|
||||
other than to test that optional keyword arguments are properly
|
||||
handled.
|
||||
|
||||
"""
|
||||
|
||||
from django.conf.urls.defaults import *
|
||||
from django.views.generic.simple import direct_to_template
|
||||
|
||||
from registration.views import activate
|
||||
from registration.views import register
|
||||
|
||||
|
||||
urlpatterns = patterns('',
|
||||
# Test the 'activate' view with custom template
|
||||
# name.
|
||||
url(r'^activate-with-template-name/(?P<activation_key>\w+)/$',
|
||||
activate,
|
||||
{'template_name': 'registration/test_template_name.html',
|
||||
'backend': 'registration.backends.default.DefaultBackend'},
|
||||
name='registration_test_activate_template_name'),
|
||||
# Test the 'activate' view with
|
||||
# extra_context_argument.
|
||||
url(r'^activate-extra-context/(?P<activation_key>\w+)/$',
|
||||
activate,
|
||||
{'extra_context': {'foo': 'bar', 'callable': lambda: 'called'},
|
||||
'backend': 'registration.backends.default.DefaultBackend'},
|
||||
name='registration_test_activate_extra_context'),
|
||||
# Test the 'activate' view with success_url argument.
|
||||
url(r'^activate-with-success-url/(?P<activation_key>\w+)/$',
|
||||
activate,
|
||||
{'success_url': 'registration_test_custom_success_url',
|
||||
'backend': 'registration.backends.default.DefaultBackend'},
|
||||
name='registration_test_activate_success_url'),
|
||||
# Test the 'register' view with custom template
|
||||
# name.
|
||||
url(r'^register-with-template-name/$',
|
||||
register,
|
||||
{'template_name': 'registration/test_template_name.html',
|
||||
'backend': 'registration.backends.default.DefaultBackend'},
|
||||
name='registration_test_register_template_name'),
|
||||
# Test the'register' view with extra_context
|
||||
# argument.
|
||||
url(r'^register-extra-context/$',
|
||||
register,
|
||||
{'extra_context': {'foo': 'bar', 'callable': lambda: 'called'},
|
||||
'backend': 'registration.backends.default.DefaultBackend'},
|
||||
name='registration_test_register_extra_context'),
|
||||
# Test the 'register' view with custom URL for
|
||||
# closed registration.
|
||||
url(r'^register-with-disallowed-url/$',
|
||||
register,
|
||||
{'disallowed_url': 'registration_test_custom_disallowed',
|
||||
'backend': 'registration.backends.default.DefaultBackend'},
|
||||
name='registration_test_register_disallowed_url'),
|
||||
# Set up a pattern which will correspond to the
|
||||
# custom 'disallowed_url' above.
|
||||
url(r'^custom-disallowed/$',
|
||||
direct_to_template,
|
||||
{'template': 'registration/registration_closed.html'},
|
||||
name='registration_test_custom_disallowed'),
|
||||
# Test the 'register' view with custom redirect
|
||||
# on successful registration.
|
||||
url(r'^register-with-success_url/$',
|
||||
register,
|
||||
{'success_url': 'registration_test_custom_success_url',
|
||||
'backend': 'registration.backends.default.DefaultBackend'},
|
||||
name='registration_test_register_success_url'
|
||||
),
|
||||
# Pattern for custom redirect set above.
|
||||
url(r'^custom-success/$',
|
||||
direct_to_template,
|
||||
{'template': 'registration/test_template_name.html'},
|
||||
name='registration_test_custom_success_url'),
|
||||
(r'', include('registration.backends.default.urls')),
|
||||
)
|
|
@ -0,0 +1,246 @@
|
|||
import datetime
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib.auth.models import User
|
||||
from django.core import mail
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.test import TestCase
|
||||
|
||||
from registration import forms
|
||||
from registration.models import RegistrationProfile
|
||||
|
||||
|
||||
class RegistrationViewTests(TestCase):
|
||||
"""
|
||||
Test the registration views.
|
||||
|
||||
"""
|
||||
urls = 'registration.tests.urls'
|
||||
|
||||
def setUp(self):
|
||||
"""
|
||||
These tests use the default backend, since we know it's
|
||||
available; that needs to have ``ACCOUNT_ACTIVATION_DAYS`` set.
|
||||
|
||||
"""
|
||||
self.old_activation = getattr(settings, 'ACCOUNT_ACTIVATION_DAYS', None)
|
||||
if self.old_activation is None:
|
||||
settings.ACCOUNT_ACTIVATION_DAYS = 7
|
||||
|
||||
def tearDown(self):
|
||||
"""
|
||||
Yank ``ACCOUNT_ACTIVATION_DAYS`` back out if it wasn't
|
||||
originally set.
|
||||
|
||||
"""
|
||||
if self.old_activation is None:
|
||||
settings.ACCOUNT_ACTIVATION_DAYS = self.old_activation
|
||||
|
||||
def test_registration_view_initial(self):
|
||||
"""
|
||||
A ``GET`` to the ``register`` view uses the appropriate
|
||||
template and populates the registration form into the context.
|
||||
|
||||
"""
|
||||
response = self.client.get(reverse('registration_register'))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertTemplateUsed(response,
|
||||
'registration/registration_form.html')
|
||||
self.failUnless(isinstance(response.context['form'],
|
||||
forms.RegistrationForm))
|
||||
|
||||
def test_registration_view_success(self):
|
||||
"""
|
||||
A ``POST`` to the ``register`` view with valid data properly
|
||||
creates a new user and issues a redirect.
|
||||
|
||||
"""
|
||||
response = self.client.post(reverse('registration_register'),
|
||||
data={'username': 'alice',
|
||||
'email': 'alice@example.com',
|
||||
'password1': 'swordfish',
|
||||
'password2': 'swordfish'})
|
||||
self.assertRedirects(response,
|
||||
'http://testserver%s' % reverse('registration_complete'))
|
||||
self.assertEqual(RegistrationProfile.objects.count(), 1)
|
||||
self.assertEqual(len(mail.outbox), 1)
|
||||
|
||||
def test_registration_view_failure(self):
|
||||
"""
|
||||
A ``POST`` to the ``register`` view with invalid data does not
|
||||
create a user, and displays appropriate error messages.
|
||||
|
||||
"""
|
||||
response = self.client.post(reverse('registration_register'),
|
||||
data={'username': 'bob',
|
||||
'email': 'bobe@example.com',
|
||||
'password1': 'foo',
|
||||
'password2': 'bar'})
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.failIf(response.context['form'].is_valid())
|
||||
self.assertFormError(response, 'form', field=None,
|
||||
errors=u"The two password fields didn't match.")
|
||||
self.assertEqual(len(mail.outbox), 0)
|
||||
|
||||
def test_registration_view_closed(self):
|
||||
"""
|
||||
Any attempt to access the ``register`` view when registration
|
||||
is closed fails and redirects.
|
||||
|
||||
"""
|
||||
old_allowed = getattr(settings, 'REGISTRATION_OPEN', True)
|
||||
settings.REGISTRATION_OPEN = False
|
||||
|
||||
closed_redirect = 'http://testserver%s' % reverse('registration_disallowed')
|
||||
|
||||
response = self.client.get(reverse('registration_register'))
|
||||
self.assertRedirects(response, closed_redirect)
|
||||
|
||||
# Even if valid data is posted, it still shouldn't work.
|
||||
response = self.client.post(reverse('registration_register'),
|
||||
data={'username': 'alice',
|
||||
'email': 'alice@example.com',
|
||||
'password1': 'swordfish',
|
||||
'password2': 'swordfish'})
|
||||
self.assertRedirects(response, closed_redirect)
|
||||
self.assertEqual(RegistrationProfile.objects.count(), 0)
|
||||
|
||||
settings.REGISTRATION_OPEN = old_allowed
|
||||
|
||||
def test_registration_template_name(self):
|
||||
"""
|
||||
Passing ``template_name`` to the ``register`` view will result
|
||||
in that template being used.
|
||||
|
||||
"""
|
||||
response = self.client.get(reverse('registration_test_register_template_name'))
|
||||
self.assertTemplateUsed(response,
|
||||
'registration/test_template_name.html')
|
||||
|
||||
def test_registration_extra_context(self):
|
||||
"""
|
||||
Passing ``extra_context`` to the ``register`` view will
|
||||
correctly populate the context.
|
||||
|
||||
"""
|
||||
response = self.client.get(reverse('registration_test_register_extra_context'))
|
||||
self.assertEqual(response.context['foo'], 'bar')
|
||||
# Callables in extra_context are called to obtain the value.
|
||||
self.assertEqual(response.context['callable'], 'called')
|
||||
|
||||
def test_registration_disallowed_url(self):
|
||||
"""
|
||||
Passing ``disallowed_url`` to the ``register`` view will
|
||||
result in a redirect to that URL when registration is closed.
|
||||
|
||||
"""
|
||||
old_allowed = getattr(settings, 'REGISTRATION_OPEN', True)
|
||||
settings.REGISTRATION_OPEN = False
|
||||
|
||||
closed_redirect = 'http://testserver%s' % reverse('registration_test_custom_disallowed')
|
||||
|
||||
response = self.client.get(reverse('registration_test_register_disallowed_url'))
|
||||
self.assertRedirects(response, closed_redirect)
|
||||
|
||||
settings.REGISTRATION_OPEN = old_allowed
|
||||
|
||||
def test_registration_success_url(self):
|
||||
"""
|
||||
Passing ``success_url`` to the ``register`` view will result
|
||||
in a redirect to that URL when registration is successful.
|
||||
|
||||
"""
|
||||
success_redirect = 'http://testserver%s' % reverse('registration_test_custom_success_url')
|
||||
response = self.client.post(reverse('registration_test_register_success_url'),
|
||||
data={'username': 'alice',
|
||||
'email': 'alice@example.com',
|
||||
'password1': 'swordfish',
|
||||
'password2': 'swordfish'})
|
||||
self.assertRedirects(response, success_redirect)
|
||||
|
||||
def test_valid_activation(self):
|
||||
"""
|
||||
Test that the ``activate`` view properly handles a valid
|
||||
activation (in this case, based on the default backend's
|
||||
activation window).
|
||||
|
||||
"""
|
||||
success_redirect = 'http://testserver%s' % reverse('registration_activation_complete')
|
||||
|
||||
# First, register an account.
|
||||
self.client.post(reverse('registration_register'),
|
||||
data={'username': 'alice',
|
||||
'email': 'alice@example.com',
|
||||
'password1': 'swordfish',
|
||||
'password2': 'swordfish'})
|
||||
profile = RegistrationProfile.objects.get(user__username='alice')
|
||||
response = self.client.get(reverse('registration_activate',
|
||||
kwargs={'activation_key': profile.activation_key}))
|
||||
self.assertRedirects(response, success_redirect)
|
||||
self.failUnless(User.objects.get(username='alice').is_active)
|
||||
|
||||
def test_invalid_activation(self):
|
||||
"""
|
||||
Test that the ``activate`` view properly handles an invalid
|
||||
activation (in this case, based on the default backend's
|
||||
activation window).
|
||||
|
||||
"""
|
||||
# Register an account and reset its date_joined to be outside
|
||||
# the activation window.
|
||||
self.client.post(reverse('registration_register'),
|
||||
data={'username': 'bob',
|
||||
'email': 'bob@example.com',
|
||||
'password1': 'secret',
|
||||
'password2': 'secret'})
|
||||
expired_user = User.objects.get(username='bob')
|
||||
expired_user.date_joined = expired_user.date_joined - datetime.timedelta(days=settings.ACCOUNT_ACTIVATION_DAYS)
|
||||
expired_user.save()
|
||||
|
||||
expired_profile = RegistrationProfile.objects.get(user=expired_user)
|
||||
response = self.client.get(reverse('registration_activate',
|
||||
kwargs={'activation_key': expired_profile.activation_key}))
|
||||
self.assertEqual(response.status_code, 200)
|
||||
self.assertEqual(response.context['activation_key'],
|
||||
expired_profile.activation_key)
|
||||
self.failIf(User.objects.get(username='bob').is_active)
|
||||
|
||||
def test_activation_success_url(self):
|
||||
"""
|
||||
Passing ``success_url`` to the ``activate`` view and
|
||||
successfully activating will result in that URL being used for
|
||||
the redirect.
|
||||
|
||||
"""
|
||||
success_redirect = 'http://testserver%s' % reverse('registration_test_custom_success_url')
|
||||
self.client.post(reverse('registration_register'),
|
||||
data={'username': 'alice',
|
||||
'email': 'alice@example.com',
|
||||
'password1': 'swordfish',
|
||||
'password2': 'swordfish'})
|
||||
profile = RegistrationProfile.objects.get(user__username='alice')
|
||||
response = self.client.get(reverse('registration_test_activate_success_url',
|
||||
kwargs={'activation_key': profile.activation_key}))
|
||||
self.assertRedirects(response, success_redirect)
|
||||
|
||||
def test_activation_template_name(self):
|
||||
"""
|
||||
Passing ``template_name`` to the ``activate`` view will result
|
||||
in that template being used.
|
||||
|
||||
"""
|
||||
response = self.client.get(reverse('registration_test_activate_template_name',
|
||||
kwargs={'activation_key': 'foo'}))
|
||||
self.assertTemplateUsed(response, 'registration/test_template_name.html')
|
||||
|
||||
def test_activation_extra_context(self):
|
||||
"""
|
||||
Passing ``extra_context`` to the ``activate`` view will
|
||||
correctly populate the context.
|
||||
|
||||
"""
|
||||
response = self.client.get(reverse('registration_test_activate_extra_context',
|
||||
kwargs={'activation_key': 'foo'}))
|
||||
self.assertEqual(response.context['foo'], 'bar')
|
||||
# Callables in extra_context are called to obtain the value.
|
||||
self.assertEqual(response.context['callable'], 'called')
|
|
@ -0,0 +1,15 @@
|
|||
"""
|
||||
Backwards-compatible URLconf for existing django-registration
|
||||
installs; this allows the standard ``include('registration.urls')`` to
|
||||
continue working, but that usage is deprecated and will be removed for
|
||||
django-registration 1.0. For new installs, use
|
||||
``include('registration.backends.default.urls')``.
|
||||
|
||||
"""
|
||||
|
||||
import warnings
|
||||
|
||||
warnings.warn("include('registration.urls') is deprecated; use include('registration.backends.default.urls') instead.",
|
||||
PendingDeprecationWarning)
|
||||
|
||||
from registration.backends.default.urls import *
|
|
@ -0,0 +1,204 @@
|
|||
"""
|
||||
Views which allow users to create and activate accounts.
|
||||
|
||||
"""
|
||||
|
||||
|
||||
from django.shortcuts import redirect
|
||||
from django.shortcuts import render_to_response
|
||||
from django.template import RequestContext
|
||||
|
||||
from registration.backends import get_backend
|
||||
|
||||
|
||||
def activate(request, backend,
|
||||
template_name='registration/activate.html',
|
||||
success_url=None, extra_context=None, **kwargs):
|
||||
"""
|
||||
Activate a user's account.
|
||||
|
||||
The actual activation of the account will be delegated to the
|
||||
backend specified by the ``backend`` keyword argument (see below);
|
||||
the backend's ``activate()`` method will be called, passing any
|
||||
keyword arguments captured from the URL, and will be assumed to
|
||||
return a ``User`` if activation was successful, or a value which
|
||||
evaluates to ``False`` in boolean context if not.
|
||||
|
||||
Upon successful activation, the backend's
|
||||
``post_activation_redirect()`` method will be called, passing the
|
||||
``HttpRequest`` and the activated ``User`` to determine the URL to
|
||||
redirect the user to. To override this, pass the argument
|
||||
``success_url`` (see below).
|
||||
|
||||
On unsuccessful activation, will render the template
|
||||
``registration/activate.html`` to display an error message; to
|
||||
override thise, pass the argument ``template_name`` (see below).
|
||||
|
||||
**Arguments**
|
||||
|
||||
``backend``
|
||||
The dotted Python import path to the backend class to
|
||||
use. Required.
|
||||
|
||||
``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. Optional.
|
||||
|
||||
``success_url``
|
||||
The name of a URL pattern to redirect to on successful
|
||||
acivation. This is optional; if not specified, this will be
|
||||
obtained by calling the backend's
|
||||
``post_activation_redirect()`` method.
|
||||
|
||||
``template_name``
|
||||
A custom template to use. This is optional; if not specified,
|
||||
this will default to ``registration/activate.html``.
|
||||
|
||||
``\*\*kwargs``
|
||||
Any keyword arguments captured from the URL, such as an
|
||||
activation key, which will be passed to the backend's
|
||||
``activate()`` method.
|
||||
|
||||
**Context:**
|
||||
|
||||
The context will be populated from the keyword arguments captured
|
||||
in the URL, and any extra variables supplied in the
|
||||
``extra_context`` argument (see above).
|
||||
|
||||
**Template:**
|
||||
|
||||
registration/activate.html or ``template_name`` keyword argument.
|
||||
|
||||
"""
|
||||
backend = get_backend(backend)
|
||||
account = backend.activate(request, **kwargs)
|
||||
|
||||
if account:
|
||||
if success_url is None:
|
||||
to, args, kwargs = backend.post_activation_redirect(request, account)
|
||||
return redirect(to, *args, **kwargs)
|
||||
else:
|
||||
return redirect(success_url)
|
||||
|
||||
if extra_context is None:
|
||||
extra_context = {}
|
||||
context = RequestContext(request)
|
||||
for key, value in extra_context.items():
|
||||
context[key] = callable(value) and value() or value
|
||||
|
||||
return render_to_response(template_name,
|
||||
kwargs,
|
||||
context_instance=context)
|
||||
|
||||
|
||||
def register(request, backend, success_url=None, form_class=None,
|
||||
disallowed_url='registration_disallowed',
|
||||
template_name='registration/registration_form.html',
|
||||
extra_context=None):
|
||||
"""
|
||||
Allow a new user to register an account.
|
||||
|
||||
The actual registration of the account will be delegated to the
|
||||
backend specified by the ``backend`` keyword argument (see below);
|
||||
it will be used as follows:
|
||||
|
||||
1. The backend's ``registration_allowed()`` method will be called,
|
||||
passing the ``HttpRequest``, to determine whether registration
|
||||
of an account is to be allowed; if not, a redirect is issued to
|
||||
the view corresponding to the named URL pattern
|
||||
``registration_disallowed``. To override this, see the list of
|
||||
optional arguments for this view (below).
|
||||
|
||||
2. The form to use for account registration will be obtained by
|
||||
calling the backend's ``get_form_class()`` method, passing the
|
||||
``HttpRequest``. To override this, see the list of optional
|
||||
arguments for this view (below).
|
||||
|
||||
3. If valid, the form's ``cleaned_data`` will be passed (as
|
||||
keyword arguments, and along with the ``HttpRequest``) to the
|
||||
backend's ``register()`` method, which should return the new
|
||||
``User`` object.
|
||||
|
||||
4. Upon successful registration, the backend's
|
||||
``post_registration_redirect()`` method will be called, passing
|
||||
the ``HttpRequest`` and the new ``User``, to determine the URL
|
||||
to redirect the user to. To override this, see the list of
|
||||
optional arguments for this view (below).
|
||||
|
||||
**Required arguments**
|
||||
|
||||
None.
|
||||
|
||||
**Optional arguments**
|
||||
|
||||
``backend``
|
||||
The dotted Python import path to the backend class to use.
|
||||
|
||||
``disallowed_url``
|
||||
URL to redirect to if registration is not permitted for the
|
||||
current ``HttpRequest``. Must be a value which can legally be
|
||||
passed to ``django.shortcuts.redirect``. If not supplied, this
|
||||
will be whatever URL corresponds to the named URL pattern
|
||||
``registration_disallowed``.
|
||||
|
||||
``form_class``
|
||||
The form class to use for registration. If not supplied, this
|
||||
will be retrieved from the registration backend.
|
||||
|
||||
``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.
|
||||
|
||||
``success_url``
|
||||
URL to redirect to after successful registration. Must be a
|
||||
value which can legally be passed to
|
||||
``django.shortcuts.redirect``. If not supplied, this will be
|
||||
retrieved from the registration backend.
|
||||
|
||||
``template_name``
|
||||
A custom template to use. If not supplied, this will default
|
||||
to ``registration/registration_form.html``.
|
||||
|
||||
**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.
|
||||
|
||||
"""
|
||||
backend = get_backend(backend)
|
||||
if not backend.registration_allowed(request):
|
||||
return redirect(disallowed_url)
|
||||
if form_class is None:
|
||||
form_class = backend.get_form_class(request)
|
||||
|
||||
if request.method == 'POST':
|
||||
form = form_class(data=request.POST, files=request.FILES)
|
||||
if form.is_valid():
|
||||
new_user = backend.register(request, **form.cleaned_data)
|
||||
if success_url is None:
|
||||
to, args, kwargs = backend.post_registration_redirect(request, new_user)
|
||||
return redirect(to, *args, **kwargs)
|
||||
else:
|
||||
return redirect(success_url)
|
||||
else:
|
||||
form = form_class()
|
||||
|
||||
if extra_context is None:
|
||||
extra_context = {}
|
||||
context = RequestContext(request)
|
||||
for key, value in extra_context.items():
|
||||
context[key] = callable(value) and value() or value
|
||||
|
||||
return render_to_response(template_name,
|
||||
{'form': form},
|
||||
context_instance=context)
|
Loading…
Reference in New Issue