From 860ae14d4c725d5542f3ba984e65f8877df17628 Mon Sep 17 00:00:00 2001 From: RobbieHan Date: Wed, 19 Dec 2018 21:41:50 +0800 Subject: [PATCH] code management --- apps/cmdb/forms.py | 46 +++ apps/cmdb/urls.py | 6 + apps/cmdb/views_code.py | 53 ++++ apps/custom.py | 99 ++++++- requirements/dev.txt | 3 +- requirements/pro.txt | 14 +- .../plugins/datatables/dataTables.const-1.js | 2 +- templates/cmdb/code.html | 274 ++++++++++++++++++ templates/cmdb/code_create.html | 97 +++++++ templates/cmdb/code_update.html | 99 +++++++ 10 files changed, 687 insertions(+), 6 deletions(-) create mode 100644 apps/cmdb/forms.py create mode 100644 apps/cmdb/views_code.py create mode 100644 templates/cmdb/code.html create mode 100644 templates/cmdb/code_create.html create mode 100644 templates/cmdb/code_update.html diff --git a/apps/cmdb/forms.py b/apps/cmdb/forms.py new file mode 100644 index 0000000..4f44c9b --- /dev/null +++ b/apps/cmdb/forms.py @@ -0,0 +1,46 @@ +# @Time : 2018/12/19 16:13 +# @Author : RobbieHan +# @File : forms.py + +from django import forms + +from .models import Code + + +class CodeCreateForm(forms.ModelForm): + class Meta: + model = Code + fields = '__all__' + + error_messages = { + 'key': {'required': 'key不能为空'}, + 'value': {'required': 'value不能为空'} + } + + def clean(self): + cleaned_data = super(CodeCreateForm, self).clean() + key = cleaned_data.get('key') + value = cleaned_data.get('value') + + if Code.objects.filter(key=key).count(): + raise forms.ValidationError('key:{}已存在'.format(key)) + + if Code.objects.filter(value=value).count(): + raise forms.ValidationError('value: {}已存在'.format(value)) + + +class CodeUpdateForm(CodeCreateForm): + + def clean(self): + cleaned_data = self.cleaned_data + key = cleaned_data.get('key') + value = cleaned_data.get('value') + + if self.instance: + matching_code = Code.objects.exclude(pk=self.instance.pk) + if matching_code.filter(key=key).exists(): + msg = 'key:{} 已经存在'.format(key) + raise forms.ValidationError(msg) + if matching_code.filter(value=value).exists(): + msg = 'value:{} 已经存在'.format(value) + raise forms.ValidationError(msg) \ No newline at end of file diff --git a/apps/cmdb/urls.py b/apps/cmdb/urls.py index 7cbc875..2e2503c 100644 --- a/apps/cmdb/urls.py +++ b/apps/cmdb/urls.py @@ -1,9 +1,15 @@ from django.urls import path from .views import CmdbView +from . import views_code app_name = 'cmdb' urlpatterns = [ path('', CmdbView.as_view(), name='index'), + path('portal/code/', views_code.CodeView.as_view(), name='portal-code'), + path('portal/code/create/', views_code.CodeCreateView.as_view(), name='portal-code-create'), + path('portal/code/list/', views_code.CodeListView.as_view(), name='portal-code-list'), + path('portal/code/update/', views_code.CodeUpdateView.as_view(), name='portal-code-update'), + path('portal/code/delete/', views_code.CodeDeleteView.as_view(), name='portal-code-delete'), ] diff --git a/apps/cmdb/views_code.py b/apps/cmdb/views_code.py new file mode 100644 index 0000000..af63d20 --- /dev/null +++ b/apps/cmdb/views_code.py @@ -0,0 +1,53 @@ +# @Time : 2018/12/19 13:31 +# @Author : RobbieHan +# @File : views_code.py.py + +from django.views.generic import TemplateView + +from system.mixin import LoginRequiredMixin +from custom import (BreadcrumbMixin, SandboxCreateView, + SandboxListView, SandboxUpdateView, SandboxDeleteView) +from .models import Code +from .forms import CodeCreateForm, CodeUpdateForm + + +class CodeView(LoginRequiredMixin, BreadcrumbMixin, TemplateView): + template_name = 'cmdb/code.html' + + def get_context_data(self): + context = dict(code_parent=Code.objects.filter(parent=None)) + return context + + +class CodeCreateView(SandboxCreateView): + model = Code + form_class = CodeCreateForm + template_name_suffix = '_create' + + def get_context_data(self, **kwargs): + kwargs['code_parent'] = Code.objects.filter(parent=None) + return super().get_context_data(**kwargs) + + +class CodeListView(SandboxListView): + model = Code + fields = ['id', 'key', 'value', 'parent__value'] + + def get(self, request): + if 'parent' in request.GET and request.GET['parent']: + self.filters = dict(parent__key=request.GET['parent']) + return super().get(request) + + +class CodeUpdateView(SandboxUpdateView): + model = Code + form_class = CodeUpdateForm + template_name_suffix = '_update' + + def get_context_data(self, **kwargs): + kwargs['code_parent'] = Code.objects.filter(parent=None) + return super().get_context_data(**kwargs) + + +class CodeDeleteView(SandboxDeleteView): + model = Code diff --git a/apps/custom.py b/apps/custom.py index 6c2e497..0315e2c 100644 --- a/apps/custom.py +++ b/apps/custom.py @@ -3,10 +3,13 @@ # @File : custom.py import json +import re -from django.views.generic import CreateView, UpdateView +from django.views.generic import CreateView, UpdateView, View from django.shortcuts import HttpResponse -from django.http import Http404 +from django.http import Http404, JsonResponse +from django.db.models.query import QuerySet +from django.core.exceptions import ImproperlyConfigured from system.mixin import LoginRequiredMixin from system.models import Menu @@ -42,6 +45,69 @@ class SandboxGetObjectMixin: return obj +class SandboxMultipleObjectMixin: + + filters = {} + fields = [] + queryset = None + model = None + + def get_queryset(self): + if self.queryset is not None: + queryset = self.queryset + if isinstance(queryset, QuerySet): + queryset = queryset.all() + elif self.model is not None: + queryset = self.model._default_manager.all() + else: + raise ImproperlyConfigured( + "%(cls)s is missing a QuerySet. Define " + "%(cls)s.model, %(cls)s.queryset." + % {'cls': self.__class__.__name__} + ) + return queryset + + def get_datatables_paginator(self, request): + datatables = request.GET + draw = int(datatables.get('draw')) + start = int(datatables.get('start')) + length = int(datatables.get('length')) + order_column = datatables.get('order[0][column]') + order_dir = datatables.get('order[0][dir]') + order_field = datatables.get('columns[{}][data]'.format(order_column)) + queryset = self.get_queryset() + if order_dir == 'asc': + queryset = queryset.order_by(order_field) + else: + queryset = queryset.order_by('-{0}'.format(order_field)) + record_total_count = queryset.count() + filters = self.get_filters() + fields = self.get_fields() + if filters: + queryset = queryset.filter(**self.filters) + if fields: + queryset = queryset.values(*self.fields) + + record_filter_count = queryset.count() + + object_list = queryset[start:(start + length)] + + data = list(object_list) + + return { + 'draw': draw, + 'recordsTotal': record_total_count, + 'recordsFiltered': record_filter_count, + 'data': data, + } + + def get_filters(self): + return self.filters + + def get_fields(self): + return self.fields + + class SandboxEditViewMixin: def post(self, request, *args, **kwargs): @@ -50,6 +116,11 @@ class SandboxEditViewMixin: if form.is_valid(): form.save() res['result'] = True + else: + pattern = '
  • .*?