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 %}
-
- | {{ forloop.counter }} |
+
+ | {{ cand.position }} |
- {{ cand.answer.contractor.get_full_name }} {{ cand.answer.contractor.username }}
+ {{ cand.answer.author.username }}
|
{{ cand.answer.budget }} |
@@ -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()))