1
+ import fnmatch
2
+
3
+ from urllib .parse import urlparse
4
+
5
+ from flask import current_app
6
+
1
7
from udata import mail
2
8
from udata .i18n import lazy_gettext as _
3
9
from udata .core .dataset .models import Dataset
4
- from udata .core .reuse .models import Reuse
5
10
from udata .core .post .models import Post
11
+ from udata .core .reuse .models import Reuse
12
+ from udata .core .topic .models import Topic
6
13
from udata .tasks import connect , get_logger
7
14
8
- from .models import Discussion , Message
15
+ from .models import Discussion
9
16
from .signals import (
10
17
on_new_discussion , on_new_discussion_comment , on_discussion_closed
11
18
)
@@ -22,15 +29,48 @@ def owner_recipients(discussion):
22
29
return []
23
30
24
31
32
+ def get_external_url (discussion ):
33
+ url = None
34
+ if (meta_url := discussion .extras .get ('notification' , {}).get ('external_url' )):
35
+ meta_url_parsed = urlparse (meta_url )
36
+ if any (
37
+ fnmatch .fnmatch (meta_url_parsed .netloc , pattern )
38
+ for pattern in current_app .config ['DISCUSSION_ALLOWED_EXTERNAL_DOMAINS' ]
39
+ ):
40
+ url = f'{ meta_url } #discussion-{ discussion .id } '
41
+ if not url :
42
+ url = getattr (discussion , 'external_url' , None )
43
+ return url
44
+
45
+
46
+ def get_subject_type (discussion ):
47
+ if (meta_name := discussion .extras .get ('notification' , {}).get ('model_name' )):
48
+ if meta_name in current_app .config ['DISCUSSION_ALTERNATE_MODEL_NAMES' ]:
49
+ return meta_name
50
+ return discussion .subject .verbose_name
51
+
52
+
25
53
@connect (on_new_discussion , by_id = True )
26
54
def notify_new_discussion (discussion_id ):
27
55
discussion = Discussion .objects .get (pk = discussion_id )
28
- if isinstance (discussion .subject , (Dataset , Reuse , Post )):
56
+ if isinstance (discussion .subject , (Dataset , Reuse , Post , Topic )):
29
57
recipients = owner_recipients (discussion )
58
+ subject_type = get_subject_type (discussion )
30
59
subject = _ ('Your %(type)s have a new discussion' ,
31
- type = discussion .subject .verbose_name )
32
- mail .send (subject , recipients , 'new_discussion' ,
33
- discussion = discussion , message = discussion .discussion [0 ])
60
+ type = subject_type )
61
+ external_url = get_external_url (discussion )
62
+ if external_url :
63
+ mail .send (
64
+ subject ,
65
+ recipients ,
66
+ 'new_discussion' ,
67
+ discussion = discussion ,
68
+ message = discussion .discussion [0 ],
69
+ external_url = external_url ,
70
+ subject_type = subject_type
71
+ )
72
+ else :
73
+ log .warning (f'No external url could be computed for discussion { discussion .id } ' )
34
74
else :
35
75
log .warning ('Unrecognized discussion subject type %s' ,
36
76
type (discussion .subject ))
@@ -40,15 +80,25 @@ def notify_new_discussion(discussion_id):
40
80
def notify_new_discussion_comment (discussion_id , message = None ):
41
81
discussion = Discussion .objects .get (pk = discussion_id )
42
82
message = discussion .discussion [message ]
43
- if isinstance (discussion .subject , (Dataset , Reuse , Post )):
83
+ if isinstance (discussion .subject , (Dataset , Reuse , Post , Topic )):
44
84
recipients = owner_recipients (discussion ) + [
45
85
m .posted_by for m in discussion .discussion ]
46
86
recipients = list ({u .id : u for u in recipients if u != message .posted_by }.values ())
47
87
subject = _ ('%(user)s commented your discussion' ,
48
88
user = message .posted_by .fullname )
49
-
50
- mail .send (subject , recipients , 'new_discussion_comment' ,
51
- discussion = discussion , message = message )
89
+ external_url = get_external_url (discussion )
90
+ if external_url :
91
+ mail .send (
92
+ subject ,
93
+ recipients ,
94
+ 'new_discussion_comment' ,
95
+ discussion = discussion ,
96
+ message = message ,
97
+ external_url = external_url ,
98
+ subject_type = get_subject_type (discussion )
99
+ )
100
+ else :
101
+ log .warning (f'No external url could be computed for discussion { discussion .id } ' )
52
102
else :
53
103
log .warning ('Unrecognized discussion subject type %s' ,
54
104
type (discussion .subject ))
@@ -58,13 +108,24 @@ def notify_new_discussion_comment(discussion_id, message=None):
58
108
def notify_discussion_closed (discussion_id , message = None ):
59
109
discussion = Discussion .objects .get (pk = discussion_id )
60
110
message = discussion .discussion [message ]
61
- if isinstance (discussion .subject , (Dataset , Reuse , Post )):
111
+ if isinstance (discussion .subject , (Dataset , Reuse , Post , Topic )):
62
112
recipients = owner_recipients (discussion ) + [
63
113
m .posted_by for m in discussion .discussion ]
64
114
recipients = list ({u .id : u for u in recipients if u != message .posted_by }.values ())
65
115
subject = _ ('A discussion has been closed' )
66
- mail .send (subject , recipients , 'discussion_closed' ,
67
- discussion = discussion , message = message )
116
+ external_url = get_external_url (discussion )
117
+ if external_url :
118
+ mail .send (
119
+ subject ,
120
+ recipients ,
121
+ 'discussion_closed' ,
122
+ discussion = discussion ,
123
+ message = message ,
124
+ external_url = external_url ,
125
+ subject_type = get_subject_type (discussion ),
126
+ )
127
+ else :
128
+ log .warning (f'No external url could be computed for discussion { discussion .id } ' )
68
129
else :
69
130
log .warning ('Unrecognized discussion subject type %s' ,
70
131
type (discussion .subject ))
0 commit comments