- {% for proj in projects %}
+ {% for project in projects %}
- {{ proj }}
+ {{ project.name }}
+
-
- Объект "{{ proj.realty.name }}"
+ Объект "{{ project.realty.name }}"
-
{{ proj.text|linebreaksbr|truncatechars:300 }}
+
+
{{ project.text|linebreaksbr|truncatechars:300 }}
{% if TEMPLATE_DEBUG %}
{{ proj|inspect }}
Specialization: {{ project.specialization }}
Specialization: {{ proj.specialization }}
Realty location: {{ project.realty.location }}
Realty location: {{ proj.realty.location }}
Constr. type: {{ project.realty.construction_type }}
Constr. type: {{ proj.realty.construction_type }}
Build. classif.: {{ proj.realty.building_classification }}
Build. classif.: {{ project.realty.building_classification }}
{% endif %}
- - {{ proj.created }}
- - {{ proj.hit_count.hits }}
- - {{ proj.answers.count }}
+ - {{ project.created }}
+ - {{ project.hit_count.hits }}
+ - {{ project.answers.count }}
{% if request.user.is_authenticated %}
- - {{ proj.customer.username }}
+ - {{ project.customer.username }}
{% endif %}
- {{ proj.budget }}
+ {{ project.budget }}
+
- {% if proj.secure_deal %}
+ {% if project.secure_deal %}
- Безопасная сделка
{% endif %}
-
- {{ proj.specialization.name }}
+ {{ project.specialization.name }}
diff --git a/projects/templatetags/project_tags.py b/projects/templatetags/project_tags.py
index 60af555..441e821 100644
--- a/projects/templatetags/project_tags.py
+++ b/projects/templatetags/project_tags.py
@@ -1,5 +1,6 @@
from django import template
from pprint import pprint, pformat
+import pydash as _; _.map = _.map_; _.filter = _.filter_
from archilance import util
@@ -22,5 +23,14 @@ def get_candidate_answers(project):
def get_rejected_answers(project):
return project.answers.filter(rejected=True)
+@register.filter
+def get_answer(project, contractor):
+ answer = _.find(project.answers.all(), lambda a: a.author == contractor)
+
+ if not answer:
+ answer = _.find(project.answers.all(), lambda a: a.author == contractor.team)
+
+ return answer
+
# import code; code.interact(local=dict(globals(), **locals()))
diff --git a/projects/views.py b/projects/views.py
index b2ef7a1..630ca47 100644
--- a/projects/views.py
+++ b/projects/views.py
@@ -19,6 +19,7 @@ import re
from .mixins import LastAccessMixin
from .models import Project, ProjectFile, Portfolio, PortfolioPhoto, Candidate, Answer, AnswerFile, AnswerMessage, Realty, Order
+from archilance import util
from archilance.mixins import BaseMixin
from users.models import User, Team
from work_sell.models import Picture, WorkSell, WorkSellPhoto
@@ -187,16 +188,25 @@ class RejectProjectAnswerView(BaseMixin, View):
def post(self, request, *args, **kwargs):
if request.user.is_contractor():
- answer = get_object_or_404(request.user.contractor_answers, pk=kwargs.get('pk'))
+ answer = None
+ contractor_answer = util.get_or_none(request.user.contractor_answers, pk=kwargs.get('pk'))
+
+ if contractor_answer:
+ answer = contractor_answer
+ elif request.user.team:
+ answer = util.get_or_none(request.user.team.answers, pk=kwargs.get('pk'))
+
+ if not answer:
+ raise Http404
elif request.user.is_customer():
project = get_object_or_404(request.user.projects, answers__pk=kwargs.get('pk'))
answer = get_object_or_404(project.answers, pk=kwargs.get('pk'))
-
+
answer.rejected = True
answer.save()
-
+
messages.info(request, 'Успешный отказ от проекта')
-
+
redirect_to = request.POST.get('next')
return redirect(redirect_to)
diff --git a/users/templates/contractor_office_open_projects.html b/users/templates/contractor_office_open_projects.html
index 0805cab..711eb76 100644
--- a/users/templates/contractor_office_open_projects.html
+++ b/users/templates/contractor_office_open_projects.html
@@ -1,5 +1,6 @@
{% extends 'partials/base.html' %}
+{% load project_tags %}
{% load specializtions_tags %}
{% load thumbnail %}
@@ -17,18 +18,18 @@
-
+{% endblock %}
+
+{% block js_block %}
{% endblock %}
diff --git a/users/urls.py b/users/urls.py
index c71597a..eee61fb 100755
--- a/users/urls.py
+++ b/users/urls.py
@@ -6,7 +6,7 @@ from .views import (
contractor_resumefile_create,
ContractorFilterView,
ContractorOfficeDetailView,
- ContractorOfficeOpenProjectsView,
+ ContractorOfficeProjectsView,
ContractorProfileDetailView,
ContractorResumeUpdateView,
CustomerProfileCurrentProjectsView,
@@ -36,5 +36,5 @@ urlpatterns = [
urls.url(r'^contractorsresumefiles/create/$', contractor_resumefile_create, name='contractor-resume-file-create'),
urls.url(r'^contractors/(?P
\d+)/$', ContractorProfileDetailView.as_view(), name='contractor-profile'),
urls.url(r'^contractor-office/(?P\d+)/$', ContractorOfficeDetailView.as_view(), name='contractor-office'),
- urls.url(r'^contractor-office/(?P\d+)/open-projects/$', ContractorOfficeOpenProjectsView.as_view(), name='contractor-office-open-projects'),
+ urls.url(r'^contractor-office/(?P\d+)/open-projects/$', ContractorOfficeProjectsView.as_view(), name='contractor-office-open-projects'),
]
diff --git a/users/views.py b/users/views.py
index 355a431..b4f616d 100644
--- a/users/views.py
+++ b/users/views.py
@@ -381,7 +381,7 @@ class ContractorOfficeDetailView(DetailView):
return context
-class ContractorOfficeOpenProjectsView(BaseMixin, View):
+class ContractorOfficeProjectsView(BaseMixin, View):
template_name = 'contractor_office_open_projects.html'
def dispatch(self, request, *args, **kwargs):
@@ -397,31 +397,36 @@ class ContractorOfficeOpenProjectsView(BaseMixin, View):
contractor = get_object_or_404(User.contractor_objects, pk=kwargs.get('pk'))
context['contractor'] = contractor
- private_projects = tuple(a.project for a in contractor.contractor_answers.all())
- private_project_count = len(private_projects)
+ # TODO: Show projects only with "active" state
- team_projects = tuple(a.project for a in contractor.team.answers.all())
- team_project_count = len(team_projects)
+ private_open_projects = tuple(a.project for a in contractor.contractor_answers.filter(project__state='active', rejected=False))
+ private_archived_projects = tuple(a.project for a in contractor.contractor_answers.filter(project__state='active', rejected=True))
- context['all_project_count'] = private_project_count + team_project_count
+ team_open_projects = tuple(a.project for a in contractor.team.answers.filter(project__state='active', rejected=False))
+ team_archived_projects = tuple(a.project for a in contractor.team.answers.filter(project__state='active', rejected=True))
- if request.GET.get('owner') == 'private':
- projects = private_projects
- elif request.GET.get('owner') == 'teams':
- projects = team_projects
- else:
- projects = itertools.chain(private_projects, team_projects)
+ context['all_project_count'] = \
+ len(private_open_projects) + len(private_archived_projects) + \
+ len(team_open_projects) + len(team_archived_projects)
- active_projects = _.filter(projects, lambda p: p.state == 'active')
- context['active_project_count'] = len(active_projects)
+ context['open_project_count'] = len(private_open_projects) + len(team_open_projects)
+ context['archived_project_count'] = len(private_archived_projects) + len(team_archived_projects)
- archived_projects = _.filter(projects, lambda p: p.state == 'trashed')
- context['archived_project_count'] = len(archived_projects)
-
- if request.GET.get('archived') == 'on':
- projects = archived_projects
+ if request.GET.get('owner') == 'private':
+ if request.GET.get('archived') == 'on':
+ projects = private_archived_projects
+ else:
+ projects = private_open_projects
+ elif request.GET.get('owner') == 'teams':
+ if request.GET.get('archived') == 'on':
+ projects = team_archived_projects
+ else:
+ projects = team_open_projects
else:
- projects = active_projects
+ if request.GET.get('archived') == 'on':
+ projects = itertools.chain(private_archived_projects, team_archived_projects)
+ else:
+ projects = itertools.chain(private_open_projects, team_open_projects)
context['projects'] = projects