]> git.0d.be Git - panikweb-esperanzah.git/blob - panikweb_esperanzah/views.py
sync a bit of player with panik
[panikweb-esperanzah.git] / panikweb_esperanzah / views.py
1 import datetime
2 import os
3
4 import panikweb.views
5 from combo.data.models import Page
6 from django.conf import settings
7 from django.http import HttpResponseRedirect, JsonResponse
8 from django.urls import reverse
9 from django.views.generic.base import TemplateView
10 from emissions.models import Diffusion, Emission, Episode, NewsItem
11
12
13 class Home(panikweb.views.Home):
14     def get_context_data(self, **kwargs):
15         context = super().get_context_data(**kwargs)
16         context['emissions'] = list(Emission.objects.filter(archived=False).order_by('creation_timestamp'))
17         # force detour-vers-le-futur to go first
18         detour = [x for x in context['emissions'] if x.slug == 'detour-vers-le-futur']
19         context['emissions'] = detour + [x for x in context['emissions'] if x.slug != 'detour-vers-le-futur']
20         context['newsitems'] = (
21             NewsItem.objects.exclude(date__gt=datetime.date.today())
22             .exclude(expiration_date__lt=datetime.date.today())
23             .order_by('-date')[:3]
24         )
25         extra_pages = Page.objects.filter(exclude_from_navigation=False)
26         context['extra_pages_start'] = [
27             x for x in extra_pages if x.extra_variables.get('position') == 'start'
28         ]
29         context['extra_pages_end'] = [x for x in extra_pages if x.extra_variables.get('position') != 'start']
30         return context
31
32     def get(request, *args, **kwargs):
33         emissions = Emission.objects.filter(archived=False)
34         if len(emissions) == 1:
35             return HttpResponseRedirect(reverse('emission-view', kwargs={'slug': emissions[0].slug}))
36         return super().get(request, *args, **kwargs)
37
38
39 home = Home.as_view()
40
41
42 class EmissionDetailView(panikweb.views.EmissionDetailView):
43     def get_emission_context(self, emission, episode_ids=None):
44         context = super().get_emission_context(emission, episode_ids)
45
46         if emission.archived:
47             current_year = emission.creation_timestamp.replace(month=5, day=1)
48         else:
49             current_year = datetime.datetime.now().replace(month=5, day=1).replace(year=2023)
50
51         episodes_queryset = Episode.objects.select_related()
52         if episode_ids is not None:
53             episodes_queryset = episodes_queryset.filter(id__in=episode_ids)
54         else:
55             episodes_queryset = episodes_queryset.filter(emission=emission)
56
57         context['all_episodes'] = (
58             episodes_queryset.filter(creation_timestamp__gt=current_year)
59             .extra(
60                 select={
61                     'first_diffusion': 'emissions_diffusion.datetime',
62                 },
63                 select_params=(False, True),
64                 where=[
65                     '''datetime = (SELECT MIN(datetime)
66                                                 FROM emissions_diffusion
67                                                WHERE episode_id = emissions_episode.id
68                                              )'''
69                 ],
70                 tables=['emissions_diffusion'],
71             )
72             .order_by('first_diffusion')
73             .distinct()
74         )
75
76         return context
77
78
79 emission = EmissionDetailView.as_view()
80
81
82 class ArchivesView(TemplateView):
83     template_name = 'archives.html'
84
85     def get_context_data(self, **kwargs):
86         context = super().get_context_data(**kwargs)
87         context['diffusions'] = (
88             Diffusion.objects.filter(episode__soundfile__isnull=False)
89             .distinct()
90             .order_by('-datetime')
91             .select_related('episode', 'episode__emission')
92         )
93         return context
94
95
96 archives = ArchivesView.as_view()
97
98
99 def onair(request):
100     if datetime.date.today() >= datetime.date(2023, 8, 1):
101         return JsonResponse({'data': {'emission': {'title': 'Découvrez les podcasts !', 'url': '/'}}})
102
103     playing_txt = os.path.join(settings.MEDIA_ROOT, 'playing.txt')
104     if os.path.exists(playing_txt):
105         track_title = open(playing_txt).read().strip()
106         if len(track_title) > 4 and 'jingle' not in track_title.lower():
107             return JsonResponse({'data': {'emission': {'title': track_title, 'url': '/'}}})
108
109     return JsonResponse({'data': {'emission': {'title': 'Écoutez la radio !', 'url': '/'}}})