From b2aae7dc35215e94a0adf76b380791e186f2fe84 Mon Sep 17 00:00:00 2001
From: Henrik Levkowetz <henrik@levkowetz.com>
Date: Wed, 19 Oct 2016 14:44:44 +0000
Subject: [PATCH] Ignore the virtualenv-created directories under env/  -
 Legacy-Id: 12178

---
 env/.gitignore                                |  7 +++
 ietf/settings.py                              |  5 +-
 .../management/commands/create_group_wikis.py | 16 +++----
 ietf/utils/tests.py                           | 48 ++++++++++++++++++-
 4 files changed, 63 insertions(+), 13 deletions(-)
 create mode 100644 env/.gitignore

diff --git a/env/.gitignore b/env/.gitignore
new file mode 100644
index 000000000..e340628a0
--- /dev/null
+++ b/env/.gitignore
@@ -0,0 +1,7 @@
+/bin
+/share
+/selenium
+/etc
+/local
+/lib
+/include
diff --git a/ietf/settings.py b/ietf/settings.py
index 2ff9b2cef..38186e7be 100644
--- a/ietf/settings.py
+++ b/ietf/settings.py
@@ -382,7 +382,7 @@ TEST_URL_COVERAGE_EXCLUDE = [
     r"^\^admin/",
 ]
 
-# Tese are filename globs
+# These are filename globs.  They are fed directly to the coverage code checker.
 TEST_CODE_COVERAGE_EXCLUDE = [
     "*/tests*",
     "*/admin.py",
@@ -660,8 +660,7 @@ USER_PREFERENCE_DEFAULTS = {
 }
 
 TRAC_MASTER_DIR = "/a/www/trac-setup/"
-TRAC_WIKI_DIR_ROOT = "/a/www/www6s/trac/"
-TRAC_WIKI_DIR_PATTERN = os.path.join(TRAC_WIKI_DIR_ROOT, "%s")
+TRAC_WIKI_DIR_PATTERN = "/a/www/www6s/trac/%s"
 TRAC_WIKI_URL_PATTERN = "https://trac.ietf.org/trac/%s/wiki"
 TRAC_ISSUE_URL_PATTERN = "https://trac.ietf.org/trac/%s/report/1"
 TRAC_SVN_DIR_PATTERN = "/a/svn/group/%s"
diff --git a/ietf/utils/management/commands/create_group_wikis.py b/ietf/utils/management/commands/create_group_wikis.py
index 13795298d..6accb1353 100644
--- a/ietf/utils/management/commands/create_group_wikis.py
+++ b/ietf/utils/management/commands/create_group_wikis.py
@@ -4,16 +4,14 @@ import os
 import copy
 import syslog
 import pkg_resources
+from optparse import make_option
 #from optparse import make_option
 
-from trac.admin.api import AdminCommandManager
 from trac.core import TracError
 from trac.env import Environment
 from trac.perm import PermissionSystem
 from trac.ticket.model import Component, Milestone, Severity
 from trac.util.text import unicode_unquote
-from trac.versioncontrol.api import RepositoryManager
-from trac.wiki.admin import WikiAdmin
 from trac.wiki.model import WikiPage
 
 from django.conf import settings
@@ -33,8 +31,9 @@ class Command(BaseCommand):
     help = "Create group wikis for WGs, RGs and Areas which don't have one."
 
     option_list = BaseCommand.option_list + (
+        make_option('--wiki-dir-pattern', dest='wiki_dir_pattern', help='File containing email (default: stdin)'),
     )    
-    #verbosity = 1
+    verbosity = 2
     
     def note(self, msg):
         if self.verbosity > 1:
@@ -238,12 +237,13 @@ class Command(BaseCommand):
     def handle(self, *filenames, **options):
         self.verbosity = options['verbosity']
         self.errors = 0
+        self.wiki_dir_pattern = options.get('wiki_dir_pattern', settings.TRAC_WIKI_DIR_PATTERN)
 
-        if self.verbosity.isdigit():
+        if isinstance(self.verbosity, (type(""), type(u""))) and self.verbosity.isdigit():
             self.verbosity = int(self.verbosity)
 
-        if not os.path.exists(settings.TRAC_WIKI_DIR_ROOT):
-            raise CommandError('The Wiki base direcory specified in settings.TRAC_WIKI_DIR_ROOT (%s) does not exist.' % settings.TRAC_WIKI_DIR_ROOT)
+        if not os.path.exists(os.path.dirname(self.wiki_dir_pattern)):
+            raise CommandError('The Wiki base direcory specified for the wiki directories (%s) does not exist.' % os.path.dirname(self.wiki_dir_pattern))
 
         groups = Group.objects.filter(
                         type__slug__in=['wg','rg','area'],
@@ -253,7 +253,7 @@ class Command(BaseCommand):
         for group in groups:
             try:
                 self.note("Processing group %s" % group.acronym)
-                group.trac_dir = settings.TRAC_WIKI_DIR_PATTERN % group.acronym
+                group.trac_dir = self.wiki_dir_pattern % group.acronym
                 group.svn_dir = settings.TRAC_SVN_DIR_PATTERN % group.acronym
 
                 if not os.path.exists(group.svn_dir):
diff --git a/ietf/utils/tests.py b/ietf/utils/tests.py
index 6bf4d7336..76929800a 100644
--- a/ietf/utils/tests.py
+++ b/ietf/utils/tests.py
@@ -1,8 +1,9 @@
 # -*- coding: utf-8 -*-
 import os.path
 import types
-#import json
-#from pathlib import Path
+import shutil
+from StringIO import StringIO
+from pipe import pipe
 
 from textwrap import dedent
 from email.mime.text import MIMEText
@@ -10,6 +11,7 @@ from email.mime.image import MIMEImage
 from email.mime.multipart import MIMEMultipart
 
 from django.conf import settings
+from django.core.management import call_command
 from django.template import Context
 from django.template.defaulttags import URLNode
 from django.templatetags.static import StaticNode
@@ -21,7 +23,9 @@ import debug                            # pyflakes:ignore
 import ietf.urls
 from ietf.utils.management.commands import pyflakes
 from ietf.utils.mail import send_mail_text, send_mail_mime, outbox 
+from ietf.utils.test_data import make_test_data
 from ietf.utils.test_runner import get_template_paths
+from ietf.group.models import Group
 
 class PyFlakesTestCase(TestCase):
 
@@ -186,6 +190,46 @@ class TemplateChecksTestCase(TestCase):
         settings.DEBUG = saved_debug
 
 
+class TestWikiGlueManagementCommand(TestCase):
+
+    def setUp(self):
+        self.wiki_dir_pattern = os.path.abspath('tmp-wiki-dir-root/%s')
+        if not os.path.exists(self.wiki_dir_pattern):
+            os.mkdir(os.path.dirname(self.wiki_dir_pattern))
+
+    def tearDown(self):
+        shutil.rmtree(os.path.dirname(self.wiki_dir_pattern))
+
+    def test_wiki_create_output(self):
+        make_test_data()
+        groups = Group.objects.filter(
+                        type__slug__in=['wg','rg','area'],
+                        state__slug='active'
+                    ).order_by('acronym')
+        out = StringIO()
+        call_command('create_group_wikis', stdout=out, verbosity=2, wiki_dir_pattern=self.wiki_dir_pattern)
+        command_output = out.getvalue()
+        for group in groups:
+            self.assertIn("Processing group %s" % group.acronym, command_output)
+            # Do a bit of verification using trac-admin, too
+            admin_code, admin_output, admin_error = pipe('trac-admin %s permission list' % (self.wiki_dir_pattern % group.acronym))
+            self.assertEqual(admin_code, 0)
+            roles = group.role_set.filter(name_id__in=['chair', 'secr', 'ad'])
+            for role in roles:
+                user = role.email.address.lower()
+                self.assertIn("Granting admin permission for %s" % user, command_output)
+                self.assertIn(user, admin_output)
+            docs = group.document_set.filter(stats_slug='active', type_id='draft')
+            for doc in docs:
+                name = doc.name
+                name = name.replace('draft-','')
+                name = name.replace(group.stream+'-', '')
+                name = name.replace(group.acronym+'-', '')
+                self.assertIn("Adding component %s"%name, command_output)
+        for page in settings.TRAC_WIKI_PAGES_TEMPLATES:
+            self.assertIn("Adding page %s" % os.path.basename(page), command_output)
+        self.assertIn("Indexing default repository", command_output)
+
 ## One might think that the code below would work, but it doesn't ...
 
 # def list_static_files(path):