diff --git a/re2o/urls.py b/re2o/urls.py
index 39f51ec3..37497572 100644
--- a/re2o/urls.py
+++ b/re2o/urls.py
@@ -46,10 +46,15 @@ from __future__ import unicode_literals
from django.conf import settings
from django.conf.urls import include, url
from django.contrib import admin
-from django.contrib.auth import views as auth_views
+from django.utils.translation import gettext_lazy as _
+from django.views.generic import RedirectView
from .views import index, about_page, contact_page
+# Admin site configuration
+admin.site.index_title = _('Homepage')
+admin.site.index_template = 'admin/custom_index.html'
+
handler500 = 're2o.views.handler500'
handler404 = 're2o.views.handler404'
@@ -57,10 +62,7 @@ urlpatterns = [
url(r'^$', index, name='index'),
url(r'^about/$', about_page, name='about'),
url(r'^contact/$', contact_page, name='contact'),
- url('^logout/', auth_views.logout, {'next_page': '/'}),
- url('^', include('django.contrib.auth.urls')),
url(r'^i18n/', include('django.conf.urls.i18n')),
- url(r'^admin/', include(admin.site.urls)),
url(r'^users/', include('users.urls', namespace='users')),
url(r'^search/', include('search.urls', namespace='search')),
url(
@@ -74,6 +76,12 @@ urlpatterns = [
r'^preferences/',
include('preferences.urls', namespace='preferences')
),
+
+ # Include contrib auth and contrib admin
+ # manage/login/ is redirected to the non-admin login page
+ url(r'^', include('django.contrib.auth.urls')),
+ url(r'^admin/login/$', RedirectView.as_view(pattern_name='login')),
+ url(r'^admin/', include(admin.site.urls)),
]
# Add debug_toolbar URLs if activated
if 'debug_toolbar' in settings.INSTALLED_APPS:
diff --git a/static/css/admin.css b/static/css/admin.css
new file mode 100644
index 00000000..b8888ae4
--- /dev/null
+++ b/static/css/admin.css
@@ -0,0 +1,158 @@
+/*
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright © 2019 Alexandre Iooss
+ *
+ * This is the custom style for Django Contrib Admin
+ */
+
+/* Colors */
+#header {
+ background-color: #222;
+ border-bottom: solid 3px #f9a01b;
+}
+
+.module h2, .module caption, .inline-group h2 {
+ background: #e6e0d8;
+ color: #222;
+}
+
+a.section:link, a.section:visited {
+ color: #222;
+}
+
+#user-tools a {
+ border-bottom: none;
+ font-weight: bold;
+}
+
+div.breadcrumbs {
+ background: #3c3c3c;
+}
+
+.button, input[type=submit], input[type=button], .submit-row input, a.button {
+ background: #d8a456;
+}
+
+.button:active, input[type=submit]:active, input[type=button]:active, .button:focus, input[type=submit]:focus,
+input[type=button]:focus, .button:hover, input[type=submit]:hover, input[type=button]:hover {
+ background: #b98d4a;
+}
+
+.button.default, input[type=submit].default, .submit-row input.default {
+ background: #b98d4a;
+}
+
+.button.default:active, input[type=submit].default:active, .button.default:focus, input[type=submit].default:focus,
+.button.default:hover, input[type=submit].default:hover {
+ background: #a7752b;
+}
+
+/* Image in branding */
+img.banding-logo {
+ margin-top: -3px;
+ height: 32px;
+}
+
+/* Navbar menu */
+#nav {
+ padding: 0;
+ margin: 0 0 0 20px;
+ font-weight: 300;
+ font-size: 11px;
+ letter-spacing: 0.5px;
+ text-transform: uppercase;
+ text-align: left;
+}
+
+#nav a {
+ border-bottom: none;
+ font-weight: bold;
+ display: inline-block;
+}
+
+#nav div.dropdown:hover > a, #nav div.dropdown:focus > a {
+ text-decoration: none;
+ color: #79aec8;
+}
+
+#nav a.activated {
+ text-decoration: underline;
+}
+
+#nav div.dropdown {
+ position: relative; /* needed to position the dropdown content */
+ display: inline-block;
+}
+
+#nav div.dropdown-content {
+ display: none;
+ position: absolute;
+ background-color: #444444;
+ min-width: 220px;
+ box-shadow: 0 8px 16px 0 rgba(0, 0, 0, 0.2);
+ z-index: 100;
+}
+
+#nav div.dropdown-content a {
+ color: #fff;
+ padding: 7px 8px;
+ text-decoration: none;
+ display: block;
+ line-height: 16px;
+}
+
+#nav div.dropdown-content a:hover {
+ background-color: #636363;
+}
+
+#nav div.dropdown:hover .dropdown-content {
+ display: block;
+}
+
+/* Fix navigation hidden */
+#header {
+ overflow: visible;
+}
+
+.login #header {
+ overflow: hidden;
+}
+
+/* Footer */
+#footer {
+ padding: 20px 40px;
+ color: #999;
+}
+
+.login #footer {
+ padding: 10px;
+}
+
+#footer a {
+ color: #777;
+}
+
+#footer select {
+ height: 24px;
+ padding: 0;
+}
+
+/* Pull footer to bottom */
+#content {
+ min-height: calc(100vh - 310px);
+}
+
+.login #content {
+ min-height: 0;
+}
+
+/* Recenter login button */
+.login .submit-row {
+ padding: 1em 0 0 8.5em !important;
+}
+
+/* Dashboard should take all page */
+.dashboard #content {
+ width: auto;
+}
diff --git a/templates/admin/base_site.html b/templates/admin/base_site.html
new file mode 100644
index 00000000..ebccdad7
--- /dev/null
+++ b/templates/admin/base_site.html
@@ -0,0 +1,91 @@
+{% extends "admin/base.html" %}
+{% comment %}
+SPDX-License-Identifier: GPL-2.0-or-later
+
+Copyright © 2019 Alexandre Iooss
+{% endcomment %}
+
+{% load i18n staticfiles %}
+
+{% block title %}{{ title }} | {{ name_website }}{% endblock %}
+
+{% block branding %}
+
+{% endblock %}
+
+{% block nav-global %}
+
+ {% if available_apps %}
+ {% for app in available_apps %}
+
+ {% if app_list|length == 1 and app.name == app_list.0.name %}
+
{{ app.name }}
+ {% else %}
+
{{ app.name }}
+ {% endif %}
+
+ {% for model in app.models %}
+ {% if model.admin_url %}
+
{{ model.name }}
+ {% endif %}
+ {% endfor %}
+
+
+ {% if not forloop.last %}/{% endif %}
+ {% endfor %}
+ {% endif %}
+
+{% endblock %}
+
+{% block extrahead %}
+ {# Favicon with iOS, Android, touchbar support #}
+
+
+
+
+
+
+
+{% endblock %}
+
+{% block extrastyle %}
+
+{% endblock %}
+
+{% block footer %}
+
+{% endblock %}
diff --git a/templates/admin/custom_index.html b/templates/admin/custom_index.html
new file mode 100644
index 00000000..df0a330c
--- /dev/null
+++ b/templates/admin/custom_index.html
@@ -0,0 +1,57 @@
+{% extends "admin/index.html" %}
+{% comment %}
+SPDX-License-Identifier: GPL-2.0-or-later
+
+Copyright © 2019 Alexandre Iooss
+{% endcomment %}
+
+{% load i18n static %}
+
+{% block content_title %}
+ {% blocktrans %}Welcome to {{ name_website }}{% endblocktrans %}
+{% endblock %}
+
+{% block content %}
+
+
+ {% blocktrans %}You are on the operator interface. Here you will be able to manage the network and users
+ from the top left menu. You can also go read the developer documentation.{% endblocktrans %}
+
+
+ {% blocktrans %}To go back to the main site, click "View site" button in top right menu.{% endblocktrans %}
+
+
+{% endblock %}
+
+{% block sidebar %}
+
+
+
{% trans 'My account' %}
+
{% trans 'My recent actions' %}
+ {% load log %}
+ {% get_admin_log 10 as admin_log for_user user %}
+ {% if not admin_log %}
+
{% trans 'None available' %}
+ {% else %}
+
+ {% for entry in admin_log %}
+
+ {% if entry.is_deletion or not entry.get_admin_url %}
+ {{ entry.object_repr }}
+ {% else %}
+ {{ entry.object_repr }}
+ {% endif %}
+
+ {% if entry.content_type %}
+ {% filter capfirst %}
+ {{ entry.content_type }}{% endfilter %}
+ {% else %}
+ {% trans 'Unknown content' %}
+ {% endif %}
+
+ {% endfor %}
+
+ {% endif %}
+
+
+{% endblock %}
diff --git a/templates/registration/logged_out.html b/templates/registration/logged_out.html
new file mode 100644
index 00000000..b700f171
--- /dev/null
+++ b/templates/registration/logged_out.html
@@ -0,0 +1,18 @@
+{% extends "registration/logged_out.html" %}
+{% comment %}
+SPDX-License-Identifier: GPL-2.0-or-later
+
+Copyright © 2019 Alexandre Iooss
+{% endcomment %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+
+{% endblock %}
+
+{% block content %}
+ {% trans "Thanks for spending some quality time with the Web site today." %}
+ {% trans 'Log in again' %}
+{% endblock %}
diff --git a/templates/registration/password_change_done.html b/templates/registration/password_change_done.html
new file mode 100644
index 00000000..0e514b53
--- /dev/null
+++ b/templates/registration/password_change_done.html
@@ -0,0 +1,13 @@
+{% extends "registration/password_change_done.html" %}
+{% comment %}
+SPDX-License-Identifier: GPL-2.0-or-later
+
+Copyright © 2019 Alexandre Iooss
+{% endcomment %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+
+{% endblock %}
diff --git a/templates/registration/password_change_form.html b/templates/registration/password_change_form.html
new file mode 100644
index 00000000..5524bfa0
--- /dev/null
+++ b/templates/registration/password_change_form.html
@@ -0,0 +1,13 @@
+{% extends "registration/password_change_form.html" %}
+{% comment %}
+SPDX-License-Identifier: GPL-2.0-or-later
+
+Copyright © 2019 Alexandre Iooss
+{% endcomment %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+
+{% endblock %}
diff --git a/templates/registration/password_reset_complete.html b/templates/registration/password_reset_complete.html
new file mode 100644
index 00000000..506c0981
--- /dev/null
+++ b/templates/registration/password_reset_complete.html
@@ -0,0 +1,13 @@
+{% extends "registration/password_reset_complete.html" %}
+{% comment %}
+SPDX-License-Identifier: GPL-2.0-or-later
+
+Copyright © 2019 Alexandre Iooss
+{% endcomment %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+
+{% endblock %}
diff --git a/templates/registration/password_reset_confirm.html b/templates/registration/password_reset_confirm.html
new file mode 100644
index 00000000..de710a83
--- /dev/null
+++ b/templates/registration/password_reset_confirm.html
@@ -0,0 +1,13 @@
+{% extends "registration/password_reset_confirm.html" %}
+{% comment %}
+SPDX-License-Identifier: GPL-2.0-or-later
+
+Copyright © 2019 Alexandre Iooss
+{% endcomment %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+
+{% endblock %}
diff --git a/templates/registration/password_reset_done.html b/templates/registration/password_reset_done.html
new file mode 100644
index 00000000..5e008001
--- /dev/null
+++ b/templates/registration/password_reset_done.html
@@ -0,0 +1,13 @@
+{% extends "registration/password_reset_done.html" %}
+{% comment %}
+SPDX-License-Identifier: GPL-2.0-or-later
+
+Copyright © 2019 Alexandre Iooss
+{% endcomment %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+
+{% endblock %}
diff --git a/templates/registration/password_reset_email.html b/templates/registration/password_reset_email.html
new file mode 100644
index 00000000..f43d80c3
--- /dev/null
+++ b/templates/registration/password_reset_email.html
@@ -0,0 +1,13 @@
+{% load i18n %}{% autoescape off %}
+{% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %}
+
+{% trans "Please go to the following page and choose a new password:" %}
+{% block reset_link %}
+{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
+{% endblock %}
+
+{% trans "Thanks for using our site!" %}
+
+{% blocktrans %}The {{ site_name }} team{% endblocktrans %}
+
+{% endautoescape %}
diff --git a/templates/registration/password_reset_form.html b/templates/registration/password_reset_form.html
new file mode 100644
index 00000000..26c1e282
--- /dev/null
+++ b/templates/registration/password_reset_form.html
@@ -0,0 +1,13 @@
+{% extends "registration/password_reset_form.html" %}
+{% comment %}
+SPDX-License-Identifier: GPL-2.0-or-later
+
+Copyright © 2019 Alexandre Iooss
+{% endcomment %}
+{% load i18n %}
+
+{% block breadcrumbs %}
+
+{% endblock %}