remotes/origin/PR-39
Mukhtar 10 years ago
commit 7d45403e75
  1. 8
      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

@ -921,6 +921,10 @@ footer:after {
margin-right: 0; margin-right: 0;
} }
.desPro li a:hover {
text-decoration: underline !important;
}
.textPro { .textPro {
width: 100%; width: 100%;
float: left; float: left;
@ -5693,7 +5697,7 @@ input[type="radio"]:checked + span {
font-weight: normal; font-weight: normal;
line-height: 1.42857143; line-height: 1.42857143;
color: #333333; color: #333333;
white-space: nowrap; /*white-space: nowrap;*/
} }
.select2-results .select2-result-label:hover{ .select2-results .select2-result-label:hover{
background-color: #f2f2f2; background-color: #f2f2f2;
@ -5977,7 +5981,7 @@ a.linkS2[data-target="#withdraw-money"]{
margin-top: 0px; margin-top: 0px;
} }
.changeBlock { .changeBlock {
min-height: 500px; min-height: 450px;
display: table; display: table;
padding: 143px 20px 120px 20px; padding: 143px 20px 120px 20px;
} }

@ -281,7 +281,7 @@
<p> <p>
{% if answer.term_type == 'project' %} {% if answer.term_type == 'project' %}
Срок: <span>За проект</span> Срок: <span>За проект</span>
{% else %} {% elif answer.term and answer.term_type %}
Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span> Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span>
{% endif %} {% endif %}
</p> </p>
@ -855,7 +855,7 @@
<p> <p>
{% if answer.term_type == 'project' %} {% if answer.term_type == 'project' %}
Срок: <span>За проект</span> Срок: <span>За проект</span>
{% else %} {% elif answer.term and answer.term_type %}
Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span> Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span>
{% endif %} {% endif %}
</p> </p>
@ -1063,7 +1063,7 @@
<p> <p>
{% if answer.term_type == 'project' %} {% if answer.term_type == 'project' %}
Срок: <span>За проект</span> Срок: <span>За проект</span>
{% else %} {% elif answer.term and answer.term_type %}
Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span> Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span>
{% endif %} {% endif %}
</p> </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"> <div class="btn-group valProject2" role="group">
<a href="#" data-param-name="archived" data-default onclick="return false" class="btn btn-default -nav"> <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>
<a href="#" data-param-name="archived" data-param-val="on" onclick="return false" class="btn btn-default -nav"> <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) { success: function (data) {
if (data.status == 'ok') { if (data.status == 'ok') {
location.reload(); 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' as contractor_office_url %}
{% url 'users:contractor-office-open-projects' as contractor_office_open_projects_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 %} {% url 'users:contractor-office-chat-projects' as contractor_office_chat_projects_url %}
@ -20,8 +23,8 @@
<span class="desPresent">в процессе обсуждения</span> <span class="desPresent">в процессе обсуждения</span>
<div class="roundsCount"> <div class="roundsCount">
<div class="countR">0</div> {# <div class="countR">0</div>#}
<div class="countG">{{ all_project_count }}</div> <div class="countG">{{ contractor|get_project_message_count }}</div>
</div> </div>
</li> </li>

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

@ -6,13 +6,13 @@
{% csrf_token %} {% csrf_token %}
<div class="textAreaBlock2 text-nn box-sizing disTab"> <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 }}" <input type="text" class="box-sizing" name="{{ worksell_form.name.html_name }}"
value="{{ worksell_form.name.value }}"> value="{{ worksell_form.name.value }}">
</div> </div>
<div class="textAreaBlock2 text-nn box-sizing disTab"> <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> <textarea name="{{ worksell_form.description.html_name }}" id="text-new">{{ worksell_form.description.value }}</textarea>
</div> </div>

@ -1,10 +1,13 @@
import math
from django import template
from django.db.models import Q
from chat.models import NewMessage 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 reviews.models import Review
from projects.models import Order from projects.models import Order
register = template.Library() register = template.Library()
@ -105,3 +108,13 @@ def get_customer_chat_open_projects(user):
return count 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.forms import WorkSellForm
from work_sell.models import WorkSell, Picture from work_sell.models import WorkSell, Picture
from .helpers import get_projects_grouped
from .forms import ( from .forms import (
ContractorFilterForm, ContractorFilterForm,
CustomerProfileProjectRealtyForm, 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): class UserProfileEditView(BaseMixin, View):
form_class = UserProfileEditForm form_class = UserProfileEditForm
template_name = 'user_profile_edit.html' template_name = 'user_profile_edit.html'
@ -220,7 +195,6 @@ class ContractorFilterView(BaseMixin, View):
build_classif = form.cleaned_data.get('building_classification') build_classif = form.cleaned_data.get('building_classification')
constr_type = form.cleaned_data.get('construction_type') constr_type = form.cleaned_data.get('construction_type')
party_types = form.cleaned_data.get('party_types') party_types = form.cleaned_data.get('party_types')
last_party_types = form.cleaned_data.get('last_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['open_project_count'] = len(private_open_projects) + len(team_open_projects)
context['archived_project_count'] = len(private_archived_projects) + len(team_archived_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')) 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()))) 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['open_project_count'] = len(private_open_projects) + len(team_open_projects)
context['archived_project_count'] = len(private_archived_projects) + len(team_archived_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 = [] team_ids = []
if request.user.is_owner_team(): if request.user.is_owner_team():
team_ids.append(request.user.team.pk) 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['open_project_count'] = len(private_open_projects) + len(team_open_projects)
context['archived_project_count'] = len(private_archived_projects) + len(team_archived_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('owner') == 'private':
if request.GET.get('archived') == 'on': if request.GET.get('archived') == 'on':
projects = private_archived_projects projects = private_archived_projects
@ -696,9 +657,6 @@ class CustomerProfileCurrentProjectsView(BaseMixin, View):
customer = get_object_or_404(User.customer_objects, pk=kwargs.get('pk')) 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) 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') # trashed_projects = customer.customer_projects.filter(state='trashed')
paginator = Paginator(projects, settings.PAGE_SIZE) paginator = Paginator(projects, settings.PAGE_SIZE)

Loading…
Cancel
Save