Skip to content

Commit

Permalink
Merge pull request #1086 from longguikeji/feature-555
Browse files Browse the repository at this point in the history
Feature 555
  • Loading branch information
fanhe-lg committed Jul 28, 2022
2 parents bb2af65 + 6723514 commit 74559c8
Show file tree
Hide file tree
Showing 8 changed files with 113 additions and 15 deletions.
8 changes: 4 additions & 4 deletions api/v1/schema/approve_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,17 @@ class Config:
model_fields = ['id']

username: str = Field(title=_('Username', '用户名'))
path: str = Field(title=_('Path', '请求路径'))
request_path: str = Field(title=_('Path', '请求路径'))
method: str = Field(title=_('Method', '请求方法'))
status: str = Field(title=_('Status', '状态'))

@staticmethod
def resolve_username(obj):
return obj.user.username

@staticmethod
def resolve_path(obj):
return obj.action.path
# @staticmethod
# def resolve_path(obj):
# return obj.action.path

@staticmethod
def resolve_method(obj):
Expand Down
2 changes: 1 addition & 1 deletion api/v1/views/approve_request.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def approve_request_list(
request, tenant_id: str, package: str = "", is_approved: str = ""
):
tenant = request.tenant
requests = ApproveRequest.valid_objects.filter(action__tenant=tenant)
requests = ApproveRequest.valid_objects.filter(user__tenant=tenant)
if package:
requests = requests.filter(action__extension__package=package)
if is_approved == "true":
Expand Down
7 changes: 5 additions & 2 deletions arkid/core/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from arkid.core.openapi import get_openapi_schema
from arkid.core.event import register_event, dispatch_event, Event, EventDisruptionData
from arkid.core.models import ExpiringToken, Tenant

from arkid.core.token import refresh_token, generate_token

def add_fields(cls, **field_definitions: Any):
new_fields: Dict[str, ModelField] = {}
Expand Down Expand Up @@ -73,7 +73,10 @@ def authenticate(self, request, token):
from arkid.core.models import User
try:
if request.user and isinstance(request.user, User): # restore 审批请求时,user已经存在,不需要再校验token
token = ExpiringToken.objects.get(user=request.user).token
token = ExpiringToken.objects.filter(user=request.user).first()
if not token:
token = ExpiringToken.objects.create(user=request.user, token=generate_token())
tenant = request.tenant
else:
token = ExpiringToken.objects.get(token=token)

Expand Down
21 changes: 18 additions & 3 deletions arkid/core/approve.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,20 @@
from arkid.extension.models import Extension
import copy


def restore_approve_request(approve_request):
environ = copy.deepcopy(approve_request.environ)
body = approve_request.body
environ["wsgi.input"] = io.BytesIO(body)
request = WSGIRequest(environ)
request.tenant = approve_request.action.tenant
request.user = approve_request.user
request.tenant = approve_request.user.tenant
view_func, args, kwargs = resolve(request.path)
klass = view_func.__self__
operation, _ = klass._find_operation(request)
request.operation_id = operation.operation_id or klass.api.get_openapi_operation_id(operation)
operation = klass._find_operation(request)
request.operation_id = operation.operation_id or klass.api.get_openapi_operation_id(
operation
)
response = operation.run(request, **kwargs)
logger.info(
f'Restore Request: {approve_request.user.username}:{approve_request.action.method}:{approve_request.action.path}'
Expand All @@ -30,11 +33,23 @@ def create_approve_request(http_request, user, approve_action):
environ.pop("wsgi.input")
environ.pop("wsgi.errors")
environ.pop("wsgi.file_wrapper")

request_get = http_request.GET.dict()
if 'page' in request_get:
request_get.pop('page')
if 'page_size' in request_get:
request_get.pop('page_size')

request_post = http_request.POST.dict()

approve_request = ApproveRequest.valid_objects.create(
action=approve_action,
user=user,
environ=environ,
body=http_request.body,
request_path=http_request.path,
request_get=request_get,
request_post=request_post,
)
return approve_request

Expand Down
50 changes: 47 additions & 3 deletions arkid/core/approve_request_middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,10 @@ def process_view(self, request, view_func, view_args, view_kwargs):
if not user:
return None

approve_request = ApproveRequest.valid_objects.filter(
action=approve_action, user=user
).first()
# approve_request = ApproveRequest.valid_objects.filter(
# action=approve_action, user=user
# ).first()
approve_request = self.get_prev_approve_request(request, user, approve_action)
if not approve_request:
approve_request = create_approve_request(request, user, approve_action)
dispatch_event(
Expand All @@ -74,3 +75,46 @@ def process_view(self, request, view_func, view_args, view_kwargs):
return response
else:
return None

def get_prev_approve_request(self, request, user, approve_action):
if request.method == 'GET':
get_data = request.GET.dict()
if 'page' in get_data:
get_data.pop('page')
if 'page_size' in get_data:
get_data.pop('page_size')
approve_request = ApproveRequest.valid_objects.filter(
action=approve_action,
user=user,
request_get=get_data,
request_path=request.path,
).first()
return approve_request
elif request.method in ['POST', 'PUT']:
body_unicode = request.body.decode('utf-8')
try:
new_body = json.loads(body_unicode)
except Exception as e:
new_body = body_unicode
approve_request = ApproveRequest.valid_objects.filter(
action=approve_action,
user=user,
request_path=request.path,
).first()
if approve_request:
stored_body = approve_request.body.decode('utf-8')
try:
old_body = json.loads(stored_body)
except Exception as e:
old_body = stored_body
if new_body == old_body:
return approve_request
elif request.method == 'DELETE':
approve_request = ApproveRequest.valid_objects.filter(
action=approve_action,
user=user,
request_path=request.path,
).first()
return approve_request

return None
28 changes: 28 additions & 0 deletions arkid/core/migrations/0019_approverequest_request_get_and_more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Generated by Django 4.0.6 on 2022-07-28 07:14

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('core', '0018_app_arkstore_app_id'),
]

operations = [
migrations.AddField(
model_name='approverequest',
name='request_get',
field=models.JSONField(default={}, null=True, verbose_name='Request GET'),
),
migrations.AddField(
model_name='approverequest',
name='request_path',
field=models.CharField(default='', max_length=255, verbose_name='Request Path'),
),
migrations.AddField(
model_name='approverequest',
name='request_post',
field=models.JSONField(default={}, null=True, verbose_name='Request POST'),
),
]
10 changes: 9 additions & 1 deletion arkid/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -576,9 +576,17 @@ class Meta(object):
verbose_name=_('Status', "状态"),
)

request_path = models.CharField(
default='', verbose_name=_('Request Path', '请求路径'), max_length=255
)
request_get = models.JSONField(default={}, null=True, verbose_name=_('Request GET', '请求路径参数'))
request_post = models.JSONField(
default={}, null=True, verbose_name=_('Request POST', '请求表单数据')
)

def __str__(self):
return (
f'{self.action.name}:{self.action.method}:{self.action.path}:{self.status}'
f'{self.action.name}:{self.action.method}:{self.request_path}:{self.status}'
)


Expand Down
2 changes: 1 addition & 1 deletion arkid/core/tenant_middleware.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ def get_operation_id(self, request):
view_func, _, _ = resolve(request.path)
try:
klass = view_func.__self__
operation, _ = klass._find_operation(request)
operation = klass._find_operation(request)
return operation.operation_id or klass.api.get_openapi_operation_id(operation)
except:
return ''

0 comments on commit 74559c8

Please sign in to comment.