diff --git a/realms/modules/search/hooks.py b/realms/modules/search/hooks.py index 503beb0..25a7d12 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,18 @@ 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) + + +@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/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]) 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 fc39062..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) }, @@ -73,7 +94,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 +112,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 %} 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',