remotes/origin/setup
ArturBaybulatov 10 years ago
parent 61d73035b6
commit c5c94ba6c9
  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. 3
      archilance/management/commands/generate_users.py
  5. 2
      archilance/settings/base.py
  6. 17
      archilance/util.py
  7. 9
      common/utils.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. 54
      templates/partials/pagination.html
  13. 23
      users/forms.py
  14. 510
      users/templates/contractor_filter.html
  15. 51
      users/templates/customer_profile_open_projects.html
  16. 2
      users/templates/customer_profile_reviews.html
  17. 17
      users/templates/customer_profile_trashed_projects.html
  18. 13
      users/templates/partials/customer_profile_info_block.html
  19. 1
      users/templatetags/user_tags.py
  20. 115
      users/views.py
  21. 109
      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(_.random(5, 15))
review.is_secured = _.sample((True, False)) review.is_secured = _.sample((True, False))
review.save() review.save()

@ -79,7 +79,8 @@ 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='Пупкин',
username=username, username=username,
email='%s@example.com' % username, email='%s@example.com' % username,
is_active=True, is_active=True,

@ -240,7 +240,7 @@ REST_FRAMEWORK = {
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly', 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly',
], ],
'PAGE_SIZE': 10, 'PAGE_SIZE': 100,
'DEFAULT_FILTER_BACKENDS': ('rest_framework_filters.backends.DjangoFilterBackend',), # djangorestframework-filters 'DEFAULT_FILTER_BACKENDS': ('rest_framework_filters.backends.DjangoFilterBackend',), # djangorestframework-filters
} }

@ -1,3 +1,4 @@
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 pydash as _; _.map = _.map_; _.filter = _.filter_ import pydash as _; _.map = _.map_; _.filter = _.filter_
@ -41,6 +42,22 @@ 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):
pprint([( pprint([(
f.name, f.name,

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

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

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

@ -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,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, ContractorFinancialInfo
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,6 +111,26 @@ class ContractorFilterForm(forms.Form):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
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 ContractorFinancicalInfoForm(ModelForm): class ContractorFinancicalInfoForm(ModelForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)

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

@ -1,7 +1,6 @@
{% 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">
@ -94,6 +93,10 @@
</div> </div>
{% 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>

@ -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,16 +13,15 @@
<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 customer.pk %}
{% ratings_widget customer.pk %}
</div> </div>
<div class="col-lg-4"> <div class="col-lg-4">

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

@ -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, ContractorFinancialInfo
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,
ContractorFinancicalInfoForm,
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,100 @@ 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')
if form.is_valid():
realty = form.cleaned_data.get('realty')
if realty:
projects = 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': customer.projects.filter(state='trashed').count(),
'is_paginated': True,
'page_obj': projects,
})
return render(request, self.template_name, context)
class CustomerProfileTrashedProjectsView(BaseMixin, DetailView): class CustomerProfileTrashedProjectsView(BaseMixin, View):
model = User
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')
if form.is_valid():
realty = form.cleaned_data.get('realty')
if realty:
projects = 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': customer.projects.filter(state='active').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):
@ -319,7 +400,7 @@ class ContractorProfileEditView(CheckForUserMixin, View):
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') root = util.get_or_none(Specialization, name='_root')
nodes = root.get_descendants('lft') 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})

@ -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="col-lg-3"> <div class="galleryWork disTab">
<div class="insetCol box-sizing disTab"> {% for work in object_list %}
<a href="{% url 'work_sell:detail' work.pk %}"> <div class="col-lg-3">
{% thumbnail work.img "265x265" crop="center" as im %} <div class="insetCol box-sizing disTab">
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;"> <a href="{% url 'work_sell:detail' work.pk %}">
<div class="imgFigure"></div> {% thumbnail work.img "265x265" crop="center" as im %}
</div> <div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
{% endthumbnail %} <div class="imgFigure"></div>
</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>
<div class="col-lg-12 pagin">
{# {% if is_paginated %}#} {% include 'partials/pagination.html' %}
{# <div class="col-lg-12 pagin">#} </div>
{# <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>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}

Loading…
Cancel
Save