From 3efc87d06f9e161d1ecb07cb9d320be2ec434fc9 Mon Sep 17 00:00:00 2001 From: Fritz Brand Date: Thu, 1 Aug 2024 15:15:48 +0200 Subject: [PATCH 1/5] Working on submission status --- home/models.py | 77 +++++++++++++++++++++++++++---------------- home/wagtail_hooks.py | 1 + 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/home/models.py b/home/models.py index bc1edc50..2d9a52dc 100644 --- a/home/models.py +++ b/home/models.py @@ -1613,10 +1613,13 @@ def save_revision( previous_revision, clean, ) + print(f"Template Status {self.status()}") + print(self.fields) if not settings.WHATSAPP_CREATE_TEMPLATES: return revision - + + # If there are any missing fields in the previous revision, then carry on if previous_revision: previous_revision = previous_revision.as_object() @@ -1626,34 +1629,49 @@ def save_revision( if self.fields == previous_revision_fields: return revision - - self.template_name = self.create_whatsapp_template_name() - try: - response_json = create_standalone_whatsapp_template( - name=self.template_name, - message=self.message, - category=self.category, - locale=self.locale, - quick_replies=sorted(self.quick_reply_buttons), - image_obj=self.image, - example_values=[v["value"] for v in self.example_values.raw_data], - ) - revision.content["name"] = self.name - revision.content["submission_name"] = self.template_name - revision.content["submission_status"] = self.SubmissionStatus.SUBMITTED - revision.content["submission_result"] = ( - f"Success! Template ID = {response_json['id']}" - ) - except TemplateSubmissionException as e: - # The submission failed - revision.content["name"] = self.name - revision.content["submission_name"] = self.template_name - revision.content["submission_status"] = self.SubmissionStatus.FAILED - revision.content["submission_result"] = ( - f"Error! {e.response_json['error']['error_user_msg']} " - ) - - revision.save(update_fields=["content"]) + + # Only submit the template to WhatsApp if the status is live + template_status = self.status() + if self.status() == "Live": + print("Going to submit template as its live") + # self.template_name = self.create_whatsapp_template_name() + # try: + # response_json = create_standalone_whatsapp_template( + # name=self.template_name, + # message=self.message, + # category=self.category, + # locale=self.locale, + # quick_replies=sorted(self.quick_reply_buttons), + # image_obj=self.image, + # example_values=[v["value"] for v in self.example_values.raw_data], + # ) + # revision.content["name"] = self.name + # revision.content["submission_name"] = self.template_name + # revision.content["submission_status"] = self.SubmissionStatus.SUBMITTED + # revision.content["submission_result"] = ( + # f"Success! Template ID = {response_json['id']}" + # ) + # except TemplateSubmissionException as e: + # # The submission failed + # revision.content["name"] = self.name + # revision.content["submission_name"] = self.template_name + # revision.content["submission_status"] = self.SubmissionStatus.FAILED + # revision.content["submission_result"] = ( + # f"Error! {e.response_json['error']['error_user_msg']} " + # ) + # revision.save(update_fields=["content"]) + + + #Update the submissions status fields for all revisions + # revisions = self.revisions + # for r in revisions: + # r.content["submission_name"] = "temp" + # r.content["submission_status"] = _(self.SubmissionStatus.FAILED) + # r.content["submission_result"] = "moretemp" + # r.save() + # print("Rev deets") + # revs = super().revisions(self) + # print(revisions) return revision def clean(self): @@ -1730,6 +1748,7 @@ def fields(self): sorted(self.quick_reply_buttons), self.image, self.example_values, + self.status() ) def create_whatsapp_template_name(self) -> str: diff --git a/home/wagtail_hooks.py b/home/wagtail_hooks.py index b16264ca..45b92b02 100644 --- a/home/wagtail_hooks.py +++ b/home/wagtail_hooks.py @@ -251,6 +251,7 @@ class WhatsAppTemplateAdmin(SnippetViewSet): "locale", "status", "submission_status", + "submission_result" ) list_filter = ("locale",) From 7fc03b9c4e3e240932075e8b2ffe388536eb7938 Mon Sep 17 00:00:00 2001 From: Fritz Brand Date: Mon, 5 Aug 2024 13:47:00 +0200 Subject: [PATCH 2/5] Overwrite the submission related fields of all revisions --- home/models.py | 91 ++++++++++++++++++++----------------------- home/wagtail_hooks.py | 2 +- 2 files changed, 44 insertions(+), 49 deletions(-) diff --git a/home/models.py b/home/models.py index b6ad1606..709ea866 100644 --- a/home/models.py +++ b/home/models.py @@ -1614,13 +1614,10 @@ def save_revision( previous_revision, clean, ) - print(f"Template Status {self.status()}") - print(self.fields) if not settings.WHATSAPP_CREATE_TEMPLATES: return revision - - + # If there are any missing fields in the previous revision, then carry on if previous_revision: previous_revision = previous_revision.as_object() @@ -1630,49 +1627,47 @@ def save_revision( if self.fields == previous_revision_fields: return revision - - # Only submit the template to WhatsApp if the status is live - template_status = self.status() - if self.status() == "Live": - print("Going to submit template as its live") - # self.template_name = self.create_whatsapp_template_name() - # try: - # response_json = create_standalone_whatsapp_template( - # name=self.template_name, - # message=self.message, - # category=self.category, - # locale=self.locale, - # quick_replies=sorted(self.quick_reply_buttons), - # image_obj=self.image, - # example_values=[v["value"] for v in self.example_values.raw_data], - # ) - # revision.content["name"] = self.name - # revision.content["submission_name"] = self.template_name - # revision.content["submission_status"] = self.SubmissionStatus.SUBMITTED - # revision.content["submission_result"] = ( - # f"Success! Template ID = {response_json['id']}" - # ) - # except TemplateSubmissionException as e: - # # The submission failed - # revision.content["name"] = self.name - # revision.content["submission_name"] = self.template_name - # revision.content["submission_status"] = self.SubmissionStatus.FAILED - # revision.content["submission_result"] = ( - # f"Error! {e.response_json['error']['error_user_msg']} " - # ) - # revision.save(update_fields=["content"]) - - - #Update the submissions status fields for all revisions - # revisions = self.revisions - # for r in revisions: - # r.content["submission_name"] = "temp" - # r.content["submission_status"] = _(self.SubmissionStatus.FAILED) - # r.content["submission_result"] = "moretemp" - # r.save() - # print("Rev deets") - # revs = super().revisions(self) - # print(revisions) + + self.template_name = self.create_whatsapp_template_name() + self.submission_status = "" + self.submission_result = "" + try: + response_json = create_standalone_whatsapp_template( + name=self.template_name, + message=self.message, + category=self.category, + locale=self.locale, + quick_replies=sorted(self.quick_reply_buttons), + image_obj=self.image, + example_values=[v["value"] for v in self.example_values.raw_data], + ) + self.submission_status = self.SubmissionStatus.SUBMITTED + self.submission_result = ( + f"Success! Template ID = {response_json['id']}" + ) + + + except TemplateSubmissionException as e: + # The submission failed + self.submission_status = self.SubmissionStatus.FAILED + self.submission_result = ( + f"Error! {e.response_json['error']['error_user_msg']} " + ) + + revision.content["name"] = self.name + revision.content["submission_name"] = self.template_name + revision.content["submission_status"] = self.submission_status + revision.content["submission_result"] = self.submission_result + + revision.save(update_fields=["content"]) + + # Update the submissions status fields for all revisions, regardless of Draft vs Live status + revisions = self.revisions + for r in revisions: + r.content["submission_name"] = self.template_name + r.content["submission_status"] = self.submission_status + r.content["submission_result"] = self.submission_result + r.save() return revision def clean(self): @@ -1749,7 +1744,7 @@ def fields(self): sorted(self.quick_reply_buttons), self.image, self.example_values, - self.status() + self.status(), ) def create_whatsapp_template_name(self) -> str: diff --git a/home/wagtail_hooks.py b/home/wagtail_hooks.py index 45b92b02..901665b2 100644 --- a/home/wagtail_hooks.py +++ b/home/wagtail_hooks.py @@ -251,7 +251,7 @@ class WhatsAppTemplateAdmin(SnippetViewSet): "locale", "status", "submission_status", - "submission_result" + "submission_result", ) list_filter = ("locale",) From 68f17eba20749c3cd11acb9ed1f09602b21c711c Mon Sep 17 00:00:00 2001 From: Fritz Brand Date: Tue, 6 Aug 2024 05:47:02 +0200 Subject: [PATCH 3/5] Publish latest revision to keep submission fields in sync --- ...lter_whatsapptemplate_submission_status.py | 27 +++++++++++++++++++ home/models.py | 18 +++++++------ 2 files changed, 37 insertions(+), 8 deletions(-) create mode 100644 home/migrations/0081_alter_whatsapptemplate_submission_status.py diff --git a/home/migrations/0081_alter_whatsapptemplate_submission_status.py b/home/migrations/0081_alter_whatsapptemplate_submission_status.py new file mode 100644 index 00000000..8ea46152 --- /dev/null +++ b/home/migrations/0081_alter_whatsapptemplate_submission_status.py @@ -0,0 +1,27 @@ +# Generated by Django 4.2.11 on 2024-08-06 03:26 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("home", "0080_assessment_skip_high_result_page_and_more"), + ] + + operations = [ + migrations.AlterField( + model_name="whatsapptemplate", + name="submission_status", + field=models.CharField( + blank=True, + choices=[ + ("NOT_SUBMITTED_YET", "Not Submitted Yet"), + ("SUBMITTED", "Submitted"), + ("FAILED", "Failed"), + ], + default="", + max_length=30, + ), + ), + ] diff --git a/home/models.py b/home/models.py index 709ea866..ed900c22 100644 --- a/home/models.py +++ b/home/models.py @@ -1558,7 +1558,7 @@ class SubmissionStatus(models.TextChoices): max_length=30, choices=SubmissionStatus.choices, blank=True, - default=SubmissionStatus.NOT_SUBMITTED_YET, + default="", ) submission_result = models.TextField( @@ -1641,15 +1641,12 @@ def save_revision( image_obj=self.image, example_values=[v["value"] for v in self.example_values.raw_data], ) - self.submission_status = self.SubmissionStatus.SUBMITTED - self.submission_result = ( - f"Success! Template ID = {response_json['id']}" - ) - + self.submission_status = _(self.SubmissionStatus.SUBMITTED) + self.submission_result = f"Success! Template ID = {response_json['id']}" except TemplateSubmissionException as e: # The submission failed - self.submission_status = self.SubmissionStatus.FAILED + self.submission_status = _(self.SubmissionStatus.FAILED) self.submission_result = ( f"Error! {e.response_json['error']['error_user_msg']} " ) @@ -1660,6 +1657,8 @@ def save_revision( revision.content["submission_result"] = self.submission_result revision.save(update_fields=["content"]) + # TODO this publish is a workaround for now, as described in ticket Delta-877 + revision.publish() # Update the submissions status fields for all revisions, regardless of Draft vs Live status revisions = self.revisions @@ -1667,6 +1666,10 @@ def save_revision( r.content["submission_name"] = self.template_name r.content["submission_status"] = self.submission_status r.content["submission_result"] = self.submission_result + # r.content["latest_revision"] = self.get_latest_revision().pk + # r.content["live_revision"] = self.get_latest_revision().pk + # r.content["last_published_at"] = datetime.datetime.now() + # r.content["first_published_at"] = datetime.datetime.now() r.save() return revision @@ -1744,7 +1747,6 @@ def fields(self): sorted(self.quick_reply_buttons), self.image, self.example_values, - self.status(), ) def create_whatsapp_template_name(self) -> str: From 2e84407c74dc03e437269980005ae2e3ab6ad7b8 Mon Sep 17 00:00:00 2001 From: Fritz Brand Date: Tue, 6 Aug 2024 06:08:29 +0200 Subject: [PATCH 4/5] Cleanup --- home/models.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/home/models.py b/home/models.py index ed900c22..6cc9a19c 100644 --- a/home/models.py +++ b/home/models.py @@ -1666,10 +1666,6 @@ def save_revision( r.content["submission_name"] = self.template_name r.content["submission_status"] = self.submission_status r.content["submission_result"] = self.submission_result - # r.content["latest_revision"] = self.get_latest_revision().pk - # r.content["live_revision"] = self.get_latest_revision().pk - # r.content["last_published_at"] = datetime.datetime.now() - # r.content["first_published_at"] = datetime.datetime.now() r.save() return revision From a21f914b9021cd619b35260f8da9550e045df017 Mon Sep 17 00:00:00 2001 From: Fritz Brand Date: Wed, 21 Aug 2024 09:46:12 +0200 Subject: [PATCH 5/5] Added validation that template message cannot exceed 1024 chars --- home/models.py | 3 ++- home/tests/test_models.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/home/models.py b/home/models.py index 6cc9a19c..fb54ee96 100644 --- a/home/models.py +++ b/home/models.py @@ -1681,7 +1681,8 @@ def clean(self): message = self.message - # TODO: Explain what this does, or find a cleaner implementation + if len(message) > 1024: + errors["message"] = ValidationError("Message cannot exceed 1024 characters") # Checks for mismatches in the number of opening and closing brackets. First from right to left, then from left to right # TODO: Currently "{1}" is allowed to pass and throws an error. Add a check for this, or redo this section in a cleaner way diff --git a/home/tests/test_models.py b/home/tests/test_models.py index 6f4ae652..259d7b45 100644 --- a/home/tests/test_models.py +++ b/home/tests/test_models.py @@ -801,6 +801,24 @@ def test_variables_are_ordered(self) -> None: ], } + def test_message_max_char_count(self) -> None: + """ + Template message field cannot exceed 1024. + """ + + with pytest.raises(ValidationError) as err_info: + wat = WhatsAppTemplate( + name="wa_title", + message="a" * 1025, + category="UTILITY", + locale=Locale.objects.get(language_code="en"), + ) + wat.full_clean() + + assert err_info.value.message_dict == { + "message": ["Message cannot exceed 1024 characters"], + } + @override_settings(WHATSAPP_CREATE_TEMPLATES=False) @responses.activate def test_template_is_not_submitted_if_template_creation_is_disabled(self) -> None: