From 205abceb2b2f32f235c7acc6c3a2c59e8965dbe7 Mon Sep 17 00:00:00 2001 From: Mukhtar Date: Sun, 14 Aug 2016 15:39:22 +0300 Subject: [PATCH] #ARC-15 Add sortable ajax view --- projects/templates/comparison.html | 46 ++++++++++++++++++++------- projects/urls.py | 2 ++ projects/views.py | 50 ++++++++++++++++++++++-------- 3 files changed, 74 insertions(+), 24 deletions(-) diff --git a/projects/templates/comparison.html b/projects/templates/comparison.html index 09b23e7..1181df2 100644 --- a/projects/templates/comparison.html +++ b/projects/templates/comparison.html @@ -15,7 +15,7 @@

{{ object }}

- + @@ -26,13 +26,13 @@ - + {% for cand in object.candidates.all %} - - + + @@ -69,8 +69,14 @@ @@ -89,23 +95,41 @@ integrity="sha256-eGE6blurk5sHj+rmkfsGYeKyZx3M4bG+ZlFyA7Kns7E=" crossorigin="anonymous"> {% endblock %} diff --git a/projects/urls.py b/projects/urls.py index 7ad4a16..3325fc0 100644 --- a/projects/urls.py +++ b/projects/urls.py @@ -3,6 +3,7 @@ from django.views.generic import TemplateView from .views import ( add_candidate, + sort_candidates, contractor_portfolio_create, ContractorPortfolioTrashView, ContractorPortfolioUpdateView, @@ -34,6 +35,7 @@ urlpatterns = [ urls.url(r'^portfolio/(?P\d+)/edit/$', ContractorPortfolioUpdateView.as_view(), name='contractor-portfolio-edit'), urls.url(r'^candidate/add/(?P(\d+))/(?P(\d+))/$', add_candidate, name='add-candidate'), + urls.url(r'^candidate/comparison/sort/$', sort_candidates, name='comparison-sort'), urls.url(r'^candidate/comparison/(?P\d+)/$', ProjectComparisonView.as_view(), name='comparison'), urls.url(r'^offerorder/(?P(\d+))/(?P(\d+))/$', OfferOrderView.as_view(), name='offer-order'), diff --git a/projects/views.py b/projects/views.py index f152ae2..1622c0a 100644 --- a/projects/views.py +++ b/projects/views.py @@ -11,11 +11,14 @@ from django.views.generic import ListView, DetailView, CreateView, View, UpdateV from django.views.generic.base import ContextMixin from pprint import pprint, pformat import json -import pydash as _; _.map = _.map_; _.filter = _.filter_ +import pydash as _; + +_.map = _.map_; +_.filter = _.filter_ import re from .mixins import LastAccessMixin -from .models import Project, ProjectFile, Portfolio, PortfolioPhoto,Candidate, Answer, AnswerFile, Realty, Order +from .models import Project, ProjectFile, Portfolio, PortfolioPhoto, Candidate, Answer, AnswerFile, Realty, Order from archilance.mixins import BaseMixin from users.models import User, Team from work_sell.models import Picture @@ -57,8 +60,10 @@ class ProjectDetailWithContractorAnswerView(BaseMixin, View): team = None answer = None - try: team = contractor.team - except Team.DoesNotExist: pass + try: + team = contractor.team + except Team.DoesNotExist: + pass if team: answer = team.answers.first() @@ -69,7 +74,7 @@ class ProjectDetailWithContractorAnswerView(BaseMixin, View): if got_answer: context.update({'answer': answer}) else: - if request.GET.get('answer_as_team') == 'on': # TODO: Check for actual possibility to answer as a team + if request.GET.get('answer_as_team') == 'on': # TODO: Check for actual possibility to answer as a team context.update({'answer_as_team': True}) form = self.form_class(request=request, answer_as_team=True) else: @@ -84,7 +89,7 @@ class ProjectDetailWithContractorAnswerView(BaseMixin, View): context = self.get_context_data(**kwargs) answer_as_team = None - if request.POST.get('answer_as_team') == 'on': # TODO: Check for actual possibility to answer as a team + if request.POST.get('answer_as_team') == 'on': # TODO: Check for actual possibility to answer as a team answer_as_team = True if answer_as_team: @@ -255,7 +260,8 @@ class CustomerProjectCreateView(BaseMixin, View): return render(request, self.template_name, context) def post(self, request, *args, **kwargs): - form = self.form_class(request.POST, request=request) # Passing `request.FILES` seems unnecessary here. Files are added manually below + form = self.form_class(request.POST, + request=request) # Passing `request.FILES` seems unnecessary here. Files are added manually below form.is_valid() realty = form.cleaned_data.get('realty') @@ -284,7 +290,7 @@ class CustomerProjectCreateView(BaseMixin, View): realty.save() realty_form.save_m2m() - project.realty = realty # Connect a realty with a project + project.realty = realty # Connect a realty with a project project.save() messages.info(request, 'Проект успешно создан') @@ -350,7 +356,8 @@ class CustomerProjectEditView(BaseMixin, View): 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: Should we somehow get rid of this explicit assignment? + project.files = form.cleaned_data.get( + 'files') # TODO: Should we somehow get rid of this explicit assignment? project.save() form.save_m2m() @@ -366,7 +373,7 @@ class CustomerProjectEditView(BaseMixin, View): realty.save() realty_form.save_m2m() - project.realty = realty # Connect a realty with a project + project.realty = realty # Connect a realty with a project project.save() messages.info(request, 'Проект успешно отредактирован') @@ -393,7 +400,7 @@ class CustomerProjectEditView(BaseMixin, View): class ContractorPortfolioTrashView(View): form_class = ContractorPortfolioTrashForm - def post(self,request, *args, **kwargs): + def post(self, request, *args, **kwargs): form = self.form_class(_.merge({}, request.POST, kwargs), request=request) if form.is_valid(): portfolio = form.cleaned_data.get('pk') @@ -493,7 +500,23 @@ 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])) + return HttpResponseRedirect(reverse('projects:detail', args=[project_id])) + + +def sort_candidates(request): + if request.is_ajax(): + items = request.POST.getlist('items[]') + i = 1 + for item in items: + candidate = Candidate.objects.get(pk=item) + candidate.position = i + candidate.save() + i += 1 + + data = { + 'success': 'ok', + } + return HttpResponse(json.dumps(data), content_type='application/json') class OfferOrderView(View): @@ -537,9 +560,10 @@ class ContractorPortfolioUpdateView(UpdateView): from django.views.generic import DeleteView + + class PortfolioDelete(DeleteView): model = Portfolio success_url = reverse_lazy('users:contractor-profile') - # import code; code.interact(local=dict(globals(), **locals()))
КандидатБезопасные сделки Решение
{{ forloop.counter }}
{{ cand.position }} - {{ cand.answer.contractor.get_full_name }} {{ cand.answer.contractor.username }} + {{ cand.answer.author.username }} {{ cand.answer.budget }}
+
+
+ +
+
+