From a208803e82063408adc522f1f3444b3be3730ff6 Mon Sep 17 00:00:00 2001
From: Robert Sparks <rjsparks@nostrum.com>
Date: Fri, 13 Feb 2015 04:18:47 +0000
Subject: [PATCH] Added dealing with /wg/foo/email-aliases, /wg/email-aliases,
 and similar for /rg. Added an initial test suite for all invocations of the
 email_alias views. Commit ready for merge.  - Legacy-Id: 9083

---
 ietf/doc/tests.py        | 46 ++++++++++++++++++++++++++++++++++++++++
 ietf/group/info.py       |  7 +++---
 ietf/group/tests_info.py | 42 ++++++++++++++++++++++++++++++++++++
 ietf/group/urls_info.py  |  2 ++
 4 files changed, 94 insertions(+), 3 deletions(-)

diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py
index 0fda63c48..3629417ce 100644
--- a/ietf/doc/tests.py
+++ b/ietf/doc/tests.py
@@ -1,3 +1,4 @@
+import os
 import datetime
 import sys
 if sys.version_info[0] == 2 and sys.version_info[1] < 7:
@@ -5,8 +6,10 @@ if sys.version_info[0] == 2 and sys.version_info[1] < 7:
 else:
     import unittest
 from pyquery import PyQuery
+from tempfile import NamedTemporaryFile
 
 from django.core.urlresolvers import reverse as urlreverse
+from django.conf import settings
 
 from ietf.doc.models import ( Document, DocAlias, DocRelationshipName, RelatedDocument, State,
     DocEvent, BallotPositionDocEvent, LastCallDocEvent, WriteupDocEvent, save_document_in_history )
@@ -472,3 +475,46 @@ class ReferencesTest(TestCase):
         self.assertEquals(r.status_code, 200)
         self.assertTrue(doc1.name in r.content)
        
+
+class EmailAliasesTests(TestCase):
+
+    def setUp(self):
+        make_test_data()
+        self.doc_alias_file = NamedTemporaryFile(delete=False)
+        self.doc_alias_file.write("""# Generated by hand at 2015-02-12_16:26:45
+virtual.ietf.org anything
+draft-ietf-mars-test@ietf.org              xfilter-draft-ietf-mars-test
+expand-draft-ietf-mars-test@virtual.ietf.org  mars-author@example.com, mars-collaborator@example.com
+draft-ietf-mars-test.authors@ietf.org      xfilter-draft-ietf-mars-test.authors
+expand-draft-ietf-mars-test.authors@virtual.ietf.org  mars-author@example.mars, mars-collaborator@example.mars
+draft-ietf-mars-test.chairs@ietf.org      xfilter-draft-ietf-mars-test.chairs
+expand-draft-ietf-mars-test.chairs@virtual.ietf.org  mars-chair@example.mars
+draft-ietf-mars-test.all@ietf.org      xfilter-draft-ietf-mars-test.all
+expand-draft-ietf-mars-test.all@virtual.ietf.org  mars-author@example.mars, mars-collaborator@example.mars, mars-chair@example.mars
+draft-ietf-ames-test@ietf.org              xfilter-draft-ietf-ames-test
+expand-draft-ietf-ames-test@virtual.ietf.org  ames-author@example.com, ames-collaborator@example.com
+draft-ietf-ames-test.authors@ietf.org      xfilter-draft-ietf-ames-test.authors
+expand-draft-ietf-ames-test.authors@virtual.ietf.org  ames-author@example.ames, ames-collaborator@example.ames
+draft-ietf-ames-test.chairs@ietf.org      xfilter-draft-ietf-ames-test.chairs
+expand-draft-ietf-ames-test.chairs@virtual.ietf.org  ames-chair@example.ames
+draft-ietf-ames-test.all@ietf.org      xfilter-draft-ietf-ames-test.all
+expand-draft-ietf-ames-test.all@virtual.ietf.org  ames-author@example.ames, ames-collaborator@example.ames, ames-chair@example.ames
+
+""")
+        self.doc_alias_file.close()
+        settings.DRAFT_VIRTUAL_PATH = self.doc_alias_file.name
+
+    def tearDown(self):
+        os.unlink(self.doc_alias_file.name)
+
+    def testAliases(self):
+        url = urlreverse('ietf.doc.views_doc.email_aliases', kwargs=dict())
+        r = self.client.get(url)
+        self.assertTrue(all([x in r.content for x in ['mars-test@','mars-test.authors@','mars-test.chairs@']]))
+        self.assertTrue(all([x in r.content for x in ['ames-test@','ames-test.authors@','ames-test.chairs@']]))
+
+        url = urlreverse('ietf.doc.views_doc.email_aliases', kwargs=dict(name="draft-ietf-mars-test"))
+        r = self.client.get(url)
+        self.assertTrue(all([x in r.content for x in ['mars-test@','mars-test.authors@','mars-test.chairs@']]))
+        self.assertFalse(any([x in r.content for x in ['ames-test@','ames-test.authors@','ames-test.chairs@']]))
+
diff --git a/ietf/group/info.py b/ietf/group/info.py
index 59b844036..14cacc99d 100644
--- a/ietf/group/info.py
+++ b/ietf/group/info.py
@@ -624,8 +624,8 @@ def dependencies_pdf(request, acronym, group_type=None):
 
     return HttpResponse(pdf, content_type='application/pdf')
 
-def email_aliases(request, acronym=None):
-    group = get_group_or_404(acronym,None) if acronym else None
+def email_aliases(request, acronym=None, group_type=None):
+    group = get_group_or_404(acronym,group_type) if acronym else None
 
     if acronym:
         pattern = re.compile('expand-(%s)(-\w+)@.*? +(.*)$'%acronym)
@@ -637,7 +637,8 @@ def email_aliases(request, acronym=None):
         for line in virtual_file.readlines():
             m = pattern.match(line)
             if m:
-                aliases.append({'acronym':m.group(1),'alias_type':m.group(2),'expansion':m.group(3)})
+                if acronym or not group_type or Group.objects.filter(acronym=m.group(1),type__slug=group_type):
+                    aliases.append({'acronym':m.group(1),'alias_type':m.group(2),'expansion':m.group(3)})
 
     return render(request,'group/email_aliases.html',{'aliases':aliases,'ietf_domain':settings.IETF_DOMAIN,'group':group})
 
diff --git a/ietf/group/tests_info.py b/ietf/group/tests_info.py
index 4d4ce4694..e12a00406 100644
--- a/ietf/group/tests_info.py
+++ b/ietf/group/tests_info.py
@@ -5,6 +5,7 @@ import json
 import datetime
 
 from pyquery import PyQuery
+from tempfile import NamedTemporaryFile
 import debug                            # pyflakes:ignore
 
 from django.conf import settings
@@ -951,3 +952,44 @@ class CustomizeWorkflowTests(TestCase):
         self.assertEqual(len(q('form').find('input[name=tag][value="%s"]' % tag.pk).parents("form").find("input[name=active]")), 1)
         group = Group.objects.get(acronym=group.acronym)
         self.assertTrue(tag in group.unused_tags.all())
+
+class EmailAliasesTests(TestCase):
+
+    def setUp(self):
+        make_test_data()
+        self.group_alias_file = NamedTemporaryFile(delete=False)
+        self.group_alias_file.write("""# Generated by hand at 2015-02-12_16:30:52
+virtual.ietf.org anything
+mars-ads@ietf.org                                                xfilter-mars-ads
+expand-mars-ads@virtual.ietf.org                                 aread@ietf.org
+mars-chairs@ietf.org                                             xfilter-mars-chairs
+expand-mars-chairs@virtual.ietf.org                              mars_chair@ietf.org
+ames-ads@ietf.org                                                xfilter-mars-ads
+expand-ames-ads@virtual.ietf.org                                 aread@ietf.org
+ames-chairs@ietf.org                                             xfilter-mars-chairs
+expand-ames-chairs@virtual.ietf.org                              mars_chair@ietf.org
+""")
+        self.group_alias_file.close()
+        settings.GROUP_VIRTUAL_PATH = self.group_alias_file.name
+
+    def tearDown(self):
+        os.unlink(self.group_alias_file.name)
+
+    def testNothing(self):
+        url = urlreverse('ietf.group.info.email_aliases', kwargs=dict())
+        r = self.client.get(url)
+        self.assertTrue(all([x in r.content for x in ['mars-ads@','mars-chairs@','ames-ads@','ames-chairs@']]))
+
+        url = urlreverse('ietf.group.info.email_aliases', kwargs=dict(acronym="mars"))
+        r = self.client.get(url)
+        self.assertTrue(all([x in r.content for x in ['mars-ads@','mars-chairs@']]))
+        self.assertFalse(any([x in r.content for x in ['ames-ads@','ames-chairs@']]))
+
+        url = urlreverse('ietf.group.info.email_aliases', kwargs=dict(group_type="wg"))
+        r = self.client.get(url)
+        self.assertTrue('mars-ads@' in r.content)
+
+        url = urlreverse('ietf.group.info.email_aliases', kwargs=dict(group_type="rg"))
+        r = self.client.get(url)
+        self.assertFalse('mars-ads@' in r.content)
+
diff --git a/ietf/group/urls_info.py b/ietf/group/urls_info.py
index ba5d2ab1f..95d59141e 100644
--- a/ietf/group/urls_info.py
+++ b/ietf/group/urls_info.py
@@ -17,6 +17,7 @@ urlpatterns = patterns('',
     (r'^chartering/$', RedirectView.as_view(url='/group/chartering/')),
     (r'^chartering/create/$', RedirectView.as_view(url='/group/chartering/create/%(group_type)s/')),
     (r'^bofs/$', info.bofs),
+    (r'^email-aliases/$', 'ietf.group.info.email_aliases'),
     (r'^bofs/create/$', edit.edit, {'action': "create"}, "bof_create"),
     (r'^(?P<acronym>[a-zA-Z0-9-._]+)/documents/txt/$', info.group_documents_txt),
     (r'^(?P<acronym>[a-zA-Z0-9-._]+)/$', info.group_home, None, "group_home"),
@@ -33,4 +34,5 @@ urlpatterns = patterns('',
     (r'^(?P<acronym>[a-zA-Z0-9-._]+)/milestones/charter/reset/$', milestones.reset_charter_milestones, None, "group_reset_charter_milestones"),
     (r'^(?P<acronym>[a-zA-Z0-9-._]+)/ajax/searchdocs/$', milestones.ajax_search_docs, None, "group_ajax_search_docs"),
     (r'^(?P<acronym>[a-zA-Z0-9-._]+)/workflow/$', edit.customize_workflow),
+    (r'^(?P<acronym>[A-Za-z0-9._+-]+)/email-aliases/$', 'ietf.group.info.email_aliases'),
 )