|
@@ -1,29 +1,31 @@
|
1
|
1
|
# -*- coding: utf-8 -*-
|
|
2
|
+import datetime
|
|
3
|
+import typing
|
2
|
4
|
|
3
|
5
|
from email.header import Header
|
4
|
6
|
from email.mime.multipart import MIMEMultipart
|
5
|
7
|
from email.mime.text import MIMEText
|
6
|
8
|
|
7
|
|
-import lxml
|
8
|
9
|
from lxml.html.diff import htmldiff
|
9
|
10
|
|
10
|
11
|
from mako.template import Template
|
11
|
12
|
|
12
|
13
|
from tracim.lib.base import logger
|
|
14
|
+from tracim.lib.email import EmailSender
|
13
|
15
|
from tracim.lib.email import SmtpConfiguration
|
14
|
16
|
from tracim.lib.email import send_email_through
|
15
|
|
-from tracim.lib.email import EmailSender
|
16
|
17
|
from tracim.lib.user import UserApi
|
17
|
|
-from tracim.lib.workspace import WorkspaceApi
|
18
|
18
|
from tracim.lib.utils import lazy_ugettext as l_
|
19
|
|
-from tracim.model.serializers import Context
|
|
19
|
+from tracim.lib.workspace import WorkspaceApi
|
|
20
|
+from tracim.model.auth import User
|
|
21
|
+from tracim.model.data import ActionDescription
|
|
22
|
+from tracim.model.data import Content
|
|
23
|
+from tracim.model.data import ContentType
|
|
24
|
+from tracim.model.data import UserRoleInWorkspace
|
20
|
25
|
from tracim.model.serializers import CTX
|
|
26
|
+from tracim.model.serializers import Context
|
21
|
27
|
from tracim.model.serializers import DictLikeClass
|
22
|
28
|
|
23
|
|
-from tracim.model.data import Content, UserRoleInWorkspace, ContentType, \
|
24
|
|
- ActionDescription
|
25
|
|
-from tracim.model.auth import User
|
26
|
|
-
|
27
|
29
|
|
28
|
30
|
class INotifier(object):
|
29
|
31
|
"""
|
|
@@ -210,6 +212,29 @@ class EmailNotifier(object):
|
210
|
212
|
email_address = email_address
|
211
|
213
|
)
|
212
|
214
|
|
|
215
|
+ @staticmethod
|
|
216
|
+ def log_notification(
|
|
217
|
+ action: str,
|
|
218
|
+ recipient: typing.Optional[str],
|
|
219
|
+ subject: typing.Optional[str],
|
|
220
|
+ ) -> None:
|
|
221
|
+ """Log notification metadata."""
|
|
222
|
+ from tracim.config.app_cfg import CFG
|
|
223
|
+ log_path = CFG.get_instance().EMAIL_NOTIFICATION_LOG_FILE_PATH
|
|
224
|
+ if log_path:
|
|
225
|
+ # TODO - A.P - 2017-09-06 - file logging inefficiency
|
|
226
|
+ # Updating a document with 100 users to notify will leads to open
|
|
227
|
+ # and close the file 100 times.
|
|
228
|
+ with open(log_path, 'a') as log_file:
|
|
229
|
+ print(
|
|
230
|
+ datetime.datetime.now(),
|
|
231
|
+ action,
|
|
232
|
+ recipient,
|
|
233
|
+ subject,
|
|
234
|
+ sep='|',
|
|
235
|
+ file=log_file,
|
|
236
|
+ )
|
|
237
|
+
|
213
|
238
|
def notify_content_update(self, event_actor_id: int, event_content_id: int):
|
214
|
239
|
"""
|
215
|
240
|
Look for all users to be notified about the new content and send them an individual email
|
|
@@ -277,6 +302,11 @@ class EmailNotifier(object):
|
277
|
302
|
message.attach(part1)
|
278
|
303
|
message.attach(part2)
|
279
|
304
|
|
|
305
|
+ self.log_notification(
|
|
306
|
+ action='CREATED',
|
|
307
|
+ recipient=message['To'],
|
|
308
|
+ subject=message['Subject'],
|
|
309
|
+ )
|
280
|
310
|
send_email_through(async_email_sender.send_mail, message)
|
281
|
311
|
|
282
|
312
|
def _build_email_body(self, mako_template_filepath: str, role: UserRoleInWorkspace, content: Content, actor: User) -> str:
|