Newer
Older
from dateutil.relativedelta import relativedelta
from django.conf import settings
from django.contrib.messages.storage.fallback import FallbackStorage
from django.core.management.base import BaseCommand
from django.http import HttpRequest
from django.utils import timezone
from django.urls import set_urlconf
from opentech.apply.activity.messaging import MESSAGES, messenger
from opentech.apply.home.models import ApplyHomePage
from opentech.apply.projects.models import Project
class Command(BaseCommand):
help = 'Notify users that they have a report due soon'
def add_arguments(self, parser):
parser.add_argument('days_before', type=int)
def handle(self, *args, **options):
site = ApplyHomePage.objects.first().get_site()
set_urlconf('opentech.apply.urls')
# Mock a HTTPRequest in order to pass the site settings into the
# templates
request = HttpRequest()
request.META['SERVER_NAME'] = site.hostname
request.META['SERVER_PORT'] = site.port
request.META[settings.SECURE_PROXY_SSL_HEADER] = 'https'
request.session = {}
request._messages = FallbackStorage(request)
today = timezone.now().date()
due_date = today + relativedelta(days=options['days_before'])
for project in Project.objects.in_progress():
next_report = project.report_config.current_due_report()
due_soon = next_report.end_date == due_date
not_notified_today = (
not next_report.notified or
next_report.notified.date() != today
)
if due_soon and not_notified_today:
messenger(
MESSAGES.REPORT_NOTIFY,
request=request,
user=None,
source=project,
related=next_report,
)
# Notify about the due report
next_report.notified = timezone.now()
next_report.save()
self.stdout.write(
self.style.SUCCESS(f'Notified project: {project.id}')
)