remotes/origin/setup
Mukhtar 10 years ago
commit a0fe73f49a
  1. 2
      archilance/management/commands/generate_portfolios.py
  2. 2
      archilance/management/commands/generate_projects.py
  3. 2
      archilance/management/commands/generate_reviews.py
  4. 4
      archilance/management/commands/generate_users.py
  5. 23
      archilance/util.py
  6. 9
      common/utils.py
  7. 26
      projects/migrations/0004_auto_20160726_1931.py
  8. 1
      projects/templates/customer_project_detail.html
  9. 1
      projects/templates/project_detail.html
  10. 129
      projects/templates/project_filter.html
  11. 6
      specializations/templatetags/specializtions_tags.py
  12. 7
      templates/home.html
  13. 12
      templates/partials/base.html
  14. 54
      templates/partials/pagination.html
  15. 4
      users/admin.py
  16. 29
      users/forms.py
  17. 29
      users/migrations/0003_auto_20160726_1931.py
  18. 1
      users/mixins.py
  19. 4
      users/models.py
  20. 470
      users/templates/contractor_filter.html
  21. 7
      users/templates/contractor_profile.html
  22. 26
      users/templates/contractor_profile_edit.html
  23. 207
      users/templates/customer_profile_edit.html
  24. 47
      users/templates/customer_profile_open_projects.html
  25. 2
      users/templates/customer_profile_reviews.html
  26. 17
      users/templates/customer_profile_trashed_projects.html
  27. 15
      users/templates/partials/customer_profile_info_block.html
  28. 1
      users/templatetags/user_tags.py
  29. 4
      users/urls.py
  30. 203
      users/views.py
  31. 103
      work_sell/templates/worksells_list.html

@ -38,7 +38,7 @@ class Command(BaseCommand):
def create_portfolio(i): def create_portfolio(i):
portf = Portfolio( portf = Portfolio(
name='Portforlio %s' % i, name='Portforlio %s' % i,
description="Portforlio %s's description" % i, description=util.lorem(_.random(5, 30)),
budget=util.random_amount(), budget=util.random_amount(),
currency=_.sample(CURRENCIES)[0], currency=_.sample(CURRENCIES)[0],
term=_.random(0, 20), term=_.random(0, 20),

@ -63,7 +63,7 @@ class Command(BaseCommand):
deal_type=_.sample(Project.DEAL_TYPES)[0], deal_type=_.sample(Project.DEAL_TYPES)[0],
term=_.random(0, 20), term=_.random(0, 20),
term_type=_.sample(TERMS)[0], term_type=_.sample(TERMS)[0],
text='Project %s text' % i, text=util.lorem(_.random(5, 30)),
work_type=_.sample(Project.WORK_TYPES)[0], work_type=_.sample(Project.WORK_TYPES)[0],
state='active', state='active',
) )

@ -23,7 +23,7 @@ class Command(BaseCommand):
review.project = Project.objects.order_by('?').first() review.project = Project.objects.order_by('?').first()
review.stars = _.random(1, 5) review.stars = _.random(1, 5)
review.text = 'This is a review %s text' % i review.text = util.lorem()
review.is_secured = _.sample((True, False)) review.is_secured = _.sample((True, False))
review.save() review.save()

@ -79,7 +79,9 @@ class Command(BaseCommand):
username = 'user-%s' % i username = 'user-%s' % i
return User.objects.create( return User.objects.create(
first_name='User-%s' % i, first_name='Василий',
last_name='Пупкин',
patronym='Иванович',
username=username, username=username,
email='%s@example.com' % username, email='%s@example.com' % username,
is_active=True, is_active=True,

@ -1,5 +1,7 @@
from django.shortcuts import _get_queryset
from django.utils import timezone from django.utils import timezone
from pprint import pprint, pformat from pprint import pprint, pformat
import natsort
import pydash as _; _.map = _.map_; _.filter = _.filter_ import pydash as _; _.map = _.map_; _.filter = _.filter_
import random import random
@ -41,14 +43,31 @@ def random_amount():
return random.random() * random.choice((100, 1000, 10000)) return random.random() * random.choice((100, 1000, 10000))
def get_or_none(klass, *args, **kwargs):
queryset = _get_queryset(klass)
try:
return queryset.get(*args, **kwargs)
except queryset.model.DoesNotExist:
return None
def get_attr_or_none(klass, *args, attr=None, **kwargs):
object = get_or_none(klass, *args, **kwargs)
if object and attr and isinstance(attr, str):
return getattr(object, attr, None)
def model_fields(model, width=200): def model_fields(model, width=200):
fields = natsort.natsorted(model._meta.get_fields(), key=lambda f: f.name)
pprint([( pprint([(
f.name, f.name,
'Relation? %s' % f.is_relation, 'Relation? %s' % f.is_relation,
'Null? %s' % f.null, 'Null? %s' % f.null,
'Blank? %s' % f.blank if not f.is_relation else '(relation)', 'Blank? %s' % f.blank if not f.is_relation else '(relation)',
'Hidden? %s' % (f.is_hidden() if hasattr(f, 'is_hidden') else False), ) for f in fields], width=width)
) for f in model._meta.get_fields(include_hidden=True)], width=width)
def lorem(sentences=5): def lorem(sentences=5):

@ -1,9 +0,0 @@
from django.shortcuts import _get_queryset
def get_or_none(klass, *args, **kwargs):
queryset = _get_queryset(klass)
try:
return queryset.get(*args, **kwargs)
except queryset.model.DoesNotExist:
return None

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-26 16:31
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
from django.utils.timezone import utc
class Migration(migrations.Migration):
dependencies = [
('projects', '0003_auto_20160725_1606'),
]
operations = [
migrations.AlterModelOptions(
name='stage',
options={'ordering': ['pos'], 'verbose_name': 'Этап', 'verbose_name_plural': 'Этапы'},
),
migrations.AlterField(
model_name='stage',
name='created',
field=models.DateTimeField(default=datetime.datetime(2016, 7, 26, 16, 31, 5, 738741, tzinfo=utc)),
),
]

@ -201,6 +201,7 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
<div class="col-lg-12 pagin"> <div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %} {% include 'partials/pagination.html' %}
</div> </div>

@ -242,6 +242,7 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
<div class="col-lg-12 pagin"> <div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %} {% include 'partials/pagination.html' %}
</div> </div>

@ -166,83 +166,76 @@
<input type="checkbox" name="{{ form.reverse_order.html_name }}" {% if reverse_order %}checked{% endif %} style="display: none"> <input type="checkbox" name="{{ form.reverse_order.html_name }}" {% if reverse_order %}checked{% endif %} style="display: none">
</div> </div>
</div> </div>
</form>
<div class="projectsBlock disTab">
{% for proj in projects %}
<div class="projectPro clearfix">
<div class="projectsBlock disTab"> <div class="col-lg-9 leftPro">
{% for proj in projects %} <p class="titlePro">
<div class="projectPro clearfix"> <a href="{% url 'projects:detail' pk=proj.pk %}">{{ proj }}</a>
<div class="col-lg-9 leftPro"> </p>
<p class="titlePro"> <ul class="desPro">
<a href="{% url 'projects:detail' pk=proj.pk %}">{{ proj }}</a> <li>
</p> Объект "{{ proj.realty.name }}"
<ul class="desPro"> </li>
<li> <li>
Объект "{{ proj.realty.name }}" <span>0</span> ответ от имени группы
</li> </li>
<li> </ul>
<span>0</span> ответ от имени группы <p class="textPro">{{ proj.text }}</p>
</li>
</ul> {% if TEMPLATE_DEBUG %}
<p class="textPro">{{ proj.text }}</p> <pre><!--
-->{{ proj|inspect }}<br><!--
{% if TEMPLATE_DEBUG %} --><br><!--
<pre><!-- --><b>Specialization:</b> {{ proj.specialization }}<br><!--
-->{{ proj|inspect }}<br><!-- --><br><!--
--><br><!-- --><b>Realty location:</b> {{ proj.realty.location }}<br><!--
--><b>Specialization:</b> {{ proj.specialization }}<br><!-- --><br><!--
--><br><!-- --><b>Constr. type:</b> {{ proj.realty.construction_type }}<br><!--
--><b>Realty location:</b> {{ proj.realty.location }}<br><!-- --><br><!--
--><br><!-- --><b>Build. classif.:</b> {{ proj.realty.building_classification }}<br><!--
--><b>Constr. type:</b> {{ proj.realty.construction_type }}<br><!-- --></pre>
--><br><!-- {% endif %}
--><b>Build. classif.:</b> {{ proj.realty.building_classification }}<br><!--
--></pre> <ul class="listPro">
{% endif %} <li>{{ proj.created }}</li>
<li>0</li>
<ul class="listPro"> <li>{{ proj.answers.count }}</li>
<li>{{ proj.created }}</li> <li>{{ proj.user }}</li>
<li>0</li> </ul>
<li>{{ proj.answers.count }}</li>
<li>{{ proj.user }}</li>
</ul>
</div>
<div class="col-lg-3 rightPro">
<p class="cenaPro">
{{ proj.budget }} <i class="fa fa-rub"></i>
</p>
<ul>
{% if proj.secure_deal %}
<li>Безопасная сделка</li>
{% endif %}
<li>
Стадия: "П"
</li>
<li>
Отказаться и переместить
в корзину
</li>
</ul>
</div>
</div> </div>
{% endfor %} <div class="col-lg-3 rightPro">
</div> <p class="cenaPro">
{{ proj.budget }} <i class="fa fa-rub"></i>
</p>
<ul>
{% if proj.secure_deal %}
<li>Безопасная сделка</li>
{% endif %}
<li>
Стадия: "П"
</li>
<div class="col-lg-12 pagin"> <li>
{% include 'partials/pagination.html' %} Отказаться и переместить
</div> в корзину
</li>
</ul>
</div>
</div>
{% endfor %}
</div>
</form> <div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}

@ -1,13 +1,15 @@
from django import template from django import template
from common.utils import get_or_none
from archilance import util
from users.models import User from users.models import User
register = template.Library() register = template.Library()
@register.inclusion_tag('templatetags/specializations_widget.html', takes_context=True) @register.inclusion_tag('templatetags/specializations_widget.html', takes_context=True)
def specialization_widget(context, user_id): def specialization_widget(context, user_id):
user_id = int(user_id) user_id = int(user_id)
user = get_or_none(User, pk=user_id) user = util.get_or_none(User, pk=user_id)
if user: if user:
specializations = user.contractor_specializations.all() specializations = user.contractor_specializations.all()
else: else:

@ -6,14 +6,7 @@
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
<div class="container-fluid"> <div class="container-fluid">
<div class="row"> <div class="row">
{# {% url "password_reset_recover" %}#}
<p class="welcomeMain">Основная задача сайта</p> <p class="welcomeMain">Основная задача сайта</p>
<p style="font-size: 25px; line-height: initial; font-weight: bold">
Authed? {{ request.user.is_authenticated }}<br>
{{ request.user }} ({{ request.user.pk }})<br>
{{ request.user.groups.all }}<br>
</p>
</div> </div>
</div> </div>

@ -31,10 +31,19 @@
<body> <body>
{% if messages %} {% if messages %}
{% for message in messages %} {% for message in messages %}
<div class="c" style='padding: 10px; margin-bottom: 6px'>{{ message | safe }}</div> <div class="c" style="position: relative; padding: 10px; margin-bottom: 6px; z-index: 100">{{ message|safe }}</div>
{% endfor %} {% endfor %}
{% endif %} {% endif %}
<div style="position: absolute; left: 0; top: 0; padding: 6px; color: black; background-color: #BADA55; z-index: 50">
{{ request.user }}<br>
{% if request.user.is_authenticated %}
<b>PK:</b> {{ request.user.pk }}<br>
<b>Groups:</b> {{ request.user.groups.all }}
{% endif %}
</div>
{% block content %}{% endblock %} {% block content %}{% endblock %}
<script src='{% static "lib/lodash/lodash.js" %}'></script> <script src='{% static "lib/lodash/lodash.js" %}'></script>
@ -50,6 +59,7 @@
<script src='{% static "lib/jquery.fileupload/js/jquery.iframe-transport.js" %}'></script> <script src='{% static "lib/jquery.fileupload/js/jquery.iframe-transport.js" %}'></script>
<script src='{% static "lib/jquery.fileupload/js/jquery.fileupload.js" %}'></script> <script src='{% static "lib/jquery.fileupload/js/jquery.fileupload.js" %}'></script>
<script src='{% static "lib/jquery.fileupload/js/jquery.fileupload-process.js" %}'></script> <script src='{% static "lib/jquery.fileupload/js/jquery.fileupload-process.js" %}'></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.js"></script>

@ -1,29 +1,51 @@
{% if is_paginated %} {% if is_paginated %}
<nav> <nav>
<ul class="pagination"> <ul class="pagination">
{% if page_obj.has_previous %} <li>
<li> <a
<button type="submit" name="page" value="{{ page_obj.previous_page_number }}">Previous</button> href="#"
</li> aria-label="Previous"
{% endif %}
{% if page_obj.has_previous %}
onclick="paginateTo({{ page_obj.previous_page_number }}); return false"
{% else %}
onclick="return false"
style="cursor: not-allowed"
{% endif %}>
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
</a>
</li>
{% for n in page_obj.paginator.page_range %} {% for n in page_obj.paginator.page_range %}
{% if n == page_obj.number %} {% if n == page_obj.number %}
<li class="i active"> <li class="active"><a href="#" onclick="return false">{{ n }}</a></li>
<button type="submit" name="page" value="{{ n }}" class="i" disabled>{{ n }}</button>
</li>
{% else %} {% else %}
<li> <li><a href="#" onclick="paginateTo({{ n }}); return false">{{ n }}</a></li>
<button type="submit" name="page" value="{{ n }}">{{ n }}</button>
</li>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% if page_obj.has_next %} <li>
<li> <a
<button type="submit" name="page" value="{{ page_obj.next_page_number }}">Next</button> href="#"
</li> aria-label="Next"
{% endif %}
{% if page_obj.has_next %}
onclick="paginateTo({{ page_obj.next_page_number }}); return false"
{% else %}
onclick="return false"
style="cursor: not-allowed"
{% endif %}>
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
</a>
</li>
</ul> </ul>
</nav> </nav>
<script>
function paginateTo(pageNum) {
var urlObj = new URI(location.href)
urlObj.setQuery('page', pageNum)
location.href = urlObj.href()
}
</script>
{% endif %} {% endif %}

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from .models import User, Team, ContractorFinancialInfo, ContractorResume, ContractorResumeFiles from .models import User, Team, UserFinancialInfo, ContractorResume, ContractorResumeFiles
class UserAdmin(admin.ModelAdmin): class UserAdmin(admin.ModelAdmin):
@ -11,7 +11,7 @@ class UserAdmin(admin.ModelAdmin):
return ', '.join(g.name for g in obj.groups.all()) return ', '.join(g.name for g in obj.groups.all())
admin.site.register(User, UserAdmin) admin.site.register(User, UserAdmin)
admin.site.register(ContractorFinancialInfo) admin.site.register(UserFinancialInfo)
admin.site.register(Team) admin.site.register(Team)
admin.site.register(ContractorResume) admin.site.register(ContractorResume)
admin.site.register(ContractorResumeFiles) admin.site.register(ContractorResumeFiles)

@ -1,10 +1,11 @@
from django import forms from django import forms
from django.forms import ModelForm from django.forms import ModelForm
import itertools import itertools
import pydash as _; _.map = _.map_; _.filter = _.filter_
from .models import User, ContractorFinancialInfo from .models import User, UserFinancialInfo
from common.models import Location from common.models import Location
from projects.models import Project, BuildingClassfication, ConstructionType from projects.models import Project, Realty, BuildingClassfication, ConstructionType
from specializations.models import Specialization from specializations.models import Specialization
@ -110,7 +111,27 @@ class ContractorFilterForm(forms.Form):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
class ContractorFinancicalInfoForm(ModelForm): class CustomerProfileProjectRealtyForm(forms.Form):
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
self.customer = kwargs.pop('customer')
super().__init__(*args, **kwargs)
realties = _.uniq(tuple(p.realty for p in self.customer.projects.all()))
self.fields['realty'] = forms.ChoiceField(
widget=forms.Select(attrs={
'class': 'selectpicker',
'onchange': "$(this).closest('form').submit()",
}),
choices=(('', 'Все объекты'),) + tuple((r.pk, r.name) for r in realties),
required=False,
)
class UserFinancicalInfoForm(ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['residency'].choices = self.fields['residency'].choices[1:] self.fields['residency'].choices = self.fields['residency'].choices[1:]
@ -120,7 +141,7 @@ class ContractorFinancicalInfoForm(ModelForm):
# self.fields['residency'].widget.choices = self.fields['residency'].choices # self.fields['residency'].widget.choices = self.fields['residency'].choices
class Meta: class Meta:
model = ContractorFinancialInfo model = UserFinancialInfo
fields = ( fields = (
'fio', 'fio',

@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-26 16:31
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0002_auto_20160725_1605'),
]
operations = [
migrations.RenameModel(
old_name='ContractorFinancialInfo',
new_name='UserFinancialInfo',
),
migrations.RemoveField(
model_name='user',
name='contractor_financial_info',
),
migrations.AddField(
model_name='user',
name='financial_info',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user', to='users.UserFinancialInfo'),
),
]

@ -3,7 +3,6 @@ from django.contrib import messages
class CheckForUserMixin(object): class CheckForUserMixin(object):
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated(): if request.user.is_authenticated():
pk = kwargs.get('pk') pk = kwargs.get('pk')

@ -41,7 +41,7 @@ class CustomerUserManager(models.Manager):
return super().get_queryset().filter(groups__name='Заказчики') return super().get_queryset().filter(groups__name='Заказчики')
class ContractorFinancialInfo(models.Model): class UserFinancialInfo(models.Model):
RESIDENCIES = ( RESIDENCIES = (
('russian_resident', 'Резидент РФ'), ('russian_resident', 'Резидент РФ'),
('non_russian_resident', 'Нерезидент РФ'), ('non_russian_resident', 'Нерезидент РФ'),
@ -117,7 +117,6 @@ class User(AbstractBaseUser, PermissionsMixin):
) )
avatar = models.ImageField(upload_to='users/avatars/', blank=True) avatar = models.ImageField(upload_to='users/avatars/', blank=True)
contractor_financial_info = models.OneToOneField(ContractorFinancialInfo, related_name='contractor', blank=True, null=True)
contractor_resume = models.OneToOneField(ContractorResume, related_name='contractor', blank=True, null=True) contractor_resume = models.OneToOneField(ContractorResume, related_name='contractor', blank=True, null=True)
contractor_specializations = TreeManyToManyField(Specialization, related_name='contractors', blank=True) contractor_specializations = TreeManyToManyField(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)
@ -126,6 +125,7 @@ class User(AbstractBaseUser, PermissionsMixin):
date_joined = models.DateTimeField(default=timezone.now) date_joined = models.DateTimeField(default=timezone.now)
date_of_birth = models.DateTimeField(null=True, blank=True) date_of_birth = models.DateTimeField(null=True, blank=True)
email = models.EmailField(max_length=255, unique=True, db_index=True) email = models.EmailField(max_length=255, unique=True, db_index=True)
financial_info = models.OneToOneField(UserFinancialInfo, related_name='user', blank=True, null=True)
first_name = models.CharField(max_length=255, blank=True) first_name = models.CharField(max_length=255, blank=True)
gender = models.CharField(max_length=30, choices=GENDERS, blank=True) gender = models.CharField(max_length=30, choices=GENDERS, blank=True)
is_active = models.BooleanField(default=True) is_active = models.BooleanField(default=True)

@ -163,281 +163,281 @@
<input type="checkbox" name="{{ form.reverse_order.html_name }}" {% if reverse_order %}checked{% endif %} style="display: none"> <input type="checkbox" name="{{ form.reverse_order.html_name }}" {% if reverse_order %}checked{% endif %} style="display: none">
</div> </div>
</div> </div>
</form>
{% for obj in coll %} {% for obj in coll %}
{% if obj|class_name == 'Team' %} {% if obj|class_name == 'Team' %}
{% with team=obj %} {% with team=obj %}
<div class="executorBlock clearfix"> <div class="executorBlock clearfix">
<div class="col-lg-4"> <div class="col-lg-4">
<a href="#" class="aLinkExe"><div class="imgExecutor"> <a href="#" class="aLinkExe"><div class="imgExecutor">
<img src="img/profile.jpg" alt="execitor-image"> <img src="img/profile.jpg" alt="execitor-image">
</div></a> </div></a>
<p class="nameExecutor"> <p class="nameExecutor">
<a href="#">{{ team.name }}</a> <a href="#">{{ team.name }}</a>
</p> </p>
<p class="navv2">На сайте 8 лет и 3 месяца</p> <p class="navv2">На сайте 8 лет и 3 месяца</p>
<div class="statusUser">Свободен</div> <div class="statusUser">Свободен</div>
</div> </div>
<div class="col-lg-2"> <div class="col-lg-2">
<ul class="listExecutor"> <ul class="listExecutor">
<li> <li>
<a href="javascript:void(0)"> <a href="javascript:void(0)">
смотреть профиль смотреть профиль
</a> </a>
</li> </li>
<li> <li>
<a href="javascript:void(0)"> <a href="javascript:void(0)">
предложить проект предложить проект
</a> </a>
</li> </li>
<li> <li>
<a href="javascript:void(0)"> <a href="javascript:void(0)">
написать сообщение написать сообщение
</a> </a>
</li> </li>
</ul> </ul>
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
<div class="dashedCol4 dashedCol44"> <div class="dashedCol4 dashedCol44">
<p class="specUser"> <p class="specUser">
Специализации: Специализации:
</p> </p>
<div class="insetSpec"> <div class="insetSpec">
<span>Интерьеры</span> <span>Интерьеры</span>
<span>2-й</span> <span>2-й</span>
</div> </div>
<div class="insetSpec">
<span>Визуализация/3D</span>
<span>45-й</span>
</div>
<div class="insetSpec">
<span>Экстерьеры</span>
<span>10-й</span>
</div>
<div class="showSpec">
<div class="insetSpec"> <div class="insetSpec">
<span>Визуализация/3D</span> <span>Архитектура</span>
<span>45-й</span> <span>3</span>
</div> </div>
<div class="insetSpec"> <div class="insetSpec">
<span>Экстерьеры</span> <span>3D Моделирование</span>
<span>10-й</span> <span>100-й</span>
</div>
<div class="showSpec">
<div class="insetSpec">
<span>Архитектура</span>
<span>3-й</span>
</div>
<div class="insetSpec">
<span>3D Моделирование</span>
<span>100-й</span>
</div>
</div> </div>
<button class="showPress">
</button>
</div> </div>
<button class="showPress">
</button>
</div> </div>
</div>
<div class="col-lg-3 retts"> <div class="col-lg-3 retts">
<ul class="rettList restList2"> <ul class="rettList restList2">
<li>Рейтинг: <span> 1245</span></li> <li>Рейтинг: <span> 1245</span></li>
<li>Безопасные сделки: <span> 5</span></li> <li>Безопасные сделки: <span> 5</span></li>
<li> <li>
<a href="javascript:void(0)">Отзывы: <a href="javascript:void(0)">Отзывы:
<span> + 385</span> <span> + 385</span>
<small> 0</small> <small> 0</small>
<mark> - 0</mark> <mark> - 0</mark>
</a> </a>
</li> </li>
</ul> </ul>
<div class="sroUser sroExecutor"> <div class="sroUser sroExecutor">
<div class="iconSRO"></div> <div class="iconSRO"></div>
<p>Есть допуск СРО</p> <p>Есть допуск СРО</p>
</div>
</div> </div>
</div>
{% if TEMPLATE_DEBUG %}
<div class="col-lg-12" style="margin-bottom: 20px">
<pre><!--
--><b>######## Team owner #########</b><br><!--
--><br><!--
--><b>Specializations:</b> {{ team.owner.contractor_specializations.all }}<br><!--
--><br><!--
--><b>Location:</b> {{ team.owner.location }}<br><!--
--><br><!--
--><b>Build. classif-s:</b> {% for o in team.owner.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}<br><!--
--><br><!--
--><b>Constr. types:</b> {% for o in team.owner.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}<br><!--
--><br><!--
--><b>CRO:</b> {{ team.owner.cro }}<br><!--
--><br><!--
--><b>Work types:</b> {% for o in team.owner.orders.all %}{{ o.project.work_type }}, {% endfor %}<br><!--
--><br><!--
--><br><!--
--><br><!--
--><b>######## Team users #########</b><br><!--
--><br><!--
--><b>Specializations:</b> {% for u in team.users.all %}{{ u.contractor_specializations.all }}, {% endfor %}<br><!--
--><br><!--
--><b>Location:</b> {% for u in team.users.all %}{{ u.location }}, {% endfor %}<br><!--
--><br><!--
--><b>Build. classif-s:</b> {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}; {% endfor %}<br><!--
--><br><!--
--><b>Constr. types:</b> {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}; {% endfor %}<br><!--
--><br><!--
--><b>CRO:</b> {% for u in team.users.all %}{{ u.cro }}, {% endfor %}<br><!--
--><br><!--
--><b>Work types:</b> {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.work_type }}, {% endfor %}; {% endfor %}<br><!--
--></pre>
</div>
{% endif %}
{# {% if TEMPLATE_DEBUG %}#}
{# <div class="col-lg-12" style="margin-bottom: 20px">#} <div class="gallMini disTab">
{# <pre><!--#} {% for portf in team.portfolios.all|slice:':4' %}
{# --><b>######## Team owner #########</b><br><!--#} <div class="col-lg-3">
{# --><br><!--#} <a href="#" class="linkInsetCol">
{# --><b>Specializations:</b> {{ team.owner.contractor_specializations.all }}<br><!--#} <div class="insetCol box-sizing disTab">
{# --><br><!--#} <div class="imgGal" style="background-image: url('{{ portf.photos.first.img.url }}')">
{# --><b>Location:</b> {{ team.owner.location }}<br><!--#} <div class="imgFigure"></div>
{# --><br><!--#}
{# --><b>Build. classif-s:</b> {% for o in team.owner.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><b>Constr. types:</b> {% for o in team.owner.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><b>CRO:</b> {{ team.owner.cro }}<br><!--#}
{# --><br><!--#}
{# --><b>Work types:</b> {% for o in team.owner.orders.all %}{{ o.project.work_type }}, {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><br><!--#}
{# --><br><!--#}
{# --><b>######## Team users #########</b><br><!--#}
{# --><br><!--#}
{# --><b>Specializations:</b> {% for u in team.users.all %}{{ u.contractor_specializations.all }}, {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><b>Location:</b> {% for u in team.users.all %}{{ u.location }}, {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><b>Build. classif-s:</b> {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}; {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><b>Constr. types:</b> {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}; {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><b>CRO:</b> {% for u in team.users.all %}{{ u.cro }}, {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><b>Work types:</b> {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.work_type }}, {% endfor %}; {% endfor %}<br><!--#}
{# --></pre>#}
{# </div>#}
{# {% endif %}#}
<div class="gallMini disTab">
{% for portf in team.portfolios.all|slice:':4' %}
<div class="col-lg-3">
<a href="#" class="linkInsetCol">
<div class="insetCol box-sizing disTab">
<div class="imgGal" style="background-image: url('{{ portf.photos.first.img.url }}')">
<div class="imgFigure"></div>
</div>
</div> </div>
</a> </div>
</div> </a>
{% endfor %} </div>
</div> {% endfor %}
</div>
</div>
{% endwith %}
{% elif obj|class_name == 'User' %}
{% with contractor=obj %}
<div class="executorBlock clearfix">
<div class="col-lg-4">
<a href="#" class="aLinkExe"><div class="imgExecutor">
<img src="img/profile.jpg" alt="execitor-image">
</div></a>
<p class="nameExecutor">
<a href="#">{{ contractor.get_full_name }} [{{ contractor.username }}]</a>
</p>
<p class="navv2">На сайте 8 лет и 3 месяца</p>
<div class="statusUser">Свободен</div>
</div> </div>
{% endwith %}
{% elif obj|class_name == 'User' %}
{% with contractor=obj %}
<div class="executorBlock clearfix">
<div class="col-lg-4">
<a href="#" class="aLinkExe"><div class="imgExecutor">
<img src="img/profile.jpg" alt="execitor-image">
</div></a>
<p class="nameExecutor">
<a href="#">{{ contractor.get_full_name }} [{{ contractor.username }}]</a>
</p>
<p class="navv2">На сайте 8 лет и 3 месяца</p>
<div class="statusUser">Свободен</div>
</div>
<div class="col-lg-2"> <div class="col-lg-2">
<ul class="listExecutor"> <ul class="listExecutor">
<li> <li>
<a href="{% url 'users:contractor-profile' pk=obj.pk %}"> <a href="{% url 'users:contractor-profile' pk=obj.pk %}">
смотреть профиль смотреть профиль
</a> </a>
</li> </li>
<li> <li>
<a href="javascript:void(0)"> <a href="javascript:void(0)">
предложить проект предложить проект
</a> </a>
</li> </li>
<li> <li>
<a href="javascript:void(0)"> <a href="javascript:void(0)">
написать сообщение написать сообщение
</a> </a>
</li> </li>
</ul> </ul>
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
<div class="dashedCol4 dashedCol44"> <div class="dashedCol4 dashedCol44">
<p class="specUser"> <p class="specUser">
Специализации: Специализации:
</p> </p>
<div class="insetSpec"> <div class="insetSpec">
<span>Интерьеры</span> <span>Интерьеры</span>
<span>2-й</span> <span>2-й</span>
</div> </div>
<div class="insetSpec">
<span>Визуализация/3D</span>
<span>45-й</span>
</div>
<div class="insetSpec">
<span>Экстерьеры</span>
<span>10-й</span>
</div>
<div class="showSpec">
<div class="insetSpec"> <div class="insetSpec">
<span>Визуализация/3D</span> <span>Архитектура</span>
<span>45-й</span> <span>3</span>
</div> </div>
<div class="insetSpec"> <div class="insetSpec">
<span>Экстерьеры</span> <span>3D Моделирование</span>
<span>10-й</span> <span>100-й</span>
</div>
<div class="showSpec">
<div class="insetSpec">
<span>Архитектура</span>
<span>3-й</span>
</div>
<div class="insetSpec">
<span>3D Моделирование</span>
<span>100-й</span>
</div>
</div> </div>
<button class="showPress">
</button>
</div> </div>
<button class="showPress">
</button>
</div> </div>
</div>
<div class="col-lg-3 retts"> <div class="col-lg-3 retts">
<ul class="rettList restList2"> <ul class="rettList restList2">
<li>Рейтинг: <span> 1245</span></li> <li>Рейтинг: <span> 1245</span></li>
<li>Безопасные сделки: <span> 5</span></li> <li>Безопасные сделки: <span> 5</span></li>
<li> <li>
<a href="javascript:void(0)">Отзывы: <a href="javascript:void(0)">Отзывы:
<span> + 385</span> <span> + 385</span>
<small> 0</small> <small> 0</small>
<mark> - 0</mark> <mark> - 0</mark>
</a> </a>
</li> </li>
</ul> </ul>
<div class="sroUser sroExecutor"> <div class="sroUser sroExecutor">
<div class="iconSRO"></div> <div class="iconSRO"></div>
<p>Есть допуск СРО</p> <p>Есть допуск СРО</p>
</div>
</div> </div>
</div>
{# {% if TEMPLATE_DEBUG %}#} {% if TEMPLATE_DEBUG %}
{# <div class="col-lg-12">#} <div class="col-lg-12">
{# <pre><!--#} <pre><!--
{# --><b>Specializations:</b> {{ contractor.contractor_specializations.all }}<br><!--#} --><b>Specializations:</b> {{ contractor.contractor_specializations.all }}<br><!--
{# --><br><!--#} --><br><!--
{# --><b>Location:</b> {{ contractor.location }}<br><!--#} --><b>Location:</b> {{ contractor.location }}<br><!--
{# --><br><!--#} --><br><!--
{# --><b>Build. classif-s:</b> {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}<br><!--#} --><b>Build. classif-s:</b> {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}<br><!--
{# --><br><!--#} --><br><!--
{# --><b>Constr. types:</b> {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}<br><!--#} --><b>Constr. types:</b> {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}<br><!--
{# --><br><!--#} --><br><!--
{# --><b>CRO:</b> {{ contractor.cro }}<br><!--#} --><b>CRO:</b> {{ contractor.cro }}<br><!--
{# --><br><!--#} --><br><!--
{# --><b>Work types:</b> {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}<br><!--#} --><b>Work types:</b> {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}<br><!--
{# --></pre>#} --></pre>
{# </div>#}
{# {% endif %}#}
<div class="gallMini disTab">
{% for portf in contractor.portfolios.all|slice:':4' %}
<div class="col-lg-3">
<a href="#" class="linkInsetCol">
<div class="insetCol box-sizing disTab">
<div class="imgGal" style="background-image: url('{{ portf.photos.first.img.url }}')">
<div class="imgFigure"></div>
</div>
</div>
</a>
</div>
{% endfor %}
</div> </div>
{% endif %}
<div class="gallMini disTab">
{% for portf in contractor.portfolios.all|slice:':4' %}
<div class="col-lg-3">
<a href="#" class="linkInsetCol">
<div class="insetCol box-sizing disTab">
<div class="imgGal" style="background-image: url('{{ portf.photos.first.img.url }}')">
<div class="imgFigure"></div>
</div>
</div>
</a>
</div>
{% endfor %}
</div> </div>
{% endwith %} </div>
{% endif %} {% endwith %}
{% endfor %} {% endif %}
{% endfor %}
<div class="col-lg-12 pagin"> <div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %} {% include 'partials/pagination.html' %}
</div> </div>
</form>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}

@ -1,6 +1,7 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %} {% load projects_tags %}
{% load specializtions_tags %}
{% load thumbnail %} {% load thumbnail %}
@ -70,7 +71,7 @@
<div class="col-lg-9 divCol9"> <div class="col-lg-9 divCol9">
<div class="col-lg-4"> <div class="col-lg-4">
<p class="nameUser"> <p class="nameUser">
{{ contractor.get_full_name }}[{{ contractor.username }}] {{ contractor.get_full_name }} [{{ contractor.username }}]
</p> </p>
<p class="cityUser">Россия, Москва</p> <p class="cityUser">Россия, Москва</p>
<p class="navv">На сайте 8 лет и 3 месяца</p> <p class="navv">На сайте 8 лет и 3 месяца</p>
@ -80,11 +81,9 @@
<a href="javascript:void(0)" class="showCon">показать контакты</a> <a href="javascript:void(0)" class="showCon">показать контакты</a>
</div> </div>
<div class="col-lg-4"> <div class="col-lg-4">
{% load specializtions_tags %}
{% specialization_widget contractor.pk %} {% specialization_widget contractor.pk %}
</div> </div>
<div class="col-lg-4"> <div class="col-lg-4">
{% load projects_tags %}
{% ratings_widget contractor.pk %} {% ratings_widget contractor.pk %}
{% if contractor.cro %} {% if contractor.cro %}

@ -15,19 +15,19 @@
{% load mptt_tags %} {% load mptt_tags %}
{{ form.errors }} {{ form.errors }}
<div class="col-lg-3 divCol3"> <div class="col-lg-3 divCol3">
<div class="avatar"> <div class="avatar">
<div class="avatarInset"> <div class="avatarInset">
<img src="/media/{{ form.avatar.value }}" alt="profile-image"> <img src="/media/{{ form.avatar.value }}" alt="profile-image">
</div> </div>
</div> </div>
<div class="menuUser upload-img disTab"> <div class="menuUser upload-img disTab">
<div class="upload2 up-l1"> <div class="upload2 up-l1">
<input type="file" name="{{ form.avatar.name }}"> <input type="file" name="{{ form.avatar.name }}">
<p>Загрузить фотографию</p> <p>Загрузить фотографию</p>
</div> </div>
</div> </div>
</div> </div>
<div class="col-lg-9 divCol9"> <div class="col-lg-9 divCol9">
<div class="col-lg-4"> <div class="col-lg-4">
<p class="name-edit-p">ФИО:</p> <p class="name-edit-p">ФИО:</p>

@ -1,113 +1,126 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %}
{% load thumbnail %} {% load thumbnail %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
<div class="container mainScore"> <div class="container mainScore">
<div class="row"> <div class="row">
<form method="post" enctype="multipart/form-data">{% csrf_token %} <form method="post" enctype="multipart/form-data">
<div class="projectsBlock disTab"> {% csrf_token %}
<div class="col-lg-12">
{{ form.errors }} <div class="projectsBlock disTab">
<div class="col-lg-3 divCol3"> <div class="col-lg-12">
<div class="avatar"> {{ form.errors }}
<div class="avatarInset">
<img src="/media/{{ form.avatar.value }}" alt="profile-image"> <div class="col-lg-3 divCol3">
</div> <div class="avatar">
</div> <div class="avatarInset">
<div class="menuUser upload-img disTab"> <img src="/media/{{ form.avatar.value }}" alt="profile-image">
<div class="upload2 up-l1"> </div>
<input type="file" name="{{ form.avatar.name }}"> </div>
<p>Загрузить фотографию</p> <div class="menuUser upload-img disTab">
</div> <div class="upload2 up-l1">
</div> <input type="file" name="{{ form.avatar.name }}">
</div> <p>Загрузить фотографию</p>
<div class="col-lg-9 divCol9"> </div>
<div class="col-lg-4"> </div>
<p class="name-edit-p">ФИО:</p> </div>
<input type="text" value="{{ form.first_name.value }}" name="{{ form.first_name.name }}" class="box-sizing inp-edit"> <div class="col-lg-9 divCol9">
<input type="text" value="{{ form.last_name.value }}" name="{{ form.last_name.name }}" class="box-sizing inp-edit"> <div class="col-lg-4">
<input type="text" value="{{ form.patronym.value }}" name="{{ form.patronym.name }}" class="box-sizing inp-edit"> <p class="name-edit-p">ФИО:</p>
</div> <input type="text" value="{{ form.first_name.value }}" name="{{ form.first_name.name }}" class="box-sizing inp-edit">
<div class="col-lg-4"> <input type="text" value="{{ form.last_name.value }}" name="{{ form.last_name.name }}" class="box-sizing inp-edit">
<p class="name-edit-p">Местоположение: {{ form.location.value }}</p> <input type="text" value="{{ form.patronym.value }}" name="{{ form.patronym.name }}" class="box-sizing inp-edit">
<div class="polsF1 pols-edit disTab"> </div>
<select id="location-country"> <div class="col-lg-4">
</select> <p class="name-edit-p">Местоположение: {{ form.location.value }}</p>
<div class="polsF1 pols-edit disTab">
<select id="location-region"> <select id="location-country">
</select> </select>
<select id="location-city" name="{{ form.location.name }}"> <select id="location-region">
</select> </select>
</div>
</div> <select id="location-city" name="{{ form.location.name }}">
</div> </select>
</div> </div>
</div> </div>
<div class="buttonGP btn-edit disTab"> </div>
<div class="btn-group valProject valProject2" role="group" aria-label="..."> </div>
<button type="button" class="btn btn-default">Общая информация</button> </div>
</div>
</div> <div class="buttonGP btn-edit disTab">
<div class="col-lg-12 col12 new-filter"> <div class="btn-group valProject valProject2" role="group" aria-label="...">
<div class="filter clearfix"> <button type="button" class="btn btn-default">Общая информация</button>
<div class="titleF1 disTab"> </div>
<div class="col-lg-7">Дата рождения:</div> </div>
<div class="col-lg-5">Пол:</div>
</div> <div class="col-lg-12 col12 new-filter">
<div class="polsF1 disTab"> <div class="filter clearfix">
<div class="col-lg-7"> <div class="titleF1 disTab">
{{ form.date_of_birth }} <div class="col-lg-7">Дата рождения:</div>
</div> <div class="col-lg-5">Пол:</div>
<div class="col-lg-5 dog-new ed-new"> </div>
<label><input type="radio" name="{{ form.gender }}"><span></span></label>
<p>Мужской</p> <div class="polsF1 disTab">
<label class="woman"><input type="radio" name="{{ form.gender }}"><span></span></label> <div class="col-lg-7">
<p>Женский</p> {{ form.date_of_birth }}
</div> </div>
</div> <div class="col-lg-5 dog-new ed-new">
<div class="titleF1 titleF2 disTab"> <label><input type="radio" name="{{ form.gender }}"><span></span></label>
<div class="col-lg-3">Сайт:</div> <p>Мужской</p>
<div class="col-lg-3">Skype:</div> <label class="woman"><input type="radio" name="{{ form.gender }}"><span></span></label>
{# <div class="col-lg-3">Электронная почта:</div>#} <p>Женский</p>
<div class="col-lg-3">Телефон:</div> </div>
</div> </div>
<div class="searchF1 polsF1 polsFF polsF3">
<div class="col-lg-3"> <div class="titleF1 titleF2 disTab">
<input type="text" name="{{ form.website.name }}"class="box-sizing surr surr2" placeholder="beeg.com"> <div class="col-lg-3">Сайт:</div>
</div> <div class="col-lg-3">Skype:</div>
<div class="col-lg-3"> {# <div class="col-lg-3">Электронная почта:</div>#}
<input type="text" name="{{ form.skype.name }}" class="box-sizing surr surr2" placeholder="nokia770"> <div class="col-lg-3">Телефон:</div>
</div> </div>
{# <div class="col-lg-3">#}
{# <input type="text" name="{{ form.phone.name }}" class="box-sizing surr surr2" placeholder="example@gmail.com">#} <div class="searchF1 polsF1 polsFF polsF3">
{# </div>#} <div class="col-lg-3">
<div class="col-lg-3"> <input type="text" name="{{ form.website.name }}"class="box-sizing surr surr2" placeholder="beeg.com">
<input type="text" name="{{ form.phone.name }}" class="box-sizing surr surr2" placeholder="+7 999 999 44 02"> </div>
</div> <div class="col-lg-3">
</div> <input type="text" name="{{ form.skype.name }}" class="box-sizing surr surr2" placeholder="nokia770">
<div class="col-lg-12"> </div>
<div class="col-lg-12 make-new make-eed"> {# <div class="col-lg-3">#}
<label>{{ form.cro }}<span></span></label> {# <input type="text" name="{{ form.phone.name }}" class="box-sizing surr surr2" placeholder="example@gmail.com">#}
<p>Есть допуск СРО</p> {# </div>#}
</div> <div class="col-lg-3">
</div> <input type="text" name="{{ form.phone.name }}" class="box-sizing surr surr2" placeholder="+7 999 999 44 02">
<div class="searchF1 polsF1 polsFF links-filter"> </div>
<input class="btn-submit-link" type="submit" value="Сохранить" /> </div>
</div>
</div> <div class="col-lg-12">
</div> <div class="col-lg-12 make-new make-eed">
<label>{{ form.cro }}<span></span></label>
<p>Есть допуск СРО</p>
</div>
</div>
<div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Сохранить" />
</div>
</div>
</div>
</form> </form>
{% include 'partials/footer.html' %}
{% include 'partials/footer.html' %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block js_block %} {% block js_block %}
<script type="text/javascript"> <script>
$(function(){ $(function(){
function getCookie(name) { function getCookie(name) {

@ -1,6 +1,5 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
@ -9,36 +8,35 @@
<div class="row"> <div class="row">
{% include 'partials/customer_profile_info_block.html' %} {% include 'partials/customer_profile_info_block.html' %}
<div class="buttonGP disTab"> <div class="buttonGP disTab">
<div class="btn-group valProject2"> <div class="btn-group valProject2">
<a href="{% url 'users:customer-profile-open-projects' pk=pk %}" class="btn btn-default" disabled> <a href="{% url 'users:customer-profile-open-projects' pk=pk %}" class="btn btn-default" disabled>
Открытые проекты Открытые проекты
<span><mark>2</mark> / <span>35</span></span> <span><!--<mark>2</mark> / <span>-->{{ open_project_count }}</span></span>
</a> </a>
<a href="{% url 'users:customer-profile-trashed-projects' pk=pk %}" class="btn btn-default"> <a href="{% url 'users:customer-profile-trashed-projects' pk=pk %}" class="btn btn-default">
Корзина Корзина
<span><mark></mark><span>7</span></span> <span><mark></mark><span>{{ trashed_project_count }}</span></span>
</a> </a>
</div> </div>
<div class="polsF1 disTab polsSearch"> <div class="polsF1 disTab polsSearch">
<div class="col-lg-3"> <div class="col-lg-3">
<select class="selectpicker"> <form action="{% url 'users:customer-profile-open-projects' pk=pk %}" method="GET" novalidate>
<option>Mustard</option> {{ form.realty }}
<option>Ketchup</option> </form>
<option>Relish</option> </div>
</select> </div>
</div>
</div> <div class="col-lg-3 col-lg-offset-1">
<p class="addWork add-work-new">
<div class="col-lg-3 col-lg-offset-1"> <a href="{% url 'projects:customer-project-create' %}">Разместить заказ</a>
<p class="addWork add-work-new">
<a href="{% url 'projects:customer-project-create' %}">Разместить заказ</a>
</p> </p>
</div> </div>
</div> </div>
<div class="projectsBlock new-pro-block disTab">
<div class="projectsBlock new-pro-block disTab">
{% for proj in projects %} {% for proj in projects %}
<div class="projectPro clearfix"> <div class="projectPro clearfix">
<div class="col-lg-9 leftPro"> <div class="col-lg-9 leftPro">
@ -80,11 +78,10 @@
</li> </li>
<li> <li>
<form action="{% url 'projects:customer-project-trash' pk=proj.pk %}" method="POST"> <form action="{% url 'projects:customer-project-trash' pk=proj.pk %}" method="POST" novalidate>
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}"> <input type="hidden" name="next" value="{{ request.path }}">
<a href="#" onclick="$(this).closest('form').submit(); return false">Переместить в корзину</a>
<a href='#' onclick="$(this).closest('form').submit(); return false">Переместить в корзину</a>
</form> </form>
</li> </li>
</ul> </ul>
@ -93,6 +90,10 @@
{% endfor %} {% endfor %}
</div> </div>
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
</div> </div>
</div> </div>

@ -35,7 +35,7 @@
{% endif %} {% endif %}
</div> </div>
<p class="textComm44"><b>{{ review.text }}</b>{% if TEMPLATE_DEBUG %}. {% lorem %}{% endif %}</p> <p class="textComm44">{{ review.text }}</p>
</div> </div>
</div> </div>
{% endfor %} {% endfor %}

@ -11,21 +11,19 @@
<div class="btn-group valProject2"> <div class="btn-group valProject2">
<a href="{% url 'users:customer-profile-open-projects' pk=pk %}" class="btn btn-default"> <a href="{% url 'users:customer-profile-open-projects' pk=pk %}" class="btn btn-default">
Открытые проекты Открытые проекты
<span><mark>2</mark> / <span>35</span></span> <span><!--<mark>2</mark> / <span>-->{{ open_project_count }}</span></span>
</a> </a>
<a href="{% url 'users:customer-profile-trashed-projects' pk=pk %}" class="btn btn-default" disabled> <a href="{% url 'users:customer-profile-trashed-projects' pk=pk %}" class="btn btn-default" disabled>
Корзина Корзина
<span><mark></mark><span>7</span></span> <span><mark></mark><span>{{ trashed_project_count }}</span></span>
</a> </a>
</div> </div>
<div class="polsF1 disTab polsSearch"> <div class="polsF1 disTab polsSearch">
<div class="col-lg-3"> <div class="col-lg-3">
<select class="selectpicker"> <form action="{% url 'users:customer-profile-trashed-projects' pk=pk %}" method="GET" novalidate>
<option>Mustard</option> {{ form.realty }}
<option>Ketchup</option> </form>
<option>Relish</option>
</select>
</div> </div>
</div> </div>
<div class="col-lg-3 col-lg-offset-1"> <div class="col-lg-3 col-lg-offset-1">
@ -34,6 +32,7 @@
</p> </p>
</div> </div>
</div> </div>
<div class="projectsBlock new-pro-block disTab"> <div class="projectsBlock new-pro-block disTab">
{% for proj in projects %} {% for proj in projects %}
<div class="projectPro clearfix"> <div class="projectPro clearfix">
@ -95,6 +94,10 @@
{% endfor %} {% endfor %}
</div> </div>
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
</div> </div>
</div> </div>

@ -1,4 +1,6 @@
{% load staticfiles %} {% load projects_tags %}
<div class="col-lg-12"> <div class="col-lg-12">
<div class="col-lg-3 divCol3"> <div class="col-lg-3 divCol3">
<div class="avatar new-mar"> <div class="avatar new-mar">
@ -11,22 +13,21 @@
<div class="col-lg-9 divCol9"> <div class="col-lg-9 divCol9">
<div class="col-lg-4"> <div class="col-lg-4">
<p class="nameUser"> <p class="nameUser">
{{ object.get_full_name }} [ivanov_petr] {{ customer.get_full_name }} [{{ customer.username }}]
</p> </p>
<p class="cityUser">{{ object.location.name }}</p> <p class="cityUser">{{ customer.location.name }}</p>
<p class="navv">На сайте {{ object.created }}</p> <p class="navv">На сайте {{ customer.created }}</p>
</div> </div>
<div class="col-lg-4 new-er"> <div class="col-lg-4 new-er">
{% load projects_tags %} {% ratings_widget pk %}
{% ratings_widget customer.pk %}
</div> </div>
<div class="col-lg-4"> <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-prop1">показать контакты</a>
<a href="javascript:void(0)" class="new-prop new-prop2">написать сообщение</a> <a href="javascript:void(0)" class="new-prop new-prop2">написать сообщение</a>
<a href="{% url 'users:customers-edit' pk=customer.pk %}" class="new-red">редактировать профиль</a> <a href="{% url 'users:customers-edit' pk=pk %}" class="new-red">редактировать профиль</a>
</div> </div>
</div> </div>

@ -7,6 +7,7 @@ def has_group(user, group_name):
groups = user.groups.all().values_list('name', flat=True) groups = user.groups.all().values_list('name', flat=True)
return True if group_name in groups else False return True if group_name in groups else False
@register.simple_tag @register.simple_tag
def test(): def test():
return 'Hello there' return 'Hello there'

@ -7,7 +7,7 @@ from .views import (
# UserInfoListView, # UserInfoListView,
# UserView, # UserView,
ContractorFilterView, ContractorFilterView,
ContractorFinancialInfoEdit, UserFinancialInfoEditView,
ContractorOfficeDetailView, ContractorOfficeDetailView,
ContractorProfileDetailView, ContractorProfileDetailView,
ContractorProfileEditView, ContractorProfileEditView,
@ -40,5 +40,5 @@ urlpatterns = [
# 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'), urls.url(r'contractors/(?P<pk>\d+)/edit/$', ContractorProfileEditView.as_view(), name='contractor-edit'),
urls.url(r'customers/(?P<pk>\d+)/edit/$', CustomerProfileEditView.as_view(), name='customers-edit'), urls.url(r'customers/(?P<pk>\d+)/edit/$', CustomerProfileEditView.as_view(), name='customers-edit'),
urls.url(r'contractors/(?P<pk>\d+)/financialinfo/edit/$', ContractorFinancialInfoEdit.as_view(), name='contractor-financical'), urls.url(r'contractors/(?P<pk>\d+)/financialinfo/edit/$', UserFinancialInfoEditView.as_view(), name='contractor-financical'),
] ]

@ -13,16 +13,23 @@ import itertools
import natsort import natsort
import pydash as _; _.map = _.map_; _.filter = _.filter_ import pydash as _; _.map = _.map_; _.filter = _.filter_
from .forms import UserEditForm, ContractorFilterForm, ContractorFinancicalInfoForm
from .mixins import CheckForUserMixin from .mixins import CheckForUserMixin
from .models import User, Team, ContractorFinancialInfo from .models import User, Team, UserFinancialInfo
from archilance import util
from archilance.mixins import BaseMixin from archilance.mixins import BaseMixin
from common.utils import get_or_none
from projects.forms import PortfolioForm from projects.forms import PortfolioForm
from projects.models import Project
from reviews.models import Review from reviews.models import Review
from specializations.models import Specialization from specializations.models import Specialization
from work_sell.forms import WorkSellForm from work_sell.forms import WorkSellForm
from .forms import (
ContractorFilterForm,
UserFinancicalInfoForm,
CustomerProfileProjectRealtyForm,
UserEditForm,
)
def send_mail_test(request): def send_mail_test(request):
send_mail('Subject here', 'Here is the message.Mukhtar hello ', '', ['muhtarzubanchi05@gmail.com'], fail_silently=False) send_mail('Subject here', 'Here is the message.Mukhtar hello ', '', ['muhtarzubanchi05@gmail.com'], fail_silently=False)
@ -244,26 +251,104 @@ class ContractorOfficeDetailView(DetailView):
context_object_name = 'contractor' context_object_name = 'contractor'
class CustomerProfileOpenProjectsView(BaseMixin, DetailView): class CustomerProfileOpenProjectsView(BaseMixin, View):
model = User
template_name = 'customer_profile_open_projects.html' template_name = 'customer_profile_open_projects.html'
context_object_name = 'customer' form_class = CustomerProfileProjectRealtyForm
def get_context_data(self, **kwargs): def get(self, request, *args, **kwargs):
c = super().get_context_data(**kwargs) context = self.get_context_data(**_.merge({}, request.GET, kwargs))
c['projects'] = self.object.projects.filter(state='active') customer = get_object_or_404(User.customer_objects, pk=kwargs.get('pk'))
return c form = self.form_class(request.GET, request=request, customer=customer)
projects = customer.projects.filter(state='active')
trashed_projects = customer.projects.filter(state='trashed')
if form.is_valid():
realty = form.cleaned_data.get('realty')
class CustomerProfileTrashedProjectsView(BaseMixin, DetailView): if realty:
model = User projects = projects.filter(realty=realty)
trashed_projects = trashed_projects.filter(realty=realty)
else:
if form.errors:
messages.info(request, (
'<p>Произошла ошибка (form)</p>'
'<pre>{form}</pre>'
).format(form=pformat(form.errors)))
paginator = Paginator(projects, settings.PAGE_SIZE)
page = request.GET.get('page')
try:
projects = paginator.page(page)
except PageNotAnInteger:
projects = paginator.page(1)
except EmptyPage:
projects = paginator.page(paginator.num_pages)
context.update({
'form': form,
'projects': projects,
'customer': customer,
'open_project_count': projects.paginator.count,
'trashed_project_count': trashed_projects.count(),
'is_paginated': True,
'page_obj': projects,
})
return render(request, self.template_name, context)
class CustomerProfileTrashedProjectsView(BaseMixin, View):
template_name = 'customer_profile_trashed_projects.html' template_name = 'customer_profile_trashed_projects.html'
context_object_name = 'customer' form_class = CustomerProfileProjectRealtyForm
def get_context_data(self, **kwargs): def get(self, request, *args, **kwargs):
c = super().get_context_data(**kwargs) context = self.get_context_data(**_.merge({}, request.GET, kwargs))
c['projects'] = self.object.projects.filter(state='trashed') customer = get_object_or_404(User.customer_objects, pk=kwargs.get('pk'))
return c form = self.form_class(request.GET, request=request, customer=customer)
projects = customer.projects.filter(state='trashed')
open_projects = customer.projects.filter(state='active')
if form.is_valid():
realty = form.cleaned_data.get('realty')
if realty:
projects = projects.filter(realty=realty)
open_projects = open_projects.filter(realty=realty)
else:
if form.errors:
messages.info(request, (
'<p>Произошла ошибка (form)</p>'
'<pre>{form}</pre>'
).format(form=pformat(form.errors)))
paginator = Paginator(projects, settings.PAGE_SIZE)
page = request.GET.get('page')
try:
projects = paginator.page(page)
except PageNotAnInteger:
projects = paginator.page(1)
except EmptyPage:
projects = paginator.page(paginator.num_pages)
context.update({
'form': form,
'projects': projects,
'customer': customer,
'open_project_count': open_projects.count(),
'trashed_project_count': projects.paginator.count,
'is_paginated': True,
'page_obj': projects,
})
return render(request, self.template_name, context)
class CustomerProfileCurrentProjectsView(BaseMixin, DetailView): class CustomerProfileCurrentProjectsView(BaseMixin, DetailView):
@ -291,14 +376,34 @@ class CustomerProfileReviewsView(BaseMixin, View):
return render(request, self.template_name, context) return render(request, self.template_name, context)
class CustomerProfileEditView(CheckForUserMixin, View):
class ContractorProfileEditView(CheckForUserMixin, View):
form_class = UserEditForm form_class = UserEditForm
template_name = 'customer_profile_edit.html' template_name = 'contractor_profile_edit.html'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
instance = get_object_or_404(User, pk=request.user.pk) instance = get_object_or_404(User, pk=request.user.pk)
form = self.form_class(instance=instance) form = self.form_class(instance=instance)
nodes = Specialization.objects.all() root = util.get_or_none(Specialization, name='_root')
nodes = root.get_descendants('lft')
return render(request, self.template_name, {'form': form, 'nodes': nodes}) return render(request, self.template_name, {'form': form, 'nodes': nodes})
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
@ -306,22 +411,31 @@ class CustomerProfileEditView(CheckForUserMixin, View):
form = self.form_class(request.POST, request.FILES, instance=instance) form = self.form_class(request.POST, request.FILES, instance=instance)
if form.is_valid(): if form.is_valid():
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))
form.save() instance = form.save(commit=False)
messages.info(request, 'Отправили post запрос') instance.save()
return redirect(reverse('users:customer-profile-open-projects', kwargs={'pk': request.user.pk})) messages.info(request, 'Данные успешно отредактированы')
return redirect(reverse('users:contractor-edit', kwargs={'pk': request.user.pk}))
return render(request, self.template_name, {'form': form}) return render(request, self.template_name, {'form': form})
class ContractorProfileEditView(CheckForUserMixin, View):
class CustomerProfileEditView(CheckForUserMixin, View):
form_class = UserEditForm form_class = UserEditForm
template_name = 'contractor_profile_edit.html' template_name = 'customer_profile_edit.html'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
instance = get_object_or_404(User, pk=request.user.pk) instance = get_object_or_404(User, pk=request.user.pk)
form = self.form_class(instance=instance) form = self.form_class(instance=instance)
root = get_or_none(Specialization, name='_root') nodes = Specialization.objects.all()
nodes = root.get_descendants('lft')
return render(request, self.template_name, {'form': form, 'nodes': nodes}) return render(request, self.template_name, {'form': form, 'nodes': nodes})
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
@ -329,17 +443,36 @@ class ContractorProfileEditView(CheckForUserMixin, View):
form = self.form_class(request.POST, request.FILES, instance=instance) form = self.form_class(request.POST, request.FILES, instance=instance)
if form.is_valid(): if form.is_valid():
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))
instance = form.save(commit=False) form.save()
instance.save() messages.info(request, 'Отправили post запрос')
messages.info(request, 'Данные успешно отредактированы') return redirect(reverse('users:customer-profile-open-projects', kwargs={'pk': request.user.pk}))
return redirect(reverse('users:contractor-edit', kwargs={'pk': request.user.pk}))
return render(request, self.template_name, {'form': form}) return render(request, self.template_name, {'form': form})
class ContractorFinancialInfoEdit(CheckForUserMixin, View):
class UserFinancialInfoEditView(CheckForUserMixin, View):
template_name = 'contractor_financical_info_edit.html' template_name = 'contractor_financical_info_edit.html'
form_class = ContractorFinancicalInfoForm form_class = UserFinancicalInfoForm
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
instance = request.user.contractor_financial_info instance = request.user.contractor_financial_info

@ -1,8 +1,10 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %} {% load staticfiles %}
{% load thumbnail %} {% load thumbnail %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
<div class="container mainScore"> <div class="container mainScore">
<div class="row"> <div class="row">
@ -108,83 +110,50 @@
</div> </div>
</div> </div>
</div> </div>
</form>
<div class="galleryWork disTab">
{% for work in object_list %} <div class="galleryWork disTab">
<div class="col-lg-3"> {% for work in object_list %}
<div class="insetCol box-sizing disTab"> <div class="col-lg-3">
<a href="{% url 'work_sell:detail' work.pk %}"> <div class="insetCol box-sizing disTab">
{% thumbnail work.img "265x265" crop="center" as im %} <a href="{% url 'work_sell:detail' work.pk %}">
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;"> {% thumbnail work.img "265x265" crop="center" as im %}
<div class="imgFigure"></div> <div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
</div> <div class="imgFigure"></div>
{% endthumbnail %}
</a>
<div class="cenaImg box-sizing">
<div class="cenaImgInset">
{{ work.budget }} <i class="fa fa-rub"></i>
</div> </div>
{% endthumbnail %}
</a>
<div class="cenaImg box-sizing">
<div class="cenaImgInset">
{{ work.budget }} <i class="fa fa-rub"></i>
</div> </div>
</div> </div>
<div class="insetCol2 box-sizing disTab"> </div>
<p>{{ work }}</p> <div class="insetCol2 box-sizing disTab">
<p>{{ work }}</p>
<div class="buttonsImg" disTab> <div class="buttonsImg" disTab>
<a href="{% url 'work_sell:edit' work.pk %}"> <a href="{% url 'work_sell:edit' work.pk %}">
<div class="insetBI insetBI1"> <div class="insetBI insetBI1">
<i class="fa fa-pencil"></i> <i class="fa fa-pencil"></i>
</div> </div>
</a> </a>
<a href="{% url 'work_sell:delete' work.pk %}"> <a href="{% url 'work_sell:delete' work.pk %}">
<div class="insetBI insetBI2"> <div class="insetBI insetBI2">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
</div>
</a>
</div> </div>
</a>
</div> </div>
</div> </div>
{% endfor %} </div>
</div> {% endfor %}
</div>
{# {% if is_paginated %}#}
{# <div class="col-lg-12 pagin">#}
{# <nav>#}
{# <ul class="pagination">#}
{# {% if page_obj.has_previous %}#}
{# <li>#}
{# <a href="?page={{ page_obj.previous_page_number }}" aria-label="Previous">#}
{# <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>#}
{# </a>#}
{# </li>#}
{# {% endif %}#}
{# {% for page_number in paginator.page_range %}#}
{# {% if page_number == page_obj.number %}#}
{# <li class="active"><a href="#">{{ page_number }}</a></li>#}
{# {% else %}#}
{# <li><a href="?page={{ page_number }}">{{ page_number }}</a></li>#}
{# {% endif %}#}
{# {% endfor %}#}
{# #}
{# {% if page_obj.has_next %}#}
{# <li>#}
{# <a href="?page={{ page_obj.next_page_number }}" aria-label="Next">#}
{# <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>#}
{# </a>#}
{# </li>#}
{# {% endif %}#}
{# </ul>#}
{# </nav>#}
{# </div>#}
{# {% endif %}#}
<div class="col-lg-12 pagin"> <div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %} {% include 'partials/pagination.html' %}
</div> </div>
</form>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}

Loading…
Cancel
Save