mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-13 05:39:59 +00:00
Let user choose wiki name and description
This commit is contained in:
@@ -2,8 +2,10 @@
|
||||
import os
|
||||
|
||||
from django import forms
|
||||
|
||||
from django.conf import settings
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from seaserv import is_valid_filename
|
||||
|
||||
from seahub.utils import validate_group_name
|
||||
|
||||
class MessageForm(forms.Form):
|
||||
@@ -45,3 +47,25 @@ class GroupJoinMsgForm(forms.Form):
|
||||
'max_length': _(u'Verification message is too long (maximun is 255 characters)'),
|
||||
})
|
||||
|
||||
class WikiCreateForm(forms.Form):
|
||||
"""
|
||||
A form used to create wiki.
|
||||
"""
|
||||
repo_name = forms.CharField(max_length=settings.MAX_FILE_NAME,
|
||||
error_messages={
|
||||
'required': _(u'Name can\'t be empty'),
|
||||
'max_length': _(u'Name is too long (maximum is 255 characters)')
|
||||
})
|
||||
repo_desc = forms.CharField(max_length=100, error_messages={
|
||||
'required': _(u'Description can\'t be empty'),
|
||||
'max_length': _(u'Description is too long (maximum is 100 characters)')
|
||||
})
|
||||
|
||||
def clean_repo_name(self):
|
||||
repo_name = self.cleaned_data['repo_name']
|
||||
if not is_valid_filename(repo_name):
|
||||
error_msg = _(u'"%s" is not a valid name') % repo_name
|
||||
raise forms.ValidationError(error_msg)
|
||||
else:
|
||||
return repo_name
|
||||
|
||||
|
@@ -86,3 +86,24 @@ def msgreply_save_handler(sender, instance, **kwargs):
|
||||
detail=group_msg.id)
|
||||
n.save()
|
||||
|
||||
class GroupWikiManager(models.Manager):
|
||||
def save_group_wiki(self, group_id, repo_id):
|
||||
"""
|
||||
Create or update group wiki.
|
||||
"""
|
||||
try:
|
||||
groupwiki = self.get(group_id=group_id)
|
||||
groupwiki.repo_id = repo_id
|
||||
except self.model.DoesNotExist:
|
||||
groupwiki = self.model(group_id=group_id, repo_id=repo_id)
|
||||
groupwiki.save(using=self._db)
|
||||
return groupwiki
|
||||
|
||||
class GroupWiki(models.Model):
|
||||
group_id = models.IntegerField()
|
||||
repo_id = models.CharField(max_length=36)
|
||||
objects = GroupWikiManager()
|
||||
|
||||
class Meta:
|
||||
unique_together = ('group_id', 'repo_id')
|
||||
|
||||
|
@@ -29,8 +29,19 @@
|
||||
{% if not wiki_exists %}
|
||||
<div class="empty-tips">
|
||||
<h2 class="center-contents">{% trans "This group currently has no wiki" %}</h2>
|
||||
<p>Wiki is a normal library with pre-defined file/folder structure. It enables group members to manage project documents or take notes using a simplified markup language called Markdown.<a href="{% url 'group_wiki_create' group.id %}">{% trans "Create Wiki Now." %}</a></p>
|
||||
<p>Wiki is a normal library with pre-defined file/folder structure. It enables group members to manage project documents or take notes using a simplified markup language called Markdown.<a id="wiki-create" href="#">{% trans "Create Wiki Now." %}</a></p>
|
||||
</div>
|
||||
<form id="wiki-create-form" action="" method="post" class="hide">
|
||||
<h3>{% trans "Create Wiki"%}</h3>
|
||||
<label>{% trans "Name"%}</label><br/>
|
||||
<input id="repo-name" type="text" name="repo_name" value="" maxlength="{{max_file_name}}"/><br />
|
||||
<label>{% trans "Description"%}</label><br/>
|
||||
<textarea id="repo-desc" name="repo_desc"></textarea>
|
||||
|
||||
<p class="error hide"></p>
|
||||
<input type="submit" id="wiki-create-submit" value="{% trans "Submit"%}" class="submit"/>
|
||||
</form>
|
||||
|
||||
{% else %}
|
||||
<ul class="wiki-nav" id="">
|
||||
<li><a href="{% url 'group_wiki' group.id %}">{% trans "Home" %}</a></li>
|
||||
@@ -42,7 +53,7 @@
|
||||
<button id="page-edit" class="fright">{% trans "Edit Page" %}</button>
|
||||
|
||||
<div id="wiki-area" class="article">
|
||||
<h1>{{ page }}</h1>
|
||||
<h1>{{ page|capfirst }}</h1>
|
||||
<div id="wiki-content"></div>
|
||||
</div>
|
||||
|
||||
@@ -72,6 +83,7 @@
|
||||
{% block extra_script %}
|
||||
<script type="text/javascript" src="{{MEDIA_URL}}js/showdown.js"></script>
|
||||
<script type="text/javascript">
|
||||
|
||||
{% if wiki_exists %}
|
||||
var converter = new Showdown.converter();
|
||||
$('#wiki-content').html(converter.makeHtml('{{ content|escapejs }}')).children(':first').css('margin-top', '0');
|
||||
@@ -93,7 +105,45 @@ addConfirmTo($('#page-delete'), {
|
||||
'con': 'Are you sure you want to delete this page?'
|
||||
});
|
||||
|
||||
{% endif %}
|
||||
{% else %}
|
||||
|
||||
$('#wiki-create').click(function() {
|
||||
$('#wiki-create-form').modal({appendTo: '#main', autoResize: true});
|
||||
return false;
|
||||
});
|
||||
$('#wiki-create-submit').click(function () {
|
||||
// if (!$.trim($('#repo-name').val()) || !$.trim($('#repo-desc').val())) {
|
||||
// apply_form_error('wiki-create-form', '{% trans 'Name and description can not be blank.' %}');
|
||||
// return false;
|
||||
// }
|
||||
|
||||
var submit_btn = $(this);
|
||||
disable(submit_btn);
|
||||
$.ajax({
|
||||
url: '{% url 'group_wiki_create' group.id %}',
|
||||
type: 'POST',
|
||||
dataType: 'json',
|
||||
cache: 'false',
|
||||
beforeSend: prepareCSRFToken,
|
||||
data: {
|
||||
'repo_name': $('#repo-name').val(),
|
||||
'repo_desc': $('#repo-desc').val()
|
||||
},
|
||||
success: function(data) {
|
||||
location.href = data['href'];
|
||||
},
|
||||
error: function(data, textStatus, jqXHR) {
|
||||
var errors = $.parseJSON(data.responseText);
|
||||
$.each(errors, function(index, value) {
|
||||
apply_form_error('wiki-create-form', value);
|
||||
});
|
||||
enable(submit_btn);
|
||||
}
|
||||
});
|
||||
|
||||
return false;
|
||||
});
|
||||
{% endif %} // END if wiki_exists
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
@@ -29,9 +29,9 @@ from seaserv import ccnet_rpc, ccnet_threaded_rpc, seafserv_threaded_rpc, \
|
||||
from pysearpc import SearpcError
|
||||
|
||||
from decorators import group_staff_required
|
||||
from models import GroupMessage, MessageReply, MessageAttachment
|
||||
from models import GroupMessage, MessageReply, MessageAttachment, GroupWiki
|
||||
from forms import MessageForm, MessageReplyForm, GroupRecommendForm, \
|
||||
GroupAddForm, GroupJoinMsgForm
|
||||
GroupAddForm, GroupJoinMsgForm, WikiCreateForm
|
||||
from signals import grpmsg_added, grpmsg_reply_added
|
||||
from settings import GROUP_MEMBERS_DEFAULT_DISPLAY
|
||||
from base.decorators import ctx_switch_required
|
||||
@@ -1078,11 +1078,15 @@ class WikiPageMissing(Exception):
|
||||
pass
|
||||
|
||||
def find_wiki_repo(request, group):
|
||||
try:
|
||||
groupwiki = GroupWiki.objects.get(group_id=group.id)
|
||||
repos = get_group_repos(group.id, request.user.username)
|
||||
for repo in repos:
|
||||
if repo.name == (group.group_name + "-wiki"):
|
||||
if repo.id == groupwiki.repo_id:
|
||||
return repo
|
||||
return None
|
||||
except GroupWiki.DoesNotExist:
|
||||
return None
|
||||
|
||||
def get_file_url(repo_id, path, filename):
|
||||
obj_id = get_file_id_by_path(repo_id, path)
|
||||
@@ -1215,26 +1219,33 @@ def group_wiki_pages(request, group):
|
||||
@login_required
|
||||
@group_check
|
||||
def group_wiki_create(request, group):
|
||||
# create group repo in user context
|
||||
repo_name = group.group_name + "-wiki"
|
||||
repo_desc = "Wiki Pages"
|
||||
user = request.user.username
|
||||
passwd = None
|
||||
permission = "rw"
|
||||
if request.method != 'POST':
|
||||
raise Http404
|
||||
|
||||
content_type = 'application/json; charset=utf-8'
|
||||
|
||||
def json_error(err_msg):
|
||||
result = {'error': [err_msg]}
|
||||
return HttpResponseBadRequest(json.dumps(result),
|
||||
def json_error(err_msg, status=400):
|
||||
result = {'error': err_msg}
|
||||
return HttpResponse(json.dumps(result), status=status,
|
||||
content_type=content_type)
|
||||
|
||||
form = WikiCreateForm(request.POST)
|
||||
if not form.is_valid():
|
||||
return json_error(str(form.errors.values()[0]))
|
||||
|
||||
# create group repo in user context
|
||||
repo_name = form.cleaned_data['repo_name']
|
||||
repo_desc = form.cleaned_data['repo_desc']
|
||||
user = request.user.username
|
||||
passwd = None
|
||||
permission = "rw"
|
||||
|
||||
try:
|
||||
repo_id = seafserv_threaded_rpc.create_repo(repo_name,
|
||||
repo_desc,
|
||||
user, passwd)
|
||||
except:
|
||||
return json_error(_(u'Failed to create'))
|
||||
return json_error(_(u'Failed to create'), 500)
|
||||
|
||||
try:
|
||||
status = seafserv_threaded_rpc.group_share_repo(repo_id,
|
||||
@@ -1243,16 +1254,19 @@ def group_wiki_create(request, group):
|
||||
permission)
|
||||
except SearpcError, e:
|
||||
seafserv_threaded_rpc.remove_repo(repo_id)
|
||||
return json_error(_(u'Failed to create: internal error.'))
|
||||
return json_error(_(u'Failed to create: internal error.'), 500)
|
||||
|
||||
GroupWiki.objects.save_group_wiki(group_id=group.id, repo_id=repo_id)
|
||||
|
||||
# create home page
|
||||
page_name = "home.md"
|
||||
try:
|
||||
seafserv_threaded_rpc.post_empty_file(repo_id, "/", page_name, user)
|
||||
except SearpcError, e:
|
||||
return json_error(_(u'Failed to create home page.'))
|
||||
return json_error(_(u'Failed to create home page.'), 500)
|
||||
|
||||
return HttpResponseRedirect(reverse('group_wiki', args=[group.id]))
|
||||
next = reverse('group_wiki', args=[group.id])
|
||||
return HttpResponse(json.dumps({'href': next}), content_type=content_type)
|
||||
|
||||
def normalize_page_name(page_name):
|
||||
# Replace special characters to '-'.
|
||||
@@ -1268,8 +1282,7 @@ def group_wiki_page_new(request, group, page_name="home"):
|
||||
page_name = request.POST.get('page_name', '')
|
||||
if not page_name:
|
||||
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))
|
||||
# Normalize page name
|
||||
page_name = normalize_page_name(page_name)
|
||||
page_name = normalize_page_name(page_name) # normalize page name
|
||||
|
||||
repo = find_wiki_repo(request, group)
|
||||
if not repo:
|
||||
|
@@ -2022,6 +2022,15 @@ textarea:-moz-placeholder {/* for FF */
|
||||
#wiki-area.article {
|
||||
padding: 0 0;
|
||||
}
|
||||
#wiki-create-form {
|
||||
width: 262px;
|
||||
}
|
||||
#wiki-create-form input[type="text"]{
|
||||
width: 100%;
|
||||
}
|
||||
#wiki-create-form textarea {
|
||||
width: 100%;
|
||||
}
|
||||
#page-edit {
|
||||
margin-right:6px;
|
||||
}
|
||||
|
Reference in New Issue
Block a user