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:
parent
941a570c81
commit
3b74bec1ec
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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 %}
|
@ -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 %}
|
@ -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'),
|
||||
|
@ -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])
|
||||
|
@ -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
|
||||
|
@ -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=[]))
|
@ -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.')
|
@ -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']
|
||||
|
@ -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}
|
||||
|
Loading…
Reference in New Issue
Block a user