Skip to content
Snippets Groups Projects
notify_report_due.py 2.02 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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}')
                    )