From fe40074cde34fe7e5fe342c9f7bee667ff26d874 Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Fri, 16 Jan 2015 19:39:28 +0100
Subject: [PATCH 01/22] update to Django 1.7.3
---
requirements/base.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/requirements/base.txt b/requirements/base.txt
index 7543bf5..f5ce376 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -1,4 +1,4 @@
-Django==1.7.1
+Django==1.7.3
bpython==0.13.1
django-braces==1.4.0
django-model-utils==2.2
From 19390d369a014c893499e9e4c4560016487f11d5 Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 12:25:54 +0100
Subject: [PATCH 02/22] add admin list filtering and ordering for mail
addresses and mailboxes
---
docs/changelog.rst | 3 +++
gnuviechadmin/managemails/admin.py | 6 +++---
gnuviechadmin/managemails/models.py | 6 ++++++
3 files changed, 12 insertions(+), 3 deletions(-)
diff --git a/docs/changelog.rst b/docs/changelog.rst
index 411c535..93f1b8c 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -1,6 +1,9 @@
Changelog
=========
+* :feature:`-` add admin list filtering and ordering for mail addresses and
+ mailboxes
+
* :release:`0.4.0 <2015-01-11>`
* :feature:`-` add mysqltasks and pgsqltasks
* :feature:`-` add :py:mod:`userdbs` app to allow management of user databases
diff --git a/gnuviechadmin/managemails/admin.py b/gnuviechadmin/managemails/admin.py
index d1ddbdb..f059fd4 100644
--- a/gnuviechadmin/managemails/admin.py
+++ b/gnuviechadmin/managemails/admin.py
@@ -112,7 +112,7 @@ class MailboxAdmin(ActivationChangeMixin, admin.ModelAdmin):
actions = ['activate', 'deactivate']
list_display = ('username', 'osuser', 'active')
- list_filter = ('active',)
+ list_filter = ('active', 'osuser')
fieldsets = (
(None, {
'fields': ('osuser', 'username', 'password', 'active')}),
@@ -157,8 +157,8 @@ class MailAddressForwardInline(admin.TabularInline):
class MailAddressAdmin(ActivationChangeMixin, admin.ModelAdmin):
actions = ['activate', 'deactivate']
- list_display = ('__str__', 'active')
- list_filter = ('active',)
+ list_display = ('__str__', 'mailaddressmailbox', 'active')
+ list_filter = ('active', 'domain')
inlines = [MailAddressMailboxInline, MailAddressForwardInline]
diff --git a/gnuviechadmin/managemails/models.py b/gnuviechadmin/managemails/models.py
index 737dda0..949d260 100644
--- a/gnuviechadmin/managemails/models.py
+++ b/gnuviechadmin/managemails/models.py
@@ -48,6 +48,7 @@ class Mailbox(ActivateAbleMixin, TimeStampedModel, models.Model):
objects = MailboxManager()
class Meta:
+ ordering = ['osuser', 'username']
verbose_name = _('Mailbox')
verbose_name_plural = _('Mailboxes')
@@ -72,6 +73,7 @@ class MailAddress(ActivateAbleMixin, TimeStampedModel, models.Model):
domain = models.ForeignKey(MailDomain)
class Meta:
+ ordering = ['domain', 'localpart']
unique_together = ('localpart', 'domain')
verbose_name = _('Mail address')
verbose_name_plural = _('Mail addresses')
@@ -80,6 +82,7 @@ class MailAddress(ActivateAbleMixin, TimeStampedModel, models.Model):
return "{0}@{1}".format(self.localpart, self.domain)
+@python_2_unicode_compatible
class MailAddressMailbox(TimeStampedModel, models.Model):
mailaddress = models.OneToOneField(MailAddress, primary_key=True)
mailbox = models.ForeignKey(Mailbox)
@@ -87,6 +90,9 @@ class MailAddressMailbox(TimeStampedModel, models.Model):
class Meta:
unique_together = ('mailaddress', 'mailbox')
+ def __str__(self):
+ return self.mailbox.username
+
class MailAddressForward(TimeStampedModel, models.Model):
mailaddress = models.ForeignKey(MailAddress)
From 961a2f471b33f975f95d7f2de0f85537e13445b1 Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 14:04:46 +0100
Subject: [PATCH 03/22] add migration for managemails ordering
---
.../migrations/0002_auto_20150117_1238.py | 22 +++++++++++++++++++
1 file changed, 22 insertions(+)
create mode 100644 gnuviechadmin/managemails/migrations/0002_auto_20150117_1238.py
diff --git a/gnuviechadmin/managemails/migrations/0002_auto_20150117_1238.py b/gnuviechadmin/managemails/migrations/0002_auto_20150117_1238.py
new file mode 100644
index 0000000..5c6d070
--- /dev/null
+++ b/gnuviechadmin/managemails/migrations/0002_auto_20150117_1238.py
@@ -0,0 +1,22 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import models, migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('managemails', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='mailaddress',
+ options={'ordering': ['domain', 'localpart'], 'verbose_name': 'Mail address', 'verbose_name_plural': 'Mail addresses'},
+ ),
+ migrations.AlterModelOptions(
+ name='mailbox',
+ options={'ordering': ['osuser', 'username'], 'verbose_name': 'Mailbox', 'verbose_name_plural': 'Mailboxes'},
+ ),
+ ]
From 8884b8b0427ba27e647529165a0826f069ce0c0a Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 13:58:54 +0100
Subject: [PATCH 04/22] add django-crispy-forms
- add django-crispy-forms to requirements
- add crispy_forms app to settings.base
- add CRISPY_TEMPLATE_PACK setting to settings.base
---
gnuviechadmin/gnuviechadmin/settings/base.py | 7 +++++++
requirements/base.txt | 1 +
2 files changed, 8 insertions(+)
diff --git a/gnuviechadmin/gnuviechadmin/settings/base.py b/gnuviechadmin/gnuviechadmin/settings/base.py
index 33f5b85..9612eea 100644
--- a/gnuviechadmin/gnuviechadmin/settings/base.py
+++ b/gnuviechadmin/gnuviechadmin/settings/base.py
@@ -220,6 +220,8 @@ DJANGO_APPS = (
# Admin panel and documentation:
'django.contrib.admin',
# 'django.contrib.admindocs',
+
+ 'crispy_forms',
)
# Apps specific for this project go here.
@@ -238,6 +240,11 @@ INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS
########## END APP CONFIGURATION
+########## CRISPY FORMS CONFIGURATION
+CRISPY_TEMPLATE_PACK = 'bootstrap3'
+########## END CRISPY_FORMS CONFIGURATION
+
+
########## LOGGING CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#logging
# A sample logging configuration. The only tangible logging
diff --git a/requirements/base.txt b/requirements/base.txt
index f5ce376..b1fa482 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -2,6 +2,7 @@ Django==1.7.3
bpython==0.13.1
django-braces==1.4.0
django-model-utils==2.2
+django-crispy-forms==1.4.0
logutils==0.3.3
psycopg2==2.5.4
passlib==1.6.2
From 8a29e4001c6ac666e6187a2c11a36130fd8a3020 Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 14:01:22 +0100
Subject: [PATCH 05/22] add dashboard app
- add new dashboard app providing dashboards for anonymous and logged in users
- cleanup gnuviechadmin.urls:
- import dashboard.urls and include dashboard_urls at URL root
- import authentication urls and include them below /auth
- remove generated commented code
---
gnuviechadmin/dashboard/__init__.py | 4 +++
.../dashboard/migrations/__init__.py | 0
gnuviechadmin/dashboard/models.py | 0
gnuviechadmin/dashboard/urls.py | 16 ++++++++++
gnuviechadmin/dashboard/views.py | 31 +++++++++++++++++++
gnuviechadmin/gnuviechadmin/settings/base.py | 1 +
gnuviechadmin/gnuviechadmin/urls.py | 28 +++++++----------
7 files changed, 64 insertions(+), 16 deletions(-)
create mode 100644 gnuviechadmin/dashboard/__init__.py
create mode 100644 gnuviechadmin/dashboard/migrations/__init__.py
create mode 100644 gnuviechadmin/dashboard/models.py
create mode 100644 gnuviechadmin/dashboard/urls.py
create mode 100644 gnuviechadmin/dashboard/views.py
diff --git a/gnuviechadmin/dashboard/__init__.py b/gnuviechadmin/dashboard/__init__.py
new file mode 100644
index 0000000..280cb6c
--- /dev/null
+++ b/gnuviechadmin/dashboard/__init__.py
@@ -0,0 +1,4 @@
+"""
+This app contains the customer dashboard implementation for gnuviechadmin.
+
+"""
diff --git a/gnuviechadmin/dashboard/migrations/__init__.py b/gnuviechadmin/dashboard/migrations/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/gnuviechadmin/dashboard/models.py b/gnuviechadmin/dashboard/models.py
new file mode 100644
index 0000000..e69de29
diff --git a/gnuviechadmin/dashboard/urls.py b/gnuviechadmin/dashboard/urls.py
new file mode 100644
index 0000000..f7172d8
--- /dev/null
+++ b/gnuviechadmin/dashboard/urls.py
@@ -0,0 +1,16 @@
+from __future__ import absolute_import, unicode_literals
+
+from django.conf.urls import patterns, url
+
+from .views import (
+ IndexView,
+ UserDashboardView,
+)
+
+
+urlpatterns = patterns(
+ '',
+ url(r'^$', IndexView.as_view(), name='dashboard'),
+ url(r'^user/(?P[\w0-9@.+-_]+)/$',
+ UserDashboardView.as_view(), name='customer_dashboard'),
+)
diff --git a/gnuviechadmin/dashboard/views.py b/gnuviechadmin/dashboard/views.py
new file mode 100644
index 0000000..aa1d7f4
--- /dev/null
+++ b/gnuviechadmin/dashboard/views.py
@@ -0,0 +1,31 @@
+"""
+This module defines the views for the gnuviechadmin customer dashboard.
+
+"""
+from __future__ import unicode_literals
+
+from django.views.generic import (
+ DetailView,
+ TemplateView,
+)
+from django.contrib.auth import get_user_model
+
+from braces.views import LoginRequiredMixin
+
+
+class IndexView(TemplateView):
+ """
+ This is the dashboard view.
+
+ """
+ template_name = 'dashboard/index.html'
+
+
+class UserDashboardView(DetailView, LoginRequiredMixin):
+ """
+ This is the user dashboard view.
+
+ """
+ model = get_user_model()
+ slug_field = 'username'
+ template_name = 'dashboard/user_dashboard.html'
diff --git a/gnuviechadmin/gnuviechadmin/settings/base.py b/gnuviechadmin/gnuviechadmin/settings/base.py
index 9612eea..bd6ab8e 100644
--- a/gnuviechadmin/gnuviechadmin/settings/base.py
+++ b/gnuviechadmin/gnuviechadmin/settings/base.py
@@ -226,6 +226,7 @@ DJANGO_APPS = (
# Apps specific for this project go here.
LOCAL_APPS = (
+ 'dashboard',
'taskresults',
'mysqltasks',
'pgsqltasks',
diff --git a/gnuviechadmin/gnuviechadmin/urls.py b/gnuviechadmin/gnuviechadmin/urls.py
index 1ae3acb..c00f384 100644
--- a/gnuviechadmin/gnuviechadmin/urls.py
+++ b/gnuviechadmin/gnuviechadmin/urls.py
@@ -1,23 +1,19 @@
-from django.conf.urls import patterns, include, url
-from django.conf.urls.static import static
-from django.conf import settings
-from django.views.generic import TemplateView
+from __future__ import absolute_import
+
+from django.conf.urls import patterns, include, url
+from django.conf import settings
+
+import dashboard.urls
+
+from django.contrib.auth import urls as auth_urls
-# Uncomment the next two lines to enable the admin:
from django.contrib import admin
admin.autodiscover()
-urlpatterns = patterns('',
- url(r'^$', TemplateView.as_view(template_name='base.html')),
-
- # Examples:
- # url(r'^$', 'gnuviechadmin.views.home', name='home'),
- # url(r'^gnuviechadmin/', include('gnuviechadmin.foo.urls')),
-
- # Uncomment the admin/doc line below to enable admin documentation:
- # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
-
- # Uncomment the next line to enable the admin:
+urlpatterns = patterns(
+ '',
+ url(r'', include(dashboard.urls)),
+ url(r'^auth/', include(auth_urls)),
url(r'^admin/', include(admin.site.urls)),
)
From 1deed46d34b9c70eb782e30add967b4be4b88466 Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 14:04:10 +0100
Subject: [PATCH 06/22] add templates for anonymous user dashboard and login
---
gnuviechadmin/templates/dashboard/index.html | 14 ++++++++++++++
gnuviechadmin/templates/registration/login.html | 12 ++++++++++++
2 files changed, 26 insertions(+)
create mode 100644 gnuviechadmin/templates/dashboard/index.html
create mode 100644 gnuviechadmin/templates/registration/login.html
diff --git a/gnuviechadmin/templates/dashboard/index.html b/gnuviechadmin/templates/dashboard/index.html
new file mode 100644
index 0000000..fb00db6
--- /dev/null
+++ b/gnuviechadmin/templates/dashboard/index.html
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{{ block.super }} - {% trans "Welcome" %}{% endblock title %}
+{% block page_title %}{% trans "Welcome to our customer self service" %}{% endblock page_title %}
+{% block content %}
+{% if user.is_authenticated %}
+{% url 'customer_dashboard' slug=user.username as dashboard_url %}{% blocktrans with full_name=user.get_full_name %}Hello {{ full_name }},
+You can visit your Dashboard to view and modify your hosting options.
+{% endblocktrans %}
+{% else %}
+{% trans "This is your entry to our customer self service sytem." %}
+{% url 'login' as login_url %}{% url 'dashboard' as dashboard_url %}{% blocktrans %}If you are already a customer you can Sign in to view and modify your hosting options.{% endblocktrans %}
+{% endif %}
+{% endblock content %}
diff --git a/gnuviechadmin/templates/registration/login.html b/gnuviechadmin/templates/registration/login.html
new file mode 100644
index 0000000..6f21196
--- /dev/null
+++ b/gnuviechadmin/templates/registration/login.html
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% load i18n crispy_forms_tags %}
+{% block title %}{{ block.super }} - {% trans "Sign in" %}{% endblock title %}
+{% block page_title %}{% trans "Sign In" %}{% endblock %}
+{% block content %}
+
+{% endblock %}
From 2bc278ae92b4f1de7ed2116a86a6b9ed46b0845a Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 15:42:47 +0100
Subject: [PATCH 07/22] implement login and logout
- add LogoutView to dashboard app
- define logout URL pattern
- only use login view from django.contrib.auth.views instead of including all
auth URLs
- change base template to support login/logout
- add template dashboard/user_dashboard.html
---
gnuviechadmin/dashboard/urls.py | 3 ++
gnuviechadmin/dashboard/views.py | 29 +++++++++++++++++--
gnuviechadmin/gnuviechadmin/urls.py | 4 +--
gnuviechadmin/templates/base.html | 16 +++++++---
.../templates/dashboard/user_dashboard.html | 12 ++++++++
5 files changed, 55 insertions(+), 9 deletions(-)
create mode 100644 gnuviechadmin/templates/dashboard/user_dashboard.html
diff --git a/gnuviechadmin/dashboard/urls.py b/gnuviechadmin/dashboard/urls.py
index f7172d8..58a103b 100644
--- a/gnuviechadmin/dashboard/urls.py
+++ b/gnuviechadmin/dashboard/urls.py
@@ -4,6 +4,7 @@ from django.conf.urls import patterns, url
from .views import (
IndexView,
+ LogoutView,
UserDashboardView,
)
@@ -13,4 +14,6 @@ urlpatterns = patterns(
url(r'^$', IndexView.as_view(), name='dashboard'),
url(r'^user/(?P[\w0-9@.+-_]+)/$',
UserDashboardView.as_view(), name='customer_dashboard'),
+ url(r'^logout/',
+ LogoutView.as_view(), name='logout'),
)
diff --git a/gnuviechadmin/dashboard/views.py b/gnuviechadmin/dashboard/views.py
index aa1d7f4..eec7df6 100644
--- a/gnuviechadmin/dashboard/views.py
+++ b/gnuviechadmin/dashboard/views.py
@@ -4,11 +4,14 @@ This module defines the views for the gnuviechadmin customer dashboard.
"""
from __future__ import unicode_literals
+from django.http import HttpResponseForbidden
from django.views.generic import (
DetailView,
TemplateView,
)
-from django.contrib.auth import get_user_model
+from django.views.generic.base import RedirectView
+from django.utils.translation import ugettext as _
+from django.contrib.auth import get_user_model, logout
from braces.views import LoginRequiredMixin
@@ -21,11 +24,33 @@ class IndexView(TemplateView):
template_name = 'dashboard/index.html'
-class UserDashboardView(DetailView, LoginRequiredMixin):
+class UserDashboardView(LoginRequiredMixin, DetailView):
"""
This is the user dashboard view.
"""
model = get_user_model()
+ context_object_name = 'dashboard_user'
slug_field = 'username'
template_name = 'dashboard/user_dashboard.html'
+
+ def dispatch(self, request, *args, **kwargs):
+ if (request.user.is_staff or request.user == self.get_object()):
+ return super(UserDashboardView, self).dispatch(
+ request, *args, **kwargs
+ )
+ return HttpResponseForbidden(
+ _('You are not allowed to view this page.')
+ )
+
+class LogoutView(RedirectView):
+ pattern_name = 'dashboard'
+
+ def get(self, *args, **kwargs):
+ logout(self.request)
+ return super(LogoutView, self).get(*args, **kwargs)
+
+ def get_redirect_url(self, *args, **kwargs):
+ if 'next' in self.request.GET:
+ return self.request.GET['next']
+ return super(LogoutView, self).get_redirect_url(*args, **kwargs)
diff --git a/gnuviechadmin/gnuviechadmin/urls.py b/gnuviechadmin/gnuviechadmin/urls.py
index c00f384..73b5f0d 100644
--- a/gnuviechadmin/gnuviechadmin/urls.py
+++ b/gnuviechadmin/gnuviechadmin/urls.py
@@ -5,15 +5,13 @@ from django.conf import settings
import dashboard.urls
-from django.contrib.auth import urls as auth_urls
-
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns(
'',
url(r'', include(dashboard.urls)),
- url(r'^auth/', include(auth_urls)),
+ url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'),
url(r'^admin/', include(admin.site.urls)),
)
diff --git a/gnuviechadmin/templates/base.html b/gnuviechadmin/templates/base.html
index 6d43ecb..dde360f 100644
--- a/gnuviechadmin/templates/base.html
+++ b/gnuviechadmin/templates/base.html
@@ -1,4 +1,4 @@
-{% load staticfiles %}
+{% load staticfiles i18n %}
@@ -32,21 +32,29 @@
-
diff --git a/gnuviechadmin/templates/dashboard/user_dashboard.html b/gnuviechadmin/templates/dashboard/user_dashboard.html
new file mode 100644
index 0000000..baff5f7
--- /dev/null
+++ b/gnuviechadmin/templates/dashboard/user_dashboard.html
@@ -0,0 +1,12 @@
+{% extends "base.html" %}
+{% load i18n %}
+{% block title %}{{ block.super }} - {% blocktrans with full_name=dashboard_user.get_full_name %}Dashboard for {{ full_name }}{% endblocktrans %}{% endblock title %}
+{% block page_title %}{% blocktrans with full_name=dashboard_user.get_full_name %}Dashboard for {{ full_name }}{% endblocktrans %}{% endblock page_title %}
+{% block content %}
+
Contract details
+
+ - Domains
+ - Email mailboxes
+ - Email addresses
+
+{% endblock content %}
From 9fa1944c3176039abbeaa8c0659875d284ca36ff Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 16:06:25 +0100
Subject: [PATCH 08/22] add german translation
- add django.po for apps and templates
- add locale directory to LOCALE_PATHS setting
---
.../dashboard/locale/de/LC_MESSAGES/django.po | 24 ++++++
.../domains/locale/de/LC_MESSAGES/django.po | 28 +++++++
gnuviechadmin/gnuviechadmin/settings/base.py | 5 ++
gnuviechadmin/locale/de/LC_MESSAGES/django.po | 75 +++++++++++++++++
.../locale/de/LC_MESSAGES/django.po | 26 +++---
.../osusers/locale/de/LC_MESSAGES/django.po | 80 +++++++++----------
.../locale/de/LC_MESSAGES/django.po | 48 +++++++++++
.../userdbs/locale/de/LC_MESSAGES/django.po | 68 ++++++++++++++++
8 files changed, 301 insertions(+), 53 deletions(-)
create mode 100644 gnuviechadmin/dashboard/locale/de/LC_MESSAGES/django.po
create mode 100644 gnuviechadmin/domains/locale/de/LC_MESSAGES/django.po
create mode 100644 gnuviechadmin/locale/de/LC_MESSAGES/django.po
create mode 100644 gnuviechadmin/taskresults/locale/de/LC_MESSAGES/django.po
create mode 100644 gnuviechadmin/userdbs/locale/de/LC_MESSAGES/django.po
diff --git a/gnuviechadmin/dashboard/locale/de/LC_MESSAGES/django.po b/gnuviechadmin/dashboard/locale/de/LC_MESSAGES/django.po
new file mode 100644
index 0000000..71d4e75
--- /dev/null
+++ b/gnuviechadmin/dashboard/locale/de/LC_MESSAGES/django.po
@@ -0,0 +1,24 @@
+# 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 , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnuviechadmin dashboard\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 15:59+0100\n"
+"PO-Revision-Date: 2015-01-17 16:01+0100\n"
+"Last-Translator: Jan Dittberner \n"
+"Language-Team: Jan Dittberner \n"
+"Language: de\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"
+"X-Generator: Poedit 1.6.10\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#: dashboard/views.py:43
+msgid "You are not allowed to view this page."
+msgstr "Sie haben nicht die nötigen Berechtigungen um diese Seite zu sehen."
diff --git a/gnuviechadmin/domains/locale/de/LC_MESSAGES/django.po b/gnuviechadmin/domains/locale/de/LC_MESSAGES/django.po
new file mode 100644
index 0000000..9f35245
--- /dev/null
+++ b/gnuviechadmin/domains/locale/de/LC_MESSAGES/django.po
@@ -0,0 +1,28 @@
+# 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 , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnuviechadmin domains\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 15:59+0100\n"
+"PO-Revision-Date: 2015-01-17 16:00+0100\n"
+"Last-Translator: Jan Dittberner \n"
+"Language-Team: Jan Dittberner \n"
+"Language: de\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"
+"X-Generator: Poedit 1.6.10\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#: domains/models.py:13
+msgid "Mail domain"
+msgstr "E-Maildomain"
+
+#: domains/models.py:14
+msgid "Mail domains"
+msgstr "E-Maildomains"
diff --git a/gnuviechadmin/gnuviechadmin/settings/base.py b/gnuviechadmin/gnuviechadmin/settings/base.py
index bd6ab8e..2fa3fdd 100644
--- a/gnuviechadmin/gnuviechadmin/settings/base.py
+++ b/gnuviechadmin/gnuviechadmin/settings/base.py
@@ -100,6 +100,11 @@ USE_TZ = True
########## END GENERAL CONFIGURATION
+LOCALE_PATHS = (
+ normpath(join(SITE_ROOT, 'locale')),
+)
+
+
########## MEDIA CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#media-root
MEDIA_ROOT = normpath(join(SITE_ROOT, 'media'))
diff --git a/gnuviechadmin/locale/de/LC_MESSAGES/django.po b/gnuviechadmin/locale/de/LC_MESSAGES/django.po
new file mode 100644
index 0000000..8891471
--- /dev/null
+++ b/gnuviechadmin/locale/de/LC_MESSAGES/django.po
@@ -0,0 +1,75 @@
+# 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 , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnuviechadmin\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 15:59+0100\n"
+"PO-Revision-Date: 2015-01-17 16:00+0100\n"
+"Last-Translator: Jan Dittberner \n"
+"Language-Team: Jan Dittberner \n"
+"Language: de\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"
+"X-Generator: Poedit 1.6.10\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#: templates/base.html:52
+msgid "My Profile"
+msgstr "Mein Profil"
+
+#: templates/base.html:53
+msgid "Logout"
+msgstr "Abmelden"
+
+#: templates/base.html:55 templates/registration/login.html:4
+msgid "Sign In"
+msgstr "Anmelden"
+
+#: templates/dashboard/index.html:3
+msgid "Welcome"
+msgstr "Willkommen"
+
+#: templates/dashboard/index.html:4
+msgid "Welcome to our customer self service"
+msgstr "Willkommen in unserem Selbstservice-System"
+
+#: templates/dashboard/index.html:7
+#, python-format
+msgid ""
+"Hello %(full_name)s,
\n"
+"You can visit your Dashboard to view and "
+"modify your hosting options.\n"
+msgstr ""
+"Hallo %(full_name)s,
\n"
+"Sie können Ihre Startseite besuchen, um "
+"Ihre Hostingeinstellungen anzusehen und zu bearbeiten.\n"
+
+#: templates/dashboard/index.html:11
+msgid "This is your entry to our customer self service sytem."
+msgstr "Dies ist Ihr Einstieg in unser Selbstservice-System"
+
+#: templates/dashboard/index.html:12
+#, python-format
+msgid ""
+"If you are already a customer you can Sign in to view and modify your hosting options."
+msgstr ""
+"Wenn Sie bereits Kunde bei uns sind, können Sie sich Anmelden um Ihre Hostingeinstellungen anzusehen "
+"und zu bearbeiten."
+
+#: templates/dashboard/user_dashboard.html:3
+#: templates/dashboard/user_dashboard.html:4
+#, python-format
+msgid "Dashboard for %(full_name)s"
+msgstr "Startseite für %(full_name)s"
+
+#: templates/registration/login.html:3 templates/registration/login.html:10
+msgid "Sign in"
+msgstr "Anmelden"
diff --git a/gnuviechadmin/managemails/locale/de/LC_MESSAGES/django.po b/gnuviechadmin/managemails/locale/de/LC_MESSAGES/django.po
index 442c816..d46f669 100644
--- a/gnuviechadmin/managemails/locale/de/LC_MESSAGES/django.po
+++ b/gnuviechadmin/managemails/locale/de/LC_MESSAGES/django.po
@@ -7,10 +7,10 @@ msgid ""
msgstr ""
"Project-Id-Version: managemails\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-27 22:45+0100\n"
-"PO-Revision-Date: 2014-12-27 22:57+0100\n"
+"POT-Creation-Date: 2015-01-17 15:59+0100\n"
+"PO-Revision-Date: 2015-01-17 16:00+0100\n"
"Last-Translator: Jan Dittberner \n"
-"Language-Team: de \n"
+"Language-Team: Jan Dittberner \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,42 +19,42 @@ msgstr ""
"X-Generator: Poedit 1.6.10\n"
"X-Poedit-SourceCharset: UTF-8\n"
-#: admin.py:14
+#: managemails/admin.py:14
msgid "Passwords don't match"
msgstr "Passwörter stimmen nicht überein"
-#: admin.py:21 tests/test_admin.py:37
+#: managemails/admin.py:21 managemails/tests/test_admin.py:37
msgid "Hash"
msgstr "Hash-Code"
-#: admin.py:44
+#: managemails/admin.py:44
msgid "Password"
msgstr "Passwort"
-#: admin.py:46
+#: managemails/admin.py:46
msgid "Password (again)"
msgstr "Passwortwiederholung"
-#: admin.py:100
+#: managemails/admin.py:100
msgid "Activate"
msgstr "Aktivieren"
-#: admin.py:101
+#: managemails/admin.py:101
msgid "Deactivate"
msgstr "Deaktivieren"
-#: models.py:51
+#: managemails/models.py:52
msgid "Mailbox"
msgstr "Postfach"
-#: models.py:52
+#: managemails/models.py:53
msgid "Mailboxes"
msgstr "Postfächer"
-#: models.py:76
+#: managemails/models.py:78
msgid "Mail address"
msgstr "E-Mailadresse"
-#: models.py:77
+#: managemails/models.py:79
msgid "Mail addresses"
msgstr "E-Mailadressen"
diff --git a/gnuviechadmin/osusers/locale/de/LC_MESSAGES/django.po b/gnuviechadmin/osusers/locale/de/LC_MESSAGES/django.po
index b6919a5..92ce06b 100644
--- a/gnuviechadmin/osusers/locale/de/LC_MESSAGES/django.po
+++ b/gnuviechadmin/osusers/locale/de/LC_MESSAGES/django.po
@@ -7,10 +7,10 @@ msgid ""
msgstr ""
"Project-Id-Version: osusers\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2014-12-27 22:46+0100\n"
-"PO-Revision-Date: 2014-12-27 22:54+0100\n"
+"POT-Creation-Date: 2015-01-17 15:59+0100\n"
+"PO-Revision-Date: 2015-01-17 16:00+0100\n"
"Last-Translator: Jan Dittberner \n"
-"Language-Team: de \n"
+"Language-Team: Jan Dittberner \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -19,128 +19,128 @@ msgstr ""
"X-Generator: Poedit 1.6.10\n"
"X-Poedit-SourceCharset: UTF-8\n"
-#: admin.py:16
+#: osusers/admin.py:16
msgid "Passwords don't match"
msgstr "Passwörter stimmen nicht überein"
-#: admin.py:47
+#: osusers/admin.py:47
msgid "Password"
msgstr "Passwort"
-#: admin.py:51
+#: osusers/admin.py:51
msgid "Password (again)"
msgstr "Passwortwiederholung"
-#: admin.py:160
+#: osusers/admin.py:160
msgid "Delete selected users"
msgstr "Ausgewählte Nutzer löschen"
-#: admin.py:201
+#: osusers/admin.py:201
msgid "Delete selected groups"
msgstr "Ausgewählte Gruppen löschen"
-#: apps.py:17
+#: osusers/apps.py:17
msgid "Operating System Users and Groups"
msgstr "Betriebssystemnutzer- und Gruppen"
-#: models.py:41
+#: osusers/models.py:43
msgid "You can not use a user's primary group."
msgstr "Sie können nicht die primäre Gruppe des Nutzers verwenden."
-#: models.py:71
+#: osusers/models.py:73
msgid "Group name"
msgstr "Gruppenname"
-#: models.py:73
+#: osusers/models.py:75
msgid "Group ID"
msgstr "Gruppen-ID"
-#: models.py:74
+#: osusers/models.py:76
msgid "Description"
msgstr "Beschreibung"
-#: models.py:76
+#: osusers/models.py:78
msgid "Group password"
msgstr "Gruppenpasswort"
-#: models.py:81 models.py:212
+#: osusers/models.py:83 osusers/models.py:217
msgid "Group"
msgstr "Gruppe"
-#: models.py:82
+#: osusers/models.py:84
msgid "Groups"
msgstr "Gruppen"
-#: models.py:209
+#: osusers/models.py:214
msgid "User name"
msgstr "Nutzername"
-#: models.py:211
+#: osusers/models.py:216
msgid "User ID"
msgstr "Nutzer-ID"
-#: models.py:213
+#: osusers/models.py:218
msgid "Gecos field"
msgstr "GECOS-Feld"
-#: models.py:214
+#: osusers/models.py:219
msgid "Home directory"
msgstr "Home-Verzeichnis"
-#: models.py:215
+#: osusers/models.py:220
msgid "Login shell"
msgstr "Loginshell"
-#: models.py:221 models.py:335
+#: osusers/models.py:226 osusers/models.py:351
msgid "User"
msgstr "Nutzer"
-#: models.py:222
+#: osusers/models.py:227
msgid "Users"
msgstr "Nutzer"
-#: models.py:336
+#: osusers/models.py:352
msgid "Encrypted password"
msgstr "Verschlüsseltes Passwort"
-#: models.py:338
+#: osusers/models.py:354
msgid "Date of last change"
msgstr "Datum der letzten Änderung"
-#: models.py:339
+#: osusers/models.py:355
msgid "This is expressed in days since Jan 1, 1970"
msgstr "Ausgedrückt als Tage seit dem 1. Januar 1970"
-#: models.py:342
+#: osusers/models.py:358
msgid "Minimum age"
msgstr "Minimales Alter"
-#: models.py:343
+#: osusers/models.py:359
msgid "Minimum number of days before the password can be changed"
msgstr "Minmale Anzahl von Tagen bevor das Passwort geändert werden kann"
-#: models.py:347
+#: osusers/models.py:363
msgid "Maximum age"
msgstr "Maximales Alter"
-#: models.py:348
+#: osusers/models.py:364
msgid "Maximum number of days after which the password has to be changed"
msgstr ""
"Maximale Anzahl von Tagen, nach denen das Passwort geändert werden muss"
-#: models.py:352
+#: osusers/models.py:368
msgid "Grace period"
msgstr "Duldungsperiode"
-#: models.py:353
+#: osusers/models.py:369
msgid "The number of days before the password is going to expire"
msgstr "Anzahl von Tagen nach denen das Passwort verfällt"
-#: models.py:357
+#: osusers/models.py:373
msgid "Inactivity period"
msgstr "Inaktivitätsperiode"
-#: models.py:358
+#: osusers/models.py:374
msgid ""
"The number of days after the password has expired during which the password "
"should still be accepted"
@@ -148,28 +148,28 @@ msgstr ""
"Die Anzahl von Tagen für die ein verfallenes Passwort noch akzeptiert werden "
"soll"
-#: models.py:362
+#: osusers/models.py:378
msgid "Account expiration date"
msgstr "Kontoverfallsdatum"
-#: models.py:363
+#: osusers/models.py:379
msgid ""
"The date of expiration of the account, expressed as number of days since Jan "
"1, 1970"
msgstr "Kontoverfallsdatum in Tagen seit dem 1. Januar 1970"
-#: models.py:370
+#: osusers/models.py:386
msgid "Shadow password"
msgstr "Shadow-Passwort"
-#: models.py:371
+#: osusers/models.py:387
msgid "Shadow passwords"
msgstr "Shadow-Passwörter"
-#: models.py:397
+#: osusers/models.py:413
msgid "Additional group"
msgstr "Weitere Gruppe"
-#: models.py:398
+#: osusers/models.py:414
msgid "Additional groups"
msgstr "Weitere Gruppen"
diff --git a/gnuviechadmin/taskresults/locale/de/LC_MESSAGES/django.po b/gnuviechadmin/taskresults/locale/de/LC_MESSAGES/django.po
new file mode 100644
index 0000000..fd37349
--- /dev/null
+++ b/gnuviechadmin/taskresults/locale/de/LC_MESSAGES/django.po
@@ -0,0 +1,48 @@
+# 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 , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnuviechadmin taskresults\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 15:59+0100\n"
+"PO-Revision-Date: 2015-01-17 16:00+0100\n"
+"Last-Translator: Jan Dittberner \n"
+"Language-Team: Jan Dittberner \n"
+"Language: de\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"
+"X-Generator: Poedit 1.6.10\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#: taskresults/models.py:22
+msgid "Task id"
+msgstr "Task-Id"
+
+#: taskresults/models.py:23
+msgid "Task name"
+msgstr "Taskname"
+
+#: taskresults/models.py:24 taskresults/models.py:31
+msgid "Task result"
+msgstr "Taskergebnis"
+
+#: taskresults/models.py:26
+msgid "Task state"
+msgstr "Taskstatus"
+
+#: taskresults/models.py:32
+msgid "Task results"
+msgstr "Taskergebnisse"
+
+#: taskresults/models.py:38
+msgid "yes"
+msgstr "ja"
+
+#: taskresults/models.py:38
+msgid "no"
+msgstr "nein"
diff --git a/gnuviechadmin/userdbs/locale/de/LC_MESSAGES/django.po b/gnuviechadmin/userdbs/locale/de/LC_MESSAGES/django.po
new file mode 100644
index 0000000..d203608
--- /dev/null
+++ b/gnuviechadmin/userdbs/locale/de/LC_MESSAGES/django.po
@@ -0,0 +1,68 @@
+# 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 , YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: gnuviechadmin userdbs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-01-17 15:59+0100\n"
+"PO-Revision-Date: 2015-01-17 16:00+0100\n"
+"Last-Translator: Jan Dittberner \n"
+"Language-Team: Jan Dittberner \n"
+"Language: de\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"
+"X-Generator: Poedit 1.6.10\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+
+#: userdbs/admin.py:158
+msgid "Delete selected database users"
+msgstr "Ausgewählte Datenbanknutzer löschen"
+
+#: userdbs/admin.py:258
+msgid "Delete selected user databases"
+msgstr "Ausgewählte Nutzerdatenbanken löschen"
+
+#: userdbs/apps.py:18
+msgid "Database Users and their Databases"
+msgstr "Datenbanknutzer und ihre Datenbanken"
+
+#: userdbs/models.py:32
+msgid "PostgreSQL"
+msgstr "PostgreSQL"
+
+#: userdbs/models.py:33
+msgid "MySQL"
+msgstr "MySQL"
+
+#: userdbs/models.py:106
+msgid "username"
+msgstr "Benutzername"
+
+#: userdbs/models.py:108
+msgid "database type"
+msgstr "Datenbanktyp"
+
+#: userdbs/models.py:114 userdbs/models.py:230
+msgid "database user"
+msgstr "Datenbanknutzer"
+
+#: userdbs/models.py:115
+msgid "database users"
+msgstr "Datenbanknutzer"
+
+#: userdbs/models.py:229
+msgid "database name"
+msgstr "Datenbankname"
+
+#: userdbs/models.py:236
+msgid "user database"
+msgstr "Nutzerdatenbank"
+
+#: userdbs/models.py:237
+msgid "user specific database"
+msgstr "nutzerspezifische Datenbank"
From 8cf6aab643e8d6d5807834aa40f53813c8f9be4a Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 16:12:38 +0100
Subject: [PATCH 09/22] add admin site link for staff in base template
---
gnuviechadmin/locale/de/LC_MESSAGES/django.po | 10 +++++++---
gnuviechadmin/templates/base.html | 1 +
2 files changed, 8 insertions(+), 3 deletions(-)
diff --git a/gnuviechadmin/locale/de/LC_MESSAGES/django.po b/gnuviechadmin/locale/de/LC_MESSAGES/django.po
index 8891471..3f6fbaf 100644
--- a/gnuviechadmin/locale/de/LC_MESSAGES/django.po
+++ b/gnuviechadmin/locale/de/LC_MESSAGES/django.po
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnuviechadmin\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2015-01-17 15:59+0100\n"
-"PO-Revision-Date: 2015-01-17 16:00+0100\n"
+"POT-Creation-Date: 2015-01-17 16:13+0100\n"
+"PO-Revision-Date: 2015-01-17 16:14+0100\n"
"Last-Translator: Jan Dittberner \n"
"Language-Team: Jan Dittberner \n"
"Language: de\n"
@@ -24,10 +24,14 @@ msgid "My Profile"
msgstr "Mein Profil"
#: templates/base.html:53
+msgid "Admin site"
+msgstr "Adminsite"
+
+#: templates/base.html:54
msgid "Logout"
msgstr "Abmelden"
-#: templates/base.html:55 templates/registration/login.html:4
+#: templates/base.html:56 templates/registration/login.html:4
msgid "Sign In"
msgstr "Anmelden"
diff --git a/gnuviechadmin/templates/base.html b/gnuviechadmin/templates/base.html
index dde360f..1193943 100644
--- a/gnuviechadmin/templates/base.html
+++ b/gnuviechadmin/templates/base.html
@@ -50,6 +50,7 @@
{% if user.is_authenticated %}
- {% trans "My Profile" %}
+ {% if user.is_staff %}- {% trans "Admin site" %}
{% endif %}
- {% trans "Logout" %}
{% else %}
- {% trans "Sign In" %}
From 0a097b09e2f49f00c0ff97c57dcd15ebd8e77705 Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 16:18:26 +0100
Subject: [PATCH 10/22] document login/logout/dashboard feature
---
docs/changelog.rst | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/changelog.rst b/docs/changelog.rst
index 93f1b8c..be4ae16 100644
--- a/docs/changelog.rst
+++ b/docs/changelog.rst
@@ -1,6 +1,7 @@
Changelog
=========
+* :feature:`-` add customer login/logout and dashboard templates
* :feature:`-` add admin list filtering and ordering for mail addresses and
mailboxes
From 1782c65bace74640c1eff81b5c51954aa58035f1 Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 16:19:26 +0100
Subject: [PATCH 11/22] add django-allauth and its dependencies to
requirements/base.txt
---
requirements/base.txt | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/requirements/base.txt b/requirements/base.txt
index b1fa482..4755e97 100644
--- a/requirements/base.txt
+++ b/requirements/base.txt
@@ -11,3 +11,8 @@ billiard==3.3.0.19
kombu==3.0.24
pytz==2014.10
pyaml==14.12.10
+django-allauth==0.19.0
+oauthlib==0.7.2
+python-openid==2.2.5
+requests==2.5.1
+requests-oauthlib==0.4.2
From 286c477efcd8a3640efbaf719da081436e02d036 Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 16:28:19 +0100
Subject: [PATCH 12/22] add allauth settings and URLs
---
gnuviechadmin/gnuviechadmin/settings/base.py | 25 +++++++++++++++++++-
gnuviechadmin/gnuviechadmin/urls.py | 2 +-
2 files changed, 25 insertions(+), 2 deletions(-)
diff --git a/gnuviechadmin/gnuviechadmin/settings/base.py b/gnuviechadmin/gnuviechadmin/settings/base.py
index 2fa3fdd..29ebe88 100644
--- a/gnuviechadmin/gnuviechadmin/settings/base.py
+++ b/gnuviechadmin/gnuviechadmin/settings/base.py
@@ -167,6 +167,9 @@ TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.tz',
'django.contrib.messages.context_processors.messages',
'django.core.context_processors.request',
+ # allauth specific context processors
+ 'allauth.account.context_processors.account',
+ 'allauth.socialaccount.context_processors.socialaccount',
)
# See: https://docs.djangoproject.com/en/dev/ref/settings/#template-loaders
@@ -198,6 +201,15 @@ MIDDLEWARE_CLASSES = (
########## END MIDDLEWARE CONFIGURATION
+AUTHENTICATION_BACKENDS = (
+ # Needed to login by username in Django admin, regardless of `allauth`
+ "django.contrib.auth.backends.ModelBackend",
+
+ # `allauth` specific authentication methods, such as login by e-mail
+ "allauth.account.auth_backends.AuthenticationBackend",
+)
+
+
########## URL CONFIGURATION
# See: https://docs.djangoproject.com/en/dev/ref/settings/#root-urlconf
ROOT_URLCONF = '%s.urls' % SITE_NAME
@@ -229,6 +241,17 @@ DJANGO_APPS = (
'crispy_forms',
)
+ALLAUTH_APPS = (
+ 'allauth',
+ 'allauth.account',
+ 'allauth.socialaccount',
+ 'allauth.socialaccount.providers.google',
+ 'allauth.socialaccount.providers.linkedin_oauth2',
+ 'allauth.socialaccount.providers.openid',
+ 'allauth.socialaccount.providers.twitter',
+ 'allauth.socialaccount.providers.xing',
+)
+
# Apps specific for this project go here.
LOCAL_APPS = (
'dashboard',
@@ -242,7 +265,7 @@ LOCAL_APPS = (
)
# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
-INSTALLED_APPS = DJANGO_APPS + LOCAL_APPS
+INSTALLED_APPS = DJANGO_APPS + ALLAUTH_APPS + LOCAL_APPS
########## END APP CONFIGURATION
diff --git a/gnuviechadmin/gnuviechadmin/urls.py b/gnuviechadmin/gnuviechadmin/urls.py
index 73b5f0d..c70d6c7 100644
--- a/gnuviechadmin/gnuviechadmin/urls.py
+++ b/gnuviechadmin/gnuviechadmin/urls.py
@@ -11,7 +11,7 @@ admin.autodiscover()
urlpatterns = patterns(
'',
url(r'', include(dashboard.urls)),
- url(r'^accounts/login/$', 'django.contrib.auth.views.login', name='login'),
+ url(r'^accounts/', include('allauth.urls')),
url(r'^admin/', include(admin.site.urls)),
)
From ab313a2a66e29e83ef921421be107ad9034fc787 Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 17:50:59 +0100
Subject: [PATCH 13/22] add allauth configuration and message tags
---
gnuviechadmin/gnuviechadmin/settings/base.py | 16 +++++++++++++++-
gnuviechadmin/templates/base.html | 12 ++++++++++--
gnuviechadmin/templates/dashboard/index.html | 2 +-
3 files changed, 26 insertions(+), 4 deletions(-)
diff --git a/gnuviechadmin/gnuviechadmin/settings/base.py b/gnuviechadmin/gnuviechadmin/settings/base.py
index 29ebe88..913c1cd 100644
--- a/gnuviechadmin/gnuviechadmin/settings/base.py
+++ b/gnuviechadmin/gnuviechadmin/settings/base.py
@@ -10,6 +10,7 @@ from sys import path
# Normally you should not import ANYTHING from Django directly
# into your settings, but ImproperlyConfigured is an exception.
from django.core.exceptions import ImproperlyConfigured
+from django.contrib.messages import constants as messages
def get_env_variable(var_name):
@@ -247,7 +248,6 @@ ALLAUTH_APPS = (
'allauth.socialaccount',
'allauth.socialaccount.providers.google',
'allauth.socialaccount.providers.linkedin_oauth2',
- 'allauth.socialaccount.providers.openid',
'allauth.socialaccount.providers.twitter',
'allauth.socialaccount.providers.xing',
)
@@ -266,9 +266,23 @@ LOCAL_APPS = (
# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
INSTALLED_APPS = DJANGO_APPS + ALLAUTH_APPS + LOCAL_APPS
+
+MESSAGE_TAGS = {
+ messages.DEBUG: '',
+ messages.ERROR: 'text-danger',
+ messages.INFO: 'text-info',
+ messages.SUCCESS: 'text-success',
+ messages.WARNING: 'text-warning',
+}
########## END APP CONFIGURATION
+########## ALLAUTH CONFIGURATION
+LOGIN_REDIRECT_URL = '/'
+SOCIALACCOUNT_QUERY_EMAIL = True
+########## END ALLAUTH CONFIGURATION
+
+
########## CRISPY FORMS CONFIGURATION
CRISPY_TEMPLATE_PACK = 'bootstrap3'
########## END CRISPY_FORMS CONFIGURATION
diff --git a/gnuviechadmin/templates/base.html b/gnuviechadmin/templates/base.html
index 1193943..0565c8e 100644
--- a/gnuviechadmin/templates/base.html
+++ b/gnuviechadmin/templates/base.html
@@ -51,9 +51,9 @@
{% if user.is_authenticated %}
- {% trans "My Profile" %}
{% if user.is_staff %}- {% trans "Admin site" %}
{% endif %}
- - {% trans "Logout" %}
+ - {% trans "Logout" %}
{% else %}
- - {% trans "Sign In" %}
+ - {% trans "Sign In" %}
{% endif %}
@@ -64,6 +64,14 @@
{% block page_title %}Example Base Template{% endblock page_title %}
+ {% if messages %}
+
+ {% for message in messages %}
+ - {{ message }}
+ {% endfor %}
+
+ {% endif %}
+
{% block content %}
Use this document as a way to quick start any new project.
{% endblock content %}
diff --git a/gnuviechadmin/templates/dashboard/index.html b/gnuviechadmin/templates/dashboard/index.html
index fb00db6..6b435eb 100644
--- a/gnuviechadmin/templates/dashboard/index.html
+++ b/gnuviechadmin/templates/dashboard/index.html
@@ -9,6 +9,6 @@ You can visit your Dashboard to view and modif
{% endblocktrans %}
{% else %}
{% trans "This is your entry to our customer self service sytem." %}
-{% url 'login' as login_url %}{% url 'dashboard' as dashboard_url %}{% blocktrans %}If you are already a customer you can Sign in to view and modify your hosting options.{% endblocktrans %}
+{% url 'account_login' as login_url %}{% url 'dashboard' as dashboard_url %}{% blocktrans %}If you are already a customer you can Sign in to view and modify your hosting options.{% endblocktrans %}
{% endif %}
{% endblock content %}
From 35016faba0f1f245b1e925d17d6a61e1f89a5175 Mon Sep 17 00:00:00 2001
From: Jan Dittberner
Date: Sat, 17 Jan 2015 21:41:32 +0100
Subject: [PATCH 14/22] add font-awesome css and fonts
---
gnuviechadmin/static/css/font-awesome.min.css | 4 +
gnuviechadmin/static/fonts/FontAwesome.otf | Bin 0 -> 85908 bytes
.../static/fonts/fontawesome-webfont.eot | Bin 0 -> 56006 bytes
.../static/fonts/fontawesome-webfont.svg | 520 ++++++++++++++++++
.../static/fonts/fontawesome-webfont.ttf | Bin 0 -> 112160 bytes
.../static/fonts/fontawesome-webfont.woff | Bin 0 -> 65452 bytes
6 files changed, 524 insertions(+)
create mode 100644 gnuviechadmin/static/css/font-awesome.min.css
create mode 100644 gnuviechadmin/static/fonts/FontAwesome.otf
create mode 100644 gnuviechadmin/static/fonts/fontawesome-webfont.eot
create mode 100644 gnuviechadmin/static/fonts/fontawesome-webfont.svg
create mode 100644 gnuviechadmin/static/fonts/fontawesome-webfont.ttf
create mode 100644 gnuviechadmin/static/fonts/fontawesome-webfont.woff
diff --git a/gnuviechadmin/static/css/font-awesome.min.css b/gnuviechadmin/static/css/font-awesome.min.css
new file mode 100644
index 0000000..ec53d4d
--- /dev/null
+++ b/gnuviechadmin/static/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}
\ No newline at end of file
diff --git a/gnuviechadmin/static/fonts/FontAwesome.otf b/gnuviechadmin/static/fonts/FontAwesome.otf
new file mode 100644
index 0000000000000000000000000000000000000000..81c9ad949b47f64afeca5642ee2494b6e3147f44
GIT binary patch
literal 85908
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