agendas: enable a source is now asynchronous (#50723)

This commit is contained in:
Lauréline Guérin 2021-02-09 14:59:27 +01:00
parent e8d2d73ab7
commit be881d997a
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
4 changed files with 40 additions and 7 deletions

View File

@ -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)

View File

@ -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()

View File

@ -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.')

View File

@ -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()