import json from pprint import pprint, pformat import pydash as _ from django.contrib import messages from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin from django.core.urlresolvers import reverse, reverse_lazy from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse, Http404 from django.shortcuts import render, get_object_or_404, redirect from django.views.generic import ListView, DetailView, CreateView, View, UpdateView, TemplateView, FormView from django.views.generic.base import ContextMixin from .mixins import LastAccessMixin from .models import Project, ProjectFile, Portfolio, Candidate, Answer, Realty, Order from archilance.mixins import BaseMixin from users.models import User from .forms import ( ContractorProjectAnswerForm, CustomerProjectEditForm, PortfolioForm, CustomerProjectDeleteForm, CustomerProjectEditForm, CustomerProjectRestoreForm, CustomerProjectTrashForm, RealtyForm, ) class ProjectsView(ListView): model = Project template_name = 'project_list.html' class ProjectView(BaseMixin, View): template_name = 'project_detail.html' customer_template_name = 'customer_project_detail.html' form_class = ContractorProjectAnswerForm def get(self, request, *args, **kwargs): project = get_object_or_404(Project, pk=kwargs.get('pk')) context = self.get_context_data(**_.merge({}, request.GET, kwargs)) context.update({'project': project}) if request.user.is_authenticated() and request.user.is_customer(): return render(request, self.customer_template_name, context) else: form = self.form_class() context.update({'form': form}) return render(request, self.template_name, context) class CustomerProjectCreateView(BaseMixin, View): form_class = CustomerProjectEditForm realty_form = RealtyForm template_name = 'customer_project_create.html' def get(self, request, *args, **kwargs): if request.user.is_authenticated() and request.user.is_customer(): form = self.form_class(request=request) realty_form = self.realty_form(request=request, prefix='realty_form') context = self.get_context_data(**_.merge({}, request.GET, kwargs)) context.update({'form': form, 'realty_form': realty_form}) return render(request, self.template_name, context) else: return HttpResponseForbidden('403 Forbidden') def post(self, request, *args, **kwargs): if request.user.is_authenticated() and request.user.is_customer(): form = self.form_class(request.POST, request.FILES, request=request) form.is_valid() realty = form.cleaned_data.get('realty') if realty: realty_form = self.realty_form(request.POST, instance=realty, request=request, prefix='realty_form') else: realty_form = self.realty_form(request.POST, request=request, prefix='realty_form') if form.is_valid() and realty_form.is_valid(): project = form.save(commit=False) project.customer = request.user project.save() form.save_m2m() for file in request.FILES.getlist('new_files'): proj_file = ProjectFile.objects.create(file=file, project=project) proj_file.save() if realty: realty_form.save() else: realty = realty_form.save(commit=False) realty.user = request.user realty.save() realty_form.save_m2m() project.realty = realty # Connect a realty with a project project.save() messages.info(request, 'Проект успешно создан') redirect_to = reverse('projects:detail', kwargs={'pk': project.pk}) return redirect(redirect_to) else: if form.errors: messages.info(request, ( '
Произошла ошибка (form)
' '{form}'
).format(form=pformat(form.errors)))
if realty_form and realty_form.errors:
messages.info(request, (
'Произошла ошибка (realty_form)
' '{realty_form}'
).format(realty_form=pformat(realty_form.errors)))
context = self.get_context_data(**kwargs)
context.update({'form': form, 'realty_form': realty_form})
return render(request, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
class CustomerProjectEditView(BaseMixin, View):
form_class = CustomerProjectEditForm
realty_form = RealtyForm
template_name = 'customer_project_edit.html'
def get(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer():
project = get_object_or_404(request.user.projects, pk=kwargs.get('pk'))
form = self.form_class(instance=project, request=request)
realty = project.realty
if realty:
realty_form = self.realty_form(instance=project.realty, request=request, prefix='realty_form')
else:
realty_form = self.realty_form(request=request, prefix='realty_form')
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
context.update({'form': form, 'realty_form': realty_form})
return render(request, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
def post(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer():
project = get_object_or_404(request.user.projects, pk=kwargs.get('pk'))
form = self.form_class(request.POST, request.FILES, request=request, instance=project)
form.is_valid()
realty = form.cleaned_data.get('realty')
if realty:
realty_form = self.realty_form(request.POST, instance=realty, request=request, prefix='realty_form')
else:
realty_form = self.realty_form(request.POST, request=request, prefix='realty_form')
if form.is_valid() and realty_form.is_valid():
project = form.save(commit=False)
project.customer = request.user
project.files = form.cleaned_data.get('files') # TODO: Somehow get rid of this explicit assignment
project.save()
form.save_m2m()
for file in request.FILES.getlist('new_files'):
proj_file = ProjectFile.objects.create(file=file, project=project)
proj_file.save()
if realty:
realty_form.save()
else:
realty = realty_form.save(commit=False)
realty.user = request.user
realty.save()
realty_form.save_m2m()
project.realty = realty # Connect a realty with a project
project.save()
messages.info(request, 'Проект успешно отредактирован')
redirect_to = request.POST.get('next')
return redirect(redirect_to)
else:
if form.errors:
messages.info(request, (
'Произошла ошибка (form)
' '{form}'
).format(form=pformat(form.errors)))
if realty_form and realty_form.errors:
messages.info(request, (
'Произошла ошибка (realty_form)
' '{realty_form}'
).format(realty_form=pformat(realty_form.errors)))
context = self.get_context_data(**kwargs)
context.update({'form': form, 'realty_form': realty_form})
return render(request, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
class ContractorProjectAnswerView(BaseMixin, View):
form_class = ContractorProjectAnswerForm
def post(self, request, *args, **kwargs):
if not request.user.is_authenticated():
return HttpResponseForbidden()
form = self.form_class(request.POST)
project = get_object_or_404(Project, pk=kwargs.get('pk'))
if form.is_valid():
return self.form_valid(request, form, project)
return render(request, self.template_name, {'project': project, 'form': self.form_class})
def form_valid(self, request, form, project):
answer = form.save(commit=False)
answer.contractor = request.user
answer.project = project
answer.save()
return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.pk}))
class CustomerProjectTrashView(View):
form_class = CustomerProjectTrashForm
def post(self, req, *args, **kwargs):
if req.user.is_authenticated():
form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
if form.is_valid():
project = form.cleaned_data.get('pk')
project.state = 'trashed'
project.save()
messages.info(req, 'Проект перемещён в корзину')
else:
messages.info(req, 'Произошла ошибка: {msg}'.format(msg=pformat(form.errors)))
else:
return HttpResponseForbidden('403 Forbidden')
redirect_to = req.POST.get('next')
return redirect(redirect_to)
class CustomerProjectRestoreView(View):
form_class = CustomerProjectRestoreForm
def post(self, req, *args, **kwargs):
if req.user.is_authenticated():
form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
if form.is_valid():
project = form.cleaned_data.get('pk')
project.state = 'active'
project.save()
messages.info(req, 'Проект восстановлен из корзины')
else:
messages.info(req, 'Произошла ошибка: {msg}'.format(msg=pformat(form.errors)))
else:
return HttpResponseForbidden('403 Forbidden')
redirect_to = req.POST.get('next')
return redirect(redirect_to)
class CustomerProjectDeleteView(View):
form_class = CustomerProjectDeleteForm
def post(self, req, *args, **kwargs):
if req.user.is_authenticated():
form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
if form.is_valid():
project = form.cleaned_data.get('pk')
project.state = 'deleted'
project.save()
messages.info(req, 'Проект удалён навсегда')
else:
messages.info(req, 'Произошла ошибка: {msg}'.format(msg=pformat(form.errors)))
else:
return HttpResponseForbidden('403 Forbidden')
redirect_to = req.POST.get('next')
return redirect(redirect_to)
class ProjectComparisonView(DetailView):
model = Project
template_name = 'comparison.html'
def get_context_data(self, **kwargs):
context = super().get_context_data()
return context
def add_candidate(request, answer_id, project_id):
answer = Answer.objects.get(pk=answer_id)
project = Project.objects.get(pk=project_id)
candidate = Candidate.objects.create(answer=answer, project=project)
return HttpResponseRedirect(reverse('projects:detail',args=[project_id]))
class OfferOrderView(View):
template_name = 'chattest.html'
def get(self, request, *args, **kwargs):
return render(request, self.template_name)
def contractor_portfolio_create(request):
if request.is_ajax():
form = PortfolioForm(data=request.POST)
if form.is_valid():
instance = form.save(commit=False)
instance.save()
data = {'status': 'ok'}
else:
data = {'status': 'no', 'form_errors': form.errors}
return HttpResponse(json.dumps(data), content_type='application/json')
else:
raise Http404
class ContractorPortfolioUpdateView(UpdateView):
model = Portfolio
form_class = PortfolioForm
template_name = 'contractor_portfolio_edit.html'
def get_success_url(self):
return reverse('proje')
# import code; code.interact(local=dict(globals(), **locals()))