0004-agendas-enable-a-source-is-now-asynchronous-50723.patch
chrono/agendas/management/commands/sync_desks_timeperiod_exceptions_from_settings.py | ||
---|---|---|
27 | 27 |
def handle(self, **options): |
28 | 28 |
translation.activate(settings.LANGUAGE_CODE) |
29 | 29 |
for desk in Desk.objects.all(): |
30 |
desk.import_timeperiod_exceptions_from_settings() |
|
30 |
desk.import_timeperiod_exceptions_from_settings(spool=False) |
chrono/agendas/models.py | ||
---|---|---|
1438 | 1438 | |
1439 | 1439 |
return [OpeningHour(*time_range) for time_range in (openslots - exceptions)] |
1440 | 1440 | |
1441 |
def import_timeperiod_exceptions_from_settings(self, enable=False): |
|
1441 |
def import_timeperiod_exceptions_from_settings(self, enable=False, spool=True):
|
|
1442 | 1442 |
start_update = now() |
1443 | 1443 |
for slug, source_info in settings.EXCEPTIONS_SOURCES.items(): |
1444 | 1444 |
label = source_info['label'] |
... | ... | |
1451 | 1451 |
source.settings_label = _(label) |
1452 | 1452 |
source.save() |
1453 | 1453 |
if enable or source.enabled: # if already enabled, update anyway |
1454 |
source.enable() |
|
1454 |
source.enable(spool=spool)
|
|
1455 | 1455 |
TimePeriodExceptionSource.objects.filter( |
1456 | 1456 |
desk=self, settings_slug__isnull=False, last_update__lt=start_update |
1457 | 1457 |
).delete() # source was not in settings anymore |
... | ... | |
1540 | 1540 | |
1541 | 1541 |
return new_source |
1542 | 1542 | |
1543 |
def enable(self): |
|
1543 |
def enable(self, spool=True): |
|
1544 |
self.enabled = True |
|
1545 |
self.save() |
|
1546 | ||
1547 |
if spool and 'uwsgi' in sys.modules: |
|
1548 |
from chrono.utils.spooler import refresh_exceptions_from_settings |
|
1549 | ||
1550 |
tenant = getattr(connection, 'tenant', None) |
|
1551 |
transaction.on_commit( |
|
1552 |
lambda: refresh_exceptions_from_settings.spool( |
|
1553 |
source_id=str(self.pk), domain=getattr(tenant, 'domain_url', None) |
|
1554 |
) |
|
1555 |
) |
|
1556 |
return |
|
1557 | ||
1558 |
self.refresh_from_settings() |
|
1559 | ||
1560 |
def refresh_from_settings(self): |
|
1561 |
if not self.enabled: |
|
1562 |
return |
|
1544 | 1563 |
source_info = settings.EXCEPTIONS_SOURCES.get(self.settings_slug) |
1545 | 1564 |
if not source_info: |
1546 | 1565 |
return |
... | ... | |
1560 | 1579 |
start_datetime=start_datetime, |
1561 | 1580 |
end_datetime=end_datetime, |
1562 | 1581 |
) |
1563 |
self.enabled = True |
|
1564 |
self.save() |
|
1565 | 1582 | |
1566 | 1583 |
def disable(self): |
1567 | 1584 |
self.timeperiodexception_set.all().delete() |
chrono/manager/views.py | ||
---|---|---|
2492 | 2492 |
continue |
2493 | 2493 |
if was_enabled: |
2494 | 2494 |
_source.enable() |
2495 |
message = _('Exception source %(source)s has been enabled.') |
|
2495 |
message = _( |
|
2496 |
'Exception source %(source)s has been enabled. Exceptions will be imported in a few minutes.' |
|
2497 |
) |
|
2496 | 2498 |
else: |
2497 | 2499 |
_source.disable() |
2498 | 2500 |
message = _('Exception source %(source)s has been disabled.') |
chrono/utils/spooler.py | ||
---|---|---|
43 | 43 |
source.refresh_timeperiod_exceptions_from_ics() |
44 | 44 |
except ICSError: |
45 | 45 |
pass |
46 | ||
47 | ||
48 |
@spool |
|
49 |
def refresh_exceptions_from_settings(args): |
|
50 |
if args.get('domain'): |
|
51 |
# multitenant installation |
|
52 |
set_connection(args['domain']) |
|
53 | ||
54 |
try: |
|
55 |
source = TimePeriodExceptionSource.objects.get(pk=args['source_id']) |
|
56 |
except TimePeriodExceptionSource.DoesNotExist: |
|
57 |
return |
|
58 | ||
59 |
source.refresh_from_settings() |
|
46 |
- |