]> git.0d.be Git - earwig.git/commitdiff
start management interface
authorFrédéric Péters <fpeters@0d.be>
Sat, 1 Sep 2018 12:39:00 +0000 (14:39 +0200)
committerFrédéric Péters <fpeters@0d.be>
Sat, 1 Sep 2018 17:22:48 +0000 (19:22 +0200)
earwig/manager/__init__.py [new file with mode: 0644]
earwig/manager/templates/earwig/manager_channel_add.html [new file with mode: 0644]
earwig/manager/templates/earwig/manager_home.html [new file with mode: 0644]
earwig/manager/urls.py [new file with mode: 0644]
earwig/manager/views.py [new file with mode: 0644]
earwig/settings.py
earwig/urls.py
earwig/urls_utils.py [new file with mode: 0644]
earwig/views.py [new file with mode: 0644]

diff --git a/earwig/manager/__init__.py b/earwig/manager/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/earwig/manager/templates/earwig/manager_channel_add.html b/earwig/manager/templates/earwig/manager_channel_add.html
new file mode 100644 (file)
index 0000000..3d590c1
--- /dev/null
@@ -0,0 +1,17 @@
+{% extends "earwig/manager_home.html" %}
+{% load i18n %}
+
+{% block appbar %}
+<h2>{% trans "New Channel" %}</h2>
+{% endblock %}
+
+{% block content %}
+<form method="post" enctype="multipart/form-data">
+{% csrf_token %}
+{{ form.as_p }}
+<div class="buttons">
+<button class="submit-button">{% trans "Add" %}</button>
+<a class="cancel" href="{% url 'earwig-manager-homepage' %}">{% trans "Cancel" %}</a>
+</div>
+</form>
+{% endblock %}
diff --git a/earwig/manager/templates/earwig/manager_home.html b/earwig/manager/templates/earwig/manager_home.html
new file mode 100644 (file)
index 0000000..c9e69c4
--- /dev/null
@@ -0,0 +1,32 @@
+{% extends "base.html" %}
+{% load i18n %}
+
+{% block appbar %}
+<h2>Earwig</h2>
+<span class="actions">
+<a rel="popup" href="{% url 'earwig-channel-add' %}">{% trans "Add Channel" %}</a>
+</span>
+{% endblock %}
+
+{% block content %}
+
+<table class="main">
+<thead>
+  <tr>
+    <th>{% trans "Title" %}</th>
+    <th>{% trans "Date" %}</th>
+  </tr>
+</thead>
+<tbody>
+ {% for channel in object_list %}
+ <tr>
+   <td><a href="{{ channel.channel_url }}">{{ channel.title }}</a></td>
+   <td>{{ channel.creation_timestamp }}</td>
+ </tr>
+ {% endfor %}
+</tbody>
+</table>
+
+{% include "gadjo/pagination.html" %}
+
+{% endblock %}
diff --git a/earwig/manager/urls.py b/earwig/manager/urls.py
new file mode 100644 (file)
index 0000000..392f542
--- /dev/null
@@ -0,0 +1,24 @@
+# earwig
+# Copyright (C) 2018  Frederic Peters
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Affero General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from django.conf.urls import url
+
+from . import views
+
+urlpatterns = [
+    url(r'^$', views.homepage, name='earwig-manager-homepage'),
+    url(r'^channel/add/$', views.channel_add, name='earwig-channel-add'),
+]
diff --git a/earwig/manager/views.py b/earwig/manager/views.py
new file mode 100644 (file)
index 0000000..037a3dd
--- /dev/null
@@ -0,0 +1,37 @@
+# earwig
+# Copyright (C) 2018  Frederic Peters
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Affero General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from django.core.urlresolvers import reverse_lazy
+from django.views.generic import ListView, CreateView
+
+from ..sounds.models import Channel
+
+
+class Homepage(ListView):
+    model = Channel
+    paginate_by = 10
+    template_name = 'earwig/manager_home.html'
+
+homepage = Homepage.as_view()
+
+
+class ChannelAdd(CreateView):
+    model = Channel
+    fields = ('title', 'channel_url', 'feed_url')
+    template_name = 'earwig/manager_channel_add.html'
+    success_url = reverse_lazy('earwig-manager-homepage')
+
+channel_add = ChannelAdd.as_view()
index 4aec505bb16adc556cc1ff17bdd1665dbf320780..0d77b998012f75f920da01a84ab920040ef86a9d 100644 (file)
@@ -40,6 +40,7 @@ INSTALLED_APPS = [
     'gadjo',
     'earwig.sounds',
     'earwig.users',
+    'earwig.manager',
 ]
 
 MIDDLEWARE = [
index 916998f70b1b1d5bc61b20022a3741b91c3e7b3e..dbf91600285547a240f21d2d5a0835e66e997e6b 100644 (file)
@@ -3,7 +3,14 @@
 from django.conf.urls import url, include
 from django.contrib import admin
 
+from .urls_utils import decorated_includes, manager_required
+from .manager.urls import urlpatterns as manager_urls
+
+from . import views
+
 urlpatterns = [
+    url(r'^$', views.redirect_to_manager),
     url(r'^admin/', admin.site.urls),
     url(r'^accounts/', include('registration.backends.default.urls')),
+    url(r'^manage/', decorated_includes(manager_required, include(manager_urls))),
 ]
diff --git a/earwig/urls_utils.py b/earwig/urls_utils.py
new file mode 100644 (file)
index 0000000..3c52729
--- /dev/null
@@ -0,0 +1,64 @@
+# earwig
+# Copyright (C) 2018  Frederic Peters
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Affero General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+# Decorating URL includes, <https://djangosnippets.org/snippets/2532/>
+
+from django.contrib.auth.decorators import user_passes_test
+from django.core.exceptions import PermissionDenied
+from django.core.urlresolvers import RegexURLPattern, RegexURLResolver
+
+
+class DecoratedURLPattern(RegexURLPattern):
+    def resolve(self, *args, **kwargs):
+        result = super(DecoratedURLPattern, self).resolve(*args, **kwargs)
+        if result:
+            result.func = self._decorate_with(result.func)
+        return result
+
+class DecoratedRegexURLResolver(RegexURLResolver):
+    def resolve(self, *args, **kwargs):
+        result = super(DecoratedRegexURLResolver, self).resolve(*args, **kwargs)
+        if result:
+            result.func = self._decorate_with(result.func)
+        return result
+
+def decorated_includes(func, includes, *args, **kwargs):
+    urlconf_module, app_name, namespace = includes
+
+    for item in urlconf_module:
+        if isinstance(item, RegexURLPattern):
+            item.__class__ = DecoratedURLPattern
+            item._decorate_with = func
+
+        elif isinstance(item, RegexURLResolver):
+            item.__class__ = DecoratedRegexURLResolver
+            item._decorate_with = func
+
+    return urlconf_module, app_name, namespace
+
+def manager_required(function=None, login_url=None):
+    def check_manager(user):
+        if user and user.is_staff:
+            return True
+        if user and not user.is_anonymous():
+            raise PermissionDenied()
+            raise PermissionDenied()
+        # As the last resort, show the login form
+        return False
+    actual_decorator = user_passes_test(check_manager, login_url=login_url)
+    if function:
+        return actual_decorator(function)
+    return actual_decorator
diff --git a/earwig/views.py b/earwig/views.py
new file mode 100644 (file)
index 0000000..9efdc39
--- /dev/null
@@ -0,0 +1,21 @@
+# earwig
+# Copyright (C) 2018  Frederic Peters
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU Affero General Public License as published
+# by the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from django.shortcuts import redirect
+
+
+def redirect_to_manager(request):
+    return redirect('earwig-manager-homepage')