From fdf482d14b7d8f564abb336aa46006ddc3feb3d0 Mon Sep 17 00:00:00 2001 From: Alvin Chow Date: Sun, 27 Sep 2015 16:14:34 -0700 Subject: [PATCH 1/3] Fix bug with rename feature to also delete old page --- realms/static/js/editor.js | 8 ++++++-- realms/templates/wiki/edit.html | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/realms/static/js/editor.js b/realms/static/js/editor.js index fc39062..08d7e6b 100644 --- a/realms/static/js/editor.js +++ b/realms/static/js/editor.js @@ -73,7 +73,11 @@ var aced = new Aced({ content: content }; - var path = Config['RELATIVE_PATH'] + '/' + data['name']; + // If renaming an existing page, use the old page name for the URL to PUT to + var subPath = (PAGE_NAME) ? PAGE_NAME : data['name'] + var path = Config['RELATIVE_PATH'] + '/' + subPath; + var newPath = Config['RELATIVE_PATH'] + '/' + data['name']; + var type = (Commit.info['sha']) ? "PUT" : "POST"; $.ajax({ @@ -87,7 +91,7 @@ var aced = new Aced({ $page_name.addClass('parsley-error'); bootbox.alert("

" + res['message'] + "

"); } else { - location.href = path; + location.href = newPath; } }); } diff --git a/realms/templates/wiki/edit.html b/realms/templates/wiki/edit.html index 3812f39..71c7dd1 100644 --- a/realms/templates/wiki/edit.html +++ b/realms/templates/wiki/edit.html @@ -3,6 +3,8 @@ @@ -169,4 +171,4 @@ -{% endblock %} \ No newline at end of file +{% endblock %} From 4ef08cc98884aa05529bf8a69b68cf88c0d3d57a Mon Sep 17 00:00:00 2001 From: Alvin Chow Date: Sun, 27 Sep 2015 17:14:19 -0700 Subject: [PATCH 2/3] Add delete wiki page feature, delete wiki page after rename --- realms/modules/search/hooks.py | 9 ++++++--- realms/modules/search/models.py | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/realms/modules/search/hooks.py b/realms/modules/search/hooks.py index 503beb0..b31acf2 100644 --- a/realms/modules/search/hooks.py +++ b/realms/modules/search/hooks.py @@ -2,7 +2,6 @@ from realms.modules.wiki.models import Wiki from realms import search - @Wiki.after('write_page') def wiki_write_page(name, content, message=None, username=None, email=None, **kwargs): @@ -19,5 +18,9 @@ def wiki_write_page(name, content, message=None, username=None, email=None, **kw @Wiki.after('rename_page') -def wiki_rename_page(*args, **kwargs): - pass +def wiki_rename_page(old_name, *args, **kwargs): + + if not hasattr(search, 'index_wiki'): + return + + return search.delete_wiki(old_name) diff --git a/realms/modules/search/models.py b/realms/modules/search/models.py index 267c5c5..26bdc71 100644 --- a/realms/modules/search/models.py +++ b/realms/modules/search/models.py @@ -92,9 +92,19 @@ class WhooshSearch(BaseSearch): writer.update_document(path=id_.decode("utf-8"), body=body["content"].decode("utf-8")) writer.commit() + def delete(self, id_): + with self.search_index.searcher() as s: + doc_num = s.document_number(path=id_.decode("utf-8")) + writer = self.search_index.writer() + writer.delete_document(doc_num) + writer.commit() + def index_wiki(self, name, body): self.index('wiki', 'page', id_=name, body=body) + def delete_wiki(self, name): + self.delete(id_=name) + def delete_index(self, index): from whoosh import index as whoosh_index self.search_index.close() @@ -133,9 +143,15 @@ class ElasticSearch(BaseSearch): def index(self, index, doc_type, id_=None, body=None): return self.elastic.index(index=index, doc_type=doc_type, id=id_, body=body) + def delete(self, index, doc_type, id_): + return self.elastic.delete(index=index, doc_type=doc_type, id=id_) + def index_wiki(self, name, body): self.index('wiki', 'page', id_=name, body=body) + def delete_wiki(self, name): + self.delete('wiki', 'page', id_=name) + def delete_index(self, index): return self.elastic.indices.delete(index=index, ignore=[400, 404]) From 4e4cdf6348749e14983834e966cc76c5050cf3e0 Mon Sep 17 00:00:00 2001 From: Alvin Chow Date: Sun, 27 Sep 2015 21:57:56 -0700 Subject: [PATCH 3/3] Get delete page feature working --- realms/modules/search/hooks.py | 9 +++++++++ realms/modules/wiki/models.py | 5 ++++- realms/modules/wiki/tests.py | 5 +++++ realms/modules/wiki/views.py | 4 ++-- realms/static/js/editor.js | 23 ++++++++++++++++++++++- setup.py | 2 +- 6 files changed, 43 insertions(+), 5 deletions(-) diff --git a/realms/modules/search/hooks.py b/realms/modules/search/hooks.py index b31acf2..25a7d12 100644 --- a/realms/modules/search/hooks.py +++ b/realms/modules/search/hooks.py @@ -24,3 +24,12 @@ def wiki_rename_page(old_name, *args, **kwargs): return return search.delete_wiki(old_name) + + +@Wiki.after('delete_page') +def wiki_delete_page(name, *args, **kwargs): + + if not hasattr(search, 'index_wiki'): + return + + return search.delete_wiki(name) diff --git a/realms/modules/wiki/models.py b/realms/modules/wiki/models.py index 8d7a310..e5abff7 100644 --- a/realms/modules/wiki/models.py +++ b/realms/modules/wiki/models.py @@ -156,11 +156,14 @@ class Wiki(HookMixin): message = "Deleted %s" % name filename = cname_to_filename(name) + + # gittle.rm won't actually remove the file, have to do it ourselves + os.remove(os.path.join(self.path, filename)) self.gittle.rm(filename) commit = self.gittle.commit(name=username, email=email, message=message, - files=[str(filename)]) + files=[filename]) cache.delete_many(name) return commit diff --git a/realms/modules/wiki/tests.py b/realms/modules/wiki/tests.py index b405103..83db594 100644 --- a/realms/modules/wiki/tests.py +++ b/realms/modules/wiki/tests.py @@ -52,6 +52,11 @@ class WikiTest(WikiBaseTest): self.assert_403(self.client.delete(url_for('wiki.page_write', name='test'))) self.app.config['WIKI_LOCKED_PAGES'] = [] + # Create page, check it exists + self.create_page('test', message='test message', content='testing') + self.assert_200(self.client.get(url_for('wiki.page', name='test'))) + + # Delete page self.assert_200(self.client.delete(url_for('wiki.page_write', name='test'))) rv = self.client.get(url_for('wiki.page', name='test')) diff --git a/realms/modules/wiki/views.py b/realms/modules/wiki/views.py index 3fda3cb..b65aef7 100644 --- a/realms/modules/wiki/views.py +++ b/realms/modules/wiki/views.py @@ -151,12 +151,12 @@ def page_write(name): return dict(sha=sha) - else: + elif request.method == 'DELETE': # DELETE if cname in current_app.config.get('WIKI_LOCKED_PAGES'): return dict(error=True, message="Page is locked"), 403 - sha = g.current_wiki.delete_page(name, + sha = g.current_wiki.delete_page(cname, username=current_user.username, email=current_user.email) diff --git a/realms/static/js/editor.js b/realms/static/js/editor.js index 08d7e6b..8097d17 100644 --- a/realms/static/js/editor.js +++ b/realms/static/js/editor.js @@ -58,10 +58,31 @@ $(function(){ }); $("#delete-page-btn").click(function() { - bootbox.alert("Not Done Yet! Sorry"); + bootbox.confirm('Are you sure you want to delete this page?', function(result) { + if (result) { + deletePage(); + } + }); }); }); +var deletePage = function() { + var pageName = $page_name.val(); + var path = Config['RELATIVE_PATH'] + '/' + pageName; + + $.ajax({ + type: 'DELETE', + url: path, + }).done(function(data) { + var msg = 'Deleted page: ' + pageName; + bootbox.alert(msg, function() { + location.href = '/'; + }); + }).fail(function(data, status, error) { + bootbox.alert('Error deleting page!'); + }); +}; + var aced = new Aced({ editor: $('#entry-markdown-content').find('.editor').attr('id'), renderer: function(md) { return MDR.convert(md) }, diff --git a/setup.py b/setup.py index 1812098..53aea35 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,7 @@ setup(name='realms-wiki', 'click==3.3', 'gevent==1.0.2', 'ghdiff==0.4', - 'gittle==0.4.0', + 'gittle==0.5.0', 'gunicorn==19.3', 'itsdangerous==0.24', 'markdown2==2.3.0',