def send_sync_notifications(notification_id): """ Given changed instance, calculate the history entry and a complete list for users to notify, send email to all users. """ notification = HistoryChangeNotification.objects.select_for_update().get(pk=notification_id) # If the las modification is too recent we ignore it now = timezone.now() time_diff = now - notification.updated_datetime if time_diff.seconds < settings.CHANGE_NOTIFICATIONS_MIN_INTERVAL: return history_entries = tuple(notification.history_entries.all().order_by("created_at")) obj, _ = get_last_snapshot_for_key(notification.key) context = {"snapshot": obj.snapshot, "project": notification.project, "changer": notification.owner, "history_entries": history_entries} model = get_model_from_key(notification.key) template_name = _resolve_template_name(model, change_type=notification.history_type) email = _make_template_mail(template_name) for user in notification.notify_users.distinct(): email.send(user.email, context) notification.delete()
def send_sync_notifications(notification_id): """ Given changed instance, calculate the history entry and a complete list for users to notify, send email to all users. """ notification = HistoryChangeNotification.objects.select_for_update().get(pk=notification_id) # If the last modification is too recent we ignore it now = timezone.now() time_diff = now - notification.updated_datetime if time_diff.seconds < settings.CHANGE_NOTIFICATIONS_MIN_INTERVAL: return history_entries = tuple(notification.history_entries.all().order_by("created_at")) obj, _ = get_last_snapshot_for_key(notification.key) obj_class = get_model_from_key(obj.key) context = {"obj_class": obj_class, "snapshot": obj.snapshot, "project": notification.project, "changer": notification.owner, "history_entries": history_entries} model = get_model_from_key(notification.key) template_name = _resolve_template_name(model, change_type=notification.history_type) email = _make_template_mail(template_name) domain = settings.SITES["api"]["domain"].split(":")[0] or settings.SITES["api"]["domain"] if "ref" in obj.snapshot: msg_id = obj.snapshot["ref"] elif "slug" in obj.snapshot: msg_id = obj.snapshot["slug"] else: msg_id = 'taiga-system' now = datetime.datetime.now() format_args = { "project_slug": notification.project.slug, "project_name": notification.project.name, "msg_id": msg_id, "time": int(now.timestamp()), "domain": domain } headers = { "Message-ID": "<{project_slug}/{msg_id}/{time}@{domain}>".format(**format_args), "In-Reply-To": "<{project_slug}/{msg_id}@{domain}>".format(**format_args), "References": "<{project_slug}/{msg_id}@{domain}>".format(**format_args), "List-ID": 'Taiga/{project_name} <taiga.{project_slug}@{domain}>'.format(**format_args), "Thread-Index": make_ms_thread_index("<{project_slug}/{msg_id}@{domain}>".format(**format_args), now) } for user in notification.notify_users.distinct(): context["user"] = user context["lang"] = user.lang or settings.LANGUAGE_CODE email.send(user.email, context, headers=headers) notification.delete()
def send_sync_notifications(notification_id): """ Given changed instance, calculate the history entry and a complete list for users to notify, send email to all users. """ notification = HistoryChangeNotification.objects.select_for_update().get(pk=notification_id) # Custom Hardcode Filter if settings.NOTIFICATIONS_CUSTOM_FILTER: allowed_keys = [ "userstories.userstory", "epics.epic", "issues.issue", ] if not any([(notification.key.find(key) >= 0) for key in allowed_keys]): notification.delete() return False, [] # If the last modification is too recent we ignore it for the time being now = timezone.now() time_diff = now - notification.updated_datetime if time_diff.seconds < settings.CHANGE_NOTIFICATIONS_MIN_INTERVAL: return False, [] # Custom Hardcode Filter qs = notification.history_entries if settings.NOTIFICATIONS_CUSTOM_FILTER: queries = [ ~Q(comment=""), Q(key__startswith="epics.epic", type=HistoryType.create), Q(Q(key__startswith="userstories.userstory"), ~Q(values__users={}), ~Q(values__users=[])), Q(Q(key__startswith="issues.issue"), ~Q(values__users={}), ~Q(values__users=[])), ] query = queries.pop() for item in queries: query |= item qs = qs.filter(query).order_by("created_at") else: qs = qs.all() history_entries = tuple(qs) history_entries = list(squash_history_entries(history_entries)) # If there are no effective modifications we can delete this notification # without further processing if notification.history_type == HistoryType.change and not history_entries: notification.delete() return False, [] obj, _ = get_last_snapshot_for_key(notification.key) obj_class = get_model_from_key(obj.key) context = {"obj_class": obj_class, "snapshot": obj.snapshot, "project": notification.project, "changer": notification.owner, "history_entries": history_entries} model = get_model_from_key(notification.key) template_name = _resolve_template_name(model, change_type=notification.history_type) email = _make_template_mail(template_name) domain = settings.SITES["api"]["domain"].split(":")[0] or settings.SITES["api"]["domain"] if "ref" in obj.snapshot: msg_id = obj.snapshot["ref"] elif "slug" in obj.snapshot: msg_id = obj.snapshot["slug"] else: msg_id = 'taiga-system' now = datetime.datetime.now() project_name = remove_lr_cr(notification.project.name) format_args = { "unsubscribe_url": resolve_front_url('settings-mail-notifications'), "project_slug": notification.project.slug, "project_name": project_name, "msg_id": msg_id, "time": int(now.timestamp()), "domain": domain } headers = { "Message-ID": "<{project_slug}/{msg_id}/{time}@{domain}>".format(**format_args), "In-Reply-To": "<{project_slug}/{msg_id}@{domain}>".format(**format_args), "References": "<{project_slug}/{msg_id}@{domain}>".format(**format_args), "List-ID": 'Taiga/{project_name} <taiga.{project_slug}@{domain}>'.format(**format_args), "Thread-Index": make_ms_thread_index("<{project_slug}/{msg_id}@{domain}>".format(**format_args), now), "List-Unsubscribe": "<{unsubscribe_url}>".format(**format_args), } for user in notification.notify_users.distinct(): context["user"] = user context["lang"] = user.lang or settings.LANGUAGE_CODE email.send(user.email, context, headers=headers) notification_id = notification.id notification.delete() return notification_id, history_entries