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):
|
||||
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)
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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.')
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue