From ce6e3b451e9bf0f98c550d9c7c4f08cf34ff7640 Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Wed, 15 Jun 2016 01:24:09 +0300 Subject: [PATCH] #ARC-11 --- archilance/mixins.py | 19 +++++++ archilance/settings/base.py | 3 + projects/forms.py | 25 ++++++++- projects/templates/chattest.html | 4 +- .../templates/contractor_project_detail.html | 7 ++- .../templates/projects/project_detail.html | 6 +- projects/urls.py | 15 ++++- projects/views.py | 46 ++++++++++----- templates/home.html | 6 +- templates/partials/base.html | 6 ++ templates/partials/header.html | 23 ++++---- templates/test.html | 11 +--- .../customer_profile_open_projects.html | 15 +++-- .../customer_profile_trashed_projects.html | 4 +- .../partials/customer_profile_info_block.html | 17 ++++-- users/templates/users/login.html | 36 ------------ users/urls.py | 22 +++++--- users/views.py | 56 +++---------------- 18 files changed, 170 insertions(+), 151 deletions(-) create mode 100644 archilance/mixins.py delete mode 100644 users/templates/users/login.html 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 2a5ba55..6efe6f1 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 cf83e7b..ba4b73b 100644 --- a/projects/views.py +++ b/projects/views.py @@ -1,27 +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' @@ -51,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): @@ -91,6 +92,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 f6a96a0..e7adcda 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 %}
  • - + {#
  • #} -{# Работы на продажу#} +{# Работы на продажу#} {# #} -{#
  • #} +{# #}
    - {% if user.is_contractor %} - + {% if request.user.is_contractor %} + profile-image - {% elif user.is_customer %} - + {% elif request.user.is_customer %} + profile-image {% endif %} @@ -48,7 +49,7 @@