add contractor and customer profile

remotes/origin/setup
Mukhtar 10 years ago
parent 8119b1bd55
commit 4573742355
  1. 2
      archilance/settings/base.py
  2. 26
      projects/migrations/0016_auto_20160603_1140.py
  3. 4
      projects/models.py
  4. 66
      projects/templates/projects/comparison.html
  5. 490
      projects/templates/projects/project_detail.html
  6. 5
      projects/urls.py
  7. 8
      projects/utils.py
  8. 35
      projects/views.py
  9. 7
      templates/base.html
  10. 15
      templates/base2.html
  11. 21
      users/migrations/0010_user_last_time_visit.py
  12. 8
      users/models.py
  13. 2
      users/templates/users/contractor.html
  14. 7
      users/templates/users/contractor_list.html
  15. 136
      users/templates/users/customer.html
  16. 10
      users/urls.py
  17. 22
      users/views.py

@ -123,7 +123,7 @@ AUTHENTICATION_BACKENDS = (
LANGUAGE_CODE = 'ru-ru' LANGUAGE_CODE = 'ru-ru'
TIME_ZONE = 'UTC' TIME_ZONE = 'Europe/Moscow'
USE_I18N = True USE_I18N = True

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-03 11:40
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('projects', '0015_auto_20160602_1606'),
]
operations = [
migrations.RemoveField(
model_name='candidate',
name='user',
),
migrations.AddField(
model_name='candidate',
name='answer',
field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, related_name='candidates', to='projects.Answer'),
preserve_default=False,
),
]

@ -103,12 +103,12 @@ class Answer(models.Model):
class Candidate(models.Model): class Candidate(models.Model):
user = models.ForeignKey(User, related_name='candidates') answer = models.ForeignKey(Answer, related_name='candidates')
project = models.ForeignKey(Project, related_name='candidates') project = models.ForeignKey(Project, related_name='candidates')
status = models.BooleanField(default=False) status = models.BooleanField(default=False)
def __str__(self): def __str__(self):
pass return self.user.get_full_name()
class Meta: class Meta:
verbose_name = 'Кандидат' verbose_name = 'Кандидат'

@ -0,0 +1,66 @@
{% extends "base.html" %}
{% load staticfiles %}
{% block content %}
<div class="col-lg-12">
<p class="titleScore">Сравнение кандидатов по проекту</p>
</div>
<div class="titleBlockComparison disTab">
<div class="triangle1"></div>
<p>{{ object }}</p>
<table class="compTable">
<tr>
<th></th>
<th>Кандидат</th>
<th>Цена</th>
<th>Срок</th>
<th>Описание</th>
<th>Рейтинги/отзывы</th>
<th>Безопасные сделки</th>
<th>Решение</th>
</tr>
{% for cand in object.candidates.all %}
<tr>
<td>1</td>
<td>
{{ cand.answer.user.get_full_name }}
</td>
<td>{{ cand.answer.cost }} <i class="fa fa-rub"></i></td>
<td>
{{ cand.answer.term }}<br> <span>недели</span>
</td>
<td>
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
</td>
<td>
<ul>
<li><span>23 560</span></li>
<li>
<span>+385</span>
0
<small> - 0</small>
</li>
<li>
СРО
</li>
</ul>
</td>
<td>
<span>5</span><br>
Готов работать по безопасной сделке
</td>
<td>
<div class="tableButtons disTab">
<div class="btnTab btnTab1"></div>
<div class="btnTab btnTab2"></div>
<div class="btnTab btnTab3"></div>
<div class="btnTab btnTab4"></div>
</div>
</td>
</tr>
{% endfor %}
</table>
</div>
{% endblock %}

@ -1,286 +1,290 @@
{% extends "base.html" %} {% extends "base.html" %}
{% load staticfiles %}
{% block content %} {% block content %}
{% load humanize %} {% load humanize %}
{% load l10n %} {% load l10n %}
<div class="col-lg-12"> <div class="col-lg-12">
<p class="titleScore">{{ object }}</p> <p class="titleScore">{{ object }}</p>
</div>
<div class="doneBlock new-done disTab">
<div class="triangle1"></div>
<div class="col-lg-12 new-p">
<p>{{ object.price | intcomma }} <i class="fa fa-rub"></i></p>
</div> </div>
<div class="col-lg-4"> <div class="doneBlock new-done disTab">
<a href="#" class="aLinkExe"> <div class="triangle1"></div>
<div class="imgExecutor"> {% if user.is_contractor %}
<img src="img/profile.jpg" alt="execitor-image"> <div class="col-lg-12 new-p">
</div> <p>{{ object.price | intcomma }} <i class="fa fa-rub"></i></p>
</a> </div>
{% endif %}
<p class="nameExecutor"> <div class="col-lg-4">
<a href="{% url 'users:customer_view' object.user.pk %}">{{ object.user.get_full_name }}[ivanov_petr]</a> <a href="#" class="aLinkExe">
</p> <div class="imgExecutor">
<p class="navv2">{{ object.created | naturaltime}}</p> <img src="{% static 'img/profile.jpg' %}" alt="execitor-image">
</div> </div>
<div class="col-lg-3 retts"> </a>
<ul class="rettList restList2">
<li>Рейтинг: <span> 0</span></li> <p class="nameExecutor">
<li>Безопасные сделки: <span> 0</span></li> <a href="{% url 'users:customer-view' object.user.pk %}">{{ object.user.get_full_name }}[ivanov_petr]</a>
<li>
<a href="">Отзывы:
<span> 0 </span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
</div>
<div class="col-lg-2 new-dashed">
<div class="dashedCol4 dashedCol44 dashedColColor">
<p class="specUser">
Специализации:
</p> </p>
<div class="insetSpec"> <p class="navv2">{{ object.created | naturaltime }}</p>
<span>{{ object.specialization }}</span> </div>
<div class="col-lg-3 retts">
<ul class="rettList restList2">
<li>Рейтинг: <span> 0</span></li>
<li>Безопасные сделки: <span> 0</span></li>
<li>
<a href="">Отзывы:
<span> 0 </span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
</div>
<div class="col-lg-2 new-dashed">
<div class="dashedCol4 dashedCol44 dashedColColor">
<p class="specUser">
Специализации:
</p>
<div class="insetSpec">
<span>{{ object.specialization }}</span>
</div>
</div> </div>
</div> </div>
</div> <div class="col-lg-3 retts new-list">
<div class="col-lg-3 retts new-list"> <ul class="desListPro">
<ul class="desListPro"> <li>
<li> {{ object.created }}
{{ object.created }} </li>
</li> <li>
<li> {{ object.type_work }}
{{ object.type_work }} </li>
</li> </ul>
</ul> {% if object.secure_transaction %}
{% if object.secure_transaction %} <div class="sroUser sroExecutor sroPro">
<div class="sroUser sroExecutor sroPro"> <div class="iconSRO"></div>
<div class="iconSRO"></div>
<p>Есть допуск СРО</p> <p>Есть допуск СРО</p>
</div>
{% endif %}
</div> </div>
{% endif %}
</div> </div>
</div> <div class="infoProjectBlock info-new disTab">
<div class="infoProjectBlock info-new disTab"> <div class="triangle2"></div>
<div class="triangle2"></div> <div class="col-lg-10 col-lg-offset-1">
<div class="col-lg-10 col-lg-offset-1"> <ul class="listProjectIn">
<ul class="listProjectIn"> <li>
<li> <span>Местоположение:</span> {{ object.realty.country }},{{ object.realty.city }}
<span>Местоположение:</span> {{ object.realty.country }},{{ object.realty.city }} </li>
</li> <li>
<li> <span>Классификация здания:</span> {{ object.realty.building_classification }}
<span>Классификация здания:</span> {{ object.realty.building_classification }} </li>
</li> <li>
<li> <span>Вид строительства:</span> {{ object.realty.type_construction }}
<span>Вид строительства:</span> {{ object.realty.type_construction }} </li>
</li> </ul>
</ul> </div>
</div> <div class="col-lg-10 col-lg-offset-1">
<div class="col-lg-10 col-lg-offset-1"> <p class="textProIn">
<p class="textProIn"> {{ object.text }}
{{ object.text }} </p>
</p> </div>
</div> <div class="col-lg-10 col-lg-offset-1">
<div class="col-lg-10 col-lg-offset-1"> <a href="javascript:void(0)" class="new-answer">
<a href="javascript:void(0)" class="new-answer"> Ответить на проект
Ответить на проект </a>
</a> <div class="polsF1 pols-new disTab">
<div class="polsF1 pols-new disTab"> <div class="col-lg-3">
<div class="col-lg-3"> <select class="selectpicker">
<select class="selectpicker"> <option>Mustard</option>
<option>Mustard</option> <option>Ketchup</option>
<option>Ketchup</option> <option>Relish</option>
<option>Relish</option> </select>
</select> </div>
</div> </div>
</div> </div>
</div>
{% if perms.projects.add_answer %}
<form method="post">
{{ form.errors }}
{% csrf_token %}
<div class="polsF1 disTab"> {% if perms.projects.add_answer %}
<form method="post">
{{ form.errors }}
{% csrf_token %}
<div class="polsF1 disTab">
<div class="col-lg-3"> <div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ form.cost.label }}</p> <p>Стоимость</p>
<input type="text" class="box-sizing" name="{{ form.cost.name }}" /> <input type="text" class="box-sizing" name="{{ form.cost.name }}"/>
</div>
</div> </div>
</div>
<div class="col-lg-3"> <div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ form.cost_type.label }}</p> <p>Бюджет</p>
{{ form.cost_type }} {{ form.cost_type }}
</div>
</div> </div>
<div class="col-lg-6"></div>
</div> </div>
<div class="polsF1 disTab">
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Срок</p>
<input type="text" class="box-sizing" name="{{ form.term.name }}"/>
<div class="col-lg-6"></div> </div>
</div> </div>
<div class="polsF1 disTab">
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ form.term.label }}</p>
<input type="text" class="box-sizing" name="{{ form.term.name }}" />
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Тип срока</p>
{{ form.term_type }}
</div>
</div> </div>
</div>
<div class="col-lg-3"> <div class="col-lg-6"></div>
<div class="textAreaBlock2 text-nn box-sizing disTab"> </div>
<p>{{ form.term_type.label }}</p> <div class="polsF1 disTab">
{{ form.term_type }} <div class="col-lg-9">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Текст</p>
<textarea name="{{ form.text.name }}" id="text-new"></textarea>{{ form.project }}
</div>
</div> </div>
<div class="col-lg-3"></div>
</div>
<div class="polsF1 disTab">
<div class="col-lg-3"><input type="submit" value="Создать"/></div>
</div> </div>
<div class="col-lg-6"></div> </form>
</div> {% endif %}
<div class="polsF1 disTab">
<div class="col-lg-9">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ form.text.label }}</p>
<textarea name="{{ form.text.name }}" id="text-new"></textarea>{{ form.project }}
</div>
</div>
<div class="col-lg-3"></div>
</div>
<div class="polsF1 disTab">
<div class="col-lg-3"><input type="submit" value="Создать" /></div>
</div>
</form> </div>
{% endif %}
</div>
{% if not perms.projects.add_answer %} {% if user.is_customer %}
<div class="exBigBlock disTab"> <div class="exBigBlock disTab">
<div class="col-lg-12"> <div class="col-lg-12">
<p class="titleEx">Исполнители</p> <p class="titleEx">Исполнители</p>
</div> </div>
<div class="col-lg-12 exButton"> <div class="col-lg-12 exButton">
<div class="btn-group" role="group" aria-label="..."> <div class="btn-group" role="group" aria-label="...">
<button type="button" class="btn btn-default"> <button type="button" class="btn btn-default">
Новые <span>+7</span> Новые <span>+0</span>
</button> </button>
<button type="button" class="btn btn-default"> <button type="button" class="btn btn-default">
Кандидаты <span>7</span> Кандидаты <span>{{ object.candidates.count }}</span>
</button> </button>
<button type="button" class="btn btn-default"> <button type="button" class="btn btn-default">
Отказал <span>7</span> Отказал <span>0</span>
</button> </button>
</div> </div>
</div> </div>
</div> </div>
<div class="col-lg-12 compareBlock"> <a href="{% url 'projects:comparison' object.id %}">
<div class="col-lg-2 col-lg-offset-5"> <div class="col-lg-12 compareBlock">
<p>Сравнить кандидатов</p> <div class="col-lg-2 col-lg-offset-5">
</div> <p>Сравнить кандидатов</p>
</div> </div>
</div>
</a>
{% endif %} {% endif %}
<div class="candidateBlock disTab"> <div class="candidateBlock disTab">
{% for answer in object.answers.all %} {% for answer in object.answers.all %}
<div class="candidate can-new"> <div class="candidate can-new">
<div class="col-lg-4"> <div class="col-lg-4">
<a href="#" class="aLinkExe"> <a href="#" class="aLinkExe">
<div class="imgExecutor"> <div class="imgExecutor">
<img src="img/profile.jpg" alt="execitor-image"> <img src="{% static 'img/profile.jpg' %}" alt="execitor-image">
</div> </div>
</a>
<p class="nameExecutor">
<a href="#">{{ answer.user.get_full_name }}</a>
</p>
<p class="navv2">{{ answer.user.created }}</p>
</div>
<div class="col-lg-3 retts">
<ul class="rettList restList2">
<li>Рейтинг: <span>0</span></li>
<li>Безопасные сделки: <span> 0</span></li>
<li>
<a href="javascript:void(0)">Отзывы:
<span> + 0 </span>
<small> 0</small>
<mark> - 0</mark>
</a> </a>
</li> <p class="nameExecutor">
</ul> <a href="#">{{ answer.user.get_full_name }}</a>
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div>
</div>
<div class="col-lg-2 listCens">
<p>Цена:<span> {{ answer.cost| intcomma }}</span>
<i class="fa fa-rub"></i>
</p>
<p>
Срок: <span>{{ answer.term }} {{ answer.term_type }}</span>
</p>
<p>Опубликован: {{ answer.created }}</p>
</div>
<div class="col-lg-3 retts">
<a href="javascript:void(0)" class="candLink candLink3">
отказ
</a>
</div>
<div class="commBlock44 comm-new disTab">
<div class="comm44 disTab">
<div class="col-lg-10 col-lg-offset-1">
<p class="nameComm">
Иванов Петр Иванович
</p> </p>
<span class="dateComm44">13.0.2016 / 21:05</span> <p class="navv2">{{ answer.user.created }}</p>
<div class="stars box-sizing"> </div>
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span> <div class="col-lg-3 retts">
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span> <ul class="rettList restList2">
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span> <li>Рейтинг: <span>0</span></li>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span> <li>Безопасные сделки: <span> 0</span></li>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span> <li>
<a href="javascript:void(0)">Отзывы:
<span> + 0 </span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div> </div>
<p class="textComm44"> </div>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum laoreet. Proin <div class="col-lg-2 listCens">
gravida dolor sit amet lacus accumsan et viverra justo commodo. Proin sodales pulvinar tempor. <p>Цена:<span> {{ answer.cost| intcomma }}</span>
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam <i class="fa fa-rub"></i>
fermentum, nulla luctus pharetra vulputate, felis tellus mollis orci, sed rhoncus sapien nunc </p>
eget odio. <p>
Срок: <span>{{ answer.term }} {{ answer.term_type }}</span>
</p> </p>
<p>Опубликован: {{ answer.created }}</p>
</div>
<div class="col-lg-3 retts">
{% if 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 %}
<a href="javascript:void(0)" class="candLink candLink3">отказ</a>
</div>
<div class="commBlock44 comm-new disTab">
<div class="comm44 disTab">
<div class="col-lg-10 col-lg-offset-1">
<p class="nameComm">
Иванов Петр Иванович
</p>
<span class="dateComm44">13.0.2016 / 21:05</span>
<div class="stars box-sizing">
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
</div>
<p class="textComm44">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum
laoreet.
</p>
</div>
</div>
</div> </div>
</div> </div>
</div> {% endfor %}
</div>
{% endfor %}
</div> </div>
<div class="col-lg-12 pagin"> <div class="col-lg-12 pagin">
<nav> <nav>
<ul class="pagination"> <ul class="pagination">
<li> <li>
<a href="#" aria-label="Previous"> <a href="#" aria-label="Previous">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
</a> </a>
</li> </li>
<li class="active"><a href="#">1</a></li> <li class="active"><a href="#">1</a></li>
<li><a href="#">2</a></li> <li><a href="#">2</a></li>
<li><a href="#">3</a></li> <li><a href="#">3</a></li>
<li><a href="#">4</a></li> <li><a href="#">4</a></li>
<li><a href="#">5</a></li> <li><a href="#">5</a></li>
<li>...</li> <li>...</li>
<li><a href="#">17</a></li> <li><a href="#">17</a></li>
<li> <li>
<a href="#" aria-label="Next"> <a href="#" aria-label="Next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
</a> </a>
</li> </li>
</ul> </ul>
</nav> </nav>
</div> </div>
{% endblock %} {% endblock %}

@ -3,13 +3,14 @@ from django.views.generic import TemplateView
from .views import ProjectListView, ProjectDetailView, \ from .views import ProjectListView, ProjectDetailView, \
ProjectCreateView, PortfolioCreateView,\ ProjectCreateView, PortfolioCreateView,\
TestProjectView, manage_articles, TestView ProjectComparisonView, add_candidate, TestView
app_name = 'projects' app_name = 'projects'
urlpatterns = [ urlpatterns = [
urls.url(r'^$', ProjectListView.as_view(), name='list'), urls.url(r'^$', ProjectListView.as_view(), name='list'),
urls.url(r'^porttest/$', manage_articles, name='portfolio'), 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'^create/$', ProjectCreateView.as_view(), name='project-create'),
urls.url(r'^test/$', TestView.as_view(), name='project-test'), urls.url(r'^test/$', TestView.as_view(), name='project-test'),
urls.url(r'^portfolio/create/$', PortfolioCreateView.as_view(), name='portfolio-create'), urls.url(r'^portfolio/create/$', PortfolioCreateView.as_view(), name='portfolio-create'),

@ -0,0 +1,8 @@
from django.utils import timezone
class LastAccessMixin(object):
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated():
request.user.last_time_visit = timezone.now()
request.user.save(update_fields=['last_time_visit'])
return super().dispatch(request, *args, **kwargs)

@ -1,11 +1,15 @@
from django.http import HttpResponseForbidden, HttpResponseRedirect from django.shortcuts import render
from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.contrib.auth.mixins import PermissionRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin
from django.views.generic import ListView, DetailView, CreateView, View, TemplateView from django.views.generic import ListView, DetailView, CreateView, View, TemplateView
from django.views.generic.edit import FormMixin from django.views.generic.edit import FormMixin
from .models import Project, Portfolio
from users.models import User
from .models import Project, Portfolio, Candidate, Answer
from .forms import ProjectForm, PortfolioForm, AnswerForm, RealtyForm from .forms import ProjectForm, PortfolioForm, AnswerForm, RealtyForm
from .utils import LastAccessMixin
class ProjectListView(ListView): class ProjectListView(ListView):
@ -17,7 +21,7 @@ class ProjectListView(ListView):
return context return context
class ProjectDetailView(FormMixin, DetailView): class ProjectDetailView(LastAccessMixin, FormMixin, DetailView):
model = Project model = Project
form_class = AnswerForm form_class = AnswerForm
@ -164,16 +168,21 @@ class TestProjectView(View):
self.get_context_data(form=form, self.get_context_data(form=form,
realty_form=realty_form)) realty_form=realty_form))
from django.shortcuts import render
from .forms import PortfolioPhotoFormSet
def manage_articles(request):
form = PortfolioForm class ProjectComparisonView(DetailView):
portfolio_photo_form = PortfolioPhotoFormSet() model = Project
if request.method == "POST": template_name = 'projects/comparison.html'
form = PortfolioForm(request.POST)
portfolio_photo_form = PortfolioPhotoFormSet(request.POST, request.FILES) def get_context_data(self, **kwargs):
import code; code.interact(local=dict(globals(), **locals())) context = super().get_context_data()
return context
return render(request, 'projects/testport.html', {'form': form, 'portfolio_photo_form': portfolio_photo_form}) def add_candidate(request, answer_id, project_id):
answer = Answer.objects.get(pk=answer_id)
project = Project.objects.get(pk=project_id)
candidate = Candidate.objects.create(answer=answer, project=project)
return HttpResponseRedirect(reverse('projects:detail',args=[project_id]))

@ -29,8 +29,13 @@
<li> <li>
<a href="{% url 'projects:list' %}">Биржа проектов</a> <a href="{% url 'projects:list' %}">Биржа проектов</a>
</li> </li>
<li class="officeList"> <li class="officeList">
<a href="">Мой офис</a> {% if user.is_contractor %}
<a href="{% url 'users:contractor-view' user.id %}">Мой офис</a>
{% elif user.is_customer %}
<a href="{% url 'users:customer-view' user.id %}">Мой офис</a>
{% endif %}
</li> </li>
</ul> </ul>
</div> </div>

@ -28,11 +28,18 @@
<a href="{% url 'projects:list' %}">Биржа проектов</a> <a href="{% url 'projects:list' %}">Биржа проектов</a>
</li> </li>
<li> <li>
<a href="javascript:void(0)">Поиск исполнителей</a> <a href="{% url 'users:contractor-list' %}">Поиск исполнителей</a>
</li>
<li>
<a href="javascript:void(0)">Работы на продажу</a>
</li> </li>
<li>
{% if user.is_contractor %}
<a href="{% url 'users:contractor-view' user.id %}">Мой офис</a>
{% elif user.is_customer %}
<a href="{% url 'users:customer-view' user.id %}">Мой офис</a>
{% endif %}
</li>
{# <li>#}
{# <a href="javascript:void(0)">Работы на продажу</a>#}
{# </li>#}
</ul> </ul>
</div> </div>
<div class="col-lg-2"> <div class="col-lg-2">

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-03 12:15
from __future__ import unicode_literals
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('users', '0009_auto_20160602_1213'),
]
operations = [
migrations.AddField(
model_name='user',
name='last_time_visit',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

@ -38,6 +38,7 @@ class User(AbstractBaseUser, PermissionsMixin):
email = models.EmailField(max_length=255, unique=True, db_index=True) email = models.EmailField(max_length=255, unique=True, db_index=True)
is_active = models.BooleanField(default=True) is_active = models.BooleanField(default=True)
created = models.DateTimeField(default=timezone.now) created = models.DateTimeField(default=timezone.now)
last_time_visit = models.DateTimeField(default=timezone.now)
@property @property
def is_staff(self): def is_staff(self):
@ -62,6 +63,13 @@ class User(AbstractBaseUser, PermissionsMixin):
verbose_name = 'Пользователь' verbose_name = 'Пользователь'
verbose_name_plural = 'Пользователи' verbose_name_plural = 'Пользователи'
def is_contractor(self):
return self.groups.filter(name='Исполнители').exists()
def is_customer(self):
return self.groups.filter(name='Заказчики').exists()
class Team(models.Model): class Team(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255)

@ -52,7 +52,7 @@
<p class="cityUser">Россия, Москва</p> <p class="cityUser">Россия, Москва</p>
<p class="navv">На сайте 8 лет и 3 месяца</p> <p class="navv">На сайте 8 лет и 3 месяца</p>
<div class="statusUser">Свободен</div> <div class="statusUser">Свободен</div>
<a href="javascript:void(0)" class="showCon">показать контакты</a> <a href="" class="showCon">показать контакты</a>
</div> </div>
<div class="col-lg-4"> <div class="col-lg-4">
<div class="dashedCol4"> <div class="dashedCol4">

@ -0,0 +1,7 @@
{% extends "base.html" %}
{% block content %}
<h1>Исполнители</h1>
{% endblock %}

@ -1,4 +1,138 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% block content %} {% block content %}
<h1>Заказчик</h1> <div class="col-lg-12">
<div class="col-lg-3 divCol3">
<div class="avatar new-mar">
<div class="avatarInset">
<img src="img/profile.jpg" alt="profile-image">
</div>
</div>
</div>
<div class="col-lg-9 divCol9">
<div class="col-lg-4">
<p class="nameUser">
{{ object.get_full_name }} [ivanov_petr]
</p>
<p class="cityUser">Россия, Москва</p>
<p class="navv">На сайте {{ object.created }}</p>
</div>
<div class="col-lg-4 new-er">
<ul class="rettList">
<li><a href="javascript:void(0)">Рейтинг: <span> 0</span></a></li>
<li><a href="javascript:void(0)">Безопасные сделки: <span> 0</span></a></li>
<li>
<a href="javascript:void(0)">
Отзывы:
<span> + 0</span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
</div>
<div class="col-lg-4">
<a href="javascript:void(0)" class="new-prop new-prop1">показать контакты</a>
<a href="javascript:void(0)" class="new-prop new-prop2">написать сообщение</a>
<a href="javascript:void(0)" class="new-red">редактировать профиль</a>
</div>
</div>
<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="#">Открытые проекты</a>
</li>
<li role="presentation">
<a href="#">Текущие проекты</a>
<div class="roundsCount">
<div class="countR">0</div>
<div class="countG">0</div>
</div>
</li>
<li role="presentation">
<a href="#">Отзывы</a>
<div class="roundsCount">
<div class="countG">0</div>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="buttonGP disTab">
<div class="btn-group valProject2" role="group" aria-label="...">
<button type="button" class="btn btn-default">
Открытые проекты
<span><mark>2</mark> / <span>35</span></span>
</button>
<button type="button" class="btn btn-default">
Корзина
<span><mark></mark><span>7</span></span>
</button>
</div>
<div class="polsF1 disTab polsSearch">
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
</div>
<div class="col-lg-3 col-lg-offset-1">
<p class="addWork add-work-new">Разместить заказ</p>
</div>
</div>
<div class="projectsBlock new-pro-block disTab">
{% for proj in object.projects.all %}
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<p class="titlePro">
<a href="{% url 'projects:detail' proj.id %}">{{ proj.name }}</a>
</p>
<ul class="desPro">
<li>
Объект "{{ proj.realty.name }}"
</li>
<li>
<span>0</span> ответ от имени группы
</li>
</ul>
<ul class="color-menu">
<li>
<a href="#">Новые: 0</a>
</li>
<li>
<a href="#">Кандидаты: 0</a>
</li>
<li>
<a href="#">Отказал: 0</a>
</li>
</ul>
<p class="textPro">
{{ proj.text }}
</p>
<ul class="listPro">
<li>{{ proj.created}}</li>
<li>0</li>
<li>0</li>
<li>{{ object.get_full_name }}</li>
</ul>
</div>
<div class="col-lg-3 rightPro right-pro-red">
<p class="cenaPro">
{{ proj.price }} <i class="fa fa-rub"></i>
</p>
<ul>
<li>
Редактировать
</li>
<li>
Переместить в корзину
</li>
</ul>
</div>
</div>
{% endfor %}
</div>
{% endblock %} {% endblock %}

@ -1,16 +1,16 @@
from django.conf import urls from django.conf import urls
from django.contrib.auth.views import login, logout from django.contrib.auth.views import login, logout
from .views import UserListView, UserDetailView, UserInfoListView, CustomerView, UserView, ContractorDetailView from .views import UserListView, UserDetailView, UserInfoListView, CustomerView,\
UserView, ContractorDetailView, ContractorListView
app_name = 'users' app_name = 'users'
urlpatterns = [ urlpatterns = [
urls.url(r'^profile/$', UserDetailView.as_view(), name='user-detail'), urls.url(r'^profile/$', UserDetailView.as_view(), name='user-detail'),
# urls.url(r'^login/?$', login, {'template_name': 'users/login.html'}),
# urls.url(r'^logout/?$', logout),
urls.url(r'^$', UserListView.as_view(), name='users_list'), urls.url(r'^$', UserListView.as_view(), name='users_list'),
urls.url(r'^info$', UserInfoListView.as_view(), name='users_info_list'), urls.url(r'^info$', UserInfoListView.as_view(), name='users_info_list'),
urls.url(r'^contractor/(?P<pk>\d+)$$', ContractorDetailView.as_view(), name='contactor_view'), urls.url(r'contractors/$', ContractorListView.as_view(), name='contractor-list' ),
urls.url(r'^customer/(?P<pk>\d+)$$', CustomerView.as_view(), name='customer_view'), urls.url(r'^contractor/(?P<pk>\d+)$', ContractorDetailView.as_view(), name='contractor-view'),
urls.url(r'^customer/(?P<pk>\d+)$', CustomerView.as_view(), name='customer-view'),
urls.url(r'^(?P<pk>\d+)$', UserView.as_view(), name='user_view'), urls.url(r'^(?P<pk>\d+)$', UserView.as_view(), name='user_view'),
] ]

@ -46,22 +46,26 @@ class UserUpdateView(UpdateView):
from django.http import Http404 from django.http import Http404
from django.shortcuts import redirect from django.shortcuts import redirect
class ContractorListView(ListView):
model = User
template_name = 'users/contractor_list.html'
class ContractorDetailView(DetailView): class ContractorDetailView(DetailView):
model = User model = User
template_name = 'users/contractor.html' template_name = 'users/contractor.html'
def get_object(self, queryset=None): # def get_object(self, queryset=None):
object = super().get_object() # object = super().get_object()
user_group = object.groups.all().first() # user_group = object.groups.all().first()
if 'Исполнители' not in user_group.name: # if 'Исполнители' not in user_group.name:
return redirect('/projects/') # return redirect('/projects/')
return object # return object
class CustomerView(View): class CustomerView(DetailView):
model = User
template_name = 'users/customer.html' template_name = 'users/customer.html'
def get(self, request, *args, **kwargs):
return render(request, self.template_name)

Loading…
Cancel
Save