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 from django.shortcuts import redirect
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
17 import emissions.views
18 import newsletter.views
20 from .poll.models import Vote
22 class Home(TemplateView):
23 template_name = 'home.html'
25 def get_context_data(self, **kwargs):
26 context = super(Home, self).get_context_data(**kwargs)
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')
44 home = login_required(Home.as_view())
47 class EmissionListView(emissions.views.EmissionListView):
50 emissions_list = login_required(EmissionListView.as_view())
54 class NewsListView(ListView):
57 def get_queryset(self):
58 return NewsCategory.objects.order_by('title')
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')
65 news = login_required(NewsListView.as_view())
68 class NewsletterCreateView(newsletter.views.NewsletterCreateView):
69 def get_initial(self):
70 initial = super(NewsletterCreateView, self).get_initial()
72 newsletter_body = loader.get_template('newsletter/body.html')
73 newsletter_subject = loader.get_template('newsletter/subject.txt')
76 date = datetime.datetime.today()
77 if date.weekday() > 0:
78 date = date + datetime.timedelta(days=7-date.weekday())
80 date = datetime.datetime(*date.timetuple()[:3])
81 date_end = date + datetime.timedelta(days=7)
83 context['date'] = date
84 context['date_end'] = date_end
86 context['soundfiles'] = SoundFile.objects.filter(
87 podcastable=True, fragment=False).select_related().filter(
88 creation_timestamp__gte=date-datetime.timedelta(days=7))
90 context['diffusions'] = list(Diffusion.objects.select_related().filter(
92 datetime__lte=date+datetime.timedelta(days=7)).order_by('datetime'))
94 # remove rebroadcasts made during the same week
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
101 initial['subject'] = newsletter_subject.render(context)
102 initial['text'] = newsletter_body.render(context)
105 newsletter_create = NewsletterCreateView.as_view()
108 class FocusSetView(RedirectView):
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)
118 f = Focus.objects.get(emission=emission)
119 except Focus.DoesNotExist:
122 f.emission = emission
124 return reverse('emission-view', kwargs={'slug': emission.slug})
125 if object_type == 'episode':
126 episode = Episode.objects.get(id=object_id)
128 f = Focus.objects.get(episode=episode)
129 except Focus.DoesNotExist:
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)
139 f = Focus.objects.get(newsitem=newsitem)
140 except Focus.DoesNotExist:
143 f.newsitem = newsitem
145 return reverse('newsitem-view', kwargs={'slug': newsitem.slug})
146 if object_type == 'soundfile':
147 soundfile = SoundFile.objects.get(id=object_id)
149 f = Focus.objects.get(soundfile=soundfile)
150 except Focus.DoesNotExist:
153 f.soundfile = soundfile
155 return reverse('episode-view', kwargs={
156 'slug': soundfile.episode.slug,
157 'emission_slug': soundfile.episode.emission.slug,
159 if object_type == 'page':
160 page = Page.objects.get(id=object_id)
162 f = Focus.objects.get(page=page)
163 except Focus.DoesNotExist:
168 return reverse('combo-manager-page-view', kwargs={'pk': object_id})
170 focus_set = FocusSetView.as_view()
173 class FocusUnsetView(RedirectView):
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
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
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
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
204 return reverse('episode-view', kwargs={
205 'slug': soundfile.episode.slug,
206 'emission_slug': soundfile.episode.emission.slug,
208 if object_type == 'page':
209 focus = Focus.objects.get(page=object_id)
210 focus.current = False
212 return reverse('combo-manager-page-view', kwargs={'pk': object_id})
214 focus_unset = FocusUnsetView.as_view()
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)
221 return redirect('combo-manager-page-view', pk=page_pk)