Skip to content

Commit ea79102

Browse files
authored
Merge pull request #320 – Přidání času do modelu
#320
2 parents 836ba4a + e085e00 commit ea79102

File tree

12 files changed

+163
-10
lines changed

12 files changed

+163
-10
lines changed

naucse/models.py

Lines changed: 43 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from collections import OrderedDict
22
import copy
3+
import datetime
34

5+
import dateutil.tz
46
import jinja2
57

68
from naucse.modelutils import Model, YamlProperty, DataProperty, DirProperty
@@ -10,6 +12,8 @@
1012
from naucse.notebook_util import convert_notebook
1113
from pathlib import Path
1214

15+
_TIMEZONE = 'Europe/Prague'
16+
1317

1418
class Lesson(Model):
1519
"""An individual lesson stored on naucse"""
@@ -294,10 +298,11 @@ def merge_dict(base, patch):
294298

295299
class Session(Model):
296300
"""An ordered collection of materials"""
297-
def __init__(self, root, path, base_course, info, index):
301+
def __init__(self, root, path, base_course, info, index, course=None):
298302
super().__init__(root, path)
299303
base_name = info.get('base')
300304
self.index = index
305+
self.course = course
301306
if base_name is None:
302307
self.info = info
303308
else:
@@ -314,6 +319,23 @@ def __str__(self):
314319
slug = DataProperty(info)
315320
date = DataProperty(info, default=None)
316321

322+
def _time(self, key, default_time):
323+
if self.date and default_time:
324+
return datetime.datetime.combine(self.date, default_time)
325+
return None
326+
327+
@reify
328+
def start_time(self):
329+
if self.course:
330+
return self._time('start', self.course.default_start_time)
331+
return None
332+
333+
@reify
334+
def end_time(self):
335+
if self.course:
336+
return self._time('end', self.course.default_end_time)
337+
return None
338+
317339
@reify
318340
def materials(self):
319341
materials = [material(self.root, self.path, s)
@@ -352,7 +374,7 @@ def _get_sessions(course, plan):
352374
result = OrderedDict()
353375
for index, sess_info in enumerate(plan):
354376
session = Session(course.root, course.path, course.base_course,
355-
sess_info, index=index)
377+
sess_info, index=index, course=course)
356378
result[session.slug] = session
357379

358380
sessions = list(result.values())
@@ -424,6 +446,25 @@ def end_date(self):
424446
return None
425447
return max(dates)
426448

449+
def _default_time(self, key):
450+
default_time = self.info.get('default_time')
451+
if default_time:
452+
time_string = default_time[key]
453+
hour, minute = time_string.split(':')
454+
hour = int(hour)
455+
minute = int(minute)
456+
tzinfo = dateutil.tz.gettz(_TIMEZONE)
457+
return datetime.time(hour, minute, tzinfo=tzinfo)
458+
return None
459+
460+
@reify
461+
def default_start_time(self):
462+
return self._default_time('start')
463+
464+
@reify
465+
def default_end_time(self):
466+
return self._default_time('end')
467+
427468

428469
class RunYear(Model):
429470
"""A year of runs"""

naucse/routes.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -334,15 +334,19 @@ def course_calendar_ics(course):
334334
abort(404)
335335
calendar = ics.Calendar()
336336
for session in course.sessions.values():
337-
combined = datetime.datetime.combine(session.date, datetime.time())
337+
if session.start_time:
338+
start_time = session.start_time
339+
end_time = session.end_time
340+
else:
341+
abort(404)
338342
cal_event = ics.Event(
339343
name = session.title,
340-
begin = combined,
344+
begin = start_time,
345+
end = end_time,
341346
uid = url_for("session_coverpage",
342347
course=course,
343348
session=session.slug,
344349
_external=True),
345350
)
346-
cal_event.make_all_day()
347351
calendar.events.append(cal_event)
348352
return Response(str(calendar), mimetype="text/calendar")

naucse/templates.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,13 @@ def __str__(self):
170170
}
171171

172172

173+
@template_filter()
174+
def format_time(time):
175+
if time.second:
176+
return '{d.hour}:{d.minute:02}:{d.second:02}'.format(d=time)
177+
return '{d.hour}:{d.minute:02}'.format(d=time)
178+
179+
173180
@template_filter()
174181
def format_date(date, relative_to=None):
175182
return '{d.day}. {d.month}. {d.year}'.format(d=date)

naucse/templates/course.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ <h4>
5757
<div class="calendar-dates">
5858
{{ (course.start_date, course.end_date) | format_date_range }}
5959
</div>
60+
{% if course.default_start_time %}
61+
<div class="default-times">
62+
{{ course.default_start_time | format_time }}
63+
64+
{{ course.default_end_time | format_time }}
65+
</div>
66+
{% endif %}
6067
</div>
6168
<div class="card-footer small text-left">
6269
<ul class="list-unstyled" style="margin-bottom:0;">

naucse/templates/course_calendar.html

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,14 @@ <h1>{{ course.title }}</h1>
2828
{% if course.subtitle is defined and course.subtitle != None %}
2929
<h2>{{ course.subtitle }}</h2>
3030
{% endif%}
31-
<div>
32-
Přidej si kurz do svého kalendáře:
33-
<a href="{{ url_for('course_calendar_ics', course=course) }}">iCal</a>
34-
</div>
31+
{% if course.default_start_time %}
32+
<div>
33+
Přidej si kurz do svého kalendáře:
34+
<a href="{{ url_for('course_calendar_ics', course=course) }}">iCal</a>
35+
</div>
36+
{% else %}
37+
<!-- iCal link missing because course doesn't have info about start/end times. -->
38+
{% endif%}
3539
{% if course.start_date %}
3640
{% for year, month in months %}
3741
<h3 class="calendar-heading">

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,6 @@ jupyter_client
1010
mistune
1111
nbconvert
1212
pygments
13+
python-dateutil
1314
traitlets
1415
werkzeug

runs/2018/pyladies-brno-jaro/info.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
title: Začátečnický kurz PyLadies
22
subtitle: Brno - jaro 2018 - pondělí
33
time: 18:00–20:00
4+
default_time:
5+
start: '18:00'
6+
end: '20:00'
47
place: Experis, BC Titanuim, Nové sady 996/25
58
description: Naučte se Python vážně od začátku. Žádné předchozí znalosti nejsou potřeba.
69
long_description: |
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
title: A plain vanilla course
2+
3+
plan:
4+
- title: A normal lesson
5+
slug: normal-lesson
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
title: Test run with scheduled times
2+
default_time:
3+
start: '19:00'
4+
end: '21:00'
5+
6+
plan:
7+
- title: A normal lesson
8+
slug: normal-lesson
9+
date: 2000-01-01
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
title: Test run without scheduled times
2+
3+
plan:
4+
- title: A normal lesson
5+
slug: normal-lesson
6+
date: 2000-01-01

0 commit comments

Comments
 (0)