agendas: enable a source is now asynchronous (#50723)
This commit is contained in:
parent
e8d2d73ab7
commit
be881d997a
|
@ -27,4 +27,4 @@ class Command(BaseCommand):
|
||||||
def handle(self, **options):
|
def handle(self, **options):
|
||||||
translation.activate(settings.LANGUAGE_CODE)
|
translation.activate(settings.LANGUAGE_CODE)
|
||||||
for desk in Desk.objects.all():
|
for desk in Desk.objects.all():
|
||||||
desk.import_timeperiod_exceptions_from_settings()
|
desk.import_timeperiod_exceptions_from_settings(spool=False)
|
||||||
|
|
|
@ -1438,7 +1438,7 @@ class Desk(models.Model):
|
||||||
|
|
||||||
return [OpeningHour(*time_range) for time_range in (openslots - exceptions)]
|
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()
|
start_update = now()
|
||||||
for slug, source_info in settings.EXCEPTIONS_SOURCES.items():
|
for slug, source_info in settings.EXCEPTIONS_SOURCES.items():
|
||||||
label = source_info['label']
|
label = source_info['label']
|
||||||
|
@ -1451,7 +1451,7 @@ class Desk(models.Model):
|
||||||
source.settings_label = _(label)
|
source.settings_label = _(label)
|
||||||
source.save()
|
source.save()
|
||||||
if enable or source.enabled: # if already enabled, update anyway
|
if enable or source.enabled: # if already enabled, update anyway
|
||||||
source.enable()
|
source.enable(spool=spool)
|
||||||
TimePeriodExceptionSource.objects.filter(
|
TimePeriodExceptionSource.objects.filter(
|
||||||
desk=self, settings_slug__isnull=False, last_update__lt=start_update
|
desk=self, settings_slug__isnull=False, last_update__lt=start_update
|
||||||
).delete() # source was not in settings anymore
|
).delete() # source was not in settings anymore
|
||||||
|
@ -1540,7 +1540,26 @@ class TimePeriodExceptionSource(models.Model):
|
||||||
|
|
||||||
return new_source
|
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)
|
source_info = settings.EXCEPTIONS_SOURCES.get(self.settings_slug)
|
||||||
if not source_info:
|
if not source_info:
|
||||||
return
|
return
|
||||||
|
@ -1560,8 +1579,6 @@ class TimePeriodExceptionSource(models.Model):
|
||||||
start_datetime=start_datetime,
|
start_datetime=start_datetime,
|
||||||
end_datetime=end_datetime,
|
end_datetime=end_datetime,
|
||||||
)
|
)
|
||||||
self.enabled = True
|
|
||||||
self.save()
|
|
||||||
|
|
||||||
def disable(self):
|
def disable(self):
|
||||||
self.timeperiodexception_set.all().delete()
|
self.timeperiodexception_set.all().delete()
|
||||||
|
|
|
@ -2492,7 +2492,9 @@ class TimePeriodExceptionSourceToggleView(ManagedDeskSubobjectMixin, DetailView)
|
||||||
continue
|
continue
|
||||||
if was_enabled:
|
if was_enabled:
|
||||||
_source.enable()
|
_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:
|
else:
|
||||||
_source.disable()
|
_source.disable()
|
||||||
message = _('Exception source %(source)s has been disabled.')
|
message = _('Exception source %(source)s has been disabled.')
|
||||||
|
|
|
@ -43,3 +43,17 @@ def refresh_exception_source(args):
|
||||||
source.refresh_timeperiod_exceptions_from_ics()
|
source.refresh_timeperiod_exceptions_from_ics()
|
||||||
except ICSError:
|
except ICSError:
|
||||||
pass
|
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()
|
||||||
|
|
Loading…
Reference in New Issue