|
@@ -9,7 +9,7 @@ from collections import Counter
|
|
|
from typing import Any, Optional
|
|
|
|
|
|
from flask_login import current_user # type: ignore
|
|
|
-from sqlalchemy import func, text
|
|
|
+from sqlalchemy import func, literal, text
|
|
|
from sqlalchemy.orm import Session
|
|
|
from werkzeug.exceptions import NotFound
|
|
|
|
|
@@ -279,6 +279,20 @@ class DatasetService:
|
|
|
return stats
|
|
|
|
|
|
@staticmethod
|
|
|
+ def has_edit_permission(account_id: str, dataset_id: str) -> bool:
|
|
|
+ result = (
|
|
|
+ db.session.query(DatasetPermissionAll)
|
|
|
+ .filter_by(
|
|
|
+ account_id=account_id,
|
|
|
+ dataset_id=dataset_id,
|
|
|
+ has_edit_permission=True
|
|
|
+ )
|
|
|
+ .first()
|
|
|
+ )
|
|
|
+
|
|
|
+ return result is not None
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
def get_datasets_edit_permission(dataset_id):
|
|
|
results = (
|
|
|
db.session.query(DatasetPermissionAll.account_id, Account.email)
|
|
@@ -292,6 +306,7 @@ class DatasetService:
|
|
|
|
|
|
return edit_permission_list
|
|
|
|
|
|
+
|
|
|
@staticmethod
|
|
|
def get_datasets_read_permission(dataset_id):
|
|
|
results = (
|
|
@@ -748,6 +763,88 @@ class DatasetService:
|
|
|
"count": 0,
|
|
|
}
|
|
|
|
|
|
+ @staticmethod
|
|
|
+ def get_datasets2(
|
|
|
+ page, per_page, tenant_id=None, user=None,
|
|
|
+ search=None, tag_ids=None, category_ids=None,
|
|
|
+ auth_type=None, creator_dept=None, creator=None, include_all=False
|
|
|
+ ):
|
|
|
+ user_id = user.id
|
|
|
+ queries = []
|
|
|
+
|
|
|
+ # 1. 创建:row.created_by == loginUserId,
|
|
|
+ query1 = Dataset.query.filter(Dataset.created_by == user_id)
|
|
|
+ # 2. 编辑:row.deptId == loginDeptId && row.editAuth == 2
|
|
|
+ query2 = Dataset.query.join(Account, Dataset.dept_id == Account.dept_id)
|
|
|
+ query2 = query2.filter(Dataset.edit_auth == 2, Account.id == user_id)
|
|
|
+ # 3.授权编辑:row.editUserIds.includes(loginUserId)
|
|
|
+ query3 = Dataset.query.join(
|
|
|
+ DatasetPermissionAll,
|
|
|
+ Dataset.id == DatasetPermissionAll.dataset_id
|
|
|
+ ).filter(
|
|
|
+ DatasetPermissionAll.account_id == user_id,
|
|
|
+ DatasetPermissionAll.has_edit_permission == True
|
|
|
+ )
|
|
|
+ # 4.授权可见:row.lookUserIds.includes(loginUserId)
|
|
|
+ query4 = Dataset.query.join(
|
|
|
+ DatasetPermissionAll,
|
|
|
+ Dataset.id == DatasetPermissionAll.dataset_id
|
|
|
+ ).filter(
|
|
|
+ DatasetPermissionAll.account_id == user_id,
|
|
|
+ DatasetPermissionAll.has_read_permission == True
|
|
|
+ )
|
|
|
+
|
|
|
+ # 根据 auth_type 选择要使用的查询
|
|
|
+ if auth_type is None:
|
|
|
+ # 如果 auth_type 为空,使用所有查询
|
|
|
+ queries = [query1, query2, query3, query4]
|
|
|
+ elif auth_type == 1:
|
|
|
+ queries = [query1]
|
|
|
+ elif auth_type == 2:
|
|
|
+ queries = [query2]
|
|
|
+ elif auth_type == 3:
|
|
|
+ queries = [query3]
|
|
|
+ elif auth_type == 4:
|
|
|
+ queries = [query4]
|
|
|
+
|
|
|
+ # 合并查询
|
|
|
+ if not queries:
|
|
|
+ return [], 0
|
|
|
+
|
|
|
+ union_query = queries[0]
|
|
|
+ for query in queries[1:]:
|
|
|
+ union_query = union_query.union(query)
|
|
|
+
|
|
|
+ # 添加创建人部门过滤
|
|
|
+ if creator_dept:
|
|
|
+ union_query = union_query.join(Account, Dataset.created_by == Account.id)
|
|
|
+ union_query = union_query.filter(Account.dept_id == literal(str(creator_dept)))
|
|
|
+
|
|
|
+ # 添加创建人过滤
|
|
|
+ if creator:
|
|
|
+ union_query = union_query.filter(Dataset.created_by == creator)
|
|
|
+
|
|
|
+ # 其它过滤
|
|
|
+ if search:
|
|
|
+ union_query = union_query.filter(Dataset.name.ilike(f"%{search}%"))
|
|
|
+ if tag_ids:
|
|
|
+ target_ids = TagService.get_target_ids_by_tag_ids("knowledge", tenant_id, tag_ids)
|
|
|
+ if target_ids:
|
|
|
+ union_query = union_query.filter(Dataset.id.in_(target_ids))
|
|
|
+ else:
|
|
|
+ return [], 0
|
|
|
+ if category_ids:
|
|
|
+ target_ids_by_category_ids = TagService.get_target_ids_by_tag_ids("knowledge_category",
|
|
|
+ tenant_id, category_ids)
|
|
|
+ if target_ids_by_category_ids:
|
|
|
+ union_query = union_query.filter(Dataset.id.in_(target_ids_by_category_ids))
|
|
|
+ else:
|
|
|
+ return [], 0
|
|
|
+
|
|
|
+ datasets = union_query.order_by(Dataset.created_at.desc()).paginate(page=page, per_page=per_page,
|
|
|
+ max_per_page=100, error_out=False)
|
|
|
+ return datasets.items, datasets.total
|
|
|
+
|
|
|
|
|
|
class TemplateService:
|
|
|
DEFAULT_RULES: dict[str, Any] = {
|