1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-24 09:41:04 +00:00

add publish wiki config (#7205)

* add publish wiki config

* update test

* update can_create_wiki

* update test

---------

Co-authored-by: 孙永强 <11704063+s-yongqiang@user.noreply.gitee.com>
This commit is contained in:
awu0403 2024-12-19 15:14:45 +08:00 committed by GitHub
parent bd013174a9
commit b3aaba6ea2
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
12 changed files with 40 additions and 24 deletions

View File

@ -3,7 +3,7 @@ import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import dayjs from 'dayjs'; import dayjs from 'dayjs';
import relativeTime from 'dayjs/plugin/relativeTime'; import relativeTime from 'dayjs/plugin/relativeTime';
import { siteRoot, gettext, username } from '../../utils/constants'; import { siteRoot, gettext, username, canPublishWiki } from '../../utils/constants';
import ModalPortal from '../modal-portal'; import ModalPortal from '../modal-portal';
import DeleteWikiDialog from '../dialog/delete-wiki-dialog'; import DeleteWikiDialog from '../dialog/delete-wiki-dialog';
import RenameWikiDialog from '../dialog/rename-wiki-dialog'; import RenameWikiDialog from '../dialog/rename-wiki-dialog';
@ -245,7 +245,7 @@ class WikiCardItem extends Component {
<DropdownMenu right={true} className="dtable-dropdown-menu"> <DropdownMenu right={true} className="dtable-dropdown-menu">
{showRename && {showRename &&
<DropdownItem onClick={this.onRenameToggle}>{gettext('Rename')}</DropdownItem>} <DropdownItem onClick={this.onRenameToggle}>{gettext('Rename')}</DropdownItem>}
{showPublish && {showPublish && canPublishWiki &&
<DropdownItem onClick={this.onPublishToggle}>{gettext('Publish')}</DropdownItem>} <DropdownItem onClick={this.onPublishToggle}>{gettext('Publish')}</DropdownItem>}
{showShare && {showShare &&
<DropdownItem onClick={this.onShareToggle}>{gettext('Share')}</DropdownItem> <DropdownItem onClick={this.onShareToggle}>{gettext('Share')}</DropdownItem>

View File

@ -1,6 +1,6 @@
import React, { Component } from 'react'; import React, { Component } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { gettext, username, canPublishRepo, isPro } from '../../utils/constants'; import { gettext, username, canCreateWiki, isPro } from '../../utils/constants';
import WikiCardGroup from './wiki-card-group'; import WikiCardGroup from './wiki-card-group';
import wikiAPI from '../../utils/wiki-api'; import wikiAPI from '../../utils/wiki-api';
import { Utils } from '../../utils/utils'; import { Utils } from '../../utils/utils';
@ -30,7 +30,7 @@ class WikiCardView extends Component {
} }
componentDidMount() { componentDidMount() {
if (!canPublishRepo || !isPro) return; if (!canCreateWiki || !isPro) return;
let departmentMap = {}; let departmentMap = {};
wikiAPI.listWikiDepartments().then(res => { wikiAPI.listWikiDepartments().then(res => {
res.data.forEach(item => departmentMap[item.id] = true); res.data.forEach(item => departmentMap[item.id] = true);
@ -88,7 +88,7 @@ class WikiCardView extends Component {
title={gettext('My Wikis')} title={gettext('My Wikis')}
isDepartment={false} isDepartment={false}
isShowAvatar={false} isShowAvatar={false}
toggleAddWikiDialog={canPublishRepo ? toggleAddWikiDialog.bind(this, null) : null} toggleAddWikiDialog={canCreateWiki ? toggleAddWikiDialog.bind(this, null) : null}
/> />
); );
wikiCardGroups.push( wikiCardGroups.push(
@ -122,7 +122,7 @@ class WikiCardView extends Component {
title={groupWiki.group_name} title={groupWiki.group_name}
isDepartment={true} isDepartment={true}
isShowAvatar={false} isShowAvatar={false}
toggleAddWikiDialog={(canPublishRepo && this.state.departmentMap[groupWiki.group_id]) ? toggleAddWikiDialog.bind(this, groupWiki.group_id) : null} toggleAddWikiDialog={(canCreateWiki && this.state.departmentMap[groupWiki.group_id]) ? toggleAddWikiDialog.bind(this, groupWiki.group_id) : null}
/> />
); );
} }

View File

@ -1,7 +1,7 @@
import React, { Component, Fragment } from 'react'; import React, { Component, Fragment } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';
import { gettext, canPublishRepo } from '../../utils/constants'; import { gettext, canCreateWiki } from '../../utils/constants';
import { Utils } from '../../utils/utils'; import { Utils } from '../../utils/utils';
import toaster from '../../components/toast'; import toaster from '../../components/toast';
import ModalPortal from '../../components/modal-portal'; import ModalPortal from '../../components/modal-portal';
@ -337,7 +337,7 @@ class Wikis extends Component {
<div className="cur-view-path"> <div className="cur-view-path">
<div className="path-container"> <div className="path-container">
<h3 className="sf-heading m-0">{gettext('Wikis')}</h3> <h3 className="sf-heading m-0">{gettext('Wikis')}</h3>
{canPublishRepo && {canCreateWiki &&
<Dropdown <Dropdown
direction="down" direction="down"
className="add-wiki-dropdown" className="add-wiki-dropdown"

View File

@ -67,7 +67,8 @@ export const uploadLinkExpireDaysMax = window.app.pageOptions.uploadLinkExpireDa
export const uploadLinkExpireDaysDefault = window.app.pageOptions.uploadLinkExpireDaysDefault; export const uploadLinkExpireDaysDefault = window.app.pageOptions.uploadLinkExpireDaysDefault;
export const enableShareToDepartment = window.app.pageOptions.enableShareToDepartment; export const enableShareToDepartment = window.app.pageOptions.enableShareToDepartment;
export const maxFileName = window.app.pageOptions.maxFileName; export const maxFileName = window.app.pageOptions.maxFileName;
export const canPublishRepo = window.app.pageOptions.canPublishRepo; export const canCreateWiki = window.app.pageOptions.canCreateWiki;
export const canPublishWiki = window.app.pageOptions.canPublishWiki;
export const enableEncryptedLibrary = window.app.pageOptions.enableEncryptedLibrary; export const enableEncryptedLibrary = window.app.pageOptions.enableEncryptedLibrary;
export const enableRepoHistorySetting = window.app.pageOptions.enableRepoHistorySetting; export const enableRepoHistorySetting = window.app.pageOptions.enableRepoHistorySetting;
export const enableUserCleanTrash = window.app.pageOptions.enableUserCleanTrash; export const enableUserCleanTrash = window.app.pageOptions.enableUserCleanTrash;

View File

@ -186,6 +186,9 @@ class Wikis2View(APIView):
if not request.user.permissions.can_add_repo(): if not request.user.permissions.can_add_repo():
return api_error(status.HTTP_403_FORBIDDEN, 'You do not have permission to create library.') return api_error(status.HTTP_403_FORBIDDEN, 'You do not have permission to create library.')
if not request.user.permissions.can_create_wiki():
return api_error(status.HTTP_403_FORBIDDEN, 'You do not have permission to create wiki.')
wiki_name = request.data.get("name", None) wiki_name = request.data.get("name", None)
if not wiki_name: if not wiki_name:
@ -1239,6 +1242,10 @@ class Wiki2PublishView(APIView):
error_msg = _('The custom part of URL should have 5-30 characters.') error_msg = _('The custom part of URL should have 5-30 characters.')
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
if not request.user.permissions.can_publish_wiki():
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)
wiki = Wiki.objects.get(wiki_id=wiki_id) wiki = Wiki.objects.get(wiki_id=wiki_id)
if not wiki: if not wiki:
error_msg = "Wiki not found." error_msg = "Wiki not found."

View File

@ -99,7 +99,7 @@ class WikisView(APIView):
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
# check perm # check perm
if not (request.user.permissions.can_publish_repo() and request.user.permissions.can_generate_share_link()): if not (request.user.permissions.can_create_wiki() and request.user.permissions.can_generate_share_link()):
error_msg = 'Permission denied.' error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg) return api_error(status.HTTP_403_FORBIDDEN, error_msg)

View File

@ -440,11 +440,16 @@ class UserPermissions(object):
def storage_ids(self): def storage_ids(self):
return self._get_perm_by_roles('storage_ids') return self._get_perm_by_roles('storage_ids')
def can_publish_repo(self): def can_create_wiki(self):
if not settings.ENABLE_WIKI: if not settings.ENABLE_WIKI:
return False return False
return self._get_perm_by_roles('can_publish_repo') return self._get_perm_by_roles('can_create_wiki')
def can_publish_wiki(self):
if not settings.ENABLE_WIKI:
return False
return self._get_perm_by_roles('can_publish_wiki')
class AdminPermissions(object): class AdminPermissions(object):

View File

@ -43,7 +43,8 @@ DEFAULT_ENABLED_ROLE_PERMISSIONS = {
'can_export_files_via_mobile_client': True, 'can_export_files_via_mobile_client': True,
'storage_ids': [], 'storage_ids': [],
'role_quota': '', 'role_quota': '',
'can_publish_repo': True, 'can_create_wiki': True,
'can_publish_wiki': True,
'upload_rate_limit': 0, 'upload_rate_limit': 0,
'download_rate_limit': 0, 'download_rate_limit': 0,
}, },
@ -65,7 +66,8 @@ DEFAULT_ENABLED_ROLE_PERMISSIONS = {
'can_export_files_via_mobile_client': False, 'can_export_files_via_mobile_client': False,
'storage_ids': [], 'storage_ids': [],
'role_quota': '', 'role_quota': '',
'can_publish_repo': False, 'can_create_wiki': False,
'can_publish_wiki': False,
'upload_rate_limit': 0, 'upload_rate_limit': 0,
'download_rate_limit': 0, 'download_rate_limit': 0,
}, },

View File

@ -107,7 +107,8 @@
sideNavFooterCustomHtml: "{{ side_nav_footer_custom_html|safe|escapejs }}", sideNavFooterCustomHtml: "{{ side_nav_footer_custom_html|safe|escapejs }}",
aboutDialogCustomHtml: "{{ about_dialog_custom_html|safe|escapejs }}", aboutDialogCustomHtml: "{{ about_dialog_custom_html|safe|escapejs }}",
maxFileName: "{{ max_file_name }}", maxFileName: "{{ max_file_name }}",
canPublishRepo: {% if user.permissions.can_publish_repo %} true {% else %} false {% endif %}, canCreateWiki: {% if user.permissions.can_create_wiki %} true {% else %} false {% endif %},
canPublishWiki: {% if user.permissions.can_publish_wiki %} true {% else %} false {% endif %},
enableEncryptedLibrary: {% if enable_encrypted_library %} true {% else %} false {% endif %}, enableEncryptedLibrary: {% if enable_encrypted_library %} true {% else %} false {% endif %},
enableRepoHistorySetting: {% if enable_repo_history_setting %} true {% else %} false {% endif %}, enableRepoHistorySetting: {% if enable_repo_history_setting %} true {% else %} false {% endif %},
enableUserCleanTrash: {% if enable_user_clean_trash %} true {% else %} false {% endif %}, enableUserCleanTrash: {% if enable_user_clean_trash %} true {% else %} false {% endif %},

View File

@ -14,7 +14,7 @@ from seahub.role_permissions.settings import ENABLED_ROLE_PERMISSIONS
from seahub.test_utils import BaseTestCase from seahub.test_utils import BaseTestCase
TEST_CAN_PUBLISH_REPO_FALSE = copy.deepcopy(ENABLED_ROLE_PERMISSIONS) TEST_CAN_PUBLISH_REPO_FALSE = copy.deepcopy(ENABLED_ROLE_PERMISSIONS)
TEST_CAN_PUBLISH_REPO_FALSE['default']['can_publish_repo'] = False TEST_CAN_PUBLISH_REPO_FALSE['default']['can_create_wiki'] = False
TEST_CAN_GENERATE_SHARE_LINK = copy.deepcopy(ENABLED_ROLE_PERMISSIONS) TEST_CAN_GENERATE_SHARE_LINK = copy.deepcopy(ENABLED_ROLE_PERMISSIONS)
TEST_CAN_GENERATE_SHARE_LINK['default']['can_generate_share_link'] = False TEST_CAN_GENERATE_SHARE_LINK['default']['can_generate_share_link'] = False

View File

@ -12,7 +12,7 @@ TEST_CAN_ADD_PUBLICK_REPO_TRUE = copy.deepcopy(ENABLED_ROLE_PERMISSIONS)
TEST_CAN_ADD_PUBLICK_REPO_TRUE['default']['can_add_public_repo'] = True TEST_CAN_ADD_PUBLICK_REPO_TRUE['default']['can_add_public_repo'] = True
TEST_PUBLISH_REPO_CAN_PUBLISH_REPO_FALSE = copy.deepcopy(ENABLED_ROLE_PERMISSIONS) TEST_PUBLISH_REPO_CAN_PUBLISH_REPO_FALSE = copy.deepcopy(ENABLED_ROLE_PERMISSIONS)
TEST_PUBLISH_REPO_CAN_PUBLISH_REPO_FALSE['default']['can_publish_repo'] = False TEST_PUBLISH_REPO_CAN_PUBLISH_REPO_FALSE['default']['can_create_wiki'] = False
CLOUD_MODE_TRUE = True CLOUD_MODE_TRUE = True
MULTI_TENANCY_TRUE = True MULTI_TENANCY_TRUE = True
@ -85,20 +85,20 @@ class UserPermissionsTest(BaseTestCase):
def test_can_publish_repo_permission(self): def test_can_publish_repo_permission(self):
# enableWIKI = True, and can_publish_repo = True # enableWIKI = True, and can_publish_repo = True
assert self.user.permissions._get_perm_by_roles('can_publish_repo') is True assert self.user.permissions._get_perm_by_roles('can_create_wiki') is True
assert self.user.permissions.can_publish_repo() is True assert self.user.permissions.can_create_wiki() is True
@override_settings(ENABLE_WIKI=False) @override_settings(ENABLE_WIKI=False)
def test_can_publish_repo_permission_with_enable_wiki_False(self): def test_can_publish_repo_permission_with_enable_wiki_False(self):
# enableWIKI = False, and can_publish_repo = True # enableWIKI = False, and can_publish_repo = True
assert self.user.permissions._get_perm_by_roles('can_publish_repo') is True assert self.user.permissions._get_perm_by_roles('can_create_wiki') is True
assert self.user.permissions.can_publish_repo() is False assert self.user.permissions.can_create_wiki() is False
def test_can_publish_repo_permission_with_can_publish_repo_False(self): def test_can_publish_repo_permission_with_can_publish_repo_False(self):
# enableWIKI = True, and can_publish_repo = False # enableWIKI = True, and can_publish_repo = False
with patch('seahub.role_permissions.utils.ENABLED_ROLE_PERMISSIONS', TEST_PUBLISH_REPO_CAN_PUBLISH_REPO_FALSE): with patch('seahub.role_permissions.utils.ENABLED_ROLE_PERMISSIONS', TEST_PUBLISH_REPO_CAN_PUBLISH_REPO_FALSE):
assert self.user.permissions._get_perm_by_roles('can_publish_repo') is False assert self.user.permissions._get_perm_by_roles('can_create_wiki') is False
assert self.user.permissions.can_publish_repo() is False assert self.user.permissions.can_create_wiki() is False
class RegistrationFormTest(BaseTestCase): class RegistrationFormTest(BaseTestCase):

View File

@ -11,4 +11,4 @@ class UtilsTest(BaseTestCase):
assert DEFAULT_USER in get_available_roles() assert DEFAULT_USER in get_available_roles()
def test_get_enabled_role_permissions_by_role(self): def test_get_enabled_role_permissions_by_role(self):
assert len(list(get_enabled_role_permissions_by_role(DEFAULT_USER).keys())) == 20 assert len(list(get_enabled_role_permissions_by_role(DEFAULT_USER).keys())) == 21