diff --git a/common/templatetags/common_tags.py b/common/templatetags/common_tags.py index 6c0ed77..647feb0 100644 --- a/common/templatetags/common_tags.py +++ b/common/templatetags/common_tags.py @@ -76,6 +76,11 @@ def basename(val): return os.path.basename(val) +@register.filter +def pk(obj): + return obj.pk + + @register.simple_tag def lorem(*args, **kwargs): return util.lorem(*args, **kwargs) diff --git a/projects/templates/project_detail.html b/projects/templates/project_detail.html index ae48616..6141576 100644 --- a/projects/templates/project_detail.html +++ b/projects/templates/project_detail.html @@ -248,7 +248,7 @@
{% csrf_token %} - отказ + отказ
@@ -593,7 +593,7 @@
{% csrf_token %} - отказ + отказ
@@ -747,7 +747,7 @@
{% csrf_token %} - отказ + отказ
diff --git a/projects/templates/project_filter.html b/projects/templates/project_filter.html index 36aec07..b012e46 100644 --- a/projects/templates/project_filter.html +++ b/projects/templates/project_filter.html @@ -173,54 +173,55 @@
- {% 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 @@
- + Открытые проекты 0 / {{ active_project_count }} - + Архив {{ archived_project_count }} @@ -53,13 +54,15 @@
State: {{ project.state }}

Specialization: {{ proj.specialization }}
Specialization: {{ project.specialization }}

Realty location: {{ proj.realty.location }}
Answer author: {{ project|get_answer:contractor }}

Constr. type: {{ proj.realty.construction_type }}
Realty location: {{ project.realty.location }}

Build. classif.: {{ proj.realty.building_classification }}
Constr. type: {{ project.realty.construction_type }}

Build. classif.: {{ project.realty.building_classification }}
{% endif %} @@ -85,13 +88,14 @@ {{ project.specialization.name }} -
  • -
    +
  • @@ -103,12 +107,45 @@ {% include 'partials/footer.html' %}
    - +{% 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