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. 48
      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. 11
      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'
TIME_ZONE = 'UTC'
TIME_ZONE = 'Europe/Moscow'
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):
user = models.ForeignKey(User, related_name='candidates')
answer = models.ForeignKey(Answer, related_name='candidates')
project = models.ForeignKey(Project, related_name='candidates')
status = models.BooleanField(default=False)
def __str__(self):
pass
return self.user.get_full_name()
class Meta:
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,5 +1,5 @@
{% extends "base.html" %}
{% load staticfiles %}
{% block content %}
{% load humanize %}
{% load l10n %}
@ -8,18 +8,21 @@
</div>
<div class="doneBlock new-done disTab">
<div class="triangle1"></div>
{% if user.is_contractor %}
<div class="col-lg-12 new-p">
<p>{{ object.price | intcomma }} <i class="fa fa-rub"></i></p>
</div>
{% endif %}
<div class="col-lg-4">
<a href="#" class="aLinkExe">
<div class="imgExecutor">
<img src="img/profile.jpg" alt="execitor-image">
<img src="{% static 'img/profile.jpg' %}" alt="execitor-image">
</div>
</a>
<p class="nameExecutor">
<a href="{% url 'users:customer_view' object.user.pk %}">{{ object.user.get_full_name }}[ivanov_petr]</a>
<a href="{% url 'users:customer-view' object.user.pk %}">{{ object.user.get_full_name }}[ivanov_petr]</a>
</p>
<p class="navv2">{{ object.created | naturaltime }}</p>
</div>
@ -104,12 +107,11 @@
<form method="post">
{{ form.errors }}
{% csrf_token %}
<div class="polsF1 disTab">
<div class="col-lg-3">
<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 }}"/>
</div>
@ -117,7 +119,7 @@
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ form.cost_type.label }}</p>
<p>Бюджет</p>
{{ form.cost_type }}
</div>
</div>
@ -127,7 +129,7 @@
<div class="polsF1 disTab">
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ form.term.label }}</p>
<p>Срок</p>
<input type="text" class="box-sizing" name="{{ form.term.name }}"/>
</div>
@ -135,7 +137,7 @@
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ form.term_type.label }}</p>
<p>Тип срока</p>
{{ form.term_type }}
</div>
</div>
@ -145,7 +147,7 @@
<div class="polsF1 disTab">
<div class="col-lg-9">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ form.text.label }}</p>
<p>Текст</p>
<textarea name="{{ form.text.name }}" id="text-new"></textarea>{{ form.project }}
</div>
</div>
@ -160,7 +162,8 @@
</div>
{% if not perms.projects.add_answer %}
{% if user.is_customer %}
<div class="exBigBlock disTab">
<div class="col-lg-12">
<p class="titleEx">Исполнители</p>
@ -168,22 +171,24 @@
<div class="col-lg-12 exButton">
<div class="btn-group" role="group" aria-label="...">
<button type="button" class="btn btn-default">
Новые <span>+7</span>
Новые <span>+0</span>
</button>
<button type="button" class="btn btn-default">
Кандидаты <span>7</span>
Кандидаты <span>{{ object.candidates.count }}</span>
</button>
<button type="button" class="btn btn-default">
Отказал <span>7</span>
Отказал <span>0</span>
</button>
</div>
</div>
</div>
<a href="{% url 'projects:comparison' object.id %}">
<div class="col-lg-12 compareBlock">
<div class="col-lg-2 col-lg-offset-5">
<p>Сравнить кандидатов</p>
</div>
</div>
</a>
{% endif %}
<div class="candidateBlock disTab">
@ -193,7 +198,7 @@
<div class="col-lg-4">
<a href="#" class="aLinkExe">
<div class="imgExecutor">
<img src="img/profile.jpg" alt="execitor-image">
<img src="{% static 'img/profile.jpg' %}" alt="execitor-image">
</div>
</a>
<p class="nameExecutor">
@ -228,9 +233,11 @@
<p>Опубликован: {{ answer.created }}</p>
</div>
<div class="col-lg-3 retts">
<a href="javascript:void(0)" class="candLink candLink3">
отказ
</a>
{% 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">
@ -247,11 +254,8 @@
<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. Proin
gravida dolor sit amet lacus accumsan et viverra justo commodo. Proin sodales pulvinar tempor.
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam
fermentum, nulla luctus pharetra vulputate, felis tellus mollis orci, sed rhoncus sapien nunc
eget odio.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum
laoreet.
</p>
</div>
</div>

@ -3,13 +3,14 @@ from django.views.generic import TemplateView
from .views import ProjectListView, ProjectDetailView, \
ProjectCreateView, PortfolioCreateView,\
TestProjectView, manage_articles, TestView
ProjectComparisonView, add_candidate, TestView
app_name = 'projects'
urlpatterns = [
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'^test/$', TestView.as_view(), name='project-test'),
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.contrib.auth.mixins import PermissionRequiredMixin
from django.views.generic import ListView, DetailView, CreateView, View, TemplateView
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 .utils import LastAccessMixin
class ProjectListView(ListView):
@ -17,7 +21,7 @@ class ProjectListView(ListView):
return context
class ProjectDetailView(FormMixin, DetailView):
class ProjectDetailView(LastAccessMixin, FormMixin, DetailView):
model = Project
form_class = AnswerForm
@ -164,16 +168,21 @@ class TestProjectView(View):
self.get_context_data(form=form,
realty_form=realty_form))
from django.shortcuts import render
from .forms import PortfolioPhotoFormSet
def manage_articles(request):
form = PortfolioForm
portfolio_photo_form = PortfolioPhotoFormSet()
if request.method == "POST":
form = PortfolioForm(request.POST)
portfolio_photo_form = PortfolioPhotoFormSet(request.POST, request.FILES)
import code; code.interact(local=dict(globals(), **locals()))
class ProjectComparisonView(DetailView):
model = Project
template_name = 'projects/comparison.html'
def get_context_data(self, **kwargs):
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>
<a href="{% url 'projects:list' %}">Биржа проектов</a>
</li>
<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>
</ul>
</div>

@ -28,11 +28,18 @@
<a href="{% url 'projects:list' %}">Биржа проектов</a>
</li>
<li>
<a href="javascript:void(0)">Поиск исполнителей</a>
<a href="{% url 'users:contractor-list' %}">Поиск исполнителей</a>
</li>
<li>
<a href="javascript:void(0)">Работы на продажу</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>#}
{# <a href="javascript:void(0)">Работы на продажу</a>#}
{# </li>#}
</ul>
</div>
<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)
is_active = models.BooleanField(default=True)
created = models.DateTimeField(default=timezone.now)
last_time_visit = models.DateTimeField(default=timezone.now)
@property
def is_staff(self):
@ -62,6 +63,13 @@ class User(AbstractBaseUser, PermissionsMixin):
verbose_name = 'Пользователь'
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):
name = models.CharField(max_length=255)

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

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

@ -1,4 +1,138 @@
{% extends 'base.html' %}
{% 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 %}

@ -1,16 +1,16 @@
from django.conf import urls
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'
urlpatterns = [
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'^info$', UserInfoListView.as_view(), name='users_info_list'),
urls.url(r'^contractor/(?P<pk>\d+)$$', ContractorDetailView.as_view(), name='contactor_view'),
urls.url(r'^customer/(?P<pk>\d+)$$', CustomerView.as_view(), name='customer_view'),
urls.url(r'contractors/$', ContractorListView.as_view(), name='contractor-list' ),
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'),
]

@ -46,22 +46,26 @@ class UserUpdateView(UpdateView):
from django.http import Http404
from django.shortcuts import redirect
class ContractorListView(ListView):
model = User
template_name = 'users/contractor_list.html'
class ContractorDetailView(DetailView):
model = User
template_name = 'users/contractor.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
# 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 CustomerView(View):
class CustomerView(DetailView):
model = User
template_name = 'users/customer.html'
def get(self, request, *args, **kwargs):
return render(request, self.template_name)

Loading…
Cancel
Save