wagtail-newsletter-django-backend 0.5.5__tar.gz → 0.5.7__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/PKG-INFO +1 -1
  2. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/__init__.py +1 -1
  3. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/campaign_backend.py +13 -4
  4. wagtail_newsletter_django_backend-0.5.7/src/wagtail_newsletter_django_backend/migrations/0003_alter_campaign_audience_segment.py +26 -0
  5. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/models.py +1 -1
  6. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/.gitignore +0 -0
  7. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/.readthedocs.yaml +0 -0
  8. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/LICENSE +0 -0
  9. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/README.md +0 -0
  10. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/manage.py +0 -0
  11. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/pyproject.toml +0 -0
  12. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/__init__.py +0 -0
  13. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/__init__.py +0 -0
  14. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/admin.py +0 -0
  15. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/apps.py +0 -0
  16. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/migrations/0001_initial.py +0 -0
  17. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/migrations/0002_newslettersignup.py +0 -0
  18. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/migrations/__init__.py +0 -0
  19. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/models.py +0 -0
  20. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/signals.py +0 -0
  21. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/templates/blog/blog_index_page.html +0 -0
  22. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/templates/blog/blog_page.html +0 -0
  23. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/templates/blog/blog_page_newsletter.html +0 -0
  24. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/templates/blog/newsletter_signup.html +0 -0
  25. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/tests.py +0 -0
  26. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/blog/views.py +0 -0
  27. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/home/__init__.py +0 -0
  28. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/home/apps.py +0 -0
  29. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/home/migrations/0001_initial.py +0 -0
  30. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/home/migrations/__init__.py +0 -0
  31. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/home/models.py +0 -0
  32. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/home/static/css/welcome_page.css +0 -0
  33. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/home/templates/home/home_page.html +0 -0
  34. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/home/templates/home/welcome_page.html +0 -0
  35. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/home/tests.py +0 -0
  36. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/search/__init__.py +0 -0
  37. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/search/apps.py +0 -0
  38. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/search/templates/search/search.html +0 -0
  39. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/search/views.py +0 -0
  40. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/settings/__init__.py +0 -0
  41. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/settings/base.py +0 -0
  42. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/settings/dev.py +0 -0
  43. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/settings/production.py +0 -0
  44. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/static/css/demo.css +0 -0
  45. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/static/js/demo.js +0 -0
  46. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/templates/404.html +0 -0
  47. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/templates/500.html +0 -0
  48. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/templates/base.html +0 -0
  49. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/urls.py +0 -0
  50. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/src/demo/wsgi.py +0 -0
  51. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/demo/uv.lock +0 -0
  52. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/docs/Makefile +0 -0
  53. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/docs/conf.py +0 -0
  54. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/docs/index.rst +0 -0
  55. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/docs/make.bat +0 -0
  56. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/pyproject.toml +0 -0
  57. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/admin.py +0 -0
  58. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/admin_viewsets.py +0 -0
  59. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/apps.py +0 -0
  60. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/forms.py +0 -0
  61. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/management/__init__.py +0 -0
  62. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/management/commands/__init__.py +0 -0
  63. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/management/commands/send_scheduled_campaigns.py +0 -0
  64. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/migrations/0001_initial.py +0 -0
  65. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/migrations/0002_alter_audience_name_alter_audiencesegment_name_and_more.py +0 -0
  66. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/migrations/__init__.py +0 -0
  67. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/templates/wagtail_newsletter_django_backend/manage.html +0 -0
  68. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/templates/wagtail_newsletter_django_backend/manage_tag.html +0 -0
  69. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/templates/wagtail_newsletter_django_backend/unsubscribe.html +0 -0
  70. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/templates/wagtail_newsletter_django_backend/unsubscribe_tag.html +0 -0
  71. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/templatetags/__init__.py +0 -0
  72. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/templatetags/wagtail_newsletter_django_backend_tags.py +0 -0
  73. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/tests.py +0 -0
  74. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/urls.py +0 -0
  75. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/views.py +0 -0
  76. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/src/wagtail_newsletter_django_backend/wagtail_hooks.py +0 -0
  77. {wagtail_newsletter_django_backend-0.5.5 → wagtail_newsletter_django_backend-0.5.7}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wagtail-newsletter-django-backend
3
- Version: 0.5.5
3
+ Version: 0.5.7
4
4
  Summary: An internal Django backend to wagtail-newsletter.
5
5
  Author-email: "Taylor C. Richberger" <taylor@axfive.net>
6
6
  Maintainer-email: "Taylor C. Richberger" <taylor@axfive.net>
@@ -3,4 +3,4 @@
3
3
  This is a simple, basic internal backend for wagtail-newsletter, allowing you to manage your mailing lists internally and send them out through Django's standard email capabilities.
4
4
  '''
5
5
 
6
- __version__ = '0.5.5'
6
+ __version__ = '0.5.7'
@@ -25,7 +25,7 @@ class CampaignBackend(wncb.CampaignBackend):
25
25
  id=str(audience.id),
26
26
  pk=str(audience.pk),
27
27
  name=audience.name,
28
- member_count=audience.subscriber_set.count(),
28
+ member_count=audience.subscriber_set.filter(verified=True).count(),
29
29
  )
30
30
  for audience in models.Audience.objects.all()
31
31
  ]
@@ -41,7 +41,7 @@ class CampaignBackend(wncb.CampaignBackend):
41
41
  id=f'{audience_id}/{audience_segment.id}',
42
42
  pk=f'{audience_id}/{audience_segment.id}',
43
43
  name=audience_segment.name,
44
- member_count=audience_segment.subscribers.count(),
44
+ member_count=audience_segment.subscribers.filter(verified=True).count(),
45
45
  )
46
46
  for audience_segment in audience.audience_segment_set.all()
47
47
  ]
@@ -94,7 +94,13 @@ class CampaignBackend(wncb.CampaignBackend):
94
94
  @override
95
95
  def send_test_email(self, *, campaign_id: str, email: str) -> None:
96
96
  campaign = models.Campaign.objects.get(id=int(campaign_id))
97
- audience = campaign.audience_segment.audience
97
+ audience: models.Audience
98
+ if campaign.audience_segment is not None:
99
+ audience = campaign.audience_segment.audience
100
+ else:
101
+ # Build empty audience. Will have no subscribers, and no smtp data.
102
+ # This will not work without default data in the config.
103
+ audience = models.Audience()
98
104
 
99
105
  from_address = audience.from_address()
100
106
  user, password = audience.smtp_auth()
@@ -113,6 +119,9 @@ class CampaignBackend(wncb.CampaignBackend):
113
119
  def send_campaign(self, campaign_id: str) -> None:
114
120
  with transaction.atomic():
115
121
  campaign = models.Campaign.objects.get(id=int(campaign_id))
122
+ if campaign.audience_segment is None:
123
+ raise RuntimeError("Campaign can't be sent without an audience segment")
124
+
116
125
  audience = campaign.audience_segment.audience
117
126
 
118
127
  site = audience.site
@@ -145,7 +154,7 @@ class CampaignBackend(wncb.CampaignBackend):
145
154
  to=[subscriber.email()],
146
155
  connection=connection, # pyright: ignore[reportAny]
147
156
  headers={
148
- "List-Unsubscribe": unsubscribe_url,
157
+ "List-Unsubscribe": f'<{unsubscribe_url}>',
149
158
  "List-Unsubscribe-Post": "List-Unsubscribe=One-Click",
150
159
  },
151
160
  )
@@ -0,0 +1,26 @@
1
+ # Generated by Django 5.2.5 on 2025-09-02 21:10
2
+
3
+ import django.db.models.deletion
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ (
11
+ "wagtail_newsletter_django_backend",
12
+ "0002_alter_audience_name_alter_audiencesegment_name_and_more",
13
+ ),
14
+ ]
15
+
16
+ operations = [
17
+ migrations.AlterField(
18
+ model_name="campaign",
19
+ name="audience_segment",
20
+ field=models.ForeignKey(
21
+ null=True,
22
+ on_delete=django.db.models.deletion.SET_NULL,
23
+ to="wagtail_newsletter_django_backend.audiencesegment",
24
+ ),
25
+ ),
26
+ ]
@@ -252,7 +252,7 @@ class Campaign(models.Model):
252
252
  sent_at: 'models.DateTimeField[datetime | None]' = models.DateTimeField(blank=True, null=True, default=None)
253
253
  subject: 'models.TextField[str]' = models.TextField(blank=False, null=False)
254
254
  html: 'models.TextField[str]' = models.TextField(blank=False, null=False)
255
- audience_segment: models.ForeignKey[AudienceSegment] = models.ForeignKey(AudienceSegment, blank=False, null=False, on_delete=models.CASCADE)
255
+ audience_segment: 'models.ForeignKey[AudienceSegment | None]' = models.ForeignKey(AudienceSegment, blank=False, null=True, on_delete=models.SET_NULL)
256
256
 
257
257
  created_at: 'models.DateTimeField[datetime]' = models.DateTimeField(auto_now_add=True)
258
258
  updated_at: 'models.DateTimeField[datetime]' = models.DateTimeField(auto_now=True)