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
21 class Home(TemplateView):
22 template_name = 'home.html'
24 def get_context_data(self, **kwargs):
25 context = super(Home, self).get_context_data(**kwargs)
27 vote = Vote.objects.get(user=self.request.user)
28 except Vote.DoesNotExist:
29 context['display_poll_button'] = True
30 context['emissions'] = self.request.user.emissions.all().order_by('title')
31 context['news_categories'] = self.request.user.news_categories.all().order_by('title')
32 if self.request.user.has_perm('emissions.add_focus'):
33 context['focused_items'] = Focus.objects.select_related().filter(current=True)
34 context['recent_episodes'] = Episode.objects.select_related(
35 ).order_by('-last_update_timestamp')
36 context['recent_newsitems'] = NewsItem.objects.select_related(
37 ).order_by('-last_update_timestamp')
38 context['recent_soundfiles'] = SoundFile.objects.select_related(
39 ).order_by('-last_update_timestamp')
43 home = login_required(Home.as_view())
46 class EmissionListView(emissions.views.EmissionListView):
49 emissions_list = login_required(EmissionListView.as_view())
53 class NewsListView(ListView):
56 def get_queryset(self):
57 return NewsCategory.objects.order_by('title')
59 def get_context_data(self, **kwargs):
60 context = super(NewsListView, self).get_context_data(**kwargs)
61 context['unsorted_newsitems'] = NewsItem.objects.filter(category__isnull=True).order_by('title')
64 news = login_required(NewsListView.as_view())
67 class NewsletterCreateView(newsletter.views.NewsletterCreateView):
68 def get_initial(self):
69 initial = super(NewsletterCreateView, self).get_initial()
71 newsletter_body = loader.get_template('newsletter/body.html')
72 newsletter_subject = loader.get_template('newsletter/subject.txt')
75 date = datetime.datetime.today()
76 if date.weekday() > 0:
77 date = date + datetime.timedelta(days=7-date.weekday())
79 date = datetime.datetime(*date.timetuple()[:3])
80 date_end = date + datetime.timedelta(days=7)
82 context['date'] = date
83 context['date_end'] = date_end
85 context['soundfiles'] = SoundFile.objects.filter(
86 podcastable=True, fragment=False).select_related().filter(
87 creation_timestamp__gte=date-datetime.timedelta(days=7))
89 context['diffusions'] = list(Diffusion.objects.select_related().filter(
91 datetime__lte=date+datetime.timedelta(days=7)).order_by('datetime'))
93 # remove rebroadcasts made during the same week
95 for diff in context['diffusions'][:]:
96 if diff.episode.id in seen_episodes:
97 context['diffusions'].remove(diff)
98 seen_episodes[diff.episode.id] = True
100 initial['subject'] = newsletter_subject.render(context)
101 initial['text'] = newsletter_body.render(context)
104 newsletter_create = NewsletterCreateView.as_view()
107 class FocusSetView(RedirectView):
110 def get_redirect_url(self, object_type, object_id):
111 if not self.request.user.has_perm('emissions.add_focus'):
112 raise PermissionDenied()
113 messages.success(self.request, emissions.views.SUCCESS_MESSAGE)
114 if object_type == 'emission':
115 emission = Emission.objects.get(id=object_id)
117 f = Focus.objects.get(emission=emission)
118 except Focus.DoesNotExist:
121 f.emission = emission
123 return reverse('emission-view', kwargs={'slug': emission.slug})
124 if object_type == 'episode':
125 episode = Episode.objects.get(id=object_id)
127 f = Focus.objects.get(episode=episode)
128 except Focus.DoesNotExist:
133 return reverse('episode-view', kwargs={
134 'emission_slug': episode.emission.slug, 'slug': episode.slug})
135 if object_type == 'newsitem':
136 newsitem = NewsItem.objects.get(id=object_id)
138 f = Focus.objects.get(newsitem=newsitem)
139 except Focus.DoesNotExist:
142 f.newsitem = newsitem
144 return reverse('newsitem-view', kwargs={'slug': newsitem.slug})
145 if object_type == 'soundfile':
146 soundfile = SoundFile.objects.get(id=object_id)
148 f = Focus.objects.get(soundfile=soundfile)
149 except Focus.DoesNotExist:
152 f.soundfile = soundfile
154 return reverse('episode-view', kwargs={
155 'slug': soundfile.episode.slug,
156 'emission_slug': soundfile.episode.emission.slug,
158 if object_type == 'page':
159 page = Page.objects.get(id=object_id)
161 f = Focus.objects.get(page=page)
162 except Focus.DoesNotExist:
167 return reverse('combo-manager-page-view', kwargs={'pk': object_id})
169 focus_set = FocusSetView.as_view()
172 class FocusUnsetView(RedirectView):
175 def get_redirect_url(self, object_type, object_id):
176 if not self.request.user.has_perm('emissions.delete_focus'):
177 raise PermissionDenied()
178 messages.success(self.request, emissions.views.SUCCESS_MESSAGE)
179 if object_type == 'emission':
180 emission = Emission.objects.get(id=object_id)
181 focus = Focus.objects.get(emission=emission)
182 focus.current = False
184 return reverse('emission-view', kwargs={'slug': emission.slug})
185 if object_type == 'episode':
186 episode = Episode.objects.get(id=object_id)
187 focus = Focus.objects.get(episode=episode)
188 focus.current = False
190 return reverse('episode-view', kwargs={
191 'emission_slug': episode.emission.slug, 'slug': episode.slug})
192 if object_type == 'newsitem':
193 newsitem = NewsItem.objects.get(id=object_id)
194 focus = Focus.objects.get(newsitem=newsitem)
195 focus.current = False
197 return reverse('newsitem-view', kwargs={'slug': newsitem.slug})
198 if object_type == 'soundfile':
199 soundfile = SoundFile.objects.get(id=object_id)
200 focus = Focus.objects.get(soundfile=soundfile)
201 focus.current = False
203 return reverse('episode-view', kwargs={
204 'slug': soundfile.episode.slug,
205 'emission_slug': soundfile.episode.emission.slug,
207 if object_type == 'page':
208 focus = Focus.objects.get(page=object_id)
209 focus.current = False
211 return reverse('combo-manager-page-view', kwargs={'pk': object_id})
213 focus_unset = FocusUnsetView.as_view()