99from django .utils .http import urlquote
1010from django .conf import settings
1111
12+ import debug # pyflakes:ignore
13+
1214from ietf .doc .mails import email_state_changed
1315from ietf .doc .models import Document , DocEvent , State , StateDocEvent , StateType
1416from ietf .doc .utils import add_state_change_event
1517from ietf .person .models import Person
18+ from ietf .utils .mail import parseaddr
1619from ietf .utils .timezone import local_timezone_to_utc , email_time_to_local_timezone , utc_to_local_timezone
1720
1821
@@ -216,11 +219,11 @@ def update_history_with_changes(changes, send_email=True):
216219
217220def find_document_name (text ):
218221 prefixes = ['draft' ,'conflict-review' ,'status-change' ,'charter' ]
219- leading_delimiter_re = '(?<![-a-zA-Z0-9])'
220- prefix_re = '(%s)' % '|' .join (prefixes )
221- tail_re = '(-[a-z0-9]+)+?(-\d\d\.txt)?'
222- trailing_delimiter_re = '((?![-a-zA-Z0-9])|$)'
223- name_re = '%s(%s%s)%s' % (leading_delimiter_re , prefix_re , tail_re , trailing_delimiter_re )
222+ leading_delimiter_re = r '(?<![-a-zA-Z0-9])'
223+ prefix_re = r '(%s)' % '|' .join (prefixes )
224+ tail_re = r '(-[a-z0-9]+)+?(-\d\d\.txt)?'
225+ trailing_delimiter_re = r '((?![-a-zA-Z0-9])|$)'
226+ name_re = r '%s(%s%s)%s' % (leading_delimiter_re , prefix_re , tail_re , trailing_delimiter_re )
224227 m = re .search (name_re ,text )
225228 return m and m .group (0 ).lower ()
226229
@@ -231,9 +234,8 @@ def strip_version_extension(text):
231234 text = text [:- 3 ]
232235 return text
233236
234- def parse_review_email (text ):
235- msg = email .message_from_string (text )
236-
237+ def parse_review_email (bytes ):
238+ msg = email .message_from_bytes (bytes )
237239 # doc
238240 doc_name = find_document_name (msg ["Subject" ]) or ""
239241 doc_name = strip_version_extension (doc_name )
@@ -245,25 +247,23 @@ def parse_review_email(text):
245247
246248 # by
247249 by = None
248- m = re .search (r"\"(.*)\"" , msg ["From" ])
249- if m :
250- name = m .group (1 ).strip ()
251- if name .endswith (" via RT" ):
252- name = name [:- len (" via RT" )]
253-
254- try :
255- by = Person .objects .get (alias__name = name , role__group__acronym = "iana" )
256- except Person .DoesNotExist :
257- pass
250+ name , __ = parseaddr (msg ["From" ])
251+ if name .endswith (" via RT" ):
252+ name = name [:- len (" via RT" )]
253+ try :
254+ by = Person .objects .get (alias__name = name , role__group__acronym = "iana" )
255+ except Person .DoesNotExist :
256+ pass
258257
259258 if not by :
260259 by = Person .objects .get (name = "(System)" )
261260
262261 # comment
263- body = msg .get_payload ().decode ('quoted-printable' ).replace ("\r " , "" )
262+ charset = msg .get_content_charset ()
263+ body = msg .get_payload (decode = True ).decode (charset or 'utf-8' ).replace ("\r " , "" )
264264
265- begin_search = re .search ('\(BEGIN\s+IANA\s+(LAST\s+CALL\s+)?COMMENTS?(\s*:\s*[a-zA-Z0-9-\.]*)?\s*\)' ,body )
266- end_search = re .search ('\(END\s+IANA\s+(LAST\s+CALL\s+)?COMMENTS?\)' ,body )
265+ begin_search = re .search (r '\(BEGIN\s+IANA\s+(LAST\s+CALL\s+)?COMMENTS?(\s*:\s*[a-zA-Z0-9-\.]*)?\s*\)' ,body )
266+ end_search = re .search (r '\(END\s+IANA\s+(LAST\s+CALL\s+)?COMMENTS?\)' ,body )
267267 if begin_search and end_search :
268268 begin_string = begin_search .group (0 )
269269 end_string = end_search .group (0 )
0 commit comments