remotes/origin/setup
ArturBaybulatov 10 years ago
parent d64e2f854c
commit ce6e3b451e
  1. 19
      archilance/mixins.py
  2. 3
      archilance/settings/base.py
  3. 25
      projects/forms.py
  4. 4
      projects/templates/chattest.html
  5. 7
      projects/templates/contractor_project_detail.html
  6. 6
      projects/templates/projects/project_detail.html
  7. 15
      projects/urls.py
  8. 46
      projects/views.py
  9. 6
      templates/home.html
  10. 6
      templates/partials/base.html
  11. 23
      templates/partials/header.html
  12. 11
      templates/test.html
  13. 15
      users/templates/customer_profile_open_projects.html
  14. 4
      users/templates/customer_profile_trashed_projects.html
  15. 17
      users/templates/partials/customer_profile_info_block.html
  16. 36
      users/templates/users/login.html
  17. 22
      users/urls.py
  18. 56
      users/views.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()))

@ -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

@ -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

@ -1,9 +1,9 @@
{{ user }}
{{ request.user }}
<h2>Мои проекты</h2>
{% for proj in user.projects.all %}
{% for proj in request.user.projects.all %}
<h3>{{ proj }}</h3>
<h5>{{ proj.order }}</h5>
{% endfor %}

@ -1,9 +1,12 @@
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% load humanize %}
{% block content %}
{% include 'partials/header.html' %}
{% load staticfiles %}
{% load humanize %}
<div class="container mainScore">
<div class="row">
<div class="col-lg-12">

@ -12,7 +12,7 @@
</div>
<div class="doneBlock new-done disTab">
<div class="triangle1"></div>
{% if user.is_contractor %}
{% if request.user.is_contractor %}
<div class="col-lg-12 new-p">
<p>{{ object.price | intcomma }} <i class="fa fa-rub"></i></p>
</div>
@ -167,7 +167,7 @@
</div>
{% if user.is_customer %}
{% if request.user.is_customer %}
<div class="exBigBlock disTab">
<div class="col-lg-12">
<p class="titleEx">Исполнители</p>
@ -236,7 +236,7 @@
<p>Опубликован: {{ answer.created }}</p>
</div>
<div class="col-lg-3 retts">
{% if user.is_customer %}
{% 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 %}

@ -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<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'^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'(?P<pk>\d+)$', ProjectView.as_view(), name='detail'),
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'),
]

@ -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: <pre>{msg}</pre>'.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

@ -9,9 +9,9 @@
<p class="welcomeMain">Основная задача сайта</p>
<p>
Authed? {{ user.is_authenticated }}c
{{ user }}<br>
{{ user.groups.all }}
Authed? {{ request.user.is_authenticated }}c
{{ request.user }}<br>
{{ request.user.groups.all }}
</p>
</div>
</div>

@ -22,6 +22,12 @@
</head>
<body>
{% if messages %}
{% for message in messages %}
<div class="c" style='padding: 10px; margin-bottom: 6px'>{{ message | safe }}</div>
{% endfor %}
{% endif %}
{% block content %}{% endblock %}
<script src='{% static "js/jquery-2.2.3.min.js" %}'></script>

@ -13,31 +13,32 @@
<a href="{% url 'projects:list' %}">Биржа проектов</a>
<span></span>
</li>
<li class="icon_tm2">
<a href="{% url 'users:contractor-list' %}">Поиск исполнителей</a>
<span></span>
</li>
<li>
{% if user.is_contractor %}
<a href="{% url 'users:contractor-office' user.id %}">Мой офис</a>
{% if request.user.is_contractor %}
<a href="{% url 'users:contractor-office' pk=request.user.pk %}">Мой офис</a>
{% endif %}
</li>
{# <li class="icon_tm3">#}
{# <a href="javascript:void(0)">Работы на продажу</a>#}
{# <a href="#">Работы на продажу</a>#}
{# <span></span>#}
{# </li> #}
{# </li>#}
</ul>
</div>
<div class="col-lg-2">
<div class="imgProfile">
{% if user.is_contractor %}
<a href="{% url 'users:contractor-profile' user.id %}">
{% if request.user.is_contractor %}
<a href="{% url 'users:contractor-profile' pk=request.user.pk %}">
<img src="img/profile.jpg" alt="profile-image">
</a>
{% elif user.is_customer %}
<a href="{% url 'users:customer-profile-open-projects' user.id %}">
{% elif request.user.is_customer %}
<a href="{% url 'users:customer-profile-open-projects' pk=request.user.pk %}">
<img src="img/profile.jpg" alt="profile-image">
</a>
{% endif %}
@ -48,7 +49,7 @@
<span class="glyphicon glyphicon-menu-hamburger" aria-hidden="true"></span>
</button>
<ul class="dropdown-menu menu-drop-new">
{% if not user.is_authenticated %}
{% if not request.user.is_authenticated %}
<li class="icon_mm1">
<a href="{% url 'auth_login' %}">
Войти заказчиком
@ -86,7 +87,7 @@
<span></span>
</a>
</li>
{% if user.is_authenticated %}
{% if request.user.is_authenticated %}
<li>
<a href="{% url 'auth_logout' %}">
Выйти

@ -1,11 +1,6 @@
{% extends '_layout.html' %}
{% load staticfiles %}
{% extends 'partials/base.html' %}
{% block content %}
<div ng-controller='TestCtrl as test'>
<ul ng-repeat='user in test.users'>
<li>{( user.first_name )}</li>
</ul>
</div>
<h1>project: {{ project }}</h1>
<h1>object: {{ object }}</h1>
{% endblock %}

@ -9,12 +9,12 @@
<div class="buttonGP disTab">
<div class="btn-group valProject2">
<a href="{% url 'users:customer-profile-open-projects' pk=user.pk %}" class="btn btn-default" disabled>
<a href="{% url 'users:customer-profile-open-projects' pk=pk %}" class="btn btn-default" disabled>
Открытые проекты
<span><mark>2</mark> / <span>35</span></span>
</a>
<a href="{% url 'users:customer-profile-trashed-projects' pk=user.pk %}" class="btn btn-default">
<a href="{% url 'users:customer-profile-trashed-projects' pk=pk %}" class="btn btn-default">
Корзина
<span><mark></mark><span>7</span></span>
</a>
@ -67,12 +67,19 @@
<div class="col-lg-3 rightPro right-pro-red">
<p class="cenaPro">
{{ proj.price }} <i class="fa fa-rub"></i>
{{ proj.budget }} <i class="fa fa-rub"></i>
</p>
<ul>
<li>Редактировать</li>
<li>Переместить в корзину</li>
<li>
<form action="{% url 'projects:trash' pk=proj.pk %}" method="POST">
{% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}">
<button type="submit">Переместить в корзину</button>
</form>
</li>
</ul>
</div>
</div>

@ -9,12 +9,12 @@
<div class="buttonGP disTab">
<div class="btn-group valProject2">
<a href="{% url 'users:customer-profile-open-projects' pk=user.pk %}" class="btn btn-default">
<a href="{% url 'users:customer-profile-open-projects' pk=pk %}" class="btn btn-default">
Открытые проекты
<span><mark>2</mark> / <span>35</span></span>
</a>
<a href="{% url 'users:customer-profile-trashed-projects' pk=user.pk %}" class="btn btn-default" disabled>
<a href="{% url 'users:customer-profile-trashed-projects' pk=pk %}" class="btn btn-default" disabled>
Корзина
<span><mark></mark><span>7</span></span>
</a>

@ -43,12 +43,17 @@
<div class="col-lg-9 divCol9 new-mar2">
<div class="profileTabs2 tabs-new">
<ul class="nav nav-tabs nav-justified">
<li role="presentation" class="active">
<a href="{% url 'users:customer-profile-open-projects' pk=user.pk %}">Открытые проекты</a>
{% url 'users:customer-profile-open-projects' pk=pk as a %}
{% url 'users:customer-profile-trashed-projects' pk=pk as a2 %}
{% url 'users:customer-profile-current-projects' pk=pk as b %}
{% url 'users:customer-profile-reviews' pk=pk as c %}
<li role="presentation" {% if request.path == a or request.path == a2 %}class="active"{% endif %}>
<a href="{{ a }}">Открытые проекты</a>
</li>
<li role="presentation">
<a href="{% url 'users:customer-profile-current-projects' pk=user.pk %}">Текущие проекты</a>
<li role="presentation" {% if request.path == b %}class="active"{% endif %}>
<a href="{{ b }}">Текущие проекты</a>
<div class="roundsCount">
<div class="countR">0</div>
@ -56,8 +61,8 @@
</div>
</li>
<li role="presentation">
<a href="{% url 'users:customer-profile-reviews' pk=user.pk %}">Отзывы</a>
<li role="presentation" {% if request.path == c %}class="active"{% endif %}>
<a href="{{ c }}">Отзывы</a>
<div class="roundsCount">
<div class="countG">0</div>

@ -1,36 +0,0 @@
{% extends 'partials/base.html' %}
{% block content %}
<div class="container container_1200"">
<hr>
</div>
<!-- block_registr -->
<div class="container container_1200" id="registration">
<div class="block_registr">
<div class="text-center registr">Вход</div>
<form method="post" action="{% url 'django.contrib.auth.views.login' %}">
{% csrf_token %}
<div class="form-group">
<input type="email" name="{{ form.username.name }}" class="col-xs-10 form-control" id="inputEmail" placeholder="Электронная почта">
<p>{{ form.email.errors.as_text }}</p>
</div>
<div class="form-group">
<input type="password" name="{{ form.password.name }}" class="col-xs-10 form-control" id="inputPassword" placeholder="Пароль">
<p>{{ form.password1.errors.as_text }}</p>
</div>
<div>
<button type="submit" class="btn registr_button">
Вход
</button>
</div>
</form>
</div>
</div>
<!-- block_registr end -->
{% endblock %}

@ -2,9 +2,17 @@ from django.conf import urls
from django.contrib.auth.views import login, logout
from .views import (
ContractorListView, ContractorOfficeDetailView, ContractorProfileDetailView,
CustomerProfileCurrentProjectsView, CustomerProfileTrashedProjectsView, CustomerProfileOpenProjectsView,
CustomerProfileReviewsView, UserDetailView, UserInfoListView, UserListView, UserView,
ContractorListView,
ContractorOfficeDetailView,
ContractorProfileDetailView,
CustomerProfileCurrentProjectsView,
CustomerProfileOpenProjectsView,
CustomerProfileReviewsView,
CustomerProfileTrashedProjectsView,
# UserDetailView,
# UserInfoListView,
# UserListView,
# UserView,
)
@ -18,9 +26,9 @@ urlpatterns = [
urls.url(r'^contractors/(?P<pk>\d+)/$', ContractorProfileDetailView.as_view(), name='contractor-profile'),
urls.url(r'^contractor-office/(?P<pk>\d+)/$', ContractorOfficeDetailView.as_view(), name='contractor-office'),
urls.url(r'^profile/$', UserDetailView.as_view(), name='user-detail'),
urls.url(r'^$', UserListView.as_view(), name='users_list'),
urls.url(r'^info$', UserInfoListView.as_view(), name='users_info_list'),
# urls.url(r'^profile/$', UserDetailView.as_view(), name='user-detail'),
# urls.url(r'^$', UserListView.as_view(), name='users_list'),
# urls.url(r'^info$', UserInfoListView.as_view(), name='users_info_list'),
urls.url(r'contractors/$', ContractorListView.as_view(), name='contractor-list' ),
urls.url(r'^(?P<pk>\d+)/$', UserView.as_view(), name='user_view'),
# urls.url(r'^(?P<pk>\d+)/$', UserView.as_view(), name='user_view'),
]

@ -3,6 +3,7 @@ from django.contrib.auth.models import Group
from django.views.generic import ListView, DetailView, View, UpdateView
from django.views.generic.base import TemplateView
from archilance.mixins import BaseMixin
from .models import User
@ -12,79 +13,36 @@ class UserListView(ListView):
context_object_name = 'users'
class UserInfoListView(ListView):
model = User
template_name = 'users_info_list.html'
def get_context_data(self, **kwargs):
context = super(UserInfoListView, self).get_context_data(**kwargs)
context['groups'] = Group.objects.all()
context['performers'] = User.perform_objects.all()
context['customers'] = User.customers_objects.all()
return context
class UserDetailView(DetailView):
model = User
class UserView(View):
pass
# template_name = 'contractor.html'
#
# def get(self, request, pk):
# user = User.objects.get(pk=pk)
# user_group = user.groups.all().first()
# if 'Заказчики' in user_group.name:
# self.template_name = 'users/customer.html'
#
# return render(request, self.template_name, {'user': user})
# # import code; code.interact(local=dict(globals(), **locals()))
class UserUpdateView(UpdateView):
model = User
from django.http import Http404
from django.shortcuts import redirect
class ContractorListView(ListView):
model = User
template_name = 'contractor_list.html'
class ContractorProfileDetailView(DetailView):
model = User
template_name = 'contractor_profile.html'
# def get_object(self, queryset=None):
# object = super().get_object()
# user_group = object.groups.all().first()
# if 'Исполнители' not in user_group.name:
# return redirect('/projects/')
# return object
class ContractorOfficeDetailView(DetailView):
model = User
template_name = 'contractor_office.html'
class CustomerProfileOpenProjectsView(TemplateView):
class CustomerProfileOpenProjectsView(BaseMixin, DetailView):
model = User
template_name = 'customer_profile_open_projects.html'
class CustomerProfileTrashedProjectsView(TemplateView):
class CustomerProfileTrashedProjectsView(BaseMixin, DetailView):
model = User
template_name = 'customer_profile_trashed_projects.html'
class CustomerProfileCurrentProjectsView(TemplateView):
class CustomerProfileCurrentProjectsView(BaseMixin, DetailView):
model = User
template_name = 'customer_profile_current_projects.html'
class CustomerProfileReviewsView(TemplateView):
class CustomerProfileReviewsView(BaseMixin, DetailView):
model = User
template_name = 'customer_profile_reviews.html'

Loading…
Cancel
Save