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 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()
# 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}')
)