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
12 from emissions.models import *
13 from emissions.utils import period_program
14 from combo.data.models import Page
16 import emissions.views
17 import newsletter.views
19 from .poll.models import Vote
20 from .service_messages.models import Message
23 class Home(TemplateView):
24 template_name = 'home.html'
26 def get_context_data(self, **kwargs):
27 context = super(Home, self).get_context_data(**kwargs)
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')
50 home = login_required(Home.as_view())
53 class EmissionListView(emissions.views.EmissionListView):
56 emissions_list = login_required(EmissionListView.as_view())
60 class NewsListView(ListView):
63 def get_queryset(self):
64 return NewsCategory.objects.order_by('title')
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')
71 news = login_required(NewsListView.as_view())
74 class NewsletterCreateView(newsletter.views.NewsletterCreateView):
75 def get_initial(self):
76 initial = super(NewsletterCreateView, self).get_initial()
78 newsletter_body = loader.get_template('newsletter/body.html')
79 newsletter_subject = loader.get_template('newsletter/subject.txt')
82 date = datetime.datetime.today()
83 if date.weekday() > 0:
84 date = date + datetime.timedelta(days=7-date.weekday())
86 date = datetime.datetime(*date.timetuple()[:3])
87 date_end = date + datetime.timedelta(days=7)
89 context['date'] = date
90 context['date_end'] = date_end
92 context['soundfiles'] = SoundFile.objects.filter(
93 podcastable=True, fragment=False).select_related().filter(
94 creation_timestamp__gte=date-datetime.timedelta(days=7))
96 context['diffusions'] = list(Diffusion.objects.select_related().filter(
98 datetime__lte=date+datetime.timedelta(days=7)).order_by('datetime'))
100 # remove rebroadcasts made during the same week
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
107 initial['subject'] = newsletter_subject.render(context)
108 initial['text'] = newsletter_body.render(context)
111 newsletter_create = NewsletterCreateView.as_view()
114 class FocusSetView(RedirectView):
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)
124 f = Focus.objects.get(emission=emission)
125 except Focus.DoesNotExist:
128 f.emission = emission
130 return reverse('emission-view', kwargs={'slug': emission.slug})
131 if object_type == 'episode':
132 episode = Episode.objects.get(id=object_id)
134 f = Focus.objects.get(episode=episode)
135 except Focus.DoesNotExist:
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)
145 f = Focus.objects.get(newsitem=newsitem)
146 except Focus.DoesNotExist:
149 f.newsitem = newsitem
151 return reverse('newsitem-view', kwargs={'slug': newsitem.slug})
152 if object_type == 'soundfile':
153 soundfile = SoundFile.objects.get(id=object_id)
155 f = Focus.objects.get(soundfile=soundfile)
156 except Focus.DoesNotExist:
159 f.soundfile = soundfile
161 return reverse('episode-view', kwargs={
162 'slug': soundfile.episode.slug,
163 'emission_slug': soundfile.episode.emission.slug,
165 if object_type == 'page':
166 page = Page.objects.get(id=object_id)
168 f = Focus.objects.get(page=page)
169 except Focus.DoesNotExist:
174 return reverse('combo-manager-page-view', kwargs={'pk': object_id})
176 focus_set = FocusSetView.as_view()
179 class FocusUnsetView(RedirectView):
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
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
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
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
210 return reverse('episode-view', kwargs={
211 'slug': soundfile.episode.slug,
212 'emission_slug': soundfile.episode.emission.slug,
214 if object_type == 'page':
215 focus = Focus.objects.get(page=object_id)
216 focus.current = False
218 return reverse('combo-manager-page-view', kwargs={'pk': object_id})
220 focus_unset = FocusUnsetView.as_view()