django-codenerix-email 4.0.26__py2.py3-none-any.whl → 4.0.28__py2.py3-none-any.whl

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.
@@ -1,4 +1,4 @@
1
- __version__ = "4.0.26"
1
+ __version__ = "4.0.28"
2
2
 
3
3
  __authors__ = [
4
4
  "Juan Miguel Taboada Godoy <juanmi@juanmitaboada.com>",
@@ -18,13 +18,16 @@
18
18
  # See the License for the specific language governing permissions and
19
19
  # limitations under the License.
20
20
 
21
+ import json
21
22
 
22
23
  from django.core.management.base import BaseCommand
23
24
  from django.conf import settings
25
+ from django.utils import timezone
24
26
 
25
27
  from codenerix_lib.debugger import Debugger
26
- from codenerix_email.models import EmailMessage
28
+ from codenerix_email.models import EmailMessage, EmailTemplate # type: ignore
27
29
  from codenerix_email import __version__
30
+ from django.core.management import CommandError
28
31
 
29
32
 
30
33
  class Command(BaseCommand, Debugger):
@@ -32,28 +35,145 @@ class Command(BaseCommand, Debugger):
32
35
  # Show this when the user types help
33
36
  help = "Test"
34
37
 
38
+ def add_arguments(self, parser):
39
+ parser.add_argument(
40
+ "--email",
41
+ type=str,
42
+ help="Email",
43
+ default=None,
44
+ )
45
+ parser.add_argument(
46
+ "--template",
47
+ type=str,
48
+ help="Template CID",
49
+ default=None,
50
+ )
51
+ parser.add_argument(
52
+ "--context",
53
+ type=str,
54
+ help="Context as JSON",
55
+ default="{}",
56
+ )
57
+ parser.add_argument(
58
+ "--language",
59
+ type=str,
60
+ help="Language",
61
+ default=None,
62
+ )
63
+ parser.add_argument(
64
+ "--stdout",
65
+ action="store_true",
66
+ help="Print to stdout",
67
+ default=False,
68
+ )
69
+
35
70
  def handle(self, *args, **options):
36
71
 
37
72
  # Autoconfigure Debugger
38
73
  self.set_name("CODENERIX-EMAIL")
39
74
  self.set_debug()
40
75
 
41
- message = """Hello,
76
+ # Get arguments
77
+ email = options["email"]
78
+ template = options["template"]
79
+ context_str = options["context"]
80
+ language = options["language"]
81
+ stdout = options["stdout"]
82
+
83
+ # Read context
84
+ try:
85
+ context = json.loads(context_str)
86
+ except json.JSONDecodeError:
87
+ raise CommandError(
88
+ "Context is not a valid JSON string: {}".format(context_str)
89
+ )
90
+
91
+ # If no template is provided, use the default one
92
+ if template is None:
42
93
 
43
- this email has been sent using Django Codenerix Email.
94
+ # Get the default template
95
+ message = """Hello,
96
+
97
+ This email has been sent using Django Codenerix Email.
44
98
 
45
99
  Best regards, Codenerix Team
46
100
 
47
101
  --
48
- Django Codenerix Email v{}""".format(
49
- __version__
50
- )
102
+ Django Codenerix Email v{}
103
+ """.format(
104
+ __version__
105
+ )
51
106
 
52
- for name, email in settings.ADMINS:
53
- email_message = EmailMessage()
107
+ def email_message_factory(context, language):
108
+ email_message = EmailMessage()
109
+ email_message.subject = "[Codenerix Email] Test"
110
+ email_message.body = message
111
+ return email_message
112
+
113
+ else:
114
+ # Get the template
115
+ try:
116
+ template = EmailTemplate.objects.get(cid=template)
117
+ except EmailTemplate.DoesNotExist:
118
+ raise CommandError(
119
+ "Template with CID {} does not exist.".format(template)
120
+ )
121
+
122
+ # Render the template
123
+ def email_message_factory(context, language):
124
+ return template.get_email(context, language)
125
+
126
+ # If no email is provided, send to all admins
127
+ if email is None:
128
+
129
+ # Send email to all admins
130
+ for name, email in settings.ADMINS:
131
+ email_message = email_message_factory(context, language)
132
+ email_message.efrom = settings.DEFAULT_FROM_EMAIL
133
+ email_message.eto = email
134
+
135
+ # Prepare message ID info
136
+ ecid = email_message.uuid.hex
137
+ edomain = settings.EMAIL_FROM.split("@")[-1]
138
+ ets = int(timezone.now().timestamp())
139
+ email_message.headers = {
140
+ "Message-ID": f"<{ecid}-{ets}@{edomain}>",
141
+ "X-Codenerix-Email": "Test",
142
+ }
143
+
144
+ if stdout:
145
+ self.debug(
146
+ f"Sending email to {name} <{email}> "
147
+ f"with subject: {email_message.subject}:\n"
148
+ f"{email_message.body}",
149
+ color="white",
150
+ )
151
+ else:
152
+ email_message.save()
153
+ email_message.send(legacy=False, silent=False)
154
+ else:
155
+
156
+ # Send email to the specified address
157
+ email_message = email_message_factory(context, language)
54
158
  email_message.efrom = settings.DEFAULT_FROM_EMAIL
55
159
  email_message.eto = email
56
- email_message.subject = "[Codenerix Email] Test"
57
- email_message.body = message
58
- email_message.save()
59
- email_message.send(legacy=False, silent=False)
160
+
161
+ # Prepare message ID info
162
+ ecid = email_message.uuid.hex
163
+ edomain = settings.EMAIL_FROM.split("@")[-1]
164
+ ets = int(timezone.now().timestamp())
165
+ email_message.headers = {
166
+ "Message-ID": f"<{ecid}-{ets}@{edomain}>",
167
+ "X-Codenerix-Email": "Test",
168
+ }
169
+
170
+ if stdout:
171
+ self.debug(
172
+ f"Sending email to {name} <{email}> "
173
+ f"with subject: {email_message.subject}:\n"
174
+ f"{email_message.body}",
175
+ color="white",
176
+ )
177
+ else:
178
+ email_message.save()
179
+ email_message.send(legacy=False, silent=False)
codenerix_email/models.py CHANGED
@@ -49,8 +49,10 @@ CONTENT_SUBTYPES = (
49
49
  )
50
50
 
51
51
 
52
- def ensure_header(headers, key, value):
53
- if key not in headers:
52
+ def ensure_header(headers, key, value, headers_keys=None):
53
+ if headers_keys is None:
54
+ headers_keys = [k.lower() for k in headers.keys()]
55
+ if key.lower() not in headers_keys:
54
56
  headers[key] = value
55
57
  return headers
56
58
 
@@ -186,13 +188,34 @@ class EmailMessage(CodenerixModel, Debugger):
186
188
  # Get headers
187
189
  headers = self.headers or {}
188
190
 
191
+ # Header keys
192
+ headers_keys = [k.lower() for k in headers.keys()]
193
+
189
194
  # Ensure unsubscribe headers
190
195
  if self.unsubscribe_url:
191
196
  ensure_header(
192
- headers, "List-Unsubscribe", f"<{self.unsubscribe_url}>"
197
+ headers,
198
+ "List-Unsubscribe",
199
+ f"<{self.unsubscribe_url}>",
200
+ headers_keys,
193
201
  )
194
202
  ensure_header(
195
- headers, "List-Unsubscribe-Post", "List-Unsubscribe=One-Click"
203
+ headers,
204
+ "List-Unsubscribe-Post",
205
+ "List-Unsubscribe=One-Click",
206
+ headers_keys,
207
+ )
208
+
209
+ # Prepare message ID info
210
+ if "Message-ID".lower() not in headers_keys:
211
+ ecid = self.uuid.hex
212
+ edomain = settings.EMAIL_FROM.split("@")[-1]
213
+ ets = int(timezone.now().timestamp())
214
+ ensure_header(
215
+ headers,
216
+ "Message-ID",
217
+ f"<{ecid}-{ets}@{edomain}>",
218
+ headers_keys,
196
219
  )
197
220
 
198
221
  # Return headers
@@ -552,6 +575,7 @@ class EmailTemplate(CodenerixModel):
552
575
  e.body = Template(getattr(self, lang).body).render(Context(context))
553
576
  e.efrom = Template(self.efrom).render(Context(context))
554
577
  e.content_subtype = self.content_subtype
578
+
555
579
  return e
556
580
 
557
581
  def clean(self):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-codenerix-email
3
- Version: 4.0.26
3
+ Version: 4.0.28
4
4
  Summary: Codenerix Email is a module that enables CODENERIX to set send emails in a general manner.
5
5
  Home-page: https://github.com/codenerix/django-codenerix-email
6
6
  Author: Juan Miguel Taboada Godoy <juanmi@juanmitaboada.com>, Juan Soler Ruiz <soleronline@gmail.com>
@@ -1,8 +1,8 @@
1
- codenerix_email/__init__.py,sha256=M3A78yUx3AaCW46s7jU8eN9xu7YwE9kC-6q3ed2m4Ow,149
1
+ codenerix_email/__init__.py,sha256=66Cjo2WMXgWsnDzpzHwEX-3w3I4qNbFO3idUIGXJCkI,149
2
2
  codenerix_email/admin.py,sha256=o3b-MaD7xsWeta0yfU9YNeKBmHQIcmHqXmP2t-hrrWc,1208
3
3
  codenerix_email/apps.py,sha256=WXqu1XQibDDyCvvQYt2JbTK4GIpW8BNv5DCbRJS2mmk,149
4
4
  codenerix_email/forms.py,sha256=oVI58ZfDPr2aoA41xPS8yeU5H_JsYXwiEzWVMMnxM7A,4187
5
- codenerix_email/models.py,sha256=SimsoQ1g0f-woPlUTnEEo1ejjkSn8QL3ACKHWx876RU,20442
5
+ codenerix_email/models.py,sha256=KFm5rtco_rS2IVM9bfFwqyLT6TinQYKzSc9JZnoWr4A,21170
6
6
  codenerix_email/urls.py,sha256=QYrSJdhCp2PLrcfv_Y7X4OzxqQ0Q2-z7ObDPE-_WLdw,2595
7
7
  codenerix_email/urls_frontend.py,sha256=DG5WS_fGQJC9sezNebPwG-E_WtUWy3Kwz4VUxh82xuc,873
8
8
  codenerix_email/views.py,sha256=zLYLQk8oZ-0OIjDxTF-N3gSi91_JFcybkfWqYm67A3g,4858
@@ -13,11 +13,11 @@ codenerix_email/management/__pycache__/__init__.cpython-35.pyc,sha256=sBoEWs6zdI
13
13
  codenerix_email/management/__pycache__/__init__.cpython-39.pyc,sha256=uPXklfliVd3b8pLOJQT9ZeKcqmJMrGychvt68BsPulY,168
14
14
  codenerix_email/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  codenerix_email/management/commands/send_emails.py,sha256=hotzGEkuDILwKgZgHFOaSCeAZDIyoPcM7VDs3Z-5Vvg,7950
16
- codenerix_email/management/commands/test_email.py,sha256=MfVTF9YGBw_cqBm3cHMCyUbp58jJ8fidzW7hA_e7IEA,1688
16
+ codenerix_email/management/commands/test_email.py,sha256=eAFdNrSq83SHKUjkXbbtfd5AtZjC5MZLbSfMH9F0Cbk,5633
17
17
  codenerix_email/management/commands/__pycache__/__init__.cpython-310.pyc,sha256=3-VfdLuaiBIg4KTIy7GETYTt2-AbfCU0vlH6fFZx7_M,189
18
18
  codenerix_email/management/commands/__pycache__/__init__.cpython-311.pyc,sha256=yiqmtIhQMYXWx7g7XT-mvQNgGu_X2ymasWvVxIqPsBE,211
19
19
  codenerix_email/management/commands/__pycache__/send_emails.cpython-311.pyc,sha256=xh2ontFVtLWHZOoVf1YJrNbBNPtIyV2KQEk5Bf6mY_c,6884
20
- codenerix_email/management/commands/__pycache__/test_email.cpython-310.pyc,sha256=a5WztN9QeGbv4AlIf6XC1PtEXwbrW9cIFsljjTt3lA8,1227
20
+ codenerix_email/management/commands/__pycache__/test_email.cpython-310.pyc,sha256=5X7qBWFWs7AsNgTo1DyQE0zi5gtLxiFIcwdnboZIUSg,3154
21
21
  codenerix_email/migrations/0001_initial.py,sha256=Rp6noz8vjtGi4f4qc2w_es_VV9PmO7WvVfv666mu9xE,3511
22
22
  codenerix_email/migrations/0002_auto_20170502_1043.py,sha256=-zoc4RuZFXJA1Fw8ECCVqAg-PYfku3yxdtYNyXPI3LM,2369
23
23
  codenerix_email/migrations/0003_auto_20170921_1206.py,sha256=ncVdyZJ616vQpllGdaPbFS0n9qKfDP-TuVA5HkbPf4I,656
@@ -81,8 +81,8 @@ codenerix_email/migrations/__pycache__/__init__.cpython-311.pyc,sha256=RbbUUEhcJ
81
81
  codenerix_email/migrations/__pycache__/__init__.cpython-35.pyc,sha256=2g70xiMW6oJNkIpRM-0Dr5h7AUac-3xyCXPONxp9BBw,147
82
82
  codenerix_email/migrations/__pycache__/__init__.cpython-39.pyc,sha256=qNj2NH0YvoWPnCKxkVZPsEFsbM05y7t1njMskNISdVQ,168
83
83
  codenerix_email/static/codenerix_email/partials/emailmessages_rows.html,sha256=U0YDiFe-JaHri0VFv84jNbpbjgQXX0BVkg66FQybanw,2135
84
- django_codenerix_email-4.0.26.dist-info/LICENSE,sha256=IXMIpi75XsrJt1Sznt4EftT9c_4X0C9eqK4tHhH8H48,11339
85
- django_codenerix_email-4.0.26.dist-info/METADATA,sha256=p6d2Du2CBK8kLVK2L25JTpGpjNijnEdb0JR4oz3eC7c,2640
86
- django_codenerix_email-4.0.26.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
87
- django_codenerix_email-4.0.26.dist-info/top_level.txt,sha256=lljSA0iKE_UBEM5gIrGQwioC_i8Jjnp-aR1LFElENgw,16
88
- django_codenerix_email-4.0.26.dist-info/RECORD,,
84
+ django_codenerix_email-4.0.28.dist-info/LICENSE,sha256=IXMIpi75XsrJt1Sznt4EftT9c_4X0C9eqK4tHhH8H48,11339
85
+ django_codenerix_email-4.0.28.dist-info/METADATA,sha256=iGuhXhJ4QsB56T-5w8WeGHwyEYDFdylYgrhbgqFglEs,2640
86
+ django_codenerix_email-4.0.28.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110
87
+ django_codenerix_email-4.0.28.dist-info/top_level.txt,sha256=lljSA0iKE_UBEM5gIrGQwioC_i8Jjnp-aR1LFElENgw,16
88
+ django_codenerix_email-4.0.28.dist-info/RECORD,,