remotes/origin/setup
ArturBaybulatov 10 years ago
parent 3aaca296dd
commit c3b4dbf505
  1. 13
      archilance/mixins.py
  2. 15
      archilance/wsgi.py
  3. 1
      common/__init__.py
  4. 1
      common/templates/templatetags/inspect.html
  5. 17
      common/templatetags/common_tags.py
  6. 16
      projects/admin.py
  7. 41
      projects/forms.py
  8. 38
      projects/templates/customer_project_create.html
  9. 4
      projects/templates/customer_project_detail.html
  10. 32
      projects/templates/customer_project_edit_test.html
  11. 3
      projects/templates/project_detail.html
  12. 2
      projects/templates/project_list.html
  13. 22
      projects/urls.py
  14. 233
      projects/views.py
  15. 8
      users/templates/customer_profile_open_projects.html
  16. 8
      users/templates/customer_profile_trashed_projects.html

@ -4,16 +4,17 @@ from django.views.generic.base import ContextMixin
class BaseMixin(ContextMixin): class BaseMixin(ContextMixin):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) c = super().get_context_data(**kwargs)
pk = self.kwargs.get('pk') pk = self.kwargs.get('pk') # Current object's ID
next = self.kwargs.get('next') # Redirect back path
if pk: if pk: c['pk'] = pk
context['pk'] = pk if next: c['next'] = next
context['domain'] = Site.objects.get_current().domain c['domain'] = Site.objects.get_current().domain
return context return c
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))

@ -7,10 +7,21 @@ For more information on this file, see
https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/ https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/
""" """
import os
from django.core.wsgi import get_wsgi_application from django.core.wsgi import get_wsgi_application
from django.template.base import Variable
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "archilance.settings") os.environ.setdefault("DJANGO_SETTINGS_MODULE", "archilance.settings")
application = get_wsgi_application() application = get_wsgi_application()
# Patch template Variable to output empty string for None values:
old_resolve_lookup = Variable._resolve_lookup
def new_resolve_lookup(self, *args, **kwargs):
val = old_resolve_lookup(self, *args, **kwargs)
return '' if val == None else val
Variable._resolve_lookup = new_resolve_lookup

@ -0,0 +1 @@
default_app_config = 'common.apps.CommonConfig'

@ -0,0 +1,17 @@
from django import template
from pprint import pprint, pformat
register = template.Library()
@register.inclusion_tag('templatetags/inspect.html', takes_context=True)
def inspect(context, obj):
return {
'obj': pformat(obj.__dict__),
}
@register.inclusion_tag('templatetags/inspect.html', takes_context=True)
def inspect2(context, obj):
return {
'obj': pformat(dir(obj)),
}

@ -1,8 +1,18 @@
from django.contrib import admin from django.contrib import admin
from .models import Project, Portfolio, PortfolioPhoto, \ from .models import (
Answer, Realty, Candidate, Order, Stage,\ Answer,
BuildingClassfication, ConstructionType, ProjectFile BuildingClassfication,
Candidate,
ConstructionType,
Order,
Portfolio,
PortfolioPhoto,
Project,
ProjectFile,
Realty,
Stage,
)
class ProjectAdmin(admin.ModelAdmin): class ProjectAdmin(admin.ModelAdmin):

@ -10,7 +10,12 @@ from users.models import User
# RealtyFormSet = inlineformset_factory(Project, Realty) # RealtyFormSet = inlineformset_factory(Project, Realty)
class ProjectForm(ModelForm):
class ProjectsForm(Form):
name = forms.CharField(max_length=255)
class CustomerProjectCreateForm(ModelForm):
specialization = TreeNodeChoiceField(queryset=Specialization.objects.exclude(id=1)) specialization = TreeNodeChoiceField(queryset=Specialization.objects.exclude(id=1))
class Meta: class Meta:
@ -21,13 +26,13 @@ class ProjectForm(ModelForm):
'budget_by_agreement', 'budget_by_agreement',
'cro', 'cro',
'currency', 'currency',
'deal_type',
'name', 'name',
'price_and_term_required', 'price_and_term_required',
'deal_type', 'specialization',
'term_type', 'term_type',
'text', 'text',
'work_type', 'work_type',
'specialization',
) )
widgets = { widgets = {
@ -36,9 +41,9 @@ class ProjectForm(ModelForm):
'term_type': Select(attrs={'class':'selectpicker'}), 'term_type': Select(attrs={'class':'selectpicker'}),
} }
def __init__(self, *args, **kwargs):
class ProjectsForm(Form): self.request = kwargs.pop('request')
name = forms.CharField(max_length=255) super().__init__(*args, **kwargs)
class RealtyForm(ModelForm): class RealtyForm(ModelForm):
@ -66,7 +71,7 @@ class PortfolioForm(ModelForm):
fields = '__all__' fields = '__all__'
class AnswerForm(ModelForm): class ContractorProjectAnswerForm(ModelForm):
# def __init__(self, *args, **kwargs): # def __init__(self, *args, **kwargs):
# # import code; code.interact(local=dict(globals(), **locals())) # # import code; code.interact(local=dict(globals(), **locals()))
# self.project_id = kwargs.pop('project_id') # self.project_id = kwargs.pop('project_id')
@ -107,9 +112,13 @@ class StageForm(ModelForm):
PortfolioPhotoFormSet = inlineformset_factory(Portfolio, PortfolioPhoto, fields=('img',)) PortfolioPhotoFormSet = inlineformset_factory(Portfolio, PortfolioPhoto, fields=('img',))
class ProjectTrashForm(Form): class ProjectEditForm(forms.ModelForm):
pk = forms.ModelChoiceField(queryset=Project.objects.none()) pk = forms.ModelChoiceField(queryset=Project.objects.none())
class Meta:
model = Project
fields = '__all__'
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.req = kwargs.pop('req') self.req = kwargs.pop('req')
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
@ -117,35 +126,31 @@ class ProjectTrashForm(Form):
self.fields['pk'].queryset = self.req.user.projects.filter(state='active') self.fields['pk'].queryset = self.req.user.projects.filter(state='active')
class ProjectRestoreForm(Form): class ProjectTrashForm(Form):
pk = forms.ModelChoiceField(queryset=Project.objects.none()) pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.req = kwargs.pop('req') self.req = kwargs.pop('req')
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['pk'].queryset = self.req.user.projects.filter(state='trashed') self.fields['pk'].queryset = self.req.user.projects.filter(state='active')
class ProjectDeleteForm(Form): class ProjectRestoreForm(Form):
pk = forms.ModelChoiceField(queryset=Project.objects.none()) pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.req = kwargs.pop('req') self.req = kwargs.pop('req')
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['pk'].queryset = self.req.user.projects.filter(Q(state='active') | Q(state='trashed')) self.fields['pk'].queryset = self.req.user.projects.filter(state='trashed')
class ProjectEditForm(forms.ModelForm): class ProjectDeleteForm(Form):
pk = forms.ModelChoiceField(queryset=Project.objects.none()) pk = forms.ModelChoiceField(queryset=Project.objects.none())
class Meta:
model = Project
fields = '__all__'
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.req = kwargs.pop('req') self.req = kwargs.pop('req')
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['pk'].queryset = self.req.user.projects.filter(state='active') self.fields['pk'].queryset = self.req.user.projects.filter(Q(state='active') | Q(state='trashed'))

@ -11,18 +11,18 @@
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
{{ form_project.errors }} {{ form.errors }}
{{ form_realty.errors }} {{ form_realty.errors }}
<div class="chatBlock new-rass new-rass2 disTab"> <div class="chatBlock new-rass new-rass2 disTab">
<div class="col-lg-9"> <div class="col-lg-9">
<p class="new-pp new-pp3">Формирование заказа</p> <p class="new-pp new-pp3">Формирование заказа</p>
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Название заказа</p> <p>Название заказа</p>
<input type="text" class="box-sizing" name="{{ form_project.name.name }}"> <input type="text" class="box-sizing" name="{{ form.name.name }}" value="{{ form.name.value }}">
</div> </div>
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Подробно опишите задание</p> <p>Подробно опишите задание</p>
<textarea name="{{ form_project.text.name }}" id="text-new"></textarea> <textarea name="{{ form.text.name }}" id="text-new" value="{{ form.text.value }}"></textarea>
</div> </div>
</div> </div>
<div class="col-lg-3 wrChat1"> <div class="col-lg-3 wrChat1">
@ -46,11 +46,11 @@
<p class="type-work">Тип работы:</p> <p class="type-work">Тип работы:</p>
<div class="mail-block type-work-inset"> <div class="mail-block type-work-inset">
<div class="inset-mb"> <div class="inset-mb">
<label><input type="radio" value="1" name="{{ form_project.work_type.name }}"><span></span></label> <label><input type="radio" value="1" name="{{ form.work_type.name }}"><span></span></label>
<p>Проектирование</p> <p>Проектирование</p>
</div> </div>
<div class="inset-mb"> <div class="inset-mb">
<label><input type="radio" value="2" name="{{ form_project.work_type.name }}"><span></span></label> <label><input type="radio" value="2" name="{{ form.work_type.name }}"><span></span></label>
<p>Техническое сопровождение</p> <p>Техническое сопровождение</p>
</div> </div>
</div> </div>
@ -69,7 +69,7 @@
</div> </div>
<div class="polsF1 disTab"> <div class="polsF1 disTab">
<div class="col-lg-3"> <div class="col-lg-3">
{{ form_project.specialization }} {{ form.specialization }}
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
<select class="selectpicker" disabled> <select class="selectpicker" disabled>
@ -90,21 +90,21 @@
</div> </div>
<div class="searchF1 polsF1 polsFF"> <div class="searchF1 polsF1 polsFF">
<div class="col-lg-4"> <div class="col-lg-4">
<input type="text" class="box-sizing surr" name="{{ form_project.budget.name }}" /> <input type="text" class="box-sizing surr" name="{{ form.budget.name }}" value="{{ form.budget.value }}">
{{ form_project.currency }} {{ form.currency }}
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
{{ form_project.term_type }} {{ form.term_type }}
</div> </div>
<div class="col-lg-5 dog-new"> <div class="col-lg-5 dog-new">
<label> <label>
<input type="checkbox" name="{{ form_project.budget_by_agreement.name }}"><span></span></label> <input type="checkbox" name="{{ form.budget_by_agreement.name }}"><span></span></label>
<p>или по договоренности</p> <p>или по договоренности</p>
</div> </div>
</div> </div>
<div class="searchF1 polsF1 polsFF make-new"> <div class="searchF1 polsF1 polsFF make-new">
<label><input type="checkbox" name="{{ form_project.price_and_term_required.name }}"><span></span></label> <label><input type="checkbox" name="{{ form.price_and_term_required.name }}"><span></span></label>
<p>Сделать для исполнителей обязательным для заполнения поля цена и срок</p> <p>Сделать для исполнителей обязательным для заполнения поля цена и срок</p>
</div> </div>
<div class="titleF1 titleF2 disTab"> <div class="titleF1 titleF2 disTab">
@ -112,23 +112,21 @@
</div> </div>
<div class="searchF1 polsF1 polsFF radio-afer"> <div class="searchF1 polsF1 polsFF radio-afer">
<div class="col-lg-6"> <div class="col-lg-6">
<label> <label><input type="radio" name="{{ form.deal_type.name }}" value="secure_deal"><span></span></label>
<input type="radio" name="{{ form_project.deal_type.name }}" value="secure_deal"><span></span></label>
<p class="text-afer"> <p class="text-afer">
Безопасная сделка (с резервированием бюджета) Безопасная сделка (с резервированием бюджета)
</p> </p>
<p class="des-afer"> <p class="des-afer">
Описание Lorem ipsum dolor sit amet, consectetur adipisicing elit. Porro vel suscipit eaque quidem voluptate aperiam enim aut libero, excepturi architecto maxime, placeat maiores, odio itaque, ex consectetur dignissimos dicta officia
</p> </p>
</div> </div>
<div class="col-lg-6"> <div class="col-lg-6">
<label><input type="radio" name="{{ form_project.deal_type.name }}" value="direct_payment"><span></span></label> <label><input type="radio" name="{{ form.deal_type.name }}" value="direct_payment"><span></span></label>
<p class="text-afer"> <p class="text-afer">
Прямая оплата Исполнителю на его кошелек/счет Прямая оплата Исполнителю на его кошелек/счет
</p> </p>
<p class="des-afer"> <p class="des-afer">
Описание Lorem ipsum dolor sit amet, consectetur adipisicing elit. Porro vel suscipit eaque quidem voluptate aperiam enim aut libero, excepturi architecto maxime, placeat maiores, odio itaque, ex consectetur dignissimos dicta officia
</p> </p>
</div> </div>
</div> </div>
@ -159,7 +157,7 @@
</select> </select>
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
<input type="text" name="form_2-{{ form_realty.name.name }}" class="box-sizing surr surr2"> <input type="text" name="form_2-{{ form_realty.name.name }}" class="box-sizing surr surr2" value="{{ form_realty.name.value }}">
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
{{ form_realty.building_classification }} {{ form_realty.building_classification }}
@ -179,7 +177,7 @@
{{ form_realty.city }} {{ form_realty.city }}
</div> </div>
<div class="col-lg-6 make-new"> <div class="col-lg-6 make-new">
<label><input type="checkbox" name="{{ form_project.cro.name }}"><span></span></label> <label><input type="checkbox" name="{{ form.cro.name }}"><span></span></label>
<p>Требуется допуск СРО</p> <p>Требуется допуск СРО</p>
</div> </div>
</div> </div>
@ -187,9 +185,7 @@
<div class="searchF1 polsF1 polsFF links-filter"> <div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Разместить проект"/> <input class="btn-submit-link" type="submit" value="Разместить проект"/>
<a href="javascript:void(0)">Сохранить</a> <a href="javascript:void(0)">Сохранить</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

@ -77,11 +77,11 @@
</p> </p>
</div> </div>
<div class="col-lg-10 col-lg-offset-1"> <div class="col-lg-10 col-lg-offset-1">
<a href="{% url 'projects:edit' pk=project.pk %}" class="linkProIn linkProIn1"> <a href="{% url 'projects:customer-project-edit' pk=project.pk %}?next={{ request.path }}" class="linkProIn linkProIn1">
Редактировать Редактировать
</a> </a>
<form action="{% url 'projects:trash' pk=project.pk %}" method="POST"> <form action="{% url 'projects:customer-project-trash' pk=project.pk %}" method="POST">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}"> <input type="hidden" name="next" value="{{ request.path }}">

@ -1,4 +1,5 @@
{% load staticfiles %} {% load staticfiles %}
{% load common_tags %}
<!doctype html> <!doctype html>
<html> <html>
@ -24,13 +25,42 @@
<h1>"pk": {{ pk }}</h1> <h1>"pk": {{ pk }}</h1>
<form action="{% url 'projects:edit' pk=pk %}" method="POST"> <form action="{% url 'projects:customer-project-edit' pk=pk %}" method="POST">
{% csrf_token %} {% csrf_token %}
{{ form.as_p }} {{ form.as_p }}
<input type="hidden" name="next" value="{% url 'projects:detail' pk=pk %}"> <input type="hidden" name="next" value="{% url 'projects:detail' pk=pk %}">
<button type="submit">Сохранить</button> <button type="submit">Сохранить</button>
<a href='{{ next }}'>Назад</a>
<hr>
<div class="e" style="padding: 20px">
<ul>
{% for id, name in form.deal_type.field.choices %}
<li>{{ id }} {% if id == form.deal_type.value %}(current){% endif %}</li>
{# <div>#}
{# <input#}
{# type='radio'#}
{# name='_example1'#}
{# id='{{ random_id }}'#}
{# class='-styled'#}
{# value='{{ t.id }}'>#}
{# #}
{# <label for='{{ random_id }}'>{{ t.value }}</label>#}
{# </div>#}
{% endfor %}
</ul>
{% inspect form.deal_type.field %}
<hr>
{% inspect2 form.deal_type.field %}
</div>
</form> </form>
<script src='{% static "js/jquery-2.2.3.min.js" %}'></script> <script src='{% static "js/jquery-2.2.3.min.js" %}'></script>

@ -102,7 +102,8 @@
</div> </div>
<form method="post"> <form action="{% url 'projects:contractor-project-answer' pk=pk %}" method="POST">
<input type="hidden" name="next" value="{% url 'projects:detail' pk=pk %}">
{{ form.errors }} {{ form.errors }}
{% csrf_token %} {% csrf_token %}
<div class="polsF1 disTab"> <div class="polsF1 disTab">

@ -154,7 +154,7 @@
<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 }}</a> <a href="{% url 'projects:detail' pk=proj.pk %}">{{ proj }}</a>
</p> </p>
<ul class="desPro"> <ul class="desPro">
<li> <li>

@ -4,14 +4,15 @@ from django.views.generic import TemplateView
from .views import ( from .views import (
add_candidate, add_candidate,
ChatView, ChatView,
ContractorProjectAnswerView,
CustomerProjectCreateView,
CustomerProjectDeleteView,
CustomerProjectEditView,
CustomerProjectRestoreView,
CustomerProjectTrashView,
OfferOrderView, OfferOrderView,
ProjectComparisonView, ProjectComparisonView,
ProjectCreateView,
ProjectDeleteView,
ProjectEditView,
ProjectRestoreView,
ProjectsView, ProjectsView,
ProjectTrashView,
ProjectView, ProjectView,
) )
@ -20,15 +21,16 @@ app_name = 'projects'
urlpatterns = [ urlpatterns = [
urls.url(r'^$', ProjectsView.as_view(), name='list'), urls.url(r'^$', ProjectsView.as_view(), name='list'),
urls.url(r'^create/$', CustomerProjectCreateView.as_view(), name='customer-project-create'),
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+)/trash/$', ProjectTrashView.as_view(), name='trash'), urls.url(r'^(?P<pk>\d+)/edit/$', CustomerProjectEditView.as_view(), name='customer-project-edit'),
urls.url(r'^(?P<pk>\d+)/restore/$', ProjectRestoreView.as_view(), name='restore'), urls.url(r'^(?P<pk>\d+)/trash/$', CustomerProjectTrashView.as_view(), name='customer-project-trash'),
urls.url(r'^(?P<pk>\d+)/delete/$', ProjectDeleteView.as_view(), name='delete'), urls.url(r'^(?P<pk>\d+)/restore/$', CustomerProjectRestoreView.as_view(), name='customer-project-restore'),
urls.url(r'^(?P<pk>\d+)/edit/$', ProjectEditView.as_view(), name='edit'), 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'^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'^portfolio/create/$', PortfolioCreateView.as_view(), name='portfolio-create'), # urls.url(r'^portfolio/create/$', PortfolioCreateView.as_view(), name='portfolio-create'),
urls.url(r'chat/$', ChatView.as_view(), name='chat'), urls.url(r'chat/$', ChatView.as_view(), name='chat'),
urls.url(r'offerorder/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', OfferOrderView.as_view(), name='offer-order'), urls.url(r'offerorder/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', OfferOrderView.as_view(), name='offer-order'),

@ -8,22 +8,95 @@ from django.views.generic.base import ContextMixin
from pprint import pprint, pformat from pprint import pprint, pformat
import pydash as _ import pydash as _
from .mixins import LastAccessMixin
from .models import Project, Portfolio, Candidate, Answer, Realty, Order from .models import Project, Portfolio, Candidate, Answer, Realty, Order
from archilance.mixins import BaseMixin from archilance.mixins import BaseMixin
from users.models import User from users.models import User
from .forms import ( from .forms import (
AnswerForm, ContractorProjectAnswerForm,
CustomerProjectCreateForm,
PortfolioForm, PortfolioForm,
ProjectDeleteForm, ProjectDeleteForm,
ProjectEditForm, ProjectEditForm,
ProjectForm,
ProjectRestoreForm, ProjectRestoreForm,
ProjectTrashForm, ProjectTrashForm,
RealtyForm, RealtyForm,
) )
from .mixins import LastAccessMixin
# class CustomerProjectCreateView(PermissionRequiredMixin, View):
# permission_required = ('projects.add_project',)
# form_realty = RealtyForm
# form_project = CustomerProjectCreateForm
# raise_exception = True
# permission_denied_message = 'Вы не можете выполнить это действие'
# template_name = 'customer_project_create.html'
#
# def get(self, request, *args, **kwargs):
# form_project = self.form_project()
# form_realty = self.form_realty(prefix='form_2')
# realty_list = Realty.objects.all()
# return render(request, self.template_name, {'form_project': form_project,
# 'form_realty': form_realty,
# 'realty_list': realty_list})
#
# def post(self, request, *args, **kwargs):
# form_project = self.form_project(request.POST)
# form_realty = self.form_realty(request.POST, prefix='form_2')
# if form_project.is_valid() and form_realty.is_valid():
# return self.form_valid(request, form_project, form_realty)
# return render(request, self.template_name, {'form_project': form_project, 'form_realty': form_realty})
#
#
# def form_valid(self, request, form_project, form_realty):
# realty = form_realty.save(commit=False)
# realty.user = request.user
# realty.save()
# project = form_project.save(commit=False)
# project.customer = request.user
# project.realty = realty
# project.save()
#
# return HttpResponseRedirect('/projects/')
class CustomerProjectCreateView(BaseMixin, View):
form_class = CustomerProjectCreateForm
template_name = 'customer_project_create.html'
def get(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer():
form = self.form_class(request=request)
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
context.update({'form': form})
return render(request, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
def post(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer():
form = self.form_class(_.merge({}, request.POST, kwargs), request=request)
if form.is_valid():
project = form.save(commit=False)
project.customer = request.user
project.save()
form.save_m2m()
messages.info(request, 'Проект успешно создан')
redirect_to = reverse('projects:detail', kwargs={'pk': project.pk})
return redirect(redirect_to)
else:
context = self.get_context_data(**kwargs)
context.update({'form': form})
messages.info(request, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
return render(request, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
class ProjectsView(ListView): class ProjectsView(ListView):
@ -31,19 +104,66 @@ class ProjectsView(ListView):
template_name = 'project_list.html' template_name = 'project_list.html'
class ProjectView(LastAccessMixin, View): class ProjectView(BaseMixin, View):
model = Project template_name = 'project_detail.html'
form_class = AnswerForm customer_template_name = 'customer_project_detail.html'
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): def get(self, request, *args, **kwargs):
if request.user.is_customer(): if request.user.is_authenticated() and request.user.is_customer():
self.template_name = 'customer_project_detail.html' project = get_object_or_404(request.user.projects, pk=kwargs.get('pk'))
project = get_object_or_404(Project, pk=kwargs.get('pk'))
return render(request, self.template_name, {'project': project, 'form': self.form_class}) context = self.get_context_data(**_.merge({}, request.GET, kwargs))
context.update({'project': project})
return render(request, self.customer_template_name, context)
else:
project = get_object_or_404(Project, pk=kwargs.get('pk'))
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
context.update({'project': project})
return render(request, self.template_name, context)
class CustomerProjectEditView(BaseMixin, View):
form_class = ProjectEditForm
template_name = 'customer_project_edit_test.html' # 'customer_project_edit.html'
def get(self, req, *args, **kwargs):
if req.user.is_authenticated():
project = get_object_or_404(req.user.projects, pk=kwargs.get('pk'))
form = self.form_class(instance=project, req=req)
context = self.get_context_data(**_.merge({}, req.GET, kwargs))
context.update({'form': form})
return render(req, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
def post(self, req, *args, **kwargs):
if req.user.is_authenticated():
project = get_object_or_404(req.user.projects, pk=kwargs.get('pk'))
form = self.form_class(_.merge({}, req.POST, kwargs), req=req, instance=project)
if form.is_valid():
form.save()
messages.info(req, 'Проект успешно отредактирован')
redirect_to = req.POST.get('next')
return redirect(redirect_to)
else:
context = self.get_context_data(**kwargs)
context.update({'form': form})
messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
return render(req, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
class ContractorProjectAnswerView(BaseMixin, View):
form_class = ContractorProjectAnswerForm
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
if not request.user.is_authenticated(): if not request.user.is_authenticated():
@ -64,49 +184,7 @@ class ProjectView(LastAccessMixin, View):
return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.pk})) return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.pk}))
class ProjectTestView(DetailView): class CustomerProjectTrashView(View):
model = Project
template_name = 'test.html'
class ProjectCreateView(PermissionRequiredMixin, View):
permission_required = ('projects.add_project',)
form_realty = RealtyForm
form_project = ProjectForm
raise_exception = True
permission_denied_message = 'Вы не можете выполнить это действие'
template_name = 'customer_project_create.html'
def get(self, request, *args, **kwargs):
form_project = self.form_project()
form_realty = self.form_realty(prefix='form_2')
realty_list = Realty.objects.all()
return render(request, self.template_name, {'form_project': form_project,
'form_realty': form_realty,
'realty_list': realty_list})
def post(self, request, *args, **kwargs):
form_project = self.form_project(request.POST)
form_realty = self.form_realty(request.POST, prefix='form_2')
if form_project.is_valid() and form_realty.is_valid():
return self.form_valid(request, form_project, form_realty)
return render(request, self.template_name, {'form_project': form_project, 'form_realty': form_realty})
def form_valid(self, request, form_project, form_realty):
realty = form_realty.save(commit=False)
realty.user = request.user
realty.save()
project = form_project.save(commit=False)
project.customer = request.user
project.realty = realty
project.save()
return HttpResponseRedirect('/projects/')
class ProjectTrashView(View):
form_class = ProjectTrashForm form_class = ProjectTrashForm
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
@ -128,7 +206,7 @@ class ProjectTrashView(View):
return redirect(redirect_to) return redirect(redirect_to)
class ProjectRestoreView(View): class CustomerProjectRestoreView(View):
form_class = ProjectRestoreForm form_class = ProjectRestoreForm
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
@ -150,7 +228,7 @@ class ProjectRestoreView(View):
return redirect(redirect_to) return redirect(redirect_to)
class ProjectDeleteView(View): class CustomerProjectDeleteView(View):
form_class = ProjectDeleteForm form_class = ProjectDeleteForm
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
@ -172,43 +250,6 @@ class ProjectDeleteView(View):
return redirect(redirect_to) return redirect(redirect_to)
class ProjectEditView(BaseMixin, View):
form_class = ProjectEditForm
template_name = 'project_edit_test.html' # 'project_edit.html'
def get(self, req, *args, **kwargs):
if req.user.is_authenticated():
project = get_object_or_404(req.user.projects, pk=kwargs.get('pk'))
form = self.form_class(instance=project, req=req)
context = self.get_context_data(**kwargs)
context.update({'form': form})
return render(req, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
def post(self, req, *args, **kwargs):
if req.user.is_authenticated():
project = get_object_or_404(req.user.projects, pk=kwargs.get('pk'))
form = self.form_class(_.merge({}, req.POST, kwargs), req=req, instance=project)
if form.is_valid():
form.save()
messages.info(req, 'Проект успешно отредактирован')
redirect_to = req.POST.get('next')
return redirect(redirect_to)
else:
context = self.get_context_data(**kwargs)
context.update({'form': form})
messages.info(req, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
return render(req, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
class ProjectComparisonView(DetailView): class ProjectComparisonView(DetailView):
model = Project model = Project
template_name = 'comparison.html' template_name = 'comparison.html'

@ -31,7 +31,9 @@
</div> </div>
<div class="col-lg-3 col-lg-offset-1"> <div class="col-lg-3 col-lg-offset-1">
<p class="addWork add-work-new"><a href="{% url 'projects:project-create' %}">Разместить заказ</a></p> <p class="addWork add-work-new">
<a href="{% url 'projects:customer-project-create' %}">Разместить заказ</a>
</p>
</div> </div>
</div> </div>
<div class="projectsBlock new-pro-block disTab"> <div class="projectsBlock new-pro-block disTab">
@ -72,11 +74,11 @@
<ul> <ul>
<li> <li>
<a href='{% url 'projects:edit' pk=proj.pk %}'>Редактировать</a> <a href='{% url 'projects:customer-project-edit' pk=proj.pk %}?next={{ request.path }}'>Редактировать</a>
</li> </li>
<li> <li>
<form action="{% url 'projects:trash' pk=proj.pk %}" method="POST"> <form action="{% url 'projects:customer-project-trash' pk=proj.pk %}" method="POST">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}"> <input type="hidden" name="next" value="{{ request.path }}">

@ -29,7 +29,9 @@
</div> </div>
</div> </div>
<div class="col-lg-3 col-lg-offset-1"> <div class="col-lg-3 col-lg-offset-1">
<p class="addWork add-work-new">Разместить заказ</p> <p class="addWork add-work-new">
<a href="{% url 'projects:customer-project-create' %}">Разместить заказ</a>
</p>
</div> </div>
</div> </div>
<div class="projectsBlock new-pro-block disTab"> <div class="projectsBlock new-pro-block disTab">
@ -71,7 +73,7 @@
</p> </p>
<ul> <ul>
<li> <li>
<form action="{% url 'projects:restore' pk=proj.pk %}" method="POST"> <form action="{% url 'projects:customer-project-restore' pk=proj.pk %}" method="POST">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}"> <input type="hidden" name="next" value="{{ request.path }}">
@ -80,7 +82,7 @@
</li> </li>
<li> <li>
<form action="{% url 'projects:delete' pk=proj.pk %}" method="POST"> <form action="{% url 'projects:customer-project-delete' pk=proj.pk %}" method="POST">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}"> <input type="hidden" name="next" value="{{ request.path }}">

Loading…
Cancel
Save