This commit is contained in:
sheng
2023-08-11 18:03:05 +08:00
8 changed files with 58 additions and 78 deletions

View File

@@ -3,6 +3,5 @@ from django.urls import path
from application.websocketConfig import MegCenter from application.websocketConfig import MegCenter
websocket_urlpatterns = [ websocket_urlpatterns = [
path('ws/<str:service_uid>/', MegCenter.as_asgi()), #consumers.DvadminWebSocket 是该路由的消费者 path('ws/<str:service_uid>/', MegCenter.as_asgi()), # consumers.DvadminWebSocket 是该路由的消费者
] ]

View File

@@ -166,9 +166,9 @@ CORS_ORIGIN_ALLOW_ALL = True
# 允许cookie # 允许cookie
CORS_ALLOW_CREDENTIALS = True # 指明在跨域访问中后端是否支持对cookie的操作 CORS_ALLOW_CREDENTIALS = True # 指明在跨域访问中后端是否支持对cookie的操作
# ================================================= # # ===================================================== #
# ********************* channels配置 ******************* # # ********************* channels配置 ******************* #
# ================================================= # # ===================================================== #
ASGI_APPLICATION = 'application.asgi.application' ASGI_APPLICATION = 'application.asgi.application'
CHANNEL_LAYERS = { CHANNEL_LAYERS = {
"default": { "default": {
@@ -306,7 +306,7 @@ AUTHENTICATION_BACKENDS = ["dvadmin.utils.backends.CustomBackend"]
# ================================================= # # ================================================= #
SIMPLE_JWT = { SIMPLE_JWT = {
# token有效时长 # token有效时长
"ACCESS_TOKEN_LIFETIME": timedelta(minutes=120), "ACCESS_TOKEN_LIFETIME": timedelta(minutes=1440),
# token刷新后的有效时间 # token刷新后的有效时间
"REFRESH_TOKEN_LIFETIME": timedelta(days=1), "REFRESH_TOKEN_LIFETIME": timedelta(days=1),
# 设置前缀 # 设置前缀

View File

@@ -30,6 +30,7 @@ from dvadmin.system.views.login import (
CaptchaView, CaptchaView,
ApiLogin, ApiLogin,
LogoutView, LogoutView,
LoginTokenView
) )
from dvadmin.system.views.system_config import InitSettingsViewSet from dvadmin.system.views.system_config import InitSettingsViewSet
from dvadmin.utils.swagger import CustomOpenAPISchemaGenerator from dvadmin.utils.swagger import CustomOpenAPISchemaGenerator
@@ -81,6 +82,9 @@ urlpatterns = (
path("api/init/dictionary/", InitDictionaryViewSet.as_view()), path("api/init/dictionary/", InitDictionaryViewSet.as_view()),
path("api/init/settings/", InitSettingsViewSet.as_view()), path("api/init/settings/", InitSettingsViewSet.as_view()),
path("apiLogin/", ApiLogin.as_view()), path("apiLogin/", ApiLogin.as_view()),
# 仅用于开发,上线需关闭
path("api/token/", LoginTokenView.as_view()),
] ]
+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
+ static(settings.STATIC_URL, document_root=settings.STATIC_URL) + static(settings.STATIC_URL, document_root=settings.STATIC_URL)

View File

@@ -122,7 +122,8 @@ class MessageCreateSerializer(CustomModelSerializer):
fields = "__all__" fields = "__all__"
read_only_fields = ["id"] read_only_fields = ["id"]
def websocket_push(user_id,message):
def websocket_push(user_id, message):
username = "user_" + str(user_id) username = "user_" + str(user_id)
channel_layer = get_channel_layer() channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send)( async_to_sync(channel_layer.group_send)(
@@ -133,8 +134,9 @@ def websocket_push(user_id,message):
} }
) )
def create_message_push(title: str, content: str, target_type: int=0, target_user: list=[], target_dept=None, target_role=None,
message: dict = {'contentType': 'INFO', 'content': '测试~'}, request= Request): def create_message_push(title: str, content: str, target_type: int = 0, target_user: list = None, target_dept=None,
target_role=None, message: dict = None, request=Request):
if message is None: if message is None:
message = {"contentType": "INFO", "content": None} message = {"contentType": "INFO", "content": None}
if target_role is None: if target_role is None:
@@ -145,11 +147,11 @@ def create_message_push(title: str, content: str, target_type: int=0, target_use
"title": title, "title": title,
"content": content, "content": content,
"target_type": target_type, "target_type": target_type,
"target_user":target_user, "target_user": target_user,
"target_dept":target_dept, "target_dept": target_dept,
"target_role":target_role "target_role": target_role
} }
message_center_instance = MessageCreateSerializer(data=data,request=request) message_center_instance = MessageCreateSerializer(data=data, request=request)
message_center_instance.is_valid(raise_exception=True) message_center_instance.is_valid(raise_exception=True)
message_center_instance.save() message_center_instance.save()
users = target_user or [] users = target_user or []
@@ -176,6 +178,6 @@ def create_message_push(title: str, content: str, target_type: int=0, target_use
username, username,
{ {
"type": "push.message", "type": "push.message",
"json": {**message,'unread':unread_count} "json": {**message, 'unread': unread_count}
} }
) )

View File

@@ -738,66 +738,5 @@
} }
], ],
"menu_button": [] "menu_button": []
},
{
"name": "设备管理",
"icon": "iconfont icon-diannaobangong",
"sort": 4,
"is_link": false,
"is_catalog": true,
"web_path": "",
"component": "",
"component_name": "",
"status": true,
"cache": false,
"visible": true,
"children": [
{
"name": "网关管理",
"icon": "iconfont icon-LoggedinPC",
"sort": 1,
"is_link": false,
"is_catalog": false,
"web_path": "/swg",
"component": "device/swg/index",
"component_name": "swg",
"status": true,
"cache": false,
"visible": true,
"children": [],
"menu_button": []
},
{
"name": "联网设备",
"icon": "iconfont icon-putong",
"sort": 2,
"is_link": false,
"is_catalog": false,
"web_path": "/networkDevice",
"component": "device/networkDevice/index",
"component_name": "networkDevice",
"status": true,
"cache": false,
"visible": true,
"children": [],
"menu_button": []
},
{
"name": "模板信息",
"icon": "iconfont icon-chazhaobiaodanliebiao",
"sort": 3,
"is_link": false,
"is_catalog": false,
"web_path": "/template",
"component": "device/template/index",
"component_name": "templatePage",
"status": true,
"cache": false,
"visible": true,
"children": [],
"menu_button": []
}
],
"menu_button": []
} }
] ]

View File

@@ -76,8 +76,9 @@ class CustomPagination(PageNumberPagination):
('msg', msg), ('msg', msg),
('page', page), ('page', page),
('limit', limit), ('limit', limit),
('total',total), ('total', total),
('is_next',is_next), ('is_next', is_next),
('is_previous', is_previous), ('is_previous', is_previous),
('data', data) ('data', data),
('permission', self.request.permission_fields)
])) ]))

View File

@@ -16,6 +16,8 @@ from dvadmin.utils.filters import DataLevelPermissionsFilter
from dvadmin.utils.import_export_mixin import ExportSerializerMixin, ImportSerializerMixin from dvadmin.utils.import_export_mixin import ExportSerializerMixin, ImportSerializerMixin
from dvadmin.utils.json_response import SuccessResponse, ErrorResponse, DetailResponse from dvadmin.utils.json_response import SuccessResponse, ErrorResponse, DetailResponse
from dvadmin.utils.permission import CustomPermission from dvadmin.utils.permission import CustomPermission
from dvadmin.utils.models import get_custom_app_models
from dvadmin.system.models import Columns
from django_restql.mixins import QueryArgumentsMixin from django_restql.mixins import QueryArgumentsMixin
@@ -61,12 +63,45 @@ class CustomModelViewSet(ModelViewSet, ImportSerializerMixin, ExportSerializerMi
def get_serializer(self, *args, **kwargs): def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class() serializer_class = self.get_serializer_class()
kwargs.setdefault('context', self.get_serializer_context()) kwargs.setdefault('context', self.get_serializer_context())
# 全部以可见字段为准
can_see = self.get_column_permission(serializer_class)
# 排除掉序列化器级的字段
# sub_set = set(serializer_class._declared_fields.keys()) - set(can_see)
# for field in sub_set:
# serializer_class._declared_fields.pop(field)
# if not self.request.user.is_superuser:
# serializer_class.Meta.fields = can_see
# 在分页器中使用
self.request.permission_fields = can_see
if isinstance(self.request.data, list): if isinstance(self.request.data, list):
with transaction.atomic(): with transaction.atomic():
return serializer_class(many=True, *args, **kwargs) return serializer_class(many=True, *args, **kwargs)
else: else:
return serializer_class(*args, **kwargs) return serializer_class(*args, **kwargs)
def get_column_permission(self, serializer_class):
"""获取列权限"""
action_map = {
'list': 'is_query',
'retrieve': 'is_query',
'create': 'is_create',
'update': 'is_update'
}
finded = False
for app in get_custom_app_models():
for model in app:
if model['object'] is serializer_class.Meta.model:
finded = True
break
if finded:
break
if finded is False:
return []
column_permission = Columns.objects.filter(app=model['app'], model=model['model'])
if self.action in action_map:
return [obj.field_name for obj in column_permission if getattr(obj, action_map[self.action])]
return []
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data, request=request) serializer = self.get_serializer(data=request.data, request=request)
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)

View File

@@ -18,7 +18,7 @@ requests==2.28.2
typing-extensions==4.4.0 typing-extensions==4.4.0
smmap==5.0.0 smmap==5.0.0
tzlocal==4.1 tzlocal==4.1
channels==4.0.0 channels==3.0.5
channels-redis==4.0.0 channels-redis==4.0.0
websockets==10.4 websockets==10.4
user-agents==2.2.0 user-agents==2.2.0