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
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()
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()
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
def delete_celery_periodic_task(task_name): from django_celery_beat.models import PeriodicTask PeriodicTask.objects.filter(name=task_name).delete() PeriodicTasks.update_changed()
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()
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
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')
def disable_tasks(self, request, queryset): rows_updated = queryset.update(enabled=False) PeriodicTasks.update_changed() self._message_user_about_update(request, rows_updated, 'disabled')