Skip to content
This repository was archived by the owner on Apr 29, 2022. It is now read-only.

Commit 55d2368

Browse files
authored
Enhance scheduler (#1286)
Update scheduling to use the track title in the display output instead of the track name. Enhance admin panels for events and tracks to allow easier inline editing. Update field names (translated Italian).
1 parent 811f652 commit 55d2368

File tree

6 files changed

+91
-12
lines changed

6 files changed

+91
-12
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.11.29 on 2020-05-20 14:15
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('conference', '0022_alter_sponsorincome_tags'),
12+
]
13+
14+
operations = [
15+
migrations.AlterField(
16+
model_name='schedule',
17+
name='conference',
18+
field=models.CharField(help_text='Name of the conference', max_length=20),
19+
),
20+
migrations.AlterField(
21+
model_name='track',
22+
name='order',
23+
field=models.PositiveIntegerField(default=0),
24+
),
25+
migrations.AlterField(
26+
model_name='track',
27+
name='title',
28+
field=models.TextField(help_text='HTML supported', verbose_name='Track title'),
29+
),
30+
migrations.AlterField(
31+
model_name='track',
32+
name='track',
33+
field=models.CharField(max_length=20, verbose_name='Track name'),
34+
),
35+
]

conference/models.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1070,7 +1070,7 @@ class Schedule(models.Model):
10701070
The latter can be the talk of the events or "custom" as the pyBirra,
10711071
and are connected to the track in the "weak" mode, through a tagfield.
10721072
"""
1073-
conference = models.CharField(help_text = 'nome della conferenza', max_length = 20)
1073+
conference = models.CharField(help_text = 'Name of the conference', max_length = 20)
10741074
slug = models.SlugField()
10751075
date = models.DateField()
10761076
description = models.TextField(blank=True)
@@ -1096,15 +1096,19 @@ def speakers(self):
10961096

10971097
class Track(models.Model):
10981098
schedule = models.ForeignKey(Schedule, on_delete=models.CASCADE)
1099-
track = models.CharField('nome track', max_length=20)
1100-
title = models.TextField('titolo della track', help_text='HTML supportato')
1099+
# XXX This should really be called "name", not "track"
1100+
track = models.CharField('Track name', max_length=20) # Internal track name
1101+
title = models.TextField('Track title', help_text='HTML supported') # Display name
11011102
seats = models.PositiveIntegerField(default=0)
1102-
order = models.PositiveIntegerField('ordine', default=0)
1103+
order = models.PositiveIntegerField(default=0)
11031104
translate = models.BooleanField(default=False)
11041105
outdoor = models.BooleanField(default=False)
11051106

11061107
def __str__(self):
1107-
return self.track
1108+
return self.title
1109+
1110+
def __repr__(self):
1111+
return 'Track(track=%r, title=%r)' % (self.track, self.title)
11081112

11091113

11101114
class EventManager(models.Manager):

conference/schedule.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,10 @@ def schedule(request, day=None, month=None):
112112
# )
113113

114114
times = []
115+
# Internal track names
115116
tracks = timetable._tracks
117+
# Display names of tracks
118+
titles = timetable._titles
116119
talks = []
117120

118121
all_times = set()
@@ -198,11 +201,16 @@ def schedule(request, day=None, month=None):
198201
schedule = ScheduleGrid(
199202
day=schedule_data["date"],
200203
tracks=tracks,
204+
titles=titles,
201205
talks=talks,
202206
grid=Grid(times=grid_times, rows=len(all_times), cols=len(tracks)),
203207
)
204208

205-
ctx = {"conference": settings.CONFERENCE_CONFERENCE, "schedule": schedule, "days": days}
209+
ctx = {
210+
"conference": settings.CONFERENCE_CONFERENCE,
211+
"schedule": schedule,
212+
"days": days,
213+
}
206214

207215
return render(request, "conference/schedule/schedule.html", ctx)
208216

@@ -245,6 +253,7 @@ class Grid:
245253
class ScheduleGrid:
246254
day: str
247255
tracks: typing.List[str]
256+
titles: typing.List[str]
248257
talks: typing.List[Talk]
249258
grid: Grid
250259

conference/utils.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,11 @@ def __init__(self, sid, events):
134134
self._analyzed = False
135135
self.events = events
136136
# Track list in the right order
137+
#
138+
# XXX This logic should really use the track objects or IDs rather than the strings
139+
#
137140
self._tracks = list(Track.objects.filter(schedule=sid).order_by('order').values_list('track', flat=True))
141+
self._titles = list(Track.objects.filter(schedule=sid).order_by('order').values_list('title', flat=True))
138142

139143
def __str__(self):
140144
return 'TimeTable2: %s - %s' % (self.sid, ', '.join(self._tracks))

p3/admin.py

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
from django.urls import reverse
22
from django.contrib import admin
3+
from django.db import models
4+
from django.forms import TextInput, Textarea
35

46
from taggit.forms import TagField
57
from taggit_labels.widgets import LabelWidget
@@ -186,23 +188,37 @@ class EventTrackInlineAdmin(admin.TabularInline):
186188

187189

188190
class EventAdmin(admin.ModelAdmin):
189-
list_display = ('schedule',
191+
list_display = ('_conference',
192+
'schedule',
190193
'start_time',
191194
'duration',
195+
'custom',
192196
'_title',
193197
'_tracks')
194198
ordering = ('schedule',
195199
'start_time',
196200
'tracks',
197201
)
198-
list_filter = ('schedule',
202+
list_filter = ('schedule__conference',
203+
'schedule',
199204
'tracks')
205+
list_editable = ('custom',
206+
)
200207
search_fields = ['talk__title',
201208
'custom',
202209
]
203210
inlines = (EventTrackInlineAdmin,
204211
)
205212

213+
# Display the custom textarea as TextInput for better layout
214+
formfield_overrides = {
215+
models.TextField: {'widget': TextInput(attrs={'size':'20', 'style':'min-width: 20em'})},
216+
}
217+
218+
219+
def _conference(self, obj):
220+
return obj.schedule.conference
221+
206222
def _tracks(self, obj):
207223
return ", ".join([track.track
208224
for track in obj.tracks.all()])
@@ -215,7 +231,8 @@ def _title(self, obj):
215231

216232

217233
class TrackAdmin(admin.ModelAdmin):
218-
list_display = ('schedule',
234+
list_display = ('_conference',
235+
'schedule',
219236
'_slug',
220237
'_date',
221238
'track',
@@ -226,11 +243,13 @@ class TrackAdmin(admin.ModelAdmin):
226243
'order',
227244
'track',
228245
)
229-
list_filter = ('schedule',
246+
list_filter = ('schedule__conference',
247+
'schedule',
230248
'schedule__slug',
231249
'track',
232250
'title')
233251
list_editable = ('track',
252+
'title',
234253
'order',
235254
)
236255
search_fields = ['schedule__conference',
@@ -242,6 +261,14 @@ class TrackAdmin(admin.ModelAdmin):
242261
)
243262
list_select_related = True
244263

264+
# Display the title textarea as TextInput for better layout
265+
formfield_overrides = {
266+
models.TextField: {'widget': TextInput(attrs={'size':'20'})},
267+
}
268+
269+
def _conference(self, obj):
270+
return obj.schedule.conference
271+
245272
def _slug(self, obj):
246273
return obj.schedule.slug
247274

templates/conference/schedule/schedule.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,8 @@
250250

251251
<div>
252252
<div class="schedule__grid schedule__grid--header schedule__talks_header" style="--cols: {{ schedule.grid.cols }}; --rows: 1;">
253-
{% for track in schedule.tracks %}
254-
<div>{{ track }}</div>
253+
{% for title in schedule.titles %}
254+
<div>{{ title|safe }}</div>
255255
{% endfor %}
256256
</div>
257257

0 commit comments

Comments
 (0)