def handle(self, *args, **options):
        from apps.fixmystreet.models import ReportEventLog, ReportSubscription

        # Events related to subscriptions
        SUBSCRIPTION_EVENTS = [
            ReportEventLog.REFUSE, ReportEventLog.CLOSE,

            ReportEventLog.VALID, ReportEventLog.REOPEN,

            ReportEventLog.PLANNED, ReportEventLog.MERGED, ReportEventLog.UPDATE_PUBLISHED,

            ReportEventLog.APPLICANT_ASSIGNED, ReportEventLog.CONTRACTOR_ASSIGNED,

            ReportEventLog.MANAGER_ASSIGNED, ReportEventLog.REFUSE,
        ]

        # Date of yesterday (or specific date)
        if options['date']:
            YESTERDAY = datetime.datetime.strptime(options['date'], "%d/%m/%Y").date()
        else:
            YESTERDAY = datetime.date.today() - datetime.timedelta(days=1)

        logger.info('DIGEST OF SUBSCRIPTIONS FOR ACTVITIES OF %s' % YESTERDAY)

        # All events of yesterday
        events_yesterday = ReportEventLog.objects.filter(event_at__contains=YESTERDAY, event_type__in=SUBSCRIPTION_EVENTS)

        # All reports related to events of yesterday
        reports_list = events_yesterday.order_by('report').distinct('report').values_list('report', flat=True)

        # All subscriptions of reports related to events of yesterday
        subscriptions_list = ReportSubscription.objects.filter(report__id__in=reports_list)
        subscribers_list   = subscriptions_list.distinct('subscriber')

        for subscription in subscribers_list:
            user = subscription.subscriber

            # Returns all activities of yesterday grouped by reports where there are subscriptions with this user
            # If user is citizen, do not get activities of private reports
            activities_list = events_yesterday \
                .filter(report__id__in=subscriptions_list.filter(subscriber=user) \
                .values_list('report', flat=True), report__private__in=[False, user.is_pro()]) \
                .exclude(user=user) \
                .order_by('report', 'event_at')

            if not activities_list:
                continue

            logger.info('Digest of %s' % user.email)
            logger.info('   Number of activities: %s' % activities_list.count())

            for activity in activities_list:
                logger.info('   %s %s %s' % (activity.event_at, activity.report.id, activity.event_type))

            # If NOT option send, do not send email
            if not options['send']:
                continue

            # Render and send the digest by mail
            send_digest(user, None, activities_list, YESTERDAY)
示例#2
0
    def handle(self, *args, **options):
        from apps.fixmystreet.models import GroupMailConfig, OrganisationEntity, ReportEventLog, UserOrganisationMembership

        # Date of yesterday (or specific date)
        if options['date']:
            YESTERDAY = datetime.datetime.strptime(options['date'], "%d/%m/%Y").date()
        else:
            YESTERDAY = datetime.date.today() - datetime.timedelta(days=1)

        logger.info('DIGEST OF NOTIFICATIONS FOR ACTVITIES OF %s' % YESTERDAY)

        # All group mail configurations with at least 1 digest config
        group_mail_configs = GroupMailConfig.objects.filter(group__type=OrganisationEntity.DEPARTMENT).filter(Q(digest_closed=True) | Q(digest_created=True) | Q(digest_inprogress=True) | Q(digest_other=True))
        logger.info('group_mail_configs %s' % group_mail_configs)

        # All group having digest config
        groups = group_mail_configs.values_list('group', flat=True)
        logger.info('groups %s' % groups)

        # All events of yesterday related to groups
        events_yesterday = ReportEventLog.objects.filter(event_at__contains=YESTERDAY, report__responsible_department__in=groups)
        logger.info('events_yesterday %s' % events_yesterday)

        for mail_config in group_mail_configs:
            group = mail_config.group

            # Returns all activities of yesterday grouped by reports where and related to group
            activities_list = events_yesterday.filter(report__responsible_department=group)

            if not activities_list:
                continue

            # Send digest to responsibles according to mail config
            recipients = mail_config.get_manager_recipients()

            logger.info('Digest of %s %s' % (group, recipients))
            logger.info('   Number of activities: %s' % activities_list.count())

            for activity in activities_list:
                logger.info('   %s %s %s' % (activity.event_at, activity.report.id, activity))

            # If NOT option send, do not send email
            if not options['send']:
                continue

            for recipient in recipients:
                # Because recipients are email and can be a user or group email, have to mock a user
                user = FMSUser()
                user.email = recipient
                user.is_pro = lambda: True
                user.last_used_language = "fr"

                # Render and send the digest by mail
                send_digest(user, activity, activities_list, YESTERDAY)
示例#3
0
    def handle(self, *args, **options):
        from apps.fixmystreet.models import ReportEventLog, ReportSubscription

        # Events related to subscriptions
        SUBSCRIPTION_EVENTS = [
            ReportEventLog.REFUSE,
            ReportEventLog.CLOSE,
            ReportEventLog.VALID,
            ReportEventLog.REOPEN,
            ReportEventLog.PLANNED,
            ReportEventLog.MERGED,
            ReportEventLog.UPDATE_PUBLISHED,
            ReportEventLog.APPLICANT_ASSIGNED,
            ReportEventLog.CONTRACTOR_ASSIGNED,
            ReportEventLog.MANAGER_ASSIGNED,
            ReportEventLog.REFUSE,
        ]

        # Date of yesterday (or specific date)
        if options['date']:
            YESTERDAY = datetime.datetime.strptime(options['date'],
                                                   "%d/%m/%Y").date()
        else:
            YESTERDAY = datetime.date.today() - datetime.timedelta(days=1)

        logger.info('DIGEST OF SUBSCRIPTIONS FOR ACTVITIES OF %s' % YESTERDAY)

        # All events of yesterday
        events_yesterday = ReportEventLog.objects.filter(
            event_at__contains=YESTERDAY, event_type__in=SUBSCRIPTION_EVENTS)

        # All reports related to events of yesterday
        reports_list = events_yesterday.order_by('report').distinct(
            'report').values_list('report', flat=True)

        # All subscriptions of reports related to events of yesterday
        subscriptions_list = ReportSubscription.objects.filter(
            report__id__in=reports_list)
        subscribers_list = subscriptions_list.distinct('subscriber')

        for subscription in subscribers_list:
            user = subscription.subscriber

            # Returns all activities of yesterday grouped by reports where there are subscriptions with this user
            # If user is citizen, do not get activities of private reports
            activities_list = events_yesterday \
                .filter(report__id__in=subscriptions_list.filter(subscriber=user) \
                .values_list('report', flat=True), report__private__in=[False, user.is_pro()]) \
                .exclude(user=user) \
                .order_by('report', 'event_at')

            if not activities_list:
                continue

            logger.info('Digest of %s' % user.email)
            logger.info('   Number of activities: %s' %
                        activities_list.count())

            for activity in activities_list:
                logger.info('   %s %s %s' %
                            (activity.event_at, activity.report.id,
                             activity.event_type))

            # If NOT option send, do not send email
            if not options['send']:
                continue

            # Render and send the digest by mail
            send_digest(user, None, activities_list, YESTERDAY)
示例#4
0
    def handle(self, *args, **options):
        from apps.fixmystreet.models import GroupMailConfig, OrganisationEntity, ReportEventLog, UserOrganisationMembership

        # Date of yesterday (or specific date)
        if options['date']:
            YESTERDAY = datetime.datetime.strptime(options['date'],
                                                   "%d/%m/%Y").date()
        else:
            YESTERDAY = datetime.date.today() - datetime.timedelta(days=1)

        logger.info('DIGEST OF NOTIFICATIONS FOR ACTVITIES OF %s' % YESTERDAY)

        # All group mail configurations with at least 1 digest config
        group_mail_configs = GroupMailConfig.objects.filter(
            group__type=OrganisationEntity.DEPARTMENT).filter(
                Q(digest_closed=True) | Q(digest_created=True)
                | Q(digest_inprogress=True) | Q(digest_other=True))
        logger.info('group_mail_configs %s' % group_mail_configs)

        # All group having digest config
        groups = group_mail_configs.values_list('group', flat=True)
        logger.info('groups %s' % groups)

        # All events of yesterday related to groups
        events_yesterday = ReportEventLog.objects.filter(
            event_at__contains=YESTERDAY,
            report__responsible_department__in=groups)
        logger.info('events_yesterday %s' % events_yesterday)

        for mail_config in group_mail_configs:
            group = mail_config.group

            # Returns all activities of yesterday grouped by reports where and related to group
            activities_list = events_yesterday.filter(
                report__responsible_department=group)

            if not activities_list:
                continue

            # Send digest to responsibles according to mail config
            recipients = mail_config.get_manager_recipients()

            logger.info('Digest of %s %s' % (group, recipients))
            logger.info('   Number of activities: %s' %
                        activities_list.count())

            for activity in activities_list:
                logger.info('   %s %s %s' %
                            (activity.event_at, activity.report.id,
                             activity.event_type))

            # If NOT option send, do not send email
            if not options['send']:
                continue

            for recipient in recipients:
                # Because recipients are email and can be a user or group email, have to mock a user
                user = FMSUser()
                user.email = recipient
                user.is_pro = lambda: True
                user.last_used_language = "fr"

                # Render and send the digest by mail
                send_digest(user, None, activities_list, YESTERDAY)