зеркало из https://github.com/mozilla/kitsune.git
361 строка
7.9 KiB
Python
361 строка
7.9 KiB
Python
import datetime
|
|
import os
|
|
import sys
|
|
from subprocess import check_call
|
|
|
|
import babis
|
|
from apscheduler.schedulers.blocking import BlockingScheduler
|
|
from django.conf import settings
|
|
from django.utils import timezone
|
|
|
|
MANAGE = os.path.join(settings.ROOT, "manage.py")
|
|
schedule = BlockingScheduler()
|
|
|
|
|
|
def call_command(command):
|
|
check_call("python {0} {1}".format(MANAGE, command), shell=True)
|
|
|
|
|
|
class scheduled_job(object):
|
|
"""Decorator for scheduled jobs. Takes same args as apscheduler.schedule_job."""
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.args = args
|
|
self.kwargs = kwargs
|
|
self.skip = self.kwargs.pop("skip", False)
|
|
|
|
def __call__(self, fn):
|
|
self.name = fn.__name__
|
|
if self.skip:
|
|
self.log("Skipped, not registered.")
|
|
return None
|
|
self.callback = fn
|
|
schedule.add_job(self.run, id=self.name, *self.args, **self.kwargs)
|
|
self.log("Registered.")
|
|
return self.run
|
|
|
|
def run(self):
|
|
self.log("starting")
|
|
try:
|
|
self.callback()
|
|
except Exception as e:
|
|
self.log("CRASHED: {}".format(e))
|
|
raise
|
|
else:
|
|
self.log("finished successfully")
|
|
|
|
def log(self, message):
|
|
msg = "[{}] Clock job {}@{}: {}".format(
|
|
datetime.datetime.utcnow(), self.name, settings.PLATFORM_NAME, message
|
|
)
|
|
print(msg, file=sys.stderr)
|
|
|
|
|
|
# Every 10 minutes.
|
|
@scheduled_job("cron", month="*", day="*", hour="*", minute="*/10", max_instances=1, coalesce=True)
|
|
@babis.decorator(ping_after=settings.DMS_ENQUEUE_LAG_MONITOR_TASK)
|
|
def job_enqueue_lag_monitor_task():
|
|
call_command("enqueue_lag_monitor_task")
|
|
|
|
|
|
# Every hour.
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="*",
|
|
minute="30",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_SEND_WELCOME_EMAILS)
|
|
def job_send_welcome_emails():
|
|
call_command("send_welcome_emails")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="*",
|
|
minute="45",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
# only run on readonly clusters, where no signals will be triggered:
|
|
skip=(not settings.READ_ONLY),
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_REINDEX_ES)
|
|
def job_reindex_es():
|
|
# Index items newer than 90 minutes old in ES
|
|
after = (timezone.now() - datetime.timedelta(minutes=90)).isoformat()
|
|
call_command("es_reindex --updated-after {}".format(after))
|
|
|
|
|
|
# Every 6 hours.
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="*/6",
|
|
minute="00",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_UPDATE_PRODUCT_DETAILS)
|
|
def job_update_product_details():
|
|
call_command("update_product_details")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="*/6",
|
|
minute="20",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=(settings.READ_ONLY or settings.STAGE),
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_GENERATE_MISSING_SHARE_LINKS)
|
|
def job_generate_missing_share_links():
|
|
call_command("generate_missing_share_links")
|
|
|
|
|
|
# Once per day.
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="00",
|
|
minute="00",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_REBUILD_KB)
|
|
def job_rebuild_kb():
|
|
call_command("rebuild_kb")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="00",
|
|
minute="42",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_UPDATE_TOP_CONTRIBUTORS)
|
|
def job_update_top_contributors():
|
|
call_command("update_top_contributors")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="01",
|
|
minute="00",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_UPDATE_L10N_COVERAGE_METRICS)
|
|
def job_update_l10n_coverage_metrics():
|
|
call_command("update_l10n_coverage_metrics")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="01",
|
|
minute="11",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_REPORT_EMPLOYEE_ANSWERS)
|
|
def job_report_employee_answers():
|
|
call_command("report_employee_answers")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="01",
|
|
minute="40",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_UPDATE_WEEKLY_VOTES)
|
|
def job_update_weekly_votes():
|
|
call_command("update_weekly_votes")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="03",
|
|
minute="00",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=(settings.READ_ONLY or settings.STAGE),
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_UPDATE_CONTRIBUTOR_METRICS)
|
|
def job_update_contributor_metrics():
|
|
call_command("update_contributor_metrics")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="04",
|
|
minute="00",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_AUTO_ARCHIVE_OLD_QUESTIONS)
|
|
def job_auto_archive_old_questions():
|
|
call_command("auto_archive_old_questions")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="10",
|
|
minute="00",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=(settings.READ_ONLY or settings.STAGE),
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_UPDATE_L10N_METRIC)
|
|
def job_update_l10n_metric():
|
|
call_command("update_l10n_metric")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="16",
|
|
minute="00",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=(settings.READ_ONLY or settings.STAGE),
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_RELOAD_WIKI_TRAFFIC_STATS)
|
|
def job_reload_wiki_traffic_stats():
|
|
call_command("reload_wiki_traffic_stats")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="21",
|
|
minute="00",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_CACHE_MOST_UNHELPFUL_KB_ARTICLES)
|
|
def job_cache_most_unhelpful_kb_articles():
|
|
call_command("cache_most_unhelpful_kb_articles")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="23",
|
|
minute="00",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=(settings.READ_ONLY or settings.STAGE),
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_RELOAD_QUESTION_TRAFFIC_STATS)
|
|
def job_reload_question_traffic_stats():
|
|
call_command("reload_question_traffic_stats")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="04",
|
|
minute="00",
|
|
day_of_week=5,
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=(settings.READ_ONLY or settings.STAGE),
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_SEND_WEEKLY_READY_FOR_REVIEW_DIGEST)
|
|
def job_send_weekly_ready_for_review_digest():
|
|
call_command("send_weekly_ready_for_review_digest")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="00",
|
|
minute="00",
|
|
day_of_week=0,
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_FIX_CURRENT_REVISIONS)
|
|
def job_fix_current_revisions():
|
|
call_command("fix_current_revisions")
|
|
|
|
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="*",
|
|
hour="00",
|
|
minute="30",
|
|
day_of_week=1,
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_COHORT_ANALYSIS)
|
|
def job_cohort_analysis():
|
|
call_command("cohort_analysis")
|
|
|
|
|
|
# Once per month
|
|
@scheduled_job(
|
|
"cron",
|
|
month="*",
|
|
day="1",
|
|
hour="00",
|
|
minute="30",
|
|
max_instances=1,
|
|
coalesce=True,
|
|
skip=settings.READ_ONLY,
|
|
)
|
|
@babis.decorator(ping_after=settings.DMS_UPDATE_L10N_CONTRIBUTOR_METRICS)
|
|
def job_update_l10n_contributor_metrics():
|
|
call_command("update_l10n_contributor_metrics")
|
|
|
|
|
|
def run():
|
|
try:
|
|
schedule.start()
|
|
except (KeyboardInterrupt, SystemExit):
|
|
pass
|