152 lines
5.4 KiB
Python
152 lines
5.4 KiB
Python
import os
|
|
|
|
from django.shortcuts import get_object_or_404
|
|
|
|
import debug # pyflakes:ignore
|
|
|
|
from ietf.group.models import Group, RoleHistory
|
|
from ietf.person.models import Email
|
|
from ietf.utils.history import get_history_object_for, copy_many_to_many_for_history
|
|
from ietf.ietfauth.utils import has_role
|
|
from ietf.community.models import CommunityList, SearchRule
|
|
from ietf.community.utils import reset_name_contains_index_for_rule
|
|
from ietf.doc.models import State
|
|
|
|
|
|
def save_group_in_history(group):
|
|
"""This should be called before saving changes to a Group instance,
|
|
so that the GroupHistory entries contain all previous states, while
|
|
the Group entry contain the current state. XXX TODO: Call this
|
|
directly from Group.save()
|
|
"""
|
|
h = get_history_object_for(group)
|
|
h.save()
|
|
|
|
# save RoleHistory
|
|
for role in group.role_set.all():
|
|
rh = RoleHistory(name=role.name, group=h, email=role.email, person=role.person)
|
|
rh.save()
|
|
|
|
copy_many_to_many_for_history(h, group)
|
|
|
|
return h
|
|
|
|
def get_charter_text(group):
|
|
# get file path from settings. Syntesize file name from path, acronym, and suffix
|
|
c = group.charter
|
|
|
|
# find the latest, preferably approved, revision
|
|
for h in group.charter.history_set.exclude(rev="").order_by("time"):
|
|
h_appr = "-" not in h.rev
|
|
c_appr = "-" not in c.rev
|
|
if (h.rev > c.rev and not (c_appr and not h_appr)) or (h_appr and not c_appr):
|
|
c = h
|
|
|
|
filename = os.path.join(c.get_file_path(), "%s-%s.txt" % (c.canonical_name(), c.rev))
|
|
try:
|
|
with open(filename) as f:
|
|
return f.read()
|
|
except IOError:
|
|
return 'Error Loading Group Charter'
|
|
|
|
def get_group_role_emails(group, roles):
|
|
"Get a list of email addresses for a given WG and Role"
|
|
if not group or not group.acronym or group.acronym == 'none':
|
|
return set()
|
|
emails = Email.objects.filter(role__group=group, role__name__in=roles)
|
|
return set(filter(None, [e.email_address() for e in emails]))
|
|
|
|
def get_child_group_role_emails(parent, roles, group_type='wg'):
|
|
"""Get a list of email addresses for a given set of
|
|
roles for all child groups of a given type"""
|
|
emails = set()
|
|
groups = Group.objects.filter(parent=parent, type=group_type, state="active")
|
|
for group in groups:
|
|
emails |= get_group_role_emails(group, roles)
|
|
return emails
|
|
|
|
def get_group_ad_emails(wg):
|
|
" Get list of area directors' email addresses for a given WG "
|
|
if not wg.acronym or wg.acronym == 'none':
|
|
return set()
|
|
emails = get_group_role_emails(wg.parent, roles=('pre-ad', 'ad', 'chair'))
|
|
# Make sure the assigned AD is included (in case that is not one of the area ADs)
|
|
if wg.state.slug=='active':
|
|
wg_ad_email = wg.ad_role() and wg.ad_role().email.address
|
|
if wg_ad_email:
|
|
emails.add(wg_ad_email)
|
|
return emails
|
|
|
|
def save_milestone_in_history(milestone):
|
|
h = get_history_object_for(milestone)
|
|
h.milestone = milestone
|
|
h.save()
|
|
|
|
copy_many_to_many_for_history(h, milestone)
|
|
|
|
return h
|
|
|
|
def can_manage_group_type(user, group_type):
|
|
if group_type == "rg":
|
|
return has_role(user, ('IRTF Chair', 'Secretariat'))
|
|
elif group_type == "wg":
|
|
return has_role(user, ('Area Director', 'Secretariat'))
|
|
|
|
return has_role(user, 'Secretariat')
|
|
|
|
def can_manage_group(user, group):
|
|
if group.type_id == "rg":
|
|
return has_role(user, ('IRTF Chair', 'Secretariat'))
|
|
elif group.type_id == "wg":
|
|
return has_role(user, ('Area Director', 'Secretariat'))
|
|
elif group.type_id == "team":
|
|
if group.is_decendant_of("ietf"):
|
|
return has_role(user, ('Area Director', 'Secretariat'))
|
|
elif group.is_decendant_of("irtf"):
|
|
return has_role(user, ('IRTF Chair', 'Secretariat'))
|
|
return has_role(user, ('Secretariat'))
|
|
|
|
def milestone_reviewer_for_group_type(group_type):
|
|
if group_type == "rg":
|
|
return "IRTF Chair"
|
|
else:
|
|
return "Area Director"
|
|
|
|
def can_manage_materials(user, group):
|
|
return has_role(user, 'Secretariat') or group.has_role(user, ("chair", "delegate", "secr", "matman"))
|
|
|
|
def can_provide_status_update(user, group):
|
|
if not group.type_id in ['wg','rg','team']:
|
|
return False
|
|
return has_role(user, 'Secretariat') or group.has_role(user, ("chair", "delegate", "secr", "ad",))
|
|
|
|
def get_group_or_404(acronym, group_type):
|
|
"""Helper to overcome the schism between group-type prefixed URLs and generic."""
|
|
possible_groups = Group.objects.all()
|
|
if group_type:
|
|
possible_groups = possible_groups.filter(type=group_type)
|
|
|
|
return get_object_or_404(possible_groups, acronym=acronym)
|
|
|
|
def setup_default_community_list_for_group(group):
|
|
clist = CommunityList.objects.create(group=group)
|
|
SearchRule.objects.create(
|
|
community_list=clist,
|
|
rule_type="group",
|
|
group=group,
|
|
state=State.objects.get(slug="active", type="draft"),
|
|
)
|
|
SearchRule.objects.create(
|
|
community_list=clist,
|
|
rule_type="group_rfc",
|
|
group=group,
|
|
state=State.objects.get(slug="rfc", type="draft"),
|
|
)
|
|
related_docs_rule = SearchRule.objects.create(
|
|
community_list=clist,
|
|
rule_type="name_contains",
|
|
text=r"^draft-[^-]+-%s-" % group.acronym,
|
|
state=State.objects.get(slug="active", type="draft"),
|
|
)
|
|
reset_name_contains_index_for_rule(related_docs_rule)
|