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. 109
      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 = []
INSTALLED_APPS += ['debug_toolbar',]
# INSTALLED_APPS += ['debug_toolbar',]
try:
from .local import *

@ -1,4 +1,5 @@
from django import forms
from django.db.models import Q
from django.forms import ModelForm, HiddenInput, Form, Select
from django.forms.models import inlineformset_factory
from mptt.forms import TreeNodeChoiceField
@ -117,13 +118,34 @@ class ProjectTrashForm(Form):
self.req = kwargs.pop('req')
super().__init__(*args, **kwargs)
if self.req.user.is_authenticated():
self.fields['pk'].queryset = self.req.user.projects
self.fields['pk'].queryset = self.req.user.projects.filter(state='active')
class ProjectRestoreForm(Form):
pk = forms.ModelChoiceField(queryset=Project.objects.none())
def clean(self):
cleaned_data = super().clean()
def __init__(self, *args, **kwargs):
self.req = kwargs.pop('req')
super().__init__(*args, **kwargs)
if not self.req.user.is_authenticated():
raise forms.ValidationError('Пользователь не залогинен')
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,
ProjectComparisonView,
ProjectCreateView,
ProjectDeleteView,
ProjectEditView,
ProjectRestoreView,
ProjectsView,
ProjectTrashView,
ProjectView,
ProjectTestView,
)
app_name = 'projects'
urlpatterns = [
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+)/$', ProjectTestView.as_view(), name='detail'),
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/comparison/(?P<pk>\d+)$', ProjectComparisonView.as_view(), name='comparison'),
urls.url(r'^create/$', ProjectCreateView.as_view(), name='project-create'),

@ -9,7 +9,18 @@ import pydash as _
from users.models import User
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
@ -21,16 +32,16 @@ class ProjectView(LastAccessMixin, View):
model = Project
form_class = AnswerForm
template_name = 'contractor_project_detail.html'
def get_success_url(self):
return reverse('projects:detail', kwargs={'pk': self.object.pk})
def get(self, request, *args, **kwargs):
if request.user.is_customer():
self.template_name = 'customer_project_detail.html'
project = get_object_or_404(Project, pk=kwargs.get('pk'))
return render(request, self.template_name, {'project': project, 'form': self.form_class})
def post(self, request, *args, **kwargs):
if not request.user.is_authenticated():
return HttpResponseForbidden()
@ -39,7 +50,7 @@ class ProjectView(LastAccessMixin, View):
if form.is_valid():
return self.form_valid(request, form, project)
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
@ -95,22 +106,96 @@ class ProjectCreateView(PermissionRequiredMixin, View):
class ProjectTrashView(View):
form_class = ProjectTrashForm
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():
project = form.cleaned_data.get('pk')
project.state = 'trashed'
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)
if form.is_valid():
project = form.cleaned_data.get('pk')
project.state = 'trashed'
project.save()
messages.info(req, 'Form valid')
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, 'Проект восстановлен из корзины')
else:
messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
else:
messages.info(req, 'Form invalid: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
return HttpResponseForbidden('403 Forbidden')
redirect_to = req.POST.get('next')
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):
template_name = 'test_form.html'
form_class = RealtyForm

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

@ -35,11 +35,11 @@
</div>
</div>
<div class="projectsBlock new-pro-block disTab">
{% for proj in object.projects.all %}
{% for proj in projects %}
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<p class="titlePro">
<a href="{% url 'projects:detail' proj.id %}">{{ proj.name }}</a>
<a href="{% url 'projects:detail' proj.pk %}">{{ proj.name }}</a>
</p>
<ul class="desPro">
@ -61,7 +61,7 @@
<li>{{ proj.created}}</li>
<li>0</li>
<li>0</li>
<li>{{ object.get_full_name }}</li>
<li>{{ customer.get_full_name }}</li>
</ul>
</div>
@ -71,7 +71,13 @@
</p>
<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>
<form action="{% url 'projects:trash' pk=proj.pk %}" method="POST">

@ -33,231 +33,62 @@
</div>
</div>
<div class="projectsBlock new-pro-block disTab">
<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 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>
{% for proj in projects %}
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<p class="titlePro">
<a href="{% url 'projects:detail' proj.pk %}">{{ proj.name }}</a>
</p>
<ul class="desPro">
<li>
Объект "{{ proj.realty.name }}"
</li>
<li>
<span>2</span> ответ от имени группы
</li>
</ul>
<p class="textPro">
{{ proj.text }}
</p>
<ul class="listPro">
<li>
{{ proj.created}}
</li>
<li>
523
</li>
<li>
523
</li>
<li>
{{ customer.get_full_name }}
</li>
</ul>
</div>
<div class="col-lg-3 rightPro right-pro-red">
<p class="cenaPro">
{{ proj.budget }} <i class="fa fa-rub"></i>
</p>
<ul>
<li>
<form action="{% url 'projects:restore' pk=proj.pk %}" method="POST">
{% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}">
<button type="submit">Восстановить из корзины</button>
</form>
</li>
<li>
<form action="{% url 'projects:delete' pk=proj.pk %}" method="POST">
{% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}">
<button type="submit">Удалить навсегда</button>
</form>
</li>
</ul>
</div>
</div>
{% endfor %}
</div>
{% include 'partials/footer.html' %}

@ -16,33 +16,50 @@ class UserListView(ListView):
class ContractorListView(ListView):
model = User
template_name = 'contractor_list.html'
context_object_name = 'contractor'
class ContractorProfileDetailView(DetailView):
model = User
template_name = 'contractor_profile.html'
context_object_name = 'contractor'
class ContractorOfficeDetailView(DetailView):
model = User
template_name = 'contractor_office.html'
context_object_name = 'contractor'
class CustomerProfileOpenProjectsView(BaseMixin, DetailView):
model = User
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):
model = User
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):
model = User
template_name = 'customer_profile_current_projects.html'
context_object_name = 'customer'
class CustomerProfileReviewsView(BaseMixin, DetailView):
model = User
template_name = 'customer_profile_reviews.html'
context_object_name = 'customer'

Loading…
Cancel
Save