瀏覽代碼

Completes notification logging

Adrien Panay 7 年之前
父節點
當前提交
d3915bd391
共有 3 個文件被更改,包括 47 次插入24 次删除
  1. 9 6
      tracim/tracim/lib/email.py
  2. 20 13
      tracim/tracim/lib/notifications.py
  3. 18 5
      tracim/tracim/tests/library/test_notification.py

+ 9 - 6
tracim/tracim/lib/email.py 查看文件

@@ -1,17 +1,16 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 import smtplib
3
+import typing
3 4
 from email.message import Message
4 5
 from email.mime.multipart import MIMEMultipart
5 6
 from email.mime.text import MIMEText
6 7
 
7
-import typing
8 8
 from mako.template import Template
9 9
 from tg.i18n import ugettext as _
10 10
 
11 11
 from tracim.lib.base import logger
12
-from tracim.model import User
13
-
14 12
 from tracim.lib.utils import get_rq_queue
13
+from tracim.model import User
15 14
 
16 15
 
17 16
 def send_email_through(
@@ -53,7 +52,6 @@ class SmtpConfiguration(object):
53 52
         self.password = password
54 53
 
55 54
 
56
-
57 55
 class EmailSender(object):
58 56
     """
59 57
     this class allow to send emails and has no relations with SQLAlchemy and other tg HTTP request environment
@@ -86,14 +84,19 @@ class EmailSender(object):
86 84
             self._smtp_connection.quit()
87 85
             logger.info(self, 'Connection closed.')
88 86
 
89
-
90 87
     def send_mail(self, message: MIMEMultipart):
91 88
         if not self._is_active:
92 89
             logger.info(self, 'Not sending email to {} (service desactivated)'.format(message['To']))
93 90
         else:
94
-            self.connect() # Acutally, this connects to SMTP only if required
91
+            self.connect()  # Acutally, this connects to SMTP only if required
95 92
             logger.info(self, 'Sending email to {}'.format(message['To']))
96 93
             self._smtp_connection.send_message(message)
94
+            from tracim.lib.notifications import EmailNotifier
95
+            EmailNotifier.log_notification(
96
+                action='   SENT',
97
+                recipient=message['To'],
98
+                subject=message['Subject'],
99
+            )
97 100
 
98 101
 
99 102
 class EmailManager(object):

+ 20 - 13
tracim/tracim/lib/notifications.py 查看文件

@@ -1,30 +1,31 @@
1 1
 # -*- coding: utf-8 -*-
2 2
 import datetime
3
+import typing
3 4
 
4 5
 from email.header import Header
5 6
 from email.mime.multipart import MIMEMultipart
6 7
 from email.mime.text import MIMEText
7 8
 
8
-import lxml
9 9
 from lxml.html.diff import htmldiff
10 10
 
11 11
 from mako.template import Template
12 12
 
13 13
 from tracim.lib.base import logger
14
+from tracim.lib.email import EmailSender
14 15
 from tracim.lib.email import SmtpConfiguration
15 16
 from tracim.lib.email import send_email_through
16
-from tracim.lib.email import EmailSender
17 17
 from tracim.lib.user import UserApi
18
-from tracim.lib.workspace import WorkspaceApi
19 18
 from tracim.lib.utils import lazy_ugettext as l_
20
-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
21 25
 from tracim.model.serializers import CTX
26
+from tracim.model.serializers import Context
22 27
 from tracim.model.serializers import DictLikeClass
23 28
 
24
-from tracim.model.data import Content, UserRoleInWorkspace, ContentType, \
25
-    ActionDescription
26
-from tracim.model.auth import User
27
-
28 29
 
29 30
 class INotifier(object):
30 31
     """
@@ -212,17 +213,22 @@ class EmailNotifier(object):
212 213
         )
213 214
 
214 215
     @staticmethod
215
-    def _log_notification(
216
-            recipient: str,
217
-            subject: str
216
+    def log_notification(
217
+            action: str,
218
+            recipient: typing.Optional[str],
219
+            subject: typing.Optional[str],
218 220
     ) -> None:
219 221
         """Log notification metadata."""
220 222
         from tracim.config.app_cfg import CFG
221 223
         log_path = CFG.get_instance().EMAIL_NOTIFICATION_LOG_FILE_PATH
222 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.
223 228
             with open(log_path, 'a') as log_file:
224 229
                 print(
225 230
                     datetime.datetime.now(),
231
+                    action,
226 232
                     recipient,
227 233
                     subject,
228 234
                     sep='|',
@@ -296,8 +302,9 @@ class EmailNotifier(object):
296 302
             message.attach(part1)
297 303
             message.attach(part2)
298 304
 
299
-            self._log_notification(
300
-                recipient=message['for'],
305
+            self.log_notification(
306
+                action='CREATED',
307
+                recipient=message['To'],
301 308
                 subject=message['Subject'],
302 309
             )
303 310
             send_email_through(async_email_sender.send_mail, message)

+ 18 - 5
tracim/tracim/tests/library/test_notification.py 查看文件

@@ -49,19 +49,32 @@ class TestDummyNotifier(TestStandard):
49 49
 class TestEmailNotifier(TestStandard):
50 50
 
51 51
     def test_unit__log_notification(self):
52
+        """Check file and format of notification log."""
52 53
         log_path = CFG.get_instance().EMAIL_NOTIFICATION_LOG_FILE_PATH
53
-        pattern = '\|{rec}\|{subj}$\\n'
54
+        pattern = '\|{act}\|{rec}\|{subj}$\\n'
55
+        line_1_act = 'CREATED'
54 56
         line_1_rec = 'user 1 <us.er@o.ne>'
55 57
         line_1_subj = 'notification 1'
56
-        line_1_pattern = pattern.format(rec=line_1_rec, subj=line_1_subj)
58
+        line_1_pattern = pattern.format(
59
+            act=line_1_act,
60
+            rec=line_1_rec,
61
+            subj=line_1_subj,
62
+        )
63
+        line_2_act = '   SENT'
57 64
         line_2_rec = 'user 2 <us.er@t.wo>'
58 65
         line_2_subj = 'notification 2'
59
-        line_2_pattern = pattern.format(rec=line_2_rec, subj=line_2_subj)
60
-        EmailNotifier._log_notification(
66
+        line_2_pattern = pattern.format(
67
+            act=line_2_act,
68
+            rec=line_2_rec,
69
+            subj=line_2_subj,
70
+        )
71
+        EmailNotifier.log_notification(
72
+            action=line_1_act,
61 73
             recipient=line_1_rec,
62 74
             subject=line_1_subj,
63 75
         )
64
-        EmailNotifier._log_notification(
76
+        EmailNotifier.log_notification(
77
+            action=line_2_act,
65 78
             recipient=line_2_rec,
66 79
             subject=line_2_subj,
67 80
         )