add project customer and contractor templates

remotes/origin/setup
Mukhtar 10 years ago
parent a60286d70c
commit 8119b1bd55
  1. 1
      archilance/settings/base.py
  2. BIN
      data.xlsx
  3. 4
      projects/forms.py
  4. 20
      projects/migrations/0013_auto_20160602_1203.py
  5. 29
      projects/migrations/0014_auto_20160602_1559.py
  6. 20
      projects/migrations/0015_auto_20160602_1606.py
  7. 9
      projects/models.py
  8. 171
      projects/templates/projects/project_detail.html
  9. 14
      projects/views.py
  10. 19
      specializations/migrations/0002_auto_20160602_1203.py
  11. 2
      templates/base.html
  12. 5
      test.py
  13. 27
      users/migrations/0009_auto_20160602_1213.py
  14. 1
      users/models.py
  15. 1
      users/templates/users/contractor.html
  16. 7
      users/urls.py
  17. 48
      users/views.py
  18. 25
      worksell/migrations/0001_initial.py

@ -25,6 +25,7 @@ DJANGO_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.humanize',
]
THIRD_PARTY_APPS = [

Binary file not shown.

@ -1,5 +1,5 @@
from django import forms
from django.forms import ModelForm, HiddenInput, Form
from django.forms import ModelForm, HiddenInput, Form, Select
from django.forms.models import inlineformset_factory
from .models import Project, Portfolio, Answer, Realty, PortfolioPhoto
@ -60,6 +60,8 @@ class AnswerForm(ModelForm):
)
widgets = {
'project': HiddenInput(),
'cost_type': Select(attrs={'class':'selectpicker'}),
'term_type': Select(attrs={'class':'selectpicker'}),
}
from django.forms.models import inlineformset_factory

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-02 12:03
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0012_auto_20160530_1355'),
]
operations = [
migrations.AlterField(
model_name='answer',
name='term',
field=models.IntegerField(default=0),
),
]

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-02 15:59
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0013_auto_20160602_1203'),
]
operations = [
migrations.AlterModelOptions(
name='answer',
options={'ordering': ('-created',), 'verbose_name': 'Ответ к проекту', 'verbose_name_plural': 'Ответы к проектам'},
),
migrations.AlterField(
model_name='order',
name='cost',
field=models.DecimalField(decimal_places=0, max_digits=10),
),
migrations.AlterField(
model_name='project',
name='price',
field=models.DecimalField(decimal_places=0, max_digits=10),
),
]

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-02 16:06
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0014_auto_20160602_1559'),
]
operations = [
migrations.AlterField(
model_name='answer',
name='cost',
field=models.DecimalField(decimal_places=0, max_digits=10),
),
]

@ -35,7 +35,7 @@ class Project(models.Model):
)
name = models.CharField(max_length=255)
price = models.DecimalField(max_digits=10, decimal_places=2)
price = models.DecimalField(max_digits=10, decimal_places=0)
specialization = models.ForeignKey(Specialization, related_name='projects')
text = models.TextField(blank=True)
user = models.ForeignKey(User, related_name='projects')
@ -58,7 +58,7 @@ class Project(models.Model):
class Order(models.Model):
project = models.OneToOneField(Project, related_name='order')
contractor = models.ForeignKey(User)
cost = models.DecimalField(max_digits=10, decimal_places=2)
cost = models.DecimalField(max_digits=10, decimal_places=0)
term = models.IntegerField(default=1)
created = models.DateTimeField(default=timezone.now, editable=False)
status = models.BooleanField(default=False)
@ -84,10 +84,10 @@ class Answer(models.Model):
('month', 'month'),
)
cost = models.DecimalField(max_digits=10, decimal_places=2)
cost = models.DecimalField(max_digits=10, decimal_places=0)
cost_type = models.CharField(max_length=5, choices=COST_TYPE_CHOICES, default='rur')
text = models.TextField()
term = models.DecimalField(max_digits=10, decimal_places=2)
term = models.IntegerField(default=0)
term_type = models.CharField(max_length=10, choices=TERM_TYPE_CHOICES, default='hour')
project = models.ForeignKey(Project, related_name='answers')
user = models.ForeignKey(User, related_name='answers')
@ -99,6 +99,7 @@ class Answer(models.Model):
class Meta:
verbose_name = 'Ответ к проекту'
verbose_name_plural = 'Ответы к проектам'
ordering = ('-created',)
class Candidate(models.Model):

@ -1,13 +1,15 @@
{% extends "base.html" %}
{% block content %}
{% load humanize %}
{% load l10n %}
<div class="col-lg-12">
<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 }} <i class="fa fa-rub"></i></p>
<p>{{ object.price | intcomma }} <i class="fa fa-rub"></i></p>
</div>
<div class="col-lg-4">
<a href="#" class="aLinkExe">
@ -15,15 +17,16 @@
<img src="img/profile.jpg" alt="execitor-image">
</div>
</a>
<p class="nameExecutor">
<a href="#">{{ 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 }}</p>
<p class="navv2">{{ object.created | naturaltime}}</p>
</div>
<div class="col-lg-3 retts">
<ul class="rettList restList2">
<li>Рейтинг: <span> 1245</span></li>
<li>Безопасные сделки: <span> 5</span></li>
<li>Рейтинг: <span> 0</span></li>
<li>Безопасные сделки: <span> 0</span></li>
<li>
<a href="">Отзывы:
<span> 0 </span>
@ -39,26 +42,27 @@
Специализации:
</p>
<div class="insetSpec">
<span>Интерьеры</span>
</div>
<div class="insetSpec">
<span>Визуализация/3D</span>
<span>{{ object.specialization }}</span>
</div>
</div>
</div>
<div class="col-lg-3 retts new-list">
<ul class="desListPro">
<li>
13.0.2016
{{ object.created }}
</li>
<li>
Техническое сопровождение
{{ object.type_work }}
</li>
</ul>
{% if object.secure_transaction %}
<div class="sroUser sroExecutor sroPro">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
<p>Есть допуск СРО</p>
</div>
{% endif %}
</div>
</div>
<div class="infoProjectBlock info-new disTab">
@ -66,22 +70,19 @@
<div class="col-lg-10 col-lg-offset-1">
<ul class="listProjectIn">
<li>
<span>Местоположение:</span> Россия, Москва
<span>Местоположение:</span> {{ object.realty.country }},{{ object.realty.city }}
</li>
<li>
<span>Классификация здания:</span> Коттедж
<span>Классификация здания:</span> {{ object.realty.building_classification }}
</li>
<li>
<span>Вид строительства:</span> Новое
<span>Вид строительства:</span> {{ object.realty.type_construction }}
</li>
</ul>
</div>
<div class="col-lg-10 col-lg-offset-1">
<p class="textProIn">
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.
{{ object.text }}
</p>
</div>
<div class="col-lg-10 col-lg-offset-1">
@ -100,28 +101,95 @@
</div>
{% if perms.projects.add_answer %}
<h4>Оставить ответ</h4>
<form method="post" action="">
<form method="post">
{{ form.errors }}
{% csrf_token %}
{% for field in form %}
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ field.label }}</p>
{{ field }}
</div>
<div class="polsF1 disTab">
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ form.cost.label }}</p>
<input type="text" class="box-sizing" name="{{ form.cost.name }}" />
</div>
</div>
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ form.cost_type.label }}</p>
{{ form.cost_type }}
</div>
</div>
<div class="col-lg-6"></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>
</div>
<div class="col-lg-3">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>{{ form.term_type.label }}</p>
{{ form.term_type }}
</div>
</div>
<div class="col-lg-6"></div>
</div>
<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>
{% endfor %}
<input type="submit" value="Создать" />
</form>
{% endif %}
</div>
{% if not perms.projects.add_answer %}
<div class="exBigBlock disTab">
<div class="col-lg-12">
<p class="titleEx">Исполнители</p>
</div>
<div class="col-lg-12 exButton">
<div class="btn-group" role="group" aria-label="...">
<button type="button" class="btn btn-default">
Новые <span>+7</span>
</button>
<button type="button" class="btn btn-default">
Кандидаты <span>7</span>
</button>
<button type="button" class="btn btn-default">
Отказал <span>7</span>
</button>
</div>
</div>
</div>
<div class="col-lg-12 compareBlock">
<div class="col-lg-2 col-lg-offset-5">
<p>Сравнить кандидатов</p>
</div>
</div>
{% endif %}
<div class="candidateBlock disTab">
<div class="candidate can-new">
{% for answer in object.answers.all %}
<div class="candidate can-new">
<div class="col-lg-4">
<a href="#" class="aLinkExe">
<div class="imgExecutor">
@ -129,17 +197,17 @@
</div>
</a>
<p class="nameExecutor">
<a href="#">Иванов Петр Иванович [ivanov_petr]</a>
<a href="#">{{ answer.user.get_full_name }}</a>
</p>
<p class="navv2">На сайте 8 лет и 3 месяца</p>
<p class="navv2">{{ answer.user.created }}</p>
</div>
<div class="col-lg-3 retts">
<ul class="rettList restList2">
<li>Рейтинг: <span> 1245</span></li>
<li>Безопасные сделки: <span> 5</span></li>
<li>Рейтинг: <span>0</span></li>
<li>Безопасные сделки: <span> 0</span></li>
<li>
<a href="javascript:void(0)">Отзывы:
<span> + 385</span>
<span> + 0 </span>
<small> 0</small>
<mark> - 0</mark>
</a>
@ -151,14 +219,13 @@
</div>
</div>
<div class="col-lg-2 listCens">
<p>Цена:
<span> 35 000</span>
<p>Цена:<span> {{ answer.cost| intcomma }}</span>
<i class="fa fa-rub"></i>
</p>
<p>
Срок: <span>3 недели</span>
Срок: <span>{{ answer.term }} {{ answer.term_type }}</span>
</p>
<p>Опубликован: 22.04.2016</p>
<p>Опубликован: {{ answer.created }}</p>
</div>
<div class="col-lg-3 retts">
<a href="javascript:void(0)" class="candLink candLink3">
@ -171,9 +238,7 @@
<p class="nameComm">
Иванов Петр Иванович
</p>
<span class="dateComm44">
13.0.2016 / 21:05
</span>
<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>
@ -190,28 +255,10 @@
</p>
</div>
</div>
<div class="comm44 disTab">
<div class="col-lg-10 col-lg-offset-1">
<p class="nameComm nameCommAct">
Иванов Петр Иванович
</p>
<span class="dateComm44">
13.0.2016 / 21:05
</span>
<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.
</p>
<a href="javascript:void(0)" class="answerComm">
Ответить
</a>
</div>
</div>
</div>
</div>
{% endfor %}
</div>
<div class="col-lg-12 pagin">
<nav>

@ -52,20 +52,6 @@ class ProjectDetailView(FormMixin, DetailView):
return super().form_valid(form)
# class ProjectCreateView(CreateView):
# model = Project
# # permission_required = ('projects.add_project',)
# raise_exception = True
# form_class = ProjectForm
# success_url = '/projects/' # TODO: Use `reverse_lazy('projects-list')` from `django.core.urlresolvers`
#
# def form_valid(self, form):
# project = form.instance
# project.user = self.request.user
# project.save()
#
# return super().form_valid(form)
class PortfolioCreateView(PermissionRequiredMixin, CreateView):
model = Portfolio

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-02 12:03
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('specializations', '0001_initial'),
]
operations = [
migrations.AlterModelOptions(
name='specialization',
options={'verbose_name': 'Специализация', 'verbose_name_plural': 'Специализации'},
),
]

@ -30,7 +30,7 @@
<a href="{% url 'projects:list' %}">Биржа проектов</a>
</li>
<li class="officeList">
<a href="{% url 'user-detail' %}">Мой офис</a>
<a href="">Мой офис</a>
</li>
</ul>
</div>

@ -0,0 +1,5 @@
import xlrd
rb = xlrd.open_workbook('data.xlsx')
sheet = rb.sheet_by_index(0)
for rx in range(sheet.nrows):
print(sheet.row(rx))

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-02 12:13
from __future__ import unicode_literals
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0008_auto_20160525_1527'),
]
operations = [
migrations.AddField(
model_name='user',
name='nickname',
field=models.CharField(blank=True, max_length=50, null=True),
),
migrations.AlterField(
model_name='team',
name='owner',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='team', to=settings.AUTH_USER_MODEL),
),
]

@ -32,6 +32,7 @@ class CustomerUserManager(models.Manager):
class User(AbstractBaseUser, PermissionsMixin):
nickname = models.CharField(max_length=50, blank=True,null=True)
first_name = models.CharField(max_length=255, blank=True)
last_name = models.CharField(max_length=255, blank=True)
email = models.EmailField(max_length=255, unique=True, db_index=True)

@ -2,6 +2,7 @@
{% block content %}
<h1>{{ object }}</h1>
<h1>{{ user }}</h1>
<h2>{{ user.groups.all }}</h2>

@ -1,13 +1,16 @@
from django.conf import urls
from django.contrib.auth.views import login, logout
from .views import UserListView, UserDetailView, UserInfoListView, UserView
from .views import UserListView, UserDetailView, UserInfoListView, CustomerView, UserView, ContractorDetailView
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+)$$', UserView.as_view(), name='user_view'),
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'^(?P<pk>\d+)$', UserView.as_view(), name='user_view'),
]

@ -27,29 +27,41 @@ class UserDetailView(DetailView):
class UserView(View):
template_name = 'users/contractor.html'
pass
# template_name = 'users/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()))
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 UserUpdateView(UpdateView):
class ContractorDetailView(DetailView):
model = User
template_name = 'users/contractor.html'
# class ContractorDetailView(DetailView):
# model = User
# template_name = 'users/contractor.html'
#
# def get_queryset(self):
# qs = super().get_queryset()
# return User.contractor_objects.get(self.pk)
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):
template_name = 'users/customer.html'
def get(self, request, *args, **kwargs):
return render(request, self.template_name)
class CustomerDetailView(DetailView):
model = User

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-02 12:03
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='WorkSell',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
('description', models.TextField(blank=True)),
('img', models.ImageField(upload_to='worksell/worksell')),
],
),
]
Loading…
Cancel
Save