From 0d5a8c65e317d9921f9bccc962ef55c1ea93dacd Mon Sep 17 00:00:00 2001
From: Jens Kleineheismann
Date: Thu, 13 Dec 2018 14:47:58 +0100
Subject: [PATCH] Refactor: split code into several django apps (we call them
modules).
---
dav_auth/__init__.py | 1 +
dav_auth/apps.py | 12 ++
.../settings-dav_auth.py | 2 +
dav_auth/emails.py | 25 ++++
dav_events/forms/auth.py => dav_auth/forms.py | 0
dav_auth/module.json | 3 +
dav_auth/templates/dav_auth/base.html | 1 +
.../dav_auth}/emails/password_set.txt | 2 +-
.../templates/dav_auth/forms/login.html | 6 +-
.../dav_auth/forms/reset_password.html | 4 +-
.../dav_auth/forms/set_password.html | 4 +-
.../dav_auth}/includes/login_widget.html | 6 +-
dav_auth/urls.py | 10 ++
dav_events/views/auth.py => dav_auth/views.py | 40 ++++--
dav_base/__init__.py | 1 +
.../__init__.py => dav_base/admin.py | 0
dav_base/apps.py | 13 ++
dav_base/config/__init__.py | 2 +
dav_base/config/apps.py | 71 ++++++++++
dav_base/config/modules.py | 132 ++++++++++++++++++
dav_base/console_scripts/__init__.py | 0
.../console_scripts/admin.py | 44 +++---
.../additional_settings.py | 23 ++-
.../settings-dav_base.py | 6 +
.../django_project_config/urls.py | 12 ++
dav_base/emails.py | 59 ++++++++
dav_base/management/__init__.py | 0
dav_base/management/commands/__init__.py | 0
.../management/commands/disable_module.py | 18 +++
dav_base/management/commands/enable_module.py | 37 +++++
dav_base/management/commands/list_modules.py | 17 +++
dav_base/migrations/__init__.py | 0
dav_base/models/__init__.py | 0
.../static/dav_base}/bootstrap/config.json | 0
.../dav_base}/bootstrap/css/bootstrap.css | 0
.../dav_base}/bootstrap/css/bootstrap.min.css | 0
.../fonts/glyphicons-halflings-regular.eot | Bin
.../fonts/glyphicons-halflings-regular.svg | 0
.../fonts/glyphicons-halflings-regular.ttf | Bin
.../fonts/glyphicons-halflings-regular.woff | Bin
.../fonts/glyphicons-halflings-regular.woff2 | Bin
.../dav_base}/bootstrap/js/bootstrap.js | 0
.../dav_base}/bootstrap/js/bootstrap.min.js | 0
.../css/dataTables.bootstrap.min.css | 0
.../static/dav_base}/css/local.css | 0
.../static/dav_base}/img/brand.png | Bin
.../static/dav_base}/img/dav-favicon.ico | Bin
.../dav_base}/js/jquery.dataTables.min.js | 0
.../static/dav_base}/js/jquery.min.js | 0
{dav_events => dav_base}/templates/400.html | 2 +-
{dav_events => dav_base}/templates/403.html | 2 +-
{dav_events => dav_base}/templates/404.html | 2 +-
{dav_events => dav_base}/templates/500.html | 2 +-
dav_base/templates/dav_base/base.html | 72 ++++++++++
.../templates/dav_base}/error_base.html | 2 +-
dav_base/templates/dav_base/root.html | 27 ++++
dav_base/templates/project_name.html | 0
dav_base/templatetags/__init__.py | 0
dav_base/templatetags/dav_base.py | 53 +++++++
dav_base/urls.py | 9 ++
dav_base/views.py | 23 +++
dav_events/apps.py | 6 +-
dav_events/config.py | 67 ---------
.../Resources/django.main.urls.py | 7 -
.../settings-dav_events.py} | 3 -
dav_events/emails.py | 81 +----------
dav_events/forms/__init__.py | 1 -
dav_events/models/event.py | 2 +-
dav_events/models/oneclickaction.py | 2 +-
dav_events/module.json | 3 +
dav_events/templates/dav_events/base.html | 72 +---------
.../templates/dav_events/event_detail.html | 14 +-
.../templates/dav_events/event_list.html | 10 +-
.../dav_events/event_list_export_form.html | 8 +-
.../dav_events/event_update_form.html | 8 +-
dav_events/templates/dav_events/home.html | 4 +-
dav_events/urls.py | 20 ++-
dav_events/views/__init__.py | 1 -
dav_events/views/events.py | 9 +-
dav_events/workflow.py | 4 +-
setup.py | 4 +-
81 files changed, 739 insertions(+), 332 deletions(-)
create mode 100644 dav_auth/__init__.py
create mode 100644 dav_auth/apps.py
create mode 100644 dav_auth/django_project_config/settings-dav_auth.py
create mode 100644 dav_auth/emails.py
rename dav_events/forms/auth.py => dav_auth/forms.py (100%)
create mode 100644 dav_auth/module.json
create mode 100644 dav_auth/templates/dav_auth/base.html
rename {dav_events/templates/dav_events => dav_auth/templates/dav_auth}/emails/password_set.txt (59%)
rename dav_events/templates/dav_events/auth/login_form.html => dav_auth/templates/dav_auth/forms/login.html (79%)
rename dav_events/templates/dav_events/auth/reset_password_form.html => dav_auth/templates/dav_auth/forms/reset_password.html (89%)
rename dav_events/templates/dav_events/auth/set_password_form.html => dav_auth/templates/dav_auth/forms/set_password.html (89%)
rename {dav_events/templates/dav_events => dav_auth/templates/dav_auth}/includes/login_widget.html (67%)
create mode 100644 dav_auth/urls.py
rename dav_events/views/auth.py => dav_auth/views.py (66%)
create mode 100644 dav_base/__init__.py
rename dav_events/console_scripts/__init__.py => dav_base/admin.py (100%)
create mode 100644 dav_base/apps.py
create mode 100644 dav_base/config/__init__.py
create mode 100644 dav_base/config/apps.py
create mode 100644 dav_base/config/modules.py
create mode 100644 dav_base/console_scripts/__init__.py
rename {dav_events => dav_base}/console_scripts/admin.py (67%)
rename dav_events/console_scripts/Resources/django.main.additional_settings.py => dav_base/console_scripts/django_project_config/additional_settings.py (82%)
create mode 100644 dav_base/console_scripts/django_project_config/settings-dav_base.py
create mode 100644 dav_base/console_scripts/django_project_config/urls.py
create mode 100644 dav_base/emails.py
create mode 100644 dav_base/management/__init__.py
create mode 100644 dav_base/management/commands/__init__.py
create mode 100644 dav_base/management/commands/disable_module.py
create mode 100644 dav_base/management/commands/enable_module.py
create mode 100644 dav_base/management/commands/list_modules.py
create mode 100644 dav_base/migrations/__init__.py
create mode 100644 dav_base/models/__init__.py
rename {dav_events/static/dav_events => dav_base/static/dav_base}/bootstrap/config.json (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/bootstrap/css/bootstrap.css (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/bootstrap/css/bootstrap.min.css (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/bootstrap/fonts/glyphicons-halflings-regular.eot (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/bootstrap/fonts/glyphicons-halflings-regular.svg (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/bootstrap/fonts/glyphicons-halflings-regular.ttf (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/bootstrap/fonts/glyphicons-halflings-regular.woff (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/bootstrap/fonts/glyphicons-halflings-regular.woff2 (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/bootstrap/js/bootstrap.js (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/bootstrap/js/bootstrap.min.js (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/css/dataTables.bootstrap.min.css (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/css/local.css (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/img/brand.png (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/img/dav-favicon.ico (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/js/jquery.dataTables.min.js (100%)
rename {dav_events/static/dav_events => dav_base/static/dav_base}/js/jquery.min.js (100%)
rename {dav_events => dav_base}/templates/400.html (84%)
rename {dav_events => dav_base}/templates/403.html (84%)
rename {dav_events => dav_base}/templates/404.html (83%)
rename {dav_events => dav_base}/templates/500.html (84%)
create mode 100644 dav_base/templates/dav_base/base.html
rename {dav_events/templates => dav_base/templates/dav_base}/error_base.html (93%)
create mode 100644 dav_base/templates/dav_base/root.html
create mode 100644 dav_base/templates/project_name.html
create mode 100644 dav_base/templatetags/__init__.py
create mode 100644 dav_base/templatetags/dav_base.py
create mode 100644 dav_base/urls.py
create mode 100644 dav_base/views.py
delete mode 100644 dav_events/console_scripts/Resources/django.main.urls.py
rename dav_events/{console_scripts/Resources/django.main.settings-dav_events.py => django_project_config/settings-dav_events.py} (98%)
create mode 100644 dav_events/module.json
diff --git a/dav_auth/__init__.py b/dav_auth/__init__.py
new file mode 100644
index 0000000..77b977e
--- /dev/null
+++ b/dav_auth/__init__.py
@@ -0,0 +1 @@
+default_app_config = 'dav_auth.apps.AppConfig'
diff --git a/dav_auth/apps.py b/dav_auth/apps.py
new file mode 100644
index 0000000..5311b2b
--- /dev/null
+++ b/dav_auth/apps.py
@@ -0,0 +1,12 @@
+from dav_base.config.apps import AppConfig as _AppConfig, DefaultSetting
+
+DEFAULT_SETTINGS = (
+ DefaultSetting('login_redirect_url', 'root'),
+ DefaultSetting('logout_redirect_url', 'root'),
+)
+
+
+class AppConfig(_AppConfig):
+ name = 'dav_auth'
+ verbose_name = u'DAV Benutzerverwaltung'
+ default_settings = DEFAULT_SETTINGS
diff --git a/dav_auth/django_project_config/settings-dav_auth.py b/dav_auth/django_project_config/settings-dav_auth.py
new file mode 100644
index 0000000..99094ad
--- /dev/null
+++ b/dav_auth/django_project_config/settings-dav_auth.py
@@ -0,0 +1,2 @@
+# LOGIN_REDIRECT_URL = 'root'
+# LOGOUT_REDIRECT_URL = 'root'
diff --git a/dav_auth/emails.py b/dav_auth/emails.py
new file mode 100644
index 0000000..8448725
--- /dev/null
+++ b/dav_auth/emails.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+from dav_base.emails import AbstractMail
+
+
+class PasswordSetEmail(AbstractMail):
+ _subject = u'Zugangsdaten'
+ _template_name = 'dav_auth/emails/password_set.txt'
+
+ def __init__(self, user, password):
+ self._user = user
+ self._password = password
+
+ def _get_recipients(self):
+ r = u'{fullname} <{email}>'.format(fullname=self._user.get_full_name(),
+ email=self._user.email)
+ return [r]
+
+ def _get_context_data(self, extra_context=None):
+ context = super(PasswordSetEmail, self)._get_context_data(extra_context=extra_context)
+ context.update({
+ 'fullname': self._user.get_full_name(),
+ 'username': self._user.username,
+ 'password': self._password
+ })
+ return context
diff --git a/dav_events/forms/auth.py b/dav_auth/forms.py
similarity index 100%
rename from dav_events/forms/auth.py
rename to dav_auth/forms.py
diff --git a/dav_auth/module.json b/dav_auth/module.json
new file mode 100644
index 0000000..2f1e776
--- /dev/null
+++ b/dav_auth/module.json
@@ -0,0 +1,3 @@
+{
+ "url_prefix": "auth"
+}
\ No newline at end of file
diff --git a/dav_auth/templates/dav_auth/base.html b/dav_auth/templates/dav_auth/base.html
new file mode 100644
index 0000000..3da1e6b
--- /dev/null
+++ b/dav_auth/templates/dav_auth/base.html
@@ -0,0 +1 @@
+{% extends "dav_base/base.html" %}
\ No newline at end of file
diff --git a/dav_events/templates/dav_events/emails/password_set.txt b/dav_auth/templates/dav_auth/emails/password_set.txt
similarity index 59%
rename from dav_events/templates/dav_events/emails/password_set.txt
rename to dav_auth/templates/dav_auth/emails/password_set.txt
index ffbb183..e5b3335 100644
--- a/dav_events/templates/dav_events/emails/password_set.txt
+++ b/dav_auth/templates/dav_auth/emails/password_set.txt
@@ -3,4 +3,4 @@ Hallo {{ fullname }},
Benutzername: {{ username }}
Passwort: {{ password }}
-URL: {{ base_url }}{% url 'dav_events:home' %}
+URL: {{ base_url }}{% url 'root' %}
diff --git a/dav_events/templates/dav_events/auth/login_form.html b/dav_auth/templates/dav_auth/forms/login.html
similarity index 79%
rename from dav_events/templates/dav_events/auth/login_form.html
rename to dav_auth/templates/dav_auth/forms/login.html
index 248a462..1214928 100644
--- a/dav_events/templates/dav_events/auth/login_form.html
+++ b/dav_auth/templates/dav_auth/forms/login.html
@@ -1,4 +1,4 @@
-{% extends "dav_events/base.html" %}
+{% extends "dav_auth/base.html" %}
{% load bootstrap3 %}
{% load i18n %}
@@ -15,13 +15,13 @@
diff --git a/dav_events/templates/dav_events/event_list.html b/dav_events/templates/dav_events/event_list.html
index 370b9ef..6488127 100644
--- a/dav_events/templates/dav_events/event_list.html
+++ b/dav_events/templates/dav_events/event_list.html
@@ -6,18 +6,18 @@
@@ -45,11 +45,11 @@
- {{ event.get_number }}
+ {{ event.get_number }}
({{ event.get_sport_display }})
|
- {{ event.title }}
+ {{ event.title }}
|
{{ event.get_trainer_full_name }}
diff --git a/dav_events/templates/dav_events/event_list_export_form.html b/dav_events/templates/dav_events/event_list_export_form.html
index 969a164..fc22f4c 100644
--- a/dav_events/templates/dav_events/event_list_export_form.html
+++ b/dav_events/templates/dav_events/event_list_export_form.html
@@ -6,17 +6,17 @@
@@ -29,7 +29,7 @@
{% bootstrap_icon 'download-alt' %}
{% trans 'Herunterladen' %}
-
+
{% bootstrap_icon 'remove' %}
{% trans 'Abbrechen' %}
diff --git a/dav_events/templates/dav_events/event_update_form.html b/dav_events/templates/dav_events/event_update_form.html
index ebf2721..ac6c95b 100644
--- a/dav_events/templates/dav_events/event_update_form.html
+++ b/dav_events/templates/dav_events/event_update_form.html
@@ -8,13 +8,13 @@
@@ -50,7 +50,7 @@
{% bootstrap_icon 'hdd' %}
{% trans 'Speichern' %}
-
+
{% bootstrap_icon 'remove' %}
{% trans 'Abbrechen' %}
diff --git a/dav_events/templates/dav_events/home.html b/dav_events/templates/dav_events/home.html
index 61e9e15..61866f9 100644
--- a/dav_events/templates/dav_events/home.html
+++ b/dav_events/templates/dav_events/home.html
@@ -18,7 +18,7 @@
Du wirst dann per E-Mail auf dem laufenden gehalten.
- Los geht's!
+ Los geht's!
@@ -30,7 +30,7 @@
Tourenreferenten und Redakteure können hier Veranstaltungen freigeben und Programmlisten herunterladen.
- Weiter
+ Weiter
{% endblock page-container-fluid %}
diff --git a/dav_events/urls.py b/dav_events/urls.py
index 9a898b2..23977d9 100644
--- a/dav_events/urls.py
+++ b/dav_events/urls.py
@@ -3,18 +3,14 @@ from django.conf.urls import url
from . import views
urlpatterns = [
- url(r'^$', views.base.HomeView.as_view(), name='home'),
- url(r'^user/login$', views.auth.LoginView.as_view(), name='login'),
- url(r'^user/logout$', views.auth.LogoutView.as_view(), name='logout'),
- url(r'^user/password$', views.auth.SetPasswordView.as_view(), name='set_password'),
- url(r'^user/password/reset$', views.auth.ResetPasswordView.as_view(), name='reset_password'),
- url(r'^events$', views.events.EventListView.as_view(), name='event_list'),
- url(r'^events/export$', views.events.EventListExportView.as_view(), name='event_list_export'),
- url(r'^events/create$', views.events.EventCreateView.as_view(), name='event_create'),
- url(r'^events/(?P\d+)/confirm/(?P[a-z0-9][a-z0-9]*)',
- views.events.EventConfirmStatusView.as_view(), name='event_confirmstatus'),
- url(r'^events/(?P\d+)/edit', views.events.EventUpdateView.as_view(), name='event_update'),
- url(r'^events/(?P\d+)/', views.events.EventDetailView.as_view(), name='event_detail'),
+ url(r'^home$', views.base.HomeView.as_view(), name='root'),
+ url(r'^$', views.events.EventListView.as_view(), name='list'),
+ url(r'^export$', views.events.EventListExportView.as_view(), name='list_export'),
+ url(r'^create$', views.events.EventCreateView.as_view(), name='create'),
+ url(r'^(?P\d+)/confirm/(?P[a-z0-9][a-z0-9]*)',
+ views.events.EventConfirmStatusView.as_view(), name='confirmstatus'),
+ url(r'^(?P\d+)/edit', views.events.EventUpdateView.as_view(), name='update'),
+ url(r'^(?P\d+)/', views.events.EventDetailView.as_view(), name='detail'),
url(r'^action/(?P[a-fA-F0-9]{8}-([a-fA-F0-9]{4}-){3}[a-fA-F0-9]{12})/',
views.actions.OneClickActionRunView.as_view(), name='action_run'),
]
diff --git a/dav_events/views/__init__.py b/dav_events/views/__init__.py
index 7454378..52f8853 100644
--- a/dav_events/views/__init__.py
+++ b/dav_events/views/__init__.py
@@ -1,4 +1,3 @@
from . import base
-from . import auth
from . import events
from . import actions
diff --git a/dav_events/views/events.py b/dav_events/views/events.py
index 5f4d837..c6dd876 100644
--- a/dav_events/views/events.py
+++ b/dav_events/views/events.py
@@ -20,7 +20,6 @@ from .. import models
from ..utils import has_role
from ..workflow import workflow
-app_config = apps.get_containing_app_config(__package__)
logger = logging.getLogger(__name__)
@@ -259,7 +258,7 @@ class EventCreateView(EventPermissionMixin, generic.FormView):
form_class = forms.events.EventCreateForm
template_dir = os.path.join('dav_events', 'event_create')
default_template_name = 'default.html'
- abort_url = reverse_lazy('dav_events:home')
+ abort_url = reverse_lazy('dav_events:root')
def get_template_names(self):
form = self.get_form()
@@ -317,7 +316,7 @@ class EventCreateView(EventPermissionMixin, generic.FormView):
owner = event.owner
self.clean_session_data()
if self.request.user.is_authenticated:
- next_url = reverse('dav_events:event_list')
+ next_url = reverse('dav_events:list')
if self.request.user != event.owner:
messages.warning(self.request,
u'%s %s' % (
@@ -325,10 +324,10 @@ class EventCreateView(EventPermissionMixin, generic.FormView):
_(u'Warum machst du sowas?')
))
elif owner.has_usable_password():
- next_url = reverse('dav_events:event_list')
+ next_url = reverse('dav_events:list')
else:
login(self.request, owner)
- next_url = reverse('dav_events:set_password')
+ next_url = reverse('dav_auth:set_password')
messages.success(self.request,
_(u'Neuen Benutzer angemeldet: %(username)s') % {'username': owner.username})
messages.warning(self.request, _(u'Bitte neues Passwort setzen!'))
diff --git a/dav_events/workflow.py b/dav_events/workflow.py
index d62f003..750a5c8 100644
--- a/dav_events/workflow.py
+++ b/dav_events/workflow.py
@@ -4,6 +4,7 @@ from django.apps import apps
from django.utils import timezone
from . import emails
+from .utils import get_users_by_role
logger = logging.getLogger(__name__)
@@ -143,7 +144,6 @@ class BasicWorkflow(object):
recipients = [event.owner]
if event.is_flagged('submitted'):
# If the event is already submitted, add managers to the recipients.
- from .utils import get_users_by_role
recipients += get_users_by_role('manage_all')
recipients += get_users_by_role('manage_{}'.format(event.sport.lower()))
if event.is_flagged('accepted'):
@@ -174,7 +174,6 @@ class BasicWorkflow(object):
# Inform managers that they have to accept the event.
# Also create OneClickActions for all of them and add the link to the mail,
# so they can accept the event with a click into the mail.
- from .utils import get_users_by_role
recipients = get_users_by_role('manage_all')
recipients += get_users_by_role('manage_{}'.format(event.sport.lower()))
OneClickAction = app_config.get_model('OneClickAction')
@@ -195,7 +194,6 @@ class BasicWorkflow(object):
# Inform publishers that they have to publish the event.
# Also create OneClickActions for all of them and add the link to the mail,
# so they can confirm the publication with a click into the mail.
- from .utils import get_users_by_role
recipients = get_users_by_role('publish_incremental')
OneClickAction = app_config.get_model('OneClickAction')
for recipient in recipients:
diff --git a/setup.py b/setup.py
index 1aafd6d..e116f2b 100644
--- a/setup.py
+++ b/setup.py
@@ -45,7 +45,7 @@ if sys.version_info.major != 2:
setup(
name='django-dav-events',
- version='0.2',
+ version='1.0',
description='A django based web application project to submit DAV Events.',
url='https://www.heinzelwelt.de',
maintainer='Jens Kleineheismann',
@@ -57,7 +57,7 @@ setup(
include_package_data=True,
entry_points={
'console_scripts': [
- 'django-dav-events-admin = dav_events.console_scripts.admin:main',
+ 'django-dav-admin = dav_base.console_scripts.admin:main',
],
},
install_requires=[
|