diff --git a/archilance/mixins.py b/archilance/mixins.py
new file mode 100644
index 0000000..94ed526
--- /dev/null
+++ b/archilance/mixins.py
@@ -0,0 +1,19 @@
+from django.contrib.sites.models import Site
+from django.views.generic.base import ContextMixin
+
+
+class BaseMixin(ContextMixin):
+ def get_context_data(self, **kwargs):
+ context = super().get_context_data(**kwargs)
+
+ pk = self.kwargs.get('pk')
+
+ if pk:
+ context['pk'] = pk
+
+ context['domain'] = Site.objects.get_current().domain
+
+ return context
+
+
+# import code; code.interact(local=dict(globals(), **locals()))
diff --git a/archilance/settings/base.py b/archilance/settings/base.py
index 5a435ea..8ccb3a2 100644
--- a/archilance/settings/base.py
+++ b/archilance/settings/base.py
@@ -26,6 +26,7 @@ DJANGO_APPS = [
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
+ 'django.contrib.sites',
]
THIRD_PARTY_APPS = [
@@ -169,3 +170,5 @@ REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ('rest_framework_filters.backends.DjangoFilterBackend',), # djangorestframework-filters
}
+
+SITE_ID = 1
diff --git a/projects/forms.py b/projects/forms.py
index 7b2fe78..ace9a58 100644
--- a/projects/forms.py
+++ b/projects/forms.py
@@ -2,7 +2,10 @@ from django import forms
from django.forms import ModelForm, HiddenInput, Form, Select
from django.forms.models import inlineformset_factory
from mptt.forms import TreeNodeChoiceField
+
from .models import Project, Portfolio, Answer, Realty, PortfolioPhoto, Stage, Specialization
+from users.models import User
+
# RealtyFormSet = inlineformset_factory(Project, Realty)
@@ -89,6 +92,7 @@ class AnswerForm(ModelForm):
'term_type': Select(attrs={'class':'selectpicker'}),
}
+
class StageForm(ModelForm):
class Meta:
model = Stage
@@ -102,5 +106,24 @@ class StageForm(ModelForm):
# 'term_type',
)
-from django.forms.models import inlineformset_factory
+
PortfolioPhotoFormSet = inlineformset_factory(Portfolio, PortfolioPhoto, fields=('img',))
+
+
+class ProjectTrashForm(Form):
+ pk = forms.ModelChoiceField(queryset=Project.objects.none())
+
+ def __init__(self, *args, **kwargs):
+ self.req = kwargs.pop('req')
+ super().__init__(*args, **kwargs)
+
+ if self.req.user.is_authenticated():
+ self.fields['pk'].queryset = self.req.user.projects
+
+ def clean(self):
+ cleaned_data = super().clean()
+
+ if not self.req.user.is_authenticated():
+ raise forms.ValidationError('Пользователь не залогинен')
+
+ return cleaned_data
diff --git a/projects/templates/chattest.html b/projects/templates/chattest.html
index 53d2a15..f0261f3 100644
--- a/projects/templates/chattest.html
+++ b/projects/templates/chattest.html
@@ -1,9 +1,9 @@
-{{ user }}
+{{ request.user }}
Мои проекты
- {% for proj in user.projects.all %}
+ {% for proj in request.user.projects.all %}
{{ proj }}
{{ proj.order }}
{% endfor %}
diff --git a/projects/templates/contractor_project_detail.html b/projects/templates/contractor_project_detail.html
index 29d058e..888887a 100644
--- a/projects/templates/contractor_project_detail.html
+++ b/projects/templates/contractor_project_detail.html
@@ -1,9 +1,12 @@
{% extends 'partials/base.html' %}
+{% load staticfiles %}
+{% load humanize %}
+
+
{% block content %}
{% include 'partials/header.html' %}
- {% load staticfiles %}
- {% load humanize %}
+
diff --git a/projects/templates/projects/project_detail.html b/projects/templates/projects/project_detail.html
index a16a048..8821bfa 100644
--- a/projects/templates/projects/project_detail.html
+++ b/projects/templates/projects/project_detail.html
@@ -12,7 +12,7 @@
- {% if user.is_contractor %}
+ {% if request.user.is_contractor %}
{{ object.price | intcomma }}
@@ -167,7 +167,7 @@
- {% if user.is_customer %}
+ {% if request.user.is_customer %}
Исполнители
@@ -236,7 +236,7 @@
Опубликован: {{ answer.created }}
- {% if user.is_customer %}
+ {% if request.user.is_customer %}
Кандидат
предложить проект
{% endif %}
diff --git a/projects/urls.py b/projects/urls.py
index 9d6d33f..9187e7b 100644
--- a/projects/urls.py
+++ b/projects/urls.py
@@ -2,19 +2,28 @@ from django.conf import urls
from django.views.generic import TemplateView
from .views import (
- ProjectsView, ProjectView, ProjectCreateView,
- ProjectComparisonView, add_candidate, ChatView, OfferOrderView,
+ add_candidate,
+ ChatView,
+ OfferOrderView,
+ ProjectComparisonView,
+ ProjectCreateView,
+ ProjectsView,
+ ProjectTrashView,
+ ProjectView,
+ ProjectTestView,
)
app_name = 'projects'
urlpatterns = [
urls.url(r'^$', ProjectsView.as_view(), name='list'),
+ urls.url(r'^(?P
\d+)/$', ProjectView.as_view(), name='detail'),
+ # urls.url(r'^(?P\d+)/$', ProjectTestView.as_view(), name='detail'),
+ urls.url(r'^(?P\d+)/trash/$', ProjectTrashView.as_view(), name='trash'),
urls.url(r'^candidate/add/(?P(\d+))/(?P(\d+))/$', add_candidate, name='add-candidate'),
urls.url(r'^candidate/comparison/(?P\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'(?P\d+)$', ProjectView.as_view(), name='detail'),
urls.url(r'chat/$', ChatView.as_view(), name='chat'),
urls.url(r'offerorder/(?P(\d+))/(?P(\d+))/$', OfferOrderView.as_view(), name='offer-order'),
]
diff --git a/projects/views.py b/projects/views.py
index 4ee296e..75316f2 100644
--- a/projects/views.py
+++ b/projects/views.py
@@ -1,26 +1,23 @@
-from django.shortcuts import render, get_object_or_404
+from django.contrib import messages
+from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin
+from django.core.urlresolvers import reverse, reverse_lazy
from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse
-from django.core.urlresolvers import reverse
-from django.contrib.auth.mixins import PermissionRequiredMixin
-from django.views.generic import ListView, DetailView, CreateView, View, TemplateView
-from django.views.generic.edit import FormMixin
-
+from django.shortcuts import render, get_object_or_404, redirect
+from django.views.generic import ListView, DetailView, CreateView, View, TemplateView, FormView
+from pprint import pprint, pformat
+import pydash as _
from users.models import User
from .models import Project, Portfolio, Candidate, Answer, Realty, Order
-from .forms import ProjectForm, PortfolioForm, AnswerForm, RealtyForm
+from .forms import ProjectForm, PortfolioForm, AnswerForm, RealtyForm, ProjectTrashForm
from .mixins import LastAccessMixin
class ProjectsView(ListView):
model = Project
- def get_context_data(self, **kwargs):
- context = super().get_context_data(**kwargs)
- return context
-
-class ProjectView(LastAccessMixin, FormMixin, View):
+class ProjectView(LastAccessMixin, View):
model = Project
form_class = AnswerForm
template_name = 'contractor_project_detail.html'
@@ -50,7 +47,12 @@ class ProjectView(LastAccessMixin, FormMixin, View):
answer.save()
order = Order.objects.create(project=project)
- return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.id}))
+ return HttpResponseRedirect(reverse('projects:detail', kwargs={'pk': project.pk}))
+
+
+class ProjectTestView(DetailView):
+ model = Project
+ template_name = 'test.html'
class ProjectCreateView(PermissionRequiredMixin, View):
@@ -92,6 +94,23 @@ class ProjectCreateView(PermissionRequiredMixin, View):
pass
+class ProjectTrashView(View):
+ def post(self, req, *args, **kwargs):
+ form = ProjectTrashForm(_.merge({}, req.POST, kwargs), req=req)
+
+ if form.is_valid():
+ project = form.cleaned_data.get('pk')
+ project.state = 'trashed'
+ project.save()
+
+ messages.info(req, 'Form valid')
+ else:
+ messages.info(req, 'Form invalid: {msg}'.format(msg=pformat(form.errors)))
+
+ redirect_to = req.POST.get('next')
+ return redirect(redirect_to)
+
+
class TestView(View):
template_name = 'test_form.html'
form_class = RealtyForm
diff --git a/templates/home.html b/templates/home.html
index 1f9074f..a86fa61 100644
--- a/templates/home.html
+++ b/templates/home.html
@@ -9,9 +9,9 @@
Основная задача сайта
- Authed? {{ user.is_authenticated }}c
- {{ user }}
- {{ user.groups.all }}
+ Authed? {{ request.user.is_authenticated }}c
+ {{ request.user }}
+ {{ request.user.groups.all }}
diff --git a/templates/partials/base.html b/templates/partials/base.html
index 3e629f1..cd3b619 100644
--- a/templates/partials/base.html
+++ b/templates/partials/base.html
@@ -22,6 +22,12 @@
+{% if messages %}
+ {% for message in messages %}
+
{{ message | safe }}
+ {% endfor %}
+{% endif %}
+
{% block content %}{% endblock %}
diff --git a/templates/partials/header.html b/templates/partials/header.html
index b036f17..f34d9ec 100644
--- a/templates/partials/header.html
+++ b/templates/partials/header.html
@@ -13,31 +13,32 @@
Биржа проектов
+
Поиск исполнителей
- {% if user.is_contractor %}
- Мой офис
+ {% if request.user.is_contractor %}
+ Мой офис
{% endif %}
-
+
{#
#}
-{# Работы на продажу#}
+{# Работы на продажу#}
{# #}
-{# #}
+{# #}