1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-01 23:38:37 +00:00

delete personal wiki (#4239)

This commit is contained in:
Leo 2019-11-07 19:39:05 +08:00 committed by Daniel Pan
parent 941a570c81
commit 3b74bec1ec
11 changed files with 2 additions and 694 deletions

View File

@ -4,7 +4,6 @@ from seaserv import seafile_api
from seahub.tags.models import FileUUIDMap
from seahub.base.models import UserStarredFiles
from seahub.revision_tag.models import RevisionTags
from seahub.wiki.models import PersonalWiki
from seahub.share.models import ExtraGroupsSharePermission, \
ExtraSharePermission, UploadLinkShare
@ -21,7 +20,6 @@ class Command(BaseCommand):
#on_delete is CASCADE, so FileTag/FileComment will be deleted
self.tables = {'FileUUIDMap': FileUUIDMap, 'RevisionTags': RevisionTags,
'PersonalWiki': PersonalWiki,
'UserStarredFiles': UserStarredFiles,
'ExtraGroupsSharePermission': ExtraGroupsSharePermission,
'ExtraSharePermission': ExtraSharePermission,

View File

@ -749,7 +749,7 @@ OTP_LOGIN_URL = '/profile/two_factor_authentication/setup/'
TWO_FACTOR_DEVICE_REMEMBER_DAYS = 90
ENABLE_FORCE_2FA_TO_ALL_USERS = False
# Enable personal wiki, group wiki
# Enable wiki
ENABLE_WIKI = True
# Enable 'repo snapshot label' feature

View File

@ -1,239 +0,0 @@
{% extends "home_base.html" %}
{% load seahub_tags avatar_tags i18n %}
{% block sub_title %}{% trans "Personal Wiki" %} - {% endblock %}
{% block cur_personal_wiki %}tab-cur{% endblock %}
{% comment %}
{% block left_panel %}
{{ block.super }}
{% if wiki_exists %}
<div class="wiki-index">
{% if not wiki_index_exists %}
<h3 class="hd">{% trans "Wiki Index" %}</h3>
<p>{% trans "No index now." %}</p>
<button id="create-index">{% trans "Create" %}</button>
{% else %}
<div class="hd ovhd">
<h3 class="fleft">{% trans "Wiki Index" %}</h3>
<a id="edit-index" class="wiki-index-edit-icon op-icon icon-pencil fright" title="{% trans "Edit" %}" aria-label="{% trans "Edit" %}" href="#"></a>
</div>
<div id="wiki-index-con"></div>
{% endif %}
</div>
{% endif %}
{% endblock %}
{% endcomment %}
{% block right_panel %}
{% if not wiki_exists %}
<div class="empty-tips">
<h2 class="alc">{% trans "You do not have personal wiki" %}</h2>
<p>{% trans "Seafile Wiki enables you to organize your knowledge in a simple way. The contents of wiki is stored in a normal library with pre-defined file/folder structure. This enables you to edit your wiki in your desktop and then sync back to the server." %}</p>
<a id="wiki-create" href="#">{% trans "Create Wiki Now" %}</a>
{% if owned_repos %}
<br /><a id="wiki-use-lib" href="#">{% trans "Choose a library as wiki" %}</a>
{% endif %}
</div>
<form id="wiki-create-form" action="" method="post" class="hide">{% csrf_token %}
<h3 id="dialogTitle">{% trans "Create Wiki" %}</h3>
<label for="wiki-name">{% trans "Name" %}</label><br/>
<input type="text" name="repo_name" value="{% trans "personal-wiki" %}" maxlength="{{max_file_name}}" class="input" id="wiki-name" /><br />
<label for="wiki-desc">{% trans "Description" %}</label><br/>
<textarea name="repo_desc" class="textarea" id="wiki-desc">{% trans "Personal Wiki Pages" %}</textarea><br/>
<p class="error hide"></p>
<input type="submit" value="{% trans "Submit"%}" class="submit" />
</form>
<form id="wiki-use-lib-form" action="{% url 'personal_wiki_use_lib' %}" method="post" class="file-choose-form hide">{% csrf_token %}
<h3 id="dialogTitle">{% trans "Choose a library as wiki:" %}</h3>
<div class="dir-tree-cont">
<div id="repos-dirs"></div>
</div>
<input type="hidden" name="dst_repo" value="" />
<p class="error hide">{% trans "Please click and choose a library."%}</p>
<input type="submit" value="{% trans "Submit"%}" class="submit" />
<button class="simplemodal-close">{% trans "Cancel"%}</button>
</form>
{% else %}
<div class="wiki-top ovhd">
<ul class="wiki-nav fleft">
<li class="item{% if page == 'home' %} cur-item{% endif %}"><a href="{% url 'personal_wiki' %}" class="link">{% trans "Home" %}</a></li>
<li class="item"><a href="{% url 'personal_wiki_pages' %}" class="link">{% trans "Pages" %}</a></li>
<li class="item"><a href="{% url 'repo_history' repo_id %}" class="link" id="wiki-history">{% trans "Wiki History" %}</a></li>
</ul>
<button id="page-create" class="btn-white">{% trans "New Page" %}</button>
<button id="page-delete" class="btn-white" data-url="{% url 'personal_wiki_page_delete' page %}">{% trans "Delete Page" %}</button>
<a class="sf-btn-link btn-white" href="{% url 'personal_wiki_page_edit' page %}">{% trans "Edit Page" %}</a>
<a class="sf-btn-link btn-white" href="{% url 'file_revisions' repo_id %}?p={{path|urlencode}}" id="page-history">{% trans "Page History" %}</a>
</div>
<div id="wiki-area" class="article">
<h1 class="bold">{{ page|capfirst }}</h1>
<div id="wiki-content"></div><!--content will be offered by js-->
<p id="wiki-last-modified">{% blocktrans with modifier=latest_contributor|email2nickname modify_time=last_modified|translate_seahub_time %}Last modified by {{modifier}}, {{modify_time}}{% endblocktrans %}
</p>
</div>
<form id="page-create-form" action="{% url 'personal_wiki_page_new' %}" method="post" class="hide">{% csrf_token %}
<h3 id="dialogTitle">{% trans "New Page"%}</h3>
<label for="page-name">{% trans "Name"%}</label><br/>
<input id="page-name" type="text" name="page_name" value="" maxlength="{{max_file_name}}" class="input" /><br />
<p class="error hide"></p>
<input type="submit" value="{% trans "Submit"%}" class="submit" />
</form>
{% endif %}
{% endblock %}
{% block extra_script %}{{block.super}}
<script type="text/javascript" src="{{MEDIA_URL}}js/editormd/lib/marked.min.js"></script>
<script type="text/javascript">
{% if wiki_exists %}
var renderer = new marked.Renderer();
// remove 'id' attribute for headings
renderer.heading = function (text, level) {
return '<h' + level + '>' + text + '</h' + level + '>';
};
marked.setOptions({
renderer: renderer,
breaks: true, // keep linebreak
smartLists: true,
sanitize: true // Ignore any HTML that has been input
});
$('#wiki-content')
.html(addAnchorsToHeaders(marked('{{ content|escapejs }}')))
.find('h1, h2')
.on('mouseenter', function() {
$('.anchor', $(this)).removeClass('vh');
})
.on('mouseleave', function() {
$('.anchor', $(this)).addClass('vh');
});
$('#page-create').on('click', function() {
$('#page-create-form').modal({appendTo: '#main'});
$('#simplemodal-container').css({'height':'auto'});
});
$('#page-create-form').on('submit', function() {
var page_name = $.trim($('[name="page_name"]', $(this)).val());
if (!page_name) {
return false;
}
});
addConfirmTo($('#page-delete'), {
'title': "{% trans "Delete Page" %}",
'con': "{% trans "Are you sure you want to delete this page?" %}"
});
$('a.wiki-page-missing').on('click', function() {
$('#page-create-form').modal({appendTo: '#main'});
$('#simplemodal-container').css({'height':'auto'});
$('#page-name').val($(this).text());
return false;
});
{% else %}
$('#wiki-create').on('click', function() {
$('#wiki-create-form').modal({appendTo: '#main'});
$('#simplemodal-container').css({'height':'auto'});
return false;
});
$('#wiki-create-form').on('submit', function () {
var form = $(this),
form_id = form.attr('id'),
repo_name = $('[name="repo_name"]', form).val(),
repo_desc = $('[name="repo_desc"]', form).val();
if (!$.trim(repo_name)) {
apply_form_error(form_id, "{% trans "Name is required." %}");
return false;
}
if (!$.trim(repo_desc)) {
apply_form_error(form_id, "{% trans "Description is required." %}");
return false;
}
var submit_btn = $('[type="submit"]', form);
disable(submit_btn);
$.ajax({
url: '{% url 'personal_wiki_create' %}',
type: 'POST',
dataType: 'json',
cache: false,
beforeSend: prepareCSRFToken,
data: {
'repo_name': repo_name,
'repo_desc': repo_desc
},
success: function(data) {
location.href = data['href'];
},
error: function(xhr, textStatus, jqXHR) {
var error_msg = prepareAjaxErrorMsg(xhr);
apply_form_error(form_id, error_msg);
enable(submit_btn);
}
});
return false;
});
{% if owned_repos %}
var all_repos = [];
{% for a_repo in owned_repos %}
all_repos.push({
'text': HTMLescape('{{ a_repo.props.name|escapejs }}'),
'data': {
'repo_id': '{{ a_repo.props.id }}',
'path': '/'
}
});
{% endfor %}
$('#wiki-use-lib').on('click', function() {
var $form = $('#wiki-use-lib-form');
$form.modal({appendTo:'#main', autoResize:true, focus:false});
$('#simplemodal-container').css({'width':'auto', 'height':'auto'});
FileTree.renderDirTree($('#repos-dirs').data('site_root', '{{SITE_ROOT}}'), $form, all_repos);
return false;
});
$('#wiki-use-lib-form').on('submit', function() {
var dst_repo = $('[name="dst_repo"]', $(this)).val();
if (!$.trim(dst_repo)) {
$('.error', $(this)).removeClass('hide');
return false;
}
});
{% endif %}
{% endif %} // END wiki_exists
{% comment %}
{% if wiki_exists %}
{% if wiki_index_exists %}
$('#wiki-index-con').html(marked('{{ index_content|escapejs }}'));
{% with page_name='index' %}
$('#edit-index').attr('href', "{% url 'personal_wiki_page_edit' page_name %}");
{% endwith %}
{% else %}
$('#create-index').on('click', function() {
var $form = $('#page-create-form');
$('[name="page_name"]', $form).val('index');
$form.trigger('submit');
});
{% endif %}
{% endif %}
{% endcomment %}
// for 'go back'
var $pageHistory = $('#page-history');
$pageHistory.attr('href', $pageHistory.attr('href') + '&referer=' + encodeURIComponent(location.href));
var $wikiHistory = $('#wiki-history');
$wikiHistory.attr('href', $wikiHistory.attr('href') + '?referer=' + encodeURIComponent(location.href));
</script>
{% endblock %}

View File

@ -1,50 +0,0 @@
{% extends "home_base.html" %}
{% load seahub_tags i18n %}
{% block sub_title %}{% trans "Personal Wiki" %} - {% endblock %}
{% block cur_personal_wiki %}tab-cur{% endblock %}
{% block right_panel %}
<div class="wiki-top ovhd">
<ul class="wiki-nav fleft">
<li class="item"><a href="{% url 'personal_wiki' %}" class="link">{% trans "Home" %}</a></li>
<li class="item cur-item"><a href="{% url 'personal_wiki_pages' %}" class="link">{% trans "Pages" %}</a></li>
<li class="item"><a href="{% url 'repo_history' repo_id %}" class="link" id="wiki-history">{% trans "Wiki History" %}</a></li>
</ul>
<button id="page-create" class="btn-white">{% trans "New Page" %}</button>
</div>
<ul id="wiki-pages">
{% for page_slug, page in pages.items %}
<li><a href="{% url 'personal_wiki' page_slug %}">{{ page }}</a></li>
{% endfor %}
</ul>
<form id="page-create-form" action="{% url 'personal_wiki_page_new' %}" method="post" class="hide">{% csrf_token %}
<h3 id="dialogTitle">{% trans "New Page"%}</h3>
<label for="page-name">{% trans "Name"%}</label><br/>
<input id="page-name" type="text" name="page_name" value="" maxlength="{{max_file_name}}" class="input" /><br />
<p class="error hide"></p>
<input type="submit" value="{% trans "Submit" %}" class="submit" />
</form>
{% endblock %}
{% block extra_script %}{{block.super}}
<script type="text/javascript">
$('#page-create').on('click', function() {
$('#page-create-form').modal({appendTo: '#main'});
$('#simplemodal-container').css({'height':'auto'});
})
$('#page-create-form').on('submit', function() {
var page_name = $.trim($('[name="page_name"]', $(this)).val());
if (!page_name) {
return false;
}
});
var $wikiHistory = $('#wiki-history');
$wikiHistory.attr('href', $wikiHistory.attr('href') + '?referer=' + encodeURIComponent(location.href));
</script>
{% endblock %}

View File

@ -17,9 +17,6 @@ from seahub.views.file import view_history_file, view_trash_file,\
from seahub.views.repo import repo_history_view, repo_snapshot, view_shared_dir, \
view_shared_upload_link, view_lib_as_wiki
from .notifications.views import notification_list
from seahub.views.wiki import personal_wiki, personal_wiki_pages, \
personal_wiki_create, personal_wiki_page_new, personal_wiki_page_edit, \
personal_wiki_page_delete, personal_wiki_use_lib
from seahub.api2.endpoints.smart_link import SmartLink, SmartLinkToken
from seahub.api2.endpoints.groups import Groups, Group
from seahub.api2.endpoints.all_groups import AllGroups
@ -173,14 +170,6 @@ urlpatterns = [
url(r'^$', libraries, name='libraries'),
#url(r'^home/$', direct_to_template, { 'template': 'home.html' } ),
url(r'^robots\.txt$', TemplateView.as_view(template_name='robots.txt', content_type='text/plain')),
url(r'^home/wiki/$', personal_wiki, name='personal_wiki'),
url(r'^home/wiki/(?P<page_name>[^/]+)$', personal_wiki, name='personal_wiki'),
url(r'^home/wiki_pages/$', personal_wiki_pages, name='personal_wiki_pages'),
url(r'^home/wiki_create/$', personal_wiki_create, name='personal_wiki_create'),
url(r'^home/wiki_use_lib/$', personal_wiki_use_lib, name='personal_wiki_use_lib'),
url(r'^home/wiki_page_new/$', personal_wiki_page_new, name='personal_wiki_page_new'),
url(r'^home/wiki_page_edit/(?P<page_name>[^/]+)$', personal_wiki_page_edit, name='personal_wiki_page_edit'),
url(r'^home/wiki_page_delete/(?P<page_name>[^/]+)$', personal_wiki_page_delete, name='personal_wiki_page_delete'),
# revert repo
url(r'^repo/history/revert/(?P<repo_id>[-0-9a-f]{36})/$', repo_revert_history, name='repo_revert_history'),

View File

@ -1611,9 +1611,6 @@ def file_edit_submit(request, repo_id):
wiki_name = os.path.splitext(os.path.basename(path))[0]
next_page = reverse('group_wiki', args=[gid, wiki_name])
elif req_from == 'personal_wiki_page_edit' or req_from == 'personal_wiki_page_new':
wiki_name = os.path.splitext(os.path.basename(path))[0]
next_page = reverse('personal_wiki', args=[wiki_name])
elif req_from == 'wikis_wiki_page_edit' or req_from == 'wikis_wiki_page_new':
wiki_slug = request.GET.get('wiki_slug', '')
wiki_page_name = os.path.splitext(os.path.basename(path))[0]
@ -1700,8 +1697,6 @@ def file_edit(request, repo_id):
wiki_name = os.path.splitext(u_filename)[0]
if page_from == 'wiki_page_edit' or page_from == 'wiki_page_new':
cancel_url = reverse('group_wiki', args=[gid, wiki_name])
elif page_from == 'personal_wiki_page_edit' or page_from == 'personal_wiki_page_new':
cancel_url = reverse('personal_wiki', args=[wiki_name])
elif page_from == 'wikis_wiki_page_edit' or page_from == 'wikis_wiki_page_new':
wiki_page_name = wiki_name
cancel_url = reverse('wiki:slug', args=[wiki_slug, wiki_page_name])

View File

@ -12,8 +12,6 @@ from django.http import HttpRequest
from django.test import TestCase
from seahub.base.accounts import User
from seahub.wiki.models import PersonalWiki
from seahub.views.wiki import personal_wiki
def setup():
global repo_id, mock_content, mock_repo, mock_dirent, request
@ -36,50 +34,6 @@ def setup():
patch('seahub.views.wiki.render_to_response',
render_to_response_echo).start()
class PersonalWikiTest(TestCase):
@patch('seahub.views.wiki.seafile_api.get_owned_repo_list')
def test_wiki_does_not_exist(self, mock_get_owned_repo_list):
res = personal_wiki(request)
self.assertFalse(res.get('wiki_exists'))
self.assertEqual('wiki/personal_wiki.html', res.get('template_name'))
@patch('seahub.wiki.utils.seaserv.get_repo')
@patch('seahub.wiki.utils.seaserv.get_commits')
@patch('seahub.views.wiki.seaserv.post_empty_file')
def test_wiki_page_missing(self, mock_post_empty_file,
mock_get_commits, mock_get_repo):
"""
"""
# setup personal wiki
PersonalWiki.objects.create(username=request.user.username,
repo_id=repo_id)
mock_get_repo.return_value = mock_repo
mock_get_commits.return_value = [None]
mock_post_empty_file.return_value = True
res = personal_wiki(request)
self.assertEqual('/home/wiki/home/', res['Location'])
@patch('seahub.views.wiki.utils.get_personal_wiki_page')
@patch('seahub.base.models.FileContributors.objects.get_file_contributors')
def test_wiki_found(self, mock_get_file_contributors,
mock_get_personal_wiki_page):
mock_get_personal_wiki_page.return_value = (mock_content,
mock_repo,
mock_dirent)
mock_get_file_contributors.return_value = ([request.user.username],
None, None)
res = personal_wiki(request)
self.assertEqual('fake content', res.get('content'))
self.assertEqual('fake content', res.get('index_content'))
self.assertEqual('home', res.get('page'))
self.assertEqual('wiki/personal_wiki.html', res.get('template_name'))
########## Helpler functions and classes
def FakeRequestFactory(*args, **kwargs):
''' FakeRequestFactory, FakeMessages and FakeRequestContext are good for

View File

@ -1,269 +0,0 @@
# Copyright (c) 2012-2016 Seafile Ltd.
# -*- coding: utf-8 -*-
"""
File related views, including view_file, edit_file, view_history_file,
view_trash_file, view_snapshot_file
"""
import os
import hashlib
import logging
import json
import stat
import tempfile
import urllib.request, urllib.parse, urllib.error
import urllib.request, urllib.error, urllib.parse
import chardet
from django.core.urlresolvers import reverse
from django.contrib import messages
from django.http import HttpResponse, HttpResponseBadRequest, Http404, \
HttpResponseRedirect
from django.shortcuts import render, redirect
from django.template import Context, loader, RequestContext
from django.utils.http import urlquote
from django.utils.translation import ugettext as _
import seaserv
from seaserv import seafile_api
from pysearpc import SearpcError
from seahub.auth.decorators import login_required
from seahub.wiki.models import PersonalWiki, WikiDoesNotExist, WikiPageMissing
from seahub.wiki.utils import (get_personal_wiki_page,
get_personal_wiki_repo, get_wiki_pages,
clean_page_name, page_name_to_file_name)
from seahub.wiki.forms import WikiCreateForm, WikiNewPageForm
from seahub.utils import render_error
from seahub.views import check_folder_permission
# Get an instance of a logger
logger = logging.getLogger(__name__)
@login_required
def personal_wiki(request, page_name="home"):
username = request.user.username
if request.cloud_mode and request.user.org is not None:
org_id = request.user.org.org_id
joined_groups = seaserv.get_org_groups_by_user(org_id, username)
else:
joined_groups = seaserv.get_personal_groups_by_user(username)
if joined_groups:
joined_groups.sort(key=lambda x: x.group_name.lower())
wiki_exists = True
try:
content, repo, dirent = get_personal_wiki_page(username, page_name)
except WikiDoesNotExist:
wiki_exists = False
owned_repos = seafile_api.get_owned_repo_list(username)
owned_repos = [r for r in owned_repos if not r.encrypted]
return render(request, "wiki/personal_wiki.html", {
"wiki_exists": wiki_exists,
"owned_repos": owned_repos,
"grps": joined_groups,
})
except WikiPageMissing:
repo = get_personal_wiki_repo(username)
filename = page_name_to_file_name(clean_page_name(page_name))
if not seaserv.post_empty_file(repo.id, "/", filename, username):
return render_error(request, _("Failed to create wiki page. Please retry later."))
return HttpResponseRedirect(reverse('personal_wiki', args=[page_name]))
else:
# fetch file modified time and modifier
path = '/' + dirent.obj_name
try:
dirent = seafile_api.get_dirent_by_path(repo.id, path)
if dirent:
latest_contributor, last_modified = dirent.modifier, dirent.mtime
else:
latest_contributor, last_modified = None, 0
except SearpcError as e:
logger.error(e)
latest_contributor, last_modified = None, 0
wiki_index_exists = True
index_pagename = 'index'
index_content = None
try:
index_content, index_repo, index_dirent = get_personal_wiki_page(username, index_pagename)
except (WikiDoesNotExist, WikiPageMissing) as e:
wiki_index_exists = False
return render(request, "wiki/personal_wiki.html", {
"wiki_exists": wiki_exists,
"content": content,
"page": os.path.splitext(dirent.obj_name)[0],
"last_modified": last_modified,
"latest_contributor": latest_contributor or _("Unknown"),
"path": path,
"repo_id": repo.id,
"search_repo_id": repo.id,
"search_wiki": True,
"wiki_index_exists": wiki_index_exists,
"index_content": index_content,
"grps": joined_groups,
})
@login_required
def personal_wiki_pages(request):
"""
List personal wiki pages.
"""
username = request.user.username
if request.cloud_mode and request.user.org is not None:
org_id = request.user.org.org_id
joined_groups = seaserv.get_org_groups_by_user(org_id, username)
else:
joined_groups = seaserv.get_personal_groups_by_user(username)
if joined_groups:
joined_groups.sort(key=lambda x: x.group_name.lower())
try:
repo = get_personal_wiki_repo(username)
pages = get_wiki_pages(repo)
except SearpcError:
return render_error(request, _('Internal Server Error'))
except WikiDoesNotExist:
return render_error(request, _('Wiki does not exists.'))
return render(request, "wiki/personal_wiki_pages.html", {
"pages": pages,
"repo_id": repo.id,
"search_repo_id": repo.id,
"search_wiki": True,
"grps": joined_groups,
})
@login_required
def personal_wiki_create(request):
if request.method != 'POST':
raise Http404
content_type = 'application/json; charset=utf-8'
def json_error(err_msg, status=400):
result = {'error': err_msg}
return HttpResponse(json.dumps(result), status=status,
content_type=content_type)
if not request.user.permissions.can_add_repo():
return json_error(_('You do not have permission to create wiki'), 403)
form = WikiCreateForm(request.POST)
if not form.is_valid():
return json_error(str(list(form.errors.values())[0]))
# create group repo in user context
repo_name = form.cleaned_data['repo_name']
repo_desc = form.cleaned_data['repo_desc']
username = request.user.username
permission = "rw"
repo_id = seafile_api.create_repo(repo_name, repo_desc, username)
if not repo_id:
return json_error(_('Failed to create'), 500)
PersonalWiki.objects.save_personal_wiki(username=username, repo_id=repo_id)
# create home page
page_name = "home.md"
if not seaserv.post_empty_file(repo_id, "/", page_name, username):
return json_error(_('Failed to create home page. Please retry later'), 500)
next_page = reverse('personal_wiki', args=[])
return HttpResponse(json.dumps({'href': next_page}), content_type=content_type)
@login_required
def personal_wiki_use_lib(request):
if request.method != 'POST':
raise Http404
repo_id = request.POST.get('dst_repo', '')
username = request.user.username
next_page = reverse('personal_wiki', args=[])
repo = seafile_api.get_repo(repo_id)
if repo is None:
messages.error(request, _('Failed to set wiki library.'))
return HttpResponseRedirect(next_page)
if check_folder_permission(request, repo_id, '/') != 'rw':
messages.error(request, _('Permission denied.'))
return HttpResponseRedirect(next_page)
PersonalWiki.objects.save_personal_wiki(username=username, repo_id=repo_id)
# create home page if not exist
page_name = "home.md"
if not seaserv.get_file_id_by_path(repo_id, "/" + page_name):
if not seaserv.post_empty_file(repo_id, "/", page_name, username):
messages.error(request, _('Failed to create home page. Please retry later'))
return HttpResponseRedirect(next_page)
@login_required
def personal_wiki_page_new(request, page_name="home"):
if request.method == 'POST':
page_name = request.POST.get('page_name', '')
if not page_name:
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
page_name = clean_page_name(page_name)
try:
repo = get_personal_wiki_repo(request.user.username)
except WikiDoesNotExist:
return render_error(request, _('Wiki is not found.'))
filename = page_name + ".md"
filepath = "/" + page_name + ".md"
# check whether file exists
if seaserv.get_file_id_by_path(repo.id, filepath):
return render_error(request, _('Page "%s" already exists.') % filename)
if not seaserv.post_empty_file(repo.id, "/", filename, request.user.username):
return render_error(request, _('Failed to create wiki page. Please retry later.'))
url = "%s?p=%s&from=personal_wiki_page_new" % (
reverse('file_edit', args=[repo.id]),
urlquote(filepath.encode('utf-8')))
return HttpResponseRedirect(url)
@login_required
def personal_wiki_page_edit(request, page_name="home"):
try:
repo = get_personal_wiki_repo(request.user.username)
except WikiDoesNotExist:
return render_error(request, _('Wiki is not found.'))
filepath = "/" + page_name + ".md"
url = "%s?p=%s&from=personal_wiki_page_edit" % (
reverse('file_edit', args=[repo.id]),
urllib.parse.quote(filepath.encode('utf-8')))
return HttpResponseRedirect(url)
@login_required
def personal_wiki_page_delete(request, page_name):
try:
repo = get_personal_wiki_repo(request.user.username)
except WikiDoesNotExist:
return render_error(request, _('Wiki is not found.'))
file_name = page_name + '.md'
username = request.user.username
if seaserv.del_file(repo.id, '/', file_name, username):
messages.success(request, 'Successfully deleted "%s".' % page_name)
else:
messages.error(request, 'Failed to delete "%s". Please retry later.' % page_name)
return HttpResponseRedirect(reverse('personal_wiki', args=[]))

View File

@ -1,27 +0,0 @@
# Copyright (c) 2012-2016 Seafile Ltd.
# encoding: utf-8
import os
import logging
from django.core.management.base import BaseCommand
from seahub.wiki.models import PersonalWiki, Wiki, DuplicateWikiNameError
# Get an instance of a logger
logger = logging.getLogger(__name__)
class Command(BaseCommand):
help = 'Migrate records in wiki_personal_wiki table to wiki_wiki table.'
label = "wiki_migrate_personal_wiki"
def handle(self, *args, **options):
print('Start to migrate...')
for r in PersonalWiki.objects.all():
try:
Wiki.objects.add(wiki_name=r.username.split('@')[0],
username=r.username, repo_id=r.repo_id)
except DuplicateWikiNameError:
print('Multiple personal wiki records found, user: %s, repo_id: %s. Skip.' % (r.username, r.repo_id))
continue
print('Done.')

View File

@ -17,24 +17,6 @@ class WikiDoesNotExist(Exception):
class WikiPageMissing(Exception):
pass
class PersonalWikiManager(models.Manager):
def save_personal_wiki(self, username, repo_id):
"""
Create or update group wiki.
"""
try:
wiki = self.get(username=username)
wiki.repo_id = repo_id
except self.model.DoesNotExist:
wiki = self.model(username=username, repo_id=repo_id)
wiki.save(using=self._db)
return wiki
class PersonalWiki(models.Model):
username = LowerCaseCharField(max_length=255, unique=True)
repo_id = models.CharField(max_length=36)
objects = PersonalWikiManager()
class DuplicateWikiNameError(Exception):
pass
@ -133,13 +115,6 @@ class Wiki(models.Model):
from django.dispatch import receiver
from seahub.signals import repo_deleted
@receiver(repo_deleted)
def remove_personal_wiki(sender, **kwargs):
repo_owner = kwargs['repo_owner']
repo_id = kwargs['repo_id']
PersonalWiki.objects.filter(username=repo_owner, repo_id=repo_id).delete()
@receiver(repo_deleted)
def remove_wiki(sender, **kwargs):
repo_id = kwargs['repo_id']

View File

@ -19,7 +19,7 @@ from seahub.utils import gen_file_get_url, get_file_type_and_ext, \
gen_inner_file_get_url, get_site_scheme_and_netloc
from seahub.utils.file_types import IMAGE
from seahub.utils.timeutils import timestamp_to_isoformat_timestr
from .models import WikiPageMissing, WikiDoesNotExist, PersonalWiki
from .models import WikiPageMissing, WikiDoesNotExist
logger = logging.getLogger(__name__)
@ -66,24 +66,6 @@ def get_inner_file_url(repo, obj_id, file_name):
url = gen_inner_file_get_url(access_token, file_name)
return url
def get_personal_wiki_repo(username):
try:
wiki = PersonalWiki.objects.get(username=username)
except PersonalWiki.DoesNotExist:
raise WikiDoesNotExist
repo = seaserv.get_repo(wiki.repo_id)
if not repo:
raise WikiDoesNotExist
return repo
def get_personal_wiki_page(username, page_name):
repo = get_personal_wiki_repo(username)
dirent = get_wiki_dirent(repo.id, page_name)
url = get_inner_file_url(repo, dirent.obj_id, dirent.obj_name)
file_response = urllib.request.urlopen(url)
content = file_response.read()
return content, repo, dirent
def get_wiki_pages(repo):
"""
return pages in hashtable {normalized_name: page_name}