def save(self, *args, **kwargs): # Removes all other entries if there are any self.__class__.objects.exclude(id=self.id).delete() # creates new checkout task if self.checkout_task is None: cron = CrontabSchedule( minute=self.scheduled_verification_time.minute, hour=self.scheduled_verification_time.hour) cron.save() ctask = PeriodicTask( name="scheduled-checkout-%s" % cron.id, task="apps.organization.tasks.automatic_checkout", crontab=cron, queue="celery") ctask.save() self.checkout_task = ctask else: ctask = self.checkout_task cron = ctask.crontab cron.hour = self.scheduled_verification_time.hour cron.minute = self.scheduled_verification_time.minute cron.save() ctask.save() # creates new reminder task if self.reminder_task is None: cron = CrontabSchedule(minute=self.checkout_reminder_time.minute, hour=self.checkout_reminder_time.hour) cron.save() rtask = PeriodicTask( name="scheduled-reminder-%s" % cron.id, task="apps.organization.tasks.checkout_notification", crontab=cron, queue="celery") rtask.save() self.reminder_task = rtask else: rtask = self.reminder_task cron = rtask.crontab cron.hour = self.checkout_reminder_time.hour cron.minute = self.checkout_reminder_time.minute cron.save() rtask.save() super(OrgSettings, self).save(*args, **kwargs)
def post_save(sender, instance, created, **kwargs): """ Update djcelery beat schedule :param sender: The model class (Settings) :param instance: The actual instance being saved. :param created: A boolean; True if a new record was created :return: """ # for migrations process if created: return from djcelery.models import PeriodicTask, CrontabSchedule try: task_object = PeriodicTask.objects.get( name=Settings.MAILING_TASK_LABEL) cron_object = task_object.crontab except ObjectDoesNotExist: cron_object = CrontabSchedule() task_object = PeriodicTask(name=Settings.MAILING_TASK_LABEL, task=Settings.MAILING_TASK_NAME) cron_object.minute = instance.mailing_time.minute cron_object.hour = instance.mailing_time.hour cron_object.save() task_object.crontab = cron_object task_object.args = "[{}]".format(instance.mailing_threads) task_object.save()
def deactivate_task(uid, days=14): """ uid:user.id days: 默认两周后关闭账户 """ from djcelery.models import CrontabSchedule, PeriodicTask from django.contrib.auth.models import User import datetime now = datetime.datetime.today() deadline = now + datetime.timedelta(minutes=3) task_date = CrontabSchedule() task_date.minute = deadline.timetuple().tm_min task_date.hour = deadline.timetuple().tm_hour task_date.day_of_month = deadline.timetuple().tm_mday task_date.month_of_year = deadline.timetuple().tm_mon try: from django.db import transaction with transaction.atomic(): task_date.save() except: return False user = User.objects.get(pk=uid) name = "Deactivate_User_%s" % uid new_task = PeriodicTask(name=name) new_task.name = name new_task.task = 'templates.tasks.deactivate_tempuser' new_task.crontab = task_date new_task.args = "[%s]" % uid new_task.enabled = True try: from django.db import transaction with transaction.atomic(): new_task.save() except: return False return True