You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
4.8 KiB
157 lines
4.8 KiB
import json
|
|
import pydash as _;
|
|
|
|
_.map = _.map_;
|
|
_.filter = _.filter_
|
|
from pprint import pprint, pformat
|
|
from django.shortcuts import render, redirect
|
|
from django.contrib import messages
|
|
from django.core.urlresolvers import reverse
|
|
from django.http import JsonResponse, HttpResponse
|
|
from django.core.files.base import ContentFile
|
|
from django.views.generic import ListView, DetailView, CreateView, View, \
|
|
UpdateView, DeleteView, TemplateView
|
|
|
|
from projects.models import BuildingClassfication, ConstructionType
|
|
from .models import WorkSell, Picture, WorkSellPhoto
|
|
from .forms import WorkSellForm, ContractorWorkSellTrashForm
|
|
from .serialize import serialize
|
|
from .response import JSONResponse, response_mimetype
|
|
|
|
|
|
class PictureCreateView(CreateView):
|
|
model = Picture
|
|
fields = '__all__'
|
|
|
|
def form_valid(self, form):
|
|
self.object = form.save()
|
|
files = [serialize(self.object)]
|
|
data = {'files': files}
|
|
response = JSONResponse(data, mimetype=response_mimetype(self.request))
|
|
response['Content-Disposition'] = 'inline; filename=files.json'
|
|
return response
|
|
|
|
def form_invalid(self, form):
|
|
data = json.dumps(form.errors)
|
|
return HttpResponse(content=data, status=400, content_type='application/json')
|
|
|
|
|
|
class BasicCreateView(PictureCreateView):
|
|
template_name = 'picture_basic_form.html'
|
|
|
|
|
|
class WorkSellsView(ListView):
|
|
model = WorkSell
|
|
template_name = 'worksells_list.html'
|
|
# paginate_by = 20
|
|
paginate_by = 18
|
|
|
|
def get_form_kwargs(self, **kwargs):
|
|
kwargs = super().get_form_kwargs
|
|
|
|
def get_queryset(self, **kwargs):
|
|
qs = WorkSell.objects.all()
|
|
# if self.request.GET:
|
|
# budget_from = self.request.GET
|
|
# pass
|
|
return qs
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['building_classifications'] = BuildingClassfication.objects.all()
|
|
context['construction_types'] = ConstructionType.objects.all()
|
|
return context
|
|
|
|
|
|
class WorkSellDetail(DetailView):
|
|
model = WorkSell
|
|
template_name = 'worksell_detail.html'
|
|
|
|
def get_context_data(self, **kwargs):
|
|
context = super().get_context_data(**kwargs)
|
|
context['worksell_related'] = WorkSell.objects.all()[:5]
|
|
return context
|
|
|
|
|
|
def work_sell_create(request):
|
|
if request.is_ajax():
|
|
form = WorkSellForm(data=request.POST)
|
|
if form.is_valid():
|
|
instance = form.save(commit=False)
|
|
instance.save()
|
|
images_ids = request.POST.get('images-ids').split(';')[:-1]
|
|
for pk in images_ids:
|
|
picture = Picture.objects.get(pk=pk)
|
|
temp_file = ContentFile(picture.file.read())
|
|
temp_file.name = picture.file.name
|
|
w_photo = WorkSellPhoto()
|
|
w_photo.img = temp_file
|
|
w_photo.worksell = instance
|
|
w_photo.save()
|
|
data = {'status': 'ok'}
|
|
else:
|
|
data = {'status': 'no', 'form_errors': form.errors}
|
|
return HttpResponse(json.dumps(data), content_type='application/json')
|
|
|
|
|
|
class WorkSellCreateView(CreateView):
|
|
model = WorkSell
|
|
form_class = WorkSellForm
|
|
template_name = 'worksell_create.html'
|
|
|
|
|
|
class WorkSellUpdateView(UpdateView):
|
|
model = WorkSell
|
|
form_class = WorkSellForm
|
|
template_name = 'worksell_edit.html'
|
|
|
|
def get_success_url(self):
|
|
return reverse('work_sell:list')
|
|
|
|
|
|
class WorkSellDeleteView(DeleteView):
|
|
model = WorkSell
|
|
template_name = 'worksell_delete.html'
|
|
|
|
def get_success_url(self):
|
|
return reverse('work_sell:list')
|
|
|
|
|
|
class ContractorWorkSellTrashView(View):
|
|
form_class = ContractorWorkSellTrashForm
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
form = self.form_class(_.merge({}, request.POST, kwargs), request=request)
|
|
if form.is_valid():
|
|
worksell = form.cleaned_data.get('pk')
|
|
worksell.delete()
|
|
messages.info(request, 'Готовая работа удалена')
|
|
else:
|
|
messages.info(request, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
|
|
|
|
redirect_to = request.POST.get('next')
|
|
return redirect(redirect_to)
|
|
|
|
|
|
class UploadView(View):
|
|
template_name = 'upload.html'
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
return render(request, self.template_name)
|
|
|
|
|
|
class JSONResponseMixin(object):
|
|
def render_to_json_response(self, context, **response_kwargs):
|
|
return JsonResponse(
|
|
self.get_data(context),
|
|
**response_kwargs
|
|
)
|
|
|
|
def get_data(self, context):
|
|
context = {'test': 'data'}
|
|
return context
|
|
|
|
|
|
class JSONView(JSONResponseMixin, TemplateView):
|
|
def render_to_response(self, context, **response_kwargs):
|
|
return self.render_to_json_response(context, **response_kwargs)
|
|
|