Skip to content
Snippets Groups Projects
notify_report_due.py 2.1 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 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}')
                    )