1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-13 13:50:07 +00:00

Metadata views (#6203)

* wip

* wip: table finished

* wip

* feat: metadata views

* update models
This commit is contained in:
Huang Junxiang
2024-06-15 14:03:17 +08:00
committed by GitHub
parent 58875d110c
commit 8d4dbf6043
4 changed files with 110 additions and 2 deletions

View File

@@ -6,6 +6,7 @@ import toaster from '../../components/toast';
import seahubMetadataAPI from './seahub-metadata-api'; import seahubMetadataAPI from './seahub-metadata-api';
import { hideMenu, showMenu } from '../context-menu/actions'; import { hideMenu, showMenu } from '../context-menu/actions';
import TextTranslation from '../../utils/text-translation'; import TextTranslation from '../../utils/text-translation';
import { siteRoot } from '../../utils/constants';
const propTypes = { const propTypes = {
repoID: PropTypes.string.isRequired, repoID: PropTypes.string.isRequired,
@@ -103,7 +104,8 @@ class MetadataManageView extends React.Component {
}; };
viewMetadata = () => { viewMetadata = () => {
let server = siteRoot.substring(0, siteRoot.length-1);
window.open(server + '/repos/' + this.props.repoID + '/metadata/table-view/', '_blank');
}; };
render() { render() {
@@ -120,7 +122,7 @@ class MetadataManageView extends React.Component {
onClick={this.onClick} onClick={this.onClick}
onContextMenu={this.onItemContextMenu} onContextMenu={this.onItemContextMenu}
> >
<div className="tree-node-text">{gettext('Metadata View')} <div className="tree-node-text">{gettext('Metadata Views')}
<div className="left-icon"> <div className="left-icon">
<i className="tree-node-icon"> <i className="tree-node-icon">
<span class="sf2-icon-cog2" aria-hidden="true" /> <span class="sf2-icon-cog2" aria-hidden="true" />

View File

@@ -0,0 +1,51 @@
from seahub.views import check_folder_permission
from seaserv import seafile_api
from seahub.auth.decorators import login_required
from seahub.base.decorators import repo_passwd_set_required
from django.http import Http404, HttpResponseBadRequest, HttpResponseForbidden, HttpResponseServerError
from seahub.api2.endpoints.metadata_manage import list_metadata_records
from seahub.repo_metadata.models import RepoMetadata
from django.shortcuts import render
@login_required
@repo_passwd_set_required
def view_metadata(request, repo_id):
template = 'metadata_table.html'
# metadata enable check
record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled:
return HttpResponseBadRequest(f'The metadata module is not enable for repo {repo_id}.')
# recource check
repo = seafile_api.get_repo(repo_id)
if not repo:
raise Http404
# permission check
permission = check_folder_permission(request, repo_id, '/')
if not permission:
return HttpResponseForbidden('Permission denied.')
try:
results = list_metadata_records(repo_id, request.user.username)
except Exception as err:
return HttpResponseServerError(repr(err))
for result in results:
#preprocess creator and modifier
if result['creator'] == '':
result['creator'] = '-----------'
if result['modifier'] == '':
result['modifier'] = '-----------'
#preprocess _id
result['id'] = result['_id']
del result['_id']
return_dict = {
'metadata_records': results
}
return render(request, template, return_dict)

View File

@@ -0,0 +1,53 @@
{% extends "base.html" %}
{% load i18n %}
{% block main_panel %}
<div style="display: flex; justify-content: center; align-items: center; height: 100vh; margin: 0;">
<table style="border-collapse: collapse; width: 100%; max-width: 800px;">
<thead>
<tr>
<th style="border: 1px solid black; padding: 8px; text-align: center;">id</th>
<th style="border: 1px solid black; padding: 8px; text-align: center;">Creator</th>
<th style="border: 1px solid black; padding: 8px; text-align: center;">Created Time</th>
<th style="border: 1px solid black; padding: 8px; text-align: center;">Modifier</th>
<th style="border: 1px solid black; padding: 8px; text-align: center;">Modified Time</th>
<th style="border: 1px solid black; padding: 8px; text-align: center;">Parent Folder</th>
<th style="border: 1px solid black; padding: 8px; text-align: center;">Name</th>
<th style="border: 1px solid black; padding: 8px; text-align: center;">Is Folder</th>
</tr>
</thead>
<tbody>
{% for record in metadata_records %}
<tr>
<td style="border: 1px solid black; padding: 8px;">{{ record.id }}</td>
<td style="border: 1px solid black; padding: 8px;">{{ record.creator }}</td>
<td style="border: 1px solid black; padding: 8px;">{{ record.created_time }}</td>
<td style="border: 1px solid black; padding: 8px;">{{ record.modifier }}</td>
<td style="border: 1px solid black; padding: 8px;">{{ record.modified_time }}</td>
<td style="border: 1px solid black; padding: 8px;">{{ record.parent_dir }}</td>
<td style="border: 1px solid black; padding: 8px;">{{ record.name }}</td>
<td style="border: 1px solid black; padding: 8px;">{{ record.is_dir|yesno:"Yes,No" }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
{% block extra_script %}
<script type="text/javascript">
window.app.metadatas = [];
{% for record in metadata_records %}
window.app.metadatas.push({
id: '{{ record.id }}',
creator: '{{ record.creator }}',
createdTime: '{{ record.created_time }}',
modifier: '{{ record.creator }}',
modifiedTime: '{{ record.modified_time }}',
parentDir: '{{ record.parent_dir }}',
name: '{{ record.name }}',
isDir: '{{ record.is_dir }}',
});
{% endfor %}
</script>
{% endblock %}

View File

@@ -204,6 +204,7 @@ from seahub.ocm.settings import OCM_ENDPOINT
from seahub.ai.apis import LibrarySdocIndexes, Search, LibrarySdocIndex, TaskStatus, \ from seahub.ai.apis import LibrarySdocIndexes, Search, LibrarySdocIndex, TaskStatus, \
LibraryIndexState, QuestionAnsweringSearchInLibrary, FileDownloadToken LibraryIndexState, QuestionAnsweringSearchInLibrary, FileDownloadToken
from seahub.wiki2.views import wiki_view from seahub.wiki2.views import wiki_view
from seahub.repo_metadata.views import view_metadata
from seahub.api2.endpoints.wiki2 import Wikis2View, Wiki2View, Wiki2ConfigView, Wiki2PagesView, Wiki2PageView from seahub.api2.endpoints.wiki2 import Wikis2View, Wiki2View, Wiki2ConfigView, Wiki2PagesView, Wiki2PageView
from seahub.api2.endpoints.subscription import SubscriptionView, SubscriptionPlansView, SubscriptionLogsView from seahub.api2.endpoints.subscription import SubscriptionView, SubscriptionPlansView, SubscriptionLogsView
from seahub.api2.endpoints.metadata_manage import MetadataRecords, MetadataManage, MetadataRecord from seahub.api2.endpoints.metadata_manage import MetadataRecords, MetadataManage, MetadataRecord
@@ -1028,4 +1029,5 @@ if settings.ENABLE_METADATA_MANAGEMENT:
re_path(r'^api/v2.1/repos/(?P<repo_id>[-0-9a-f]{36})/metadata/$', MetadataManage.as_view(), name='api-v2.1-metadata'), re_path(r'^api/v2.1/repos/(?P<repo_id>[-0-9a-f]{36})/metadata/$', MetadataManage.as_view(), name='api-v2.1-metadata'),
re_path(r'^api/v2.1/repos/(?P<repo_id>[-0-9a-f]{36})/metadata/records/$', MetadataRecords.as_view(), name='api-v2.1-metadata-records'), re_path(r'^api/v2.1/repos/(?P<repo_id>[-0-9a-f]{36})/metadata/records/$', MetadataRecords.as_view(), name='api-v2.1-metadata-records'),
re_path(r'^api/v2.1/repos/(?P<repo_id>[-0-9a-f]{36})/metadata/records/(?P<record_id>[A-Za-z0-9_-]+)/$', MetadataRecord.as_view(), name='api-v2.1-metadata-record'), re_path(r'^api/v2.1/repos/(?P<repo_id>[-0-9a-f]{36})/metadata/records/(?P<record_id>[A-Za-z0-9_-]+)/$', MetadataRecord.as_view(), name='api-v2.1-metadata-record'),
re_path(r'^repos/(?P<repo_id>[-0-9a-f]{36})/metadata/table-view/$', view_metadata, name='view_metadata'),
] ]