work on schedule gen bug -- split Schedule's date and time
This commit is contained in:
parent
9ad47b795a
commit
343279a777
|
@ -156,7 +156,7 @@ class ScheduleAdmin(admin.ModelAdmin):
|
|||
program_name.short_description = _('Program')
|
||||
|
||||
def day(self, obj):
|
||||
return obj.date.strftime('%A')
|
||||
return '' # obj.date.strftime('%A')
|
||||
day.short_description = _('Day')
|
||||
|
||||
def rerun(self, obj):
|
||||
|
@ -165,8 +165,8 @@ class ScheduleAdmin(admin.ModelAdmin):
|
|||
rerun.boolean = True
|
||||
|
||||
list_filter = ['frequency', 'program']
|
||||
list_display = ['id', 'program_name', 'frequency', 'day', 'date', 'duration', 'rerun']
|
||||
list_editable = ['frequency', 'date', 'duration']
|
||||
list_display = ['id', 'program_name', 'frequency', 'day', 'date', 'time', 'timezone', 'duration', 'rerun']
|
||||
list_editable = ['frequency', 'date', 'time', 'timezone', 'duration']
|
||||
|
||||
|
||||
@admin.register(Track)
|
||||
|
|
|
@ -66,7 +66,7 @@ class Actions:
|
|||
qs.delete()
|
||||
|
||||
@staticmethod
|
||||
def check (date):
|
||||
def check(date):
|
||||
qs = Diffusion.objects.filter(type = Diffusion.Type.unconfirmed,
|
||||
start__gt = date)
|
||||
items = []
|
||||
|
@ -83,7 +83,7 @@ class Actions:
|
|||
Diffusion.objects.filter(id__in = items).delete()
|
||||
|
||||
|
||||
class Command (BaseCommand):
|
||||
class Command(BaseCommand):
|
||||
help= __doc__
|
||||
|
||||
def add_arguments (self, parser):
|
||||
|
|
|
@ -1,18 +1,20 @@
|
|||
import datetime
|
||||
import calendar
|
||||
import logging
|
||||
import os
|
||||
import shutil
|
||||
import logging
|
||||
from enum import IntEnum
|
||||
|
||||
import calendar
|
||||
from enum import IntEnum
|
||||
import pytz
|
||||
|
||||
from django.conf import settings as main_settings
|
||||
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.db import models
|
||||
from django.template.defaultfilters import slugify
|
||||
from django.utils.translation import ugettext as _, ugettext_lazy
|
||||
from django.utils import timezone as tz
|
||||
from django.utils.html import strip_tags
|
||||
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.conf import settings as main_settings
|
||||
|
||||
from taggit.managers import TaggableManager
|
||||
|
||||
|
@ -482,12 +484,19 @@ class Schedule(models.Model):
|
|||
Program,
|
||||
verbose_name = _('related program'),
|
||||
)
|
||||
date = models.DateTimeField(
|
||||
time = models.TimeField(
|
||||
_('time'),
|
||||
blank = True, null = True,
|
||||
help_text = _('start time'),
|
||||
)
|
||||
date = models.DateField(
|
||||
_('date'),
|
||||
help_text = _('date of the first diffusion')
|
||||
blank = True, null = True,
|
||||
help_text = _('date of the first diffusion'),
|
||||
)
|
||||
timezone = models.CharField(
|
||||
_('timezone'),
|
||||
choices = [(x, x) for x in pytz.all_timezones],
|
||||
max_length = 100, blank=True,
|
||||
help_text = _('timezone used for the date')
|
||||
)
|
||||
|
@ -567,15 +576,15 @@ class Schedule(models.Model):
|
|||
|
||||
@property
|
||||
def end(self):
|
||||
return self.date + utils.to_timedelta(self.duration)
|
||||
return self.time + utils.to_timedelta(self.duration)
|
||||
|
||||
def match(self, date = None, check_time = True):
|
||||
"""
|
||||
Return True if the given datetime matches the schedule
|
||||
"""
|
||||
date = utils.date_or_default(date)
|
||||
print('match...', date, self.date, self.match_week(date), self.date.weekday() == date.weekday())
|
||||
if self.date.weekday() != date.weekday() or not self.match_week(date):
|
||||
if self.date.weekday() != date.weekday() or \
|
||||
not self.match_week(date):
|
||||
return False
|
||||
|
||||
if not check_time:
|
||||
|
@ -599,6 +608,7 @@ class Schedule(models.Model):
|
|||
date = utils.date_or_default(date)
|
||||
date += tz.timedelta(days = self.date.weekday() - date.weekday() )
|
||||
|
||||
# FIXME this case
|
||||
if self.frequency == Schedule.Frequency.one_on_two:
|
||||
# cf notes in date_of_month
|
||||
diff = utils.cast_date(date, False) - utils.cast_date(self.date, False)
|
||||
|
@ -618,9 +628,9 @@ class Schedule(models.Model):
|
|||
Return a new datetime with schedule time. Timezone is handled
|
||||
using `schedule.timezone`.
|
||||
"""
|
||||
local_date = self.local_date
|
||||
time = self.time or self.date
|
||||
date = tz.datetime(date.year, date.month, date.day,
|
||||
local_date.hour, local_date.minute, 0, 0)
|
||||
time.hour, time.minute, 0, 0)
|
||||
date = self.tz.localize(date)
|
||||
date = self.tz.normalize(date)
|
||||
return date
|
||||
|
@ -633,8 +643,9 @@ class Schedule(models.Model):
|
|||
if self.frequency == Schedule.Frequency.ponctual:
|
||||
return []
|
||||
|
||||
# set to 12h in order to avoid potential bugs with dst
|
||||
date = utils.date_or_default(date, True).replace(day=1, hour=12)
|
||||
# first day of month
|
||||
date = utils.date_or_default(date, to_datetime = False) \
|
||||
.replace(day=1)
|
||||
freq = self.frequency
|
||||
|
||||
# last of the month
|
||||
|
@ -676,7 +687,7 @@ class Schedule(models.Model):
|
|||
week += 1;
|
||||
return [self.normalize(date) for date in dates]
|
||||
|
||||
def diffusions_of_month(self, date, exclude_saved = False):
|
||||
def diffusions_of_month(self, date = None, exclude_saved = False):
|
||||
"""
|
||||
Return a list of Diffusion instances, from month of the given date, that
|
||||
can be not in the database.
|
||||
|
@ -721,7 +732,7 @@ class Schedule(models.Model):
|
|||
def __str__(self):
|
||||
return ' | '.join([ '#' + str(self.id), self.program.name,
|
||||
self.get_frequency_display(),
|
||||
self.date.strftime('%a %H:%M') ])
|
||||
self.time.strftime('%a %H:%M') ])
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
if self.initial:
|
||||
|
@ -729,8 +740,6 @@ class Schedule(models.Model):
|
|||
self.duration = self.initial.duration
|
||||
if not self.frequency:
|
||||
self.frequency = self.initial.frequency
|
||||
|
||||
self.timezone = self.date.tzinfo.zone
|
||||
super().save(*args, **kwargs)
|
||||
|
||||
class Meta:
|
||||
|
|
|
@ -44,6 +44,7 @@ def user_default_groups(sender, instance, created, *args, **kwargs):
|
|||
|
||||
@receiver(post_save, sender=models.Schedule)
|
||||
def schedule_post_saved(sender, instance, created, *args, **kwargs):
|
||||
return
|
||||
# TODO: case instance.program | instance.frequency has changed
|
||||
if not instance.program.sync:
|
||||
return
|
||||
|
@ -53,16 +54,18 @@ def schedule_post_saved(sender, instance, created, *args, **kwargs):
|
|||
return
|
||||
|
||||
if not initial.get('date') or not initial.get('duration') \
|
||||
or not initial.get('frequency'):
|
||||
or not initial.get('frequency') or \
|
||||
initial.frequency != instance.frequency:
|
||||
return
|
||||
|
||||
# old schedule and timedelta
|
||||
old = models.Schedule(**{ key: initial.get(key)
|
||||
for key in ('date','timezone','duration','frequency')
|
||||
})
|
||||
start_delta = instance.local_date - old.local_date
|
||||
|
||||
old.date = old.local_date.astimezone(pytz.UTC)
|
||||
# change: day, time, duration, frequence => TODO
|
||||
delta = (instance.date - old.date) + \
|
||||
(instance.time - old.time)
|
||||
|
||||
qs = models.Diffusion.objects.station(
|
||||
instance.program.station,
|
||||
|
@ -70,8 +73,8 @@ def schedule_post_saved(sender, instance, created, *args, **kwargs):
|
|||
|
||||
pks = [ item.pk for item in qs if old.match(item.date) ]
|
||||
qs.filter(pk__in = pks).update(
|
||||
start = F('start') + start_delta,
|
||||
end = F('start') + start_delta + utils.to_timedelta(instance.duration)
|
||||
start = F('start') + delta,
|
||||
end = F('start') + delta + utils.to_timedelta(instance.duration)
|
||||
)
|
||||
return
|
||||
|
||||
|
|
|
@ -4,7 +4,6 @@
|
|||
# This file is distributed under the same license as the Aircox package.
|
||||
# Aarys, 2016.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Aircox 0.1\n"
|
||||
|
|
Loading…
Reference in New Issue
Block a user