diff --git a/assets/css/main.css b/assets/css/main.css
index a48b044..875b06c 100644
--- a/assets/css/main.css
+++ b/assets/css/main.css
@@ -12,7 +12,7 @@
font-style: normal;
}
-@font-face {
+@font-face {
font-family: 'pfdintextcomppro-regular';
src: url('../fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.eot?#iefix') format('embedded-opentype'), url('../fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.woff') format('woff'), url('../fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.ttf') format('truetype'), url('../fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.svg#PFDinTextCompPro-Regular') format('svg');
font-weight: normal;
@@ -177,7 +177,7 @@ a, a:hover, a:focus, a:active {
padding: 30px 0px 27px 40px;
font-family: 'pfbeausanspro-reg', sans-serif;
}
-
+
.reg, .reg:link, .reg:visited {
color: #fb1818;
font-size: 16px;
@@ -791,7 +791,7 @@ footer:after {
border-radius: 40px;
font-size: 15px;
font-family: 'Arial-MT-Regular', sans-serif;
-}
+}
.valProject button:focus,
.valProject button:active,
@@ -804,7 +804,7 @@ footer:after {
.valProject2 button span mark {
background: none;
- color: #ff2c2c;
+ color: #ff2c2c;
}
.valProject2 button > span {
@@ -921,6 +921,10 @@ footer:after {
margin-right: 0;
}
+.desPro li a:hover {
+ text-decoration: underline !important;
+}
+
.textPro {
width: 100%;
float: left;
@@ -1244,7 +1248,7 @@ footer:after {
.polsF1 .dropdown-menu li a:focus {
outline: none !important;
- background: none;
+ background: none;
}
/*.searchF1 {
@@ -1393,9 +1397,9 @@ input[type="checkbox"] + span {
.sro input[type="checkbox"] {
opacity: 0;
}
-
+
input[type="checkbox"]:checked + span {
- background-position: 0 -23px;
+ background-position: 0 -23px;
}
.sro p {
@@ -1764,7 +1768,7 @@ input[type="checkbox"]:checked + span {
}
.divCol9 {
- padding: 20px 0;
+ padding: 20px 0;
}
.nameUser, .cityUser, .navv {
@@ -2020,7 +2024,7 @@ input[type="checkbox"]:checked + span {
}
.addWork a:link, .addWork a:visited, .addWork a {
- color: #5a5a5a;
+ color: #5a5a5a;
}
.addWork:before {
@@ -2781,7 +2785,7 @@ input[type="checkbox"]:checked + span {
-webkit-transition: all 0.3s ease-out;
-moz-transition: all 0.3s ease-out;
transition: all 0.3s ease-out;
- cursor: move;
+ cursor: move;
}
.compTable tr:hover {
@@ -2983,7 +2987,7 @@ input[type="checkbox"]:checked + span {
}
.compTable tr td:nth-child(7) span {
- color: #43b476;
+ color: #43b476;
font-size: 14px;
font-weight: bold;
font-family: Arial, Verdana, Helvetica, sans-serif;
@@ -3223,7 +3227,7 @@ input[type="checkbox"]:checked + span {
position: relative;
cursor: pointer;
}
-
+
.gallery-thumbs .swiper-slide.is-selected:after {
content: '';
position: absolute;
@@ -3460,8 +3464,8 @@ input[type="checkbox"]:checked + span {
text-transform: uppercase;
}
-.textAreaBlock2 a:not(.cke_button, .cke_combo_button, .cke_path_item),
-.textAreaBlock2 a:link:not(.cke_button, .cke_combo_button, .cke_path_item),
+.textAreaBlock2 a:not(.cke_button, .cke_combo_button, .cke_path_item),
+.textAreaBlock2 a:link:not(.cke_button, .cke_combo_button, .cke_path_item),
.textAreaBlock2 a:visited:not(.cke_button, .cke_combo_button, .cke_path_item) {
font-family: 'pfdintextcomppro-regular', sans-serif;
letter-spacing: 2px;
@@ -3667,7 +3671,7 @@ input[type="checkbox"]:checked + span {
.startChat {
float: left;
margin: 0 0 0 0;
-}
+}
.insetSC1 {
width: 100%;
@@ -4494,7 +4498,7 @@ label {
display: block;
position: relative;
}
-
+
input[type="checkbox"] + span {
position: absolute;
left: 0;
@@ -4504,9 +4508,9 @@ input[type="checkbox"] + span {
background: url('../img/check.png') no-repeat;
cursor: pointer;
}
-
+
input[type="checkbox"]:checked + span {
- background-position: 0 -23px;
+ background-position: 0 -23px;
}
.text-block {
@@ -4927,9 +4931,9 @@ input[type="radio"] + span {
.inset-mb input[type="radio"] {
opacity: 0;
}
-
+
input[type="radio"]:checked + span {
- background-position: 0 -23px;
+ background-position: 0 -23px;
}
.inset-mb p {
@@ -5323,7 +5327,7 @@ input[type="radio"]:checked + span {
.dog-new label {
float: left;
- margin: 14px 0 0 39px;
+ margin: 14px 0 0 39px;
}
.dog-new p {
@@ -5333,7 +5337,7 @@ input[type="radio"]:checked + span {
position: relative;
color: #8a8989;
font-style: italic;
- margin: 16px 0 0 12px;
+ margin: 16px 0 0 12px;
}
.make-new label {
@@ -5483,7 +5487,7 @@ input[type="radio"]:checked + span {
.titleFFE {
margin: 30px 0 -10px 0;
-}
+}
.new-doubt {
margin-bottom: 18px;
@@ -5693,7 +5697,7 @@ input[type="radio"]:checked + span {
font-weight: normal;
line-height: 1.42857143;
color: #333333;
- white-space: nowrap;
+ /*white-space: nowrap;*/
}
.select2-results .select2-result-label:hover{
background-color: #f2f2f2;
@@ -5977,7 +5981,7 @@ a.linkS2[data-target="#withdraw-money"]{
margin-top: 0px;
}
.changeBlock {
- min-height: 500px;
+ min-height: 450px;
display: table;
padding: 143px 20px 120px 20px;
}
@@ -6061,7 +6065,7 @@ input[type="radio"]{
margin: auto;
}
.menuUser ul:nth-child(3) li a{
- padding: 16px 0px 16px 0px !important;
+ padding: 16px 0px 16px 0px !important;
text-align: center;
}
.addWork, .upload2, .documentsChat a{
diff --git a/projects/templates/project_detail.html b/projects/templates/project_detail.html
index 4e8c6fd..f949474 100644
--- a/projects/templates/project_detail.html
+++ b/projects/templates/project_detail.html
@@ -281,7 +281,7 @@
{% if answer.term_type == 'project' %}
Срок: За проект
- {% else %}
+ {% elif answer.term and answer.term_type %}
Срок: {% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}
{% endif %}
@@ -855,7 +855,7 @@
{% if answer.term_type == 'project' %}
Срок: За проект
- {% else %}
+ {% elif answer.term and answer.term_type %}
Срок: {% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}
{% endif %}
@@ -1063,7 +1063,7 @@
{% if answer.term_type == 'project' %}
Срок: За проект
- {% else %}
+ {% elif answer.term and answer.term_type %}
Срок: {% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}
{% endif %}
diff --git a/users/helpers.py b/users/helpers.py
new file mode 100644
index 0000000..0760446
--- /dev/null
+++ b/users/helpers.py
@@ -0,0 +1,21 @@
+def get_projects_grouped(contractor):
+ private_open_projects = tuple(a.project for a in contractor.contractor_answers.filter(project__state='active', rejected=False))
+
+ try:
+ team_open_projects = tuple(a.project for a in contractor.team.answers.filter(project__state='active', rejected=False))
+ except:
+ team_open_projects = ()
+
+ private_archived_projects = tuple(a.project for a in contractor.contractor_answers.filter(project__state='active', rejected=True))
+
+ try:
+ team_archived_projects = tuple(a.project for a in contractor.team.answers.filter(project__state='active', rejected=True))
+ except:
+ team_archived_projects = ()
+
+ return {
+ 'private_open_projects': private_open_projects,
+ 'team_open_projects': team_open_projects,
+ 'private_archived_projects': private_archived_projects,
+ 'team_archived_projects': team_archived_projects,
+ }
diff --git a/users/templates/contractor_office_open_projects.html b/users/templates/contractor_office_open_projects.html
index f20eab9..a0bea10 100644
--- a/users/templates/contractor_office_open_projects.html
+++ b/users/templates/contractor_office_open_projects.html
@@ -26,7 +26,7 @@
Открытые проекты
- 0 / {{ open_project_count }}
+ {{ open_project_count }}
diff --git a/users/templates/contractor_profile.html b/users/templates/contractor_profile.html
index f6f0ead..25b187c 100644
--- a/users/templates/contractor_profile.html
+++ b/users/templates/contractor_profile.html
@@ -819,75 +819,6 @@
- // Load portfolio specialization choices by work type ---------------------------
-
-
- //;(function() {
- // var $specSelectContainer = $('.-spec-select-container.-for-portfolios').first()
- // var $specSelects = $specSelectContainer.find('.-spec-select')
- //
- // var $chosenSpecId = $specSelectContainer.find('.-chosen-spec-id').first()
- //
- // var $specSelect1 = $specSelectContainer.find('.-spec-select-level-1').first()
- // var $specSelect2 = $specSelectContainer.find('.-spec-select-level-2').first()
- // var $specSelect3 = $specSelectContainer.find('.-spec-select-level-3').first()
- // var $specSelect4 = $specSelectContainer.find('.-spec-select-level-4').first()
- // var specSelects = [$specSelect1, $specSelect2, $specSelect3, $specSelect4]
- //
- // var $workTypeSelect = $('.-project-work-type-select-field').first()
- //
- // var workTypeId = Number($workTypeSelect.find('option:selected').first().val()) || 1
- // reinitSpecializationsByWorkType($specSelects, workTypeId)
- //
- // var chosenSpecId = $chosenSpecId.val()
- //
- // if (chosenSpecId)
- // updateSpecializationWidgets(chosenSpecId, $specSelectContainer, $chosenSpecId, specSelects)
- //
- // $workTypeSelect.on('change', function($evt) {
- // var $that = $(this)
- // var workTypeId = Number($that.val())
- // reinitSpecializationsByWorkType($specSelects, workTypeId)
- // })
- //}())
-
-
-
- // Load "work_sell" specialization choices by work type ---------------------------
-
-
- //;(function() {
- // var $specSelectContainer = $('.-spec-select-container.-for-work-sell').first()
- // var $specSelects = $specSelectContainer.find('.-spec-select')
- //
- // var $chosenSpecId = $specSelectContainer.find('.-chosen-spec-id').first()
- //
- // var $specSelect1 = $specSelectContainer.find('.-spec-select-level-1').first()
- // var $specSelect2 = $specSelectContainer.find('.-spec-select-level-2').first()
- // var $specSelect3 = $specSelectContainer.find('.-spec-select-level-3').first()
- // var $specSelect4 = $specSelectContainer.find('.-spec-select-level-4').first()
- // var specSelects = [$specSelect1, $specSelect2, $specSelect3, $specSelect4]
- //
- // var $workTypeSelect = $('.-project-work-type-select-field').first()
- //
- // var workTypeId = Number($workTypeSelect.find('option:selected').first().val()) || 1
- // reinitSpecializationsByWorkType($specSelects, workTypeId)
- //
- // var chosenSpecId = $chosenSpecId.val()
- //
- // if (chosenSpecId)
- // updateSpecializationWidgets(chosenSpecId, $specSelectContainer, $chosenSpecId, specSelects)
- //
- // $workTypeSelect.on('change', function($evt) {
- // var $that = $(this)
- // var workTypeId = Number($that.val())
- // reinitSpecializationsByWorkType($specSelects, workTypeId)
- // })
- //}())
-
-
-
-
//-----------------------------------------------------------------
@@ -963,6 +894,10 @@
success: function (data) {
if (data.status == 'ok') {
location.reload();
+ } else if (data.status == 'no') {
+ $.each(data.form_errors, function (k, v) {
+ $('.error-' + k).html(v).show();
+ });
}
},
diff --git a/users/templates/partials/contractor_profile_tabs.html b/users/templates/partials/contractor_profile_tabs.html
index 62c5d96..b4f0ed4 100644
--- a/users/templates/partials/contractor_profile_tabs.html
+++ b/users/templates/partials/contractor_profile_tabs.html
@@ -1,3 +1,6 @@
+{% load user_tags %}
+
+
{% url 'users:contractor-office' as contractor_office_url %}
{% url 'users:contractor-office-open-projects' as contractor_office_open_projects_url %}
{% url 'users:contractor-office-chat-projects' as contractor_office_chat_projects_url %}
@@ -20,8 +23,8 @@
в процессе обсуждения
-
0
-
{{ all_project_count }}
+{#
0
#}
+
{{ contractor|get_project_message_count }}
diff --git a/users/templates/partials/customer_profile_info_block.html b/users/templates/partials/customer_profile_info_block.html
index 6599542..f0cac88 100644
--- a/users/templates/partials/customer_profile_info_block.html
+++ b/users/templates/partials/customer_profile_info_block.html
@@ -1,4 +1,5 @@
{% load specializtions_tags %}
+{% load user_tags %}
{% load thumbnail %}
{% load user_tags %}
@@ -59,8 +60,8 @@
Текущие проекты
-
0
-
{{ answer_message_count }}
+{#
0
#}
+
{{ customer|get_project_message_count }}
{% endif %}
diff --git a/users/templates/worksell_create_form.html b/users/templates/worksell_create_form.html
index 714526d..e319598 100644
--- a/users/templates/worksell_create_form.html
+++ b/users/templates/worksell_create_form.html
@@ -6,13 +6,13 @@
{% csrf_token %}
-
Название заказа {{ worksell_form.name.errors.as_text }}
+
Название заказа {{ worksell_form.name.errors.as_text }}
-
Подробно опишите задание {{ worksell_form.description.errors.as_text }}
+
Подробно опишите задание {{ worksell_form.description.errors.as_text }}
diff --git a/users/templatetags/user_tags.py b/users/templatetags/user_tags.py
index 54ae6e1..8381cc1 100644
--- a/users/templatetags/user_tags.py
+++ b/users/templatetags/user_tags.py
@@ -1,10 +1,13 @@
-import math
-from django import template
-from django.db.models import Q
from chat.models import NewMessage
+from django import template
+from django.core.paginator import Page
+from django.db.models import Q, Count
+import math
+
from reviews.models import Review
from projects.models import Order
+
register = template.Library()
@@ -105,3 +108,13 @@ def get_customer_chat_open_projects(user):
return count
+@register.filter
+def get_project_message_count(user):
+ if user.is_customer():
+ projects = user.customer_projects.filter(state='active').exclude(order__contractor__isnull=True, order__team__isnull=True)
+ # elif user.is_contractor():
+ # # projects = user.customer_projects.filter(state='active').exclude(order__contractor__isnull=True, order__team__isnull=True)
+
+ return projects.aggregate(message_count=Count('answers__messages'))['message_count']
+ else:
+ return '' # TODO
diff --git a/users/views.py b/users/views.py
index 453ff09..25e48be 100644
--- a/users/views.py
+++ b/users/views.py
@@ -31,6 +31,8 @@ from specializations.models import Specialization
from work_sell.forms import WorkSellForm
from work_sell.models import WorkSell, Picture
+from .helpers import get_projects_grouped
+
from .forms import (
ContractorFilterForm,
CustomerProfileProjectRealtyForm,
@@ -40,33 +42,6 @@ from .forms import (
)
-def get_projects_grouped(contractor):
- private_open_projects = tuple(a.project for a in contractor.contractor_answers.filter(project__state='active', rejected=False))
-
- try:
- team_open_projects = tuple(a.project for a in contractor.team.answers.filter(project__state='active', rejected=False))
- except:
- team_open_projects = ()
-
- private_archived_projects = tuple(a.project for a in contractor.contractor_answers.filter(project__state='active', rejected=True))
-
- try:
- team_archived_projects = tuple(a.project for a in contractor.team.answers.filter(project__state='active', rejected=True))
- except:
- team_archived_projects = ()
-
- return {
- 'private_open_projects': private_open_projects,
- 'team_open_projects': team_open_projects,
- 'private_archived_projects': private_archived_projects,
- 'team_archived_projects': team_archived_projects,
- }
-
-
-def get_project_messages(projects):
- return projects.aggregate(message_count=Count('answers__messages'))['message_count']
-
-
class UserProfileEditView(BaseMixin, View):
form_class = UserProfileEditForm
template_name = 'user_profile_edit.html'
@@ -220,7 +195,6 @@ class ContractorFilterView(BaseMixin, View):
build_classif = form.cleaned_data.get('building_classification')
constr_type = form.cleaned_data.get('construction_type')
-
party_types = form.cleaned_data.get('party_types')
last_party_types = form.cleaned_data.get('last_party_types')
@@ -459,10 +433,6 @@ class ContractorOfficeView(BaseMixin, DetailView):
context['open_project_count'] = len(private_open_projects) + len(team_open_projects)
context['archived_project_count'] = len(private_archived_projects) + len(team_archived_projects)
- context['all_project_count'] = \
- len(private_open_projects) + len(private_archived_projects) + \
- len(team_open_projects) + len(team_archived_projects)
-
compl_proj = tuple(o.project for o in team.orders.filter(status='completed'))
team_invitation_exclude_contractor_ids = tuple(itertools.chain((contractor.pk,), tuple(c.pk for c in contractor.team.contractors.all())))
@@ -513,11 +483,6 @@ class ContractorChatProjectsView(View):
context['open_project_count'] = len(private_open_projects) + len(team_open_projects)
context['archived_project_count'] = len(private_archived_projects) + len(team_archived_projects)
- context['all_project_count'] = \
- len(private_open_projects) + len(private_archived_projects) + \
- len(team_open_projects) + len(team_archived_projects)
-
-
team_ids = []
if request.user.is_owner_team():
team_ids.append(request.user.team.pk)
@@ -553,10 +518,6 @@ class ContractorOfficeProjectsView(BaseMixin, View):
context['open_project_count'] = len(private_open_projects) + len(team_open_projects)
context['archived_project_count'] = len(private_archived_projects) + len(team_archived_projects)
- context['all_project_count'] = \
- len(private_open_projects) + len(private_archived_projects) + \
- len(team_open_projects) + len(team_archived_projects)
-
if request.GET.get('owner') == 'private':
if request.GET.get('archived') == 'on':
projects = private_archived_projects
@@ -696,9 +657,6 @@ class CustomerProfileCurrentProjectsView(BaseMixin, View):
customer = get_object_or_404(User.customer_objects, pk=kwargs.get('pk'))
projects = customer.customer_projects.filter(state='active').exclude(order__contractor__isnull=True, order__team__isnull=True)
- answer_message_count = get_project_messages(projects)
- context['answer_message_count'] = answer_message_count
-
# trashed_projects = customer.customer_projects.filter(state='trashed')
paginator = Paginator(projects, settings.PAGE_SIZE)