remotes/origin/setup
ArturBaybulatov 10 years ago
parent 7b51de1a09
commit 7ff07860db
  1. 30
      projects/forms.py
  2. 16
      projects/migrations/0012_merge.py
  3. 588
      projects/templates/project_detail.html
  4. 1
      projects/urls.py
  5. 110
      projects/views.py

@ -168,18 +168,40 @@ class ContractorProjectAnswerForm(forms.ModelForm):
class Meta: class Meta:
model = Answer model = Answer
# ('author', 'Relation? True', 'Null? None', 'Blank? None'),
# ('content_type', 'Relation? True', 'Null? False', 'Blank? False'),
# ('portfolios', 'Relation? True', 'Null? False', 'Blank? True'),
# ('project', 'Relation? True', 'Null? False', 'Blank? False'),
#
# ('candidates', 'Relation? True', 'Null? True', 'Blank? None'),
# ('files', 'Relation? True', 'Null? True', 'Blank? None'),
#
#
# ('budget', 'Relation? False', 'Null? False', 'Blank? False'),
# ('created', 'Relation? False', 'Null? False', 'Blank? False'),
# ('currency', 'Relation? False', 'Null? False', 'Blank? False'),
# ('object_id', 'Relation? False', 'Null? False', 'Blank? False'),
# ('term', 'Relation? False', 'Null? False', 'Blank? False'),
# ('term_type', 'Relation? False', 'Null? False', 'Blank? False'),
# ('text', 'Relation? False', 'Null? False', 'Blank? False'),
# ('secure_deal_only', 'Relation? False', 'Null? False', 'Blank? True'),
fields = ( fields = (
'budget', 'budget',
'currency', 'currency',
'term', 'term',
'term_type', 'term_type',
'text', 'text',
'secure_deal_only',
# 'portfolios',
# 'files',
) )
widgets = { # widgets = {
'currency': forms.Select(attrs={'class': 'selectpicker'}), # 'currency': forms.Select(attrs={'class': 'selectpicker'}),
'term_type': forms.Select(attrs={'class': 'selectpicker'}), # 'term_type': forms.Select(attrs={'class': 'selectpicker'}),
} # }
class StageForm(forms.ModelForm): class StageForm(forms.ModelForm):

@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-02 17:12
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('projects', '0009_auto_20160802_1226'),
('projects', '0011_auto_20160802_1653'),
]
operations = [
]

@ -144,200 +144,502 @@
</form> </form>
{% endif %} {% endif %}
</div> </div>
</div>
{% if request.user.is_contractor %}
<form action="{% url 'projects:contractor-project-answer' pk=pk %}" method="POST">
{% csrf_token %}
<input type="hidden" name="next" value="{% url 'projects:detail' pk=pk %}">
<div class="polsF1 disTab">
{% if request.user.is_contractor and True %}
<form action="{% url 'projects:contractor-project-answer' pk=project.pk %}" method="POST" novalidate>
{% csrf_token %}
<input type="hidden" name="next" value="{% url 'projects:detail' pk=project.pk %}">
<div class="a polsF1 disTab">
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Стоимость</p>
<input type="text" class="box-sizing" name="{{ form.budget.html_name }}">
</div>
</div>
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
{{ form.currency }}
</div>
</div>
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Срок</p>
<input type="text" class="box-sizing" name="{{ form.term.html_name }}">
</div>
</div>
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
{{ form.term_type }}
</div>
</div>
</div>
<div class="a polsF1 disTab searchF1">
<div class="col-lg-9">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Текст</p>
<textarea name="{{ form.text.html_name }}" id="text-new"></textarea>
</div>
</div>
<div class="col-lg-3"></div>
</div>
<div class="a polsF1 disTab searchF1">
<div class="col-lg-9">
<p>Портфолио</p>
<ul>
{% for p in request.user.portfolios.all %}
<li><input type="checkbox" style="opacity: 1"> {{ p.name }}</li>
{% endfor %}
</ul>
</div>
</div>
<div class="a polsF1 disTab searchF1">
<div class="col-lg-9">
<button>Добавить файл</button> Не более 10 файлов общим объемом до 500 Мб
</div>
</div>
<div class="a polsF1 disTab searchF1">
<div class="col-lg-9">
<input type="checkbox" style="opacity: 1"> Работаю только по безопасной сделке
</div>
</div>
<div class="a polsF1 disTab searchF1">
<div class="col-lg-3">
<button type="submit">Опубликовать ответ</button>
</div>
</div>
<div class="polsF1 disTab searchF1"></div>
</form>
{% elif request.user.is_contractor and False %}
{# {% with answer=tmp_answer %}#}
{# <div class="candidateBlock disTab">#}
{# <div class="candidate">#}
{# <div class="col-lg-4">#}
{# <a href="#" class="aLinkExe">#}
{# <div class="imgExecutor">#}
{# <img src="{% static 'img/profile.jpg' %}" alt="execitor-image">#}
{# </div>#}
{# </a>#}
{# <p class="nameExecutor">#}
{# <a href="#"> {{ answer.contractor.get_full_name }} []</a>#}
{# </p>#}
{# <p class="navv2">На сайте {{ answer.contractor.created }}</p>#}
{# <div class="statusUser">Свободен</div>#}
{# </div>#}
{# <div class="col-lg-3 retts">#}
{# <ul class="rettList restList2">#}
{# <li>Рейтинг: <span> 0</span></li>#}
{# <li>Безопасные сделки: <span> 0</span></li>#}
{# <li>#}
{# <a href="javascript:void(0)">Отзывы:#}
{# <span> + 0</span>#}
{# <small> 0</small>#}
{# <mark> - 0</mark>#}
{# </a>#}
{# </li>#}
{# </ul>#}
{# <div class="sroUser sroExecutor">#}
{# <div class="iconSRO"></div>#}
{# <p>Есть допуск СРО</p>#}
{# </div>#}
{# </div>#}
{# <div class="col-lg-2 listCens">#}
{# <p>Цена:#}
{# <span> {{ answer.cost|intcomma }}</span>#}
{# <i class="fa fa-rub"></i>#}
{# </p>#}
{# <p>#}
{# Срок: <span>{{ answer.term }} {{ answer.term_type }}</span>#}
{# </p>#}
{# <p>Опубликован: {{ answer.created }}</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 'projects:offer-order' answer_id=answer.pk project_id=project.pk %}" class="candLink candLink2">#}
{# предложить проект#}
{# </a>#}
{# <a href="javascript:void(0)" class="candLink candLink3">#}
{# отказ#}
{# </a>#}
{# </div>#}
{# <div class="gallMini disTab">#}
{# <div class="col-lg-3">#}
{# <div class="insetCol box-sizing disTab">#}
{# <div class="imgGal">#}
{# <div class="imgFigure"></div>#}
{# </div>#}
{# </div>#}
{# </div>#}
{# </div>#}
{# <div class="commBlock44 disTab">#}
{# <div class="comm44 disTab">#}
{# <div class="col-lg-10 col-lg-offset-1">#}
{# <p class="nameComm">#}
{# Иванов Петр Иванович#}
{# </p>#}
{# <span class="dateComm44">#}
{# 13.01.2016 / 21:05#}
{# </span>#}
{# <div class="stars box-sizing">#}
{# <span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>#}
{# <span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>#}
{# <span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>#}
{# <span class="glyphicon glyphicon-star" aria-hidden="true"></span>#}
{# <span class="glyphicon glyphicon-star" aria-hidden="true"></span>#}
{# </div>#}
{# <p class="textComm44">Lorem ipsum dolor sit amet</p>#}
{# </div>#}
{# </div>#}
{# </div>#}
{# </div>#}
{# </div>#}
{# {% endwith %}#}
<div class="b candidateBlock disTab">
<div class="candidate">
<div class="col-lg-4">
<a href="#" class="aLinkExe">
<div class="imgExecutor">
<img src="{% static 'img/profile.jpg' %}" alt="execitor-image">
</div>
</a>
<p class="nameExecutor">
<a href="#">Иванов Петр Иванович [ivanov_petr]</a>
</p>
<p class="navv2">На сайте 8 лет и 3 месяца</p>
<div class="statusUser">Свободен</div>
</div>
<div class="col-lg-3 retts">
<ul class="rettList restList2">
<li>Рейтинг: <span> 1245</span></li>
<li>Безопасные сделки: <span> 5</span></li>
<li>
<a href="javascript:void(0)">Отзывы:
<span> + 385</span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div>
</div>
<div class="col-lg-2 listCens">
<p>Цена:
<span> 35 000</span>
<i class="fa fa-rub"></i>
</p>
<p>
Срок: <span>3 недели</span>
</p>
<p>Опубликован: 22.04.2016</p>
</div>
<div class="col-lg-3 retts">
<a href="javascript:void(0)" class="candLink candLink1">
Кандидат
</a>
<a href="javascript:void(0)" class="candLink candLink2">
предложить проект
</a>
<a href="javascript:void(0)" class="candLink candLink3">
отказ
</a>
</div>
<div class="gallMini disTab">
<div class="col-lg-3"> <div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="insetCol box-sizing disTab">
<p>Стоимость</p> <div class="imgGal">
<input type="text" class="box-sizing" name="{{ form.budget.name }}"/> <div class="imgFigure"></div>
</div>
</div> </div>
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="insetCol box-sizing disTab">
<p>Бюджет</p> <div class="imgGal">
{{ form.currency }} <div class="imgFigure"></div>
</div>
</div> </div>
</div> </div>
<div class="col-lg-6"></div>
</div>
<div class="polsF1 disTab">
<div class="col-lg-3"> <div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="insetCol box-sizing disTab">
<p>Срок</p> <div class="imgGal">
<input type="text" class="box-sizing" name="{{ form.term.name }}"/> <div class="imgFigure"></div>
</div>
</div> </div>
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="insetCol box-sizing disTab">
<p>Тип срока</p> <div class="imgGal">
{{ form.term_type }} <div class="imgFigure"></div>
</div>
</div> </div>
</div> </div>
<div class="col-lg-6"></div>
</div> </div>
<div class="polsF1 disTab"> <div class="commBlock44 disTab">
<div class="col-lg-9"> <div class="comm44 disTab">
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="col-lg-10 col-lg-offset-1">
<p>Текст</p> <p class="nameComm">
<textarea name="{{ form.text.name }}" id="text-new"></textarea> Иванов Петр Иванович
</p>
<span class="dateComm44">
13.01.2016 / 21:05
</span>
<div class="stars box-sizing">
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
</div>
<p class="textComm44">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum laoreet. Proin gravida dolor sit amet lacus accumsan et viverra justo commodo. Proin sodales pulvinar tempor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam fermentum, nulla luctus pharetra vulputate, felis tellus mollis orci, sed rhoncus sapien nunc eget odio.
</p>
</div> </div>
</div> </div>
<div class="col-lg-3"></div> <div class="comm44 disTab">
</div> <div class="col-lg-10 col-lg-offset-1">
<p class="nameComm nameCommAct">
<div class="polsF1 disTab"> Иванов Петр Иванович
<div class="col-lg-9"> </p>
<div class="textAreaBlock2 text-nn box-sizing disTab"> <span class="dateComm44">
{% for p in user.portfolio.all %} 13.01.2016 / 21:05
<h3>{{ p }}</h3> </span>
{% endfor %} <p class="textComm44">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum laoreet. Proin gravida dolor sit amet lacus accumsan et viverra justo commodo. Proin sodales pulvinar tempor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam fermentum, nulla luctus pharetra vulputate, felis tellus mollis orci, sed rhoncus sapien nunc eget odio.
</p>
<a href="javascript:void(0)" class="answerComm">
Ответить
</a>
</div> </div>
</div> </div>
<div class="col-lg-3"></div>
</div> </div>
</div>
</div>
{% elif request.user.is_customer %}
<div class="polsF1 disTab">
<div class="col-lg-3"><input type="submit" value="Создать"/></div>
<div class="exBigBlock disTab">
<div class="col-lg-12">
<p class="titleEx">Исполнители</p>
</div>
<div class="col-lg-12 exButton">
<div class="btn-group" role="group" aria-label="...">
<button type="button" class="btn btn-default">
Новые <span>+7</span>
</button>
<button type="button" class="btn btn-default">
Кандидаты <span>7</span>
</button>
<button type="button" class="btn btn-default">
Отказал <span>7</span>
</button>
</div> </div>
</form> </div>
</div>
<div class="col-lg-12 compareBlock">
<div class="col-lg-2 col-lg-offset-5">
<p>Сравнить кандидатов</p>
</div>
</div>
<div class="col-lg-12 exNew">
<p>Новые исполнители</p>
</div>
{% elif request.user.is_customer %}
<div class="exBigBlock disTab">
<div class="col-lg-12"> <div class="candidateBlock disTab">
<p class="titleEx">Исполнители</p> <div class="candidate">
<div class="col-lg-4">
<a href="#" class="aLinkExe">
<div class="imgExecutor">
<img src="img/profile.jpg" alt="execitor-image">
</div>
</a>
<p class="nameExecutor">
<a href="#">Иванов Петр Иванович [ivanov_petr]</a>
</p>
<p class="navv2">На сайте 8 лет и 3 месяца</p>
<div class="statusUser">Свободен</div>
</div> </div>
<div class="col-lg-12 exButton"> <div class="col-lg-3 retts">
<div class="btn-group" role="group" aria-label="..."> <ul class="rettList restList2">
<button type="button" class="btn btn-default"> <li>Рейтинг: <span> 1245</span></li>
Новые <span>+0</span> <li>Безопасные сделки: <span> 5</span></li>
</button> <li>
<button type="button" class="btn btn-default"> <a href="javascript:void(0)">Отзывы:
Кандидаты <span>0</span> <span> + 385</span>
</button> <small> 0</small>
<button type="button" class="btn btn-default"> <mark> - 0</mark>
Отказал <span>0</span> </a>
</button> </li>
</ul>
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div> </div>
</div> </div>
</div> <div class="col-lg-2 listCens">
<div class="col-lg-12 compareBlock"> <p>Цена:
<div class="col-lg-2 col-lg-offset-5"> <span> 35 000</span>
<p>Сравнить кандидатов</p> <i class="fa fa-rub"></i>
</p>
<p>
Срок: <span>3 недели</span>
</p>
<p>Опубликован: 22.04.2016</p>
</div> </div>
</div> <div class="col-lg-3 retts">
<div class="col-lg-12 exNew"> <a href="javascript:void(0)" class="candLink candLink1">
<p>Новые исполнители</p> Кандидат
</div> </a>
<div class="candidateBlock disTab"> <a href="javascript:void(0)" class="candLink candLink2">
{% for answer in project.answers.all %} предложить проект
<div class="candidate"> </a>
<div class="col-lg-4"> <a href="javascript:void(0)" class="candLink candLink3">
<a href="#" class="aLinkExe"><div class="imgExecutor"> отказ
<img src="{% static 'img/profile.jpg' %}" alt="execitor-image"> </a>
</div></a> </div>
<p class="nameExecutor"> <div class="gallMini disTab">
<a href="#"> {{ answer.contractor.get_full_name }} []</a> <div class="col-lg-3">
</p> <div class="insetCol box-sizing disTab">
<p class="navv2">На сайте {{ answer.contractor.created }}</p> <div class="imgGal">
<div class="statusUser">Свободен</div> <div class="imgFigure"></div>
</div>
</div> </div>
<div class="col-lg-3 retts"> </div>
<ul class="rettList restList2"> <div class="col-lg-3">
<li>Рейтинг: <span> 0</span></li> <div class="insetCol box-sizing disTab">
<li>Безопасные сделки: <span> 0</span></li> <div class="imgGal">
<li> <div class="imgFigure"></div>
<a href="javascript:void(0)">Отзывы:
<span> + 0</span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div> </div>
</div> </div>
<div class="col-lg-2 listCens"> </div>
<p>Цена: <div class="col-lg-3">
<span> {{ answer.cost|intcomma }}</span> <div class="insetCol box-sizing disTab">
<i class="fa fa-rub"></i> <div class="imgGal">
</p> <div class="imgFigure"></div>
<p> </div>
Срок: <span>{{ answer.term }} {{ answer.term_type }}</span>
</p>
<p>Опубликован: {{ answer.created }}</p>
</div> </div>
<div class="col-lg-3 retts"> </div>
<div class="col-lg-3">
<a href="{% url 'projects:add-candidate' answer_id=answer.id project_id=project.id %}" class="candLink candLink1"> <div class="insetCol box-sizing disTab">
Кандидат <div class="imgGal">
</a> <div class="imgFigure"></div>
<a href="{% url 'projects:offer-order' answer_id=answer.id project_id=project.id %}" class="candLink candLink2"> </div>
предложить проект
</a>
<a href="javascript:void(0)" class="candLink candLink3">
отказ
</a>
</div> </div>
<div class="gallMini disTab"> </div>
<div class="col-lg-3"> </div>
<div class="insetCol box-sizing disTab"> <div class="commBlock44 disTab">
<div class="imgGal"> <div class="comm44 disTab">
<div class="imgFigure"></div> <div class="col-lg-10 col-lg-offset-1">
</div> <p class="nameComm">
</div> Иванов Петр Иванович
</p>
<span class="dateComm44">
13.01.2016 / 21:05
</span>
<div class="stars box-sizing">
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
</div> </div>
<p class="textComm44">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum laoreet. Proin gravida dolor sit amet lacus accumsan et viverra justo commodo. Proin sodales pulvinar tempor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam fermentum, nulla luctus pharetra vulputate, felis tellus mollis orci, sed rhoncus sapien nunc eget odio.
</p>
</div> </div>
<div class="commBlock44 disTab"> </div>
{# <div class="comm44 disTab">#} <div class="comm44 disTab">
{# <div class="col-lg-10 col-lg-offset-1">#} <div class="col-lg-10 col-lg-offset-1">
{# <p class="nameComm">#} <p class="nameComm nameCommAct">
{# Иванов Петр Иванович#} Иванов Петр Иванович
{# </p>#} </p>
{# <span class="dateComm44">#} <span class="dateComm44">
{# 13.0.2016 / 21:05#} 13.01.2016 / 21:05
{# </span>#} </span>
{# <div class="stars box-sizing">#} <p class="textComm44">
{# <span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>#} Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum laoreet. Proin gravida dolor sit amet lacus accumsan et viverra justo commodo. Proin sodales pulvinar tempor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam fermentum, nulla luctus pharetra vulputate, felis tellus mollis orci, sed rhoncus sapien nunc eget odio.
{# <span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>#} </p>
{# <span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>#} <a href="javascript:void(0)" class="answerComm">
{# <span class="glyphicon glyphicon-star" aria-hidden="true"></span>#} Ответить
{# <span class="glyphicon glyphicon-star" aria-hidden="true"></span>#} </a>
{# </div>#}
{# <p class="textComm44">Lorem ipsum dolor sit amet</p>#}
{# </div>#}
{# </div>#}
</div> </div>
</div> </div>
{% endfor %} </div>
</div> </div>
{% endif %} </div>
</div> {% endif %}

@ -30,6 +30,7 @@ urlpatterns = [
urls.url(r'^(?P<pk>\d+)/delete/$', CustomerProjectDeleteView.as_view(), name='customer-project-delete'), urls.url(r'^(?P<pk>\d+)/delete/$', CustomerProjectDeleteView.as_view(), name='customer-project-delete'),
urls.url(r'^(?P<pk>\d+)/answer/$', ContractorProjectAnswerView.as_view(), name='contractor-project-answer'), urls.url(r'^(?P<pk>\d+)/answer/$', ContractorProjectAnswerView.as_view(), name='contractor-project-answer'),
urls.url(r'^portfolio/create/$', contractor_portfolio_create, name='contractor-portfolio-create'), urls.url(r'^portfolio/create/$', contractor_portfolio_create, name='contractor-portfolio-create'),
urls.url(r'^portfolio/(?P<pk>\d+)/edit/$', ContractorPortfolioUpdateView.as_view(), name='contractor-portfolio-edit'), urls.url(r'^portfolio/(?P<pk>\d+)/edit/$', ContractorPortfolioUpdateView.as_view(), name='contractor-portfolio-edit'),

@ -42,6 +42,8 @@ class ProjectView(BaseMixin, View):
project = get_object_or_404(Project, pk=kwargs.get('pk')) project = get_object_or_404(Project, pk=kwargs.get('pk'))
context.update({'project': project}) context.update({'project': project})
# context.update({'tmp_answer': Answer.objects.order_by('?').first()})
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))
if request.user.is_authenticated() and request.user.is_contractor(): if request.user.is_authenticated() and request.user.is_contractor():
@ -323,21 +325,40 @@ class CustomerProjectEditView(BaseMixin, View):
class ContractorProjectAnswerView(BaseMixin, View): class ContractorProjectAnswerView(BaseMixin, View):
form_class = ContractorProjectAnswerForm form_class = ContractorProjectAnswerForm
def post(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated(): if request.user.is_authenticated() and request.user.is_contractor():
return HttpResponseForbidden() return super().dispatch(request, *args, **kwargs)
form = self.form_class(request.POST) else:
project = get_object_or_404(Project, pk=kwargs.get('pk')) return HttpResponseForbidden('403 Forbidden')
def post(self, req, *args, **kwargs):
form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
if form.is_valid(): if form.is_valid():
return self.form_valid(request, form, project) project = form.cleaned_data.get('pk')
return render(request, self.template_name, {'project': project, 'form': self.form_class}) project.state = 'trashed'
project.save()
messages.info(req, 'OK')
else:
messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
redirect_to = req.POST.get('next')
return redirect(redirect_to)
# def post(self, request, *args, **kwargs):
# form = self.form_class(request.POST)
# project = get_object_or_404(Project, pk=kwargs.get('pk'))
# if form.is_valid():
# answer = form.save(commit=False)
# answer.contractor = request.user
# answer.project = project
# answer.save()
# return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.pk}))
# return render(request, self.template_name, {'project': project, 'form': self.form_class})
def form_valid(self, request, form, project):
answer = form.save(commit=False)
answer.contractor = request.user
answer.project = project
answer.save()
return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.pk}))
class CustomerProjectTrashView(View): class CustomerProjectTrashView(View):
@ -350,19 +371,16 @@ class CustomerProjectTrashView(View):
return HttpResponseForbidden('403 Forbidden') return HttpResponseForbidden('403 Forbidden')
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
if req.user.is_authenticated(): form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
if form.is_valid(): if form.is_valid():
project = form.cleaned_data.get('pk') project = form.cleaned_data.get('pk')
project.state = 'trashed' project.state = 'trashed'
project.save() project.save()
messages.info(req, 'Проект перемещён в корзину') messages.info(req, 'Проект перемещён в корзину')
else:
messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
else: else:
return HttpResponseForbidden('403 Forbidden') messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
redirect_to = req.POST.get('next') redirect_to = req.POST.get('next')
return redirect(redirect_to) return redirect(redirect_to)
@ -371,20 +389,23 @@ class CustomerProjectTrashView(View):
class CustomerProjectRestoreView(View): class CustomerProjectRestoreView(View):
form_class = CustomerProjectRestoreForm form_class = CustomerProjectRestoreForm
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer():
return super().dispatch(request, *args, **kwargs)
else:
return HttpResponseForbidden('403 Forbidden')
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
if req.user.is_authenticated(): form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
if form.is_valid(): if form.is_valid():
project = form.cleaned_data.get('pk') project = form.cleaned_data.get('pk')
project.state = 'active' project.state = 'active'
project.save() project.save()
messages.info(req, 'Проект восстановлен из корзины') messages.info(req, 'Проект восстановлен из корзины')
else:
messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
else: else:
return HttpResponseForbidden('403 Forbidden') messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
redirect_to = req.POST.get('next') redirect_to = req.POST.get('next')
return redirect(redirect_to) return redirect(redirect_to)
@ -393,19 +414,22 @@ class CustomerProjectRestoreView(View):
class CustomerProjectDeleteView(View): class CustomerProjectDeleteView(View):
form_class = CustomerProjectDeleteForm form_class = CustomerProjectDeleteForm
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer():
return super().dispatch(request, *args, **kwargs)
else:
return HttpResponseForbidden('403 Forbidden')
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
if req.user.is_authenticated(): form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
if form.is_valid(): if form.is_valid():
project = form.cleaned_data.get('pk') project = form.cleaned_data.get('pk')
project.state = 'deleted' project.state = 'deleted'
project.save() project.save()
messages.info(req, 'Проект удалён навсегда') messages.info(req, 'Проект удалён навсегда')
else:
messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
else: else:
return HttpResponseForbidden('403 Forbidden') messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
redirect_to = req.POST.get('next') redirect_to = req.POST.get('next')
return redirect(redirect_to) return redirect(redirect_to)

Loading…
Cancel
Save