from django.contrib import admin from django.forms import ModelForm from django.utils.translation import gettext_lazy as _ from ..models import Program, Schedule, Stream from .page import PageAdmin # In order to simplify schedule_post_save algorithm, an existing schedule can't # update the following fields: "frequency", "date" class ScheduleInlineForm(ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) if self.initial: self.fields["date"].disabled = True self.fields["frequency"].disabled = True class ScheduleInline(admin.TabularInline): model = Schedule form = ScheduleInlineForm readonly_fields = ("timezone",) extra = 1 class StreamInline(admin.TabularInline): model = Stream fields = ["delay", "begin", "end"] extra = 1 @admin.register(Program) class ProgramAdmin(PageAdmin): def schedule(self, obj): return Schedule.objects.filter(program=obj).count() > 0 schedule.boolean = True schedule.short_description = _("Schedule") list_display = PageAdmin.list_display + ("schedule", "station", "active") list_filter = PageAdmin.list_filter + ("station", "active") prepopulated_fields = {"slug": ("title",)} search_fields = ("title",) inlines = [ScheduleInline, StreamInline] def get_fieldsets(self, request, obj=None): fields = super().get_fieldsets(request, obj) if request.user.has_perm("aircox.program.scheduling"): fields = fields + [ ( _("Program Settings"), { "fields": ["active", "station", "sync"], }, ) ] return fields @admin.register(Schedule) class ScheduleAdmin(admin.ModelAdmin): def program_title(self, obj): return obj.program.title program_title.short_description = _("Program") def freq(self, obj): return obj.get_frequency_verbose() freq.short_description = _("Day") list_filter = ["frequency", "program"] list_display = [ "program_title", "freq", "time", "timezone", "duration", "initial", ] list_editable = ["time", "duration", "initial"] def get_readonly_fields(self, request, obj=None): if obj: return ["program", "date", "frequency"] else: return [] @admin.register(Stream) class StreamAdmin(admin.ModelAdmin): list_display = ("id", "program", "delay", "begin", "end")