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