remotes/origin/setup
ArturBaybulatov 10 years ago
parent 007dfcd49f
commit d3bfa7fb12
  1. 2
      archilance/settings/dev.py
  2. 36
      projects/forms.py
  3. 12
      projects/templates/project_edit_test.html
  4. 0
      projects/templates/project_list.html
  5. 18
      projects/templates/projects/portfolio_form.html
  6. 275
      projects/templates/projects/project_detail.html
  7. 278
      projects/templates/projects/project_form.html
  8. 18
      projects/templates/projects/testport.html
  9. 10
      projects/urls.py
  10. 101
      projects/views.py
  11. 1
      users/models.py
  12. 14
      users/templates/customer_profile_open_projects.html
  13. 281
      users/templates/customer_profile_trashed_projects.html
  14. 17
      users/views.py

@ -2,7 +2,7 @@ from .base import *
AUTH_PASSWORD_VALIDATORS = [] AUTH_PASSWORD_VALIDATORS = []
INSTALLED_APPS += ['debug_toolbar',] # INSTALLED_APPS += ['debug_toolbar',]
try: try:
from .local import * from .local import *

@ -1,4 +1,5 @@
from django import forms from django import forms
from django.db.models import Q
from django.forms import ModelForm, HiddenInput, Form, Select from django.forms import ModelForm, HiddenInput, Form, Select
from django.forms.models import inlineformset_factory from django.forms.models import inlineformset_factory
from mptt.forms import TreeNodeChoiceField from mptt.forms import TreeNodeChoiceField
@ -117,13 +118,34 @@ class ProjectTrashForm(Form):
self.req = kwargs.pop('req') self.req = kwargs.pop('req')
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
if self.req.user.is_authenticated(): self.fields['pk'].queryset = self.req.user.projects.filter(state='active')
self.fields['pk'].queryset = self.req.user.projects
def clean(self):
cleaned_data = super().clean()
if not self.req.user.is_authenticated(): class ProjectRestoreForm(Form):
raise forms.ValidationError('Пользователь не залогинен') pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs):
self.req = kwargs.pop('req')
super().__init__(*args, **kwargs)
self.fields['pk'].queryset = self.req.user.projects.filter(state='trashed')
class ProjectDeleteForm(Form):
pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs):
self.req = kwargs.pop('req')
super().__init__(*args, **kwargs)
self.fields['pk'].queryset = self.req.user.projects.filter(Q(state='active') | Q(state='trashed'))
class ProjectEditForm(Form):
pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs):
self.req = kwargs.pop('req')
super().__init__(*args, **kwargs)
return cleaned_data self.fields['pk'].queryset = self.req.user.projects.filter(state='active')

@ -0,0 +1,12 @@
{% extends 'partials/base.html' %}
{% block content %}
<form action="{% url 'projects:edit' pk=proj.pk %}" method="POST">
{% csrf_token %}
{{ form }}
<input type="hidden" name="next" value="{% url 'projects:detail' pk=proj.pk %}">
<button type="submit">Сохранить</button>
</form>
{% endblock %}

@ -1,18 +0,0 @@
{% extends 'partials/base.html' %}
{% block content %}
<h1>Добавление</h1>
<form method="post" action="">
{{ form.errors }}
{% csrf_token %}
{% for field in form %}
<div class="row">
{{ field.label }}
{{ field }}
</div>
{% endfor %}
<input type="submit" value="Создать" />
</form>
{% endblock %}s

@ -1,275 +0,0 @@
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% load humanize %}
{% block content %}
{% include 'partials/header.html' %}
<div class="col-lg-12">
<p class="titleScore">{{ object }}</p>
</div>
<div class="doneBlock new-done disTab">
<div class="triangle1"></div>
{% if request.user.is_contractor %}
<div class="col-lg-12 new-p">
<p>{{ object.price | intcomma }} <i class="fa fa-rub"></i></p>
</div>
{% endif %}
<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="{% url 'users:customer-view' object.user.pk %}">{{ object.user.get_full_name }}[ivanov_petr]</a>
</p>
<p class="navv2">{{ object.created | naturaltime }}</p>
</div>
<div class="col-lg-3 retts">
<ul class="rettList restList2">
<li>Рейтинг: <span> 0</span></li>
<li>Безопасные сделки: <span> 0</span></li>
<li>
<a href="">Отзывы:
<span> 0 </span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
</div>
<div class="col-lg-2 new-dashed">
<div class="dashedCol4 dashedCol44 dashedColColor">
<p class="specUser">
Специализации:
</p>
<div class="insetSpec">
<span>{{ object.specialization }}</span>
</div>
</div>
</div>
<div class="col-lg-3 retts new-list">
<ul class="desListPro">
<li>
{{ object.created }}
</li>
<li>
{{ object.type_work }}
</li>
</ul>
{% if object.secure_transaction %}
<div class="sroUser sroExecutor sroPro">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div>
{% endif %}
</div>
</div>
<div class="infoProjectBlock info-new disTab">
<div class="triangle2"></div>
<div class="col-lg-10 col-lg-offset-1">
<ul class="listProjectIn">
<li>
<span>Местоположение:</span> {{ object.realty.country }},{{ object.realty.city }}
</li>
<li>
<span>Классификация здания:</span> {{ object.realty.building_classification }}
</li>
<li>
<span>Вид строительства:</span> {{ object.realty.type_construction }}
</li>
</ul>
</div>
<div class="col-lg-10 col-lg-offset-1">
<p class="textProIn">
{{ object.text }}
</p>
</div>
<div class="col-lg-10 col-lg-offset-1">
<a href="javascript:void(0)" class="new-answer">
Ответить на проект
</a>
<div class="polsF1 pols-new disTab">
<div class="col-lg-3">
<select class="selectpicker">
<option>От своего имени</option>
<option></option>
</select>
</div>
</div>
</div>
{% if perms.projects.add_answer %}
<form method="post">
{{ form.errors }}
{% csrf_token %}
<div class="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.cost.name }}"/>
</div>
</div>
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Бюджет</p>
{{ form.cost_type }}
</div>
</div>
<div class="col-lg-6"></div>
</div>
<div class="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.term.name }}"/>
</div>
</div>
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Тип срока</p>
{{ form.term_type }}
</div>
</div>
<div class="col-lg-6"></div>
</div>
<div class="polsF1 disTab">
<div class="col-lg-9">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Текст</p>
<textarea name="{{ form.text.name }}" id="text-new"></textarea>{{ form.project }}
</div>
</div>
<div class="col-lg-3"></div>
</div>
<div class="polsF1 disTab">
<div class="col-lg-3"><input type="submit" value="Создать"/></div>
</div>
</form>
{% endif %}
</div>
{% if request.user.is_customer %}
<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>+0</span>
</button>
<button type="button" class="btn btn-default">
Кандидаты <span>{{ object.candidates.count }}</span>
</button>
<button type="button" class="btn btn-default">
Отказал <span>0</span>
</button>
</div>
</div>
</div>
<a href="{% url 'projects:comparison' object.id %}">
<div class="col-lg-12 compareBlock">
<div class="col-lg-2 col-lg-offset-5">
<p>Сравнить кандидатов</p>
</div>
</div>
</a>
{% endif %}
<div class="candidateBlock disTab">
{% for answer in object.answers.all %}
<div class="candidate can-new">
<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.user.get_full_name }}</a>
</p>
<p class="navv2">{{ answer.user.created }}</p>
</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">
{% if request.user.is_customer %}
<a class="candLink candLink1" href="{% url 'projects:add-candidate' answer_id=answer.id project_id=object.id %}">Кандидат</a>
<a class="candLink candLink2" href="javascript:void(0)"> предложить проект </a>
{% endif %}
<a href="javascript:void(0)" class="candLink candLink3">отказ</a>
</div>
<div class="commBlock44 comm-new disTab">
<div class="comm44 disTab">
<div class="col-lg-10 col-lg-offset-1">
<p class="nameComm">
Иванов Петр Иванович
</p>
<span class="dateComm44">13.0.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.
</p>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>
{% include 'partials/footer.html' %}
{% endblock %}

@ -1,278 +0,0 @@
{% extends 'partials/base.html' %}
{% block content %}
<div class="col-lg-12 allProjects">
<p class="titleScore">Новый заказ</p>
</div>
<form method="post">
{% csrf_token %}
{{ form_project.errors }}
{{ form_realty.errors }}
<div class="chatBlock new-rass new-rass2 disTab">
{{ project_form.errors }}
<div class="col-lg-9">
<p class="new-pp new-pp3">Формирование заказа</p>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Название заказа</p>
<input type="text" class="box-sizing" name="{{ project_form.name.name }}"/>
{{ project_form.name.errors }}
</div>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Подробно опишите задание</p>
<textarea name="{{ project_form.text.name }}" id="text-new"></textarea>
</div>
</div>
<div class="col-lg-3 wrChat1">
<div class="messageBlock box-sizing disTab">
<p>Дополнительно</p>
</div>
<div class="col-lg-12 documentsChat">
{# <form action="" method="post">#}
{# <div class="upload">#}
{# <input type="file" name="upload"/>#}
{# <p>+ добавить файл (до 100 файлов)</p>#}
{# </div>#}
{# <input type="submit" value="Submit" />#}
{# </form>#}
<ul class="list-new-new">
<li>
Архитерурное 2.jpg
<span>7мб</span>
<div></div>
</li>
</ul>
</div>
<p class="type-work">Тип работы:</p>
<div class="mail-block type-work-inset">
<div class="inset-mb">
<label><input type="radio" value="1" name="{{ project_form.type_work.name }}"><span></span></label>
<p>Проектирование</p>
</div>
<div class="inset-mb">
<label><input type="radio" value="2" name="{{ project_form.type_work.name }}"><span></span></label>
<p>Техническое сопровождение</p>
</div>
</div>
<div class="textAreaBlock2 box-sizing disTab">
<a href="javascriptt:void(0)" class="new-link new-lw">+ Добавить раздел</a>
</div>
</div>
</div>
<div class="col-lg-12 new-filter">
<div class="filter clearfix">
<div class="titleF1 disTab">
<div class="col-lg-3">Специализация проекта:</div>
<div class="col-lg-3"></div>
<div class="col-lg-3"></div>
<div class="col-lg-3"></div>
</div>
<div class="polsF1 disTab">
<div class="col-lg-3">
<select id="specialization1" name="{{ project_form.specialization.name }}">
</select>
{# {{ project_form.specialization }}#}
</div>
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-3">
{# <select class="selectpicker">#}
{# <option>Mustard</option>#}
{# <option>Ketchup</option>#}
{# <option>Relish</option>#}
{# </select>#}
</div>
<div class="col-lg-3">
{# <select class="selectpicker">#}
{# <option>Mustard</option>#}
{# <option>Ketchup</option>#}
{# <option>Relish</option>#}
{# </select>#}
</div>
</div>
<div class="titleF1 titleF2 disTab">
<div class="col-lg-4">Бюджет</div>
<div class="col-lg-8"></div>
</div>
<div class="searchF1 polsF1 polsFF">
<div class="col-lg-4">
<input type="text" name="{{ project_form.price.name }}" class="box-sizing surr">
<select class="selectpicker2 valul">
<option>&#36;</option>
<option>&#36;</option>
<option>&#36;</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker">
<option>За проект</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-5 dog-new">
<label><input type="checkbox" name="dogovor"><span></span></label>
<p>или по договоренности</p>
</div>
</div>
<div class="searchF1 polsF1 polsFF make-new">
<label><input type="checkbox" name="dogovor"><span></span></label>
<p>Сделать для исполнителей обязательным для заполнения поля цена и срок</p>
</div>
<div class="titleF1 titleF2 disTab">
<div class="col-lg-12">Способ оплаты</div>
</div>
<div class="searchF1 polsF1 polsFF radio-afer">
<div class="col-lg-6">
<label><input type="radio" name="afer"><span></span></label>
<p class="text-afer">
Безопасная сделка (с резервированием бюджета)
</p>
<p class="des-afer">
Текст
</p>
</div>
<div class="col-lg-6">
<label><input type="radio" name="afer"><span></span></label>
<p class="text-afer">
Прямая оплата Исполнителю на его кошелек/счет
</p>
<p class="des-afer">
Текст
</p>
</div>
</div>
<div class="resSearchF1">
<div class="col-lg-3">
<p class="titleResF1">Расширенный поиск</p>
<button class="resButtonF1">
<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span>
</button>
</div>
<div class="col-lg-9">
<div class="borderS1"></div>
</div>
</div>
<div class="slideRes disTab activeSlide">
<div class="titleF1 disTab">
<div class="col-lg-3">Выбор объекта:</div>
<div class="col-lg-3">Наименование:</div>
<div class="col-lg-3">Классификация здания:</div>
<div class="col-lg-3">Вид строительства:</div>
</div>
<div class="polsF1 polsF2 disTab">
<div class="col-lg-3">
<select class="selectpicker" >
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-3">
<input type="text" class="box-sizing surr surr2" name="{{ realty_form.name.name }}">
</div>
<div class="col-lg-3">
<select class="selectpicker" name="{{ realty_form.building_classification.name }}">
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker" name="{{ realty_form.type_construction.name }}">
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
</div>
<div class="titleF1 disTab">
<div class="col-lg-12">Местоположение:</div>
</div>
<div class="polsF1 polsF2 disTab">
<div class="col-lg-3">
<select class="selectpicker" name="{{ realty_form.country.name }}">
<option>Страна</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker" {{ realty_form.city.name }}>
<option>Город</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-6 make-new">
<label><input type="checkbox" name="dogovor"><span></span></label>
<p>Требуется допуск СРО</p>
</div>
</div>
<div class="searchF1 polsF1 polsFF links-filter">
<input style="border-radius: 40px;
font-family: 'pfdintextcomppro-regular', sans-serif;color: black;font-size: 16px;padding: 17px 33px 17px 33px;
float: left;margin: 0 15px 48px 15px;border: 1px solid #DFDFDF;text-transform: uppercase;
letter-spacing: 2px;color: #42B476;border: 1px solid #42B476" type="submit" value="Разместить проект" />
<a href="javascript:void(0)">Сохранить</a>
</div>
</div>
</div>
</div>
</form>
{% endblock %}
{% block js_block %}
<script type="text/javascript">
$(function () {
function updateSelectData(){
}
$.ajax({
url: '/api/specializations?parent=1',
type: 'GET',
dataType: 'json',
success: function (json) {
console.log(json.results);
var out = ''
$.each(json.results, function (i, v) {
$('#specialization1')
.append($("<option></option>")
.attr("value", v.name)
.text(v.name));
});
$("#specialization1").addClass("selectpicker");
$('.selectpicker').selectpicker({
style: 'btn-info',
size: 4,
width: '237px'
});
}
});
$("#specialization1").on("change",function(){
});
});
</script>
{% endblock %}

@ -1,18 +0,0 @@
<form method="post" action="">{% csrf_token %}
{{ form.as_p }}
<fieldset>
<legend>Photos</legend>
{{ portfolio_photo_form.management_form }}
{{ portfolio_photo_form.non_form_errors }}
{% for form in portfolio_photo_form %}
{{ form.id }}
<div class="inline {{ portfolio_photo_form.prefix }}">
{{ form.img.errors }}
{{ form.img.label_tag }}
{{ form.img }}
</div>
{% endfor %}
</fieldset>
<input type="submit" value="Add portfolio" class="submit" />
</form>

@ -7,19 +7,25 @@ from .views import (
OfferOrderView, OfferOrderView,
ProjectComparisonView, ProjectComparisonView,
ProjectCreateView, ProjectCreateView,
ProjectDeleteView,
ProjectEditView,
ProjectRestoreView,
ProjectsView, ProjectsView,
ProjectTrashView, ProjectTrashView,
ProjectView, ProjectView,
ProjectTestView,
) )
app_name = 'projects' app_name = 'projects'
urlpatterns = [ urlpatterns = [
urls.url(r'^$', ProjectsView.as_view(), name='list'), urls.url(r'^$', ProjectsView.as_view(), name='list'),
urls.url(r'^(?P<pk>\d+)/$', ProjectView.as_view(), name='detail'), urls.url(r'^(?P<pk>\d+)/$', ProjectView.as_view(), name='detail'),
# urls.url(r'^(?P<pk>\d+)/$', ProjectTestView.as_view(), name='detail'),
urls.url(r'^(?P<pk>\d+)/trash/$', ProjectTrashView.as_view(), name='trash'), urls.url(r'^(?P<pk>\d+)/trash/$', ProjectTrashView.as_view(), name='trash'),
urls.url(r'^(?P<pk>\d+)/restore/$', ProjectRestoreView.as_view(), name='restore'),
urls.url(r'^(?P<pk>\d+)/delete/$', ProjectDeleteView.as_view(), name='delete'),
urls.url(r'^(?P<pk>\d+)/edit/$', ProjectEditView.as_view(), name='edit'),
urls.url(r'^candidate/add/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', add_candidate, name='add-candidate'), urls.url(r'^candidate/add/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', add_candidate, name='add-candidate'),
urls.url(r'^candidate/comparison/(?P<pk>\d+)$', ProjectComparisonView.as_view(), name='comparison'), urls.url(r'^candidate/comparison/(?P<pk>\d+)$', ProjectComparisonView.as_view(), name='comparison'),
urls.url(r'^create/$', ProjectCreateView.as_view(), name='project-create'), urls.url(r'^create/$', ProjectCreateView.as_view(), name='project-create'),

@ -9,7 +9,18 @@ import pydash as _
from users.models import User from users.models import User
from .models import Project, Portfolio, Candidate, Answer, Realty, Order from .models import Project, Portfolio, Candidate, Answer, Realty, Order
from .forms import ProjectForm, PortfolioForm, AnswerForm, RealtyForm, ProjectTrashForm
from .forms import (
AnswerForm,
PortfolioForm,
ProjectDeleteForm,
ProjectEditForm,
ProjectForm,
ProjectRestoreForm,
ProjectTrashForm,
RealtyForm,
)
from .mixins import LastAccessMixin from .mixins import LastAccessMixin
@ -95,22 +106,96 @@ class ProjectCreateView(PermissionRequiredMixin, View):
class ProjectTrashView(View): class ProjectTrashView(View):
form_class = ProjectTrashForm
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
form = ProjectTrashForm(_.merge({}, req.POST, kwargs), req=req) if req.user.is_authenticated():
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, 'Проект перемещён в корзину')
else:
messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
else:
return HttpResponseForbidden('403 Forbidden')
redirect_to = req.POST.get('next')
return redirect(redirect_to)
class ProjectRestoreView(View):
form_class = ProjectRestoreForm
def post(self, req, *args, **kwargs):
if req.user.is_authenticated():
form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
if form.is_valid():
project = form.cleaned_data.get('pk')
project.state = 'active'
project.save()
messages.info(req, 'Form valid') messages.info(req, 'Проект восстановлен из корзины')
else:
messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
else: else:
messages.info(req, 'Form invalid: <pre>{msg}</pre>'.format(msg=pformat(form.errors))) return HttpResponseForbidden('403 Forbidden')
redirect_to = req.POST.get('next') redirect_to = req.POST.get('next')
return redirect(redirect_to) return redirect(redirect_to)
class ProjectDeleteView(View):
form_class = ProjectDeleteForm
def post(self, req, *args, **kwargs):
if req.user.is_authenticated():
form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
if form.is_valid():
project = form.cleaned_data.get('pk')
project.state = 'deleted'
project.save()
messages.info(req, 'Проект удалён навсегда')
else:
messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
else:
return HttpResponseForbidden('403 Forbidden')
redirect_to = req.POST.get('next')
return redirect(redirect_to)
class ProjectEditView(View):
form_class = ProjectEditForm
template_name = 'project_edit_test.html' # 'project_edit.html'
def get(self, req, *args, **kwargs):
form = self.form_class()
return render(req, self.template_name, {'form': form})
def post(self, req, *args, **kwargs):
form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
if req.user.is_authenticated():
if form.is_valid():
#...
messages.info(req, 'Проект (как будто) успешно отредактирован')
redirect_to = req.POST.get('next')
return redirect(redirect_to)
else:
messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
return render(req, self.template_name, {'form': form})
else:
return HttpResponseForbidden('403 Forbidden')
class TestView(View): class TestView(View):
template_name = 'test_form.html' template_name = 'test_form.html'
form_class = RealtyForm form_class = RealtyForm

@ -38,6 +38,7 @@ class User(AbstractBaseUser, PermissionsMixin):
('free', 'Свободен'), ('free', 'Свободен'),
('busy', 'Занят'), ('busy', 'Занят'),
) )
nickname = models.CharField(max_length=50, blank=True,null=True) nickname = models.CharField(max_length=50, blank=True,null=True)
first_name = models.CharField(max_length=255, blank=True) first_name = models.CharField(max_length=255, blank=True)
last_name = models.CharField(max_length=255, blank=True) last_name = models.CharField(max_length=255, blank=True)

@ -35,11 +35,11 @@
</div> </div>
</div> </div>
<div class="projectsBlock new-pro-block disTab"> <div class="projectsBlock new-pro-block disTab">
{% for proj in object.projects.all %} {% for proj in projects %}
<div class="projectPro clearfix"> <div class="projectPro clearfix">
<div class="col-lg-9 leftPro"> <div class="col-lg-9 leftPro">
<p class="titlePro"> <p class="titlePro">
<a href="{% url 'projects:detail' proj.id %}">{{ proj.name }}</a> <a href="{% url 'projects:detail' proj.pk %}">{{ proj.name }}</a>
</p> </p>
<ul class="desPro"> <ul class="desPro">
@ -61,7 +61,7 @@
<li>{{ proj.created}}</li> <li>{{ proj.created}}</li>
<li>0</li> <li>0</li>
<li>0</li> <li>0</li>
<li>{{ object.get_full_name }}</li> <li>{{ customer.get_full_name }}</li>
</ul> </ul>
</div> </div>
@ -71,7 +71,13 @@
</p> </p>
<ul> <ul>
<li>Редактировать</li> <li>
<form action="{% url 'projects:edit' pk=proj.pk %}" method="GET">
{% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}">
<button type="submit">Редактировать</button>
</form>
</li>
<li> <li>
<form action="{% url 'projects:trash' pk=proj.pk %}" method="POST"> <form action="{% url 'projects:trash' pk=proj.pk %}" method="POST">

@ -33,231 +33,62 @@
</div> </div>
</div> </div>
<div class="projectsBlock new-pro-block disTab"> <div class="projectsBlock new-pro-block disTab">
<div class="projectPro clearfix"> {% for proj in projects %}
<div class="col-lg-9 leftPro"> <div class="projectPro clearfix">
<p class="titlePro"> <div class="col-lg-9 leftPro">
Создание дизайна интерьера квартиры 200m2 <p class="titlePro">
</p> <a href="{% url 'projects:detail' proj.pk %}">{{ proj.name }}</a>
<ul class="desPro"> </p>
<li> <ul class="desPro">
Объект "Карточный домик" <li>
</li> Объект "{{ proj.realty.name }}"
<li> </li>
<span>2</span> ответ от имени группы <li>
</li> <span>2</span> ответ от имени группы
</ul> </li>
<p class="textPro"> </ul>
Компьютерная 3D-визуализация помещений (разработка эксклюзивных художественных решений, тщательная проработка утвержденного варианта, подбор цветовой гаммы и текстуры отделочных материалов). Развертка и разрез стен, декоративные элементы (при необходимости)... <p class="textPro">
</p> {{ proj.text }}
<ul class="listPro"> </p>
<li> <ul class="listPro">
13.02.2016 <li>
</li> {{ proj.created}}
<li> </li>
523 <li>
</li> 523
<li> </li>
523 <li>
</li> 523
<li> </li>
Александр Новиков <li>
</li> {{ customer.get_full_name }}
</ul> </li>
</div> </ul>
<div class="col-lg-3 rightPro right-pro-red"> </div>
<p class="cenaPro"> <div class="col-lg-3 rightPro right-pro-red">
35 000 <i class="fa fa-rub"></i> <p class="cenaPro">
</p> {{ proj.budget }} <i class="fa fa-rub"></i>
<ul> </p>
<li> <ul>
Восстановить из корзины <li>
</li> <form action="{% url 'projects:restore' pk=proj.pk %}" method="POST">
<li> {% csrf_token %}
Удалить навсегда <input type="hidden" name="next" value="{{ request.path }}">
</li> <button type="submit">Восстановить из корзины</button>
</ul> </form>
</div> </li>
</div>
<div class="projectPro clearfix"> <li>
<div class="col-lg-9 leftPro"> <form action="{% url 'projects:delete' pk=proj.pk %}" method="POST">
<p class="titlePro"> {% csrf_token %}
Создание дизайна интерьера квартиры 200m2 <input type="hidden" name="next" value="{{ request.path }}">
</p> <button type="submit">Удалить навсегда</button>
<ul class="desPro"> </form>
<li> </li>
Объект "Карточный домик" </ul>
</li> </div>
<li> </div>
<span>2</span> ответ от имени группы {% endfor %}
</li>
</ul>
<p class="textPro">
Компьютерная 3D-визуализация помещений (разработка эксклюзивных художественных решений, тщательная проработка утвержденного варианта, подбор цветовой гаммы и текстуры отделочных материалов). Развертка и разрез стен, декоративные элементы (при необходимости)...
</p>
<ul class="listPro">
<li>
13.02.2016
</li>
<li>
523
</li>
<li>
523
</li>
<li>
Александр Новиков
</li>
</ul>
</div>
<div class="col-lg-3 rightPro right-pro-red">
<p class="cenaPro">
35 000 <i class="fa fa-rub"></i>
</p>
<ul>
<li>
Восстановить из корзины
</li>
<li>
Удалить навсегда
</li>
</ul>
</div>
</div>
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<p class="titlePro">
Создание дизайна интерьера квартиры 200m2
</p>
<ul class="desPro">
<li>
Объект "Карточный домик"
</li>
<li>
<span>2</span> ответ от имени группы
</li>
</ul>
<p class="textPro">
Компьютерная 3D-визуализация помещений (разработка эксклюзивных художественных решений, тщательная проработка утвержденного варианта, подбор цветовой гаммы и текстуры отделочных материалов). Развертка и разрез стен, декоративные элементы (при необходимости)...
</p>
<ul class="listPro">
<li>
13.02.2016
</li>
<li>
523
</li>
<li>
523
</li>
<li>
Александр Новиков
</li>
</ul>
</div>
<div class="col-lg-3 rightPro right-pro-red">
<p class="cenaPro">
35 000 <i class="fa fa-rub"></i>
</p>
<ul>
<li>
Восстановить из корзины
</li>
<li>
Удалить навсегда
</li>
</ul>
</div>
</div>
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<p class="titlePro">
Создание дизайна интерьера квартиры 200m2
</p>
<ul class="desPro">
<li>
Объект "Карточный домик"
</li>
<li>
<span>2</span> ответ от имени группы
</li>
</ul>
<p class="textPro">
Компьютерная 3D-визуализация помещений (разработка эксклюзивных художественных решений, тщательная проработка утвержденного варианта, подбор цветовой гаммы и текстуры отделочных материалов). Развертка и разрез стен, декоративные элементы (при необходимости)...
</p>
<ul class="listPro">
<li>
13.02.2016
</li>
<li>
523
</li>
<li>
523
</li>
<li>
Александр Новиков
</li>
</ul>
</div>
<div class="col-lg-3 rightPro right-pro-red">
<p class="cenaPro">
35 000 <i class="fa fa-rub"></i>
</p>
<ul>
<li>
Восстановить из корзины
</li>
<li>
Удалить навсегда
</li>
</ul>
</div>
</div>
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<p class="titlePro">
Создание дизайна интерьера квартиры 200m2
</p>
<ul class="desPro">
<li>
Объект "Карточный домик"
</li>
<li>
<span>2</span> ответ от имени группы
</li>
</ul>
<p class="textPro">
Компьютерная 3D-визуализация помещений (разработка эксклюзивных художественных решений, тщательная проработка утвержденного варианта, подбор цветовой гаммы и текстуры отделочных материалов). Развертка и разрез стен, декоративные элементы (при необходимости)...
</p>
<ul class="listPro">
<li>
13.02.2016
</li>
<li>
523
</li>
<li>
523
</li>
<li>
Александр Новиков
</li>
</ul>
</div>
<div class="col-lg-3 rightPro right-pro-red">
<p class="cenaPro">
35 000 <i class="fa fa-rub"></i>
</p>
<ul>
<li>
Восстановить из корзины
</li>
<li>
Удалить навсегда
</li>
</ul>
</div>
</div>
</div> </div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}

@ -16,33 +16,50 @@ class UserListView(ListView):
class ContractorListView(ListView): class ContractorListView(ListView):
model = User model = User
template_name = 'contractor_list.html' template_name = 'contractor_list.html'
context_object_name = 'contractor'
class ContractorProfileDetailView(DetailView): class ContractorProfileDetailView(DetailView):
model = User model = User
template_name = 'contractor_profile.html' template_name = 'contractor_profile.html'
context_object_name = 'contractor'
class ContractorOfficeDetailView(DetailView): class ContractorOfficeDetailView(DetailView):
model = User model = User
template_name = 'contractor_office.html' template_name = 'contractor_office.html'
context_object_name = 'contractor'
class CustomerProfileOpenProjectsView(BaseMixin, DetailView): class CustomerProfileOpenProjectsView(BaseMixin, DetailView):
model = User model = User
template_name = 'customer_profile_open_projects.html' template_name = 'customer_profile_open_projects.html'
context_object_name = 'customer'
def get_context_data(self, **kwargs):
c = super().get_context_data(**kwargs)
c['projects'] = self.object.projects.filter(state='active')
return c
class CustomerProfileTrashedProjectsView(BaseMixin, DetailView): class CustomerProfileTrashedProjectsView(BaseMixin, DetailView):
model = User model = User
template_name = 'customer_profile_trashed_projects.html' template_name = 'customer_profile_trashed_projects.html'
context_object_name = 'customer'
def get_context_data(self, **kwargs):
c = super().get_context_data(**kwargs)
c['projects'] = self.object.projects.filter(state='trashed')
return c
class CustomerProfileCurrentProjectsView(BaseMixin, DetailView): class CustomerProfileCurrentProjectsView(BaseMixin, DetailView):
model = User model = User
template_name = 'customer_profile_current_projects.html' template_name = 'customer_profile_current_projects.html'
context_object_name = 'customer'
class CustomerProfileReviewsView(BaseMixin, DetailView): class CustomerProfileReviewsView(BaseMixin, DetailView):
model = User model = User
template_name = 'customer_profile_reviews.html' template_name = 'customer_profile_reviews.html'
context_object_name = 'customer'

Loading…
Cancel
Save