diff --git a/chrono/agendas/management/commands/sync_desks_timeperiod_exceptions_from_settings.py b/chrono/agendas/management/commands/sync_desks_timeperiod_exceptions_from_settings.py index 0a4be18a..16183886 100644 --- a/chrono/agendas/management/commands/sync_desks_timeperiod_exceptions_from_settings.py +++ b/chrono/agendas/management/commands/sync_desks_timeperiod_exceptions_from_settings.py @@ -27,4 +27,4 @@ class Command(BaseCommand): def handle(self, **options): translation.activate(settings.LANGUAGE_CODE) for desk in Desk.objects.all(): - desk.import_timeperiod_exceptions_from_settings() + desk.import_timeperiod_exceptions_from_settings(spool=False) diff --git a/chrono/agendas/models.py b/chrono/agendas/models.py index eb0a77e4..d3ef032a 100644 --- a/chrono/agendas/models.py +++ b/chrono/agendas/models.py @@ -1438,7 +1438,7 @@ class Desk(models.Model): return [OpeningHour(*time_range) for time_range in (openslots - exceptions)] - def import_timeperiod_exceptions_from_settings(self, enable=False): + def import_timeperiod_exceptions_from_settings(self, enable=False, spool=True): start_update = now() for slug, source_info in settings.EXCEPTIONS_SOURCES.items(): label = source_info['label'] @@ -1451,7 +1451,7 @@ class Desk(models.Model): source.settings_label = _(label) source.save() if enable or source.enabled: # if already enabled, update anyway - source.enable() + source.enable(spool=spool) TimePeriodExceptionSource.objects.filter( desk=self, settings_slug__isnull=False, last_update__lt=start_update ).delete() # source was not in settings anymore @@ -1540,7 +1540,26 @@ class TimePeriodExceptionSource(models.Model): return new_source - def enable(self): + def enable(self, spool=True): + self.enabled = True + self.save() + + if spool and 'uwsgi' in sys.modules: + from chrono.utils.spooler import refresh_exceptions_from_settings + + tenant = getattr(connection, 'tenant', None) + transaction.on_commit( + lambda: refresh_exceptions_from_settings.spool( + source_id=str(self.pk), domain=getattr(tenant, 'domain_url', None) + ) + ) + return + + self.refresh_from_settings() + + def refresh_from_settings(self): + if not self.enabled: + return source_info = settings.EXCEPTIONS_SOURCES.get(self.settings_slug) if not source_info: return @@ -1560,8 +1579,6 @@ class TimePeriodExceptionSource(models.Model): start_datetime=start_datetime, end_datetime=end_datetime, ) - self.enabled = True - self.save() def disable(self): self.timeperiodexception_set.all().delete() diff --git a/chrono/manager/views.py b/chrono/manager/views.py index b4c60924..31149d16 100644 --- a/chrono/manager/views.py +++ b/chrono/manager/views.py @@ -2492,7 +2492,9 @@ class TimePeriodExceptionSourceToggleView(ManagedDeskSubobjectMixin, DetailView) continue if was_enabled: _source.enable() - message = _('Exception source %(source)s has been enabled.') + message = _( + 'Exception source %(source)s has been enabled. Exceptions will be imported in a few minutes.' + ) else: _source.disable() message = _('Exception source %(source)s has been disabled.') diff --git a/chrono/utils/spooler.py b/chrono/utils/spooler.py index 39827baa..c0e6644d 100644 --- a/chrono/utils/spooler.py +++ b/chrono/utils/spooler.py @@ -43,3 +43,17 @@ def refresh_exception_source(args): source.refresh_timeperiod_exceptions_from_ics() except ICSError: pass + + +@spool +def refresh_exceptions_from_settings(args): + if args.get('domain'): + # multitenant installation + set_connection(args['domain']) + + try: + source = TimePeriodExceptionSource.objects.get(pk=args['source_id']) + except TimePeriodExceptionSource.DoesNotExist: + return + + source.refresh_from_settings()