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;
}
.desPro li a:hover {
text-decoration: underline !important;
}
.textPro {
width: 100%;
float: left;
@ -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;
}

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