#ARC-4 Add financial models

remotes/origin/setup
Mukhtar 10 years ago
parent 007dfcd49f
commit 856c3c17fb
  1. 1
      archilance/settings/base.py
  2. 2
      archilance/settings/dev.py
  3. 0
      common/__init__.py
  4. 9
      common/admin.py
  5. 5
      common/apps.py
  6. 66
      common/migrations/0001_initial.py
  7. 31
      common/migrations/0002_auto_20160615_1625.py
  8. 0
      common/migrations/__init__.py
  9. 21
      common/models.py
  10. 3
      common/tests.py
  11. 3
      common/views.py
  12. 4
      projects/admin.py
  13. 4
      projects/forms.py
  14. 52
      projects/migrations/0032_auto_20160615_1610.py
  15. 27
      projects/models.py
  16. 0
      projects/templates/_trash/project_form.html
  17. 0
      projects/templates/_trash/testport.html
  18. 2
      projects/templates/contractor_project_detail.html
  19. 0
      projects/templates/project_list.html
  20. 18
      projects/templates/projects/portfolio_form.html
  21. 275
      projects/templates/projects/project_detail.html
  22. 1
      projects/views.py
  23. 28
      users/migrations/0014_auto_20160615_1611.py
  24. 78
      users/migrations/0015_auto_20160615_1747.py
  25. 55
      users/models.py
  26. 144
      users/templates/contractor_profile_edit.html
  27. 1
      users/templates/name_snippet.html
  28. 6
      users/urls.py
  29. 10
      users/views.py

@ -38,6 +38,7 @@ THIRD_PARTY_APPS = [
LOCAL_APPS = [ LOCAL_APPS = [
'api', 'api',
'common',
'archilance', 'archilance',
'projects', 'projects',
'specializations', 'specializations',

@ -2,7 +2,7 @@ from .base import *
AUTH_PASSWORD_VALIDATORS = [] AUTH_PASSWORD_VALIDATORS = []
INSTALLED_APPS += ['debug_toolbar',] # INSTALLED_APPS += ['debug_toolbar',]
try: try:
from .local import * from .local import *

@ -0,0 +1,9 @@
from django.contrib import admin
from mptt.admin import MPTTModelAdmin
from .models import Location
class LocationAdmin(MPTTModelAdmin):
readonly_fields = ('pk', 'lft', 'rght', 'tree_id', 'level')
admin.site.register(Location, LocationAdmin)

@ -0,0 +1,5 @@
from django.apps import AppConfig
class CommonConfig(AppConfig):
name = 'common'

@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-15 12:56
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import django.db.models.manager
import mptt.fields
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='City',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
],
options={
'verbose_name_plural': 'Города',
'verbose_name': 'Город',
},
),
migrations.CreateModel(
name='Country',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=255)),
],
options={
'verbose_name_plural': 'Страны',
'verbose_name': 'Страна',
},
),
migrations.CreateModel(
name='Location',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=50)),
('type', models.CharField(blank=True, choices=[('country', 'Страна'), ('region', 'Регион'), ('town', 'Город')], max_length=20, null=True)),
('lft', models.PositiveIntegerField(db_index=True, editable=False)),
('rght', models.PositiveIntegerField(db_index=True, editable=False)),
('tree_id', models.PositiveIntegerField(db_index=True, editable=False)),
('level', models.PositiveIntegerField(db_index=True, editable=False)),
('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='common.Location')),
],
options={
'verbose_name_plural': 'Местоположения',
'verbose_name': 'Местоположение',
},
managers=[
('_default_manager', django.db.models.manager.Manager()),
],
),
migrations.AddField(
model_name='city',
name='country',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cities', to='common.Country'),
),
]

@ -0,0 +1,31 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-15 13:25
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('common', '0001_initial'),
]
operations = [
migrations.RemoveField(
model_name='city',
name='country',
),
migrations.AlterField(
model_name='location',
name='type',
field=models.CharField(choices=[('_root', 'Корень'), ('country', 'Страна'), ('region', 'Регион'), ('town', 'Город')], default=None, max_length=20),
preserve_default=False,
),
migrations.DeleteModel(
name='City',
),
migrations.DeleteModel(
name='Country',
),
]

@ -0,0 +1,21 @@
from django.db import models
from mptt.models import TreeForeignKey, MPTTModel
class Location(MPTTModel):
TYPES = (
('_root', 'Корень'),
('country', 'Страна'),
('region', 'Регион'),
('town', 'Город'),
)
name = models.CharField(max_length=50)
parent = TreeForeignKey('self', blank=True, null=True, related_name='children', db_index=True)
type = models.CharField(max_length=20, choices=TYPES)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Местоположение'
verbose_name_plural = 'Местоположения'

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.

@ -1,7 +1,7 @@
from django.contrib import admin from django.contrib import admin
from .models import Project, Portfolio, PortfolioPhoto, \ from .models import Project, Portfolio, PortfolioPhoto, \
Answer, Realty, Candidate, Order, Stage, Country, City,\ Answer, Realty, Candidate, Order, Stage,\
BuildingClassfication, ConstructionType, ProjectFile BuildingClassfication, ConstructionType, ProjectFile
@ -16,8 +16,6 @@ admin.site.register(Realty)
admin.site.register(Order) admin.site.register(Order)
admin.site.register(Candidate) admin.site.register(Candidate)
admin.site.register(Stage) admin.site.register(Stage)
admin.site.register(Country)
admin.site.register(City)
admin.site.register(BuildingClassfication) admin.site.register(BuildingClassfication)
admin.site.register(ConstructionType) admin.site.register(ConstructionType)
admin.site.register(Project, ProjectAdmin) admin.site.register(Project, ProjectAdmin)

@ -45,8 +45,6 @@ class RealtyForm(ModelForm):
model = Realty model = Realty
fields = ( fields = (
'country',
'city',
'building_classification', 'building_classification',
'construction_type', 'construction_type',
'name', 'name',
@ -55,8 +53,6 @@ class RealtyForm(ModelForm):
widgets = { widgets = {
'construction_type': Select(attrs={'class':'selectpicker'}), 'construction_type': Select(attrs={'class':'selectpicker'}),
'building_classification': Select(attrs={'class':'selectpicker'}), 'building_classification': Select(attrs={'class':'selectpicker'}),
'city': Select(attrs={'class':'selectpicker'}),
'country': Select(attrs={'class':'selectpicker'}),
} }
class Realty1Form(Form): class Realty1Form(Form):

@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-15 13:10
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
import mptt.fields
class Migration(migrations.Migration):
dependencies = [
('common', '0001_initial'),
('projects', '0031_auto_20160610_1434'),
]
operations = [
migrations.RemoveField(
model_name='city',
name='country',
),
migrations.RemoveField(
model_name='realty',
name='city',
),
migrations.RemoveField(
model_name='realty',
name='country',
),
migrations.AddField(
model_name='realty',
name='location',
field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='common.Location'),
),
migrations.AlterField(
model_name='order',
name='created',
field=models.DateTimeField(default=django.utils.timezone.now),
),
migrations.AlterField(
model_name='project',
name='state',
field=models.CharField(choices=[('active', 'Активный'), ('trashed', 'В корзине'), ('deleted', 'Удален')], default='active', max_length=20),
),
migrations.DeleteModel(
name='City',
),
migrations.DeleteModel(
name='Country',
),
]

@ -1,3 +1,4 @@
from mptt.models import TreeForeignKey
from datetime import datetime from datetime import datetime
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
@ -40,34 +41,10 @@ class ConstructionType(models.Model):
verbose_name_plural = 'Виды строительства' verbose_name_plural = 'Виды строительства'
class Country(models.Model):
name = models.CharField(max_length=255)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Страна'
verbose_name_plural = 'Страны'
class City(models.Model):
name = models.CharField(max_length=255)
country = models.ForeignKey(Country, related_name='cities')
def __str__(self):
return self.name
class Meta:
verbose_name = 'Город'
verbose_name_plural = 'Города'
class Realty(models.Model): class Realty(models.Model):
building_classification = models.ForeignKey(BuildingClassfication, related_name='realties') building_classification = models.ForeignKey(BuildingClassfication, related_name='realties')
city = models.ForeignKey(City, related_name='realties')
construction_type = models.ForeignKey(ConstructionType, related_name='realties') construction_type = models.ForeignKey(ConstructionType, related_name='realties')
country = models.ForeignKey(Country, related_name='realties') location = TreeForeignKey('common.Location', related_name='realties', null=True, blank=True)
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
user = models.ForeignKey(User, related_name='realties') user = models.ForeignKey(User, related_name='realties')

@ -72,7 +72,7 @@
<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> {{ project.realty.country }}, {{ project.realty.city }} <span>Местоположение:</span>
</li> </li>
<li> <li>
<span>Классификация здания:</span> {{ project.realty.building_classification }} <span>Классификация здания:</span> {{ project.realty.building_classification }}

@ -1,18 +0,0 @@
{% extends 'partials/base.html' %}
{% block content %}
<h1>Добавление</h1>
<form method="post" action="">
{{ form.errors }}
{% csrf_token %}
{% for field in form %}
<div class="row">
{{ field.label }}
{{ field }}
</div>
{% endfor %}
<input type="submit" value="Создать" />
</form>
{% endblock %}s

@ -1,275 +0,0 @@
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% load humanize %}
{% block content %}
{% include 'partials/header.html' %}
<div class="col-lg-12">
<p class="titleScore">{{ object }}</p>
</div>
<div class="doneBlock new-done disTab">
<div class="triangle1"></div>
{% if request.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="{% 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>
</p>
<p class="navv2">{{ object.created | naturaltime }}</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="">Отзывы:
<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 class="col-lg-3 retts new-list">
<ul class="desListPro">
<li>
{{ object.created }}
</li>
<li>
{{ object.type_work }}
</li>
</ul>
{% if object.secure_transaction %}
<div class="sroUser sroExecutor sroPro">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div>
{% endif %}
</div>
</div>
<div class="infoProjectBlock info-new disTab">
<div class="triangle2"></div>
<div class="col-lg-10 col-lg-offset-1">
<ul class="listProjectIn">
<li>
<span>Местоположение:</span> {{ object.realty.country }},{{ object.realty.city }}
</li>
<li>
<span>Классификация здания:</span> {{ object.realty.building_classification }}
</li>
<li>
<span>Вид строительства:</span> {{ object.realty.type_construction }}
</li>
</ul>
</div>
<div class="col-lg-10 col-lg-offset-1">
<p class="textProIn">
{{ object.text }}
</p>
</div>
<div class="col-lg-10 col-lg-offset-1">
<a href="javascript:void(0)" class="new-answer">
Ответить на проект
</a>
<div class="polsF1 pols-new disTab">
<div class="col-lg-3">
<select class="selectpicker">
<option>От своего имени</option>
<option></option>
</select>
</div>
</div>
</div>
{% if perms.projects.add_answer %}
<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>Стоимость</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>Бюджет</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>Срок</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>Тип срока</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>Текст</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>
{% endif %}
</div>
{% if request.user.is_customer %}
<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>+0</span>
</button>
<button type="button" class="btn btn-default">
Кандидаты <span>{{ object.candidates.count }}</span>
</button>
<button type="button" class="btn btn-default">
Отказал <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">
{% for answer in object.answers.all %}
<div class="candidate can-new">
<div class="col-lg-4">
<a href="#" class="aLinkExe">
<div class="imgExecutor">
<img src="{% static 'img/profile.jpg' %}" alt="execitor-image">
</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>
</li>
</ul>
<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">
{% 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 %}
<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>
{% endfor %}
</div>
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>
{% include 'partials/footer.html' %}
{% endblock %}

@ -15,6 +15,7 @@ from .mixins import LastAccessMixin
class ProjectsView(ListView): class ProjectsView(ListView):
model = Project model = Project
template_name = 'project_list.html'
class ProjectView(LastAccessMixin, View): class ProjectView(LastAccessMixin, View):

@ -0,0 +1,28 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-15 13:11
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import mptt.fields
class Migration(migrations.Migration):
dependencies = [
('common', '0001_initial'),
('users', '0013_auto_20160610_1703'),
]
operations = [
migrations.AddField(
model_name='user',
name='location',
field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='users', to='common.Location'),
),
migrations.AddField(
model_name='user',
name='patronym',
field=models.CharField(blank=True, max_length=255),
),
]

@ -0,0 +1,78 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-15 14:47
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
import django.db.models.deletion
from django.utils.timezone import utc
class Migration(migrations.Migration):
dependencies = [
('users', '0014_auto_20160615_1611'),
]
operations = [
migrations.CreateModel(
name='ContractorFinancialInfo',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('fio', models.CharField(max_length=255)),
('date_of_birth', models.DateTimeField()),
('phone', models.CharField(max_length=30)),
('residency', models.CharField(choices=[('russian_resident', 'Резидент РФ'), ('non_russian_resident', 'Нерезидент РФ'), ('refugee', 'Беженец'), ('russian_stay_permit', 'Вид на жительство')], max_length=50)),
('legal_status', models.CharField(choices=[('individual', 'Физическое лицо'), ('legal_entity', 'ИП и Юридическое лицо')], max_length=30)),
('passport_series', models.CharField(max_length=6)),
('passport_number', models.CharField(max_length=10)),
('subdivision_code', models.CharField(max_length=10)),
('passport_issued_by', models.CharField(max_length=255)),
('passport_issue_date', models.DateTimeField()),
('inn', models.CharField(max_length=100)),
('yandex_money', models.CharField(max_length=50)),
('credit_card_number', models.CharField(max_length=50)),
('passport_scan', models.ImageField(upload_to='users/contractors/')),
],
options={
'verbose_name': 'Финансовая информация',
'verbose_name_plural': 'Финансовая информация',
},
),
migrations.AddField(
model_name='user',
name='avatar',
field=models.ImageField(blank=True, upload_to='users/avatars/'),
),
migrations.AddField(
model_name='user',
name='cro',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='user',
name='date_of_birth',
field=models.DateTimeField(default=datetime.datetime(2016, 6, 15, 14, 47, 5, 758769, tzinfo=utc)),
preserve_default=False,
),
migrations.AddField(
model_name='user',
name='gender',
field=models.CharField(blank=True, choices=[('male', 'Мужской'), ('female', 'Женский')], max_length=30),
),
migrations.AddField(
model_name='user',
name='skype',
field=models.CharField(blank=True, max_length=100),
),
migrations.AddField(
model_name='user',
name='website',
field=models.CharField(blank=True, max_length=255),
),
migrations.AddField(
model_name='user',
name='contractor_financial_info',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor', to='users.ContractorFinancialInfo'),
),
]

@ -1,3 +1,4 @@
from mptt.models import TreeForeignKey
from datetime import datetime from datetime import datetime
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
@ -5,7 +6,6 @@ from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, Abstra
from specializations.models import Specialization from specializations.models import Specialization
class UserManager(BaseUserManager): class UserManager(BaseUserManager):
def create_user(self, email, password=None): def create_user(self, email, password=None):
if not email: if not email:
@ -32,6 +32,48 @@ class CustomerUserManager(models.Manager):
def get_queryset(self): def get_queryset(self):
return super().get_queryset().filter(groups__name='Заказчики') return super().get_queryset().filter(groups__name='Заказчики')
GENDERS = (
('male', 'Мужской'),
('female', 'Женский'),
)
class ContractorFinancialInfo(models.Model):
RESIDENCIES = (
('russian_resident', 'Резидент РФ'),
('non_russian_resident', 'Нерезидент РФ'),
('refugee', 'Беженец'),
('russian_stay_permit', 'Вид на жительство'),
)
LEGAL_STATUSES = (
('individual', 'Физическое лицо'),
('legal_entity', 'ИП и Юридическое лицо'),
)
fio = models.CharField(max_length=255)
date_of_birth = models.DateTimeField()
phone = models.CharField(max_length=30)
residency = models.CharField(max_length=50,choices=RESIDENCIES)
legal_status = models.CharField(max_length=30, choices=LEGAL_STATUSES)
passport_series = models.CharField(max_length=6)
passport_number = models.CharField(max_length=10)
subdivision_code = models.CharField(max_length=10)
passport_issued_by = models.CharField(max_length=255)
passport_issue_date = models.DateTimeField()
inn = models.CharField(max_length=100)
yandex_money = models.CharField(max_length=50)
credit_card_number = models.CharField(max_length=50)
passport_scan = models.ImageField(upload_to='users/contractors/')
def __str__(self):
return self.fio
class Meta:
verbose_name = 'Финансовая информация'
verbose_name_plural = 'Финансовая информация'
class User(AbstractBaseUser, PermissionsMixin): class User(AbstractBaseUser, PermissionsMixin):
STATUSES = ( STATUSES = (
@ -41,12 +83,21 @@ class User(AbstractBaseUser, PermissionsMixin):
nickname = models.CharField(max_length=50, blank=True,null=True) nickname = models.CharField(max_length=50, blank=True,null=True)
first_name = models.CharField(max_length=255, blank=True) first_name = models.CharField(max_length=255, blank=True)
last_name = models.CharField(max_length=255, blank=True) last_name = models.CharField(max_length=255, blank=True)
patronym = models.CharField(max_length=255, blank=True)
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) last_time_visit = models.DateTimeField(default=timezone.now)
contractor_specializations = models.ManyToManyField(Specialization, related_name='contractors', blank=True) contractor_specializations = models.ManyToManyField(Specialization, related_name='contractors', blank=True)
contractor_status = models.CharField(default='free', max_length=20, choices=STATUSES) contractor_status = models.CharField(default='free', max_length=20, choices=STATUSES)
contractor_financial_info = models.OneToOneField(ContractorFinancialInfo, related_name='contractor',blank=True, null=True)
location = TreeForeignKey('common.Location', related_name='users', null=True, blank=True)
skype = models.CharField(max_length=100, blank=True)
gender = models.CharField(max_length=30, choices=GENDERS, blank=True)
cro = models.BooleanField(default=False)
website = models.CharField(max_length=255, blank=True)
date_of_birth = models.DateTimeField()
avatar = models.ImageField(upload_to='users/avatars/', blank=True)
@property @property
def is_staff(self): def is_staff(self):
@ -56,7 +107,6 @@ class User(AbstractBaseUser, PermissionsMixin):
def is_free(self): def is_free(self):
return self.contractor_status == 'free' return self.contractor_status == 'free'
def __str__(self): def __str__(self):
return self.email return self.email
@ -84,6 +134,7 @@ class User(AbstractBaseUser, PermissionsMixin):
class Team(models.Model): class Team(models.Model):
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
users = models.ManyToManyField(User, related_name ='teams', blank=True) users = models.ManyToManyField(User, related_name ='teams', blank=True)

@ -0,0 +1,144 @@
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% block content %}
{% include 'partials/header.html' %}
<div class="container mainScore">
<div class="row">
<div class="projectsBlock disTab">
<div class="col-lg-12">
<div class="col-lg-3 divCol3">
<div class="avatar">
<div class="avatarInset">
<img src="img/profile.jpg" alt="profile-image">
</div>
</div>
<div class="menuUser upload-img disTab">
<div class="upload2 up-l1">
<input type="file" name="upload">
<p>Загрузить фотографию</p>
</div>
</div>
</div>
<div class="col-lg-9 divCol9">
<div class="col-lg-4">
<p class="name-edit-p">ФИО:</p>
<input type="text" value="{{ contractor.get_full_name }}" class="box-sizing inp-edit">
<input type="text" value="{{ contractor.last_name }}" class="box-sizing inp-edit">
<input type="text" value="{{ contractor. }}" class="box-sizing inp-edit">
</div>
<div class="col-lg-4">
<p class="name-edit-p">Специализация:</p>
<div class="polsF1 pols-edit disTab">
<select class="selectpicker4">
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
<select class="selectpicker4">
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
<a href="javascript:void(0)" class="add-edit">
Добавить еще
</a>
</div>
</div>
<div class="col-lg-4">
<p class="name-edit-p">Местоположение:</p>
<div class="polsF1 pols-edit disTab">
<select class="selectpicker4">
<option>Страна</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
<select class="selectpicker4">
<option>Город</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
</div>
</div>
</div>
</div>
<div class="buttonGP btn-edit disTab">
<div class="btn-group valProject valProject2" role="group" aria-label="...">
<button type="button" class="btn btn-default">Общая информация</button>
<button type="button" class="btn btn-default">Финансовая информация</button>
</div>
</div>
<div class="col-lg-12 col12 new-filter">
<div class="filter clearfix">
<div class="titleF1 disTab">
<div class="col-lg-7">Дата рождения:</div>
<div class="col-lg-5">Пол:</div>
</div>
<div class="polsF1 disTab">
<div class="col-lg-7">
<select class="selectpicker2 valul">
<option>1</option>
<option>2</option>
<option>3</option>
</select>
<select class="selectpicker left-edit">
<option>Января</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
<select class="selectpicker5 valul left-edit">
<option>1996</option>
<option>1995</option>
<option>1995</option>
</select>
</div>
<div class="col-lg-5 dog-new ed-new">
<label><input type="radio" name="sex"><span></span></label>
<p>Мужской</p>
<label class="woman"><input type="radio" name="sex"><span></span></label>
<p>Женский</p>
</div>
</div>
<div class="titleF1 titleF2 disTab">
<div class="col-lg-3">Сайт:</div>
<div class="col-lg-3">Skype:</div>
<div class="col-lg-3">Электронная почта:</div>
<div class="col-lg-3">Телефон:</div>
</div>
<div class="searchF1 polsF1 polsFF polsF3">
<div class="col-lg-3">
<input type="text" class="box-sizing surr surr2" placeholder="beeg.com">
</div>
<div class="col-lg-3">
<input type="text" class="box-sizing surr surr2" placeholder="nokia770">
</div>
<div class="col-lg-3">
<input type="text" class="box-sizing surr surr2" placeholder="example@gmail.com">
</div>
<div class="col-lg-3">
<input type="text" class="box-sizing surr surr2" placeholder="+7 999 999 44 02">
</div>
</div>
<div class="col-lg-12">
<div class="col-lg-12 make-new make-eed">
<label><input type="checkbox" name="dogovor"><span></span></label>
<p>Есть допуск СРО</p>
</div>
</div>
<div class="searchF1 polsF1 polsFF links-filter">
<a href="javascript:void(0)">Сохранить</a>
</div>
</div>
<div>
{% include 'partials/footer.html' %}
</div>
</div>
</div>
</div>
{% endblock %}

@ -0,0 +1 @@
{{ greeting }}, {{ person|default:"friend" }}!

@ -5,13 +5,14 @@ from .views import (
ContractorListView, ContractorListView,
ContractorOfficeDetailView, ContractorOfficeDetailView,
ContractorProfileDetailView, ContractorProfileDetailView,
ContractorProfileEditView,
CustomerProfileCurrentProjectsView, CustomerProfileCurrentProjectsView,
CustomerProfileOpenProjectsView, CustomerProfileOpenProjectsView,
CustomerProfileReviewsView, CustomerProfileReviewsView,
CustomerProfileTrashedProjectsView, CustomerProfileTrashedProjectsView,
# UserDetailView, # UserDetailView,
# UserInfoListView, # UserInfoListView,
# UserListView, UserListView,
# UserView, # UserView,
) )
@ -27,8 +28,9 @@ urlpatterns = [
urls.url(r'^contractors/(?P<pk>\d+)/$', ContractorProfileDetailView.as_view(), name='contractor-profile'), 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'^contractor-office/(?P<pk>\d+)/$', ContractorOfficeDetailView.as_view(), name='contractor-office'),
# urls.url(r'^profile/$', UserDetailView.as_view(), name='user-detail'), # urls.url(r'^profile/$', UserDetailView.as_view(), name='user-detail'),
# 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'contractors/$', ContractorListView.as_view(), name='contractor-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'),
urls.url(r'contractors/(?P<pk>\d+)/edit/$', ContractorProfileEditView.as_view(), name='contractor-edit' ),
] ]

@ -1,4 +1,4 @@
from django.shortcuts import render from django.shortcuts import render, get_object_or_404
from django.contrib.auth.models import Group from django.contrib.auth.models import Group
from django.views.generic import ListView, DetailView, View, UpdateView from django.views.generic import ListView, DetailView, View, UpdateView
from django.views.generic.base import TemplateView from django.views.generic.base import TemplateView
@ -46,3 +46,11 @@ class CustomerProfileCurrentProjectsView(BaseMixin, DetailView):
class CustomerProfileReviewsView(BaseMixin, DetailView): class CustomerProfileReviewsView(BaseMixin, DetailView):
model = User model = User
template_name = 'customer_profile_reviews.html' template_name = 'customer_profile_reviews.html'
class ContractorProfileEditView(BaseMixin, View):
template_name = 'contractor_profile_edit.html'
def get(self, request, *args, **kwargs):
contractor = get_object_or_404(User, pk=kwargs.get('pk'))
return render(request, self.template_name, {'contractor': contractor})

Loading…
Cancel
Save