Skip to content

Commit

Permalink
feat(Besoins): Permettre à une structure contactée de décliner dès l'…
Browse files Browse the repository at this point in the history
…e-mail (#1114)
  • Loading branch information
raphodn authored Mar 7, 2024
1 parent 8674309 commit fe8ec03
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 21 deletions.
27 changes: 24 additions & 3 deletions lemarche/templates/tenders/detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,33 @@
{% endblock %}

{% block modals %}
{% include "auth/_login_or_signup_siae_tender_modal.html" %}
{% include "tenders/_detail_contact_click_confirm_modal.html" %}
{% include "tenders/_detail_not_interested_click_confirm_modal.html" %}
{% if user.is_authenticated or siae_id %}
{% if not siae_has_detail_contact_click_date %}
{% include "auth/_login_or_signup_siae_tender_modal.html" %}
{% endif %}
{% if not siae_has_detail_cocontracting_click_date %}
{% include "tenders/_detail_contact_click_confirm_modal.html" %}
{% endif %}
{% if not siae_has_detail_not_interested_click_date %}
{% include "tenders/_detail_not_interested_click_confirm_modal.html" %}
{% endif %}
{% endif %}
{% endblock %}

{% block extra_js %}
{% if not siae_has_detail_not_interested_click_date %}
<script type="text/javascript">
const urlParams = new URLSearchParams(window.location.search);
if (urlParams.get('not_interested') && urlParams.get('not_interested') === 'True') {
// why click() instead of OpenBootstrapModal('#detail_not_interested_click_confirm_modal') ?
// why setTimeout ?
// --> to have the siae_id set in the modal
setTimeout(function() {
document.querySelector('#show-tender-not-interested-modal-btn').click();
}, 100);
}
</script>
{% endif %}
{% if TALLY_NPS_FORM_ID and show_nps %}
<script async type="text/javascript" src="https://tally.so/widgets/embed.js"></script>
<script type="text/javascript">
Expand Down
1 change: 1 addition & 0 deletions lemarche/www/tenders/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ def send_tender_email_to_siae(tender: Tender, siae: Siae, email_subject: str, em
"TENDER_AMOUNT": tender.amount_display,
"TENDER_DEADLINE_DATE": date_to_string(tender.deadline_date),
"TENDER_URL": f"{get_object_share_url(tender)}?siae_id={siae.id}",
"TENDER_NOT_INTERESTED_URL": f"{get_object_share_url(tender)}?siae_id={siae.id}&not_interested=True",
}

api_mailjet.send_transactional_email_with_template(
Expand Down
71 changes: 54 additions & 17 deletions lemarche/www/tenders/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -1454,45 +1454,82 @@ def setUpTestData(self):
"tenders:detail-not-interested-click", kwargs={"slug": self.tender.slug}
)

def test_user_can_notify_not_interested_wish_with_siae_id(self):
def test_anonymous_user_cannot_notify_not_interested(self):
response = self.client.get(self.tender_detail_url)
self.assertContains(response, self.cta_message)
self.assertNotContains(response, 'id="detail_not_interested_click_confirm_modal"')
self.assertNotContains(response, self.cta_message_success)
# anonymous user
response = self.client.post(self.tender_not_interested_url, data={})
self.assertEqual(response.status_code, 403)
# wrong siae_id
response = self.client.post(f"{self.tender_not_interested_url}?siae_id=999999", data={}, follow=True)
self.assertContains(response, self.cta_message)
# workflow
response = self.client.get(self.tender_detail_url)
self.assertContains(response, self.cta_message)
self.assertNotContains(response, self.cta_message_success)
tendersiae = TenderSiae.objects.get(tender=self.tender, siae=self.siae)
self.assertIsNone(tendersiae.detail_not_interested_click_date)
response = self.client.post(f"{self.tender_not_interested_url}?siae_id={self.siae.id}", data={}, follow=True)
self.assertContains(response, self.cta_message_success)
tendersiae = TenderSiae.objects.get(tender=self.tender, siae=self.siae)
self.assertIsNotNone(tendersiae.detail_not_interested_click_date)
response = self.client.get(f"{self.tender_detail_url}?siae_id={self.siae.id}")
self.assertContains(response, self.cta_message_success)
self.assertNotContains(response, self.cta_message)

def test_user_can_notify_not_interested_wish_with_authenticated_user(self):
self.client.force_login(self.siae_user)
# workflow
response = self.client.get(self.tender_detail_url)
self.assertContains(response, self.cta_message)
self.assertContains(response, 'id="detail_not_interested_click_confirm_modal"')
self.assertNotContains(response, self.cta_message_success)
response = self.client.post(
self.tender_not_interested_url, data={"detail_not_interested_feedback": "reason"}, follow=True
)
tendersiae = TenderSiae.objects.get(tender=self.tender, siae=self.siae)
self.assertNotContains(response, self.cta_message)
self.assertNotContains(response, 'id="detail_not_interested_click_confirm_modal"')
self.assertContains(response, self.cta_message_success)
self.assertIsNotNone(tendersiae.detail_not_interested_click_date)
self.assertEqual(tendersiae.detail_not_interested_feedback, "reason")
response = self.client.get(self.tender_detail_url)
self.assertNotContains(response, self.cta_message)
self.assertNotContains(response, 'id="detail_not_interested_click_confirm_modal"')
self.assertContains(response, self.cta_message_success)

def test_user_can_notify_not_interested_wish_with_siae_id_in_url(self):
# wrong siae_id
response = self.client.post(f"{self.tender_not_interested_url}?siae_id=999999", data={}, follow=True)
self.assertContains(response, self.cta_message)
self.assertContains(response, 'id="detail_not_interested_click_confirm_modal"')
self.assertNotContains(response, self.cta_message_success)
# workflow
tendersiae = TenderSiae.objects.get(tender=self.tender, siae=self.siae)
self.assertIsNone(tendersiae.detail_not_interested_click_date)
response = self.client.post(f"{self.tender_not_interested_url}?siae_id={self.siae.id}", data={}, follow=True)
self.assertNotContains(response, self.cta_message)
self.assertNotContains(response, 'id="detail_not_interested_click_confirm_modal"')
self.assertContains(response, self.cta_message_success)
tendersiae = TenderSiae.objects.get(tender=self.tender, siae=self.siae)
self.assertIsNotNone(tendersiae.detail_not_interested_click_date)
response = self.client.get(f"{self.tender_detail_url}?siae_id={self.siae.id}")
self.assertNotContains(response, self.cta_message)
self.assertNotContains(response, 'id="detail_not_interested_click_confirm_modal"')
self.assertContains(response, self.cta_message_success)


def test_user_can_notify_not_interested_wish_with_siae_id_and_answer_in_url(self):
# wrong siae_id
response = self.client.post(
f"{self.tender_not_interested_url}?siae_id=999999&not_interested=True", data={}, follow=True
)
self.assertContains(response, self.cta_message)
self.assertContains(response, 'modal-siae" id="detail_not_interested_click_confirm_modal"')
self.assertNotContains(response, 'modal-siae show" id="detail_not_interested_click_confirm_modal"')
self.assertNotContains(response, self.cta_message_success)
# workflow
tendersiae = TenderSiae.objects.get(tender=self.tender, siae=self.siae)
self.assertIsNone(tendersiae.detail_not_interested_click_date)
response = self.client.post(
f"{self.tender_not_interested_url}?siae_id={self.siae.id}&not_interested=True", data={}, follow=True
)
self.assertContains(response, self.cta_message)
self.assertNotContains(response, 'modal-siae" id="detail_not_interested_click_confirm_modal"')
self.assertContains(response, 'modal-siae show" id="detail_not_interested_click_confirm_modal"')
self.assertNotContains(response, self.cta_message_success)
tendersiae = TenderSiae.objects.get(tender=self.tender, siae=self.siae)
self.assertIsNotNone(tendersiae.detail_not_interested_click_date)
response = self.client.get(f"{self.tender_detail_url}?siae_id={self.siae.id}")
self.assertNotContains(response, self.cta_message)
self.assertNotContains(response, 'id="detail_not_interested_click_confirm_modal"')
self.assertContains(response, self.cta_message_success)


# TODO: this test doesn't work anymore. find a way to test logging post-email in non-prod environments?
Expand Down
2 changes: 1 addition & 1 deletion lemarche/www/tenders/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -511,7 +511,7 @@ class TenderDetailNotInterestedClickView(SiaeUserRequiredOrSiaeIdParamMixin, Det
Endpoint to handle 'not interested' button click
"""

template_name = "tenders/_detail_not_interested_click_confirm.html"
template_name = "tenders/_detail_not_interested_click_confirm_modal.html"
model = Tender

def get_object(self):
Expand Down

0 comments on commit fe8ec03

Please sign in to comment.