]> git.0d.be Git - panikdb.git/blob - panikdb/views.py
start new regie home page
[panikdb.git] / panikdb / views.py
1 import datetime
2
3 from django.contrib.auth.decorators import login_required
4 from django.contrib.auth.forms import AuthenticationForm
5 from django.core.exceptions import PermissionDenied
6 from django.core.urlresolvers import reverse
7 from django.template import loader
8 from django.views.generic.base import TemplateView, RedirectView
9 from django.views.generic.list import ListView
10 from django.contrib import messages
11 from django.shortcuts import redirect
12
13 from emissions.models import *
14 from emissions.utils import period_program
15 from combo.data.models import Page
16
17 import emissions.views
18 import newsletter.views
19
20 from .poll.models import Vote
21
22 class Home(TemplateView):
23     template_name = 'home.html'
24
25     def get_context_data(self, **kwargs):
26         context = super(Home, self).get_context_data(**kwargs)
27         try:
28             vote = Vote.objects.get(user=self.request.user)
29         except Vote.DoesNotExist:
30             context['display_poll_button'] = True
31         context['emissions'] = self.request.user.emissions.all().order_by('title')
32         context['news_categories'] = self.request.user.news_categories.all().order_by('title')
33         if self.request.user.has_perm('emissions.add_focus'):
34             context['focused_items'] = Focus.objects.select_related().filter(current=True)
35             context['recent_episodes'] = Episode.objects.select_related(
36                     ).order_by('-last_update_timestamp')
37             context['recent_newsitems'] = NewsItem.objects.select_related(
38                     ).order_by('-last_update_timestamp')
39             context['recent_soundfiles'] = SoundFile.objects.select_related(
40                     ).order_by('-last_update_timestamp')
41
42         return context
43
44 home = login_required(Home.as_view())
45
46
47 class RegieHome(TemplateView):
48     template_name = 'regie-home.html'
49
50     def get_context_data(self, **kwargs):
51         context = super().get_context_data(**kwargs)
52         context['login_form'] = AuthenticationForm()
53         return context
54
55
56 regie_home = RegieHome.as_view()
57
58
59 class EmissionListView(emissions.views.EmissionListView):
60     pass
61
62 emissions_list = login_required(EmissionListView.as_view())
63
64
65
66 class NewsListView(ListView):
67     model = NewsCategory
68
69     def get_queryset(self):
70         return NewsCategory.objects.order_by('title')
71
72     def get_context_data(self, **kwargs):
73         context = super(NewsListView, self).get_context_data(**kwargs)
74         context['unsorted_newsitems'] = NewsItem.objects.filter(category__isnull=True).order_by('title')
75         return context
76
77 news = login_required(NewsListView.as_view())
78
79
80 class NewsletterCreateView(newsletter.views.NewsletterCreateView):
81     def get_initial(self):
82         initial = super(NewsletterCreateView, self).get_initial()
83
84         newsletter_body = loader.get_template('newsletter/body.html')
85         newsletter_subject = loader.get_template('newsletter/subject.txt')
86         context = {}
87
88         date = datetime.datetime.today()
89         if date.weekday() > 0:
90             date = date + datetime.timedelta(days=7-date.weekday())
91
92         date = datetime.datetime(*date.timetuple()[:3])
93         date_end = date + datetime.timedelta(days=7)
94
95         context['date'] = date
96         context['date_end'] = date_end
97
98         context['soundfiles'] = SoundFile.objects.filter(
99                 podcastable=True, fragment=False).select_related().filter(
100                         creation_timestamp__gte=date-datetime.timedelta(days=7))
101
102         context['diffusions'] = list(Diffusion.objects.select_related().filter(
103                 datetime__gte=date,
104                 datetime__lte=date+datetime.timedelta(days=7)).order_by('datetime'))
105
106         # remove rebroadcasts made during the same week
107         seen_episodes = {}
108         for diff in context['diffusions'][:]:
109             if diff.episode.id in seen_episodes:
110                 context['diffusions'].remove(diff)
111             seen_episodes[diff.episode.id] = True
112
113         initial['subject'] = newsletter_subject.render(context)
114         initial['text'] = newsletter_body.render(context)
115         return initial
116
117 newsletter_create = NewsletterCreateView.as_view()
118
119
120 class FocusSetView(RedirectView):
121     permanent = False
122
123     def get_redirect_url(self, object_type, object_id):
124         if not self.request.user.has_perm('emissions.add_focus'):
125             raise PermissionDenied()
126         messages.success(self.request, emissions.views.SUCCESS_MESSAGE)
127         if object_type == 'emission':
128             emission = Emission.objects.get(id=object_id)
129             try:
130                 f = Focus.objects.get(emission=emission)
131             except Focus.DoesNotExist:
132                 f = Focus()
133             f.current = True
134             f.emission = emission
135             f.save()
136             return reverse('emission-view', kwargs={'slug': emission.slug})
137         if object_type == 'episode':
138             episode = Episode.objects.get(id=object_id)
139             try:
140                 f = Focus.objects.get(episode=episode)
141             except Focus.DoesNotExist:
142                 f = Focus()
143             f.current = True
144             f.episode = episode
145             f.save()
146             return reverse('episode-view', kwargs={
147                 'emission_slug': episode.emission.slug, 'slug': episode.slug})
148         if object_type == 'newsitem':
149             newsitem = NewsItem.objects.get(id=object_id)
150             try:
151                 f = Focus.objects.get(newsitem=newsitem)
152             except Focus.DoesNotExist:
153                 f = Focus()
154             f.current = True
155             f.newsitem = newsitem
156             f.save()
157             return reverse('newsitem-view', kwargs={'slug': newsitem.slug})
158         if object_type == 'soundfile':
159             soundfile = SoundFile.objects.get(id=object_id)
160             try:
161                 f = Focus.objects.get(soundfile=soundfile)
162             except Focus.DoesNotExist:
163                 f = Focus()
164             f.current = True
165             f.soundfile = soundfile
166             f.save()
167             return reverse('episode-view', kwargs={
168                 'slug': soundfile.episode.slug,
169                 'emission_slug': soundfile.episode.emission.slug,
170                 })
171         if object_type == 'page':
172             page = Page.objects.get(id=object_id)
173             try:
174                 f = Focus.objects.get(page=page)
175             except Focus.DoesNotExist:
176                 f = Focus()
177             f.current = True
178             f.page = page
179             f.save()
180             return reverse('combo-manager-page-view', kwargs={'pk': object_id})
181
182 focus_set = FocusSetView.as_view()
183
184
185 class FocusUnsetView(RedirectView):
186     permanent = False
187
188     def get_redirect_url(self, object_type, object_id):
189         if not self.request.user.has_perm('emissions.delete_focus'):
190             raise PermissionDenied()
191         messages.success(self.request, emissions.views.SUCCESS_MESSAGE)
192         if object_type == 'emission':
193             emission = Emission.objects.get(id=object_id)
194             focus = Focus.objects.get(emission=emission)
195             focus.current = False
196             focus.save()
197             return reverse('emission-view', kwargs={'slug': emission.slug})
198         if object_type == 'episode':
199             episode = Episode.objects.get(id=object_id)
200             focus = Focus.objects.get(episode=episode)
201             focus.current = False
202             focus.save()
203             return reverse('episode-view', kwargs={
204                 'emission_slug': episode.emission.slug, 'slug': episode.slug})
205         if object_type == 'newsitem':
206             newsitem = NewsItem.objects.get(id=object_id)
207             focus = Focus.objects.get(newsitem=newsitem)
208             focus.current = False
209             focus.save()
210             return reverse('newsitem-view', kwargs={'slug': newsitem.slug})
211         if object_type == 'soundfile':
212             soundfile = SoundFile.objects.get(id=object_id)
213             focus = Focus.objects.get(soundfile=soundfile)
214             focus.current = False
215             focus.save()
216             return reverse('episode-view', kwargs={
217                 'slug': soundfile.episode.slug,
218                 'emission_slug': soundfile.episode.emission.slug,
219                 })
220         if object_type == 'page':
221             focus = Focus.objects.get(page=object_id)
222             focus.current = False
223             focus.save()
224             return reverse('combo-manager-page-view', kwargs={'pk': object_id})
225
226 focus_unset = FocusUnsetView.as_view()