Projet

Général

Profil

0004-agendas-enable-a-source-is-now-asynchronous-50723.patch

Lauréline Guérin, 09 février 2021 15:00

Télécharger (4,86 ko)

Voir les différences:

Subject: [PATCH 4/4] agendas: enable a source is now asynchronous (#50723)

 ...sks_timeperiod_exceptions_from_settings.py |  2 +-
 chrono/agendas/models.py                      | 27 +++++++++++++++----
 chrono/manager/views.py                       |  4 ++-
 chrono/utils/spooler.py                       | 14 ++++++++++
 4 files changed, 40 insertions(+), 7 deletions(-)
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
-