Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • AlekSIS/official/AlekSIS-App-Chronos
  • sunweaver/AlekSIS-App-Chronos
  • sggua/AlekSIS-App-Chronos
  • tincmeKdenka/AlekSIS-App-Chronos
  • ligquamacti/AlekSIS-App-Chronos
  • 1crotatilhe/AlekSIS-App-Chronos
  • 1compluningi/AlekSIS-App-Chronos
  • starwardcarfi/AlekSIS-App-Chronos
  • ceohecholeg/AlekSIS-App-Chronos
  • 7quecontranchi/AlekSIS-App-Chronos
  • 8evsubcesza/AlekSIS-App-Chronos
  • unscinKibdzu/AlekSIS-App-Chronos
  • delucPchondmu/AlekSIS-App-Chronos
13 results
Show changes
Commits on Source (14)
Showing
with 806 additions and 411 deletions
#noqa
# noqa
from django.contrib import admin
from django.utils.html import format_html
......@@ -153,7 +153,7 @@ admin.site.register(Room, RoomAdmin)
class SubjectAdmin(admin.ModelAdmin):
def _colour(self, obj):
return colour_badge(obj.colour_fg, obj.colour_bg, obj.short_name, )
return colour_badge(obj.colour_fg, obj.colour_bg, obj.short_name,)
list_display = ("short_name", "name", "_colour")
list_display_links = ("short_name", "name")
......
......@@ -13,6 +13,7 @@ class ChronosConfig(AppConfig):
([2018, 2019, 2020], "Jonathan Weth", "wethjo@katharineum.de"),
([2018, 2019], "Frank Poetzsch-Heffter", "p-h@katharineum.de"),
([2019, 2020], "Dominik George", "dominik.george@teckids.org"),
([2019], "Julian Leucker", "leuckeju@katharineum.de"),
([2019], "Tom Teichler", "tom.teichler@teckids.org"),
([2019], "Hangzhi Yu", "yuha@katharineum.de"),
)
......@@ -12,5 +12,5 @@ class HintForm(Form):
class HintFilter(django_filters.FilterSet):
class Meta:
model = Hint
fields = ['from_date', "to_date", "classes", "teachers"]
fields = ["from_date", "to_date", "classes", "teachers"]
form = HintForm
......@@ -22,4 +22,6 @@ class LessonSubstitutionForm(forms.ModelForm):
}
AnnouncementForm.add_node_to_layout(Fieldset(_("Options for timetables"), "show_in_timetables"))
AnnouncementForm.add_node_to_layout(
Fieldset(_("Options for timetables"), "show_in_timetables")
)
import datetime
from timetable.models import Hint
def get_all_hints_by_date(date):
hints = filter_date(date)
return hints
def get_all_hints_by_class_and_time_period(_class, from_date, to_date):
hints_tmp = get_all_hints_by_time_period(from_date, to_date)
hints_match = []
for hint in hints_tmp:
if _class.id in [x.class_id for x in hint.classes.all()]:
hints_match.append(hint)
return hints_match
def get_all_hints_for_teachers_by_time_period(from_date, to_date):
hints_tmp = get_all_hints_by_time_period(from_date, to_date)
hints_match = []
for hint in hints_tmp:
if hint.teachers:
hints_match.append(hint)
return hints_match
def get_all_hints_not_for_teachers_by_time_period(from_date, to_date):
hints_tmp = get_all_hints_by_time_period(from_date, to_date)
hints_match = []
for hint in hints_tmp:
if not hint.teachers:
hints_match.append(hint)
return hints_match
def get_all_hints_by_time_period(from_date, to_date):
print(from_date, to_date)
delta = to_date - from_date
print(delta.days + 1)
week_days = [from_date + datetime.timedelta(days=i) for i in range(delta.days + 1)]
hints = []
for week_day in week_days:
hints_tmp = get_all_hints_by_date(week_day)
for hint in hints_tmp:
if hint not in hints:
hints.append(hint)
print(hints)
return hints
def filter_date(date):
hints = Hint.objects.filter(from_date__lte=date, to_date__gte=date).order_by("from_date", "classes")
return hints
......@@ -9,8 +9,12 @@ from django.db.models import F, Q, Count
from django.http import QueryDict
from aleksis.core.models import Person, Group
from aleksis.core.util.core_helpers import get_site_preferences
class TimetableType(Enum):
"""Enum for different types of timetables."""
GROUP = "group"
TEACHER = "teacher"
ROOM = "room"
......@@ -89,8 +93,10 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
""" Filter for all lessons within a calendar week. """
return self.within_dates(
wanted_week[0] + timedelta(days=1) * (F(self._period_path + "period__weekday") - 1),
wanted_week[0] + timedelta(days=1) * (F(self._period_path + "period__weekday") - 1),
wanted_week[0]
+ timedelta(days=1) * (F(self._period_path + "period__weekday") - 1),
wanted_week[0]
+ timedelta(days=1) * (F(self._period_path + "period__weekday") - 1),
).annotate_week(wanted_week)
def on_day(self, day: date):
......@@ -125,7 +131,9 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
return self.filter(
Q(**{self._period_path + "lesson__groups__members": person})
| Q(**{self._period_path + "lesson__groups__parent_groups__members": person})
| Q(
**{self._period_path + "lesson__groups__parent_groups__members": person}
)
)
def filter_group(self, group: Union[Group, int]):
......@@ -147,7 +155,12 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
""" Filter for all lessons given by a certain teacher. """
qs1 = self.filter(**{self._period_path + "lesson__teachers": teacher})
qs2 = self.filter(**{self._subst_path + "teachers": teacher, self._subst_path + "week": F("_week"), })
qs2 = self.filter(
**{
self._subst_path + "teachers": teacher,
self._subst_path + "week": F("_week"),
}
)
return qs1.union(qs2)
......@@ -155,11 +168,15 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
""" Filter for all lessons taking part in a certain room. """
qs1 = self.filter(**{self._period_path + "room": room})
qs2 = self.filter(**{self._subst_path + "room": room, self._subst_path + "week": F("_week"),})
qs2 = self.filter(
**{self._subst_path + "room": room, self._subst_path + "week": F("_week"),}
)
return qs1.union(qs2)
def group_by_periods(self, is_person: bool = False) -> dict:
"""Group a QuerySet of objects with attribute period by period numbers and weekdays."""
per_period = {}
for obj in self:
period = obj.period.period
......@@ -178,7 +195,11 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
return per_period
def filter_from_type(self, type_: TimetableType, pk: int) -> Optional[models.QuerySet]:
def filter_from_type(
self, type_: TimetableType, pk: int
) -> Optional[models.QuerySet]:
"""Filter lesson data for a group, teacher or room by provided type."""
if type_ == TimetableType.GROUP:
return self.filter_group(pk)
elif type_ == TimetableType.TEACHER:
......@@ -189,6 +210,8 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
return None
def filter_from_person(self, person: Person) -> Optional[models.QuerySet]:
"""Filter lesson data for a person."""
type_ = person.timetable_type
if type_ == TimetableType.TEACHER:
......@@ -205,7 +228,11 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
# If no student or teacher
return None
def daily_lessons_for_person(self, person: Person, wanted_day: date) -> Optional[models.QuerySet]:
def daily_lessons_for_person(
self, person: Person, wanted_day: date
) -> Optional[models.QuerySet]:
"""Filter lesson data on a day by a person."""
if person.timetable_type is None:
return None
......@@ -213,7 +240,9 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
return lesson_periods
def next(self, reference: "LessonPeriod", offset: Optional[int] = 1) -> "LessonPeriod":
def next(
self, reference: "LessonPeriod", offset: Optional[int] = 1
) -> "LessonPeriod":
""" Get another lesson in an ordered set of lessons.
By default, it returns the next lesson in the set. By passing the offset argument,
......@@ -234,17 +263,21 @@ class LessonDataQuerySet(models.QuerySet, WeekQuerySetMixin):
class LessonPeriodQuerySet(LessonDataQuerySet):
"""QuerySet with custom query methods for lesson periods."""
_period_path = ""
_subst_path = "substitutions__"
class LessonSubstitutionQuerySet(LessonDataQuerySet):
"""QuerySet with custom query methods for substitutions."""
_period_path = "lesson_period__"
_subst_path = ""
def affected_lessons(self):
""" Return all lessons which are affected by selected substitutions """
from .models import Lesson # noaq
from .models import Lesson # noaq
return Lesson.objects.filter(lesson_periods__substitutions__in=self)
......@@ -265,6 +298,11 @@ class LessonSubstitutionQuerySet(LessonDataQuerySet):
class DateRangeQuerySet(models.QuerySet):
"""QuerySet with custom query methods for models with date and period ranges.
Filterable fields: date_start, date_end, period_from, period_to
"""
def within_dates(self, start: date, end: date):
""" Filter for all events within a date range. """
......@@ -286,28 +324,41 @@ class DateRangeQuerySet(models.QuerySet):
now = when or datetime.now()
return self.on_day(now.date()).filter(
period_from__time_start__lte=now.time(),
period_to__time_end__gte=now.time()
period_from__time_start__lte=now.time(), period_to__time_end__gte=now.time()
)
class AbsenceQuerySet(DateRangeQuerySet):
"""QuerySet with custom query methods for absences."""
def absent_teachers(self):
return Person.objects.filter(absences__in=self).annotate(absences_count=Count("absences"))
return Person.objects.filter(absences__in=self).annotate(
absences_count=Count("absences")
)
def absent_groups(self):
return Group.objects.filter(absences__in=self).annotate(absences_count=Count("absences"))
return Group.objects.filter(absences__in=self).annotate(
absences_count=Count("absences")
)
def absent_rooms(self):
return Person.objects.filter(absences__in=self).annotate(absences_count=Count("absences"))
return Person.objects.filter(absences__in=self).annotate(
absences_count=Count("absences")
)
class HolidayQuerySet(DateRangeQuerySet):
"""QuerySet with custom query methods for holidays."""
pass
class SupervisionQuerySet(models.QuerySet, WeekQuerySetMixin):
"""QuerySet with custom query methods for supervisions."""
def filter_by_weekday(self, weekday: int):
"""Filter supervisions by weekday."""
self.filter(
Q(break_item__before_period__weekday=weekday)
| Q(break_item__after_period__weekday=weekday)
......@@ -324,13 +375,16 @@ class SupervisionQuerySet(models.QuerySet, WeekQuerySetMixin):
dates = [week[w] for w in range(0, 7)]
return self.filter(Q(substitutions__teacher=teacher, substitutions__date__in=dates) | Q(teacher=teacher))
return self.filter(
Q(substitutions__teacher=teacher, substitutions__date__in=dates)
| Q(teacher=teacher)
)
return self
class TimetableQuerySet(models.QuerySet):
""" Common filters
"""Common query set methods for objects in timetables.
Models need following fields:
- groups
......@@ -362,7 +416,7 @@ class TimetableQuerySet(models.QuerySet):
return self.filter(teachers=teacher)
def filter_room(self, room: Union[Room, int]):
def filter_room(self, room: Union["Room", int]):
""" Filter for all objects taking part in a certain room. """
if self._multiple_rooms:
......@@ -370,7 +424,11 @@ class TimetableQuerySet(models.QuerySet):
else:
return self.filter(room=room)
def filter_from_type(self, type_: TimetableType, pk: int) -> Optional[models.QuerySet]:
def filter_from_type(
self, type_: TimetableType, pk: int
) -> Optional[models.QuerySet]:
"""Filter data for a group, teacher or room by provided type."""
if type_ == TimetableType.GROUP:
return self.filter_group(pk)
elif type_ == TimetableType.TEACHER:
......@@ -381,6 +439,8 @@ class TimetableQuerySet(models.QuerySet):
return None
def filter_from_person(self, person: Person) -> Optional[models.QuerySet]:
"""Filter data by person."""
type_ = person.timetable_type
if type_ == TimetableType.TEACHER:
......@@ -399,6 +459,8 @@ class TimetableQuerySet(models.QuerySet):
class EventQuerySet(DateRangeQuerySet, TimetableQuerySet):
"""QuerySet with custom query methods for events."""
def annotate_day(self, day: date):
""" Annotate all events in the QuerySet with the provided date. """
......@@ -406,9 +468,13 @@ class EventQuerySet(DateRangeQuerySet, TimetableQuerySet):
class ExtraLessonQuerySet(TimetableQuerySet):
"""QuerySet with custom query methods for extra lessons."""
_multiple_rooms = False
def within_dates(self, start: date, end: date):
"""Filter all extra lessons within a specific time range."""
week_start = CalendarWeek.from_date(start)
week_end = CalendarWeek.from_date(end)
......@@ -419,11 +485,18 @@ class ExtraLessonQuerySet(TimetableQuerySet):
period__weekday__lte=end.weekday(),
)
def on_day(self, day:date):
def on_day(self, day: date):
"""Filter all extra lessons on a day."""
return self.within_dates(day, day)
class GroupPropertiesMixin:
"""Mixin for common group properties.
Needed field: `groups`
"""
@property
def group_names(self, sep: Optional[str] = ", ") -> str:
return sep.join([group.short_name for group in self.groups.all()])
......@@ -431,7 +504,11 @@ class GroupPropertiesMixin:
@property
def groups_to_show(self) -> models.QuerySet:
groups = self.groups.all()
if groups.count() == 1 and groups[0].parent_groups.all() and get_site_preferences()["chronos__use_parent_groups"]:
if (
groups.count() == 1
and groups[0].parent_groups.all()
and get_site_preferences()["chronos__use_parent_groups"]
):
return groups[0].parent_groups.all()
else:
return groups
......@@ -442,6 +519,11 @@ class GroupPropertiesMixin:
class TeacherPropertiesMixin:
"""Mixin for common teacher properties.
Needed field: `teacher`
"""
@property
def teacher_names(self, sep: Optional[str] = ", ") -> str:
return sep.join([teacher.full_name for teacher in self.teachers.all()])
......@@ -17,7 +17,10 @@ MENUS = {
"url": "my_timetable",
"icon": "person",
"validators": [
("aleksis.core.util.predicates.permission_validator", "chronos.view_my_timetable"),
(
"aleksis.core.util.predicates.permission_validator",
"chronos.view_my_timetable",
),
],
},
{
......@@ -25,7 +28,10 @@ MENUS = {
"url": "all_timetables",
"icon": "grid_on",
"validators": [
("aleksis.core.util.predicates.permission_validator", "chronos.view_timetable_overview"),
(
"aleksis.core.util.predicates.permission_validator",
"chronos.view_timetable_overview",
),
],
},
{
......@@ -33,7 +39,10 @@ MENUS = {
"url": "lessons_day",
"icon": "calendar_today",
"validators": [
("aleksis.core.util.predicates.permission_validator", "chronos.view_lessons_day"),
(
"aleksis.core.util.predicates.permission_validator",
"chronos.view_lessons_day",
),
],
},
{
......@@ -41,7 +50,10 @@ MENUS = {
"url": "substitutions",
"icon": "update",
"validators": [
("aleksis.core.util.predicates.permission_validator", "chronos.view_substitutions"),
(
"aleksis.core.util.predicates.permission_validator",
"chronos.view_substitutions",
),
],
},
],
......
......@@ -6,69 +6,53 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('core', '0008_rename_fields_notification_activity'),
('chronos', '0004_room_name_not_unique'),
("core", "0008_rename_fields_notification_activity"),
("chronos", "0004_room_name_not_unique"),
]
operations = [
migrations.RemoveField(
model_name='lesson',
name='school',
),
migrations.RemoveField(
model_name='lessonperiod',
name='school',
),
migrations.RemoveField(model_name="lesson", name="school",),
migrations.RemoveField(model_name="lessonperiod", name="school",),
migrations.AlterField(
model_name='lesson',
name='teachers',
field=models.ManyToManyField(related_name='lessons_as_teacher', to='core.Person'),
model_name="lesson",
name="teachers",
field=models.ManyToManyField(
related_name="lessons_as_teacher", to="core.Person"
),
),
migrations.AlterField(
model_name='room',
name='short_name',
field=models.CharField(max_length=10, unique=True, verbose_name='Short name, e.g. room number'),
model_name="room",
name="short_name",
field=models.CharField(
max_length=10, unique=True, verbose_name="Short name, e.g. room number"
),
),
migrations.AlterField(
model_name='subject',
name='abbrev',
field=models.CharField(max_length=10, unique=True, verbose_name='Abbreviation of subject in timetable'),
model_name="subject",
name="abbrev",
field=models.CharField(
max_length=10,
unique=True,
verbose_name="Abbreviation of subject in timetable",
),
),
migrations.AlterField(
model_name='subject',
name='name',
field=models.CharField(max_length=30, unique=True, verbose_name='Long name of subject'),
),
migrations.AlterUniqueTogether(
name='lessonsubstitution',
unique_together={('lesson_period', 'week')},
),
migrations.AlterUniqueTogether(
name='room',
unique_together=set(),
model_name="subject",
name="name",
field=models.CharField(
max_length=30, unique=True, verbose_name="Long name of subject"
),
),
migrations.AlterUniqueTogether(
name='subject',
unique_together=set(),
name="lessonsubstitution", unique_together={("lesson_period", "week")},
),
migrations.AlterUniqueTogether(name="room", unique_together=set(),),
migrations.AlterUniqueTogether(name="subject", unique_together=set(),),
migrations.AlterUniqueTogether(
name='timeperiod',
unique_together={('weekday', 'period')},
),
migrations.RemoveField(
model_name='lessonsubstitution',
name='school',
),
migrations.RemoveField(
model_name='room',
name='school',
),
migrations.RemoveField(
model_name='subject',
name='school',
),
migrations.RemoveField(
model_name='timeperiod',
name='school',
name="timeperiod", unique_together={("weekday", "period")},
),
migrations.RemoveField(model_name="lessonsubstitution", name="school",),
migrations.RemoveField(model_name="room", name="school",),
migrations.RemoveField(model_name="subject", name="school",),
migrations.RemoveField(model_name="timeperiod", name="school",),
]
......@@ -7,13 +7,15 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chronos', '0005_remove_school_related'),
("chronos", "0005_remove_school_related"),
]
operations = [
migrations.AddField(
model_name='lessonperiod',
name='extended_data',
field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False),
model_name="lessonperiod",
name="extended_data",
field=django.contrib.postgres.fields.jsonb.JSONField(
default=dict, editable=False
),
),
]
......@@ -7,38 +7,45 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('chronos', '0007_advanced_models_from_untis'),
("chronos", "0007_advanced_models_from_untis"),
]
operations = [
migrations.RemoveIndex(
model_name='break',
name='chronos_bre_weekday_165338_idx',
),
migrations.RemoveField(
model_name='break',
name='time_end',
),
migrations.RemoveField(
model_name='break',
name='time_start',
),
migrations.RemoveField(
model_name='break',
name='weekday',
model_name="break", name="chronos_bre_weekday_165338_idx",
),
migrations.RemoveField(model_name="break", name="time_end",),
migrations.RemoveField(model_name="break", name="time_start",),
migrations.RemoveField(model_name="break", name="weekday",),
migrations.AddField(
model_name='break',
name='after_period',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='break_after', to='chronos.TimePeriod', verbose_name='Effective start of break'),
model_name="break",
name="after_period",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="break_after",
to="chronos.TimePeriod",
verbose_name="Effective start of break",
),
),
migrations.AddField(
model_name='break',
name='before_period',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='break_before', to='chronos.TimePeriod', verbose_name='Effective end of break'),
model_name="break",
name="before_period",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="break_before",
to="chronos.TimePeriod",
verbose_name="Effective end of break",
),
),
migrations.AddIndex(
model_name='break',
index=models.Index(fields=['after_period', 'before_period'], name='chronos_bre_after_p_0f28d3_idx'),
model_name="break",
index=models.Index(
fields=["after_period", "before_period"],
name="chronos_bre_after_p_0f28d3_idx",
),
),
]
......@@ -7,33 +7,43 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chronos', '0008_break_period'),
("chronos", "0008_break_period"),
]
operations = [
migrations.AddField(
model_name='lesson',
name='extended_data',
field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False),
model_name="lesson",
name="extended_data",
field=django.contrib.postgres.fields.jsonb.JSONField(
default=dict, editable=False
),
),
migrations.AddField(
model_name='lessonsubstitution',
name='extended_data',
field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False),
model_name="lessonsubstitution",
name="extended_data",
field=django.contrib.postgres.fields.jsonb.JSONField(
default=dict, editable=False
),
),
migrations.AddField(
model_name='room',
name='extended_data',
field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False),
model_name="room",
name="extended_data",
field=django.contrib.postgres.fields.jsonb.JSONField(
default=dict, editable=False
),
),
migrations.AddField(
model_name='subject',
name='extended_data',
field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False),
model_name="subject",
name="extended_data",
field=django.contrib.postgres.fields.jsonb.JSONField(
default=dict, editable=False
),
),
migrations.AddField(
model_name='timeperiod',
name='extended_data',
field=django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False),
model_name="timeperiod",
name="extended_data",
field=django.contrib.postgres.fields.jsonb.JSONField(
default=dict, editable=False
),
),
]
......@@ -7,27 +7,29 @@ from django.db.models import F
class Migration(migrations.Migration):
dependencies = [
('chronos', '0009_extended_data'),
("chronos", "0009_extended_data"),
]
operations = [
migrations.AddField(
model_name='absencereason',
name='name',
field=models.CharField(default=F("description"), blank=True, max_length=255, null=True, verbose_name='Name'),
model_name="absencereason",
name="name",
field=models.CharField(
default=F("description"),
blank=True,
max_length=255,
null=True,
verbose_name="Name",
),
),
migrations.AddField(
model_name='absencereason',
name='short_name',
field=models.CharField(default=F("title"), max_length=255, verbose_name='Short name'),
model_name="absencereason",
name="short_name",
field=models.CharField(
default=F("title"), max_length=255, verbose_name="Short name"
),
preserve_default=False,
),
migrations.RemoveField(
model_name='absencereason',
name='description',
),
migrations.RemoveField(
model_name='absencereason',
name='title',
),
migrations.RemoveField(model_name="absencereason", name="description",),
migrations.RemoveField(model_name="absencereason", name="title",),
]
......@@ -7,27 +7,42 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('chronos', '0010_absence_reason_name'),
("chronos", "0010_absence_reason_name"),
]
operations = [
migrations.RemoveField(
model_name='absence',
name='person',
),
migrations.RemoveField(model_name="absence", name="person",),
migrations.AddField(
model_name='absence',
name='group',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='absences', to='core.Group'),
model_name="absence",
name="group",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="absences",
to="core.Group",
),
),
migrations.AddField(
model_name='absence',
name='room',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='absences', to='chronos.Room'),
model_name="absence",
name="room",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="absences",
to="chronos.Room",
),
),
migrations.AddField(
model_name='absence',
name='teacher',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='absences', to='core.Person'),
model_name="absence",
name="teacher",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="absences",
to="core.Person",
),
),
]
......@@ -6,12 +6,9 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chronos', '0011_absence_for_groups_and_rooms'),
("chronos", "0011_absence_for_groups_and_rooms"),
]
operations = [
migrations.RemoveField(
model_name='event',
name='absence_reason',
),
migrations.RemoveField(model_name="event", name="absence_reason",),
]
......@@ -6,13 +6,15 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chronos', '0012_event_remove_absence_reason'),
("chronos", "0012_event_remove_absence_reason"),
]
operations = [
migrations.AlterField(
model_name='event',
name='title',
field=models.CharField(blank=True, max_length=255, null=True, verbose_name='Title'),
model_name="event",
name="title",
field=models.CharField(
blank=True, max_length=255, null=True, verbose_name="Title"
),
),
]
......@@ -9,45 +9,88 @@ import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('chronos', '0013_event_title_optional'),
("chronos", "0013_event_title_optional"),
]
operations = [
migrations.CreateModel(
name='ExtraLesson',
name="ExtraLesson",
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('extended_data', django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False)),
('week', models.IntegerField(default=calendarweek.calendarweek.CalendarWeek.current_week, verbose_name='Week')),
('comment', models.CharField(blank=True, max_length=255, null=True, verbose_name='Comment')),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"extended_data",
django.contrib.postgres.fields.jsonb.JSONField(
default=dict, editable=False
),
),
(
"week",
models.IntegerField(
default=calendarweek.calendarweek.CalendarWeek.current_week,
verbose_name="Week",
),
),
(
"comment",
models.CharField(
blank=True, max_length=255, null=True, verbose_name="Comment"
),
),
],
options={
'abstract': False,
},
options={"abstract": False,},
),
migrations.AddField(
model_name='extralesson',
name='groups',
field=models.ManyToManyField(related_name='extra_lessons', to='core.Group', verbose_name='Groups'),
model_name="extralesson",
name="groups",
field=models.ManyToManyField(
related_name="extra_lessons", to="core.Group", verbose_name="Groups"
),
),
migrations.AddField(
model_name='extralesson',
name='period',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extra_lessons', to='chronos.TimePeriod'),
model_name="extralesson",
name="period",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="extra_lessons",
to="chronos.TimePeriod",
),
),
migrations.AddField(
model_name='extralesson',
name='room',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='extra_lessons', to='chronos.Room', verbose_name='Room'),
model_name="extralesson",
name="room",
field=models.ForeignKey(
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name="extra_lessons",
to="chronos.Room",
verbose_name="Room",
),
),
migrations.AddField(
model_name='extralesson',
name='subject',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='extra_lessons', to='chronos.Subject', verbose_name='Subject'),
model_name="extralesson",
name="subject",
field=models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
related_name="extra_lessons",
to="chronos.Subject",
verbose_name="Subject",
),
),
migrations.AddField(
model_name='extralesson',
name='teachers',
field=models.ManyToManyField(related_name='extra_lessons_as_teacher', to='core.Person', verbose_name='Teachers'),
model_name="extralesson",
name="teachers",
field=models.ManyToManyField(
related_name="extra_lessons_as_teacher",
to="core.Person",
verbose_name="Teachers",
),
),
]
......@@ -7,17 +7,14 @@ from django.db.models import F
class Migration(migrations.Migration):
dependencies = [
('chronos', '0014_extra_lesson'),
("chronos", "0014_extra_lesson"),
]
operations = [
migrations.RenameField(
model_name='subject',
old_name='abbrev',
new_name='short_name',
model_name="subject", old_name="abbrev", new_name="short_name",
),
migrations.AlterModelOptions(
name='subject',
options={'ordering': ['name', 'short_name']},
name="subject", options={"ordering": ["name", "short_name"]},
),
]
......@@ -7,19 +7,36 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chronos', '0015_rename_abbrev_to_short_name'),
("chronos", "0015_rename_abbrev_to_short_name"),
]
operations = [
migrations.CreateModel(
name='GlobalPermissions',
name="GlobalPermissions",
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('extended_data', django.contrib.postgres.fields.jsonb.JSONField(default=dict, editable=False)),
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
(
"extended_data",
django.contrib.postgres.fields.jsonb.JSONField(
default=dict, editable=False
),
),
],
options={
'permissions': (('view_all_timetables', 'Can view all timetables'), ('view_timetable_overview', 'Can view timetable overview'), ('view_lessons_day', 'Can view all lessons per day')),
'managed': False,
"permissions": (
("view_all_timetables", "Can view all timetables"),
("view_timetable_overview", "Can view timetable overview"),
("view_lessons_day", "Can view all lessons per day"),
),
"managed": False,
},
),
]
......@@ -88,8 +88,13 @@ def lesson_periods_as_teacher(self):
def for_timetables(cls):
"""Return all announcements that should be shown in timetable views."""
return cls.objects.filter(show_in_timetables=True)
Announcement.class_method(for_timetables)
Announcement.field(show_in_timetables=BooleanField(verbose_name=_("Show announcement in timetable views?")))
Announcement.field(
show_in_timetables=BooleanField(
verbose_name=_("Show announcement in timetable views?")
)
)