diff --git a/.github/workflows/django.yml b/.github/workflows/django.yml index a0f253260f..5db235ded1 100644 --- a/.github/workflows/django.yml +++ b/.github/workflows/django.yml @@ -17,7 +17,7 @@ jobs: strategy: max-parallel: 4 matrix: - python-version: [3.7, 3.8, 3.9] + python-version: [3.8, 3.9, 3.10.0] # https://github.com/actions/example-services/tree/master/.github/workflows services: diff --git a/archery/settings.py b/archery/settings.py index c01e6bb1b6..2e81089bfb 100644 --- a/archery/settings.py +++ b/archery/settings.py @@ -176,6 +176,9 @@ } } +# https://docs.djangoproject.com/en/3.2/ref/settings/#std-setting-DEFAULT_AUTO_FIELD +DEFAULT_AUTO_FIELD = 'django.db.models.AutoField' + # API Framework REST_FRAMEWORK = { 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', @@ -311,4 +314,4 @@ PKEY_ROOT = os.path.join(MEDIA_ROOT, 'keys') if not os.path.exists(PKEY_ROOT): - os.mkdir(PKEY_ROOT) \ No newline at end of file + os.mkdir(PKEY_ROOT) diff --git a/common/dashboard.py b/common/dashboard.py index 1c4db48248..ee2d274a72 100644 --- a/common/dashboard.py +++ b/common/dashboard.py @@ -41,7 +41,7 @@ def pyecharts(request): orient="vertical", pos_top="15%", pos_left="2%", is_show=False )) pie1.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) - pie1.add("", [list(z) for z in zip(attr, value)]) + pie1.add("", [list(z) for z in zip(attr, value)]) if attr and data else None # 工单按人统计 data = chart_dao.workflow_by_user(30) @@ -61,7 +61,7 @@ def pyecharts(request): orient="vertical", pos_top="15%", pos_left="2%" )) pie2.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) - pie2.add("", [list(z) for z in zip(attr, value)]) + pie2.add("", [list(z) for z in zip(attr, value)]) if attr and data else None # SQL查询统计(每日检索行数) attr = chart_dao.get_date_list(one_month_before, today) @@ -95,7 +95,7 @@ def pyecharts(request): orient="vertical", pos_top="15%", pos_left="2%", is_show=False )) pie4.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) - pie4.add("", [list(z) for z in zip(attr, value)]) + pie4.add("", [list(z) for z in zip(attr, value)]) if attr and data else None # SQL查询统计(DB检索行数) data = chart_dao.querylog_effect_row_by_db(30) @@ -107,7 +107,7 @@ def pyecharts(request): orient="vertical", pos_top="15%", pos_left="2%", is_show=False )) pie5.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}", position="left")) - pie5.add("", [list(z) for z in zip(attr, value)]) + pie5.add("", [list(z) for z in zip(attr, value)]) if attr and data else None # 慢查询db/user维度统计(最近1天) data = chart_dao.slow_query_count_by_db_by_user(1) @@ -119,7 +119,7 @@ def pyecharts(request): orient="vertical", pos_top="15%", pos_left="2%", is_show=False )) pie3.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}", position="left")) - pie3.add("", [list(z) for z in zip(attr, value)]) + pie3.add("", [list(z) for z in zip(attr, value)]) if attr and data else None # 慢查询db维度统计(最近1天) data = chart_dao.slow_query_count_by_db(1) diff --git a/requirements.txt b/requirements.txt index a94cfe6ff9..c6716969c8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,36 +1,33 @@ -Django==3.1.14 -mysqlclient==2.0.1 +Django==4.0.5 +mysqlclient==2.0.3 requests==2.24.0 simplejson==3.17.2 mybatis_mapper2sql==0.1.9 -django-auth-ldap==2.2.0 +django-auth-ldap==4.1.0 python-dateutil==2.8.1 pymongo==3.11.0 psycopg2-binary==2.8.6 pymysql==0.9.3 mysql-replication==0.22 -django-q==1.3.4 -django-redis==4.12.1 +django-q==1.3.9 +django-redis==5.2.0 pyodbc==4.0.30 gunicorn==20.0.4 -pyecharts==1.7.1 +pyecharts==1.9.1 aliyun-python-sdk-rds==2.1.1 cx-Oracle==7.3.0 supervisor==4.1.0 phoenixdb==0.7 -django-mirage-field==1.1.6 +django-mirage-field==1.4.0 schema-sync==0.9.7 parsedatetime==2.4 sshtunnel==0.1.5 -uvloop==0.14.0 -httptools==0.1.1 -uvicorn==0.12.2 pycryptodome==3.10.1 pandas==1.1.5 pyodps==0.10.7.1 clickhouse-driver==0.2.3 djangorestframework==3.13.1 -djangorestframework-simplejwt==5.0.0 +djangorestframework-simplejwt==5.2.0 django-filter==21.1 drf-spectacular==0.22.0 pyotp==2.6.0 diff --git a/sql/data_dictionary.py b/sql/data_dictionary.py index 43659eee67..13aa3816e0 100644 --- a/sql/data_dictionary.py +++ b/sql/data_dictionary.py @@ -1,10 +1,10 @@ # -*- coding: UTF-8 -*- import datetime import os +from urllib.parse import quote import MySQLdb import simplejson as json -from django.utils.http import urlquote from django.template import loader from archery import settings from sql.engines import get_engine @@ -107,7 +107,7 @@ def export(request): if db_name: response = FileResponse(open(f'{path}/{instance_name}_{db_name}.html', 'rb')) response['Content-Type'] = 'application/octet-stream' - response['Content-Disposition'] = f'attachment;filename="{urlquote(instance_name)}_{urlquote(db_name)}.html"' + response['Content-Disposition'] = f'attachment;filename="{quote(instance_name)}_{quote(db_name)}.html"' return response else: diff --git a/sql_api/urls.py b/sql_api/urls.py index ef01befd46..bfbe96e42a 100644 --- a/sql_api/urls.py +++ b/sql_api/urls.py @@ -1,5 +1,4 @@ from django.urls import path, include -from django.conf.urls import url from sql_api import views from rest_framework import routers from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView, TokenVerifyView @@ -17,17 +16,17 @@ path('swagger/', SpectacularSwaggerView.as_view(url_name='sql_api:schema'), name='swagger'), path('redoc/', SpectacularRedocView.as_view(url_name='sql_api:schema'), name='redoc'), path('v1/user/', api_user.UserList.as_view()), - url(r'^v1/user/(?P[0-9]+)/$', api_user.UserDetail.as_view()), + path('v1/user//', api_user.UserDetail.as_view()), path('v1/user/group/', api_user.GroupList.as_view()), - url(r'^v1/user/group/(?P[0-9]+)/$', api_user.GroupDetail.as_view()), + path('v1/user/group//', api_user.GroupDetail.as_view()), path('v1/user/resourcegroup/', api_user.ResourceGroupList.as_view()), - url(r'^v1/user/resourcegroup/(?P[0-9]+)/$', api_user.ResourceGroupDetail.as_view()), + path('v1/user/resourcegroup//', api_user.ResourceGroupDetail.as_view()), path('v1/user/auth/', api_user.UserAuth.as_view()), path('v1/user/2fa/', api_user.TwoFA.as_view()), path('v1/user/2fa/save/', api_user.TwoFASave.as_view()), path('v1/user/2fa/verify/', api_user.TwoFAVerify.as_view()), path('v1/instance/', api_instance.InstanceList.as_view()), - url(r'^v1/instance/(?P[0-9]+)/$', api_instance.InstanceDetail.as_view()), + path('v1/instance//', api_instance.InstanceDetail.as_view()), path('v1/instance/resource/', api_instance.InstanceResource.as_view()), path('v1/instance/tunnel/', api_instance.TunnelList.as_view()), path('v1/instance/rds/', api_instance.AliyunRdsList.as_view()),