mirror of
https://github.com/haiwen/seahub.git
synced 2025-08-08 10:27:33 +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.tags.models import FileUUIDMap
|
||||||
from seahub.base.models import UserStarredFiles
|
from seahub.base.models import UserStarredFiles
|
||||||
from seahub.revision_tag.models import RevisionTags
|
from seahub.revision_tag.models import RevisionTags
|
||||||
from seahub.wiki.models import PersonalWiki
|
|
||||||
from seahub.share.models import ExtraGroupsSharePermission, \
|
from seahub.share.models import ExtraGroupsSharePermission, \
|
||||||
ExtraSharePermission, UploadLinkShare
|
ExtraSharePermission, UploadLinkShare
|
||||||
|
|
||||||
@ -21,7 +20,6 @@ class Command(BaseCommand):
|
|||||||
|
|
||||||
#on_delete is CASCADE, so FileTag/FileComment will be deleted
|
#on_delete is CASCADE, so FileTag/FileComment will be deleted
|
||||||
self.tables = {'FileUUIDMap': FileUUIDMap, 'RevisionTags': RevisionTags,
|
self.tables = {'FileUUIDMap': FileUUIDMap, 'RevisionTags': RevisionTags,
|
||||||
'PersonalWiki': PersonalWiki,
|
|
||||||
'UserStarredFiles': UserStarredFiles,
|
'UserStarredFiles': UserStarredFiles,
|
||||||
'ExtraGroupsSharePermission': ExtraGroupsSharePermission,
|
'ExtraGroupsSharePermission': ExtraGroupsSharePermission,
|
||||||
'ExtraSharePermission': ExtraSharePermission,
|
'ExtraSharePermission': ExtraSharePermission,
|
||||||
|
@ -749,7 +749,7 @@ OTP_LOGIN_URL = '/profile/two_factor_authentication/setup/'
|
|||||||
TWO_FACTOR_DEVICE_REMEMBER_DAYS = 90
|
TWO_FACTOR_DEVICE_REMEMBER_DAYS = 90
|
||||||
ENABLE_FORCE_2FA_TO_ALL_USERS = False
|
ENABLE_FORCE_2FA_TO_ALL_USERS = False
|
||||||
|
|
||||||
# Enable personal wiki, group wiki
|
# Enable wiki
|
||||||
ENABLE_WIKI = True
|
ENABLE_WIKI = True
|
||||||
|
|
||||||
# Enable 'repo snapshot label' feature
|
# 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, \
|
from seahub.views.repo import repo_history_view, repo_snapshot, view_shared_dir, \
|
||||||
view_shared_upload_link, view_lib_as_wiki
|
view_shared_upload_link, view_lib_as_wiki
|
||||||
from .notifications.views import notification_list
|
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.smart_link import SmartLink, SmartLinkToken
|
||||||
from seahub.api2.endpoints.groups import Groups, Group
|
from seahub.api2.endpoints.groups import Groups, Group
|
||||||
from seahub.api2.endpoints.all_groups import AllGroups
|
from seahub.api2.endpoints.all_groups import AllGroups
|
||||||
@ -173,14 +170,6 @@ urlpatterns = [
|
|||||||
url(r'^$', libraries, name='libraries'),
|
url(r'^$', libraries, name='libraries'),
|
||||||
#url(r'^home/$', direct_to_template, { 'template': 'home.html' } ),
|
#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'^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
|
# revert repo
|
||||||
url(r'^repo/history/revert/(?P<repo_id>[-0-9a-f]{36})/$', repo_revert_history, name='repo_revert_history'),
|
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]
|
wiki_name = os.path.splitext(os.path.basename(path))[0]
|
||||||
next_page = reverse('group_wiki', args=[gid, wiki_name])
|
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':
|
elif req_from == 'wikis_wiki_page_edit' or req_from == 'wikis_wiki_page_new':
|
||||||
wiki_slug = request.GET.get('wiki_slug', '')
|
wiki_slug = request.GET.get('wiki_slug', '')
|
||||||
wiki_page_name = os.path.splitext(os.path.basename(path))[0]
|
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]
|
wiki_name = os.path.splitext(u_filename)[0]
|
||||||
if page_from == 'wiki_page_edit' or page_from == 'wiki_page_new':
|
if page_from == 'wiki_page_edit' or page_from == 'wiki_page_new':
|
||||||
cancel_url = reverse('group_wiki', args=[gid, wiki_name])
|
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':
|
elif page_from == 'wikis_wiki_page_edit' or page_from == 'wikis_wiki_page_new':
|
||||||
wiki_page_name = wiki_name
|
wiki_page_name = wiki_name
|
||||||
cancel_url = reverse('wiki:slug', args=[wiki_slug, wiki_page_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 django.test import TestCase
|
||||||
|
|
||||||
from seahub.base.accounts import User
|
from seahub.base.accounts import User
|
||||||
from seahub.wiki.models import PersonalWiki
|
|
||||||
from seahub.views.wiki import personal_wiki
|
|
||||||
|
|
||||||
def setup():
|
def setup():
|
||||||
global repo_id, mock_content, mock_repo, mock_dirent, request
|
global repo_id, mock_content, mock_repo, mock_dirent, request
|
||||||
@ -36,50 +34,6 @@ def setup():
|
|||||||
patch('seahub.views.wiki.render_to_response',
|
patch('seahub.views.wiki.render_to_response',
|
||||||
render_to_response_echo).start()
|
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
|
########## Helpler functions and classes
|
||||||
def FakeRequestFactory(*args, **kwargs):
|
def FakeRequestFactory(*args, **kwargs):
|
||||||
''' FakeRequestFactory, FakeMessages and FakeRequestContext are good for
|
''' 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):
|
class WikiPageMissing(Exception):
|
||||||
pass
|
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):
|
class DuplicateWikiNameError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@ -133,13 +115,6 @@ class Wiki(models.Model):
|
|||||||
from django.dispatch import receiver
|
from django.dispatch import receiver
|
||||||
from seahub.signals import repo_deleted
|
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)
|
@receiver(repo_deleted)
|
||||||
def remove_wiki(sender, **kwargs):
|
def remove_wiki(sender, **kwargs):
|
||||||
repo_id = kwargs['repo_id']
|
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
|
gen_inner_file_get_url, get_site_scheme_and_netloc
|
||||||
from seahub.utils.file_types import IMAGE
|
from seahub.utils.file_types import IMAGE
|
||||||
from seahub.utils.timeutils import timestamp_to_isoformat_timestr
|
from seahub.utils.timeutils import timestamp_to_isoformat_timestr
|
||||||
from .models import WikiPageMissing, WikiDoesNotExist, PersonalWiki
|
from .models import WikiPageMissing, WikiDoesNotExist
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
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)
|
url = gen_inner_file_get_url(access_token, file_name)
|
||||||
return url
|
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):
|
def get_wiki_pages(repo):
|
||||||
"""
|
"""
|
||||||
return pages in hashtable {normalized_name: page_name}
|
return pages in hashtable {normalized_name: page_name}
|
||||||
|
Loading…
Reference in New Issue
Block a user