Skip to content

Commit

Permalink
♻️ Use new delivery reporter
Browse files Browse the repository at this point in the history
  • Loading branch information
pajowu committed Sep 11, 2023
1 parent a406bf0 commit 631b97b
Show file tree
Hide file tree
Showing 10 changed files with 127 additions and 324 deletions.
29 changes: 18 additions & 11 deletions froide/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
from pytest_factoryboy import register

from froide.account.factories import UserFactory
from froide.foirequest import delivery
from froide.foirequest.delivery import DeliveryReport
from froide.foirequest.models import FoiMessage, FoiRequest
from froide.foirequest.signals import email_left_queue
from froide.foirequest.tests.factories import (
FoiMessageFactory,
FoiProjectFactory,
Expand Down Expand Up @@ -85,13 +85,20 @@ def email_always_send(monkeypatch, request):
"""Instantly mark all messages as delivered"""
if "no_delivery_mock" in request.keywords:
return
monkeypatch.setattr(
delivery,
"get_delivery_report",
lambda *_args, **_kwargs: DeliveryReport(
log="loglines",
time_diff=None,

def deliver_send_messages(sender, message: FoiMessage, **kwargs):
email_left_queue.send(
sender=sender,
to=message.recipient_email,
from_address=message.sender_email,
message_id=message.email_message_id,
status="sent",
message_id="message_id",
),
)
log=[],
)

FoiRequest.message_sent.connect(deliver_send_messages)

def remove_signal_handler():
FoiRequest.message_sent.disconnect(deliver_send_messages)

request.addfinalizer(remove_signal_handler)
183 changes: 0 additions & 183 deletions froide/foirequest/delivery.py

This file was deleted.

17 changes: 17 additions & 0 deletions froide/foirequest/migrations/0064_foimessage_confirmation_sent.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 4.0.8 on 2022-11-30 13:19

from django.db import migrations, models


class Migration(migrations.Migration):
dependencies = [
("foirequest", "0063_alter_foirequest_costs"),
]

operations = [
migrations.AddField(
model_name="foimessage",
name="confirmation_sent",
field=models.BooleanField(default=False, verbose_name="Confirmation sent?"),
),
]
2 changes: 2 additions & 0 deletions froide/foirequest/models/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,8 @@ class FoiMessage(models.Model):
)
tags = TaggableManager(through=TaggedMessage, verbose_name=_("tags"), blank=True)

confirmation_sent = models.BooleanField(_("Confirmation sent?"), default=False)

objects = FoiMessageManager()

class Meta:
Expand Down
102 changes: 57 additions & 45 deletions froide/foirequest/signals.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,51 +197,6 @@ def send_foiproject_created_confirmation(sender, **kwargs):
)


@receiver(
FoiRequest.message_delivered, dispatch_uid="send_foimessage_sent_confirmation"
)
def send_foimessage_sent_confirmation(sender, message: FoiMessage = None, **kwargs):
if message.is_not_email:
# All non-email sent messages are not interesting to users.
# Don't inform them about it.
return
if message.is_bulk:
# Don't notify on bulk message sending
return

messages = sender.get_messages()
start_thread = False
if len(messages) == 1:
if sender.project_id is not None:
# Don't notify on first message in a project
return
subject = _("Your Freedom of Information Request was sent")
mail_intent = confirm_foi_request_sent_email
action_url = sender.get_absolute_domain_short_url()
start_thread = True
else:
subject = _("Your message was sent")
mail_intent = confirm_foi_message_sent_email
action_url = message.get_absolute_domain_short_url()

upload_url = sender.user.get_autologin_url(
short_request_url("foirequest-upload_postal_message", sender)
)

context = {
"foirequest": sender,
"user": sender.user,
"publicbody": message.recipient_public_body,
"message": message,
"action_url": action_url,
"upload_action_url": upload_url,
}

send_request_user_email(
mail_intent, sender, subject=subject, context=context, start_thread=start_thread
)


# Updating public body request counts
@receiver(
FoiRequest.request_to_public_body, dispatch_uid="foirequest_increment_request_count"
Expand Down Expand Up @@ -488,3 +443,60 @@ def save_delivery_status(
"last_update": timezone.now(),
},
)

if status == "sent":
send_foimessage_sent_confirmation(message)


def send_foimessage_sent_confirmation(message: FoiMessage = None, **kwargs):
request = message.request
if message.is_not_email:
# All non-email sent messages are not interesting to users.
# Don't inform them about it.
return
if message.is_bulk:
# Don't notify on bulk message sending
return

if message.confirmation_sent:
# Don't send a second confirmation for this message
return

messages = request.get_messages()
start_thread = False
if len(messages) == 1:
if request.project_id is not None:
# Don't notify on first message in a project
return
subject = _("Your Freedom of Information Request was sent")
mail_intent = confirm_foi_request_sent_email
action_url = request.get_absolute_domain_short_url()
start_thread = True
else:
subject = _("Your message was sent")
mail_intent = confirm_foi_message_sent_email
action_url = message.get_absolute_domain_short_url()

upload_url = request.user.get_autologin_url(
short_request_url("foirequest-upload_postal_message", request)
)

context = {
"foirequest": request,
"user": request.user,
"publicbody": message.recipient_public_body,
"message": message,
"action_url": action_url,
"upload_action_url": upload_url,
}

send_request_user_email(
mail_intent,
request,
subject=subject,
context=context,
start_thread=start_thread,
)

message.confirmation_sent = True
message.save(update_fields=["confirmation_sent"])
11 changes: 0 additions & 11 deletions froide/foirequest/tests/test_api.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import json
from datetime import timedelta
from unittest import mock
from urllib.parse import urlencode

from django.conf import settings
Expand All @@ -12,7 +11,6 @@

from oauth2_provider.models import get_access_token_model, get_application_model

from froide.foirequest.delivery import DeliveryReport
from froide.foirequest.models import FoiAttachment, FoiRequest
from froide.foirequest.tests import factories
from froide.publicbody.models import PublicBody
Expand Down Expand Up @@ -311,15 +309,6 @@ def test_request_creation_without_scope(self):
self.assertEqual(old_count, new_count)
self.assertEqual(len(mail.outbox), 0)

@mock.patch(
"froide.foirequest.delivery.get_delivery_report",
lambda *_args, **_kwargs: DeliveryReport(
log="loglines",
time_diff=None,
status="sent",
message_id="message_id",
),
)
def test_request_creation_with_scope(self):
self.access_token.scope = "read:user make:request"
self.access_token.save()
Expand Down
Loading

0 comments on commit 631b97b

Please sign in to comment.