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)
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)
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)
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)