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:05 UTC
[11/17] allura git commit: [#7999] ticket:861 Add confirm step UI
skeleton and tests changes
[#7999] ticket:861 Add confirm step UI skeleton and tests changes
Project: http://git-wip-us.apache.org/repos/asf/allura/repo
Commit: http://git-wip-us.apache.org/repos/asf/allura/commit/f1d134f0
Tree: http://git-wip-us.apache.org/repos/asf/allura/tree/f1d134f0
Diff: http://git-wip-us.apache.org/repos/asf/allura/diff/f1d134f0
Branch: refs/heads/master
Commit: f1d134f03b4346d86972d7eea7ff48b4098d7165
Parents: d360404
Author: Igor Bondarenko <je...@gmail.com>
Authored: Mon Nov 16 16:21:45 2015 +0200
Committer: Dave Brondsema <da...@brondsema.net>
Committed: Wed Nov 25 14:37:42 2015 -0500
----------------------------------------------------------------------
Allura/allura/controllers/site_admin.py | 86 ++++++++++++++------
.../templates/site_admin_delete_projects.html | 23 +-----
.../site_admin_delete_projects_confirm.html | 30 +++++++
.../site_admin_delete_projects_form.html | 51 ++++++++++++
.../allura/tests/functional/test_site_admin.py | 54 ++++++++----
5 files changed, 183 insertions(+), 61 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/allura/blob/f1d134f0/Allura/allura/controllers/site_admin.py
----------------------------------------------------------------------
diff --git a/Allura/allura/controllers/site_admin.py b/Allura/allura/controllers/site_admin.py
index c74203a..52b3405 100644
--- a/Allura/allura/controllers/site_admin.py
+++ b/Allura/allura/controllers/site_admin.py
@@ -65,6 +65,7 @@ class SiteAdminController(object):
self.task_manager = TaskManagerController()
c.site_admin_sidebar_menu = self.sidebar_menu()
self.user = AdminUserDetailsController()
+ self.delete_projects = DeleteProjectsController()
def _check_security(self):
with h.push_context(config.get('site_admin_project', 'allura'),
@@ -320,33 +321,6 @@ class SiteAdminController(object):
return r
@without_trailing_slash
- @expose('jinja:allura:templates/site_admin_delete_projects.html')
- @validate(validators=dict(projects=validators.UnicodeString(if_empty=None),
- reason=validators.UnicodeString(if_empty=None),
- disable_users=validators.StringBool(if_empty=False)))
- def delete_projects(self, projects=None, reason=None, disable_users=False, **kw):
- if request.method == "POST":
- if not projects:
- flash(u'No projects specified', 'warning')
- redirect('delete_projects')
- provider = ProjectRegistrationProvider.get()
- projects = projects.split()
- log.info('Got projects for delete: %s', projects)
- projects = [provider.project_from_url(p.strip()) for p in projects]
- projects = [p for p in projects if p]
- 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)
- if disable_users:
- task_params = u'--disable-users {}'.format(task_params)
- DeleteProjects.post(task_params)
- flash(u'Delete scheduled for %s' % projects, 'ok')
- redirect('delete_projects')
- return {'projects': u'\n'.join(projects.split()) if projects else u''}
-
- @without_trailing_slash
@expose('jinja:allura:templates/site_admin_search.html')
@validate(validators=dict(q=validators.UnicodeString(if_empty=None),
limit=validators.Int(if_invalid=None),
@@ -363,6 +337,64 @@ class SiteAdminController(object):
return r
+class DeleteProjectsController(object):
+ delete_form_validators = dict(
+ projects=validators.UnicodeString(if_empty=None),
+ reason=validators.UnicodeString(if_empty=None),
+ disable_users=validators.StringBool(if_empty=False))
+
+ def remove_comments(self, lines):
+ return [l.split('#', 1)[0] for l in lines]
+
+ def parse_projects(self, projects):
+ provider = ProjectRegistrationProvider.get()
+ projects = projects.splitlines()
+ projects = self.remove_comments(projects)
+ projects = [provider.project_from_url(p.strip()) for p in projects]
+ projects = [p for p in projects if p]
+ return projects
+
+ def format_projects(self, projects):
+ return u'\n'.join(projects.split()) if projects else u''
+
+ @with_trailing_slash
+ @expose('jinja:allura:templates/site_admin_delete_projects.html')
+ @validate(validators=delete_form_validators)
+ def index(self, projects=None, reason=None, disable_users=False, **kw):
+ return {'projects': self.format_projects(projects)}
+
+ @expose('jinja:allura:templates/site_admin_delete_projects_confirm.html')
+ @require_post()
+ @without_trailing_slash
+ @validate(validators=delete_form_validators)
+ def confirm(self, projects=None, reason=None, disable_users=False, **kw):
+ if not projects:
+ flash(u'No projects specified', 'warning')
+ redirect('.')
+ return {'projects': self.format_projects(projects),
+ 'reason': reason,
+ 'disable_users': disable_users}
+
+ @expose()
+ @require_post()
+ @without_trailing_slash
+ @validate(validators=delete_form_validators)
+ def really_delete(self, projects=None, reason=None, disable_users=False, **kw):
+ if not projects:
+ flash(u'No projects specified', 'warning')
+ redirect('.')
+ projects = self.parse_projects(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)
+ if disable_users:
+ task_params = u'--disable-users {}'.format(task_params)
+ DeleteProjects.post(task_params)
+ flash(u'Delete scheduled for %s' % projects, 'ok')
+ redirect('.')
+
+
class TaskManagerController(object):
def _check_security(self):
http://git-wip-us.apache.org/repos/asf/allura/blob/f1d134f0/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 3f15ec1..428ea6e 100644
--- a/Allura/allura/templates/site_admin_delete_projects.html
+++ b/Allura/allura/templates/site_admin_delete_projects.html
@@ -26,26 +26,9 @@
{% block content %}
<div class="grid-19">
- <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" id="delete_projects">
- <div class="grid-18">
- <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 id="disable_users" name="disable_users" type="checkbox">
- <label for="disable_users">Disable all project members</label>
- </div>
- <div class="grid-18">
- <input type="submit" value="Delete">
- </div>
- {{lib.csrf_token()}}
- </form>
+ <p>Put project URLs separated by newline (anything after "#" is considered comment and ignored)</p>
+ {% set form_step = 'delete' %}
+ {% include 'allura:templates/site_admin_delete_projects_form.html' %}
</div>
{% endblock %}
http://git-wip-us.apache.org/repos/asf/allura/blob/f1d134f0/Allura/allura/templates/site_admin_delete_projects_confirm.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_delete_projects_confirm.html b/Allura/allura/templates/site_admin_delete_projects_confirm.html
new file mode 100644
index 0000000..97360f0
--- /dev/null
+++ b/Allura/allura/templates/site_admin_delete_projects_confirm.html
@@ -0,0 +1,30 @@
+{#-
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-#}
+
+{% extends 'allura:templates/site_admin_delete_projects.html' %}
+
+{% block content %}
+ <div class="grid-19">
+ <p class="warning">Be carefull. This will delete all projects data!</p>
+ TODO: Add table with parsed projects and edit button
+ {% set form_step = 'confirm' %}
+ {% include 'allura:templates/site_admin_delete_projects_form.html' %}
+ </div>
+{% endblock %}
+
http://git-wip-us.apache.org/repos/asf/allura/blob/f1d134f0/Allura/allura/templates/site_admin_delete_projects_form.html
----------------------------------------------------------------------
diff --git a/Allura/allura/templates/site_admin_delete_projects_form.html b/Allura/allura/templates/site_admin_delete_projects_form.html
new file mode 100644
index 0000000..40dbd92
--- /dev/null
+++ b/Allura/allura/templates/site_admin_delete_projects_form.html
@@ -0,0 +1,51 @@
+{#-
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+-#}
+
+{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
+
+{% set action = 'confirm' %}
+{% set submit_text = 'Delete' %}
+{% set fields_visible = True %}
+
+{% if form_step == 'confirm' %}
+ {% set action = 'really_delete' %}
+ {% set submit_text = 'Confirm deletion' %}
+ {% set fields_visible = False %}
+{% endif %}
+
+<form action="{{ action }}" method="POST" id="delete_projects">
+ <div class="{{ '' if fields_visible else 'hidden' }}">
+ <div class="grid-18">
+ <label for="projects">Projects:</label><br>
+ <textarea name="projects">{{ projects or '' }}</textarea>
+ </div>
+ <div class="grid-18">
+ <label for="reason">Reason:</label><br>
+ <textarea name="reason">{{ reason or '' }}</textarea>
+ </div>
+ <div class="grid-18">
+ <input id="disable_users" name="disable_users" type="checkbox" {% if disable_users %}checked{% endif %}>
+ <label for="disable_users">Disable all project members</label>
+ </div>
+ </div>
+ <div class="grid-18">
+ <input type="submit" value="{{ submit_text }}">
+ </div>
+ {{lib.csrf_token()}}
+</form>
http://git-wip-us.apache.org/repos/asf/allura/blob/f1d134f0/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 fed8fa4..fa9de1f 100644
--- a/Allura/allura/tests/functional/test_site_admin.py
+++ b/Allura/allura/tests/functional/test_site_admin.py
@@ -567,19 +567,36 @@ To reset your password on %s, please visit the following URL:
class TestDeleteProjects(TestController):
- def form(self, r):
- return self.find_form(r, lambda f: f.action == 'delete_projects')
+ def confirm_form(self, r):
+ return self.find_form(r, lambda f: f.action == 'really_delete')
+
+ def delete_form(self, r):
+ return self.find_form(r, lambda f: f.action == 'confirm')
def test_projects_populated_from_get_params(self):
- r = self.app.get('/nf/admin/delete_projects')
- assert_equal(self.form(r)['projects'].value, u'')
- r = self.app.get('/nf/admin/delete_projects?projects=/p/test/+/adobe/adobe-1/%20/p/test2/')
- assert_equal(self.form(r)['projects'].value, u'/p/test/\n/adobe/adobe-1/\n/p/test2/')
+ r = self.app.get('/nf/admin/delete_projects/')
+ assert_equal(self.delete_form(r)['projects'].value, u'')
+ r = self.app.get('/nf/admin/delete_projects/?projects=/p/test/+/adobe/adobe-1/%20/p/test2/')
+ assert_equal(self.delete_form(r)['projects'].value, u'/p/test/\n/adobe/adobe-1/\n/p/test2/')
+
+ def test_confirm_step_values(self):
+ r = self.app.get('/nf/admin/delete_projects/')
+ form = self.delete_form(r)
+ form['projects'] = 'p/test\ndne/dne'
+ form['reason'] = 'The Reason'
+ form['disable_users'] = True
+ r = form.submit()
+ confirm_form = self.confirm_form(r)
+ for f in ['projects', 'reason', 'disable_users']:
+ assert_equal(confirm_form[f].value, form[f].value)
+
+ def test_confirm(self):
+ assert False
@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)
+ r = self.app.get('/nf/admin/confirm/')
+ form = self.confirm_form(r)
form['projects'] = 'p/test2'
form['reason'] = 'Because "I can and want"'
form.submit()
@@ -587,8 +604,8 @@ class TestDeleteProjects(TestController):
@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)
+ r = self.app.get('/nf/admin/confirm/')
+ form = self.confirm_form(r)
form['projects'] = 'p/test2'
form['reason'] = 'Because\nI want'
form.submit()
@@ -596,16 +613,25 @@ class TestDeleteProjects(TestController):
@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)
+ r = self.app.get('/nf/admin/confirm/')
+ form = self.confirm_form(r)
form['projects'] = '/p/test http://localhost:8080/adobe/adobe-1 p/test2'
form.submit()
dp.post.assert_called_once_with('p/test adobe/adobe-1 p/test2')
@patch('allura.controllers.site_admin.DeleteProjects', autospec=True)
+ def test_comments_are_ignored(self, dp):
+ r = self.app.get('/nf/admin/confirm/')
+ form = self.confirm_form(r)
+ form['projects'] = '''/p/test # comment
+ /p/test2 # comment 2'''
+ form.submit()
+ dp.post.assert_called_once_with('p/test p/test2')
+
+ @patch('allura.controllers.site_admin.DeleteProjects', autospec=True)
def test_admins_and_devs_are_disabled(self, dp):
- r = self.app.get('/nf/admin/delete_projects')
- form = self.form(r)
+ r = self.app.get('/nf/admin/confirm/')
+ form = self.confirm_form(r)
form['projects'] = 'p/test p/test2'
form['disable_users'] = True
form.submit()