datatracker/ietf/bin/generate-wg-aliases
2021-03-05 15:07:50 +00:00

90 lines
3.6 KiB
Python
Executable file

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -*- Python -*-
#
# $Id: generate-wg-aliases $
#
# Original Author: Markus Stenberg <markus.stenberg@iki.fi>
# Refactored By: Russ Housley <housley@vigilsec.com>
#
"""
This script requires that the proper virtual python environment has been
invoked before start.
This code dumps Django model IETFWG's contents as two sets of postfix
mail lists: -ads, and -chairs
"""
import io
import os
import sys
import datetime
import time
filename = os.path.abspath(__file__)
basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))
sys.path = [ basedir ] + sys.path
os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings"
import django
django.setup()
from django.conf import settings
import debug # pyflakes:ignore
from ietf.group.models import Group
from ietf.group.utils import get_group_ad_emails, get_group_role_emails, get_child_group_role_emails
from ietf.name.models import GroupTypeName
from ietf.utils.aliases import dump_sublist
ACTIVE_STATES=['active', 'bof', 'proposed']
GROUP_TYPES=['wg','rg','dir','team','review','program']
NO_AD_GROUP_TYPES=['rg','team','program']
if __name__ == '__main__':
date = time.strftime("%Y-%m-%d_%H:%M:%S")
signature = '# Generated by %s at %s\n' % (filename, date)
afile = io.open(settings.GROUP_ALIASES_PATH, "w")
vfile = io.open(settings.GROUP_VIRTUAL_PATH, "w")
afile.write(signature)
vfile.write(signature)
vfile.write("%s anything\n" % settings.GROUP_VIRTUAL_DOMAIN)
# Inactive == 5 years ago
show_since = datetime.datetime.now() - datetime.timedelta(5 * 365)
# Loop through each group type and build -ads and -chairs entries
for g in GROUP_TYPES:
entries = Group.objects.filter(type=g).all()
active_entries = entries.filter(state__in=ACTIVE_STATES)
inactive_recent_entries = entries.exclude(state__in=ACTIVE_STATES).filter(time__gte=show_since)
interesting_entries = active_entries | inactive_recent_entries
for e in interesting_entries.distinct().iterator():
name = e.acronym
# Research groups, teams, and programs do not have -ads lists
if not g in NO_AD_GROUP_TYPES:
dump_sublist(afile, vfile, name+'-ads', ['ietf.org', ], settings.GROUP_VIRTUAL_DOMAIN, get_group_ad_emails(e))
# All group types have -chairs lists
dump_sublist(afile, vfile, name+'-chairs', ['ietf.org', ], settings.GROUP_VIRTUAL_DOMAIN, get_group_role_emails(e, ['chair', 'secr']))
# The area lists include every chair in active working groups in the area
areas = Group.objects.filter(type='area').all()
active_areas = areas.filter(state__in=ACTIVE_STATES)
for area in active_areas:
name = area.acronym
area_ad_emails = get_group_role_emails(area, ['pre-ad', 'ad', 'chair'])
dump_sublist(afile, vfile, name+'-ads', ['ietf.org', ], settings.GROUP_VIRTUAL_DOMAIN, area_ad_emails)
dump_sublist(afile, vfile, name+'-chairs', ['ietf.org', ], settings.GROUP_VIRTUAL_DOMAIN, (get_child_group_role_emails(area, ['chair', 'secr']) | area_ad_emails))
# Other groups with chairs that require Internet-Draft submission approval
gtypes = GroupTypeName.objects.values_list('slug', flat=True)
special_groups = Group.objects.filter(type__features__req_subm_approval=True, acronym__in=gtypes, state='active')
for group in special_groups:
dump_sublist(afile, vfile, group.acronym+'-chairs', ['ietf.org', ], settings.GROUP_VIRTUAL_DOMAIN, get_group_role_emails(group, ['chair', 'delegate']))
afile.close()
vfile.close()