2 # Copyright (C) 2018 Frederic Peters
4 # This program is free software: you can redistribute it and/or modify it
5 # under the terms of the GNU Affero General Public License as published
6 # by the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 from django.core.urlresolvers import reverse_lazy
18 from django.contrib import messages
19 from django.db.models import Q
20 from django.shortcuts import redirect
21 from django.utils.translation import ugettext_lazy as _
22 from django.views.generic import ListView, CreateView, DetailView, UpdateView, DeleteView
24 from ..sounds.models import Channel, Sound, STATUSES
27 class Homepage(ListView):
30 template_name = 'earwig/manager_home.html'
32 def get_queryset(self, **kwargs):
33 qs = self.model.objects.select_related()
34 if self.get_status_filter() != '_all':
35 qs = qs.filter(status=self.get_status_filter())
36 query = self.get_query_filter()
38 qs = qs.filter(Q(title__icontains=query) |
39 Q(channel__title__icontains=query))
42 def get_query_filter(self):
43 return self.request.GET.get('q') or ''
45 def get_status_filter(self):
46 return self.request.GET.get('q_status') or ''
48 def get_context_data(self, **kwargs):
49 context = super(Homepage, self).get_context_data(**kwargs)
50 context['statuses'] = STATUSES
51 context['next'] = reverse_lazy('earwig-manager-homepage')
54 homepage = Homepage.as_view()
57 class Channels(ListView):
60 template_name = 'earwig/manager_channels.html'
62 channels = Channels.as_view()
65 class ChannelDetailView(DetailView):
67 template_name = 'earwig/manager_channel.html'
69 def get_sounds_queryset(self, **kwargs):
70 qs = self.get_object().sound_set.select_related()
71 if self.get_status_filter() != '_all':
72 qs = qs.filter(status=self.get_status_filter())
73 query = self.get_query_filter()
75 qs = qs.filter(Q(title__icontains=query) |
76 Q(description__icontains=query))
79 def get_query_filter(self):
80 return self.request.GET.get('q') or ''
82 def get_status_filter(self):
83 return self.request.GET.get('q_status') or '_all'
85 def get_context_data(self, **kwargs):
86 context = super(ChannelDetailView, self).get_context_data()
87 context['object_list'] = self.get_sounds_queryset()
88 context['next'] = reverse_lazy('earwig-channel-detail', kwargs={'pk': self.get_object().pk})
89 context['statuses'] = STATUSES
92 channel_detail = ChannelDetailView.as_view()
95 class ChannelAdd(CreateView):
97 fields = ('title', 'channel_url', 'feed_url', 'policy')
98 template_name = 'earwig/manager_channel_add.html'
99 success_url = reverse_lazy('earwig-channels')
101 channel_add = ChannelAdd.as_view()
104 class ChannelEdit(UpdateView):
106 fields = ('title', 'channel_url', 'feed_url', 'policy')
107 template_name = 'earwig/manager_channel_edit.html'
109 def get_success_url(self):
110 return reverse_lazy('earwig-channel', kwargs={'pk': self.get_object().pk})
112 channel_edit = ChannelEdit.as_view()
114 class ChannelDeleteView(DeleteView):
116 template_name = 'earwig/manager_channel_confirm_delete.html'
117 success_url = reverse_lazy('earwig-channels')
119 channel_delete = ChannelDeleteView.as_view()
122 class SoundDetailView(DetailView):
124 template_name = 'earwig/manager_sound.html'
126 sound_detail = SoundDetailView.as_view()
129 class SoundActionView(DetailView):
132 def get_success_url(self):
133 if self.request.GET.get('next'):
134 return self.request.GET.get('next')
135 return reverse_lazy('earwig-sound-detail', kwargs={'pk': self.get_object().pk})
138 class SoundPublishView(SoundActionView):
139 def get(self, *args, **kwargs):
140 self.get_object().publish()
141 messages.success(self.request, _('%s has been published.') % self.get_object())
142 return redirect(self.get_success_url())
144 sound_publish = SoundPublishView.as_view()
147 class SoundUnpublishView(SoundActionView):
148 def get(self, *args, **kwargs):
149 self.get_object().unpublish()
150 messages.success(self.request, _('%s has been unpublished.') % self.get_object())
151 return redirect(self.get_success_url())
153 sound_unpublish = SoundUnpublishView.as_view()
156 class SoundRejectView(SoundActionView):
157 def get(self, *args, **kwargs):
158 self.get_object().reject()
159 messages.warning(self.request, _('%s has been rejected.') % self.get_object())
160 return redirect(self.get_success_url())
162 sound_reject = SoundRejectView.as_view()