1
0
Fork 0
mirror of https://github.com/seanmorley15/AdventureLog.git synced 2025-07-24 15:29:36 +02:00

Auto schedule Django APScheduler

This commit is contained in:
Sean Morley 2024-08-21 09:48:47 -04:00
parent f5e721cd82
commit 590fa9edc0
5 changed files with 82 additions and 18 deletions

View file

@ -13,7 +13,7 @@ WORKDIR /code
# Install system dependencies
RUN apt-get update \
&& apt-get install -y git postgresql-client cron \
&& apt-get install -y git postgresql-client \
&& apt-get clean
# Install Python dependencies
@ -27,18 +27,6 @@ COPY ./server /code/
# Collect static files
RUN python3 manage.py collectstatic --noinput --verbosity 2
# Setup cron to run python3 manage.py worldtravel-seed every day at 00:00
RUN echo "0 0 * * * python3 /code/manage.py worldtravel-seed --force >> /var/log/cron.log 2>&1" > /etc/cron.d/worldtravel-seed
# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/worldtravel-seed
# Apply cron job
RUN crontab /etc/cron.d/worldtravel-seed
# Ensure cron is started in the foreground when the container starts
CMD ["cron", "-f"]
# Set the entrypoint script
COPY ./entrypoint.sh /code/entrypoint.sh
RUN chmod +x /code/entrypoint.sh

View file

@ -1,6 +1,11 @@
from django.apps import AppConfig
from django.conf import settings
class AdventuresConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "adventures"
default_auto_field = 'django.db.models.BigAutoField'
name = 'adventures'
def ready(self):
if settings.SCHEDULER_AUTOSTART:
from .scheduler import start_scheduler
start_scheduler()

View file

@ -0,0 +1,36 @@
# scheduler.py
import logging
from apscheduler.schedulers.background import BackgroundScheduler
from django_apscheduler.jobstores import DjangoJobStore
from django_apscheduler import util
from django.conf import settings
from django.core.management import call_command
logger = logging.getLogger(__name__)
def run_worldtravel_seed():
logger.info("Starting worldtravel-seed job")
try:
call_command('worldtravel-seed', '--force')
logger.info("worldtravel-seed job completed successfully")
except Exception as e:
logger.error(f"Error in worldtravel-seed job: {str(e)}")
@util.close_old_connections
def start_scheduler():
scheduler = BackgroundScheduler(timezone=settings.TIME_ZONE)
scheduler.add_jobstore(DjangoJobStore(), "default")
scheduler.add_job(
run_worldtravel_seed,
trigger="interval",
hours=24,
id="worldtravel_seed",
max_instances=1,
replace_existing=True,
)
logger.info("Starting scheduler...")
scheduler.start()
return scheduler

View file

@ -58,6 +58,7 @@ INSTALLED_APPS = (
'adventures',
'worldtravel',
'users',
'django_apscheduler',
)
@ -71,12 +72,18 @@ MIDDLEWARE = (
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'allauth.account.middleware.AccountMiddleware',
)
# disable verifications for new users
ACCOUNT_EMAIL_VERIFICATION = 'none'
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
}
}
# For backwards compatibility for Django 1.8
MIDDLEWARE_CLASSES = MIDDLEWARE
@ -230,3 +237,30 @@ from os import getenv
CSRF_TRUSTED_ORIGINS = [origin.strip() for origin in getenv('CSRF_TRUSTED_ORIGINS', 'http://localhost').split(',') if origin.strip()]
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
},
'file': {
'class': 'logging.FileHandler',
'filename': 'scheduler.log',
},
},
'root': {
'handlers': ['console', 'file'],
'level': 'INFO',
},
'loggers': {
'django': {
'handlers': ['console', 'file'],
'level': 'INFO',
'propagate': False,
},
},
}
SCHEDULER_AUTOSTART = True

View file

@ -10,4 +10,5 @@ python-dotenv
psycopg2-binary
Pillow
whitenoise
django-resized
django-resized
django-apscheduler