mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-17 07:41:26 +00:00
Add authentication and registration to seahub
This commit is contained in:
32
thirdpart/registration/backends/__init__.py
Normal file
32
thirdpart/registration/backends/__init__.py
Normal file
@@ -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()
|
139
thirdpart/registration/backends/default/__init__.py
Normal file
139
thirdpart/registration/backends/default/__init__.py
Normal file
@@ -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', (), {})
|
54
thirdpart/registration/backends/default/urls.py
Normal file
54
thirdpart/registration/backends/default/urls.py
Normal file
@@ -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')),
|
||||
)
|
Reference in New Issue
Block a user