-
Notifications
You must be signed in to change notification settings - Fork 2.6k
feat: Tag permission interface #4225
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -519,8 +519,8 @@ class BatchAddTag(APIView): | |
| tags=[_('Knowledge Base/Documentation')] # type: ignore | ||
| ) | ||
| @has_permissions( | ||
| PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_DOCUMENT_EDIT.get_workspace_permission_workspace_manage_role(), | ||
| PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_permission_workspace_manage_role(), | ||
| RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), | ||
| ViewPermission([RoleConstants.USER.get_workspace_role()], | ||
| [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND), | ||
|
|
@@ -724,8 +724,8 @@ class Tags(APIView): | |
| tags=[_('Knowledge Base/Documentation')] # type: ignore | ||
| ) | ||
| @has_permissions( | ||
| PermissionConstants.KNOWLEDGE_TAG_READ.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_READ.get_workspace_permission_workspace_manage_role(), | ||
| PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_permission_workspace_manage_role(), | ||
| RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), | ||
| ViewPermission([RoleConstants.USER.get_workspace_role()], | ||
| [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND), | ||
|
|
@@ -745,8 +745,8 @@ def get(self, request: Request, workspace_id: str, knowledge_id: str, document_i | |
| tags=[_('Knowledge Base/Documentation')] # type: ignore | ||
| ) | ||
| @has_permissions( | ||
| PermissionConstants.KNOWLEDGE_TAG_READ.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_READ.get_workspace_permission_workspace_manage_role(), | ||
| PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_permission_workspace_manage_role(), | ||
| RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), | ||
| ViewPermission([RoleConstants.USER.get_workspace_role()], | ||
| [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND), | ||
|
|
@@ -770,8 +770,8 @@ class BatchDelete(APIView): | |
| tags=[_('Knowledge Base/Documentation')] # type: ignore | ||
| ) | ||
| @has_permissions( | ||
| PermissionConstants.KNOWLEDGE_TAG_READ.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_READ.get_workspace_permission_workspace_manage_role(), | ||
| PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_DOCUMENT_TAG.get_workspace_permission_workspace_manage_role(), | ||
| RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), | ||
| ViewPermission([RoleConstants.USER.get_workspace_role()], | ||
| [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The code provided seems to be related to permissions management for tagging knowledge documents and tags within a system like Knowledge Base Documentation. Here are some observations:
Overall, ensure clarity in terms of role permissions, consistency in implementation practices, and thorough testing across all user interactions involved in managing annotations and tag associations for documentation items. |
||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -5,7 +5,7 @@ | |
|
|
||
| from common.auth import TokenAuth | ||
| from common.auth.authentication import has_permissions | ||
| from common.constants.permission_constants import PermissionConstants, RoleConstants | ||
| from common.constants.permission_constants import PermissionConstants, RoleConstants, ViewPermission, CompareConstants | ||
| from common.log.log import log | ||
| from common.result import result | ||
| from knowledge.api.tag import TagCreateAPI, TagDeleteAPI, TagEditAPI | ||
|
|
@@ -25,9 +25,11 @@ class KnowledgeTagView(APIView): | |
| tags=[_('Knowledge Base/Tag')] # type: ignore | ||
| ) | ||
| @has_permissions( | ||
| PermissionConstants.KNOWLEDGE_TAG_CREATE.get_workspace_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_CREATE.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_CREATE.get_workspace_permission_workspace_manage_role(), | ||
| RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), | ||
| RoleConstants.USER.get_workspace_role() | ||
| ViewPermission([RoleConstants.USER.get_workspace_role()], | ||
| [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND), | ||
| ) | ||
| @log( | ||
| menu='tag', operate="Create a knowledge tag", | ||
|
|
@@ -47,9 +49,11 @@ def post(self, request: Request, workspace_id: str, knowledge_id: str): | |
| tags=[_('Knowledge Base/Tag')] # type: ignore | ||
| ) | ||
| @has_permissions( | ||
| PermissionConstants.KNOWLEDGE_TAG_READ.get_workspace_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_READ.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_READ.get_workspace_permission_workspace_manage_role(), | ||
| RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), | ||
| RoleConstants.USER.get_workspace_role() | ||
| ViewPermission([RoleConstants.USER.get_workspace_role()], | ||
| [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND), | ||
| ) | ||
| @log( | ||
| menu='tag', operate="Create a knowledge tag", | ||
|
|
@@ -74,9 +78,11 @@ class Operate(APIView): | |
| tags=[_('Knowledge Base/Tag')] # type: ignore | ||
| ) | ||
| @has_permissions( | ||
| PermissionConstants.KNOWLEDGE_TAG_EDIT.get_workspace_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_EDIT.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_EDIT.get_workspace_permission_workspace_manage_role(), | ||
| RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), | ||
| RoleConstants.USER.get_workspace_role() | ||
| ViewPermission([RoleConstants.USER.get_workspace_role()], | ||
| [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND), | ||
| ) | ||
| @log( | ||
| menu='tag', operate="Update a knowledge tag", | ||
|
|
@@ -99,9 +105,11 @@ class Delete(APIView): | |
| tags=[_('Knowledge Base/Tag')] # type: ignore | ||
| ) | ||
| @has_permissions( | ||
| PermissionConstants.KNOWLEDGE_TAG_DELETE.get_workspace_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_DELETE.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_DELETE.get_workspace_permission_workspace_manage_role(), | ||
| RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), | ||
| RoleConstants.USER.get_workspace_role() | ||
| ViewPermission([RoleConstants.USER.get_workspace_role()], | ||
| [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND), | ||
| ) | ||
| @log( | ||
| menu='tag', operate="Delete a knowledge tag", | ||
|
|
@@ -124,9 +132,11 @@ class BatchDelete(APIView): | |
| tags=[_('Knowledge Base/Tag')] # type: ignore | ||
| ) | ||
| @has_permissions( | ||
| PermissionConstants.KNOWLEDGE_TAG_DELETE.get_workspace_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_DELETE.get_workspace_knowledge_permission(), | ||
| PermissionConstants.KNOWLEDGE_TAG_DELETE.get_workspace_permission_workspace_manage_role(), | ||
| RoleConstants.WORKSPACE_MANAGE.get_workspace_role(), | ||
| RoleConstants.USER.get_workspace_role() | ||
| ViewPermission([RoleConstants.USER.get_workspace_role()], | ||
| [PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()], CompareConstants.AND), | ||
| ) | ||
| @log( | ||
| menu='tag', operate="Batch Delete knowledge tag", | ||
|
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There are several issues and optimizations that can be addressed in this Python code:
Here's an optimized version with some corrections: from common.auth import TokenAuth
from common.auth.authentication import has_permissions
from common.constants.permission_constants import (
PermissionConstants,
RoleConstants,
ViewPermission,
CompareConstants
)
from common.log.log import log
from common.result import result
class KnowledgeTagView(APIView):
@method_decorator(has_permissions([
PermissionConstants.KNOWLEDGE_TAG_CREATE.get_workspace_knowledge_permission(),
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
ViewPermission(RoleConstants.USER.get_workspace_role(),
[PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()],
CompareConstants.AND)
]))
@method_decorator(log(menu='tag', operate="Create a knowledge tag"))
def post(self, request: Request, workspace_id: str, knowledge_id: str) -> Response:
return success()
def handle_tag_operations():
"""
Handle various tag-related operations
"""
@handle_tag_operations.method_decorator(has_permissions([
PermissionConstants.KNOWLEDGE_TAG_READ.get_workspace_knowledge_permission(),
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
ViewPermission(RoleConstants.USER.get_workspace_role(),
[PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()],
CompareConstants.AND)
]))
@handle_tag_operations.method_decorator(log(menu='tag', operate="Read a knowledge tag"))
def get_tags(request: Request, workspace_id: str, knowledge_id: str) -> Response:
return success()
@handle_tag_operations.method_decorator(has_permissions([
PermissionConstants.KNOWLEDGE_TAG_EDIT.get_workspace_knowledge_permission(),
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),
ViewPermission(RoleConstants.USER.get_workspace_role(),
[PermissionConstants.KNOWLEDGE.get_workspace_knowledge_permission()],
CompareConstants.AND)
]))
@handle_tag_operations.method_decorator(log(menu='tag', operate="Edit a knowledge tag"))
def edit_tags(request: Request, workspace_id: str, knowledge_id: str) -> Response:
return success()
# Similar functions will be created similarly...Key Changes Made:
This refactoring improves maintainability and reduces chances for errors caused by duplicated logic. |
||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In this review of the provided Python code, I identify several areas that could be improved:
Duplicate Tag Entries: The
Operate.TAGenumeration has two entries with identical values (READ+TAG). This redundancy can lead to confusion and unexpected behavior throughout the application.Documentation Issues:
get_workspace_roleuses strings like'resource authorization', which do not match the Enum names used in other parts of the code (e.g.,Auth.value.Suggestion: Consistency with casing should be standardized across all references within the same file. For example, using lower-case naming consistently for enums might improve readability and maintainability.
Enum Naming Conventions: It's recommended to follow PEP 8 guidelines for variable and function naming consistency and clarity.
Comments: Adding more detailed comments about the purpose or intent behind certain actions could help clarify the logic flow.
Suggestions
Suggestion 1: Remove Duplicates
Remove the duplicate entry for
OPERATE.TAG. You can choose either one based on which fits better with your design choices.Alternatively, combine the meaning into a singular tag-related operation if applicable instead:
By implementing these changes, you enhance code clarity, maintainability, and reduce potential errors introduced by redundant or inconsistent elements.