remotes/origin/setup
ArturBaybulatov 10 years ago
commit 91414a8151
  1. 1
      archilance/settings/base.py
  2. 0
      common/__init__.py
  3. 9
      common/admin.py
  4. 5
      common/apps.py
  5. 66
      common/migrations/0001_initial.py
  6. 31
      common/migrations/0002_auto_20160615_1625.py
  7. 0
      common/migrations/__init__.py
  8. 21
      common/models.py
  9. 3
      common/tests.py
  10. 3
      common/views.py
  11. 4
      projects/admin.py
  12. 4
      projects/forms.py
  13. 52
      projects/migrations/0032_auto_20160615_1610.py
  14. 27
      projects/models.py
  15. 278
      projects/templates/_trash/project_form.html
  16. 18
      projects/templates/_trash/testport.html
  17. 2
      projects/templates/contractor_project_detail.html
  18. 1
      projects/views.py
  19. 28
      users/migrations/0014_auto_20160615_1611.py
  20. 78
      users/migrations/0015_auto_20160615_1747.py
  21. 57
      users/models.py
  22. 144
      users/templates/contractor_profile_edit.html
  23. 1
      users/templates/name_snippet.html
  24. 6
      users/urls.py
  25. 10
      users/views.py

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

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

@ -46,8 +46,6 @@ class RealtyForm(ModelForm):
model = Realty model = Realty
fields = ( fields = (
'country',
'city',
'building_classification', 'building_classification',
'construction_type', 'construction_type',
'name', 'name',
@ -56,8 +54,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')

@ -0,0 +1,278 @@
{% extends 'partials/base.html' %}
{% block content %}
<div class="col-lg-12 allProjects">
<p class="titleScore">Новый заказ</p>
</div>
<form method="post">
{% csrf_token %}
{{ form_project.errors }}
{{ form_realty.errors }}
<div class="chatBlock new-rass new-rass2 disTab">
{{ project_form.errors }}
<div class="col-lg-9">
<p class="new-pp new-pp3">Формирование заказа</p>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Название заказа</p>
<input type="text" class="box-sizing" name="{{ project_form.name.name }}"/>
{{ project_form.name.errors }}
</div>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Подробно опишите задание</p>
<textarea name="{{ project_form.text.name }}" id="text-new"></textarea>
</div>
</div>
<div class="col-lg-3 wrChat1">
<div class="messageBlock box-sizing disTab">
<p>Дополнительно</p>
</div>
<div class="col-lg-12 documentsChat">
{# <form action="" method="post">#}
{# <div class="upload">#}
{# <input type="file" name="upload"/>#}
{# <p>+ добавить файл (до 100 файлов)</p>#}
{# </div>#}
{# <input type="submit" value="Submit" />#}
{# </form>#}
<ul class="list-new-new">
<li>
Архитерурное 2.jpg
<span>7мб</span>
<div></div>
</li>
</ul>
</div>
<p class="type-work">Тип работы:</p>
<div class="mail-block type-work-inset">
<div class="inset-mb">
<label><input type="radio" value="1" name="{{ project_form.type_work.name }}"><span></span></label>
<p>Проектирование</p>
</div>
<div class="inset-mb">
<label><input type="radio" value="2" name="{{ project_form.type_work.name }}"><span></span></label>
<p>Техническое сопровождение</p>
</div>
</div>
<div class="textAreaBlock2 box-sizing disTab">
<a href="javascriptt:void(0)" class="new-link new-lw">+ Добавить раздел</a>
</div>
</div>
</div>
<div class="col-lg-12 new-filter">
<div class="filter clearfix">
<div class="titleF1 disTab">
<div class="col-lg-3">Специализация проекта:</div>
<div class="col-lg-3"></div>
<div class="col-lg-3"></div>
<div class="col-lg-3"></div>
</div>
<div class="polsF1 disTab">
<div class="col-lg-3">
<select id="specialization1" name="{{ project_form.specialization.name }}">
</select>
{# {{ project_form.specialization }}#}
</div>
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-3">
{# <select class="selectpicker">#}
{# <option>Mustard</option>#}
{# <option>Ketchup</option>#}
{# <option>Relish</option>#}
{# </select>#}
</div>
<div class="col-lg-3">
{# <select class="selectpicker">#}
{# <option>Mustard</option>#}
{# <option>Ketchup</option>#}
{# <option>Relish</option>#}
{# </select>#}
</div>
</div>
<div class="titleF1 titleF2 disTab">
<div class="col-lg-4">Бюджет</div>
<div class="col-lg-8"></div>
</div>
<div class="searchF1 polsF1 polsFF">
<div class="col-lg-4">
<input type="text" name="{{ project_form.price.name }}" class="box-sizing surr">
<select class="selectpicker2 valul">
<option>&#36;</option>
<option>&#36;</option>
<option>&#36;</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker">
<option>За проект</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-5 dog-new">
<label><input type="checkbox" name="dogovor"><span></span></label>
<p>или по договоренности</p>
</div>
</div>
<div class="searchF1 polsF1 polsFF make-new">
<label><input type="checkbox" name="dogovor"><span></span></label>
<p>Сделать для исполнителей обязательным для заполнения поля цена и срок</p>
</div>
<div class="titleF1 titleF2 disTab">
<div class="col-lg-12">Способ оплаты</div>
</div>
<div class="searchF1 polsF1 polsFF radio-afer">
<div class="col-lg-6">
<label><input type="radio" name="afer"><span></span></label>
<p class="text-afer">
Безопасная сделка (с резервированием бюджета)
</p>
<p class="des-afer">
Текст
</p>
</div>
<div class="col-lg-6">
<label><input type="radio" name="afer"><span></span></label>
<p class="text-afer">
Прямая оплата Исполнителю на его кошелек/счет
</p>
<p class="des-afer">
Текст
</p>
</div>
</div>
<div class="resSearchF1">
<div class="col-lg-3">
<p class="titleResF1">Расширенный поиск</p>
<button class="resButtonF1">
<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span>
</button>
</div>
<div class="col-lg-9">
<div class="borderS1"></div>
</div>
</div>
<div class="slideRes disTab activeSlide">
<div class="titleF1 disTab">
<div class="col-lg-3">Выбор объекта:</div>
<div class="col-lg-3">Наименование:</div>
<div class="col-lg-3">Классификация здания:</div>
<div class="col-lg-3">Вид строительства:</div>
</div>
<div class="polsF1 polsF2 disTab">
<div class="col-lg-3">
<select class="selectpicker" >
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-3">
<input type="text" class="box-sizing surr surr2" name="{{ realty_form.name.name }}">
</div>
<div class="col-lg-3">
<select class="selectpicker" name="{{ realty_form.building_classification.name }}">
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker" name="{{ realty_form.type_construction.name }}">
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
</div>
<div class="titleF1 disTab">
<div class="col-lg-12">Местоположение:</div>
</div>
<div class="polsF1 polsF2 disTab">
<div class="col-lg-3">
<select class="selectpicker" name="{{ realty_form.country.name }}">
<option>Страна</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker" {{ realty_form.city.name }}>
<option>Город</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
<div class="col-lg-6 make-new">
<label><input type="checkbox" name="dogovor"><span></span></label>
<p>Требуется допуск СРО</p>
</div>
</div>
<div class="searchF1 polsF1 polsFF links-filter">
<input style="border-radius: 40px;
font-family: 'pfdintextcomppro-regular', sans-serif;color: black;font-size: 16px;padding: 17px 33px 17px 33px;
float: left;margin: 0 15px 48px 15px;border: 1px solid #DFDFDF;text-transform: uppercase;
letter-spacing: 2px;color: #42B476;border: 1px solid #42B476" type="submit" value="Разместить проект" />
<a href="javascript:void(0)">Сохранить</a>
</div>
</div>
</div>
</div>
</form>
{% endblock %}
{% block js_block %}
<script type="text/javascript">
$(function () {
function updateSelectData(){
}
$.ajax({
url: '/api/specializations?parent=1',
type: 'GET',
dataType: 'json',
success: function (json) {
console.log(json.results);
var out = ''
$.each(json.results, function (i, v) {
$('#specialization1')
.append($("<option></option>")
.attr("value", v.name)
.text(v.name));
});
$("#specialization1").addClass("selectpicker");
$('.selectpicker').selectpicker({
style: 'btn-info',
size: 4,
width: '237px'
});
}
});
$("#specialization1").on("change",function(){
});
});
</script>
{% endblock %}

@ -0,0 +1,18 @@
<form method="post" action="">{% csrf_token %}
{{ form.as_p }}
<fieldset>
<legend>Photos</legend>
{{ portfolio_photo_form.management_form }}
{{ portfolio_photo_form.non_form_errors }}
{% for form in portfolio_photo_form %}
{{ form.id }}
<div class="inline {{ portfolio_photo_form.prefix }}">
{{ form.img.errors }}
{{ form.img.label_tag }}
{{ form.img }}
</div>
{% endfor %}
</fieldset>
<input type="submit" value="Add portfolio" class="submit" />
</form>

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

@ -26,6 +26,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 = (
@ -42,13 +84,22 @@ 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):
return self.is_superuser return self.is_superuser
@ -57,7 +108,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
@ -85,6 +135,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
@ -63,3 +63,11 @@ class CustomerProfileReviewsView(BaseMixin, DetailView):
model = User model = User
template_name = 'customer_profile_reviews.html' template_name = 'customer_profile_reviews.html'
context_object_name = 'customer' context_object_name = 'customer'
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