Skip to content

Commit

Permalink
12.0 change sdoc content (#6121)
Browse files Browse the repository at this point in the history
* fix warnings in 12.0

* get wiki sdoc content from sdoc server

* optimize code

* change page search params

* Add repo_name for wiki name

---------

Co-authored-by: ‘JoinTyang’ <[email protected]>
  • Loading branch information
Michael18811380328 and JoinTyang authored May 29, 2024
1 parent b76bad3 commit 96aa207
Show file tree
Hide file tree
Showing 9 changed files with 177 additions and 58 deletions.
75 changes: 61 additions & 14 deletions frontend/src/pages/wiki2/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import MediaQuery from 'react-responsive';
import { Modal } from 'reactstrap';
import { Utils } from '../../utils/utils';
import wikiAPI from '../../utils/wiki-api';
import { slug, wikiId, siteRoot, initialPath, isDir, sharedToken, hasIndex, lang, isWiki2, gettext } from '../../utils/constants';
import SDocServerApi from '../../utils/sdoc-server-api';
import { slug, wikiId, siteRoot, initialPath, isDir, sharedToken, hasIndex, lang, isWiki2, seadocServerUrl } from '../../utils/constants';
import Dirent from '../../models/dirent';
import WikiConfig from './models/wiki-config';
import TreeNode from '../../components/tree-view/tree-node';
Expand Down Expand Up @@ -33,7 +34,7 @@ class Wiki extends Component {
isViewFile: true,
isDataLoading: false,
direntList: [],
content: '',
editorContent: {},
permission: '',
lastModified: '',
latestContributor: '',
Expand All @@ -47,7 +48,6 @@ class Wiki extends Component {
config: new WikiConfig({}),
repoId: '',
seadoc_access_token: '',
docUuid: '',
assets_url: '',
};

Expand Down Expand Up @@ -200,24 +200,41 @@ class Wiki extends Component {
window.history.pushState({ url: fileUrl, path: dirPath }, dirPath, fileUrl);
};

getSdocFileContent = (docUuid, accessToken) => {
const config = {
docUuid,
sdocServer: seadocServerUrl,
accessToken,
};
const sdocServerApi = new SDocServerApi(config);
sdocServerApi.getDocContent().then(res => {
this.setState({
isDataLoading: false,
editorContent: res.data,
});
}).catch(error => {
let errorMsg = Utils.getErrorMsg(error);
toaster.danger(errorMsg);
});
};

showFile = (filePath) => {
this.setState({
isDataLoading: true,
});
this.removePythonWrapper();
wikiAPI.getWiki2FileContent(wikiId, filePath).then(res => {
let data = res.data;
const { permission, last_modified, latest_contributor, seadoc_access_token, assets_url } = res.data;
this.setState({
isDataLoading: false,
content: data.content,
permission: data.permission,
lastModified: moment.unix(data.last_modified).fromNow(),
latestContributor: data.latest_contributor,
seadoc_access_token: data.seadoc_access_token,
assets_url: data.assets_url,
permission,
lastModified: moment.unix(last_modified).fromNow(),
latestContributor: latest_contributor,
seadoc_access_token,
assets_url,
isViewFile: true,
path: filePath,
});
const docUuid = assets_url.slice(assets_url.lastIndexOf('/') + 1);
this.getSdocFileContent(docUuid, seadoc_access_token);
}).catch(error => {
let errorMsg = Utils.getErrorMsg(error);
toaster.danger(errorMsg);
Expand Down Expand Up @@ -541,6 +558,36 @@ class Wiki extends Component {
node.addChildren(nodeList);
};

showPage = (pageId, filePath) => {
this.setState({
isDataLoading: true,
});

this.removePythonWrapper();
wikiAPI.getWiki2Page(wikiId, pageId).then(res => {
const { permission, last_modified, latest_contributor, seadoc_access_token, assets_url } = res.data;
this.setState({
permission,
lastModified: moment.unix(last_modified).fromNow(),
latestContributor: latest_contributor,
seadoc_access_token,
assets_url,
isViewFile: true,
path: filePath,
});
const docUuid = assets_url.slice(assets_url.lastIndexOf('/') + 1);
this.getSdocFileContent(docUuid, seadoc_access_token);
}).catch(error => {
let errorMsg = Utils.getErrorMsg(error);
toaster.danger(errorMsg);
});

const params = new URLSearchParams(window.location.search);
params.set('page_id', pageId);
const fileUrl = `${siteRoot}${this.handlePath()}${wikiId}/?${params.toString()}`;
window.history.pushState({ url: fileUrl, path: filePath }, filePath, fileUrl);
};

setCurrentPage = (pageId, callback) => {
const { currentPageId, config } = this.state;
if (pageId === currentPageId) {
Expand All @@ -552,7 +599,7 @@ class Wiki extends Component {
const path = currentPage.path;
if (Utils.isMarkdownFile(path) || Utils.isSdocFile(path)) {
if (path !== this.state.path) {
this.showFile(path);
this.showPage(pageId, path);
}
this.onCloseSide();
} else {
Expand Down Expand Up @@ -602,7 +649,7 @@ class Wiki extends Component {
pathExist={this.state.pathExist}
isViewFile={this.state.isViewFile}
isDataLoading={this.state.isDataLoading}
content={this.state.content}
editorContent={this.state.editorContent}
permission={this.state.permission}
lastModified={this.state.lastModified}
latestContributor={this.state.latestContributor}
Expand Down
8 changes: 3 additions & 5 deletions frontend/src/pages/wiki2/main-panel.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ const propTypes = {
pathExist: PropTypes.bool.isRequired,
isViewFile: PropTypes.bool.isRequired,
isDataLoading: PropTypes.bool.isRequired,
content: PropTypes.string,
editorContent: PropTypes.object,
permission: PropTypes.string,
lastModified: PropTypes.string,
latestContributor: PropTypes.string,
Expand Down Expand Up @@ -103,13 +103,11 @@ class MainPanel extends Component {

render() {
const errMessage = (<div className="message err-tip">{gettext('Folder does not exist.')}</div>);
const { content, permission, pathExist, isDataLoading, isViewFile } = this.props;
const { permission, pathExist, isDataLoading, isViewFile } = this.props;
const isViewingFile = pathExist && !isDataLoading && isViewFile;
const editorContent = content && JSON.parse(content);
const isReadOnly = !(permission === 'rw');
return (
<div className="wiki2-main-panel">
<div className="main-panel-hide hide">{this.props.content}</div>
<div className='wiki2-main-panel-north'>
<WikiTopNav
config={this.props.config}
Expand All @@ -125,7 +123,7 @@ class MainPanel extends Component {
{this.props.pathExist && this.props.isDataLoading && <Loading />}
{isViewingFile && Utils.isSdocFile(this.props.path) && (
<SdocWikiViewer
document={editorContent}
document={this.props.editorContent}
showOutline={false}
showToolbar={false}
docUuid={this.state.docUuid}
Expand Down
2 changes: 2 additions & 0 deletions frontend/src/utils/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,8 @@ export const sharedType = window.wiki ? window.wiki.config.sharedType : '';
export const hasIndex = window.wiki ? window.wiki.config.hasIndex : '';
export const assetsUrl = window.wiki ? window.wiki.config.assetsUrl : '';
export const isWiki2 = window.wiki ? window.wiki.config.isWiki2 : false;
export const seadocServerUrl = window.wiki ? window.wiki.config.seadocServerUrl : '';
export const seadocAccessToken = window.wiki ? window.wiki.config.seadocAccessToken : '';

// file history
export const PER_PAGE = 25;
Expand Down
19 changes: 19 additions & 0 deletions frontend/src/utils/sdoc-server-api.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import axios from 'axios';

class SDocServerApi {

constructor(options) {
this.server = options.sdocServer;
this.docUuid = options.docUuid;
this.accessToken = options.accessToken;
}

getDocContent() {
const { server, docUuid, accessToken } = this;
const url = `${server}/api/v1/docs/${docUuid}/`;
return axios.get(url, { headers: { Authorization: `Token ${accessToken}` } });
}

}

export default SDocServerApi;
6 changes: 5 additions & 1 deletion frontend/src/utils/wiki-api.js
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,6 @@ class WikiAPI {
}

deleteWiki2Page(wikiId, pageId) {
// const path = encodeURIComponent(pagePath);
const url = this.server + '/api/v2.1/wiki2/' + wikiId + '/page/' + pageId + '/';
return this.req.delete(url);
}
Expand All @@ -199,6 +198,11 @@ class WikiAPI {
return this.req.delete(url);
}

getWiki2Page(wikiId, pageId) {
const url = this.server + '/api/v2.1/wiki2/' + wikiId + '/page/' + pageId + '/';
return this.req.get(url);
}

}

let wikiAPI = new WikiAPI();
Expand Down
68 changes: 68 additions & 0 deletions seahub/api2/endpoints/wiki2.py
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,70 @@ class Wiki2PageView(APIView):
permission_classes = (IsAuthenticated, )
throttle_classes = (UserRateThrottle, )

def get(self, request, wiki_id, page_id):

try:
wiki = Wiki.objects.get(id=wiki_id)
except Wiki.DoesNotExist:
error_msg = "Wiki not found."
return api_error(status.HTTP_404_NOT_FOUND, error_msg)

username = request.user.username
if not check_wiki_permission(wiki, username):
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)

repo_id = wiki.repo_id
repo = seafile_api.get_repo(repo_id)
if not repo:
error_msg = 'Library %s not found.' % repo_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg)

wiki_config = get_wiki_config(repo_id, username)
pages = wiki_config.get('pages', [])
page_info = next(filter(lambda t: t['id'] == page_id, pages), {})
path = page_info.get('path')
doc_uuid = page_info.get('docUuid')

permission = check_folder_permission(request, wiki.repo_id, '/')
if not permission:
error_msg = 'Permission denied.'
return api_error(status.HTTP_403_FORBIDDEN, error_msg)

try:
file_id = seafile_api.get_file_id_by_path(repo.repo_id, path)
except SearpcError as e:
logger.error(e)
return api_error(HTTP_520_OPERATION_FAILED,
"Failed to get file id by path.")
if not file_id:
return api_error(status.HTTP_404_NOT_FOUND, "File not found")

# send stats message
send_file_access_msg(request, repo, path, 'api')

filename = os.path.basename(path)
try:
dirent = seafile_api.get_dirent_by_path(repo.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

assets_url = '/api/v2.1/seadoc/download-image/' + doc_uuid
seadoc_access_token = gen_seadoc_access_token(doc_uuid, filename, request.user.username, permission=permission)

return Response({
"latest_contributor": email2nickname(latest_contributor),
"last_modified": last_modified,
"permission": permission,
"seadoc_access_token": seadoc_access_token,
"assets_url": assets_url,
})

def delete(self, request, wiki_id, page_id):
try:
wiki = Wiki.objects.get(id=wiki_id)
Expand All @@ -579,6 +643,10 @@ def delete(self, request, wiki_id, page_id):
page_info = next(filter(lambda t: t['id'] == page_id, pages), {})
path = page_info.get('path')

if not page_info:
error_msg = 'page %s not found.' % page_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg)

# check file lock
try:
is_locked, locked_by_me = check_file_lock(repo_id, path, username)
Expand Down
3 changes: 0 additions & 3 deletions seahub/templates/wiki/wiki_edit.html
Original file line number Diff line number Diff line change
Expand Up @@ -43,12 +43,9 @@
window.wiki = {
config: {
wikiId: "{{ wiki.id }}",
repoId: "{{ wiki.repo_id }}",
repoName: "{{ wiki.name }}",
initial_path: "{{ file_path|escapejs }}",
isDir: "{{ is_dir }}",
isWiki2: true,
assetsUrl: "{{ assets_url }}",
seadocServerUrl: "{{ seadoc_server_url }}",
seadocAccessToken: "{{ seadoc_access_token }}",
permission: "{{ permission }}",
Expand Down
2 changes: 1 addition & 1 deletion seahub/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -712,7 +712,7 @@
re_path(r'^api/v2.1/admin/invitations/$', AdminInvitations.as_view(), name='api-v2.1-admin-invitations'),
re_path(r'^api/v2.1/admin/invitations/(?P<token>[a-f0-9]{32})/$', AdminInvitation.as_view(), name='api-v2.1-admin-invitation'),

re_path(r'^wikis/(?P<wiki_id>[^/]+)/(?P<file_path>.*)$', wiki_view, name='wiki'),
re_path(r'^wikis/(?P<wiki_id>[^/]+)/$', wiki_view, name='wiki'),

path('avatar/', include('seahub.avatar.urls')),
path('notice/', include('seahub.notifications.urls')),
Expand Down
Loading

0 comments on commit 96aa207

Please sign in to comment.