Browse Source

Signin to Django Admin

Rafał Pitoń 11 years ago
parent
commit
4178aa2e7f

+ 3 - 0
misago/project_template/project_name/urls.py

@@ -1,8 +1,11 @@
 from django.conf import settings
 from django.conf import settings
 from django.conf.urls import patterns, include, url
 from django.conf.urls import patterns, include, url
 
 
+# Setup Django admin to work with Misago auth
 from django.contrib import admin
 from django.contrib import admin
+from misago.users.forms.auth import AdminAuthenticationForm
 admin.autodiscover()
 admin.autodiscover()
+admin.site.login_form = AdminAuthenticationForm
 
 
 urlpatterns = patterns('',
 urlpatterns = patterns('',
     url(r'^', include('misago.urls', namespace='misago')),
     url(r'^', include('misago.urls', namespace='misago')),

+ 56 - 0
misago/templates/admin/login.html

@@ -0,0 +1,56 @@
+{# Django 1.7 Admin Login template here cos 1.6 template fails to work with floppyforms. #}
+{% extends "admin/base_site.html" %}
+{% load i18n admin_static %}
+
+{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/login.css" %}" />{% endblock %}
+
+{% block bodyclass %}{{ block.super }} login{% endblock %}
+
+{% block nav-global %}{% endblock %}
+
+{% block content_title %}{% endblock %}
+
+{% block breadcrumbs %}{% endblock %}
+
+{% block content %}
+{% if form.errors and not form.non_field_errors %}
+<p class="errornote">
+{% if form.errors.items|length == 1 %}{% trans "Please correct the error below." %}{% else %}{% trans "Please correct the errors below." %}{% endif %}
+</p>
+{% endif %}
+
+{% if form.non_field_errors %}
+{% for error in form.non_field_errors %}
+<p class="errornote">
+    {{ error }}
+</p>
+{% endfor %}
+{% endif %}
+
+<div id="content-main">
+<form action="{{ app_path }}" method="post" id="login-form">{% csrf_token %}
+  <div class="form-row">
+    {{ form.username.errors }}
+    {{ form.username.label_tag }} {{ form.username }}
+  </div>
+  <div class="form-row">
+    {{ form.password.errors }}
+    {{ form.password.label_tag }} {{ form.password }}
+    <input type="hidden" name="next" value="{{ next }}" />
+  </div>
+  {% url 'admin_password_reset' as password_reset_url %}
+  {% if password_reset_url %}
+  <div class="password-reset-link">
+    <a href="{{ password_reset_url }}">{% trans 'Forgotten your password or username?' %}</a>
+  </div>
+  {% endif %}
+  <div class="submit-row">
+    <label>&nbsp;</label><input type="submit" value="{% trans 'Log in' %}" />
+  </div>
+</form>
+
+<script type="text/javascript">
+document.getElementById('id_username').focus()
+</script>
+</div>
+{% endblock %}

+ 0 - 0
misago/users/forms/__init__.py


+ 48 - 0
misago/users/forms/auth.py

@@ -0,0 +1,48 @@
+from django.core.exceptions import ValidationError
+from django.contrib.auth import authenticate
+from django.contrib.auth.forms import (AuthenticationForm as
+                                       BaseAuthenticationForm)
+from django.utils.translation import ugettext_lazy as _
+from misago.core import forms
+
+
+class AuthenticationForm(forms.Form, BaseAuthenticationForm):
+    """
+    Base class for authenticating users, Floppy-forms and
+    Misago login field comliant
+    """
+    username = forms.CharField(label=_("Username or e-mail"), max_length=254)
+    password = forms.CharField(label=_("Password"), widget=forms.PasswordInput)
+
+    error_messages = {
+        'invalid_login': _("Your login or password is incorrect. Please try again."),
+        'inactive': _("This account is inactive."),
+    }
+
+    def clean(self):
+        username = self.cleaned_data.get('username')
+        password = self.cleaned_data.get('password')
+
+        if username and password:
+            self.user_cache = authenticate(username=username,
+                                           password=password)
+            if self.user_cache is None:
+                raise ValidationError(
+                    self.error_messages['invalid_login'],
+                    code='invalid_login',
+                )
+            else:
+                self.confirm_login_allowed(self.user_cache)
+
+        return self.cleaned_data
+
+
+class AdminAuthenticationForm(AuthenticationForm):
+    required_css_class = 'required'
+
+    def confirm_login_allowed(self, user):
+        if not user.is_active or not user.is_staff:
+            raise forms.ValidationError(
+                self.error_messages['invalid_login'],
+                code='invalid_login',
+            )