#ARC-35 #ARC-14

remotes/origin/PR-39
ArturBaybulatov 10 years ago
parent 7ceafb015f
commit 9a66398585
  1. 7
      README.md
  2. 20
      projects/migrations/0012_project_rejected_answers_count.py
  3. 1
      projects/models.py
  4. 285
      projects/templates/project_detail.html
  5. 10
      projects/views.py

@ -14,6 +14,13 @@ python manage.py makemigrations projects specializations users && \
python manage.py migrate python manage.py migrate
``` ```
Enable solr-thumbnail:
```
python manage.py makemigrations thumbnail
python manage.py migrate
```
``` ```
python manage.py runserver python manage.py runserver
``` ```

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-19 09:32
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0011_merge'),
]
operations = [
migrations.AddField(
model_name='project',
name='rejected_answers_count',
field=models.PositiveIntegerField(default=0),
),
]

@ -87,6 +87,7 @@ class Project(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
price_and_term_required = models.BooleanField(default=False) price_and_term_required = models.BooleanField(default=False)
realty = models.ForeignKey(Realty, blank=True, null=True, related_name='projects') realty = models.ForeignKey(Realty, blank=True, null=True, related_name='projects')
rejected_answers_count = models.PositiveIntegerField(default=0)
specialization = TreeForeignKey(Specialization, related_name='projects') specialization = TreeForeignKey(Specialization, related_name='projects')
state = models.CharField(default='active', max_length=20, choices=STATES) state = models.CharField(default='active', max_length=20, choices=STATES)
term = models.IntegerField(default=0) term = models.IntegerField(default=0)

@ -453,7 +453,7 @@
{% elif request.user.is_customer and project.answers.exists %} {% elif request.user.is_customer and project in request.user.projects.all %}
@ -466,169 +466,184 @@
<div class="col-lg-12 exButton"> <div class="col-lg-12 exButton">
<div class="btn-group" role="group" aria-label="..."> <div class="btn-group" role="group" aria-label="...">
<button type="button" class="btn btn-default"> <button type="button" class="btn btn-default">
Новые <span>+7</span> Новые <span>{{ project.answers.count|sub:project.candidates.count }}</span>
</button> </button>
<button type="button" class="btn btn-default"> <button type="button" class="btn btn-default">
Кандидаты <span>7</span> Кандидаты <span>{{ project.candidates.count }}</span>
</button> </button>
<button type="button" class="btn btn-default"> <button type="button" class="btn btn-default">
Отказал <span>7</span> Отказал <span>{{ project.rejected_answers_count }}</span>
</button> </button>
</div> </div>
</div> </div>
</div> </div>
<div class="col-lg-12 compareBlock">
<div class="col-lg-2 col-lg-offset-5">
<p><a href="{% url 'projects:comparison' project.pk %}">Сравнить кандидатов</a></p>
</div>
</div>
<div class="col-lg-12 exNew">
<p>Новые исполнители</p>
</div>
{% for answer in project.answers.all %}
<div class="candidateBlock disTab"> {% if project.answers.exists %}
<div class="candidate"> {% if project.candidates.count > 1 %}
<div class="col-lg-4"> <div class="col-lg-12 compareBlock">
<a href="#" class="aLinkExe"> <div class="col-lg-2 col-lg-offset-5">
<div class="imgExecutor"> <p><a href="{% url 'projects:comparison' project.pk %}">Сравнить кандидатов</a></p>
{% if answer.author.avatar %} </div>
<img src="{{ answer.author.avatar.url }}" alt="execitor-image"> </div>
{% else %} {% endif %}
<img src="{% static 'img/profile.jpg' %}" alt="execitor-image">
<div class="col-lg-12 exNew">
<p>Новые исполнители</p>
</div>
{% for answer in project.answers.all %}
<div class="candidateBlock disTab">
<div class="candidate">
<div class="col-lg-4">
<a href="#" class="aLinkExe">
<div class="imgExecutor">
{% if answer.author.avatar %}
<img src="{{ answer.author.avatar.url }}" alt="execitor-image">
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="execitor-image">
{% endif %}
</div>
</a>
<p class="nameExecutor">
{% if answer.author|class_name == 'User' %}
<a href="#">{{ answer.author.get_full_name }} [{{ answer.author.username }}]</a>
{% elif answer.author|class_name == 'Team' %}
<a href="#">{{ answer.author.name }}</a>
{% endif %} {% endif %}
</div> </p>
</a>
<p class="navv2">На сайте {{ answer.author.created }}</p>
<p class="nameExecutor">
{% if answer.author|class_name == 'User' %} {% if answer.author|class_name == 'User' %}
<a href="#">{{ answer.author.get_full_name }} [{{ answer.author.username }}]</a> {% if answer.author.contractor_status == 'free' %}
{% elif answer.author|class_name == 'Team' %} <div class="statusUser">Свободен</div><!-- ............. -->
<a href="#">{{ answer.author.name }}</a> {% endif %}
{% endif %} {% endif %}
</p> </div>
<p class="navv2">На сайте {{ answer.author.created }}</p>
{% if answer.author|class_name == 'User' %} <div class="col-lg-3 retts">
{% if answer.author.contractor_status == 'free' %} {% ratings_widget answer.author.pk 'restList2' %}
<div class="statusUser">Свободен</div><!-- ............. -->
{% if answer.author|class_name == 'User' and answer.author.cro %}
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div>
{% elif answer.author|class_name == 'Team' %}
<!-- TODO -->
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div>
{% endif %} {% endif %}
{% endif %} </div>
</div>
<div class="col-lg-3 retts">
{% ratings_widget answer.author.pk 'restList2' %}
{% if answer.author|class_name == 'User' and answer.author.cro %} <div class="col-lg-2 listCens">
<div class="sroUser sroExecutor"> <p>
<div class="iconSRO"></div> Цена:
<p>Есть допуск СРО</p> <span>{{ answer.budget|intcomma }}</span>
</div> <i class="fa fa-rub"></i>
{% elif answer.author|class_name == 'Team' %} </p>
<!-- TODO --> <p>
Срок: <span>{{ answer.term }} {{ answer.get_currency_display }} {{ answer.get_term_type_display|decap }}</span>
</p>
<p>Опубликован: {{ answer.created|date:'M d, Y' }}</p>
</div>
<div class="col-lg-3 retts">
<a href="{% url 'projects:add-candidate' answer_id=answer.pk project_id=project.pk %}" class="candLink candLink1">
Кандидат
</a>
<div class="sroUser sroExecutor"> <a href="{% url 'chat:chat-user' %}" class="candLink candLink2">
<div class="iconSRO"></div> предложить проект
<p>Есть допуск СРО</p> </a>
</div>
{% endif %} <form action="{% url 'projects:customer-reject-project-answer' pk=answer.pk %}" method="POST" novalidate>
</div> {% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}">
<div class="col-lg-2 listCens"> <a href="#" onclick="$(this).closest('form').submit(); return false" class="candLink candLink3">отказ</a>
<p> </form>
Цена: </div>
<span>{{ answer.budget|intcomma }}</span>
<i class="fa fa-rub"></i>
</p>
<p>
Срок: <span>{{ answer.term }} {{ answer.get_currency_display }} {{ answer.get_term_type_display|decap }}</span>
</p>
<p>Опубликован: {{ answer.created|date:'M d, Y' }}</p>
</div>
<div class="col-lg-3 retts">
<a href="{% url 'projects:add-candidate' answer_id=answer.pk project_id=project.pk %}" class="candLink candLink1">
Кандидат
</a>
<a href="{% url 'chat:chat-user' %}" class="candLink candLink2"> <div class="gallMini disTab">
предложить проект {% for portf in answer.portfolios.all %}
</a> <div class="col-lg-3">
<div class="insetCol box-sizing disTab">
<div class="imgGal" style="background: url('{{ portf.photos.first.img.url }}') no-repeat center">
<div class="imgFigure"></div>
</div>
</div>
</div>
{% endfor %}
</div>
<form action="{% url 'projects:customer-reject-project-answer' pk=answer.pk %}" method="POST" novalidate> <div class="commBlock44 disTab">
{% csrf_token %} {% for message in answer.messages.all %}
<input type="hidden" name="next" value="{{ request.path }}"> <div class="comm44 disTab">
<a href="#" onclick="$(this).closest('form').submit(); return false" class="candLink candLink3">отказ</a> <div class="col-lg-10 col-lg-offset-1">
</form> {% if message.is_sender_customer %}
</div> <p class="nameComm nameCommAct">
{{ project.customer.get_full_name }}
<div class="gallMini disTab"> </p>
{% for portf in answer.portfolios.all %} {% else %}
<div class="col-lg-3"> <p class="nameComm">
<div class="insetCol box-sizing disTab"> {% if answer.author|class_name == 'User' %}
<div class="imgGal" style="background: url('{{ portf.photos.first.img.url }}') no-repeat center"> {{ answer.author.get_full_name }}
<div class="imgFigure"></div> {% elif answer.author|class_name == 'Team' %}
{{ answer.author.name }}
{% endif %}
</p>
{% endif %}
<span class="dateComm44">
{{ message.created }}
</span>
<p class="textComm44">
{{ message.text }}
</p>
</div> </div>
</div> </div>
</div> {% endfor %}
{% endfor %}
</div>
<div class="commBlock44 disTab">
{% for message in answer.messages.all %}
<div class="comm44 disTab"> <div class="comm44 disTab">
{# <div class="i col-lg-10 col-lg-offset-1">#}
{# <a href="#" onclick="return false" class="answerComm">#}
{# Ответить#}
{# </a>#}
{# </div>#}
<div class="col-lg-10 col-lg-offset-1"> <div class="col-lg-10 col-lg-offset-1">
{% if message.is_sender_customer %} <form action="{% url 'projects:create-answer-message' pk=answer.pk %}" method="POST" novalidate>
<p class="nameComm nameCommAct"> {% csrf_token %}
{{ project.customer.get_full_name }} <input type="hidden" name="next" value="{% url 'projects:detail' pk=project.pk %}">
</p>
{% else %} <div><textarea name="text"></textarea></div>
<p class="nameComm"> <div><button type="submit">Отправить</button></div>
{% if answer.author|class_name == 'User' %} </form>
{{ answer.author.get_full_name }}
{% elif answer.author|class_name == 'Team' %}
{{ answer.author.name }}
{% endif %}
</p>
{% endif %}
<span class="dateComm44">
{{ message.created }}
</span>
<p class="textComm44">
{{ message.text }}
</p>
</div> </div>
</div> </div>
{% endfor %}
<div class="comm44 disTab">
{# <div class="i col-lg-10 col-lg-offset-1">#}
{# <a href="#" onclick="return false" class="answerComm">#}
{# Ответить#}
{# </a>#}
{# </div>#}
<div class="col-lg-10 col-lg-offset-1">
<form action="{% url 'projects:create-answer-message' pk=answer.pk %}" method="POST" novalidate>
{% csrf_token %}
<input type="hidden" name="next" value="{% url 'projects:detail' pk=project.pk %}">
<div><textarea name="text"></textarea></div>
<div><button type="submit">Отправить</button></div>
</form>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> {% endfor %}
{% endfor %} {% endif %}
{% endif %} {% endif %}

@ -4,7 +4,7 @@ from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMix
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.urlresolvers import reverse, reverse_lazy from django.core.urlresolvers import reverse, reverse_lazy
from django.db.models import Q from django.db.models import Q, F
from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse, Http404 from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse, Http404
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import ListView, DetailView, CreateView, DeleteView, View, UpdateView, TemplateView, FormView from django.views.generic import ListView, DetailView, CreateView, DeleteView, View, UpdateView, TemplateView, FormView
@ -181,8 +181,13 @@ class ContractorRejectProjectAnswerView(BaseMixin, View):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
answer = get_object_or_404(request.user.contractor_answers, pk=kwargs.get('pk')) answer = get_object_or_404(request.user.contractor_answers, pk=kwargs.get('pk'))
project = answer.project
answer.delete() answer.delete()
project.rejected_answers_count = F('rejected_answers_count') + 1
project.save()
messages.info(request, 'Вы успешно отказались от проекта') messages.info(request, 'Вы успешно отказались от проекта')
redirect_to = request.POST.get('next') redirect_to = request.POST.get('next')
@ -204,6 +209,9 @@ class CustomerRejectProjectAnswerView(BaseMixin, View):
answer.delete() answer.delete()
project.rejected_answers_count = F('rejected_answers_count') + 1
project.save()
messages.info(request, 'Вы успешно отказали пользователю в проекте') messages.info(request, 'Вы успешно отказали пользователю в проекте')
redirect_to = request.POST.get('next') redirect_to = request.POST.get('next')

Loading…
Cancel
Save