3 from django.contrib.auth.decorators import login_required
4 from django.contrib.auth.forms import AuthenticationForm
5 from django.core.exceptions import PermissionDenied
6 from django.core.urlresolvers import reverse
7 from django.template import loader
8 from django.views.generic.base import TemplateView, RedirectView
9 from django.views.generic.list import ListView
10 from django.contrib import messages
11 from django.shortcuts import redirect
13 from emissions.models import *
14 from emissions.utils import period_program
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 RegieHome(TemplateView):
48 template_name = 'regie-home.html'
50 def get_context_data(self, **kwargs):
51 context = super().get_context_data(**kwargs)
52 context['login_form'] = AuthenticationForm()
56 regie_home = RegieHome.as_view()
59 class EmissionListView(emissions.views.EmissionListView):
62 emissions_list = login_required(EmissionListView.as_view())
66 class NewsListView(ListView):
69 def get_queryset(self):
70 return NewsCategory.objects.order_by('title')
72 def get_context_data(self, **kwargs):
73 context = super(NewsListView, self).get_context_data(**kwargs)
74 context['unsorted_newsitems'] = NewsItem.objects.filter(category__isnull=True).order_by('title')
77 news = login_required(NewsListView.as_view())
80 class NewsletterCreateView(newsletter.views.NewsletterCreateView):
81 def get_initial(self):
82 initial = super(NewsletterCreateView, self).get_initial()
84 newsletter_body = loader.get_template('newsletter/body.html')
85 newsletter_subject = loader.get_template('newsletter/subject.txt')
88 date = datetime.datetime.today()
89 if date.weekday() > 0:
90 date = date + datetime.timedelta(days=7-date.weekday())
92 date = datetime.datetime(*date.timetuple()[:3])
93 date_end = date + datetime.timedelta(days=7)
95 context['date'] = date
96 context['date_end'] = date_end
98 context['soundfiles'] = SoundFile.objects.filter(
99 podcastable=True, fragment=False).select_related().filter(
100 creation_timestamp__gte=date-datetime.timedelta(days=7))
102 context['diffusions'] = list(Diffusion.objects.select_related().filter(
104 datetime__lte=date+datetime.timedelta(days=7)).order_by('datetime'))
106 # remove rebroadcasts made during the same week
108 for diff in context['diffusions'][:]:
109 if diff.episode.id in seen_episodes:
110 context['diffusions'].remove(diff)
111 seen_episodes[diff.episode.id] = True
113 initial['subject'] = newsletter_subject.render(context)
114 initial['text'] = newsletter_body.render(context)
117 newsletter_create = NewsletterCreateView.as_view()
120 class FocusSetView(RedirectView):
123 def get_redirect_url(self, object_type, object_id):
124 if not self.request.user.has_perm('emissions.add_focus'):
125 raise PermissionDenied()
126 messages.success(self.request, emissions.views.SUCCESS_MESSAGE)
127 if object_type == 'emission':
128 emission = Emission.objects.get(id=object_id)
130 f = Focus.objects.get(emission=emission)
131 except Focus.DoesNotExist:
134 f.emission = emission
136 return reverse('emission-view', kwargs={'slug': emission.slug})
137 if object_type == 'episode':
138 episode = Episode.objects.get(id=object_id)
140 f = Focus.objects.get(episode=episode)
141 except Focus.DoesNotExist:
146 return reverse('episode-view', kwargs={
147 'emission_slug': episode.emission.slug, 'slug': episode.slug})
148 if object_type == 'newsitem':
149 newsitem = NewsItem.objects.get(id=object_id)
151 f = Focus.objects.get(newsitem=newsitem)
152 except Focus.DoesNotExist:
155 f.newsitem = newsitem
157 return reverse('newsitem-view', kwargs={'slug': newsitem.slug})
158 if object_type == 'soundfile':
159 soundfile = SoundFile.objects.get(id=object_id)
161 f = Focus.objects.get(soundfile=soundfile)
162 except Focus.DoesNotExist:
165 f.soundfile = soundfile
167 return reverse('episode-view', kwargs={
168 'slug': soundfile.episode.slug,
169 'emission_slug': soundfile.episode.emission.slug,
171 if object_type == 'page':
172 page = Page.objects.get(id=object_id)
174 f = Focus.objects.get(page=page)
175 except Focus.DoesNotExist:
180 return reverse('combo-manager-page-view', kwargs={'pk': object_id})
182 focus_set = FocusSetView.as_view()
185 class FocusUnsetView(RedirectView):
188 def get_redirect_url(self, object_type, object_id):
189 if not self.request.user.has_perm('emissions.delete_focus'):
190 raise PermissionDenied()
191 messages.success(self.request, emissions.views.SUCCESS_MESSAGE)
192 if object_type == 'emission':
193 emission = Emission.objects.get(id=object_id)
194 focus = Focus.objects.get(emission=emission)
195 focus.current = False
197 return reverse('emission-view', kwargs={'slug': emission.slug})
198 if object_type == 'episode':
199 episode = Episode.objects.get(id=object_id)
200 focus = Focus.objects.get(episode=episode)
201 focus.current = False
203 return reverse('episode-view', kwargs={
204 'emission_slug': episode.emission.slug, 'slug': episode.slug})
205 if object_type == 'newsitem':
206 newsitem = NewsItem.objects.get(id=object_id)
207 focus = Focus.objects.get(newsitem=newsitem)
208 focus.current = False
210 return reverse('newsitem-view', kwargs={'slug': newsitem.slug})
211 if object_type == 'soundfile':
212 soundfile = SoundFile.objects.get(id=object_id)
213 focus = Focus.objects.get(soundfile=soundfile)
214 focus.current = False
216 return reverse('episode-view', kwargs={
217 'slug': soundfile.episode.slug,
218 'emission_slug': soundfile.episode.emission.slug,
220 if object_type == 'page':
221 focus = Focus.objects.get(page=object_id)
222 focus.current = False
224 return reverse('combo-manager-page-view', kwargs={'pk': object_id})
226 focus_unset = FocusUnsetView.as_view()