Skip to content

Commit

Permalink
code management
Browse files Browse the repository at this point in the history
  • Loading branch information
RobbieHan committed Dec 19, 2018
1 parent 00f7112 commit 860ae14
Show file tree
Hide file tree
Showing 10 changed files with 687 additions and 6 deletions.
46 changes: 46 additions & 0 deletions apps/cmdb/forms.py
Original file line number Diff line number Diff line change
@@ -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)
6 changes: 6 additions & 0 deletions apps/cmdb/urls.py
Original file line number Diff line number Diff line change
@@ -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'),
]
53 changes: 53 additions & 0 deletions apps/cmdb/views_code.py
Original file line number Diff line number Diff line change
@@ -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
99 changes: 97 additions & 2 deletions apps/custom.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -42,6 +45,69 @@ def get_object(self, queryset=None):
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):
Expand All @@ -50,6 +116,11 @@ def post(self, request, *args, **kwargs):
if form.is_valid():
form.save()
res['result'] = True
else:
pattern = '<li>.*?<ul class=.*?><li>(.*?)</li>'
form_errors = str(form.errors)
errors = re.findall(pattern, form_errors)
res['error'] = errors[0]
return HttpResponse(json.dumps(res), content_type='application/json')


Expand All @@ -65,3 +136,27 @@ class SandboxUpdateView(LoginRequiredMixin, SandboxEditViewMixin, SandboxGetObje
def post(self, request, *args, **kwargs):
self.object = self.get_object()
return super().post(request, *args, **kwargs)


class SandboxListView(LoginRequiredMixin, SandboxMultipleObjectMixin, View):
"""
JsonResponse some json of objects, set by `self.model` or `self.queryset`.
"""
def get(self, request):
context = self.get_datatables_paginator(request)
return JsonResponse(context)


class SandboxDeleteView(LoginRequiredMixin, SandboxMultipleObjectMixin, View):

def post(self, request):
context = dict(result=False)
queryset = self.get_queryset()
if 'id' in request.POST and request.POST['id']:
id_list = map(int, request.POST['id'].split(','))
queryset.filter(id__in=id_list).delete()
context['result'] = True
else:
raise AttributeError("Sandbox delete view %s must be called with id. "
% self.__class__.__name__)
return JsonResponse(context)
3 changes: 1 addition & 2 deletions requirements/dev.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@
django==2.1.2
pillow==5.3.0
-r pro.txt
14 changes: 13 additions & 1 deletion requirements/pro.txt
Original file line number Diff line number Diff line change
@@ -1,2 +1,14 @@
django==2.1.2
pillow==5.3.0
pillow==5.3.0
mysqlclient==1.3.13
ipython==7.1.1
pyyaml==3.13
ruamel.yaml==0.15.80
python-nmap==0.6.1
redis==3.0.1
pymongo==3.7.1
paramiko==2.4.2
pycrypto==2.6.1
celery==4.2.1
celery-once==2.0.0
flower==0.9.2
2 changes: 1 addition & 1 deletion static/plugins/datatables/dataTables.const-1.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ var DATATABLES_CONSTANT = {

// datatables常量
DATA_TABLES : {
DEFAULT_OPTION : { // DataTables初始化选项
SERVER_SIDE_OPTION : { // DataTables初始化选项
oLanguage : {
sProcessing : "处理中...",
sLengthMenu : "每页 _MENU_ 项",//"显示 _MENU_ 项结果,",
Expand Down
Loading

0 comments on commit 860ae14

Please sign in to comment.