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. 147
      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. 510
      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. 51
      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. 109
      work_sell/templates/worksells_list.html

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

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

@ -23,7 +23,7 @@ class Command(BaseCommand):
review.project = Project.objects.order_by('?').first()
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.save()

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

@ -1,5 +1,7 @@
from django.shortcuts import _get_queryset
from django.utils import timezone
from pprint import pprint, pformat
import natsort
import pydash as _; _.map = _.map_; _.filter = _.filter_
import random
@ -41,14 +43,31 @@ def random_amount():
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):
fields = natsort.natsorted(model._meta.get_fields(), key=lambda f: f.name)
pprint([(
f.name,
'Relation? %s' % f.is_relation,
'Null? %s' % f.null,
'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 model._meta.get_fields(include_hidden=True)], width=width)
) for f in fields], width=width)
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>
{% endfor %}
</div>
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>

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

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

@ -1,13 +1,15 @@
from django import template
from common.utils import get_or_none
from archilance import util
from users.models import User
register = template.Library()
@register.inclusion_tag('templatetags/specializations_widget.html', takes_context=True)
def specialization_widget(context, 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:
specializations = user.contractor_specializations.all()
else:

@ -6,14 +6,7 @@
{% include 'partials/header.html' %}
<div class="container-fluid">
<div class="row">
{# {% url "password_reset_recover" %}#}
<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>

@ -31,10 +31,19 @@
<body>
{% if 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 %}
{% 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 %}
<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.fileupload.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="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.js"></script>

@ -1,29 +1,51 @@
{% if is_paginated %}
<nav>
<ul class="pagination">
{% if page_obj.has_previous %}
<li>
<button type="submit" name="page" value="{{ page_obj.previous_page_number }}">Previous</button>
</li>
{% endif %}
<li>
<a
href="#"
aria-label="Previous"
{% 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 %}
{% if n == page_obj.number %}
<li class="i active">
<button type="submit" name="page" value="{{ n }}" class="i" disabled>{{ n }}</button>
</li>
<li class="active"><a href="#" onclick="return false">{{ n }}</a></li>
{% else %}
<li>
<button type="submit" name="page" value="{{ n }}">{{ n }}</button>
</li>
<li><a href="#" onclick="paginateTo({{ n }}); return false">{{ n }}</a></li>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li>
<button type="submit" name="page" value="{{ page_obj.next_page_number }}">Next</button>
</li>
{% endif %}
<li>
<a
href="#"
aria-label="Next"
{% 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>
</nav>
<script>
function paginateTo(pageNum) {
var urlObj = new URI(location.href)
urlObj.setQuery('page', pageNum)
location.href = urlObj.href()
}
</script>
{% endif %}

@ -1,6 +1,6 @@
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):
@ -11,7 +11,7 @@ class UserAdmin(admin.ModelAdmin):
return ', '.join(g.name for g in obj.groups.all())
admin.site.register(User, UserAdmin)
admin.site.register(ContractorFinancialInfo)
admin.site.register(UserFinancialInfo)
admin.site.register(Team)
admin.site.register(ContractorResume)
admin.site.register(ContractorResumeFiles)

@ -1,10 +1,11 @@
from django import forms
from django.forms import ModelForm
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 projects.models import Project, BuildingClassfication, ConstructionType
from projects.models import Project, Realty, BuildingClassfication, ConstructionType
from specializations.models import Specialization
@ -110,7 +111,27 @@ class ContractorFilterForm(forms.Form):
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):
super().__init__(*args, **kwargs)
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
class Meta:
model = ContractorFinancialInfo
model = UserFinancialInfo
fields = (
'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):
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated():
pk = kwargs.get('pk')

@ -41,7 +41,7 @@ class CustomerUserManager(models.Manager):
return super().get_queryset().filter(groups__name='Заказчики')
class ContractorFinancialInfo(models.Model):
class UserFinancialInfo(models.Model):
RESIDENCIES = (
('russian_resident', 'Резидент РФ'),
('non_russian_resident', 'Нерезидент РФ'),
@ -117,7 +117,6 @@ class User(AbstractBaseUser, PermissionsMixin):
)
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_specializations = TreeManyToManyField(Specialization, related_name='contractors', blank=True)
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_of_birth = models.DateTimeField(null=True, blank=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)
gender = models.CharField(max_length=30, choices=GENDERS, blank=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">
</div>
</div>
{% for obj in coll %}
{% if obj|class_name == 'Team' %}
{% with team=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="#">{{ team.name }}</a>
</form>
{% for obj in coll %}
{% if obj|class_name == 'Team' %}
{% with team=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="#">{{ team.name }}</a>
</p>
<p class="navv2">На сайте 8 лет и 3 месяца</p>
<div class="statusUser">Свободен</div>
</div>
<div class="col-lg-2">
<ul class="listExecutor">
<li>
<a href="javascript:void(0)">
смотреть профиль
</a>
</li>
<li>
<a href="javascript:void(0)">
предложить проект
</a>
</li>
<li>
<a href="javascript:void(0)">
написать сообщение
</a>
</li>
</ul>
</div>
<div class="col-lg-3">
<div class="dashedCol4 dashedCol44">
<p class="specUser">
Специализации:
</p>
<p class="navv2">На сайте 8 лет и 3 месяца</p>
<div class="statusUser">Свободен</div>
</div>
<div class="col-lg-2">
<ul class="listExecutor">
<li>
<a href="javascript:void(0)">
смотреть профиль
</a>
</li>
<li>
<a href="javascript:void(0)">
предложить проект
</a>
</li>
<li>
<a href="javascript:void(0)">
написать сообщение
</a>
</li>
</ul>
</div>
<div class="col-lg-3">
<div class="dashedCol4 dashedCol44">
<p class="specUser">
Специализации:
</p>
<div class="insetSpec">
<span>Интерьеры</span>
<span>2-й</span>
</div>
<div class="insetSpec">
<span>Интерьеры</span>
<span>2-й</span>
</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">
<span>Визуализация/3D</span>
<span>45</span>
<span>Архитектура</span>
<span>3-й</span>
</div>
<div class="insetSpec">
<span>Экстерьеры</span>
<span>10-й</span>
</div>
<div class="showSpec">
<div class="insetSpec">
<span>Архитектура</span>
<span>3-й</span>
</div>
<div class="insetSpec">
<span>3D Моделирование</span>
<span>100-й</span>
</div>
<span>3D Моделирование</span>
<span>100-й</span>
</div>
<button class="showPress">
</button>
</div>
<button class="showPress">
</button>
</div>
<div class="col-lg-3 retts">
<ul class="rettList restList2">
<li>Рейтинг: <span> 1245</span></li>
<li>Безопасные сделки: <span> 5</span></li>
<li>
<a href="javascript:void(0)">Отзывы:
<span> + 385</span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div>
</div>
<div class="col-lg-3 retts">
<ul class="rettList restList2">
<li>Рейтинг: <span> 1245</span></li>
<li>Безопасные сделки: <span> 5</span></li>
<li>
<a href="javascript:void(0)">Отзывы:
<span> + 385</span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</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 %}#}
<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>
</a>
</div>
{% endfor %}
</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 %}
<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>
</a>
</div>
{% endfor %}
</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>
</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">
<ul class="listExecutor">
<li>
<a href="{% url 'users:contractor-profile' pk=obj.pk %}">
смотреть профиль
</a>
</li>
<li>
<a href="javascript:void(0)">
предложить проект
</a>
</li>
<li>
<a href="javascript:void(0)">
написать сообщение
</a>
</li>
</ul>
</div>
<div class="col-lg-3">
<div class="dashedCol4 dashedCol44">
<p class="specUser">
Специализации:
</p>
<p class="navv2">На сайте 8 лет и 3 месяца</p>
<div class="statusUser">Свободен</div>
</div>
<div class="col-lg-2">
<ul class="listExecutor">
<li>
<a href="{% url 'users:contractor-profile' pk=obj.pk %}">
смотреть профиль
</a>
</li>
<li>
<a href="javascript:void(0)">
предложить проект
</a>
</li>
<li>
<a href="javascript:void(0)">
написать сообщение
</a>
</li>
</ul>
</div>
<div class="col-lg-3">
<div class="dashedCol4 dashedCol44">
<p class="specUser">
Специализации:
</p>
<div class="insetSpec">
<span>Интерьеры</span>
<span>2-й</span>
</div>
<div class="insetSpec">
<span>Интерьеры</span>
<span>2-й</span>
</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">
<span>Визуализация/3D</span>
<span>45</span>
<span>Архитектура</span>
<span>3-й</span>
</div>
<div class="insetSpec">
<span>Экстерьеры</span>
<span>10-й</span>
</div>
<div class="showSpec">
<div class="insetSpec">
<span>Архитектура</span>
<span>3-й</span>
</div>
<div class="insetSpec">
<span>3D Моделирование</span>
<span>100-й</span>
</div>
<span>3D Моделирование</span>
<span>100-й</span>
</div>
<button class="showPress">
</button>
</div>
<button class="showPress">
</button>
</div>
<div class="col-lg-3 retts">
<ul class="rettList restList2">
<li>Рейтинг: <span> 1245</span></li>
<li>Безопасные сделки: <span> 5</span></li>
<li>
<a href="javascript:void(0)">Отзывы:
<span> + 385</span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div>
</div>
<div class="col-lg-3 retts">
<ul class="rettList restList2">
<li>Рейтинг: <span> 1245</span></li>
<li>Безопасные сделки: <span> 5</span></li>
<li>
<a href="javascript:void(0)">Отзывы:
<span> + 385</span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div>
{# {% if TEMPLATE_DEBUG %}#}
{# <div class="col-lg-12">#}
{# <pre><!--#}
{# --><b>Specializations:</b> {{ contractor.contractor_specializations.all }}<br><!--#}
{# --><br><!--#}
{# --><b>Location:</b> {{ contractor.location }}<br><!--#}
{# --><br><!--#}
{# --><b>Build. classif-s:</b> {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><b>Constr. types:</b> {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><b>CRO:</b> {{ contractor.cro }}<br><!--#}
{# --><br><!--#}
{# --><b>Work types:</b> {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}<br><!--#}
{# --></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>
{% if TEMPLATE_DEBUG %}
<div class="col-lg-12">
<pre><!--
--><b>Specializations:</b> {{ contractor.contractor_specializations.all }}<br><!--
--><br><!--
--><b>Location:</b> {{ contractor.location }}<br><!--
--><br><!--
--><b>Build. classif-s:</b> {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}<br><!--
--><br><!--
--><b>Constr. types:</b> {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}<br><!--
--><br><!--
--><b>CRO:</b> {{ contractor.cro }}<br><!--
--><br><!--
--><b>Work types:</b> {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}<br><!--
--></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>
{% endwith %}
{% endif %}
{% endfor %}
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>
</form>
</div>
{% endwith %}
{% endif %}
{% endfor %}
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>
{% include 'partials/footer.html' %}

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

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

@ -1,113 +1,126 @@
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% load thumbnail %}
{% block content %}
{% include 'partials/header.html' %}
{% include 'partials/header.html' %}
<div class="container mainScore">
<div class="row">
<form method="post" enctype="multipart/form-data">{% csrf_token %}
<div class="projectsBlock disTab">
<div class="col-lg-12">
{{ form.errors }}
<div class="col-lg-3 divCol3">
<div class="avatar">
<div class="avatarInset">
<img src="/media/{{ form.avatar.value }}" alt="profile-image">
</div>
</div>
<div class="menuUser upload-img disTab">
<div class="upload2 up-l1">
<input type="file" name="{{ form.avatar.name }}">
<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="{{ form.first_name.value }}" name="{{ form.first_name.name }}" class="box-sizing inp-edit">
<input type="text" value="{{ form.last_name.value }}" name="{{ form.last_name.name }}" class="box-sizing inp-edit">
<input type="text" value="{{ form.patronym.value }}" name="{{ form.patronym.name }}" class="box-sizing inp-edit">
</div>
<div class="col-lg-4">
<p class="name-edit-p">Местоположение: {{ form.location.value }}</p>
<div class="polsF1 pols-edit disTab">
<select id="location-country">
</select>
<select id="location-region">
</select>
<select id="location-city" name="{{ form.location.name }}">
</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>
</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">
{{ form.date_of_birth }}
</div>
<div class="col-lg-5 dog-new ed-new">
<label><input type="radio" name="{{ form.gender }}"><span></span></label>
<p>Мужской</p>
<label class="woman"><input type="radio" name="{{ form.gender }}"><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" name="{{ form.website.name }}"class="box-sizing surr surr2" placeholder="beeg.com">
</div>
<div class="col-lg-3">
<input type="text" name="{{ form.skype.name }}" class="box-sizing surr surr2" placeholder="nokia770">
</div>
{# <div class="col-lg-3">#}
{# <input type="text" name="{{ form.phone.name }}" class="box-sizing surr surr2" placeholder="example@gmail.com">#}
{# </div>#}
<div class="col-lg-3">
<input type="text" name="{{ form.phone.name }}" 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>{{ 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 method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="projectsBlock disTab">
<div class="col-lg-12">
{{ form.errors }}
<div class="col-lg-3 divCol3">
<div class="avatar">
<div class="avatarInset">
<img src="/media/{{ form.avatar.value }}" alt="profile-image">
</div>
</div>
<div class="menuUser upload-img disTab">
<div class="upload2 up-l1">
<input type="file" name="{{ form.avatar.name }}">
<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="{{ form.first_name.value }}" name="{{ form.first_name.name }}" class="box-sizing inp-edit">
<input type="text" value="{{ form.last_name.value }}" name="{{ form.last_name.name }}" class="box-sizing inp-edit">
<input type="text" value="{{ form.patronym.value }}" name="{{ form.patronym.name }}" class="box-sizing inp-edit">
</div>
<div class="col-lg-4">
<p class="name-edit-p">Местоположение: {{ form.location.value }}</p>
<div class="polsF1 pols-edit disTab">
<select id="location-country">
</select>
<select id="location-region">
</select>
<select id="location-city" name="{{ form.location.name }}">
</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>
</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">
{{ form.date_of_birth }}
</div>
<div class="col-lg-5 dog-new ed-new">
<label><input type="radio" name="{{ form.gender }}"><span></span></label>
<p>Мужской</p>
<label class="woman"><input type="radio" name="{{ form.gender }}"><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" name="{{ form.website.name }}"class="box-sizing surr surr2" placeholder="beeg.com">
</div>
<div class="col-lg-3">
<input type="text" name="{{ form.skype.name }}" class="box-sizing surr surr2" placeholder="nokia770">
</div>
{# <div class="col-lg-3">#}
{# <input type="text" name="{{ form.phone.name }}" class="box-sizing surr surr2" placeholder="example@gmail.com">#}
{# </div>#}
<div class="col-lg-3">
<input type="text" name="{{ form.phone.name }}" 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>{{ 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>
{% include 'partials/footer.html' %}
{% include 'partials/footer.html' %}
</div>
</div>
{% endblock %}
{% block js_block %}
<script type="text/javascript">
<script>
$(function(){
function getCookie(name) {

@ -1,7 +1,6 @@
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% block content %}
{% include 'partials/header.html' %}
@ -9,36 +8,35 @@
<div class="row">
{% include 'partials/customer_profile_info_block.html' %}
<div class="buttonGP disTab">
<div class="buttonGP disTab">
<div class="btn-group valProject2">
<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 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>
</div>
<div class="polsF1 disTab polsSearch">
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
</div>
</div>
<div class="col-lg-3 col-lg-offset-1">
<p class="addWork add-work-new">
<a href="{% url 'projects:customer-project-create' %}">Разместить заказ</a>
<div class="polsF1 disTab polsSearch">
<div class="col-lg-3">
<form action="{% url 'users:customer-profile-open-projects' pk=pk %}" method="GET" novalidate>
{{ form.realty }}
</form>
</div>
</div>
<div class="col-lg-3 col-lg-offset-1">
<p class="addWork add-work-new">
<a href="{% url 'projects:customer-project-create' %}">Разместить заказ</a>
</p>
</div>
</div>
<div class="projectsBlock new-pro-block disTab">
</div>
</div>
<div class="projectsBlock new-pro-block disTab">
{% for proj in projects %}
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
@ -80,11 +78,10 @@
</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 %}
<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>
</li>
</ul>
@ -93,6 +90,10 @@
{% endfor %}
</div>
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>
{% include 'partials/footer.html' %}
</div>
</div>

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

@ -11,21 +11,19 @@
<div class="btn-group valProject2">
<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 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>
</div>
<div class="polsF1 disTab polsSearch">
<div class="col-lg-3">
<select class="selectpicker">
<option>Mustard</option>
<option>Ketchup</option>
<option>Relish</option>
</select>
<form action="{% url 'users:customer-profile-trashed-projects' pk=pk %}" method="GET" novalidate>
{{ form.realty }}
</form>
</div>
</div>
<div class="col-lg-3 col-lg-offset-1">
@ -34,6 +32,7 @@
</p>
</div>
</div>
<div class="projectsBlock new-pro-block disTab">
{% for proj in projects %}
<div class="projectPro clearfix">
@ -94,6 +93,10 @@
</div>
{% endfor %}
</div>
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>
{% include 'partials/footer.html' %}
</div>

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

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

@ -7,7 +7,7 @@ from .views import (
# UserInfoListView,
# UserView,
ContractorFilterView,
ContractorFinancialInfoEdit,
UserFinancialInfoEditView,
ContractorOfficeDetailView,
ContractorProfileDetailView,
ContractorProfileEditView,
@ -40,5 +40,5 @@ urlpatterns = [
# 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'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 pydash as _; _.map = _.map_; _.filter = _.filter_
from .forms import UserEditForm, ContractorFilterForm, ContractorFinancicalInfoForm
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 common.utils import get_or_none
from projects.forms import PortfolioForm
from projects.models import Project
from reviews.models import Review
from specializations.models import Specialization
from work_sell.forms import WorkSellForm
from .forms import (
ContractorFilterForm,
UserFinancicalInfoForm,
CustomerProfileProjectRealtyForm,
UserEditForm,
)
def send_mail_test(request):
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'
class CustomerProfileOpenProjectsView(BaseMixin, DetailView):
model = User
class CustomerProfileOpenProjectsView(BaseMixin, View):
template_name = 'customer_profile_open_projects.html'
context_object_name = 'customer'
form_class = CustomerProfileProjectRealtyForm
def get_context_data(self, **kwargs):
c = super().get_context_data(**kwargs)
c['projects'] = self.object.projects.filter(state='active')
return c
def get(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
customer = get_object_or_404(User.customer_objects, pk=kwargs.get('pk'))
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')
if realty:
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, DetailView):
model = User
class CustomerProfileTrashedProjectsView(BaseMixin, View):
template_name = 'customer_profile_trashed_projects.html'
context_object_name = 'customer'
form_class = CustomerProfileProjectRealtyForm
def get_context_data(self, **kwargs):
c = super().get_context_data(**kwargs)
c['projects'] = self.object.projects.filter(state='trashed')
return c
def get(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
customer = get_object_or_404(User.customer_objects, pk=kwargs.get('pk'))
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):
@ -291,14 +376,34 @@ class CustomerProfileReviewsView(BaseMixin, View):
return render(request, self.template_name, context)
class CustomerProfileEditView(CheckForUserMixin, View):
class ContractorProfileEditView(CheckForUserMixin, View):
form_class = UserEditForm
template_name = 'customer_profile_edit.html'
template_name = 'contractor_profile_edit.html'
def get(self, request, *args, **kwargs):
instance = get_object_or_404(User, pk=request.user.pk)
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})
def post(self, request, *args, **kwargs):
@ -306,22 +411,31 @@ class CustomerProfileEditView(CheckForUserMixin, View):
form = self.form_class(request.POST, request.FILES, instance=instance)
if form.is_valid():
# import code; code.interact(local=dict(globals(), **locals()))
form.save()
messages.info(request, 'Отправили post запрос')
return redirect(reverse('users:customer-profile-open-projects', kwargs={'pk': request.user.pk}))
instance = form.save(commit=False)
instance.save()
messages.info(request, 'Данные успешно отредактированы')
return redirect(reverse('users:contractor-edit', kwargs={'pk': request.user.pk}))
return render(request, self.template_name, {'form': form})
class ContractorProfileEditView(CheckForUserMixin, View):
class CustomerProfileEditView(CheckForUserMixin, View):
form_class = UserEditForm
template_name = 'contractor_profile_edit.html'
template_name = 'customer_profile_edit.html'
def get(self, request, *args, **kwargs):
instance = get_object_or_404(User, pk=request.user.pk)
form = self.form_class(instance=instance)
root = get_or_none(Specialization, name='_root')
nodes = root.get_descendants('lft')
nodes = Specialization.objects.all()
return render(request, self.template_name, {'form': form, 'nodes': nodes})
def post(self, request, *args, **kwargs):
@ -329,17 +443,36 @@ class ContractorProfileEditView(CheckForUserMixin, View):
form = self.form_class(request.POST, request.FILES, instance=instance)
if form.is_valid():
# import code; code.interact(local=dict(globals(), **locals()))
instance = form.save(commit=False)
instance.save()
messages.info(request, 'Данные успешно отредактированы')
return redirect(reverse('users:contractor-edit', kwargs={'pk': request.user.pk}))
form.save()
messages.info(request, 'Отправили post запрос')
return redirect(reverse('users:customer-profile-open-projects', kwargs={'pk': request.user.pk}))
return render(request, self.template_name, {'form': form})
class ContractorFinancialInfoEdit(CheckForUserMixin, View):
class UserFinancialInfoEditView(CheckForUserMixin, View):
template_name = 'contractor_financical_info_edit.html'
form_class = ContractorFinancicalInfoForm
form_class = UserFinancicalInfoForm
def get(self, request, *args, **kwargs):
instance = request.user.contractor_financial_info

@ -1,8 +1,10 @@
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% load thumbnail %}
{% block content %}
{% include 'partials/header.html' %}
<div class="container mainScore">
<div class="row">
@ -108,83 +110,50 @@
</div>
</div>
</div>
<div class="galleryWork disTab">
{% for work in object_list %}
<div class="col-lg-3">
<div class="insetCol box-sizing disTab">
<a href="{% url 'work_sell:detail' work.pk %}">
{% thumbnail work.img "265x265" crop="center" as im %}
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div>
</div>
{% endthumbnail %}
</a>
<div class="cenaImg box-sizing">
<div class="cenaImgInset">
{{ work.budget }} <i class="fa fa-rub"></i>
</form>
<div class="galleryWork disTab">
{% for work in object_list %}
<div class="col-lg-3">
<div class="insetCol box-sizing disTab">
<a href="{% url 'work_sell:detail' work.pk %}">
{% thumbnail work.img "265x265" crop="center" as im %}
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div>
</div>
{% endthumbnail %}
</a>
<div class="cenaImg box-sizing">
<div class="cenaImgInset">
{{ work.budget }} <i class="fa fa-rub"></i>
</div>
</div>
<div class="insetCol2 box-sizing disTab">
<p>{{ work }}</p>
</div>
<div class="insetCol2 box-sizing disTab">
<p>{{ work }}</p>
<div class="buttonsImg" disTab>
<a href="{% url 'work_sell:edit' work.pk %}">
<div class="insetBI insetBI1">
<i class="fa fa-pencil"></i>
</div>
</a>
<a href="{% url 'work_sell:delete' work.pk %}">
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div>
</a>
<div class="buttonsImg" disTab>
<a href="{% url 'work_sell:edit' work.pk %}">
<div class="insetBI insetBI1">
<i class="fa fa-pencil"></i>
</div>
</a>
<a href="{% url 'work_sell:delete' work.pk %}">
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div>
</a>
</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">
{% include 'partials/pagination.html' %}
</div>
</form>
</div>
{% endfor %}
</div>
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>
{% include 'partials/footer.html' %}

Loading…
Cancel
Save