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

add_deleted_tags_and_lang (#7150)

* add_deleted_tags_and_lang

* update

* update

---------

Co-authored-by: zheng.shen <zheng.shen@seafile.com>
This commit is contained in:
shenzheng-1
2024-12-06 17:34:54 +08:00
committed by GitHub
parent cfdc87c54e
commit 21c9be56a8
8 changed files with 85 additions and 18 deletions

View File

@@ -44,7 +44,7 @@ const LibSettingsDialog = ({ repoID, currentRepoInfo, toggleDialog, tab }) => {
const { encrypted, is_admin } = currentRepoInfo; const { encrypted, is_admin } = currentRepoInfo;
const { enableMetadataManagement } = window.app.pageOptions; const { enableMetadataManagement } = window.app.pageOptions;
const { enableFaceRecognition, updateEnableFaceRecognition } = useMetadata(); const { enableFaceRecognition, updateEnableFaceRecognition } = useMetadata();
const { enableMetadata, updateEnableMetadata, enableTags, updateEnableTags } = useMetadataStatus(); const { enableMetadata, updateEnableMetadata, enableTags, tagsLang, updateEnableTags } = useMetadataStatus();
const enableHistorySetting = is_admin; // repo owner, admin of the department which the repo belongs to, and ... const enableHistorySetting = is_admin; // repo owner, admin of the department which the repo belongs to, and ...
const enableAutoDelSetting = is_admin && enableRepoAutoDel; const enableAutoDelSetting = is_admin && enableRepoAutoDel;
const enableExtendedPropertiesSetting = !encrypted && is_admin && enableMetadataManagement; const enableExtendedPropertiesSetting = !encrypted && is_admin && enableMetadataManagement;
@@ -139,6 +139,7 @@ const LibSettingsDialog = ({ repoID, currentRepoInfo, toggleDialog, tab }) => {
<LibMetadataTagsStatusSettingPanel <LibMetadataTagsStatusSettingPanel
repoID={repoID} repoID={repoID}
value={enableTags} value={enableTags}
lang={tagsLang}
submit={updateEnableTags} submit={updateEnableTags}
toggleDialog={toggleDialog} toggleDialog={toggleDialog}
/> />

View File

@@ -16,6 +16,7 @@ export const MetadataStatusProvider = ({ repoID, currentRepoInfo, hideMetadataVi
const [isLoading, setLoading] = useState(true); const [isLoading, setLoading] = useState(true);
const [enableMetadata, setEnableMetadata] = useState(false); const [enableMetadata, setEnableMetadata] = useState(false);
const [enableTags, setEnableTags] = useState(false); const [enableTags, setEnableTags] = useState(false);
const [tagsLang, setTagsLang] = useState(null);
const [isBeingBuilt, setIsBeingBuilt] = useState(false); const [isBeingBuilt, setIsBeingBuilt] = useState(false);
const cancelMetadataURL = useCallback(() => { const cancelMetadataURL = useCallback(() => {
@@ -36,11 +37,12 @@ export const MetadataStatusProvider = ({ repoID, currentRepoInfo, hideMetadataVi
return; return;
} }
metadataAPI.getMetadataStatus(repoID).then(res => { metadataAPI.getMetadataStatus(repoID).then(res => {
const { enabled: enableMetadata, tags_enabled: enableTags } = res.data; const { enabled: enableMetadata, tags_enabled: enableTags, tags_lang: tagsLang } = res.data;
if (!enableMetadata) { if (!enableMetadata) {
cancelMetadataURL(); cancelMetadataURL();
} }
setEnableTags(enableTags); setEnableTags(enableTags);
setTagsLang(tagsLang);
setEnableMetadata(enableMetadata); setEnableMetadata(enableMetadata);
setLoading(false); setLoading(false);
}).catch(error => { }).catch(error => {
@@ -62,14 +64,15 @@ export const MetadataStatusProvider = ({ repoID, currentRepoInfo, hideMetadataVi
setEnableMetadata(newValue); setEnableMetadata(newValue);
}, [enableMetadata, cancelMetadataURL]); }, [enableMetadata, cancelMetadataURL]);
const updateEnableTags = useCallback((newValue) => { const updateEnableTags = useCallback((newValue, lang = 'en') => {
if (newValue === enableTags) return; if (newValue === enableTags && lang === tagsLang) return;
if (!newValue) { if (!newValue) {
cancelMetadataURL(); cancelMetadataURL();
hideMetadataView && hideMetadataView(); hideMetadataView && hideMetadataView();
} }
setEnableTags(newValue); setEnableTags(newValue);
}, [enableTags, cancelMetadataURL, hideMetadataView]); setTagsLang(lang);
}, [enableTags, tagsLang, cancelMetadataURL, hideMetadataView]);
return ( return (
<EnableMetadataContext.Provider <EnableMetadataContext.Provider
@@ -80,6 +83,7 @@ export const MetadataStatusProvider = ({ repoID, currentRepoInfo, hideMetadataVi
updateEnableMetadata, updateEnableMetadata,
setIsBeingBuilt, setIsBeingBuilt,
enableTags, enableTags,
tagsLang,
updateEnableTags, updateEnableTags,
}} }}
> >

View File

@@ -0,0 +1,10 @@
.tags-language-container {
display: flex;
align-items: center;
}
.tags-language-container .tags-language-selector {
width: 200px;
margin-top: 10px;
margin-left: 10px;
}

View File

@@ -8,11 +8,24 @@ import tagsAPI from '../../../../tag/api';
import toaster from '../../../../components/toast'; import toaster from '../../../../components/toast';
import { Utils } from '../../../../utils/utils'; import { Utils } from '../../../../utils/utils';
import TurnOffConfirmDialog from './turn-off-confirm'; import TurnOffConfirmDialog from './turn-off-confirm';
import { SeahubSelect } from '../../../../components/common/select';
// import './index.css'; import './index.css';
const MetadataTagsStatusDialog = ({ value: oldValue, repoID, toggleDialog: toggle, submit }) => { const langOptions = [
{
value: 'zh-cn',
label: '简体中文'
},
{
value: 'en',
label: 'English'
}
];
const MetadataTagsStatusDialog = ({ value: oldValue, lang: oldLang, repoID, toggleDialog: toggle, submit }) => {
const [value, setValue] = useState(oldValue); const [value, setValue] = useState(oldValue);
const [lang, setLang] = useState({ value: oldLang || 'en', label: langOptions.find(item => item.value === oldLang).label });
const [submitting, setSubmitting] = useState(false); const [submitting, setSubmitting] = useState(false);
const [showTurnOffConfirmDialog, setShowTurnOffConfirmDialog] = useState(false); const [showTurnOffConfirmDialog, setShowTurnOffConfirmDialog] = useState(false);
@@ -26,15 +39,15 @@ const MetadataTagsStatusDialog = ({ value: oldValue, repoID, toggleDialog: toggl
return; return;
} }
setSubmitting(true); setSubmitting(true);
tagsAPI.openTags(repoID).then(res => { tagsAPI.openTags(repoID, lang.value).then(res => {
submit(true); submit(true, lang.value);
toggle(); toggle();
}).catch(error => { }).catch(error => {
const errorMsg = Utils.getErrorMsg(error); const errorMsg = Utils.getErrorMsg(error);
toaster.danger(errorMsg); toaster.danger(errorMsg);
setSubmitting(false); setSubmitting(false);
}); });
}, [repoID, submit, toggle, value]); }, [lang, repoID, submit, toggle, value]);
const turnOffConfirmToggle = useCallback(() => { const turnOffConfirmToggle = useCallback(() => {
setShowTurnOffConfirmDialog(!showTurnOffConfirmDialog); setShowTurnOffConfirmDialog(!showTurnOffConfirmDialog);
@@ -58,6 +71,10 @@ const MetadataTagsStatusDialog = ({ value: oldValue, repoID, toggleDialog: toggl
setValue(nextValue); setValue(nextValue);
}, [value]); }, [value]);
const onSelectChange = (option) => {
setLang(option);
};
return ( return (
<> <>
{!showTurnOffConfirmDialog && ( {!showTurnOffConfirmDialog && (
@@ -75,10 +92,21 @@ const MetadataTagsStatusDialog = ({ value: oldValue, repoID, toggleDialog: toggl
<p className="tip m-0"> <p className="tip m-0">
{gettext('Enable tags to add tags to files and search files by tags.')} {gettext('Enable tags to add tags to files and search files by tags.')}
</p> </p>
{value && (
<div className="tags-language-container">
<span>{gettext('Tags language:')}</span>
<SeahubSelect
className='tags-language-selector'
value={lang || { value: 'en', label: 'English' }}
options={langOptions}
onChange={onSelectChange}
/>
</div>
)}
</ModalBody> </ModalBody>
<ModalFooter> <ModalFooter>
<Button color="secondary" onClick={onToggle}>{gettext('Cancel')}</Button> <Button color="secondary" onClick={onToggle}>{gettext('Cancel')}</Button>
<Button color="primary" disabled={oldValue === value || submitting} onClick={onSubmit}>{gettext('Submit')}</Button> <Button color="primary" disabled={(oldValue === value && oldLang === lang.value) || submitting} onClick={onSubmit}>{gettext('Submit')}</Button>
</ModalFooter> </ModalFooter>
</> </>
)} )}

View File

@@ -49,9 +49,12 @@ class TagsManagerAPI {
return this.req.get(url); return this.req.get(url);
}; };
openTags = (repoID) => { openTags = (repoID, lang) => {
const url = this.server + '/api/v2.1/repos/' + repoID + '/metadata/tags-status/'; const url = this.server + '/api/v2.1/repos/' + repoID + '/metadata/tags-status/';
return this.req.put(url); const params = {
lang: lang,
};
return this.req.put(url, params);
}; };
closeTags = (repoID) => { closeTags = (repoID) => {

View File

@@ -2,6 +2,7 @@ import logging
import os.path import os.path
from pysearpc import SearpcError from pysearpc import SearpcError
from seahub.repo_metadata.models import RepoMetadata
from seaserv import seafile_api from seaserv import seafile_api
from rest_framework.authentication import SessionAuthentication from rest_framework.authentication import SessionAuthentication
@@ -161,6 +162,13 @@ class ImageTags(APIView):
error_msg = 'Library %s not found.' % repo_id error_msg = 'Library %s not found.' % repo_id
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
try:
record = RepoMetadata.objects.filter(repo_id=repo_id).first()
except Exception as e:
logger.error(e)
error_msg = 'Internal Server Error'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
permission = check_folder_permission(request, repo_id, os.path.dirname(path)) permission = check_folder_permission(request, repo_id, os.path.dirname(path))
if not permission: if not permission:
error_msg = 'Permission denied.' error_msg = 'Permission denied.'
@@ -182,7 +190,8 @@ class ImageTags(APIView):
params = { params = {
'path': path, 'path': path,
'download_token': token 'download_token': token,
'lang': record.tags_lang if record and record.tags_enabled else None
} }
try: try:

View File

@@ -62,6 +62,7 @@ class MetadataManage(APIView):
return Response({ return Response({
'enabled': is_enabled, 'enabled': is_enabled,
'tags_enabled': is_tags_enabled, 'tags_enabled': is_tags_enabled,
'tags_lang': record.tags_lang,
}) })
def put(self, request, repo_id): def put(self, request, repo_id):
@@ -1245,6 +1246,11 @@ class MetadataTagsStatusManage(APIView):
throttle_classes = (UserRateThrottle,) throttle_classes = (UserRateThrottle,)
def put(self, request, repo_id): def put(self, request, repo_id):
lang = request.data.get('lang')
if not lang:
error_msg = 'lang invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# resource check # resource check
repo = seafile_api.get_repo(repo_id) repo = seafile_api.get_repo(repo_id)
if not repo: if not repo:
@@ -1260,13 +1266,17 @@ class MetadataTagsStatusManage(APIView):
error_msg = f'The metadata module is not enabled for repo {repo_id}.' error_msg = f'The metadata module is not enabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
old_tags_enabled = metadata.tags_enabled
try: try:
metadata.tags_enabled = True metadata.tags_enabled = True
metadata.tags_lang = lang
metadata.save() metadata.save()
except Exception as e: except Exception as e:
logger.exception(e) logger.exception(e)
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, 'Internal Server Error') return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, 'Internal Server Error')
if not old_tags_enabled:
metadata_server_api = MetadataServerAPI(repo_id, request.user.username) metadata_server_api = MetadataServerAPI(repo_id, request.user.username)
init_tags(metadata_server_api) init_tags(metadata_server_api)
@@ -1300,6 +1310,7 @@ class MetadataTagsStatusManage(APIView):
try: try:
record.tags_enabled = False record.tags_enabled = False
record.tags_lang = None
record.save() record.save()
except Exception as e: except Exception as e:
logger.error(e) logger.error(e)

View File

@@ -65,6 +65,7 @@ class RepoMetadata(models.Model):
from_commit = models.CharField(max_length=40) from_commit = models.CharField(max_length=40)
to_commit = models.CharField(max_length=40) to_commit = models.CharField(max_length=40)
tags_enabled = models.BooleanField(db_index=True) tags_enabled = models.BooleanField(db_index=True)
tags_lang = models.CharField(max_length=36)
last_face_cluster_time = models.DateTimeField(db_index=True, blank=True, null=True) last_face_cluster_time = models.DateTimeField(db_index=True, blank=True, null=True)
objects = RepoMetadataManager() objects = RepoMetadataManager()