예제 #1
0
 def disable_periodic_task(self, save=True):
     if self.periodic_task:
         obj = self.periodic_task
         obj.delete()
         PeriodicTasks.update_changed()
         self.periodic_task = None
         if save:
             self.save()
     return self.periodic_task
예제 #2
0
 def save_model(self, request, obj, form, change):
     if obj.celery_task_id:
         revoke(obj.celery_task_id, terminate=True)
         obj.celery_task_id = ''
     obj.running = False
     obj.status = '-'
     obj.task = 'regression.tasks.local_regression_task'
     obj.kwargs = json.dumps({'task_name': obj.name})
     PeriodicTasks.update_changed()
     super().save_model(request, obj, form, change)
 def setup_schedule(self):
     """
     Cleanup previous periodic tasks from the database before starting the default scheduler
     """
     schedule = self.app.conf.beat_schedule
     with transaction.atomic():
         num, info = PeriodicTask.objects.\
             exclude(task__startswith='celery.').\
             exclude(name__in=schedule.keys()).\
             delete()
         logger.info("Removed %d obsolete periodic tasks.", num)
         if num > 0:
             PeriodicTasks.update_changed()
     super(DatabaseSchedulerWithCleanup, self).setup_schedule()
예제 #4
0
    def save(self, *args, **kwargs):
        self.task = "TwilioCaller"

        self.exchange = self.exchange or None
        self.routing_key = self.routing_key or None
        self.queue = self.queue or None
        if not self.enabled:
            self.last_run_at = None

        if not self.pk:
            super(CeleryPhoneModel, self).save(*args, **kwargs)
            self.args = [self.pk]
            super(CeleryPhoneModel, self).save(*args, **kwargs)
        else:
            self.args = [self.pk]
            super(CeleryPhoneModel, self).save(*args, **kwargs)
        PeriodicTasks.update_changed()
예제 #5
0
 def enable_periodic_task(self, save=True):
     instance_id = self.id
     ticker = self.ticker
     task_name = f'company-{ticker}-{instance_id}'.lower()
     if not self.periodic_task:
         schedule = CrontabSchedule.objects.get(id=3)
         obj, _ = PeriodicTask.objects.get_or_create(
             crontab=schedule,
             kwargs=json.dumps({
                 'instance_id': instance_id,
                 'service': 'business_insider'
             }),
             name=task_name,
             task='stocks.tasks.company_granular_price_scrape_task')
         obj.enabled = True
         obj.save()
         PeriodicTasks.update_changed()
         self.periodic_task = obj
         if save:
             self.save()
     return self.periodic_task
예제 #6
0
def delete_celery_periodic_task(task_name):
    from django_celery_beat.models import PeriodicTask
    PeriodicTask.objects.filter(name=task_name).delete()
    PeriodicTasks.update_changed()
예제 #7
0
def disable_celery_periodic_task(task_name):
    from django_celery_beat.models import PeriodicTask
    PeriodicTask.objects.filter(name=task_name).update(enabled=False)
    PeriodicTasks.update_changed()
예제 #8
0
def create_or_update_celery_periodic_tasks(tasks):
    """
    :param tasks: {
        'add-every-monday-morning': {
            'task': 'tasks.add' # A registered celery task,
            'interval': 30,
            'crontab': "30 7 * * *",
            'args': (16, 16),
            'kwargs': {},
            'enabled': False,
            'description': ''
        },
    }
    :return:
    """
    # Todo: check task valid, task and callback must be a celery task
    for name, detail in tasks.items():
        interval = None
        crontab = None
        last_run_at = None

        try:
            IntervalSchedule.objects.all().count()
        except (ProgrammingError, OperationalError):
            return None

        if isinstance(detail.get("interval"), int):
            kwargs = dict(
                every=detail['interval'],
                period=IntervalSchedule.SECONDS,
            )
            # 不能使用 get_or_create,因为可能会有多个
            interval = IntervalSchedule.objects.filter(**kwargs).first()
            if interval is None:
                interval = IntervalSchedule.objects.create(**kwargs)
            last_run_at = local_now()
        elif isinstance(detail.get("crontab"), str):
            try:
                minute, hour, day, month, week = detail["crontab"].split()
            except ValueError:
                logger.error("crontab is not valid")
                return
            kwargs = dict(
                minute=minute, hour=hour, day_of_week=week,
                day_of_month=day, month_of_year=month, timezone=get_current_timezone()
            )
            crontab = CrontabSchedule.objects.filter(**kwargs).first()
            if crontab is None:
                crontab = CrontabSchedule.objects.create(**kwargs)
        else:
            logger.error("Schedule is not valid")
            return

        defaults = dict(
            interval=interval,
            crontab=crontab,
            name=name,
            task=detail['task'],
            enabled=detail.get('enabled', True),
            args=json.dumps(detail.get('args', [])),
            kwargs=json.dumps(detail.get('kwargs', {})),
            description=detail.get('description') or '',
            last_run_at=last_run_at,
        )
        task = PeriodicTask.objects.update_or_create(
            defaults=defaults, name=name,
        )
        PeriodicTasks.update_changed()
        return task
예제 #9
0
 def toggle_tasks(self, request, queryset):
     rows_updated = self._toggle_tasks_activity(queryset)
     PeriodicTasks.update_changed()
     self._message_user_about_update(request, rows_updated, 'toggled')
예제 #10
0
 def disable_tasks(self, request, queryset):
     rows_updated = queryset.update(enabled=False)
     PeriodicTasks.update_changed()
     self._message_user_about_update(request, rows_updated, 'disabled')