You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@allura.apache.org by br...@apache.org on 2015/11/25 20:38:01 UTC

[07/17] allura git commit: [#7999] ticket:856 Include reason

[#7999] ticket:856 Include reason


Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/61b27bd7
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/61b27bd7
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/61b27bd7

Branch: refs/heads/master
Commit: 61b27bd762cc2965f75b61cb37ad2f6145aafe85
Parents: 0d1a63f
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Nov 2 18:21:48 2015 +0200
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Wed Nov 25 14:37:42 2015 -0500

----------------------------------------------------------------------
 Allura/allura/controllers/site_admin.py           |  8 ++++++--
 Allura/allura/scripts/delete_projects.py          |  7 +++++--
 .../templates/site_admin_delete_projects.html     | 13 +++++++++----
 Allura/allura/tests/functional/test_site_admin.py | 18 ++++++++++++++++++
 Allura/allura/tests/test_delete_projects.py       | 15 ++++++++++++++-
 5 files changed, 52 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/allura/blob/61b27bd7/Allura/allura/controllers/site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index 5587148..cec6b3a 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -18,6 +18,7 @@
 import re
 import logging
 from datetime import datetime, timedelta
+import pipes
 
 from tg import expose, validate, flash, config, redirect
 from tg.decorators import with_trailing_slash, without_trailing_slash
@@ -320,8 +321,9 @@ class SiteAdminController(object):
 
     @without_trailing_slash
     @expose('jinja:allura:templates/site_admin_delete_projects.html')
-    @validate(validators=dict(projects=validators.UnicodeString(if_empty=None)))
-    def delete_projects(self, projects=None, **kw):
+    @validate(validators=dict(projects=validators.UnicodeString(if_empty=None),
+                              reason=validators.UnicodeString(if_empty=None)))
+    def delete_projects(self, projects=None, reason=None, **kw):
         if request.method == "POST":
             if not projects:
                 flash(u'No projects specified', 'warning')
@@ -334,6 +336,8 @@ class SiteAdminController(object):
             log.info('Parsed projects: %s', projects)
             task_params = [u'{}/{}'.format(n.strip('/'), p) for (n, p) in projects]
             task_params = u' '.join(task_params)
+            if reason:
+                task_params = u'-r {} {}'.format(pipes.quote(reason), task_params)
             DeleteProjects.post(task_params)
             flash(u'Delete scheduled for %s' % projects, 'ok')
             redirect('delete_projects')

http://git-wip-us.apache.org/repos/asf/allura/blob/61b27bd7/Allura/allura/scripts/delete_projects.py
----------------------------------------------------------------------
diff --git a/Allura/allura/scripts/delete_projects.py b/Allura/allura/scripts/delete_projects.py
index 23b144a..0cd1ca8 100644
--- a/Allura/allura/scripts/delete_projects.py
+++ b/Allura/allura/scripts/delete_projects.py
@@ -36,8 +36,10 @@ class DeleteProjects(ScriptTask):
         for proj in options.projects:
             proj = cls.get_project(proj)
             if proj:
-                log.info('Purging %s%s', proj.neighborhood.url_prefix, proj.shortname)
+                log.info('Purging %s%s. Reason: %s', proj.neighborhood.url_prefix, proj.shortname, options.reason)
+                pid = proj._id
                 cls.purge_project(proj)
+                g.post_event('project_deleted', project_id=pid, reason=options.reason)
 
     @classmethod
     def get_project(cls, proj):
@@ -67,13 +69,14 @@ class DeleteProjects(ScriptTask):
                 cls.query.remove(dict(app_config_id={'$in': app_config_ids}))
         project.delete()
         session(project).flush()
-        g.post_event('project_deleted', project_id=pid)
 
     @classmethod
     def parser(cls):
         parser = argparse.ArgumentParser(description='Completely delete projects')
         parser.add_argument('projects', metavar='nbhd/project', type=str, nargs='+',
                             help='Project to delete in a form nbhd_prefix/shortname')
+        parser.add_argument('-r', '--reason', type=str,
+                            help='Reason why these projects being deleted')
         return parser
 
 

http://git-wip-us.apache.org/repos/asf/allura/blob/61b27bd7/Allura/allura/templates/site_admin_delete_projects.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_delete_projects.html b/Allura/allura/templates/site_admin_delete_projects.html
index ddf85b9..bae6a05 100644
--- a/Allura/allura/templates/site_admin_delete_projects.html
+++ b/Allura/allura/templates/site_admin_delete_projects.html
@@ -26,11 +26,16 @@
 
 {% block content %}
   <div class="grid-19">
-    <p>Put project URLs separated by newline or whitespace</p>
+    <p>Put project URLs separated by newline or whitespace below</p>
     <p class="warning">Be carefull. This will delete all projects data!</p>
-    <form action="delete_projects" method="POST">
+    <form action="delete_projects" method="POST" id="delete_projects">
       <div class="grid-18">
-        <textarea id="projects-to-delete" name="projects">{{ projects }}</textarea>
+        <label for="projects">Projects:</label><br>
+        <textarea name="projects">{{ projects }}</textarea>
+      </div>
+      <div class="grid-18">
+        <label for="reason">Reason:</label><br>
+        <textarea name="reason"></textarea>
       </div>
       <div class="grid-18">
         <input type="submit" value="Delete">
@@ -42,7 +47,7 @@
 
 {% block extra_css %}
 <style>
-#projects-to-delete {
+#delete_projects textarea {
   width: 90%;
   height: 100px;
 }

http://git-wip-us.apache.org/repos/asf/allura/blob/61b27bd7/Allura/allura/tests/functional/test_site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/functional/test_site_admin.py b/Allura/allura/tests/functional/test_site_admin.py
index 0918a0f..f6c1a31 100644
--- a/Allura/allura/tests/functional/test_site_admin.py
+++ b/Allura/allura/tests/functional/test_site_admin.py
@@ -577,6 +577,24 @@ class TestDeleteProjects(TestController):
         assert_equal(self.form(r)['projects'].value, u'/p/test/\n/adobe/adobe-1/\n/p/test2/')
 
     @patch('allura.controllers.site_admin.DeleteProjects', autospec=True)
+    def test_reason_passed_to_task(self, dp):
+        r = self.app.get('/nf/admin/delete_projects')
+        form = self.form(r)
+        form['projects'] = 'p/test2'
+        form['reason'] = 'Because "I can and want"'
+        form.submit()
+        dp.post.assert_called_once_with('-r \'Because "I can and want"\' p/test2')
+
+    @patch('allura.controllers.site_admin.DeleteProjects', autospec=True)
+    def test_multiline_reason_passed_to_task(self, dp):
+        r = self.app.get('/nf/admin/delete_projects')
+        form = self.form(r)
+        form['projects'] = 'p/test2'
+        form['reason'] = 'Because\nI want'
+        form.submit()
+        dp.post.assert_called_once_with('-r \'Because\nI want\' p/test2')
+
+    @patch('allura.controllers.site_admin.DeleteProjects', autospec=True)
     def test_task_fires(self, dp):
         r = self.app.get('/nf/admin/delete_projects')
         form = self.form(r)

http://git-wip-us.apache.org/repos/asf/allura/blob/61b27bd7/Allura/allura/tests/test_delete_projects.py
----------------------------------------------------------------------
diff --git a/Allura/allura/tests/test_delete_projects.py b/Allura/allura/tests/test_delete_projects.py
index 466fe80..f8cc62e 100644
--- a/Allura/allura/tests/test_delete_projects.py
+++ b/Allura/allura/tests/test_delete_projects.py
@@ -78,4 +78,17 @@ class TestDeleteProjects(TestController):
     def test_event_is_fired(self, post_event):
         pid = M.Project.query.get(shortname=self.p_shortname)._id
         self.run_script(['p/{}'.format(self.p_shortname)])
-        post_event.assert_called_once_with('project_deleted', project_id=pid)
+        post_event.assert_called_once_with('project_deleted', project_id=pid, reason=None)
+
+    @patch.object(delete_projects.g, 'post_event', autospec=True)
+    @patch('allura.scripts.delete_projects.log', autospec=True)
+    def test_delete_with_reason(self, log, post_event):
+        p = M.Project.query.get(shortname=self.p_shortname)
+        pid = p._id
+        assert p is not None, 'Can not find project to delete'
+        self.run_script(['-r', 'The Reason', 'p/{}'.format(p.shortname)])
+        session(p).expunge(p)
+        p = M.Project.query.get(shortname=p.shortname)
+        assert p is None, 'Project is not deleted'
+        log.info.assert_called_once_with('Purging %s%s. Reason: %s', '/p/', 'test-delete', 'The Reason')
+        post_event.assert_called_once_with('project_deleted', project_id=pid, reason='The Reason')