From 473f8cd9e8aaf9c692aeb4414e1ef6659c3c6418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E4=BA=8C=E7=8C=9B?= Date: Sat, 7 Dec 2019 22:11:25 +0800 Subject: [PATCH] A api update --- spug_api/apps/config/models.py | 36 +++++++------ spug_api/apps/config/urls.py | 1 + spug_api/apps/config/views.py | 93 ++++++++++++++++++++++++++++++++-- 3 files changed, 106 insertions(+), 24 deletions(-) diff --git a/spug_api/apps/config/models.py b/spug_api/apps/config/models.py index 94595ea..c0b0f45 100644 --- a/spug_api/apps/config/models.py +++ b/spug_api/apps/config/models.py @@ -33,33 +33,26 @@ class Service(models.Model, ModelMixin): ordering = ('-id',) -class ConfigKey(models.Model, ModelMixin): +class Config(models.Model, ModelMixin): TYPES = ( ('app', 'App'), ('src', 'Service') ) - name = models.CharField(max_length=50) type = models.CharField(max_length=5, choices=TYPES) o_id = models.IntegerField() - is_public = models.BooleanField() - - def __repr__(self): - return f'' - - class Meta: - db_table = 'config_keys' - - -class ConfigValue(models.Model, ModelMixin): + key = models.CharField(max_length=50) env = models.ForeignKey(Environment, on_delete=models.PROTECT) - key = models.ForeignKey(ConfigKey, on_delete=models.PROTECT) - value = models.TextField() + value = models.TextField(null=True) + desc = models.CharField(max_length=255, null=True) + is_public = models.BooleanField(default=True) + updated_at = models.CharField(max_length=20) + updated_by = models.ForeignKey(User, on_delete=models.PROTECT) def __repr__(self): - return f'' + return f'' class Meta: - db_table = 'config_values' + db_table = 'configs' class ConfigHistory(models.Model, ModelMixin): @@ -68,12 +61,17 @@ class ConfigHistory(models.Model, ModelMixin): ('2', '更新'), ('3', '删除') ) + type = models.CharField(max_length=5) + o_id = models.IntegerField() key = models.CharField(max_length=50) + env_id = models.IntegerField() + value = models.TextField(null=True) + desc = models.CharField(max_length=255, null=True) + is_public = models.BooleanField() old_value = models.TextField(null=True) - new_value = models.TextField(null=True) action = models.CharField(max_length=2, choices=ACTIONS) - created_at = models.CharField(max_length=20, default=human_time) - created_by = models.ForeignKey(User, on_delete=models.PROTECT) + updated_at = models.CharField(max_length=20) + updated_by = models.ForeignKey(User, on_delete=models.PROTECT) def __repr__(self): return f'' diff --git a/spug_api/apps/config/urls.py b/spug_api/apps/config/urls.py index 06c1809..8d85e4e 100644 --- a/spug_api/apps/config/urls.py +++ b/spug_api/apps/config/urls.py @@ -3,6 +3,7 @@ from django.urls import path from .views import * urlpatterns = [ + path('', ConfigView.as_view()), path('environment/', EnvironmentView.as_view()), path('service/', ServiceView.as_view()), ] diff --git a/spug_api/apps/config/views.py b/spug_api/apps/config/views.py index 59557b6..f77ac4b 100644 --- a/spug_api/apps/config/views.py +++ b/spug_api/apps/config/views.py @@ -1,6 +1,6 @@ from django.views.generic import View -from libs import json_response, JsonParser, Argument, human_time -from apps.config.models import Environment, ConfigValue, Service, ConfigKey +from libs import json_response, JsonParser, Argument +from apps.config.models import * class EnvironmentView(View): @@ -30,7 +30,7 @@ class EnvironmentView(View): Argument('id', type=int, help='请指定操作对象') ).parse(request.GET) if error is None: - if ConfigValue.objects.filter(env_id=form.id).exists(): + if Config.objects.filter(env_id=form.id).exists(): return json_response(error='该环境已存在关联的配置信息,请删除相关配置后再尝试删除') Environment.objects.filter(pk=form.id).delete() return json_response(error=error) @@ -63,7 +63,90 @@ class ServiceView(View): Argument('id', type=int, help='请指定操作对象') ).parse(request.GET) if error is None: - if ConfigKey.objects.filter(type='src', o_id=form.id).exists(): + if Config.objects.filter(type='src', o_id=form.id).exists(): return json_response(error='该服务已存在关联的配置信息,请删除相关配置后再尝试删除') Service.objects.filter(pk=form.id).delete() - return json_response(error=error) \ No newline at end of file + return json_response(error=error) + + +class ConfigView(View): + def get(self, request): + form, error = JsonParser( + Argument('id', type=int, help='未指定操作对象'), + Argument('type', filter=lambda x: x in dict(Config.TYPES), help='缺少必要参数'), + Argument('env_id', type=int, help='缺少必要参数'), + ).parse(request.GET) + if error is None: + configs = Config.objects.filter(type=form.type, o_id=form.id, env_id=form.env_id) + return json_response(configs) + return json_response(error=error) + + def post(self, request): + form, error = JsonParser( + Argument('o_id', type=int, help='缺少必要参数'), + Argument('type', filter=lambda x: x in dict(Config.TYPES), help='缺少必要参数'), + Argument('envs', type=list, filter=lambda x: len(x), help='请选择环境'), + Argument('key', help='请输入Key'), + Argument('is_public', type=bool, help='缺少必要参数'), + Argument('value', type=str, default=''), + Argument('desc', required=False) + ).parse(request.body) + if error is None: + form.value = form.value.strip() + form.updated_at = human_time() + form.updated_by = request.user + envs = form.pop('envs') + for env_id in envs: + Config.objects.create(env_id=env_id, **form) + ConfigHistory.objects.create(action='1', env_id=env_id, **form) + return json_response(error=error) + + def patch(self, request): + form, error = JsonParser( + Argument('id', type=int, help='缺少必要参数'), + Argument('value', type=str, default=''), + Argument('desc', required=False) + ).parse(request.body) + if error is None: + form.value = form.value.strip() + config = Config.objects.filter(pk=form.id).first() + if not config: + return json_response(error='未找到指定对象') + if config.value != form.value: + old_value = config.value + config.value = form.value + config.desc = form.desc + config.updated_at = human_time() + config.updated_by = request.user + config.save() + ConfigHistory.objects.create( + action='2', + old_value=old_value, + **config.to_dict(excludes=('id',))) + elif config.desc != form.desc: + config.desc = form.desc + config.save() + return json_response(error=error) + + def delete(self, request): + form, error = JsonParser( + Argument('id', type=int, help='未指定操作对象') + ).parse(request.GET) + if error is None: + config = Config.objects.filter(pk=form.id).first() + if config: + ConfigHistory.objects.create( + action='3', + type=config.type, + o_id=config.o_id, + env_id=config.env_id, + key=config.key, + desc=config.desc, + is_public=config.is_public, + old_value=config.value, + value='', + updated_at=human_time(), + updated_by=request.user + ) + config.delete() + return json_response(error=error)