diff --git a/frappe/email/doctype/newsletter/newsletter.js b/frappe/email/doctype/newsletter/newsletter.js index 8a81bbaab3..5b1a831759 100644 --- a/frappe/email/doctype/newsletter/newsletter.js +++ b/frappe/email/doctype/newsletter/newsletter.js @@ -112,12 +112,14 @@ frappe.ui.form.on("Newsletter", { options: { minDate: new Date(), }, + reqd: true, }, { label: __("Time"), fieldname: "time", fieldtype: "Select", options: time_slots, + reqd: true, }, ], primary_action_label: __("Schedule"), diff --git a/frappe/email/doctype/newsletter/newsletter.py b/frappe/email/doctype/newsletter/newsletter.py index 09200e3635..5aabe3d85e 100644 --- a/frappe/email/doctype/newsletter/newsletter.py +++ b/frappe/email/doctype/newsletter/newsletter.py @@ -55,6 +55,7 @@ class Newsletter(WebsiteGenerator): self.validate_sender_address() self.validate_recipient_address() self.validate_publishing() + self.validate_scheduling_date() @property def newsletter_recipients(self) -> list[str]: @@ -153,6 +154,13 @@ class Newsletter(WebsiteGenerator): if self.send_webview_link and not self.published: frappe.throw(_("Newsletter must be published to send webview link in email")) + def validate_scheduling_date(self): + if ( + self.schedule_sending + and frappe.utils.get_datetime(self.schedule_send) < frappe.utils.now_datetime() + ): + frappe.throw(_("Past dates are not allowed for Scheduling.")) + def get_linked_email_queue(self) -> list[str]: """Get list of email queue linked to this newsletter.""" return frappe.get_all( diff --git a/frappe/email/doctype/newsletter/test_newsletter.py b/frappe/email/doctype/newsletter/test_newsletter.py index a25b6bda02..edbc8ff425 100644 --- a/frappe/email/doctype/newsletter/test_newsletter.py +++ b/frappe/email/doctype/newsletter/test_newsletter.py @@ -96,6 +96,8 @@ class TestNewsletterMixin: newsletter.send_emails() return newsletter.name + return newsletter + @staticmethod def get_newsletter(**kwargs) -> "Newsletter": """Generate and return Newsletter object""" @@ -162,7 +164,9 @@ class TestNewsletter(TestNewsletterMixin, FrappeTestCase): self.assertTrue(email in recipients) def test_schedule_send(self): - self.send_newsletter(schedule_send=add_days(getdate(), -1)) + newsletter = self.send_newsletter(schedule_send=add_days(getdate(), 1)) + newsletter.db_set("schedule_send", add_days(getdate(), -1)) # Set date in past + send_scheduled_email() email_queue_list = [frappe.get_doc("Email Queue", e.name) for e in frappe.get_all("Email Queue")] self.assertEqual(len(email_queue_list), 4)