]> git.0d.be Git - panikweb-esperanzah.git/blob - panikweb/views.py
3b1c71fade4e85059a6f2c2a9847a19d38c91668
[panikweb-esperanzah.git] / panikweb / views.py
1 from datetime import datetime, timedelta
2 import math
3
4 from django.views.generic.base import TemplateView
5
6 from emissions.models import Emission, Episode, Diffusion, SoundFile, Schedule
7
8 class ProgramView(TemplateView):
9     template_name = 'program.html'
10
11     def get_context_data(self, **kwargs):
12         context = super(ProgramView, self).get_context_data(**kwargs)
13         schedules = Schedule.objects.all().order_by('datetime')
14         days = []
15         for day in range(7):
16             days.append({'schedules': [x for x in schedules if x.is_on_weekday(day+1)],
17                          'datetime': datetime(2007, 1, day+1)})
18         context['days'] = days
19         return context
20
21 program = ProgramView.as_view()
22
23 class TimeCell:
24     emissions = None
25     nonstop = None
26     w = 1
27     h = 1
28     time_label = None
29
30     def __init__(self, i, j):
31         self.x = i
32         self.y = j
33         self.schedules = []
34
35     def add_schedule(self, schedule):
36         end_time = schedule.datetime + timedelta(
37                 minutes=schedule.emission.duration)
38         self.time_label = '%02d:%02d-%02d:%02d' % (
39                 schedule.datetime.hour,
40                 schedule.datetime.minute,
41                 end_time.hour,
42                 end_time.minute)
43         self.schedules.append(schedule)
44
45     def __unicode__(self):
46         if self.schedules:
47             return ', '.join([x.emission.title for x in self.schedules])
48         else:
49             return self.nonstop
50
51     def __eq__(self, other):
52         return (unicode(self) == unicode(other))
53
54
55 class Grid(TemplateView):
56     template_name = 'grid.html'
57
58     def get_context_data(self, **kwargs):
59         context = super(Grid, self).get_context_data(**kwargs)
60         schedules = Schedule.objects.all().order_by('datetime')
61
62         nb_lines = 2 * 24 # the cells are half hours
63         grid = []
64
65         times = ['%02d:%02d' % (x/2, x%2*30) for x in range(nb_lines)]
66         # start grid after the night programs
67         times = times[2*Schedule.DAY_HOUR_START:] + times[:2*Schedule.DAY_HOUR_START]
68
69         nonstops = [[0, 2, 'Biodiversite'],
70                     [2, 5, 'Reveries'],
71                     [5, 7.5, 'La Panique'],
72                     [7.5, 10, 'Matin tranquille'],
73                     [10, 12, 'Up Beat Tempo'],
74                     [12, 13, 'L\'heure de pointe'],
75                     [13, 16, 'Le Mange Disque'],
76                     [16, 19, 'Hop Bop and co'],
77                     [19, 22, 'Acouphene'],
78                     [22, 24, 'Biodiversite']
79                    ]
80
81         for i in range(nb_lines):
82             grid.append([])
83             for j in range(7):
84                 grid[-1].append(TimeCell(i, j))
85
86             nonstop = [x for x in nonstops if i>=x[0]*2 and i<x[1]*2][0]
87             for time_cell in grid[-1]:
88                 time_cell.nonstop = nonstop[2]
89                 if nonstop[2] == 'Reveries':
90                     time_cell.time_label = '02:00-05:00'
91
92         for schedule in Schedule.objects.all():
93             row_start = schedule.datetime.hour * 2 + \
94                     int(math.ceil(schedule.datetime.minute / 30))
95             day_no = schedule.get_weekday()
96
97             for step in range(int(math.ceil(schedule.emission.duration / 30))):
98                 if grid[(row_start+step)%nb_lines][day_no] is None:
99                     grid[(row_start+step)%nb_lines][day_no] = TimeCell()
100                 grid[(row_start+step)%nb_lines][day_no].add_schedule(schedule)
101
102         # start grid after the night programs
103         grid = grid[2*Schedule.DAY_HOUR_START:] + grid[:2*Schedule.DAY_HOUR_START]
104
105         # merge adjacent cells
106         for i in range(nb_lines):
107             for j, cell in enumerate(grid[i]):
108                 if grid[i][j] is None:
109                     continue
110                 t = 1
111                 try:
112                     while grid[i][j+t] == cell:
113                         cell.w += 1
114                         grid[i][j+t] = None
115                         t += 1
116                 except IndexError:
117                     pass
118             grid[i] = [x for x in grid[i] if x is not None]
119
120         for i in range(nb_lines):
121             grid[i] = [x for x in grid[i] if x is not None]
122             for j, cell in enumerate(grid[i]):
123                 if grid[i][j] is None:
124                     continue
125                 t = 1
126                 try:
127                     while True:
128                         same_cell_below = [(bj, x) for bj, x in enumerate(grid[i+cell.h])
129                                            if x == cell and x.y == cell.y and x.w == cell.w]
130                         if not same_cell_below:
131                             break
132                         bj, same_cell_below = same_cell_below[0]
133                         del grid[i+cell.h][bj]
134                         cell.h += 1
135                 except IndexError:
136                     pass
137
138         # cut night at 3am
139         grid = grid[:42]
140         times = times[:42]
141
142         context['grid'] = grid
143         context['times'] = times
144         context['weekdays'] = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi',
145                 'Vendredi', 'Samedi', 'Dimanche']
146
147         return context
148
149 grid = Grid.as_view()
150
151
152 class Home(TemplateView):
153     template_name = 'home.html'
154
155     def get_context_data(self, **kwargs):
156         context = super(Home, self).get_context_data(**kwargs)
157         context['emissions'] = Emission.objects.filter(archived=False).order_by('?')
158         return context
159
160 home = Home.as_view()
161
162 class Get(TemplateView):
163     template_name = 'get.html'
164
165     def get_context_data(self, **kwargs):
166         context = super(Get, self).get_context_data(**kwargs)
167         context['emissions'] = Emission.objects.all().order_by('title')
168         return context
169
170 get = Get.as_view()
171
172 class WhatsOnAir(TemplateView):
173     template_name = 'whatsonair.html'
174     def get_context_data(self, **kwargs):
175         context = super(WhatsOnAir, self).get_context_data(**kwargs)
176         now = datetime.now()
177         date_start = now - timedelta(days=1)
178         date_end = now + timedelta(days=1)
179         diffusions = Diffusion.objects.filter(
180                 datetime__range=(date_start, date_end)).order_by('datetime')
181         diffusions = [x for x in diffusions if x.datetime <= now and
182                         now <= x.datetime + timedelta(minutes=x.episode.emission.duration)]
183
184         episode = None
185         emission = None
186         if diffusions: # there should be only one
187             diffusion = diffusions[0]
188             episode = diffusion.episode
189             emission = episode.emission
190         else:
191             for schedule in Schedule.objects.all():
192                 if not schedule.matches(now):
193                     continue
194                 emission = schedule.emission
195                 break
196
197         context['episode'] = episode
198         context['emission'] = emission
199         return context
200
201 what = WhatsOnAir.as_view()
202
203 class Player(TemplateView):
204     template_name = 'player.html'
205
206     def get_context_data(self, **kwargs):
207         context = super(Player, self).get_context_data(**kwargs)
208         #context['whatsonair'] = WhatsOnAir.as_view() #HOW TO PRELOAD WHATSONAIR ON PLAYER?
209         return context
210
211 player = Player.as_view()
212
213