14
14
from __future__ import annotations
15
15
16
16
import builtins
17
+ import collections
17
18
import datetime
18
19
import itertools
19
20
import json
24
25
25
26
import dateutil .relativedelta
26
27
import requests
28
+ from markupsafe import Markup
27
29
28
30
from odoo import models , fields , api
29
31
from odoo .exceptions import UserError
@@ -522,7 +524,8 @@ def _make_fp_message(self, commit):
522
524
return msg
523
525
524
526
def _reminder (self ):
525
- for _ , prs in groupby (self .search ([
527
+ emails = collections .defaultdict (self .browse )
528
+ for source , prs in groupby (self .search ([
526
529
('source_id' , '!=' , False ),
527
530
('blocked' , '!=' , False ),
528
531
('state' , 'in' , ['opened' , 'validated' , 'approved' , 'ready' , 'error' ]),
@@ -532,18 +535,49 @@ def _reminder(self):
532
535
# will most likely lead to their parent being validated (?)
533
536
for pr in set (prs ).difference (p .parent_id for p in prs ):
534
537
# reminder every 7 days for the first 4 weeks, then every 4 weeks
535
- if (pr .reminder_next - pr .create_date ) < datetime .timedelta (days = 28 ):
538
+ age = pr .reminder_next - pr .create_date
539
+ if age < datetime .timedelta (days = 28 ):
536
540
pr .reminder_next += datetime .timedelta (days = 7 )
537
541
else :
538
542
pr .reminder_next += datetime .timedelta (days = 28 )
539
543
544
+ # after 6 months, start sending emails
545
+ if age > datetime .timedelta (weeks = 26 ):
546
+ if author := source .author .email :
547
+ emails [author ] |= prs
548
+ if reviewer := source .reviewed_by .email :
549
+ emails [reviewer ] |= prs
540
550
self .env .ref ('runbot_merge.forwardport.reminder' )._send (
541
551
repository = pr .repository ,
542
552
pull_request = pr .number ,
543
553
token_field = 'fp_github_token' ,
544
554
format_args = {'pr' : pr , 'source' : pr .source_id },
545
555
)
546
556
557
+ try :
558
+ self .env ['mail.mail' ].sudo ().create ([
559
+ {
560
+ 'email_to' : email ,
561
+ 'subject' : f"You have { len (prs )} outstanding forward ports" ,
562
+ 'body' : Markup (
563
+ "<p>The following forward-ports are more than 6 months old "
564
+ "and were either created or approved by you.</p>"
565
+ "<p>Please process them appropriately (merge or close them)"
566
+ "at the earliest.</p>"
567
+ "<ul>{}</ul>"
568
+ ).format (Markup ("" ).join (
569
+ Markup ('<li><a href="{link}">{name}</a></li>' ).format (
570
+ name = pr .display_name ,
571
+ link = pr .github_url ,
572
+ )
573
+ for pr in prs
574
+ ))
575
+ }
576
+ for email , prs in emails .items ()
577
+ ])
578
+ except Exception :
579
+ _logger .exception ("Failed to create mail" )
580
+
547
581
548
582
map_author = operator .itemgetter ('name' , 'email' , 'date' )
549
583
map_committer = operator .itemgetter ('name' , 'email' )
0 commit comments