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
11 from emissions.models import *
12 from emissions.utils import period_program
14 import emissions.views
15 import newsletter.views
17 class Home(TemplateView):
18 template_name = 'home.html'
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')
35 home = login_required(Home.as_view())
38 class EmissionListView(emissions.views.EmissionListView):
41 emissions_list = login_required(EmissionListView.as_view())
45 class NewsListView(ListView):
48 def get_queryset(self):
49 return NewsCategory.objects.order_by('title')
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')
56 news = login_required(NewsListView.as_view())
59 class NewsletterCreateView(newsletter.views.NewsletterCreateView):
60 def get_initial(self):
61 initial = super(NewsletterCreateView, self).get_initial()
63 newsletter_body = loader.get_template('newsletter/body.html')
64 newsletter_subject = loader.get_template('newsletter/subject.txt')
67 date = datetime.datetime.today()
68 if date.weekday() > 0:
69 date = date + datetime.timedelta(days=7-date.weekday())
71 date = datetime.datetime(*date.timetuple()[:3])
72 date_end = date + datetime.timedelta(days=7)
74 context['date'] = date
75 context['date_end'] = date_end
77 context['soundfiles'] = SoundFile.objects.filter(
78 podcastable=True, fragment=False).select_related().filter(
79 creation_timestamp__gte=date-datetime.timedelta(days=7))
81 context['diffusions'] = list(Diffusion.objects.select_related().filter(
83 datetime__lte=date+datetime.timedelta(days=7)).order_by('datetime'))
85 # remove rebroadcasts made during the same week
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
92 initial['subject'] = newsletter_subject.render(context)
93 initial['text'] = newsletter_body.render(context)
96 newsletter_create = NewsletterCreateView.as_view()
99 class FocusSetView(RedirectView):
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)
109 f = Focus.objects.get(emission=emission)
110 except Focus.DoesNotExist:
113 f.emission = emission
115 return reverse('emission-view', kwargs={'slug': emission.slug})
116 if object_type == 'episode':
117 episode = Episode.objects.get(id=object_id)
119 f = Focus.objects.get(episode=episode)
120 except Focus.DoesNotExist:
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)
130 f = Focus.objects.get(newsitem=newsitem)
131 except Focus.DoesNotExist:
134 f.newsitem = newsitem
136 return reverse('newsitem-view', kwargs={'slug': newsitem.slug})
137 if object_type == 'soundfile':
138 soundfile = SoundFile.objects.get(id=object_id)
140 f = Focus.objects.get(soundfile=soundfile)
141 except Focus.DoesNotExist:
144 f.soundfile = soundfile
146 return reverse('episode-view', kwargs={
147 'slug': soundfile.episode.slug,
148 'emission_slug': soundfile.episode.emission.slug,
151 focus_set = FocusSetView.as_view()
154 class FocusUnsetView(RedirectView):
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
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
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
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
185 return reverse('episode-view', kwargs={
186 'slug': soundfile.episode.slug,
187 'emission_slug': soundfile.episode.emission.slug,
190 focus_unset = FocusUnsetView.as_view()