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
10 from emissions.models import *
11 from emissions.utils import period_program
13 import emissions.views
14 import newsletter.views
16 class Home(TemplateView):
17 template_name = 'home.html'
19 def get_context_data(self, **kwargs):
20 context = super(Home, self).get_context_data(**kwargs)
21 context['emissions'] = self.request.user.emissions.all().order_by('title')
22 context['news_categories'] = self.request.user.news_categories.all().order_by('title')
23 if self.request.user.has_perm('emissions.add_focus'):
24 context['focused_items'] = Focus.objects.select_related()
28 home = login_required(Home.as_view())
31 class EmissionListView(emissions.views.EmissionListView):
34 emissions = login_required(EmissionListView.as_view())
38 class NewsListView(ListView):
41 def get_queryset(self):
42 return NewsCategory.objects.order_by('title')
44 def get_context_data(self, **kwargs):
45 context = super(NewsListView, self).get_context_data(**kwargs)
46 context['unsorted_newsitems'] = NewsItem.objects.filter(category__isnull=True).order_by('title')
49 news = login_required(NewsListView.as_view())
52 class NewsletterCreateView(newsletter.views.NewsletterCreateView):
53 def get_initial(self):
54 initial = super(NewsletterCreateView, self).get_initial()
56 newsletter_body = loader.get_template('newsletter/body.html')
59 date = datetime.datetime.today()
60 if date.weekday() > 0:
61 date = date + datetime.timedelta(days=7-date.weekday())
63 date = datetime.datetime(*date.timetuple()[:3])
65 context['date'] = date
67 context['soundfiles'] = SoundFile.objects.filter(
68 podcastable=True, fragment=False).select_related().filter(
69 creation_timestamp__gte=date-datetime.timedelta(days=7))
71 context['diffusions'] = list(Diffusion.objects.select_related().filter(
73 datetime__lte=date+datetime.timedelta(days=7)).order_by('datetime'))
75 # remove rebroadcasts made during the same week
77 for diff in context['diffusions'][:]:
78 if diff.episode.id in seen_episodes:
79 context['diffusions'].remove(diff)
80 seen_episodes[diff.episode.id] = True
82 initial['text'] = newsletter_body.render(context)
85 newsletter_create = NewsletterCreateView.as_view()
88 class FocusSetView(RedirectView):
91 def get_redirect_url(self, object_type, object_id):
92 if not self.request.user.has_perm('emissions.add_focus'):
93 raise PermissionDenied()
94 if object_type == 'emission':
95 emission = Emission.objects.get(id=object_id)
97 f = Focus.objects.get(emission=emission)
98 except Focus.DoesNotExist:
101 f.emission = emission
103 return reverse('emission-view', kwargs={'slug': emission.slug})
104 if object_type == 'episode':
105 episode = Episode.objects.get(id=object_id)
107 f = Focus.objects.get(episode=episode)
108 except Focus.DoesNotExist:
113 return reverse('episode-view', kwargs={
114 'emission_slug': episode.emission.slug, 'slug': episode.slug})
115 if object_type == 'newsitem':
116 newsitem = NewsItem.objects.get(id=object_id)
118 f = Focus.objects.get(newsitem=newsitem)
119 except Focus.DoesNotExist:
122 f.newsitem = newsitem
124 return reverse('newsitem-view', kwargs={'slug': newsitem.slug})
125 if object_type == 'soundfile':
126 soundfile = SoundFile.objects.get(id=object_id)
128 f = Focus.objects.get(soundfile=soundfile)
129 except Focus.DoesNotExist:
132 f.soundfile = soundfile
134 return reverse('episode-view', kwargs={
135 'slug': soundfile.episode.slug,
136 'emission_slug': soundfile.episode.emission.slug,
139 focus_set = FocusSetView.as_view()
142 class FocusUnsetView(RedirectView):
145 def get_redirect_url(self, object_type, object_id):
146 if not self.request.user.has_perm('emissions.delete_focus'):
147 raise PermissionDenied()
148 if object_type == 'emission':
149 emission = Emission.objects.get(id=object_id)
150 focus = Focus.objects.get(emission=emission)
151 focus.current = False
153 return reverse('emission-view', kwargs={'slug': emission.slug})
154 if object_type == 'episode':
155 episode = Episode.objects.get(id=object_id)
156 focus = Focus.objects.get(episode=episode)
157 focus.current = False
159 return reverse('episode-view', kwargs={
160 'emission_slug': episode.emission.slug, 'slug': episode.slug})
161 if object_type == 'newsitem':
162 newsitem = NewsItem.objects.get(id=object_id)
163 focus = Focus.objects.get(newsitem=newsitem)
164 focus.current = False
166 return reverse('newsitem-view', kwargs={'slug': newsitem.slug})
167 if object_type == 'soundfile':
168 soundfile = SoundFile.objects.get(id=object_id)
169 focus = Focus.objects.get(soundfile=soundfile)
170 focus.current = False
172 return reverse('episode-view', kwargs={
173 'slug': soundfile.episode.slug,
174 'emission_slug': soundfile.episode.emission.slug,
177 focus_unset = FocusUnsetView.as_view()