forked from RobbieHan/sandboxMP
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcustom.py
162 lines (129 loc) · 5.3 KB
/
custom.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
# @Time : 2018/11/9 22:06
# @Author : RobbieHan
# @File : custom.py
import json
import re
from django.views.generic import CreateView, UpdateView, View
from django.shortcuts import HttpResponse
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
class BreadcrumbMixin:
def get_context_data(self, **kwargs):
menu = Menu.get_menu_by_request_url(url=self.request.path_info)
if menu is not None:
kwargs.update(menu)
return super().get_context_data(**kwargs)
class SandboxGetObjectMixin:
def get_object(self, queryset=None):
if queryset is None:
queryset = self.get_queryset()
if 'id' in self.request.GET and self.request.GET['id']:
queryset = queryset.filter(id=int(self.request.GET['id']))
elif 'id' in self.request.POST and self.request.POST['id']:
queryset = queryset.filter(id=int(self.request.POST['id']))
else:
raise AttributeError("Generic detail view %s must be called with id. "
% self.__class__.__name__)
try:
obj = queryset.get()
except queryset.model.DoesNotExist:
raise Http404("No %(verbose_name)s found matching the query" %
{'verbose_name': queryset.model._meta.verbose_name})
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(**filters)
if fields:
queryset = queryset.values(*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):
res = dict(result=False)
form = self.get_form()
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')
class SandboxCreateView(LoginRequiredMixin, SandboxEditViewMixin, CreateView):
""""
View for create an object, with a response rendered by a template.
Returns information with Json when the data is created successfully or fails.
"""
class SandboxUpdateView(LoginRequiredMixin, SandboxEditViewMixin, SandboxGetObjectMixin, UpdateView):
"""View for updating an object, with a response rendered by a template."""
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)