diff --git a/ietf/bin/generate-draft-aliases b/ietf/bin/generate-draft-aliases index 4ceb093bf..94c84b304 100755 --- a/ietf/bin/generate-draft-aliases +++ b/ietf/bin/generate-draft-aliases @@ -33,6 +33,7 @@ basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) sys.path = [ basedir ] + sys.path os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ietf.settings") +from django.conf import settings from ietf.doc.models import Document from ietf.group.utils import get_group_chairs_emails, get_group_ads_emails @@ -65,7 +66,7 @@ def get_draft_notify_emails(draft): " Get list of email addresses to notify for the given draft." n = draft.notify if not n: - return + return [] l = [] draft_email = draft.name + DRAFT_EMAIL_SUFFIX for e in n.split(','): @@ -92,7 +93,13 @@ if __name__ == '__main__': modname = 'ietf.generate_draft_aliases' date = time.strftime("%Y-%m-%d_%H:%M:%S") - print '# Generated by python -m %s at %s' % (modname, date) + signature = '# Generated by python -m %s at %s\n' % (modname, date) + + afile = open(settings.DRAFT_ALIASES_PATH, "w") + vfile = open(settings.DRAFT_VIRTUAL_PATH, "w") + + afile.write(signature) + vfile.write(signature) drafts = Document.objects.all() @@ -104,42 +111,44 @@ if __name__ == '__main__': interesting_drafts = active_drafts | inactive_recent_drafts + count = 0 for draft in interesting_drafts.distinct().iterator(): # Omit RFCs, we care only about drafts if draft.docalias_set.filter(name__startswith='rfc'): continue - name = draft.name - done = [] + + count += 1 + if (count % 100) == 0: + sys.stderr.write('.') + alias = draft.name all = [] - def handle_sublist(name, f, o, is_ad=False): - r = dump_sublist(name, f, o, is_ad) - if r: - done.append(name) - all.extend(r) - return r + def handle_sublist(afile, vfile, alias, emails): + try: + all.extend( dump_sublist(afile, vfile, alias, emails) ) + except TypeError: + import debug + debug.show('alias') + debug.show('emails') + raise #.authors (/and no suffix) = authors - # First, do no suffix case - # If no authors, don't generate list either - r = dump_sublist(name, get_draft_authors_emails, draft) - if not r: - continue - handle_sublist('%s%s' % (name, '.authors'), get_draft_authors_emails, draft) - wg = draft.group + handle_sublist(afile, vfile, alias, get_draft_authors_emails(draft)) + handle_sublist(afile, vfile, alias+'.authors', get_draft_authors_emails(draft)) - if wg: - # .chairs = WG chairs - handle_sublist('%s%s' % (name, '.chairs'), get_group_chairs_emails, wg) + # .chairs = group chairs + if draft.group: + handle_sublist(afile, vfile, alias+'.chairs', get_group_chairs_emails(draft.group)) # .ad = sponsoring AD / WG AD (WG document) - handle_sublist('%s%s' % (name, '.ad'), get_draft_ad_emails, draft, True) + handle_sublist(afile, vfile, alias+'.ad', get_draft_ad_emails(draft)) # .notify = notify email list from the Document - handle_sublist('%s%s' % (name, '.notify'), get_draft_notify_emails, draft) + handle_sublist(afile, vfile, alias+'.notify', get_draft_notify_emails(draft)) - # .all = everything on 'done' (recursive aliases) - #dump_sublist('%s%s' % (name, '.all'), None, done) # .all = everything on 'all' (expanded aliases) - dump_sublist('%s%s' % (name, '.all'), None, all) + handle_sublist(afile, vfile, alias+'.all', all) + afile.close() + vfile.close() + \ No newline at end of file diff --git a/ietf/bin/generate-wg-aliases b/ietf/bin/generate-wg-aliases index c486d2310..9c9cbf831 100755 --- a/ietf/bin/generate-wg-aliases +++ b/ietf/bin/generate-wg-aliases @@ -19,6 +19,7 @@ basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../..")) sys.path = [ basedir ] + sys.path os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ietf.settings") +from django.conf import settings from ietf.group.models import Group from ietf.group.utils import get_group_ads_emails, get_group_chairs_emails, get_area_ads_emails, get_area_chairs_emails @@ -46,7 +47,14 @@ if __name__ == '__main__': modname = 'ietf.generate_wg_aliases' date = time.strftime("%Y-%m-%d_%H:%M:%S") - print '# Generated by python -m %s at %s' % (modname, date) + signature = '# Generated by python -m %s at %s\n' % (modname, date) + + afile = open(settings.GROUP_ALIASES_PATH, "w") + vfile = open(settings.GROUP_VIRTUAL_PATH, "w") + + afile.write(signature) + vfile.write(signature) + wgs = Group.objects.filter(type='wg').all() print '# WGs' @@ -59,8 +67,8 @@ if __name__ == '__main__': for wg in interesting_wgs.distinct().iterator(): name = wg.acronym - dump_sublist('%s%s' % (name, '-ads'), get_group_ads_emails, wg, True) - dump_sublist('%s%s' % (name, '-chairs'), get_group_chairs_emails, wg) + dump_sublist(afile, vfile, name+'-ads' , get_group_ads_emails(wg)) + dump_sublist(afile, vfile, name+'-chairs', get_group_chairs_emails(wg)) print '# RGs' # - status = Active @@ -74,7 +82,7 @@ if __name__ == '__main__': for rg in interesting_rgs.distinct().iterator(): name = rg.acronym #dump_sublist('%s%s' % (name, '-ads'), get_group_ads_emails, rg, True) - dump_sublist('%s%s' % (name, '-chairs'), get_group_chairs_emails, rg) + dump_sublist(afile, vfile, name+'-chairs', get_group_chairs_emails(rg)) # Additionally, for areaz, we should list -ads and -chairs # (for every chair in active groups within the area). @@ -83,7 +91,6 @@ if __name__ == '__main__': active_areas = areas.filter(state__in=ACTIVE_STATES) for area in active_areas: name = area.acronym - dump_sublist('%s%s' % (name, '-ads'), get_area_ads_emails, area, True) - dump_sublist('%s%s' % (name, '-chairs'), get_area_chairs_emails, area) - + dump_sublist(afile, vfile, name+'-ads' , get_area_ads_emails(area)) + dump_sublist(afile, vfile, name+'-chairs', get_area_chairs_emails(area)) diff --git a/ietf/group/utils.py b/ietf/group/utils.py index d35df624f..28086e103 100644 --- a/ietf/group/utils.py +++ b/ietf/group/utils.py @@ -70,7 +70,7 @@ def get_group_chairs_emails(wg): emails = Email.objects.filter(role__group=wg, role__name='chair') if not emails: - return + return [] emails = [e.email_address() for e in emails] emails = filter(None, emails) return emails diff --git a/ietf/settings.py b/ietf/settings.py index 0a0eef879..443acb72d 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -439,6 +439,15 @@ BADNESS_MUCHTOOBIG = 500 SELENIUM_TESTS = False SELENIUM_TESTS_ONLY = False +# Path to the email alias lists. Used by ietf.utils.aliases +DRAFT_ALIASES_PATH = "/a/postfix/draft-aliases" +DRAFT_VIRTUAL_PATH = "/a/postfix/draft-virtual" + +GROUP_ALIASES_PATH = "/a/postfix/group-aliases" +GROUP_VIRTUAL_PATH = "/a/postfix/group-virtual" + +POSTCONFIRM_PATH = "/a/postconfirm/test-wrapper" + # Put the production SECRET_KEY in settings_local.py, and also any other # sensitive or site-specific changes. DO NOT commit settings_local.py to svn. from settings_local import * # pyflakes:ignore diff --git a/ietf/utils/aliases.py b/ietf/utils/aliases.py index 5348e20e3..edfce0b06 100644 --- a/ietf/utils/aliases.py +++ b/ietf/utils/aliases.py @@ -12,7 +12,9 @@ Mailing list alias dumping utilities """ -def rewrite_email_address(email, is_ad): +from django.conf import settings + +def rewrite_email_address(email): """ Prettify the email address (and if it's empty, skip it by returning None). """ if not email: @@ -38,32 +40,35 @@ def rewrite_address_list(l): h[address] = True yield address -def dump_sublist(alias, f, wg, is_adlist=False): - if f: - l = f(wg) - else: - l = wg - if not l: - return +def dump_sublist(afile, vfile, alias, emails): + if not emails: + return emails # Nones in the list should be skipped - l = filter(None, l) + emails = filter(None, emails) # Make sure emails are sane and eliminate the Nones again for # non-sane ones - l = [rewrite_email_address(e, is_adlist) for e in l] - l = filter(None, l) + emails = [rewrite_email_address(e) for e in emails] + emails = filter(None, emails) # And we'll eliminate the duplicates too but preserve order - l = list(rewrite_address_list(l)) - if not l: - return + emails = list(rewrite_address_list(emails)) + if not emails: + return emails try: - print '%s: %s' % (alias, ', '.join(l)) + virtualname = 'xalias-%s' % (alias, ) + expandname = 'expand-%s' % (alias) + aliasaddr = '%s@ietf.org' % (alias, ) + + vfile.write('%-64s %s\n' % (aliasaddr, virtualname)) + afile.write('%-64s "|%s filter %s"\n' % (virtualname+':', settings.POSTCONFIRM_PATH, expandname)) + afile.write('%-64s %s\n' % (expandname+':', ', '.join(emails))) + except UnicodeEncodeError: # If there's unicode in email address, something is badly # wrong and we just silently punt # XXX - is there better approach? - print '# Error encoding', alias, repr(l) - return - return l + print '# Error encoding', alias, repr(emails) + return [] + return emails