mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-13 13:50:07 +00:00
Implement wiki page link
This commit is contained in:
@@ -12,7 +12,7 @@
|
|||||||
<ul class="tabnav-tabs">
|
<ul class="tabnav-tabs">
|
||||||
<li class="tabnav-tab"><a href="{% url 'group_info' group.id %}">{% trans "Libraries" %}</a></li>
|
<li class="tabnav-tab"><a href="{% url 'group_info' group.id %}">{% trans "Libraries" %}</a></li>
|
||||||
<li class="tabnav-tab tabnav-tab-cur">{% trans "Discussions" %}</li>
|
<li class="tabnav-tab tabnav-tab-cur">{% trans "Discussions" %}</li>
|
||||||
<li class="tabnav-tab"><a href="{% url 'pubuser' %}">{% trans "Wiki" %}</a></li>
|
<li class="tabnav-tab"><a href="{% url 'group_wiki' group.id %}">{% trans "Wiki" %}</a></li>
|
||||||
{% if is_staff %}
|
{% if is_staff %}
|
||||||
<li class="tabnav-tab"><a href="{% url 'pubuser' %}">{% trans "Admin" %}</a></li>
|
<li class="tabnav-tab"><a href="{% url 'pubuser' %}">{% trans "Admin" %}</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@@ -12,7 +12,7 @@
|
|||||||
<ul class="tabnav-tabs">
|
<ul class="tabnav-tabs">
|
||||||
<li class="tabnav-tab tabnav-tab-cur">{% trans "Libraries" %}</li>
|
<li class="tabnav-tab tabnav-tab-cur">{% trans "Libraries" %}</li>
|
||||||
<li class="tabnav-tab"><a href="{% url 'group_discus' group.id %}">{% trans "Discussions" %}</a></li>
|
<li class="tabnav-tab"><a href="{% url 'group_discus' group.id %}">{% trans "Discussions" %}</a></li>
|
||||||
<li class="tabnav-tab"><a href="{% url 'pubuser' %}">{% trans "Wiki" %}</a></li>
|
<li class="tabnav-tab"><a href="{% url 'group_wiki' group.id %}">{% trans "Wiki" %}</a></li>
|
||||||
{% if is_staff %}
|
{% if is_staff %}
|
||||||
<li class="tabnav-tab"><a href="{% url 'pubuser' %}">{% trans "Admin" %}</a></li>
|
<li class="tabnav-tab"><a href="{% url 'pubuser' %}">{% trans "Admin" %}</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
56
group/templates/group/group_wiki.html
Normal file
56
group/templates/group/group_wiki.html
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
{% extends base_template %}
|
||||||
|
|
||||||
|
{% load seahub_tags avatar_tags group_avatar_tags i18n %}
|
||||||
|
{% load url from future %}
|
||||||
|
|
||||||
|
{% block nav_group_class %}class="cur"{% endblock %}
|
||||||
|
|
||||||
|
{% block title_panel %}
|
||||||
|
|
||||||
|
|
||||||
|
<div class="tabnav">
|
||||||
|
<ul class="tabnav-tabs">
|
||||||
|
<li class="tabnav-tab"><a href="{% url 'group_info' group.id %}">{% trans "Libraries" %}</a></li>
|
||||||
|
<li class="tabnav-tab"><a href="{% url 'group_discus' group.id %}">{% trans "Discussions" %}</a></li>
|
||||||
|
<li class="tabnav-tab tabnav-tab-cur">{% trans "Wiki" %}</li>
|
||||||
|
{% if is_staff %}
|
||||||
|
<li class="tabnav-tab"><a href="{% url 'pubuser' %}">{% trans "Admin" %}</a></li>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<div class="fright">
|
||||||
|
{% grp_avatar group.props.id 24 %} <span style="font-size: 16px; font-weight:bold; margin: 0 6px;">{{ group.group_name }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button id="wiki-create" class="add fright">{% trans "New Page" %}</button>
|
||||||
|
<button id="wiki-edit" class="add fright">{% trans "Edit Page" %}</button>
|
||||||
|
|
||||||
|
<a href="{% url 'group_wiki_create' group.id %}">{% trans "Create Wiki" %}</a>
|
||||||
|
|
||||||
|
<div class="article">
|
||||||
|
<h1>{{ page }}</h1>
|
||||||
|
<div id="wiki-view"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block left_panel %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block right_panel %}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
{% block extra_script %}
|
||||||
|
<script type="text/javascript" src="{{MEDIA_URL}}js/showdown.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var converter = new Showdown.converter();
|
||||||
|
$('#wiki-view').html(converter.makeHtml('{{ content|escapejs }}')).children(':first').css('margin-top', '0');
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
@@ -3,11 +3,14 @@ from django.conf.urls.defaults import *
|
|||||||
from views import group_info, group_member_operations, group_add_admin, \
|
from views import group_info, group_member_operations, group_add_admin, \
|
||||||
group_manage, msg_reply, msg_reply_new, group_recommend, \
|
group_manage, msg_reply, msg_reply_new, group_recommend, \
|
||||||
create_group_repo, group_joinrequest, attention, group_message_remove, \
|
create_group_repo, group_joinrequest, attention, group_message_remove, \
|
||||||
group_remove_admin, group_discus
|
group_remove_admin, group_discus, group_wiki, group_wiki_create
|
||||||
|
|
||||||
urlpatterns = patterns('',
|
urlpatterns = patterns('',
|
||||||
url(r'^(?P<group_id>\d+)/$', group_info, name='group_info'),
|
url(r'^(?P<group_id>\d+)/$', group_info, name='group_info'),
|
||||||
url(r'^(?P<group_id>\d+)/discus/$', group_discus, name='group_discus'),
|
url(r'^(?P<group_id>\d+)/discus/$', group_discus, name='group_discus'),
|
||||||
|
url(r'^(?P<group_id>\d+)/wiki/$', group_wiki, name='group_wiki'),
|
||||||
|
url(r'^(?P<group_id>\d+)/wiki/(?P<page_name>[^/]+)$', group_wiki, name='group_wiki'),
|
||||||
|
url(r'^(?P<group_id>\d+)/wiki_create/$', group_wiki_create, name='group_wiki_create'),
|
||||||
url(r'^reply/(?P<msg_id>[\d]+)/$', msg_reply, name='msg_reply'),
|
url(r'^reply/(?P<msg_id>[\d]+)/$', msg_reply, name='msg_reply'),
|
||||||
url(r'^reply/new/$', msg_reply_new, name='msg_reply_new'),
|
url(r'^reply/new/$', msg_reply_new, name='msg_reply_new'),
|
||||||
url(r'^(?P<group_id>\d+)/manage/$', group_manage, name='group_members'),
|
url(r'^(?P<group_id>\d+)/manage/$', group_manage, name='group_members'),
|
||||||
|
130
group/views.py
130
group/views.py
@@ -19,6 +19,7 @@ from django.views.generic.edit import BaseFormView, FormMixin
|
|||||||
|
|
||||||
from auth.decorators import login_required
|
from auth.decorators import login_required
|
||||||
from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \
|
from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \
|
||||||
|
seafserv_rpc, \
|
||||||
get_repo, get_group_repos, check_group_staff, get_commits, is_group_user, \
|
get_repo, get_group_repos, check_group_staff, get_commits, is_group_user, \
|
||||||
get_personal_groups_by_user, get_group, get_group_members, \
|
get_personal_groups_by_user, get_group, get_group_members, \
|
||||||
get_personal_groups, create_org_repo, get_org_group_repos, \
|
get_personal_groups, create_org_repo, get_org_group_repos, \
|
||||||
@@ -41,7 +42,7 @@ from seahub.settings import SITE_ROOT, SITE_NAME
|
|||||||
from seahub.shortcuts import get_first_object_or_none
|
from seahub.shortcuts import get_first_object_or_none
|
||||||
from seahub.utils import render_error, render_permission_error, \
|
from seahub.utils import render_error, render_permission_error, \
|
||||||
validate_group_name, string2list, check_and_get_org_by_group, \
|
validate_group_name, string2list, check_and_get_org_by_group, \
|
||||||
check_and_get_org_by_repo
|
check_and_get_org_by_repo, gen_file_get_url
|
||||||
from seahub.views import is_registered_user
|
from seahub.views import is_registered_user
|
||||||
from seahub.forms import RepoCreateForm, SharedRepoCreateForm
|
from seahub.forms import RepoCreateForm, SharedRepoCreateForm
|
||||||
|
|
||||||
@@ -1086,3 +1087,130 @@ def group_discus(request, group_id):
|
|||||||
'group_members_default_display': GROUP_MEMBERS_DEFAULT_DISPLAY,
|
'group_members_default_display': GROUP_MEMBERS_DEFAULT_DISPLAY,
|
||||||
}, context_instance=RequestContext(request));
|
}, context_instance=RequestContext(request));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def find_wiki_repo(request, group_id):
|
||||||
|
repos = get_group_repos(group_id, request.user.username)
|
||||||
|
for repo in repos:
|
||||||
|
if repo.name == "wiki":
|
||||||
|
return repo
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def get_file_url(repo_id, path, filename):
|
||||||
|
obj_id = seafserv_threaded_rpc.get_file_id_by_path(repo_id, path)
|
||||||
|
access_token = seafserv_rpc.web_get_access_token(repo_id, obj_id,
|
||||||
|
'view', '')
|
||||||
|
url = gen_file_get_url(access_token, filename)
|
||||||
|
return url
|
||||||
|
|
||||||
|
def get_wiki_page(request, group_id, page_name):
|
||||||
|
import urllib2
|
||||||
|
repo = find_wiki_repo(request, group_id)
|
||||||
|
path = "/" + page_name + ".md"
|
||||||
|
filename = page_name + ".md"
|
||||||
|
url = get_file_url(repo.id, path, filename)
|
||||||
|
file_response = urllib2.urlopen(url)
|
||||||
|
content = file_response.read()
|
||||||
|
return content
|
||||||
|
|
||||||
|
def convert_wiki_link(content, group):
|
||||||
|
import re
|
||||||
|
|
||||||
|
def repl(matchobj):
|
||||||
|
print matchobj.group(1)
|
||||||
|
linkname = matchobj.group(1)
|
||||||
|
filename = linkname + ".md"
|
||||||
|
path = "/" + filename
|
||||||
|
return "<a href='%sgroup/%d/wiki/%s'>%s</a>" % (SITE_ROOT,
|
||||||
|
group.id, linkname, linkname)
|
||||||
|
|
||||||
|
return re.sub(r'\[\[(.+)\]\]', repl, content)
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def group_wiki(request, group_id, page_name="home"):
|
||||||
|
|
||||||
|
group_id_int = int(group_id) # Checkeb by URL Conf
|
||||||
|
|
||||||
|
group = get_group(group_id_int)
|
||||||
|
if not group:
|
||||||
|
return HttpResponseRedirect(reverse('group_list', args=[]))
|
||||||
|
|
||||||
|
# Check whether user belongs to the group.
|
||||||
|
joined = is_group_user(group_id_int, request.user.username)
|
||||||
|
if not joined and not request.user.is_staff:
|
||||||
|
# Return group public info page.
|
||||||
|
return render_to_response('group/group_pubinfo.html', {
|
||||||
|
'members': members,
|
||||||
|
'group': group,
|
||||||
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
is_staff = True if check_group_staff(group.id, request.user) else False
|
||||||
|
|
||||||
|
content = get_wiki_page(request, group_id_int, page_name)
|
||||||
|
content = convert_wiki_link(content, group)
|
||||||
|
|
||||||
|
return render_to_response("group/group_wiki.html", {
|
||||||
|
"group_id": group_id,
|
||||||
|
"group" : group,
|
||||||
|
"is_staff": is_staff,
|
||||||
|
"content": content,
|
||||||
|
"page": page_name,
|
||||||
|
}, context_instance=RequestContext(request));
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@login_required
|
||||||
|
def group_wiki_create(request, group_id):
|
||||||
|
|
||||||
|
group_id_int = int(group_id) # Checkeb by URL Conf
|
||||||
|
|
||||||
|
group = get_group(group_id_int)
|
||||||
|
if not group:
|
||||||
|
return HttpResponseRedirect(reverse('group_list', args=[]))
|
||||||
|
|
||||||
|
# Check whether user belongs to the group.
|
||||||
|
joined = is_group_user(group_id_int, request.user.username)
|
||||||
|
if not joined and not request.user.is_staff:
|
||||||
|
# Return group public info page.
|
||||||
|
return render_to_response('group/group_pubinfo.html', {
|
||||||
|
'members': members,
|
||||||
|
'group': group,
|
||||||
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
is_staff = True if check_group_staff(group.id, request.user) else False
|
||||||
|
|
||||||
|
|
||||||
|
# create group repo in user context
|
||||||
|
repo_name = "wiki"
|
||||||
|
repo_desc = "Wiki Pages"
|
||||||
|
user = request.user.username
|
||||||
|
passwd = None
|
||||||
|
permission = "rw"
|
||||||
|
|
||||||
|
content_type = 'application/json; charset=utf-8'
|
||||||
|
|
||||||
|
def json_error(err_msg):
|
||||||
|
result = {'error': [err_msg]}
|
||||||
|
return HttpResponseBadRequest(json.dumps(result),
|
||||||
|
content_type=content_type)
|
||||||
|
|
||||||
|
try:
|
||||||
|
repo_id = seafserv_threaded_rpc.create_repo(repo_name,
|
||||||
|
repo_desc,
|
||||||
|
user, passwd)
|
||||||
|
except:
|
||||||
|
return json_error(_(u'Failed to create'))
|
||||||
|
|
||||||
|
try:
|
||||||
|
status = seafserv_threaded_rpc.group_share_repo(repo_id,
|
||||||
|
int(group_id),
|
||||||
|
user,
|
||||||
|
permission)
|
||||||
|
except SearpcError, e:
|
||||||
|
seafserv_threaded_rpc.remove_repo(repo_id)
|
||||||
|
print e
|
||||||
|
return json_error(_(u'Failed to create: internal error.'))
|
||||||
|
|
||||||
|
return HttpResponseRedirect(reverse('group_info', args=[group_id]))
|
||||||
|
Reference in New Issue
Block a user