remotes/origin/PR-39
Mukhtar 9 years ago
commit 7d45403e75
  1. 56
      assets/css/main.css
  2. 6
      projects/templates/project_detail.html
  3. 21
      users/helpers.py
  4. 2
      users/templates/contractor_office_open_projects.html
  5. 73
      users/templates/contractor_profile.html
  6. 7
      users/templates/partials/contractor_profile_tabs.html
  7. 5
      users/templates/partials/customer_profile_info_block.html
  8. 4
      users/templates/worksell_create_form.html
  9. 19
      users/templatetags/user_tags.py
  10. 46
      users/views.py

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

@ -281,7 +281,7 @@
<p>
{% if answer.term_type == 'project' %}
Срок: <span>За проект</span>
{% else %}
{% elif answer.term and answer.term_type %}
Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span>
{% endif %}
</p>
@ -855,7 +855,7 @@
<p>
{% if answer.term_type == 'project' %}
Срок: <span>За проект</span>
{% else %}
{% elif answer.term and answer.term_type %}
Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span>
{% endif %}
</p>
@ -1063,7 +1063,7 @@
<p>
{% if answer.term_type == 'project' %}
Срок: <span>За проект</span>
{% else %}
{% elif answer.term and answer.term_type %}
Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span>
{% endif %}
</p>

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

@ -26,7 +26,7 @@
<div class="btn-group valProject2" role="group">
<a href="#" data-param-name="archived" data-default onclick="return false" class="btn btn-default -nav">
Открытые проекты
<span><mark>0</mark> / <span>{{ open_project_count }}</span></span>
<span><mark>{{ open_project_count }}</mark><!-- / <span>0</span>--></span>
</a>
<a href="#" data-param-name="archived" data-param-val="on" onclick="return false" class="btn btn-default -nav">

@ -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();
});
}
},

@ -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 @@
<span class="desPresent">в процессе обсуждения</span>
<div class="roundsCount">
<div class="countR">0</div>
<div class="countG">{{ all_project_count }}</div>
{# <div class="countR">0</div>#}
<div class="countG">{{ contractor|get_project_message_count }}</div>
</div>
</li>

@ -1,4 +1,5 @@
{% load specializtions_tags %}
{% load user_tags %}
{% load thumbnail %}
{% load user_tags %}
@ -59,8 +60,8 @@
<a href="{{ b }}">Текущие проекты</a>
<div class="roundsCount">
<div class="countR">0</div>
<div class="countG">{{ answer_message_count }}</div>
{# <div class="countR">0</div>#}
<div class="countG">{{ customer|get_project_message_count }}</div>
</div>
</li>
{% endif %}

@ -6,13 +6,13 @@
{% csrf_token %}
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Название заказа <span style="color: red">{{ worksell_form.name.errors.as_text }}</span></p>
<p>Название заказа <span style="color: red" class="error-{{ worksell_form.name.html_name }}">{{ worksell_form.name.errors.as_text }}</span></p>
<input type="text" class="box-sizing" name="{{ worksell_form.name.html_name }}"
value="{{ worksell_form.name.value }}">
</div>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Подробно опишите задание <span style="color: red">{{ worksell_form.description.errors.as_text }}</span></p>
<p>Подробно опишите задание <span style="color: red" class="error-{{ worksell_form.description.html_name }}">{{ worksell_form.description.errors.as_text }}</span></p>
<textarea name="{{ worksell_form.description.html_name }}" id="text-new">{{ worksell_form.description.value }}</textarea>
</div>

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

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

Loading…
Cancel
Save