1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-22 16:56:57 +00:00

add obj_id column (#6540)

* add obj_id column

* add size suffix file detail column

* dir remove obj_id
This commit is contained in:
JoinTyang 2024-08-15 11:43:35 +08:00 committed by GitHub
parent ad48b1cecf
commit ab0fe3041e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 126 additions and 83 deletions

View File

@ -264,6 +264,7 @@ class Store {
let valid_id_original_row_updates = {}; let valid_id_original_row_updates = {};
let valid_id_old_row_data = {}; let valid_id_old_row_data = {};
let valid_id_original_old_row_data = {}; let valid_id_original_old_row_data = {};
let id_obj_id = {};
originalRows.forEach(row => { originalRows.forEach(row => {
if (!row || !this.context.canModifyRow(row)) { if (!row || !this.context.canModifyRow(row)) {
return; return;
@ -271,6 +272,7 @@ class Store {
const rowId = row._id; const rowId = row._id;
valid_row_ids.push(rowId); valid_row_ids.push(rowId);
valid_id_row_updates[rowId] = id_row_updates[rowId]; valid_id_row_updates[rowId] = id_row_updates[rowId];
id_obj_id[rowId] = row._obj_id;
valid_id_original_row_updates[rowId] = id_original_row_updates[rowId]; valid_id_original_row_updates[rowId] = id_original_row_updates[rowId];
valid_id_old_row_data[rowId] = id_old_row_data[rowId]; valid_id_old_row_data[rowId] = id_old_row_data[rowId];
valid_id_original_old_row_data[rowId] = id_original_old_row_data[rowId]; valid_id_original_old_row_data[rowId] = id_original_old_row_data[rowId];
@ -286,6 +288,7 @@ class Store {
id_old_row_data: valid_id_old_row_data, id_old_row_data: valid_id_old_row_data,
id_original_old_row_data: valid_id_original_old_row_data, id_original_old_row_data: valid_id_original_old_row_data,
is_copy_paste, is_copy_paste,
id_obj_id: id_obj_id
}); });
this.applyOperation(operation); this.applyOperation(operation);
} }

View File

@ -19,7 +19,7 @@ export const OPERATION_TYPE = {
export const OPERATION_ATTRIBUTES = { export const OPERATION_ATTRIBUTES = {
[OPERATION_TYPE.MODIFY_RECORD]: ['repo_id', 'row_id', 'updates', 'old_row_data', 'original_updates', 'original_old_row_data'], [OPERATION_TYPE.MODIFY_RECORD]: ['repo_id', 'row_id', 'updates', 'old_row_data', 'original_updates', 'original_old_row_data'],
[OPERATION_TYPE.MODIFY_RECORDS]: ['repo_id', 'row_ids', 'id_row_updates', 'id_original_row_updates', 'id_old_row_data', 'id_original_old_row_data', 'is_copy_paste'], [OPERATION_TYPE.MODIFY_RECORDS]: ['repo_id', 'row_ids', 'id_row_updates', 'id_original_row_updates', 'id_old_row_data', 'id_original_old_row_data', 'is_copy_paste', 'id_obj_id'],
[OPERATION_TYPE.RESTORE_RECORDS]: ['repo_id', 'rows_data', 'original_rows', 'link_infos', 'upper_row_ids'], [OPERATION_TYPE.RESTORE_RECORDS]: ['repo_id', 'rows_data', 'original_rows', 'link_infos', 'upper_row_ids'],
[OPERATION_TYPE.RELOAD_RECORDS]: ['repo_id', 'row_ids'], [OPERATION_TYPE.RELOAD_RECORDS]: ['repo_id', 'row_ids'],
[OPERATION_TYPE.MODIFY_FILTERS]: ['repo_id', 'view_id', 'filter_conjunction', 'filters'], [OPERATION_TYPE.MODIFY_FILTERS]: ['repo_id', 'view_id', 'filter_conjunction', 'filters'],

View File

@ -20,9 +20,9 @@ class ServerOperator {
break; break;
} }
case OPERATION_TYPE.MODIFY_RECORDS: { case OPERATION_TYPE.MODIFY_RECORDS: {
const { repo_id, row_ids, id_row_updates, is_copy_paste } = operation; const { repo_id, row_ids, id_row_updates, is_copy_paste, id_obj_id } = operation;
const rowsData = row_ids.map(rowId => { const rowsData = row_ids.map(rowId => {
return { record_id: rowId, record: id_row_updates[rowId] }; return { record_id: rowId, record: id_row_updates[rowId], obj_id: id_obj_id[rowId] };
}); });
window.sfMetadataContext.modifyRecords(repo_id, rowsData, is_copy_paste).then(res => { window.sfMetadataContext.modifyRecords(repo_id, rowsData, is_copy_paste).then(res => {
callback({ operation }); callback({ operation });

View File

@ -29,7 +29,7 @@ class MetadataManage(APIView):
def get(self, request, repo_id): def get(self, request, repo_id):
""" """
check the repo has enabled the metadata manage or not check the repo has enabled the metadata manage or not
""" """
# recource check # recource check
repo = seafile_api.get_repo(repo_id) repo = seafile_api.get_repo(repo_id)
if not repo: if not repo:
@ -41,7 +41,7 @@ class MetadataManage(APIView):
if not permission: if not permission:
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)
try: try:
record = RepoMetadata.objects.filter(repo_id=repo_id).first() record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if record and record.enabled: if record and record.enabled:
@ -52,7 +52,7 @@ class MetadataManage(APIView):
logger.error(e) logger.error(e)
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)
return Response({'enabled': is_enabled}) return Response({'enabled': is_enabled})
def put(self, request, repo_id): def put(self, request, repo_id):
@ -119,13 +119,13 @@ class MetadataManage(APIView):
if not permission: if not permission:
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)
# check dose the repo have opened metadata manage # check dose the repo have opened metadata manage
record = RepoMetadata.objects.filter(repo_id=repo_id).first() record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled: if not record or not record.enabled:
error_msg = f'The repo {repo_id} has disabledd the metadata manage.' error_msg = f'The repo {repo_id} has disabledd the metadata manage.'
return api_error(status.HTTP_409_CONFLICT, error_msg) return api_error(status.HTTP_409_CONFLICT, error_msg)
metadata_server_api = MetadataServerAPI(repo_id, request.user.username) metadata_server_api = MetadataServerAPI(repo_id, request.user.username)
try: try:
metadata_server_api.delete_base() metadata_server_api.delete_base()
@ -133,7 +133,7 @@ class MetadataManage(APIView):
logger.error(err) logger.error(err)
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)
try: try:
record.enabled = False record.enabled = False
record.save() record.save()
@ -142,7 +142,7 @@ class MetadataManage(APIView):
logger.error(e) logger.error(e)
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)
return Response({'success': True}) return Response({'success': True})
class MetadataRecords(APIView): class MetadataRecords(APIView):
@ -161,7 +161,7 @@ class MetadataRecords(APIView):
is_dir: optional, True or False is_dir: optional, True or False
order_by: list with string, like ['`parent_dir` ASC'] order_by: list with string, like ['`parent_dir` ASC']
""" """
#args check #args check
view_id = request.GET.get('view_id', '') view_id = request.GET.get('view_id', '')
start = request.GET.get('start', 0) start = request.GET.get('start', 0)
@ -177,7 +177,7 @@ class MetadataRecords(APIView):
if start < 0: if start < 0:
error_msg = 'start invalid' error_msg = 'start invalid'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
if limit < 0: if limit < 0:
error_msg = 'limit invalid' error_msg = 'limit invalid'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
@ -185,7 +185,7 @@ class MetadataRecords(APIView):
if not view_id: if not view_id:
error_msg = 'view_id is invalid.' error_msg = 'view_id is invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# metadata enable check # metadata enable check
metadata = RepoMetadata.objects.filter(repo_id=repo_id).first() metadata = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not metadata or not metadata.enabled: if not metadata or not metadata.enabled:
@ -203,21 +203,21 @@ class MetadataRecords(APIView):
if not permission: if not permission:
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)
try: try:
view = RepoMetadataViews.objects.get_view(repo_id, view_id) view = RepoMetadataViews.objects.get_view(repo_id, view_id)
except Exception as e: except Exception as e:
logger.exception(e) logger.exception(e)
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)
try: try:
results = list_metadata_view_records(repo_id, request.user.username, view, start, limit) results = list_metadata_view_records(repo_id, request.user.username, view, start, limit)
except Exception as err: except Exception as err:
logger.error(err) logger.error(err)
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)
return Response(results) return Response(results)
def put(self, request, repo_id): def put(self, request, repo_id):
@ -242,9 +242,8 @@ class MetadataRecords(APIView):
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
metadata_server_api = MetadataServerAPI(repo_id, request.user.username) metadata_server_api = MetadataServerAPI(repo_id, request.user.username)
from seafevents.repo_metadata.utils import METADATA_TABLE from seafevents.repo_metadata.utils import METADATA_TABLE
columns = []
try: try:
columns_data = metadata_server_api.list_columns(METADATA_TABLE.id) columns_data = metadata_server_api.list_columns(METADATA_TABLE.id)
columns = columns_data.get('columns', []) columns = columns_data.get('columns', [])
@ -255,33 +254,70 @@ class MetadataRecords(APIView):
sys_column_names = [column.get('name') for column in get_sys_columns()] sys_column_names = [column.get('name') for column in get_sys_columns()]
rows = [] record_id_to_record = {}
obj_id_to_record = {}
sql = f'SELECT `_id`, `_obj_id`, `_file_modifier` FROM `{METADATA_TABLE.name}` WHERE '
parameters = []
for record_data in records_data: for record_data in records_data:
record_id = record_data.get('record_id', '')
record = record_data.get('record', {}) record = record_data.get('record', {})
if record_id: obj_id = record_data.get('obj_id', '')
flag = False record_id = record_data.get('record_id', '')
update = { if not record_id:
METADATA_TABLE.columns.id.name: record_id, error_msg = 'record_id invalid.'
} return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
for column_name, value in record.items():
if column_name not in sys_column_names: sql += f' `{METADATA_TABLE.columns.id.name}` = ? OR '
try: parameters.append(record_id)
column = next(column for column in columns if column['name'] == column_name) record_id_to_record[record_id] = record
flag = True
if value and column['type'] == 'date': if obj_id and obj_id != '0000000000000000000000000000000000000000':
column_data = column.get('data', {}) sql += f' `{METADATA_TABLE.columns.obj_id.name}` = ? OR '
format = column_data.get('format', 'YYYY-MM-DD') parameters.append(obj_id)
datetime_obj = datetime.strptime(value, '%Y-%m-%d %H:%M' if 'HH:mm' in format else '%Y-%m-%d') obj_id_to_record[obj_id] = record
update[column_name] = datetime_to_isoformat_timestr(datetime_obj)
elif column['type'] == 'single-select' and not value: sql = sql.rstrip('OR ')
update[column_name] = None sql += ';'
else:
update[column_name] = value try:
except Exception as e: query_result = metadata_server_api.query_rows(sql, parameters)
pass except Exception as e:
if flag: logger.exception(e)
rows.append(update) error_msg = 'Internal Server Error'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
results = query_result.get('results')
if not results:
# file or folder has been deleted
return Response({'success': True})
rows = []
for record in results:
obj_id = record.get('_obj_id')
record_id = record.get('_id')
to_updated_record = record_id_to_record.get(record_id)
if not to_updated_record:
to_updated_record = obj_id_to_record.get(obj_id)
update = {
METADATA_TABLE.columns.id.name: record_id,
}
for column_name, value in to_updated_record.items():
if column_name not in sys_column_names:
try:
column = next(column for column in columns if column['name'] == column_name)
if value and column['type'] == 'date':
column_data = column.get('data', {})
format = column_data.get('format', 'YYYY-MM-DD')
datetime_obj = datetime.strptime(value,
'%Y-%m-%d %H:%M' if 'HH:mm' in format else '%Y-%m-%d')
update[column_name] = datetime_to_isoformat_timestr(datetime_obj)
elif column['type'] == 'single-select' and not value:
update[column_name] = None
else:
update[column_name] = value
rows.append(update)
except Exception as e:
pass
if rows: if rows:
try: try:
metadata_server_api.update_rows(METADATA_TABLE.id, rows) metadata_server_api.update_rows(METADATA_TABLE.id, rows)
@ -411,7 +447,7 @@ class MetadataColumns(APIView):
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
return Response({'column': column}) return Response({'column': column})
def put(self, request, repo_id): def put(self, request, repo_id):
column_key = request.data.get('column_key', '') column_key = request.data.get('column_key', '')
@ -421,11 +457,11 @@ class MetadataColumns(APIView):
if not column_key: if not column_key:
error_msg = 'column_key invalid.' error_msg = 'column_key invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
if not column_name and not column_data: if not column_name and not column_data:
error_msg = 'params invalid.' error_msg = 'params invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
metadata = RepoMetadata.objects.filter(repo_id=repo_id).first() metadata = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not metadata or not metadata.enabled: if not metadata or not metadata.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.' error_msg = f'The metadata module is disabled for repo {repo_id}.'
@ -435,12 +471,12 @@ class MetadataColumns(APIView):
if not repo: if not repo:
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)
permission = check_folder_permission(request, repo_id, '/') permission = check_folder_permission(request, repo_id, '/')
if permission != 'rw': if permission != 'rw':
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)
from seafevents.repo_metadata.utils import METADATA_TABLE, MetadataColumn from seafevents.repo_metadata.utils import METADATA_TABLE, MetadataColumn
metadata_server_api = MetadataServerAPI(repo_id, request.user.username) metadata_server_api = MetadataServerAPI(repo_id, request.user.username)
columns = metadata_server_api.list_columns(METADATA_TABLE.id).get('columns') columns = metadata_server_api.list_columns(METADATA_TABLE.id).get('columns')
@ -495,7 +531,7 @@ class MetadataColumns(APIView):
except Exception as e: except Exception as e:
error_msg = 'Column not found' error_msg = 'Column not found'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
try: try:
metadata_server_api.delete_column(METADATA_TABLE.id, column_key) metadata_server_api.delete_column(METADATA_TABLE.id, column_key)
except Exception as e: except Exception as e:
@ -512,7 +548,7 @@ class MetadataViews(APIView):
throttle_classes = (UserRateThrottle,) throttle_classes = (UserRateThrottle,)
def get(self, request, repo_id): def get(self, request, repo_id):
repo = seafile_api.get_repo(repo_id) repo = seafile_api.get_repo(repo_id)
if not repo: if not repo:
error_msg = 'Library %s not found.' % repo_id error_msg = 'Library %s not found.' % repo_id
@ -522,7 +558,7 @@ class MetadataViews(APIView):
if permission != 'rw': if permission != 'rw':
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)
try: try:
metadata_views = RepoMetadataViews.objects.list_views(repo_id) metadata_views = RepoMetadataViews.objects.list_views(repo_id)
except Exception as e: except Exception as e:
@ -531,24 +567,24 @@ class MetadataViews(APIView):
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
return Response(metadata_views) return Response(metadata_views)
def post(self, request, repo_id): def post(self, request, repo_id):
# Add a metadata view # Add a metadata view
view_name = request.data.get('name') view_name = request.data.get('name')
if not view_name: if not view_name:
error_msg = 'view name is invalid.' error_msg = 'view name is invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
record = RepoMetadata.objects.filter(repo_id=repo_id).first() record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled: if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.' error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
repo = seafile_api.get_repo(repo_id) repo = seafile_api.get_repo(repo_id)
if not repo: if not repo:
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)
permission = check_folder_permission(request, repo_id, '/') permission = check_folder_permission(request, repo_id, '/')
if permission != 'rw': if permission != 'rw':
error_msg = 'Permission denied.' error_msg = 'Permission denied.'
@ -562,8 +598,8 @@ class MetadataViews(APIView):
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
return Response({'view': new_view}) return Response({'view': new_view})
def put(self, request, repo_id): def put(self, request, repo_id):
# Update a metadata view, including rename, change filters and so on # Update a metadata view, including rename, change filters and so on
# by a json data # by a json data
@ -575,19 +611,19 @@ class MetadataViews(APIView):
if not view_data: if not view_data:
error_msg = 'view_data is invalid.' error_msg = 'view_data is invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
record = RepoMetadata.objects.filter(repo_id=repo_id).first() record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled: if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.' error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
views = RepoMetadataViews.objects.filter( views = RepoMetadataViews.objects.filter(
repo_id = repo_id, repo_id = repo_id,
).first() ).first()
if not views: if not views:
error_msg = 'The metadata views does not exists.' error_msg = 'The metadata views does not exists.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
if view_id not in views.view_ids: if view_id not in views.view_ids:
error_msg = 'view_id %s does not exists.' % view_id error_msg = 'view_id %s does not exists.' % view_id
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
@ -601,7 +637,7 @@ class MetadataViews(APIView):
if permission != 'rw': if permission != 'rw':
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)
try: try:
result = RepoMetadataViews.objects.update_view(repo_id, view_id, view_data) result = RepoMetadataViews.objects.update_view(repo_id, view_id, view_data)
except Exception as e: except Exception as e:
@ -618,40 +654,40 @@ class MetadataViews(APIView):
if not view_id: if not view_id:
error_msg = 'view_id is invalid.' error_msg = 'view_id is invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
record = RepoMetadata.objects.filter(repo_id=repo_id).first() record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled: if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.' error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
views = RepoMetadataViews.objects.filter( views = RepoMetadataViews.objects.filter(
repo_id=repo_id repo_id=repo_id
).first() ).first()
if not views: if not views:
error_msg = 'The metadata views does not exists.' error_msg = 'The metadata views does not exists.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
if view_id not in views.view_ids: if view_id not in views.view_ids:
error_msg = 'view_id %s does not exists.' % view_id error_msg = 'view_id %s does not exists.' % view_id
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
repo = seafile_api.get_repo(repo_id) repo = seafile_api.get_repo(repo_id)
if not repo: if not repo:
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)
permission = check_folder_permission(request, repo_id, '/') permission = check_folder_permission(request, repo_id, '/')
if permission != 'rw': if permission != 'rw':
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)
try: try:
result = RepoMetadataViews.objects.delete_view(repo_id, view_id) result = RepoMetadataViews.objects.delete_view(repo_id, view_id)
except Exception as e: except Exception as e:
logger.exception(e) logger.exception(e)
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)
return Response({'success': True}) return Response({'success': True})
@ -659,50 +695,50 @@ class MetadataViewsDetailView(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication) authentication_classes = (TokenAuthentication, SessionAuthentication)
permission_classes = (IsAuthenticated,) permission_classes = (IsAuthenticated,)
throttle_classes = (UserRateThrottle,) throttle_classes = (UserRateThrottle,)
def get(self, request, repo_id, view_id): def get(self, request, repo_id, view_id):
record = RepoMetadata.objects.filter(repo_id=repo_id).first() record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled: if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.' error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
repo = seafile_api.get_repo(repo_id) repo = seafile_api.get_repo(repo_id)
if not repo: if not repo:
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)
permission = check_folder_permission(request, repo_id, '/') permission = check_folder_permission(request, repo_id, '/')
if permission != 'rw': if permission != 'rw':
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)
try: try:
view = RepoMetadataViews.objects.get_view(repo_id, view_id) view = RepoMetadataViews.objects.get_view(repo_id, view_id)
except Exception as e: except Exception as e:
logger.exception(e) logger.exception(e)
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)
return Response({'view': view}) return Response({'view': view})
class MetadataViewsMoveView(APIView): class MetadataViewsMoveView(APIView):
authentication_classes = (TokenAuthentication, SessionAuthentication) authentication_classes = (TokenAuthentication, SessionAuthentication)
permission_classes = (IsAuthenticated,) permission_classes = (IsAuthenticated,)
throttle_classes = (UserRateThrottle,) throttle_classes = (UserRateThrottle,)
def post(self, request, repo_id): def post(self, request, repo_id):
# put view_id in front of target_view_id # put view_id in front of target_view_id
view_id = request.data.get('view_id') view_id = request.data.get('view_id')
if not view_id: if not view_id:
error_msg = 'view_id is invalid.' error_msg = 'view_id is invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
target_view_id = request.data.get('target_view_id') target_view_id = request.data.get('target_view_id')
if not target_view_id: if not target_view_id:
error_msg = 'target_view_id is invalid.' error_msg = 'target_view_id is invalid.'
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
record = RepoMetadata.objects.filter(repo_id=repo_id).first() record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled: if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.' error_msg = f'The metadata module is disabled for repo {repo_id}.'
@ -718,25 +754,25 @@ class MetadataViewsMoveView(APIView):
if view_id not in views.view_ids: if view_id not in views.view_ids:
error_msg = 'view_id %s does not exists.' % view_id error_msg = 'view_id %s does not exists.' % view_id
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
if target_view_id not in views.view_ids: if target_view_id not in views.view_ids:
error_msg = 'target_view_id %s does not exists.' % target_view_id error_msg = 'target_view_id %s does not exists.' % target_view_id
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
repo = seafile_api.get_repo(repo_id) repo = seafile_api.get_repo(repo_id)
if not repo: if not repo:
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)
permission = check_folder_permission(request, repo_id, '/') permission = check_folder_permission(request, repo_id, '/')
if permission != 'rw': if permission != 'rw':
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)
try: try:
results = RepoMetadataViews.objects.move_view(repo_id, view_id, target_view_id) results = RepoMetadataViews.objects.move_view(repo_id, view_id, target_view_id)
except Exception as e: except Exception as e:
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)
return Response({'navigation': results['navigation']}) return Response({'navigation': results['navigation']})

View File

@ -43,7 +43,11 @@ def get_sys_columns():
METADATA_TABLE.columns.file_name.to_dict(), METADATA_TABLE.columns.file_name.to_dict(),
METADATA_TABLE.columns.is_dir.to_dict(), METADATA_TABLE.columns.is_dir.to_dict(),
METADATA_TABLE.columns.file_type.to_dict(), METADATA_TABLE.columns.file_type.to_dict(),
METADATA_TABLE.columns.location.to_dict() METADATA_TABLE.columns.location.to_dict(),
METADATA_TABLE.columns.obj_id.to_dict(),
METADATA_TABLE.columns.size.to_dict(),
METADATA_TABLE.columns.suffix.to_dict(),
METADATA_TABLE.columns.file_details.to_dict(),
] ]
return columns return columns