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