--- /dev/null
+{% 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 %}
--- /dev/null
+{% 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 %}
--- /dev/null
+# 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'),
+]
--- /dev/null
+# 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()
'gadjo',
'earwig.sounds',
'earwig.users',
+ 'earwig.manager',
]
MIDDLEWARE = [
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))),
]
--- /dev/null
+# 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
--- /dev/null
+# 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')