mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-19 18:29:23 +00:00
Turn on/off group Wiki
This commit is contained in:
@@ -27,6 +27,8 @@ from seahub.group.utils import validate_group_name, check_group_name_conflict, \
|
|||||||
from seahub.group.views import remove_group_common
|
from seahub.group.views import remove_group_common
|
||||||
from seahub.base.templatetags.seahub_tags import email2nickname, \
|
from seahub.base.templatetags.seahub_tags import email2nickname, \
|
||||||
translate_seahub_time
|
translate_seahub_time
|
||||||
|
from seahub.views.modules import is_wiki_mod_enabled_for_group, \
|
||||||
|
enable_mod_for_group, disable_mod_for_group, MOD_GROUP_WIKI
|
||||||
|
|
||||||
from .utils import api_check_group
|
from .utils import api_check_group
|
||||||
|
|
||||||
@@ -58,6 +60,7 @@ def get_group_info(request, group_id, avatar_size=GROUP_AVATAR_DEFAULT_SIZE):
|
|||||||
"created_at": val.strftime("%Y-%m-%dT%H:%M:%S") + DateFormat(val).format('O'),
|
"created_at": val.strftime("%Y-%m-%dT%H:%M:%S") + DateFormat(val).format('O'),
|
||||||
"avatar_url": request.build_absolute_uri(avatar_url),
|
"avatar_url": request.build_absolute_uri(avatar_url),
|
||||||
"admins": get_group_admins(group.id),
|
"admins": get_group_admins(group.id),
|
||||||
|
"wiki_enabled": is_wiki_mod_enabled_for_group(group_id)
|
||||||
}
|
}
|
||||||
|
|
||||||
return group_info
|
return group_info
|
||||||
@@ -266,6 +269,31 @@ class Group(APIView):
|
|||||||
error_msg = 'Internal Server Error'
|
error_msg = 'Internal Server Error'
|
||||||
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
|
wiki_enabled = request.data.get('wiki_enabled', None)
|
||||||
|
# turn on/off group wiki
|
||||||
|
if wiki_enabled:
|
||||||
|
try:
|
||||||
|
# only group owner/admin can turn on a group wiki
|
||||||
|
if not is_group_admin_or_owner(group_id, username):
|
||||||
|
error_msg = 'Permission denied.'
|
||||||
|
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
|
||||||
|
|
||||||
|
# augument check
|
||||||
|
if wiki_enabled != 'true' and wiki_enabled != 'false':
|
||||||
|
error_msg = 'wiki_enabled invalid.'
|
||||||
|
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
|
||||||
|
|
||||||
|
# turn on/off group wiki
|
||||||
|
if wiki_enabled == 'true':
|
||||||
|
enable_mod_for_group(group_id, MOD_GROUP_WIKI)
|
||||||
|
else:
|
||||||
|
disable_mod_for_group(group_id, MOD_GROUP_WIKI)
|
||||||
|
|
||||||
|
except SearpcError as e:
|
||||||
|
logger.error(e)
|
||||||
|
error_msg = 'Internal Server Error'
|
||||||
|
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
|
||||||
|
|
||||||
group_info = get_group_info(request, group_id)
|
group_info = get_group_info(request, group_id)
|
||||||
|
|
||||||
return Response(group_info)
|
return Response(group_info)
|
||||||
|
@@ -672,7 +672,10 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<div class="fright">
|
<div class="fright">
|
||||||
<span class="sf2-icon-group-settings op-icon" title="{% trans "Settings" %}" id="group-settings-icon"></span>
|
<% if (wiki_enabled) { %>
|
||||||
|
<span class="sf2-icon-wiki2 op-icon" title="{% trans "Wiki" %}" id="group-wiki-icon"></span>
|
||||||
|
<% } %>
|
||||||
|
<span class="sf2-icon-cog1 op-icon" title="{% trans "Group Settings" %}" id="group-settings-icon"></span>
|
||||||
<span class="sf2-icon-user2 op-icon" title="{% trans "Members" %}" id="group-members-icon"></span>
|
<span class="sf2-icon-user2 op-icon" title="{% trans "Members" %}" id="group-members-icon"></span>
|
||||||
<span class="sf2-icon-msgs2 op-icon" title="{% trans "Discussion" %}"></span>
|
<span class="sf2-icon-msgs2 op-icon" title="{% trans "Discussion" %}"></span>
|
||||||
</div>
|
</div>
|
||||||
@@ -944,6 +947,11 @@
|
|||||||
<ul class="group-setting-list">
|
<ul class="group-setting-list">
|
||||||
<li class="group-setting-item" data-op="rename">{% trans "Rename" %}</li>
|
<li class="group-setting-item" data-op="rename">{% trans "Rename" %}</li>
|
||||||
<li class="group-setting-item" data-op="transfer">{% trans "Transfer" %}</li>
|
<li class="group-setting-item" data-op="transfer">{% trans "Transfer" %}</li>
|
||||||
|
<% if (!wiki_enabled) { %>
|
||||||
|
<li class="group-setting-item" data-op="add-wiki">{% trans "Add Wiki" %}</li>
|
||||||
|
<% } else { %>
|
||||||
|
<li class="group-setting-item" data-op="remove-wiki">{% trans "Remove Wiki" %}</li>
|
||||||
|
<% } %>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="group-setting-list">
|
<ul class="group-setting-list">
|
||||||
<li class="group-setting-item" data-op="import-members">{% trans "Import Members" %}</li>
|
<li class="group-setting-item" data-op="import-members">{% trans "Import Members" %}</li>
|
||||||
|
@@ -164,12 +164,10 @@
|
|||||||
<div class="outer-caret up-outer-caret"><div class="inner-caret"></div></div>
|
<div class="outer-caret up-outer-caret"><div class="inner-caret"></div></div>
|
||||||
<div class="popover-hd ovhd">
|
<div class="popover-hd ovhd">
|
||||||
<span class="popover-close close sf2-icon-x1 op-icon fright" title="{% trans "Close" %}"></span>
|
<span class="popover-close close sf2-icon-x1 op-icon fright" title="{% trans "Close" %}"></span>
|
||||||
<h3 class="popover-title">{% trans "Settings" %}</h3>
|
<h3 class="popover-title">{% trans "Group Settings" %}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="popover-con">
|
<div class="popover-con">
|
||||||
<span class="loading-icon loading-tip"></span>
|
|
||||||
<div id="group-setting-con" class="hide"></div>
|
<div id="group-setting-con" class="hide"></div>
|
||||||
<p class="error hide"></p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@@ -56,6 +56,14 @@ def get_enabled_mods_by_group(group_id):
|
|||||||
mod_enabled.append(MOD_GROUP_WIKI)
|
mod_enabled.append(MOD_GROUP_WIKI)
|
||||||
return mod_enabled
|
return mod_enabled
|
||||||
|
|
||||||
|
def is_wiki_mod_enabled_for_group(group_id):
|
||||||
|
group_wiki_enabled = GroupEnabledModule.objects.filter(
|
||||||
|
group_id=group_id, module_name=MOD_GROUP_WIKI).exists()
|
||||||
|
if group_wiki_enabled:
|
||||||
|
return True
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
def enable_mod_for_group(group_id, mod_name):
|
def enable_mod_for_group(group_id, mod_name):
|
||||||
if mod_name != MOD_GROUP_WIKI:
|
if mod_name != MOD_GROUP_WIKI:
|
||||||
raise BadModNameError
|
raise BadModNameError
|
||||||
@@ -78,4 +86,3 @@ def get_wiki_enabled_group_list(in_group_ids=None):
|
|||||||
if in_group_ids is not None:
|
if in_group_ids is not None:
|
||||||
qs = qs.filter(group_id__in=in_group_ids)
|
qs = qs.filter(group_id__in=in_group_ids)
|
||||||
return qs
|
return qs
|
||||||
|
|
||||||
|
@@ -21,9 +21,7 @@ define([
|
|||||||
// group basic info
|
// group basic info
|
||||||
this.group = {};
|
this.group = {};
|
||||||
|
|
||||||
this.$loadingTip = this.$('.loading-tip');
|
|
||||||
this.$listContainer = $('#group-setting-con');
|
this.$listContainer = $('#group-setting-con');
|
||||||
this.$error = this.$('.error');
|
|
||||||
|
|
||||||
var _this = this;
|
var _this = this;
|
||||||
$(window).resize(function() {
|
$(window).resize(function() {
|
||||||
@@ -51,50 +49,23 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
render: function() {
|
render: function() {
|
||||||
this.$error.hide();
|
|
||||||
this.$listContainer.hide();
|
this.$listContainer.hide();
|
||||||
this.$loadingTip.show();
|
|
||||||
|
|
||||||
// the user's role in this group
|
// the user's role in this group
|
||||||
this.is_owner = false,
|
this.is_owner = false,
|
||||||
this.is_admin = false;
|
this.is_admin = false;
|
||||||
|
|
||||||
var _this = this;
|
if (app.pageOptions.username == this.group.owner) {
|
||||||
$.ajax({
|
this.is_owner = true;
|
||||||
url: Common.getUrl({
|
} else if ($.inArray(app.pageOptions.username, this.group.admins) != -1) {
|
||||||
'name': 'group',
|
this.is_admin = true;
|
||||||
'group_id': this.group.id
|
|
||||||
}),
|
|
||||||
cache: false,
|
|
||||||
dataType: 'json',
|
|
||||||
success: function(data) {
|
|
||||||
_this.group = data; // {id, name, owner, created_at, avatar_url, admins}
|
|
||||||
|
|
||||||
var username = app.pageOptions.username;
|
|
||||||
if (username == _this.group.owner) {
|
|
||||||
_this.is_owner = true;
|
|
||||||
} else if ($.inArray(username, _this.group.admins) != -1) {
|
|
||||||
_this.is_admin = true;
|
|
||||||
}
|
}
|
||||||
_this.$listContainer.html(_this.template({
|
this.$listContainer.html(this.template({
|
||||||
'is_owner': _this.is_owner,
|
'is_owner': this.is_owner,
|
||||||
'is_admin': _this.is_admin
|
'is_admin': this.is_admin,
|
||||||
|
'wiki_enabled': this.group.wiki_enabled
|
||||||
})).show();
|
})).show();
|
||||||
},
|
},
|
||||||
error: function(xhr) {
|
|
||||||
var err_msg;
|
|
||||||
if (xhr.responseText) {
|
|
||||||
err_msg = gettext('Error');
|
|
||||||
} else {
|
|
||||||
err_msg = gettext("Please check the network.");
|
|
||||||
}
|
|
||||||
_this.$error.html(err_msg).show();
|
|
||||||
},
|
|
||||||
complete: function() {
|
|
||||||
_this.$loadingTip.hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
// set max-height for '.popover-con'
|
// set max-height for '.popover-con'
|
||||||
setConMaxHeight: function() {
|
setConMaxHeight: function() {
|
||||||
@@ -102,10 +73,10 @@ define([
|
|||||||
},
|
},
|
||||||
|
|
||||||
show: function(options) {
|
show: function(options) {
|
||||||
this.group.id = options.group_id;
|
this.group = options.group;
|
||||||
this.$el.show();
|
this.$el.show();
|
||||||
this.setConMaxHeight();
|
|
||||||
this.render();
|
this.render();
|
||||||
|
this.setConMaxHeight();
|
||||||
app.router.navigate('group/' + this.group.id + '/settings/');
|
app.router.navigate('group/' + this.group.id + '/settings/');
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -130,6 +101,12 @@ define([
|
|||||||
case 'transfer':
|
case 'transfer':
|
||||||
this.transfer();
|
this.transfer();
|
||||||
break;
|
break;
|
||||||
|
case 'add-wiki':
|
||||||
|
this.toggleWiki('on');
|
||||||
|
break;
|
||||||
|
case 'remove-wiki':
|
||||||
|
this.toggleWiki('off');
|
||||||
|
break;
|
||||||
case 'import-members':
|
case 'import-members':
|
||||||
this.importMembers();
|
this.importMembers();
|
||||||
break;
|
break;
|
||||||
@@ -246,6 +223,44 @@ define([
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
toggleWiki: function(status) {
|
||||||
|
var _this = this;
|
||||||
|
var wiki_enabled;
|
||||||
|
|
||||||
|
if (status == 'on') {
|
||||||
|
wiki_enabled = 'true';
|
||||||
|
} else {
|
||||||
|
wiki_enabled = 'false';
|
||||||
|
}
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: Common.getUrl({
|
||||||
|
'name': 'group',
|
||||||
|
'group_id': _this.group.id
|
||||||
|
}),
|
||||||
|
type: 'put',
|
||||||
|
dataType: 'json',
|
||||||
|
beforeSend: Common.prepareCSRFToken,
|
||||||
|
data: {
|
||||||
|
'wiki_enabled': wiki_enabled
|
||||||
|
},
|
||||||
|
success: function() {
|
||||||
|
_this.hide();
|
||||||
|
_this.groupView.renderGroupTop();
|
||||||
|
},
|
||||||
|
error: function(xhr) {
|
||||||
|
var error_msg;
|
||||||
|
if (xhr.responseText) {
|
||||||
|
error_msg = $.parseJSON(xhr.responseText).error_msg;
|
||||||
|
} else {
|
||||||
|
error_msg = gettext("Failed. Please check the network.");
|
||||||
|
}
|
||||||
|
Common.feedback(error_msg, 'error');
|
||||||
|
_this.hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
importMembers: function() {
|
importMembers: function() {
|
||||||
var _this = this;
|
var _this = this;
|
||||||
var $form = $(this.importMembersTemplate());
|
var $form = $(this.importMembersTemplate());
|
||||||
|
@@ -21,6 +21,7 @@ define([
|
|||||||
events: {
|
events: {
|
||||||
'click #group-settings-icon': 'toggleSettingsPanel',
|
'click #group-settings-icon': 'toggleSettingsPanel',
|
||||||
'click #group-members-icon': 'toggleMembersPanel',
|
'click #group-members-icon': 'toggleMembersPanel',
|
||||||
|
'click #group-wiki-icon': 'showGroupWiki',
|
||||||
'click .repo-create': 'createRepo',
|
'click .repo-create': 'createRepo',
|
||||||
'click .by-name': 'sortByName',
|
'click .by-name': 'sortByName',
|
||||||
'click .by-time': 'sortByTime'
|
'click .by-time': 'sortByTime'
|
||||||
@@ -34,6 +35,8 @@ define([
|
|||||||
this.$loadingTip = this.$('#group-repos .loading-tip');
|
this.$loadingTip = this.$('#group-repos .loading-tip');
|
||||||
this.$emptyTip = this.$('#group-repos .empty-tips');
|
this.$emptyTip = this.$('#group-repos .empty-tips');
|
||||||
|
|
||||||
|
this.group = {}; // will be fetched when rendering the top bar
|
||||||
|
|
||||||
this.repos = new GroupRepos();
|
this.repos = new GroupRepos();
|
||||||
this.listenTo(this.repos, 'add', this.addOne);
|
this.listenTo(this.repos, 'add', this.addOne);
|
||||||
this.listenTo(this.repos, 'reset', this.reset);
|
this.listenTo(this.repos, 'reset', this.reset);
|
||||||
@@ -42,7 +45,6 @@ define([
|
|||||||
|
|
||||||
this.membersView = new GroupMembersView();
|
this.membersView = new GroupMembersView();
|
||||||
this.settingsView = new GroupSettingsView({
|
this.settingsView = new GroupSettingsView({
|
||||||
sideNavView: options.sideNavView,
|
|
||||||
groupView: this
|
groupView: this
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@@ -90,6 +92,7 @@ define([
|
|||||||
cache: false,
|
cache: false,
|
||||||
dataType: 'json',
|
dataType: 'json',
|
||||||
success: function (data) {
|
success: function (data) {
|
||||||
|
_this.group = data;
|
||||||
$groupTop.html(_this.groupTopTemplate(data));
|
$groupTop.html(_this.groupTopTemplate(data));
|
||||||
},
|
},
|
||||||
error: function(xhr) {
|
error: function(xhr) {
|
||||||
@@ -206,7 +209,7 @@ define([
|
|||||||
|
|
||||||
showSettings: function() {
|
showSettings: function() {
|
||||||
this.settingsView.show({
|
this.settingsView.show({
|
||||||
'group_id': this.group_id
|
'group': this.group
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -219,6 +222,10 @@ define([
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
showGroupWiki: function() {
|
||||||
|
location.href = '/group/' + this.group.id + '/wiki/';
|
||||||
|
},
|
||||||
|
|
||||||
showMembers: function() {
|
showMembers: function() {
|
||||||
this.membersView.show({'group_id': this.group_id});
|
this.membersView.show({'group_id': this.group_id});
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user