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