views.py 24.2 KB
Newer Older
Simon Daron's avatar
Simon Daron committed
1
from datetime import datetime, timedelta
2
import math
3
4
5
import os
import stat
import time
Simon Daron's avatar
Simon Daron committed
6

fred's avatar
fred committed
7
8
from django.conf import settings

9
from django.views.decorators.cache import cache_control
Simon Daron's avatar
Simon Daron committed
10
11
12
from django.views.generic.base import TemplateView
from django.views.generic.detail import DetailView
from django.views.decorators.csrf import csrf_exempt
fred's avatar
fred committed
13
from django.views.generic.dates import _date_from_string
Simon Daron's avatar
Simon Daron committed
14

Simon Daron's avatar
Simon Daron committed
15
16
from django.core.paginator import Paginator

fred's avatar
fred committed
17
18
from django.contrib.sites.models import Site
from django.contrib.syndication.views import Feed, add_domain
fred's avatar
fred committed
19
20
from django.utils.feedgenerator import Atom1Feed

fred's avatar
fred committed
21
import fiber.views
fred's avatar
fred committed
22
from haystack.query import SearchQuerySet
Simon Daron's avatar
Simon Daron committed
23
24
from jsonresponse import to_json

Simon Daron's avatar
Simon Daron committed
25
from emissions.models import Category, Emission, Episode, Diffusion, SoundFile, \
fred's avatar
fred committed
26
        Schedule, Nonstop, NewsItem, NewsCategory, Focus
Simon Daron's avatar
Simon Daron committed
27

fred's avatar
fred committed
28
from emissions.utils import whatsonair, period_program
Simon Daron's avatar
Simon Daron committed
29

30
31
from newsletter.forms import SubscribeForm

fred's avatar
fred committed
32
33
from . import utils

Simon Daron's avatar
Simon Daron committed
34

35
class EmissionMixin:
fred's avatar
fred committed
36
    def get_emission_context(self, emission, episode_ids=None):
37
        context = {}
38
39
40

        # get all episodes, with an additional attribute to get the date of
        # their first diffusion
fred's avatar
fred committed
41
42
43
44
45
46
        episodes_queryset = Episode.objects.select_related()
        if episode_ids is not None:
            episodes_queryset = episodes_queryset.filter(id__in=episode_ids)
        else:
            episodes_queryset = episodes_queryset.filter(emission=emission)

47
        context['episodes'] = \
fred's avatar
fred committed
48
                episodes_queryset.extra(select={
49
50
51
52
53
54
55
                        'first_diffusion': 'emissions_diffusion.datetime',
                        },
                        select_params=(False, True),
                        where=['''datetime = (SELECT MIN(datetime)
                                                FROM emissions_diffusion
                                               WHERE episode_id = emissions_episode.id)'''],
                        tables=['emissions_diffusion'],
56
                    ).order_by('-first_diffusion').distinct()
57
58
59

        # get all related soundfiles in a single query
        soundfiles = {}
fred's avatar
fred committed
60
61
62
63
64
65
66
        if episode_ids is not None:
            for episode_id in episode_ids:
                soundfiles[episode_id] = None
        else:
            for episode in Episode.objects.filter(emission=emission):
                soundfiles[episode.id] = None

fred's avatar
fred committed
67
        for soundfile in SoundFile.objects.select_related().filter(podcastable=True,
68
                fragment=False, episode__emission=emission):
69
70
            soundfiles[soundfile.episode_id] = soundfile

fred's avatar
fred committed
71
        Episode.set_prefetched_soundfiles(soundfiles)
72

Simon Daron's avatar
Simon Daron committed
73
74
        #context['futurEpisodes'] = context['episodes'].filter(first_diffusion='2013')[0:3]

75
        return context
76
77
78
79
80
81
82
83


class EmissionDetailView(DetailView, EmissionMixin):
    model = Emission

    def get_context_data(self, **kwargs):
        context = super(EmissionDetailView, self).get_context_data(**kwargs)
        context['sectionName'] = "Emissions"
84
85
        context['schedules'] = Schedule.objects.select_related().filter(
                emission=self.object).order_by('rerun', 'datetime')
86
        context['news'] = NewsItem.objects.all().filter(emission=self.object.id).order_by('-date')[:3]
87
88
        context.update(self.get_emission_context(self.object))
        return context
89
90
emission = EmissionDetailView.as_view()

91
class EpisodeDetailView(DetailView, EmissionMixin):
92
93
94
95
    model = Episode

    def get_context_data(self, **kwargs):
        context = super(EpisodeDetailView, self).get_context_data(**kwargs)
Simon Daron's avatar
Simon Daron committed
96
        context['sectionName'] = "Emissions"
97
98
        context['diffusions'] = Diffusion.objects.select_related().filter(episode=self.object.id)
        context['soundfiles'] = SoundFile.objects.select_related().filter(episode=self.object.id)
99
        context['emission'] = Emission.objects.get(slug=self.kwargs.get('emission_slug'))
100
        context.update(self.get_emission_context(context['emission']))
101
102
103
        return context
episode = EpisodeDetailView.as_view()

Simon Daron's avatar
Simon Daron committed
104

105
106
107
108
109
110
111
class EmissionEpisodesDetailView(DetailView, EmissionMixin):
    model = Emission
    template_name = 'emissions/episodes.html'

    def get_context_data(self, **kwargs):
        context = super(EmissionEpisodesDetailView, self).get_context_data(**kwargs)
        context['sectionName'] = "Emissions"
112
113
        context['schedules'] = Schedule.objects.select_related().filter(
                emission=self.object).order_by('rerun', 'datetime')
fred's avatar
fred committed
114
115
116
117

        context['search_query'] = self.request.GET.get('q')
        if context['search_query']:
            # query string
118
            sqs = SearchQuerySet().models(Episode).filter(
fred's avatar
fred committed
119
                    emission_slug_exact=self.object.slug, text=context['search_query'])
fred's avatar
fred committed
120
121
122
123
124
            episode_ids = [x.pk for x in sqs]
        else:
            episode_ids = None

        context.update(self.get_emission_context(self.object, episode_ids=episode_ids))
125
126
127
        return context
emissionEpisodes = EmissionEpisodesDetailView.as_view()

Simon Daron's avatar
Simon Daron committed
128
129
130
class ProgramView(TemplateView):
    template_name = 'program.html'

Simon Daron's avatar
Simon Daron committed
131
    def get_context_data(self, year=None, week=None, **kwargs):
Simon Daron's avatar
Simon Daron committed
132
        context = super(ProgramView, self).get_context_data(**kwargs)
Simon Daron's avatar
Simon Daron committed
133
        context['sectionName'] = "Emissions"
fred's avatar
fred committed
134

Simon Daron's avatar
Simon Daron committed
135
        context['weekday'] = datetime.today().weekday()
fred's avatar
fred committed
136
137
138
139
140
141

        context['week'] = week = int(week) if week is not None else datetime.today().isocalendar()[1]
        context['year'] = year = int(year) if year is not None else datetime.today().isocalendar()[0]
        context['week_first_day'] = utils.tofirstdayinisoweek(year, week)
        context['week_last_day'] = context['week_first_day'] + timedelta(days=6)

Simon Daron's avatar
Simon Daron committed
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
        return context

program = ProgramView.as_view()

class TimeCell:
    nonstop = None
    w = 1
    h = 1
    time_label = None

    def __init__(self, i, j):
        self.x = i
        self.y = j
        self.schedules = []

    def add_schedule(self, schedule):
        end_time = schedule.datetime + timedelta(
                minutes=schedule.get_duration())
        self.time_label = '%02d:%02d-%02d:%02d' % (
                schedule.datetime.hour,
                schedule.datetime.minute,
                end_time.hour,
                end_time.minute)
        self.schedules.append(schedule)

    def __unicode__(self):
        if self.schedules:
            return ', '.join([x.emission.title for x in self.schedules])
        else:
            return self.nonstop

    def __eq__(self, other):
        return (unicode(self) == unicode(other) and self.time_label == other.time_label)


class Grid(TemplateView):
    template_name = 'grid.html'

    def get_context_data(self, **kwargs):
        context = super(Grid, self).get_context_data(**kwargs)
Simon Daron's avatar
Simon Daron committed
182
        context['sectionName'] = "Emissions"
Simon Daron's avatar
Simon Daron committed
183
184
185
186
187
188
189
190
191
192
193
194
195

        nb_lines = 2 * 24 # the cells are half hours
        grid = []

        times = ['%02d:%02d' % (x/2, x%2*30) for x in range(nb_lines)]
        # start grid after the night programs
        times = times[2*Schedule.DAY_HOUR_START:] + times[:2*Schedule.DAY_HOUR_START]

        nonstops = []
        for nonstop in Nonstop.objects.all():
            if nonstop.start < nonstop.end:
                nonstops.append([nonstop.start.hour + nonstop.start.minute/60.,
                                 nonstop.end.hour + nonstop.end.minute/60.,
fred's avatar
fred committed
196
                                 nonstop.title, nonstop.slug])
Simon Daron's avatar
Simon Daron committed
197
198
199
200
            else:
                # crossing midnight
                nonstops.append([nonstop.start.hour + nonstop.start.minute/60.,
                                 24,
fred's avatar
fred committed
201
                                 nonstop.title, nonstop.slug])
Simon Daron's avatar
Simon Daron committed
202
203
                nonstops.append([0,
                                 nonstop.end.hour + nonstop.end.minute/60.,
fred's avatar
fred committed
204
                                 nonstop.title, nonstop.slug])
Simon Daron's avatar
Simon Daron committed
205
206
207
208
209
210
211
212
213
214
        nonstops.sort()

        for i in range(nb_lines):
            grid.append([])
            for j in range(7):
                grid[-1].append(TimeCell(i, j))

            nonstop = [x for x in nonstops if i>=x[0]*2 and i<x[1]*2][0]
            for time_cell in grid[-1]:
                time_cell.nonstop = nonstop[2]
fred's avatar
fred committed
215
                time_cell.nonstop_slug = nonstop[3]
Simon Daron's avatar
Simon Daron committed
216
217
218
219
220
221
                if nonstop[1] == 5:
                    # the one ending at 5am will be cut down, so we inscribe
                    # its duration manually
                    time_cell.time_label = '%02d:00-%02d:00' % (
                            nonstop[0], nonstop[1])

222
223
        for schedule in Schedule.objects.prefetch_related(
                'emission__categories').select_related().order_by('datetime'):
Simon Daron's avatar
Simon Daron committed
224
225
226
227
228
229
230
231
232
233
234
235
            row_start = schedule.datetime.hour * 2 + \
                    int(math.ceil(schedule.datetime.minute / 30))
            day_no = schedule.get_weekday()

            for step in range(int(math.ceil(schedule.get_duration() / 30.))):
                if grid[(row_start+step)%nb_lines][day_no] is None:
                    grid[(row_start+step)%nb_lines][day_no] = TimeCell()
                grid[(row_start+step)%nb_lines][day_no].add_schedule(schedule)

        # start grid after the night programs
        grid = grid[2*Schedule.DAY_HOUR_START:] + grid[:2*Schedule.DAY_HOUR_START]

236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
        # look for the case where the same emission has different schedules for
        # the same time cell, for example if it lasts one hour the first week,
        # and two hours the third week.
        for i in range(nb_lines):
            grid[i] = [x for x in grid[i] if x is not None]
            for j, cell in enumerate(grid[i]):
                if grid[i][j] is None:
                    continue
                if len(grid[i][j].schedules) > 1:
                    time_cell_emissions = {}
                    for schedule in grid[i][j].schedules:
                        if not schedule.emission.id in time_cell_emissions:
                            time_cell_emissions[schedule.emission.id] = []
                        time_cell_emissions[schedule.emission.id].append(schedule)
                    for schedule_list in time_cell_emissions.values():
                        if len(schedule_list) == 1:
                            continue
                        # here it is, same cell, same emission, several
                        # schedules
255
256
257
258
259
260
261
262
263
264
265
                        schedule_list.sort(lambda x,y: cmp(x.get_duration(), y.get_duration()))

                        schedule = schedule_list[0]
                        end_time = schedule.datetime + timedelta(
                                minutes=schedule.get_duration())
                        grid[i][j].time_label = '%02d:%02d-%02d:%02d' % (
                                schedule.datetime.hour,
                                schedule.datetime.minute,
                                end_time.hour,
                                end_time.minute)

266
267
268
269
270
271
272
                        for schedule in schedule_list[1:]:
                            grid[i][j].schedules.remove(schedule)
                            end_time = schedule.datetime + timedelta(minutes=schedule.get_duration())
                            schedule_list[0].time_label_extra = ', -%02d:%02d %s' % (
                                    end_time.hour, end_time.minute, schedule.weeks_string)

        # merge adjacent
fred's avatar
fred committed
273
274
275

        # 1st thing is to merge cells on the same line, this will mostly catch
        # consecutive nonstop cells
Simon Daron's avatar
Simon Daron committed
276
277
278
279
280
281
        for i in range(nb_lines):
            for j, cell in enumerate(grid[i]):
                if grid[i][j] is None:
                    continue
                t = 1
                try:
fred's avatar
fred committed
282
283
                    # if the cells are identical, they are removed from the
                    # grid, and current cell width is increased
Simon Daron's avatar
Simon Daron committed
284
285
286
287
288
289
                    while grid[i][j+t] == cell:
                        cell.w += 1
                        grid[i][j+t] = None
                        t += 1
                except IndexError:
                    pass
fred's avatar
fred committed
290
291

            # once we're done we remove empty cells
Simon Daron's avatar
Simon Daron committed
292
293
            grid[i] = [x for x in grid[i] if x is not None]

fred's avatar
fred committed
294
295
        # 2nd thing is to merge cells vertically, this is emissions that last
        # for more than 30 minutes
Simon Daron's avatar
Simon Daron committed
296
297
298
299
300
301
302
303
        for i in range(nb_lines):
            grid[i] = [x for x in grid[i] if x is not None]
            for j, cell in enumerate(grid[i]):
                if grid[i][j] is None:
                    continue
                t = 1
                try:
                    while True:
fred's avatar
fred committed
304
                        # we look if the next time cell has the same emissions
Simon Daron's avatar
Simon Daron committed
305
306
                        same_cell_below = [(bj, x) for bj, x in enumerate(grid[i+cell.h])
                                           if x == cell and x.y == cell.y and x.w == cell.w]
fred's avatar
fred committed
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
                        if same_cell_below:
                            # if the cell was identical, we remove it and
                            # increase current cell height
                            bj, same_cell_below = same_cell_below[0]
                            del grid[i+cell.h][bj]
                            cell.h += 1
                        else:
                            # if the cell is different, we have a closer look
                            # to it, so we can remove emissions that will
                            # already be mentioned in the current cell.
                            #
                            # For example:
                            #  - 7am30, seuls contre tout, 1h30
                            #  - 8am, du pied gauche & la voix de la rue, 1h
                            # should produce: (this is case A)
                            #  |      7:30-9:00      |
                            #  |  seuls contre tout  |
                            #  |---------------------|
                            #  |      8:00-9:00      |
                            #  |   du pied gauche    |
                            #  |  la voix de la rue  |
                            #
                            # On the other hand, if all three emissions started
                            # at 7am30, we want: (this is case B)
                            #  |      7:30-9:00      |
                            #  |  seuls contre tout  |
                            #  |   du pied gauche    |
                            #  |  la voix de la rue  |
                            # that is we merge all of them, ignoring the fact
                            # that the other emissions will stop at 8am30
                            current_cell_schedules = set(grid[i][j].schedules)
338
                            current_cell_emissions = set([x.emission for x in current_cell_schedules])
fred's avatar
fred committed
339
340
341
342
343
344
345
                            cursor = 1
                            while True and current_cell_schedules:
                                same_cell_below = [x for x in grid[i+cursor] if x.y == grid[i][j].y]
                                if not same_cell_below:
                                    cursor += 1
                                    continue
                                same_cell_below = same_cell_below[0]
346
347
348
                                same_cell_below_emissions = set([x.emission for x in same_cell_below.schedules])

                                if current_cell_emissions.issubset(same_cell_below_emissions):
fred's avatar
fred committed
349
350
351
352
                                    # this handles case A (see comment above)
                                    for schedule in current_cell_schedules:
                                        if schedule in same_cell_below.schedules:
                                            same_cell_below.schedules.remove(schedule)
353
354
                                elif same_cell_below_emissions and \
                                        current_cell_emissions.issuperset(same_cell_below_emissions):
fred's avatar
fred committed
355
                                    # this handles case B (see comment above)
356
357
                                    # we set the cell time label to the longest
                                    # period
fred's avatar
fred committed
358
                                    grid[i][j].time_label = same_cell_below.time_label
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
                                    # then we sort emissions so the longest are
                                    # put first
                                    grid[i][j].schedules.sort(
                                            lambda x, y: -cmp(x.get_duration(), y.get_duration()))
                                    # then we add individual time labels to the
                                    # other schedules
                                    for schedule in current_cell_schedules:
                                        if schedule not in same_cell_below.schedules:
                                            end_time = schedule.datetime + timedelta(
                                                    minutes=schedule.get_duration())
                                            schedule.time_label = '%02d:%02d-%02d:%02d' % (
                                                    schedule.datetime.hour,
                                                    schedule.datetime.minute,
                                                    end_time.hour,
                                                    end_time.minute)
fred's avatar
fred committed
374
375
                                    grid[i][j].h += 1
                                    grid[i+cursor].remove(same_cell_below)
376
377
378
379
380
381
382
                                elif same_cell_below_emissions and \
                                        current_cell_emissions.intersection(same_cell_below_emissions):
                                    same_cell_below.schedules = [x for x in
                                            same_cell_below.schedules if
                                            x.emission not in
                                            current_cell_emissions or
                                            x.get_duration() < 30]
fred's avatar
fred committed
383
                                cursor += 1
Simon Daron's avatar
Simon Daron committed
384
385
386
387
388
389
390
391
392
393
                            break
                except IndexError:
                    pass

        # cut night at 3am
        grid = grid[:42]
        times = times[:42]

        context['grid'] = grid
        context['times'] = times
Simon Daron's avatar
Simon Daron committed
394
        context['categories'] = Category.objects.all()
Simon Daron's avatar
Simon Daron committed
395
396
397
398
399
400
401
402
403
404
405
406
407
        context['weekdays'] = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi',
                'Vendredi', 'Samedi', 'Dimanche']

        return context

grid = Grid.as_view()


class Home(TemplateView):
    template_name = 'home.html'

    def get_context_data(self, **kwargs):
        context = super(Home, self).get_context_data(**kwargs)
Simon Daron's avatar
Simon Daron committed
408
        context['sectionName'] = "Home"
fred's avatar
fred committed
409
410
        context['focus'] = Focus.objects.select_related('emission', 'newsitem',
                'soundfile', 'episode', 'newsitem__category').order_by('?')[:12]
411
412
        context['emissions'] = Emission.objects.filter(archived=False,
                creation_timestamp__gte=datetime(2013, 9, 13)).order_by('title')
413

414
415
        context['soundfiles'] = SoundFile.objects.prefetch_related('episode__emission__categories').filter(
                podcastable=True, fragment=False) \
416
417
418
419
420
421
                .select_related().extra(select={
                    'first_diffusion': 'emissions_diffusion.datetime', },
                    select_params=(False, True),
                    where=['''datetime = (SELECT MIN(datetime)
                                            FROM emissions_diffusion
                                        WHERE episode_id = emissions_episode.id)'''],
422
                    tables=['emissions_diffusion'],).order_by('-first_diffusion').distinct() [:3]
423

424
425
        context['newsletter_form'] = SubscribeForm()

Simon Daron's avatar
Simon Daron committed
426
427
428
429
        return context

home = Home.as_view()

Simon Daron's avatar
Simon Daron committed
430
class NewsItemView(DetailView):
Simon Daron's avatar
Simon Daron committed
431
432
    model = NewsItem
    def get_context_data(self, **kwargs):
Simon Daron's avatar
Simon Daron committed
433
        context = super(NewsItemView, self).get_context_data(**kwargs)
Simon Daron's avatar
Simon Daron committed
434
        context['sectionName'] = "News"
Simon Daron's avatar
Simon Daron committed
435
        context['categories'] = NewsCategory.objects.all()
436
        context['news'] = NewsItem.objects.all().order_by('-date')
Simon Daron's avatar
Simon Daron committed
437
        return context
Simon Daron's avatar
Simon Daron committed
438
newsitemview = NewsItemView.as_view()
Simon Daron's avatar
Simon Daron committed
439

Simon Daron's avatar
Simon Daron committed
440
441
442
443
class News(TemplateView):
    template_name = 'news.html'
    def get_context_data(self, **kwargs):
        context = super(News, self).get_context_data(**kwargs)
Simon Daron's avatar
Simon Daron committed
444
        context['sectionName'] = "News"
fred's avatar
fred committed
445
446
        newsitem_ids = [x.newsitem_id for x in Focus.objects.filter(newsitem__isnull=False)]
        context['focus'] = NewsItem.objects.filter(id__in=newsitem_ids).select_related('category').order_by('-date')[0:9]
447
        context['news'] = NewsItem.objects.all().order_by('-date')
Simon Daron's avatar
Simon Daron committed
448
449
450
451
        return context

news = News.as_view()

452

Simon Daron's avatar
Simon Daron committed
453
454
455
456
457
class Emissions(TemplateView):
    template_name = 'emissions.html'

    def get_context_data(self, **kwargs):
        context = super(Emissions, self).get_context_data(**kwargs)
Simon Daron's avatar
Simon Daron committed
458
        context['sectionName'] = "Emissions"
459
        context['emissions'] = Emission.objects.prefetch_related('categories').filter(archived=False).order_by('title')
Simon Daron's avatar
Simon Daron committed
460
        context['categories'] = Category.objects.all()
Simon Daron's avatar
Simon Daron committed
461
462
463
464
        return context

emissions = Emissions.as_view()

465
class EmissionsArchives(TemplateView):
466
    template_name = 'emissions/archives.html'
467

Simon Daron's avatar
Simon Daron committed
468
    def get_context_data(self, **kwargs):
469
        context = super(EmissionsArchives, self).get_context_data(**kwargs)
Simon Daron's avatar
Simon Daron committed
470
        context['sectionName'] = "Emissions"
fred's avatar
fred committed
471
        context['emissions'] = Emission.objects.prefetch_related('categories').filter(archived=True).order_by('title')
472
        context['categories'] = Category.objects.all()
Simon Daron's avatar
Simon Daron committed
473
        return context
474
475
emissionsArchives = EmissionsArchives.as_view()

Simon Daron's avatar
Simon Daron committed
476

Simon Daron's avatar
Simon Daron committed
477
478
479
480
481
class Listen(TemplateView):
    template_name = 'listen.html'

    def get_context_data(self, **kwargs):
        context = super(Listen, self).get_context_data(**kwargs)
Simon Daron's avatar
Simon Daron committed
482
        context['sectionName'] = "Listen"
483
484
        context['soundfiles'] = SoundFile.objects.prefetch_related('episode__emission__categories').filter(
                podcastable=True, fragment=False) \
485
486
487
488
489
490
                .select_related().extra(select={
                    'first_diffusion': 'emissions_diffusion.datetime', },
                    select_params=(False, True),
                    where=['''datetime = (SELECT MIN(datetime)
                                            FROM emissions_diffusion
                                        WHERE episode_id = emissions_episode.id)'''],
491
                    tables=['emissions_diffusion'],).order_by('-first_diffusion').distinct() [:10]
492

Simon Daron's avatar
Simon Daron committed
493
        context['categories'] = Category.objects.all()
fred's avatar
fred committed
494

Simon Daron's avatar
Simon Daron committed
495
496
497
498
        return context

listen = Listen.as_view()

499
@cache_control(max_age=25)
Simon Daron's avatar
Simon Daron committed
500
501
502
503
504
505
506
507
508
509
510
511
512
513
@csrf_exempt
@to_json('api')
def onair(request):
    d = whatsonair()
    if d.get('episode'):
        d['episode'] = {
            'title': d['episode'].title,
            'url': d['episode'].get_absolute_url()
        }
    if d.get('emission'):
        d['emission'] = {
            'title': d['emission'].title,
            'url': d['emission'].get_absolute_url()
        }
fred's avatar
fred committed
514
515
516
517
518
    if d.get('nonstop'):
        d['nonstop'] = {
            'title': d['nonstop'].title,
        }
    if d.get('current_slot'):
fred's avatar
fred committed
519
        del d['current_slot']
Simon Daron's avatar
Simon Daron committed
520
521
522
523
524
525
526
    return d


class NewsItemDetailView(DetailView):
    model = NewsItem

newsitem = NewsItemDetailView.as_view()
fred's avatar
fred committed
527
528


529
530
531
532
class PodcastsFeed(Feed):
    title = 'Radio Panik - Podcasts'
    link = '/'
    description_template = 'feed/soundfile.html'
fred's avatar
fred committed
533

534
535
536
537
538
539
540
541
    def items(self):
        return SoundFile.objects.select_related().filter(
                podcastable=True).order_by('-creation_timestamp')[:5]

    def item_title(self, item):
        if item.fragment:
            return '%s - %s' % (item.title, item.episode.title)
        return item.episode.title
fred's avatar
fred committed
542

543
544
545
546
    def item_link(self, item):
        return item.episode.get_absolute_url()

    def item_enclosure_url(self, item):
fred's avatar
fred committed
547
548
        current_site = Site.objects.get(id=settings.SITE_ID)
        return add_domain(current_site.domain, item.get_format_url('mp3'))
549
550
551
552
553
554
555
556

    def item_enclosure_length(self, item):
        sound_path = item.get_format_path('mp3')
        try:
            return os.stat(sound_path)[stat.ST_SIZE]
        except OSError:
            return 0

fred's avatar
fred committed
557
    def item_enclosure_mime_type(self, item):
558
559
560
561
562
563
        return 'audio/mpeg'

    def item_pubdate(self, item):
        return item.creation_timestamp

podcasts_feed = PodcastsFeed()
fred's avatar
fred committed
564
565
566
567
568
569
570
571


class FiberPageView(fiber.views.FiberTemplateView):
    def get_context_data(self, **kwargs):
        context = super(FiberPageView, self).get_context_data(**kwargs)
        context['sectionName'] = 'About'
        return context
fiber_page = FiberPageView.as_view()
fred's avatar
fred committed
572
573
574
575
576


class RssNewsFeed(Feed):
    title = 'Radio Panik'
    link = '/news/'
577
    description_template = 'feed/newsitem.html'
fred's avatar
fred committed
578
579
580
581
582
583
584
585
586
587

    def items(self):
        return NewsItem.objects.order_by('-date')[:10]

rss_news_feed = RssNewsFeed()

class AtomNewsFeed(RssNewsFeed):
    feed_type = Atom1Feed

atom_news_feed = AtomNewsFeed()