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