misc: edit programs in site
This commit is contained in:
parent
972b574299
commit
affe4cee02
|
@ -2,6 +2,18 @@
|
|||
{% comment %}Detail page of a show{% endcomment %}
|
||||
{% load i18n aircox %}
|
||||
|
||||
{% block top-nav-tools %}
|
||||
{% has_perm page page.change_permission_codename simple=True as can_edit %}
|
||||
{% if can_edit %}
|
||||
<a class="navbar-item" href="{% url 'program-edit' page.pk %}" target="_self">
|
||||
<span class="icon is-small">
|
||||
<i class="fa fa-pen"></i>
|
||||
</span>
|
||||
<span>{% translate "Edit" %}</span>
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block content-container %}
|
||||
{% with schedules=program.schedule_set.all %}
|
||||
{% if schedules %}
|
||||
|
|
23
aircox/templates/aircox/program_form.html
Normal file
23
aircox/templates/aircox/program_form.html
Normal file
|
@ -0,0 +1,23 @@
|
|||
{% extends "aircox/basepage_detail.html" %}
|
||||
{% load static i18n humanize honeypot aircox %}
|
||||
|
||||
|
||||
{% block top-nav-tools %}
|
||||
<a class="navbar-item" href="{% url 'program-detail' object.slug %}" target="_self">
|
||||
<span class="icon is-small">
|
||||
<i class="fa fa-eye"></i>
|
||||
</span>
|
||||
<span>{% translate "View" %}</span>
|
||||
</a>
|
||||
{% endblock %}
|
||||
|
||||
{% block main %}
|
||||
<form method="post" enctype="multipart/form-data">{% csrf_token %}
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
{% render_honeypot_field "website" %}
|
||||
</table>
|
||||
<br/>
|
||||
<input type="submit" value="Update" class="button is-success">
|
||||
</form>
|
||||
{% endblock %}
|
|
@ -1,5 +1,6 @@
|
|||
import pytest
|
||||
from django.contrib.auth.models import User, Group
|
||||
from django.urls import reverse
|
||||
|
||||
|
||||
@pytest.mark.django_db()
|
||||
|
@ -23,3 +24,13 @@ def test_group_can_change_program(user, client, program):
|
|||
user = User.objects.get(pk=user.pk) # reload user in order to have permissions set
|
||||
assert program.editors in user.groups.all()
|
||||
assert user.has_perm("aircox.%s" % program.change_permission_codename)
|
||||
|
||||
|
||||
@pytest.mark.django_db()
|
||||
def test_group_change_program(user, client, program):
|
||||
client.force_login(user)
|
||||
response = client.get(reverse("program-edit", kwargs={"pk": program.pk}))
|
||||
assert response.status_code == 403
|
||||
user.groups.add(program.editors)
|
||||
response = client.get(reverse("program-edit", kwargs={"pk": program.pk}))
|
||||
assert response.status_code == 200
|
||||
|
|
17
aircox/tests/test_program.py
Normal file
17
aircox/tests/test_program.py
Normal file
|
@ -0,0 +1,17 @@
|
|||
import pytest
|
||||
from django.urls import reverse
|
||||
|
||||
|
||||
@pytest.mark.django_db()
|
||||
def test_edit_program(user, client, program):
|
||||
client.force_login(user)
|
||||
response = client.get(reverse("program-detail", kwargs={"slug": program.slug}))
|
||||
assert response.status_code == 200
|
||||
assert "🖉 ".encode() not in response.content
|
||||
user.groups.add(program.editors)
|
||||
response = client.get(reverse("program-detail", kwargs={"slug": program.slug}))
|
||||
assert "🖉 ".encode() in response.content
|
||||
assert b"foobar" not in response.content
|
||||
response = client.post(reverse("program-edit", kwargs={"pk": program.pk}), {"content": "foobar"})
|
||||
response = client.get(reverse("program-detail", kwargs={"slug": program.slug}))
|
||||
assert b"foobar" in response.content
|
|
@ -109,6 +109,11 @@ urls = [
|
|||
path(_("programs/<slug:parent_slug>/podcasts/"), views.PodcastListView.as_view(), name="podcast-list"),
|
||||
path(_("programs/<slug:parent_slug>/episodes/"), views.EpisodeListView.as_view(), name="episode-list"),
|
||||
path(_("programs/<slug:parent_slug>/diffusions/"), views.DiffusionListView.as_view(), name="diffusion-list"),
|
||||
path(
|
||||
_("program/<pk>/edit/"),
|
||||
views.ProgramUpdateView.as_view(),
|
||||
name="program-edit",
|
||||
),
|
||||
path(
|
||||
"errors/no-station",
|
||||
views.errors.NoStationErrorView.as_view(),
|
||||
|
|
|
@ -16,6 +16,7 @@ from .program import (
|
|||
ProgramListView,
|
||||
ProgramPageDetailView,
|
||||
ProgramPageListView,
|
||||
ProgramUpdateView,
|
||||
)
|
||||
|
||||
__all__ = (
|
||||
|
@ -41,6 +42,7 @@ __all__ = (
|
|||
"ProgramListView",
|
||||
"ProgramPageDetailView",
|
||||
"ProgramPageListView",
|
||||
"ProgramUpdateView",
|
||||
"attached",
|
||||
)
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
from django.http import Http404, HttpResponse
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.views.generic import DetailView, ListView
|
||||
from django.views.generic.edit import UpdateView
|
||||
from django.urls import reverse
|
||||
from honeypot.decorators import check_honeypot
|
||||
|
||||
|
@ -196,3 +197,10 @@ class PageDetailView(BasePageDetailView):
|
|||
comment.page = self.object
|
||||
comment.save()
|
||||
return self.get(request, *args, **kwargs)
|
||||
|
||||
|
||||
class PageUpdateView(BaseView, UpdateView):
|
||||
context_object_name = "page"
|
||||
|
||||
def get_page(self):
|
||||
return self.object
|
||||
|
|
|
@ -49,6 +49,24 @@ class ProgramDetailView(BaseProgramMixin, PageDetailView):
|
|||
**kwargs,
|
||||
)
|
||||
|
||||
def get_template_names(self):
|
||||
return super().get_template_names() + ["aircox/program_detail.html"]
|
||||
|
||||
|
||||
class ProgramUpdateView(UserPassesTestMixin, BaseProgramMixin, PageUpdateView):
|
||||
model = Program
|
||||
fields = ["content"]
|
||||
|
||||
def get_sidebar_queryset(self):
|
||||
return super().get_sidebar_queryset().filter(parent=self.program)
|
||||
|
||||
def test_func(self):
|
||||
program = self.get_object()
|
||||
return self.request.user.has_perm("aircox.%s" % program.change_permission_codename)
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse("program-detail", kwargs={"slug": self.get_object().slug})
|
||||
|
||||
|
||||
class ProgramListView(PageListView):
|
||||
model = Program
|
||||
|
|
Loading…
Reference in New Issue
Block a user