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):
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:
context['pk'] = pk
if pk: c['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()))

@ -7,10 +7,21 @@ For more information on this file, see
https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
from django.template.base import Variable
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "archilance.settings")
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 .models import Project, Portfolio, PortfolioPhoto, \
Answer, Realty, Candidate, Order, Stage,\
BuildingClassfication, ConstructionType, ProjectFile
from .models import (
Answer,
BuildingClassfication,
Candidate,
ConstructionType,
Order,
Portfolio,
PortfolioPhoto,
Project,
ProjectFile,
Realty,
Stage,
)
class ProjectAdmin(admin.ModelAdmin):

@ -10,7 +10,12 @@ from users.models import User
# 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))
class Meta:
@ -21,13 +26,13 @@ class ProjectForm(ModelForm):
'budget_by_agreement',
'cro',
'currency',
'deal_type',
'name',
'price_and_term_required',
'deal_type',
'specialization',
'term_type',
'text',
'work_type',
'specialization',
)
widgets = {
@ -36,9 +41,9 @@ class ProjectForm(ModelForm):
'term_type': Select(attrs={'class':'selectpicker'}),
}
class ProjectsForm(Form):
name = forms.CharField(max_length=255)
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
class RealtyForm(ModelForm):
@ -66,7 +71,7 @@ class PortfolioForm(ModelForm):
fields = '__all__'
class AnswerForm(ModelForm):
class ContractorProjectAnswerForm(ModelForm):
# def __init__(self, *args, **kwargs):
# # import code; code.interact(local=dict(globals(), **locals()))
# self.project_id = kwargs.pop('project_id')
@ -107,9 +112,13 @@ class StageForm(ModelForm):
PortfolioPhotoFormSet = inlineformset_factory(Portfolio, PortfolioPhoto, fields=('img',))
class ProjectTrashForm(Form):
class ProjectEditForm(forms.ModelForm):
pk = forms.ModelChoiceField(queryset=Project.objects.none())
class Meta:
model = Project
fields = '__all__'
def __init__(self, *args, **kwargs):
self.req = kwargs.pop('req')
super().__init__(*args, **kwargs)
@ -117,35 +126,31 @@ class ProjectTrashForm(Form):
self.fields['pk'].queryset = self.req.user.projects.filter(state='active')
class ProjectRestoreForm(Form):
class ProjectTrashForm(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(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())
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'))
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())
class Meta:
model = Project
fields = '__all__'
def __init__(self, *args, **kwargs):
self.req = kwargs.pop('req')
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">
{% csrf_token %}
{{ form_project.errors }}
{{ form.errors }}
{{ form_realty.errors }}
<div class="chatBlock new-rass new-rass2 disTab">
<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="{{ form_project.name.name }}">
<input type="text" class="box-sizing" name="{{ form.name.name }}" value="{{ form.name.value }}">
</div>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<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 class="col-lg-3 wrChat1">
@ -46,11 +46,11 @@
<p class="type-work">Тип работы:</p>
<div class="mail-block type-work-inset">
<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>
</div>
<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>
</div>
</div>
@ -69,7 +69,7 @@
</div>
<div class="polsF1 disTab">
<div class="col-lg-3">
{{ form_project.specialization }}
{{ form.specialization }}
</div>
<div class="col-lg-3">
<select class="selectpicker" disabled>
@ -90,21 +90,21 @@
</div>
<div class="searchF1 polsF1 polsFF">
<div class="col-lg-4">
<input type="text" class="box-sizing surr" name="{{ form_project.budget.name }}" />
{{ form_project.currency }}
<input type="text" class="box-sizing surr" name="{{ form.budget.name }}" value="{{ form.budget.value }}">
{{ form.currency }}
</div>
<div class="col-lg-3">
{{ form_project.term_type }}
{{ form.term_type }}
</div>
<div class="col-lg-5 dog-new">
<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>
</div>
</div>
<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>
</div>
<div class="titleF1 titleF2 disTab">
@ -112,23 +112,21 @@
</div>
<div class="searchF1 polsF1 polsFF radio-afer">
<div class="col-lg-6">
<label>
<input type="radio" name="{{ form_project.deal_type.name }}" value="secure_deal"><span></span></label>
<label><input type="radio" name="{{ form.deal_type.name }}" value="secure_deal"><span></span></label>
<p class="text-afer">
Безопасная сделка (с резервированием бюджета)
</p>
<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>
</div>
<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>
<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>
</div>
</div>
@ -159,7 +157,7 @@
</select>
</div>
<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 class="col-lg-3">
{{ form_realty.building_classification }}
@ -179,7 +177,7 @@
{{ form_realty.city }}
</div>
<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>
</div>
</div>
@ -187,9 +185,7 @@
<div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Разместить проект"/>
<a href="javascript:void(0)">Сохранить</a>
</div>
</div>
</div>
</div>

@ -77,11 +77,11 @@
</p>
</div>
<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>
<form action="{% url 'projects:trash' pk=project.pk %}" method="POST">
<form action="{% url 'projects:customer-project-trash' pk=project.pk %}" method="POST">
{% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}">

@ -1,4 +1,5 @@
{% load staticfiles %}
{% load common_tags %}
<!doctype html>
<html>
@ -24,13 +25,42 @@
<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 %}
{{ form.as_p }}
<input type="hidden" name="next" value="{% url 'projects:detail' pk=pk %}">
<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>
<script src='{% static "js/jquery-2.2.3.min.js" %}'></script>

@ -102,7 +102,8 @@
</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 }}
{% csrf_token %}
<div class="polsF1 disTab">

@ -154,7 +154,7 @@
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<p class="titlePro">
<a href="{% url 'projects:detail' proj.id %}">{{ proj }}</a>
<a href="{% url 'projects:detail' pk=proj.pk %}">{{ proj }}</a>
</p>
<ul class="desPro">
<li>

@ -4,14 +4,15 @@ from django.views.generic import TemplateView
from .views import (
add_candidate,
ChatView,
ContractorProjectAnswerView,
CustomerProjectCreateView,
CustomerProjectDeleteView,
CustomerProjectEditView,
CustomerProjectRestoreView,
CustomerProjectTrashView,
OfferOrderView,
ProjectComparisonView,
ProjectCreateView,
ProjectDeleteView,
ProjectEditView,
ProjectRestoreView,
ProjectsView,
ProjectTrashView,
ProjectView,
)
@ -20,15 +21,16 @@ app_name = 'projects'
urlpatterns = [
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+)/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'^(?P<pk>\d+)/edit/$', CustomerProjectEditView.as_view(), name='customer-project-edit'),
urls.url(r'^(?P<pk>\d+)/trash/$', CustomerProjectTrashView.as_view(), name='customer-project-trash'),
urls.url(r'^(?P<pk>\d+)/restore/$', CustomerProjectRestoreView.as_view(), name='customer-project-restore'),
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/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'chat/$', ChatView.as_view(), name='chat'),
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
import pydash as _
from .mixins import LastAccessMixin
from .models import Project, Portfolio, Candidate, Answer, Realty, Order
from archilance.mixins import BaseMixin
from users.models import User
from .forms import (
AnswerForm,
ContractorProjectAnswerForm,
CustomerProjectCreateForm,
PortfolioForm,
ProjectDeleteForm,
ProjectEditForm,
ProjectForm,
ProjectRestoreForm,
ProjectTrashForm,
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):
@ -31,19 +104,66 @@ class ProjectsView(ListView):
template_name = 'project_list.html'
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})
class ProjectView(BaseMixin, View):
template_name = 'project_detail.html'
customer_template_name = 'customer_project_detail.html'
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})
if request.user.is_authenticated() and request.user.is_customer():
project = get_object_or_404(request.user.projects, pk=kwargs.get('pk'))
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):
if not request.user.is_authenticated():
@ -64,49 +184,7 @@ class ProjectView(LastAccessMixin, View):
return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.pk}))
class ProjectTestView(DetailView):
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):
class CustomerProjectTrashView(View):
form_class = ProjectTrashForm
def post(self, req, *args, **kwargs):
@ -128,7 +206,7 @@ class ProjectTrashView(View):
return redirect(redirect_to)
class ProjectRestoreView(View):
class CustomerProjectRestoreView(View):
form_class = ProjectRestoreForm
def post(self, req, *args, **kwargs):
@ -150,7 +228,7 @@ class ProjectRestoreView(View):
return redirect(redirect_to)
class ProjectDeleteView(View):
class CustomerProjectDeleteView(View):
form_class = ProjectDeleteForm
def post(self, req, *args, **kwargs):
@ -172,43 +250,6 @@ class ProjectDeleteView(View):
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):
model = Project
template_name = 'comparison.html'

@ -31,7 +31,9 @@
</div>
<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 class="projectsBlock new-pro-block disTab">
@ -72,11 +74,11 @@
<ul>
<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>
<form action="{% url 'projects:trash' pk=proj.pk %}" method="POST">
<form action="{% url 'projects:customer-project-trash' pk=proj.pk %}" method="POST">
{% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}">

@ -29,7 +29,9 @@
</div>
</div>
<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 class="projectsBlock new-pro-block disTab">
@ -71,7 +73,7 @@
</p>
<ul>
<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 %}
<input type="hidden" name="next" value="{{ request.path }}">
@ -80,7 +82,7 @@
</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 %}
<input type="hidden" name="next" value="{{ request.path }}">

Loading…
Cancel
Save