Use miniconf schedule based on sections
This commit is contained in:
parent
96cbe2d7ee
commit
2cce659c28
6 changed files with 96 additions and 32 deletions
|
@ -0,0 +1,9 @@
|
||||||
|
<a
|
||||||
|
class="nav-item nav-link {% if active %}active{% endif %}"
|
||||||
|
id="{{ section.schedule.section.slug }}-{{ timetable.day.date|date:"l"|lower}}-tab"
|
||||||
|
data-toggle="tab" href="#{{section.schedule.section.slug}}-{{ timetable.day.date|date:"l"|lower}}"
|
||||||
|
role="tab"
|
||||||
|
aria-controls="{{section.schedule.section.slug}}-{{ timetable.day.date|date:"l"|lower}}"
|
||||||
|
aria-selected="{% if active %}true{% else %}false{% endif %}">
|
||||||
|
{{ label }}
|
||||||
|
</a>
|
|
@ -21,16 +21,41 @@
|
||||||
|
|
||||||
<nav class="mb-4">
|
<nav class="mb-4">
|
||||||
<div class="nav schedule-nav" id="schedule-nav" role="tablist">
|
<div class="nav schedule-nav" id="schedule-nav" role="tablist">
|
||||||
|
Monday
|
||||||
{% for section in sections %}
|
{% for section in sections %}
|
||||||
|
{% if "Miniconf" in section.schedule.section.name %}
|
||||||
{% for timetable in section.days %}
|
{% for timetable in section.days %}
|
||||||
<a
|
{% if timetable.day.date|date:"Y-m-d" == "2019-01-21" %}
|
||||||
class="nav-item nav-link {% if forloop.first %}active{% endif %}" id="schedule_day_{{ timetable.day.date|date:"l"|lower}}-tab" data-toggle="tab" href="#{{ timetable.day.date|date:"l"|lower}}" role="tab" aria-controls="{{ timetable.day.date|date:"l"|lower}}" aria-selected="{% if forloop.first %}true{% else %}false{% endif %}">
|
<a class="nav-item nav-link" id="123" data-toggle="tab" href="#123" role="tab" aria-controls="123" aria-selected="false">
|
||||||
{{ timetable.day.date|date:"l"}}
|
{{ section.schedule.section.name }}
|
||||||
</a>
|
</a>
|
||||||
{% endfor %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
{% endif %}
|
||||||
</nav>
|
{% endfor %}
|
||||||
|
<br />
|
||||||
|
|
||||||
|
Tuesday
|
||||||
|
{% for section in sections %}
|
||||||
|
{% if "Miniconf" in section.schedule.section.name %}
|
||||||
|
{% for timetable in section.days %}
|
||||||
|
{% if timetable.day.date|date:"Y-m-d" == "2019-01-22" %}
|
||||||
|
{% include "symposion/schedule/_schedule_nav_link.html" with label=section.schedule.section.name %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
<br />
|
||||||
|
|
||||||
|
{% for section in sections %}
|
||||||
|
{% if "Miniconf" not in section.schedule.section.name %}
|
||||||
|
{% for timetable in section.days %}
|
||||||
|
{% include "symposion/schedule/_schedule_nav_link.html" with active=forloop.first label=timetable.day.date|date:"l" %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="schedule-page bg-secondary text-primary pt-4 pb-4 mb-0">
|
<div class="schedule-page bg-secondary text-primary pt-4 pb-4 mb-0">
|
||||||
|
@ -39,25 +64,21 @@
|
||||||
<div class="tab-content schedule-wrapper">
|
<div class="tab-content schedule-wrapper">
|
||||||
{% for section in sections %}
|
{% for section in sections %}
|
||||||
{% for timetable in section.days %}
|
{% for timetable in section.days %}
|
||||||
<div
|
<div class="tab-pane fade {% if timetable.day.date|date:'Y-m-d' == '2019-01-23' %}show active{% endif %}" id="{{ section.schedule.section.slug }}-{{ timetable.day.date|date:"l"|lower}}"
|
||||||
class="tab-pane fade {% if forloop.first %}show active{% endif %}"
|
role="tabpanel" aria-labelledby="{{ section.schedule.section.slug }}-{{ timetable.day.date|date:"l"|lower}}-tab">
|
||||||
id="{{ timetable.day.date|date:"l"|lower}}"
|
<div class="table-responsive hidden-md-down">
|
||||||
role="tabpanel"
|
{% include "symposion/schedule/_grid.html" %}
|
||||||
aria-labelledby="schedule_day_{{ timetable.day.date|date:"l"|lower}}-tab"
|
</div>
|
||||||
>
|
<div class="mobile-schedule">
|
||||||
<div class="table-responsive hidden-md-down">
|
{% include "symposion/schedule/_mobile.html" %}
|
||||||
{% include "symposion/schedule/_grid.html" %}
|
</div>
|
||||||
</div>
|
|
||||||
<div class="mobile-schedule">
|
|
||||||
{% include "symposion/schedule/_mobile.html" %}
|
|
||||||
</div>
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{%block footer_class %}footer-no-margin{% endblock %}
|
{%block footer_class %}footer-no-margin{% endblock %}
|
||||||
|
@ -74,9 +95,10 @@
|
||||||
var trailing = ' January 2019';
|
var trailing = ' January 2019';
|
||||||
|
|
||||||
$('a[data-toggle="tab"]').on('show.bs.tab', function (e) {
|
$('a[data-toggle="tab"]').on('show.bs.tab', function (e) {
|
||||||
var day = e.target.attributes['aria-controls'].value;
|
var day = e.target.attributes['aria-controls'].value.split('-');
|
||||||
|
day = day[day.length - 1];
|
||||||
$('#schedule-date').text(day + ' ' + dates[day] + trailing);
|
$('#schedule-date').text(day + ' ' + dates[day] + trailing);
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
{{ block.super }}
|
{{ block.super }}
|
||||||
{% endblock %}
|
{% endblock %}
|
|
@ -376,6 +376,10 @@ hr {
|
||||||
tr.calendar-row {
|
tr.calendar-row {
|
||||||
height: 120px;
|
height: 120px;
|
||||||
|
|
||||||
|
td.time {
|
||||||
|
width: 85px;
|
||||||
|
}
|
||||||
|
|
||||||
td.time > p {
|
td.time > p {
|
||||||
font-size: 1.25rem;
|
font-size: 1.25rem;
|
||||||
text-transform: lowercase;
|
text-transform: lowercase;
|
||||||
|
|
16
vendor/symposion/managers.py
vendored
Normal file
16
vendor/symposion/managers.py
vendored
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
from django.db.models import Manager
|
||||||
|
|
||||||
|
|
||||||
|
class DefaultSelectRelatedManager(Manager):
|
||||||
|
def get_queryset(self):
|
||||||
|
symposion_meta = getattr(self.model, 'SymposionMeta', None)
|
||||||
|
if symposion_meta is None:
|
||||||
|
return super().get_queryset()
|
||||||
|
|
||||||
|
select_related = getattr(symposion_meta, 'select_related', None)
|
||||||
|
if select_related is None:
|
||||||
|
return super().get_queryset()
|
||||||
|
|
||||||
|
|
||||||
|
return super().get_queryset().select_related(*select_related)
|
||||||
|
|
6
vendor/symposion/schedule/admin.py
vendored
6
vendor/symposion/schedule/admin.py
vendored
|
@ -33,14 +33,12 @@ update_slot_names.short_description = "Update slot names"
|
||||||
|
|
||||||
class SlotAdmin(admin.ModelAdmin):
|
class SlotAdmin(admin.ModelAdmin):
|
||||||
list_filter = ("day", "kind","exclusive","slotroom__room")
|
list_filter = ("day", "kind","exclusive","slotroom__room")
|
||||||
list_display = ("day", "start", "end", "kind", "room_names",
|
list_display = ("day", "start", "end", "kind", "room_names", "content_override", "exclusive")
|
||||||
"content_override","exclusive")
|
|
||||||
list_editable = ("exclusive","kind","start","end")
|
|
||||||
inlines = [SlotRoomInline]
|
inlines = [SlotRoomInline]
|
||||||
actions = [update_slot_names]
|
actions = [update_slot_names]
|
||||||
|
|
||||||
def room_names(self, slot):
|
def room_names(self, slot):
|
||||||
return ", ".join(room.name for room in slot.rooms.all())
|
return ", ".join(room.name for room in slot.rooms)
|
||||||
|
|
||||||
|
|
||||||
class RoomAdmin(admin.ModelAdmin):
|
class RoomAdmin(admin.ModelAdmin):
|
||||||
|
|
23
vendor/symposion/schedule/models.py
vendored
23
vendor/symposion/schedule/models.py
vendored
|
@ -5,6 +5,7 @@ from django.contrib.auth.models import User
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
from symposion.managers import DefaultSelectRelatedManager
|
||||||
from symposion.text_parser import parse
|
from symposion.text_parser import parse
|
||||||
from symposion.proposals.models import ProposalBase
|
from symposion.proposals.models import ProposalBase
|
||||||
from symposion.conference.models import Section
|
from symposion.conference.models import Section
|
||||||
|
@ -12,6 +13,7 @@ from symposion.speakers.models import Speaker
|
||||||
|
|
||||||
|
|
||||||
class Schedule(models.Model):
|
class Schedule(models.Model):
|
||||||
|
objects = DefaultSelectRelatedManager()
|
||||||
|
|
||||||
section = models.OneToOneField(Section, verbose_name=_("Section"))
|
section = models.OneToOneField(Section, verbose_name=_("Section"))
|
||||||
published = models.BooleanField(default=True, verbose_name=_("Published"))
|
published = models.BooleanField(default=True, verbose_name=_("Published"))
|
||||||
|
@ -20,6 +22,9 @@ class Schedule(models.Model):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s Schedule" % self.section
|
return "%s Schedule" % self.section
|
||||||
|
|
||||||
|
class SymposionMeta:
|
||||||
|
select_related = ('section', )
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ["section"]
|
ordering = ["section"]
|
||||||
verbose_name = _('Schedule')
|
verbose_name = _('Schedule')
|
||||||
|
@ -27,12 +32,17 @@ class Schedule(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Day(models.Model):
|
class Day(models.Model):
|
||||||
|
objects = DefaultSelectRelatedManager()
|
||||||
|
|
||||||
|
|
||||||
schedule = models.ForeignKey(Schedule, verbose_name=_("Schedule"))
|
schedule = models.ForeignKey(Schedule, verbose_name=_("Schedule"))
|
||||||
date = models.DateField(verbose_name=_("Date"))
|
date = models.DateField(verbose_name=_("Date"))
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "%s" % self.date
|
return "%s: %s" % (self.schedule.section.name, self.date)
|
||||||
|
|
||||||
|
class SymposionMeta:
|
||||||
|
select_related = ('schedule__section', )
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
unique_together = [("schedule", "date")]
|
unique_together = [("schedule", "date")]
|
||||||
|
@ -82,7 +92,7 @@ class SlotKind(models.Model):
|
||||||
label = models.CharField(max_length=50, verbose_name=_("Label"))
|
label = models.CharField(max_length=50, verbose_name=_("Label"))
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.label
|
return ": ".join((self.schedule.section.name, self.label))
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = _("Slot kind")
|
verbose_name = _("Slot kind")
|
||||||
|
@ -90,6 +100,7 @@ class SlotKind(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Slot(models.Model):
|
class Slot(models.Model):
|
||||||
|
objects = DefaultSelectRelatedManager()
|
||||||
|
|
||||||
name = models.CharField(max_length=512, editable=False)
|
name = models.CharField(max_length=512, editable=False)
|
||||||
day = models.ForeignKey(Day, verbose_name=_("Day"))
|
day = models.ForeignKey(Day, verbose_name=_("Day"))
|
||||||
|
@ -161,13 +172,16 @@ class Slot(models.Model):
|
||||||
return Room.objects.filter(pk__in=self.slotroom_set.values("room"))
|
return Room.objects.filter(pk__in=self.slotroom_set.values("room"))
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
roomlist = ' '.join(map(lambda r: r.__unicode__(), self.rooms))
|
roomlist = ' '.join(map(str, self.rooms))
|
||||||
self.name = "%s %s (%s - %s) %s" % (self.day, self.kind, self.start, self.end, roomlist)
|
self.name = "%s %s (%s - %s) %s" % (self.day, self.kind, self.start, self.end, roomlist)
|
||||||
self.content_override_html = parse(self.content_override)
|
self.content_override_html = parse(self.content_override)
|
||||||
super(Slot, self).save(*args, **kwargs)
|
super(Slot, self).save(*args, **kwargs)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
return "%s: %s" % (self.kind.schedule.section.name, self.name)
|
||||||
|
|
||||||
|
class SymposionMeta:
|
||||||
|
select_related = ('kind__schedule__section', 'day')
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
ordering = ["day", "start", "end"]
|
ordering = ["day", "start", "end"]
|
||||||
|
@ -194,6 +208,7 @@ class SlotRoom(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Presentation(models.Model):
|
class Presentation(models.Model):
|
||||||
|
objects = DefaultSelectRelatedManager()
|
||||||
|
|
||||||
slot = models.OneToOneField(Slot, null=True, blank=True, related_name="content_ptr", verbose_name=_("Slot"))
|
slot = models.OneToOneField(Slot, null=True, blank=True, related_name="content_ptr", verbose_name=_("Slot"))
|
||||||
title = models.CharField(max_length=100, verbose_name=_("Title"))
|
title = models.CharField(max_length=100, verbose_name=_("Title"))
|
||||||
|
|
Loading…
Reference in a new issue