PR-14 Модификация шапки аккаунт Исполнителя, иконку в личку

реализованы счетчики сообщений
изменен дизайн header'а
доработано изменение статуса Order на process
remotes/origin/PR-46
booblegum 9 years ago
parent 2aefad6a99
commit ae875b576f
  1. 1
      archilance/settings/base.py
  2. BIN
      assets/img/icons/icon_hands.png
  3. BIN
      assets/img/icons/icon_hands_red.png
  4. BIN
      assets/img/icons/icon_speach-ball.png
  5. BIN
      assets/img/icons/icon_speach-ball_red.png
  6. 10
      assets/js/chat.js
  7. 75
      chat/templates/chat_contractor.html
  8. 45
      chat/templates/chat_customer.html
  9. 56
      chat/templates/inc-contact-card.html
  10. 0
      common/templatetags/__init__.py
  11. 6
      common/templatetags/common_tags.py
  12. 26
      context_processors/user_info.py
  13. 2
      projects/signals.py
  14. 19
      projects/views.py
  15. 1
      reviews/signals.py
  16. 1
      templates/home.html
  17. 41
      templates/partials/base.html
  18. 63
      templates/partials/header.html
  19. 80
      templates/partials/sass/header.sass
  20. 2
      users/templates/templatetags/user_new_count.html
  21. 2
      users/templates/templatetags/user_new_count_orders.html
  22. 31
      users/templatetags/user_tags.py
  23. 2
      wallets/models.py
  24. 6
      wallets/views.py

@ -118,6 +118,7 @@ TEMPLATES = [
'django.core.context_processors.request',
'social.apps.django_app.context_processors.backends',
'social.apps.django_app.context_processors.login_redirect',
'context_processors.user_info.user_info'
],
# Load these templatetags by default:

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

@ -113,6 +113,13 @@ var socket = new SocketHandler();
var csrftoken = getCookie('csrftoken');
function updateCounts() {
var my_office = $('#my_office');
var all_messages = $('.js-all-messages');
my_office.html('0');
all_messages.html('0');
}
$(function () {
function dialog (message, yesCallback, notCallback) {
$("#dialog_delete .modal-title").html(message);
@ -147,6 +154,9 @@ function dialog (message, yesCallback, notCallback) {
break;
case 'tab2':
console.log("tab2");
// /api/message?recipent__id=5
updateCounts();
setTimeout(function () {
if (liveHash.indexOf("#order") == 0) {
var ordHashId = liveHash.replace("#order", "");

@ -17,15 +17,18 @@
<ul class="nav nav-tabs nav-justified">
<li role="presentation">
<a href="#tab1" data-toggle="tab">Личные<span class="count-tab" id="count-tab-contact">{{ contacts_users_count }}</span></a>
<a href="#tab1" data-toggle="tab">Личные<span class="count-tab"
id="count-tab-contact">{{ contacts_users_count }}</span></a>
</li>
<li role="presentation">
<a href="#tab2" data-toggle="tab">Заказчики<span class="count-tab" id="count-tab-order">{{ orders_ms_count }}</span></a>
<a href="#tab2" data-toggle="tab">Заказчики<span class="count-tab"
id="count-tab-order">{{ orders_ms_count }}</span></a>
</li>
<li role="presentation">
<a href="#tab3" data-toggle="tab">Исполнители,Группы<span class="count-tab" id="count-tab-team">{{ teams_ms_count }}</span></a>
<a href="#tab3" data-toggle="tab">Исполнители,Группы<span class="count-tab"
id="count-tab-team">{{ teams_ms_count }}</span></a>
</li>
</ul>
@ -40,29 +43,7 @@
<div class="messageBlock box-sizing disTab">
<p>Контакты</p>
{% for contact in contacts_users %}
<div class="message messd user-block" id="userBlock{{ contact.pk }}" data-id="{{ contact.pk }}">
<div class="imgMess">
{% thumbnail contact.avatar "60x60" crop="center" as im %}
<img src="{{ im.url }}" alt="mess-image">
{% endthumbnail %}
</div>
<p class="nameMess">
{% if contact.is_contractor %}
{% url "users:contractor-profile" pk=contact.pk as contact_url %}
{% else %}
{% url "users:customer-profile-open-projects" pk=contact.pk as contact_url %}
{% endif %}
<div><a href="{{ contact_url }}" style="color:black;">{{ contact.username }}</a></div>
</p>
<a href="#" data-id="{{ contact.id }}" class="conMess">Контакты</a>
<span class="contact-count-{{ contact.pk|add:request.user.pk }}">
{% get_new_count_for_contact contact request.user %}</span>
<a href="#" class="deleteMess" data-recipent-id="{{ contact.pk }}">
Удалить контакт
</a>
</div>
{% include 'inc-contact-card.html' %}
{% endfor %}
</div>
@ -74,7 +55,8 @@
<input type="hidden" value="{{ request.user.pk }}" name="senderId" id="senderContactId"/>
<input type="hidden" value="" name="recipentId" id="recipentContactId"/>
<textarea id="chat" name="chat_message" class="box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя отправить</p>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
отправить</p>
<div class="bunChat">
<div class="setChat box-sizing upload">
@ -101,7 +83,8 @@
</ul>
<form id="add-form-contractor-note">
<p>Для заметок</p>
<input type="hidden" name="sender" id="senderNoteContractor" value="{{ request.user.pk }}"/>
<input type="hidden" name="sender" id="senderNoteContractor"
value="{{ request.user.pk }}"/>
<input type="hidden" name="recipent" id="recipentNoteContractor" value=""/>
<textarea id="chat2" name="text"></textarea>
@ -123,12 +106,15 @@
<p>Заказы</p>
{% for order in orders %}
<div class="orderBlock box-sizing order-block" data-project-id="{{ order.project.id }}"
id="orderBlock{{ order.id }}" data-team-id="{% if order.team %}{{ order.team.pk }}{% else %}0{% endif %}" data-recipent-id="{{ order.project.customer.pk }}" data-id="{{ order.id }}">
id="orderBlock{{ order.id }}"
data-team-id="{% if order.team %}{{ order.team.pk }}{% else %}0{% endif %}"
data-recipent-id="{{ order.project.customer.pk }}" data-id="{{ order.id }}">
<span class="dimovChat"></span>
<p class="titleOB">{{ order }}</p>
<div class="hideOBB">
<p class="pOB">
<span style="display: none;" class="order-count-{{ order.id }}">{% get_new_count_for_order request.user order.id %}</span>
<span style="display: none;"
class="order-count-{{ order.id }}">{% get_new_count_for_order request.user order.id %}</span>
<span>Исполнитель:</span> {{ request.user.get_full_name }}</p>
<a href="#" class="linkChat11 full-order-info">
@ -163,7 +149,8 @@
</span>
</p>
<a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
<span class="glyphicon glyphicon-info-sign"
aria-hidden="true"></span>
Полное описание заказа
</a>
</div>
@ -183,7 +170,8 @@
<input type="hidden" id="senderId" name="senderId" value="{{ request.user.pk }}">
<input type="hidden" id="recipentId" name="recipentId" value="">
<textarea id="chat" class="box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя отправить</p>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
отправить</p>
<div class="bunChat">
<div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-order">
@ -280,7 +268,8 @@
<p>Заказы</p>
{% for torder in team_orders %}
<div class="team-order-block orderBlock box-sizing" id="teamOrderBlock{{ torder.pk }}"
data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk }}" data-id="{{ torder.pk }}">
data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk }}"
data-id="{{ torder.pk }}">
<span class="dimovChat"></span>
<p class="titleOB">
{{ torder }}
@ -288,7 +277,8 @@
<div class="hideOBB disTab">
<p class="pOB">
<span style="display: none;" class="teamorder-count-{{ torder.team.id }}">{% get_new_count_for_team request.user torder.team.id torder.pk %}</span>
<span style="display: none;"
class="teamorder-count-{{ torder.team.id }}">{% get_new_count_for_team request.user torder.team.id torder.pk %}</span>
<span>Исполнитель:</span> {{ torder.team.name }}
</p>
<ul class="listChat1">
@ -300,7 +290,7 @@
<span>Чаты:</span>
{% if request.user.pk != torder.team.owner.pk %}
<span class="team-chat-user"
data-id="{{ torder.team.owner.pk}}">{{ torder.team.owner.username }}</span>
data-id="{{ torder.team.owner.pk }}">{{ torder.team.owner.username }}</span>
{% endif %}
{% for tuser in torder.team.contractors.all %}
{% if request.user.pk != tuser.pk %}
@ -318,14 +308,16 @@
{% endfor %}
{% for yteam in your_teams %}
<div class="team-block orderBlock box-sizing" id="teamMyBlock{{ yteam.pk }}" data-team-id="{{ yteam.pk }}">
<div class="team-block orderBlock box-sizing" id="teamMyBlock{{ yteam.pk }}"
data-team-id="{{ yteam.pk }}">
<span class="dimovChat"></span>
<p class="titleOB">
{{ yteam }}
</p>
<div class="hideOBB disTab">
<p class="pOB">
<span style="display: none;" class="team-count-{{ yteam.id }}">{% get_new_count_for_team request.user yteam.id %}</span>
<span style="display: none;"
class="team-count-{{ yteam.id }}">{% get_new_count_for_team request.user yteam.id %}</span>
<span>Владелец группы:</span> {{ yteam.owner }}
</p>
<ul class="listChat1">
@ -336,11 +328,13 @@
<p class="pOB">
<span>Чаты:</span>
{% if request.user.pk != torder.team.owner.pk %}
<span class="team-chat-user" data-id="{{ yteam.owner.pk}}">{{ yteam.owner.username }}</span>
<span class="team-chat-user"
data-id="{{ yteam.owner.pk }}">{{ yteam.owner.username }}</span>
{% endif %}
{% for tuser in yteam.contractors.all %}
{% if request.user.pk != tuser.pk %}
<span class="team-chat-user" data-id="{{ tuser.pk }}">{{ tuser.username }} </span>
<span class="team-chat-user"
data-id="{{ tuser.pk }}">{{ tuser.username }} </span>
{% endif %}
{% endfor %}
</p>
@ -361,7 +355,8 @@
<input type="hidden" name="team_ids" id="teamIds">
<input type="hidden" name="document-send" id="documentSendIds">
<textarea id="chatText" class="chat-textarea box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя отправить</p>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
отправить</p>
<div class="bunChat">
<div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-team">

@ -35,35 +35,7 @@
<div class="messageBlock box-sizing disTab">
<p>Контакты</p>
{% for contact in contacts_users %}
<div class="message messd user-block" id="userBlock{{ contact.pk }}"
data-id="{{ contact.pk }}">
<div class="imgMess">
{% if contact.avatar %}
{% thumbnail contact.avatar "60x60" crop="center" as im %}
<img src="{{ im.url }}" alt="mess-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="mess-image">
{% endif %}
</div>
<p class="nameMess">
{% if contact.is_contractor %}
{% url "users:contractor-profile" pk=contact.pk as contact_url %}
{% else %}
{% url "users:customer-profile-open-projects" pk=contact.pk as contact_url %}
{% endif %}
<div><a href="{{ contact_url }}">{{ contact.username }}</a></div>
</p>
<a href="#" data-id="{{ contact.id }}" class="conMess">Контакты</a>
<span class="contact-count-{{ contact.pk|add:request.user.pk }}">
{% get_new_count_for_contact contact request.user %}
</span>
<a href="#" class="deleteMess" data-recipent-id="{{ contact.pk }}">
Удалить контакт
</a>
</div>
{% include 'inc-contact-card.html' %}
{% endfor %}
</div>
@ -127,7 +99,8 @@
<p>Заказы</p>
{% for order in orders %}
<div class="orderBlock box-sizing order-block"
data-team-id="{% if order.order.team %}{{ order.order.team.pk }}{% else %}0{% endif %}"
data-team-id="
{% if order.order.team %}{{ order.order.team.pk }}{% else %}0{% endif %}"
data-project-id="{{ order.id }}"
id="orderBlock{{ order.order.id }}"
data-secure-deal="{% if order.order.secure %}true{% else %}false{% endif %}"
@ -140,7 +113,8 @@
<p class="titleOB">{{ order }}</p>
<div class="hideOBB">
<p class="pOB">
<span style="display: none;" class="order-count-{{ order.order.id }}">{% get_new_count_for_order request.user order.order.id %}</span>
<span style="display: none;"
class="order-count-{{ order.order.id }}">{% get_new_count_for_order request.user order.order.id %}</span>
<span>Исполнитель:</span>
{% if order.order.contractor %}
{{ order.order.contractor.get_full_name }}
@ -152,9 +126,9 @@
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
</a>
{# <a href="#" class="deleteOrder" data-project-id="{{ order.pk }}">#}
{# Удалить заказ#}
{# </a>#}
{# <a href="#" class="deleteOrder" data-project-id="{{ order.pk }}">#}
{# Удалить заказ#}
{# </a>#}
</div>
</div>
@ -184,7 +158,8 @@
</span>
</p>
<a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
<span class="glyphicon glyphicon-info-sign"
aria-hidden="true"></span>
Полное описание заказа
</a>
</div>

@ -0,0 +1,56 @@
{% load thumbnail %}
{% load static %}
{% load user_tags %}
<style>
div.icon_mm1 {
display: inline-block;
height: 20px;
width: 20px;
margin-right: 5px;
background-size: cover;
background: url('/static/img/menu2.png') no-repeat 0 0;
}
div.icon_mm2 {
display: inline-block;
height: 20px;
width: 20px;
margin-right: 5px;
background-size: cover;
background: url('/static/img/menu2.png') no-repeat 0 -20px;
}
</style>
<div class="message messd user-block" id="userBlock{{ contact.pk }}" data-id="{{ contact.pk }}">
<div class="imgMess">
{% if contact.avatar %}
{% thumbnail contact.avatar "60x60" crop="center" as im %}
<img src="{{ im.url }}" alt="mess-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="mess-image">
{% endif %}
</div>
<p class="nameMess">
{% if contact.is_contractor %}
{% url "users:contractor-profile" pk=contact.pk as contact_url %}
{% else %}
{% url "users:customer-profile-open-projects" pk=contact.pk as contact_url %}
{% endif %}
<div style="display: flex; align-items: center">
{% if request.user.is_contractor %}
<div class="icon_mm1"></div>
{% else %}
<div class="icon_mm2"></div>
{% endif %}
<a href="{{ contact_url }}" style="color:black;">{{ contact.username }}</a>
</div>
</p>
<a href="#" data-id="{{ contact.id }}" class="conMess">Контакты</a>
<span class="contact-count-{{ contact.pk|add:request.user.pk }}">
{% get_new_count_for_contact contact request.user %}</span>
<a href="#" class="deleteMess" data-recipent-id="{{ contact.pk }}">
Удалить контакт
</a>
</div>

@ -148,4 +148,10 @@ def get(dic, key):
return dic.get(key)
@register.filter
def max_count(value, max_value):
if value > max_value:
return '99+'
return str(value)
# import code; code.interact(local=dict(globals(), **locals()))

@ -0,0 +1,26 @@
# from django.core.context_processors import request
from django.db.models import Sum
from wallets.models import InvoiceHistory
from chat.models import NewMessage
from projects.models import Order
def user_info(request):
if request.user.is_authenticated():
current_sum_info = InvoiceHistory.objects.filter(user=request.user, type="score").aggregate(Sum('sum'))
user_balance = current_sum_info['sum__sum'] or 0
new_messages_count = NewMessage.objects.filter(user=request.user).count()
num_orders_in_work = request.user.orders.filter(status='process').count()
try:
fist_order_id = request.user.orders.all()[0].id
except IndexError:
fist_order_id = ""
return {
"user_balance": user_balance,
"new_messages_count": new_messages_count,
"num_orders_in_work": num_orders_in_work,
"fist_order_id": fist_order_id
}
return {}

@ -2,7 +2,7 @@ from django.db.models.signals import post_save
from django.dispatch import receiver
from django.utils import timezone
from .models import Stage
from .models import Stage, Order
@receiver(post_save, sender=Stage)

@ -116,6 +116,7 @@ class ProjectDetailWithAnswerView(BaseMixin, View):
return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
# @Отклик на Проект(Project)
if request.user.is_authenticated() and request.user.is_contractor():
context = self.get_context_data(**kwargs)
answer_as_team = None
@ -138,6 +139,7 @@ class ProjectDetailWithAnswerView(BaseMixin, View):
else:
form = self.form_class(request.POST, request=request, project=project)
# FIXME: еще раз находим проект?
project = get_object_or_404(Project, pk=kwargs.get('pk'))
context.update({'project': project})
@ -521,13 +523,15 @@ class CustomerProjectCreateView(BaseMixin, View):
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, request=request) # Passing `request.FILES` seems unnecessary here. Files are added manually below
# print('POST = ', request.POST)
print('POST = ', request.POST)
form.is_valid()
realty = form.cleaned_data.get('realty')
if realty:
print("Has Realty")
realty_form = self.realty_form(request.POST, instance=realty, request=request, prefix='realty_form')
else:
print("Create new Realty")
realty_form = self.realty_form(request.POST, request=request, prefix='realty_form')
if form.is_valid() and realty_form.is_valid():
@ -546,13 +550,13 @@ class CustomerProjectCreateView(BaseMixin, View):
for file in request.FILES.getlist('new_files'):
ProjectFile.objects.create(file=file, project=project)
if realty:
realty_form.save()
else:
if not realty:
realty = realty_form.save(commit=False)
realty.user = user
if not request.POST.get('new_realty_name'):
print("Virtual!")
realty.is_virtual = True
print("Set realty name -->", request.POST.get('new_realty_name'))
realty.name = request.POST.get('new_realty_name')
realty.save()
realty_form.save_m2m()
@ -848,6 +852,7 @@ class CustomerOfferOrderView(View):
template_name = 'chattest.html'
def post(self, request, *args, **kwargs):
# @ Утверждение Исполнителя
project_id = kwargs.get('project_id')
answer_id = kwargs.get('answer_id')
try:
@ -864,10 +869,12 @@ class CustomerOfferOrderView(View):
if not order.contractor and not order.team:
if isinstance(answer.author, User):
order.contractor = answer.author
order.save()
status = True
# order.status = 'process'
# order.save()
# status = True
elif isinstance(answer.author, Team):
order.team = answer.author
order.status = 'process'
order.save()
status = True
if status:

@ -23,6 +23,7 @@ def add_rating_review(sender, instance, created, **kwargs):
hs_rating.save()
count_reviews = Review.objects.filter(project=instance.project).count()
print("count_reviews = ", count_reviews)
if count_reviews == 2:
order = instance.project.order
order.status = 'completed'

@ -140,6 +140,7 @@
<script src='{% static "js/bootstrap.min.js" %}'></script>
{% endblock %}
{% block js_block %}
{{ block.super }}
<script src='{% static "js/jquery.magnific-popup.js" %}'></script>
<script src='{% static "js/build/home_page.js" %}'></script>
{% endblock %}

@ -14,7 +14,6 @@
{# {% compress css %}#}
{% block old_css %}
<link rel='stylesheet' href='{% static "css/reset.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery-ui/jquery-ui.css" %}'>
<link rel='stylesheet' href='{% static "css/bootstrap.css" %}'>
<link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'>
<link rel='stylesheet' href='{% static "lib/bootstrap-select/css/bootstrap-select.css" %}'>
@ -22,13 +21,14 @@
<link rel='stylesheet' href='{% static "css/swiper.min.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery.fileupload/css/jquery.fileupload.css" %}'>
<link rel='stylesheet' href='{% static "js/magnific-popup.css" %}'>
<link rel="stylesheet" href='{% static "lib/jquery-jgrowl/jquery.jgrowl.min.css" %}'>
<link rel='stylesheet' href='{% static "css/main.css" %}'>
<link rel='stylesheet' href='{% static "css/extra.css" %}'> <!-- Our additional CSS -->
{% endblock %}
{% block common_css %}
<link rel='stylesheet' href='{% static "css/bootstrap.css" %}'>
<link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'>
<link rel="stylesheet" href='{% static "lib/jquery-jgrowl/jquery.jgrowl.min.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery-ui/jquery-ui.css" %}'>
{% endblock %}
{% block head_css %}
@ -76,7 +76,7 @@
{% block common_js %}
<script src='{% static "js/jquery-2.2.3.min.js" %}'></script>
{# <script src='{% static "js/bootstrap.min.js" %}'></script>#}
{# <script src='{% static "js/bootstrap.min.js" %}'></script>#}
{% endblock %}
{#{% compress js %}#}
{% block old_js %}
@ -98,21 +98,44 @@
<script src='{% static "js/jquery.magnific-popup.min.js" %}'></script>
<script src='{% static "lib/jquery.cookie/jquery.cookie.min.js" %}'></script>
<script src='{% static "lib/jquery-jgrowl/jquery.jgrowl.min.js" %}'></script>
<script src='{% static "my-libs.js" %}'></script>
<script src='{% static "js/main.js" %}'></script> <!-- Файл верстальщика -->
<script src='{% static "index.js" %}'></script> <!-- Файл программистов -->
{% endblock %}
{% block ws_block %}
<script src='{% static "lib/jquery-jgrowl/jquery.jgrowl.min.js" %}'></script>
<script>
function getOpenOrdersList() {
$.ajax({
url: '/api/orders?status=created',
type: 'get',
success: function (data) {
$.each(data.results, function (key, value) {
open_order_list.push(parseInt(value.id))
})
}
})
}
function message_count_plus(selector) {
var all_messages = $(selector);
var count = parseInt(all_messages.html()) + 1;
if (count > 99) count = '99+';
all_messages.html(count);
}
var SocketHandlerMain = function (userId) {
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
var queryString = '{{ request.get_full_path }}';
if ((queryString.indexOf('/chat') != 0) && (queryString.indexOf('/users/contractor-office/work-projects') != 0)) {
domain = domain.replace(':' + port, '');
domain = domain.replace(':' + port, ':8888');
if (window.location.protocol == 'https:') {
var ws = "wss://";
} else {
@ -130,12 +153,18 @@
sock.onmessage = function (event) {
var notificationData = JSON.parse(event.data);
if (open_order_list.indexOf(parseInt(notificationData.order_id)) != -1) {
{# console.log("in");#}
message_count_plus('#my_office');
}
message_count_plus('.js-all-messages');
var outMessage = "";
if (notificationData.answer_type == 'add_message_contact') {
outMessage += "<a href='/chat/?user_id=" + notificationData.sender_id + "'>" + notificationData.msg + "<a>";
} else if ((notificationData.answer_type == 'approve_stages') || (notificationData.answer_type == 'add_message_order')) {
outMessage += "<a href='/chat/#order" + notificationData.order_id + "'>" + notificationData.msg + "<a>";
}
console.log("Вам пришло новое сообщение!<br />" + outMessage);
$.jGrowl("Вам пришло новое сообщение!<br />" + outMessage, {life: 15000});
};
this.add_message = function (messageData) {
@ -147,6 +176,8 @@
var userId = '{{ request.user.pk }}';
if (userId) {
var socketMain = new SocketHandlerMain(userId);
var open_order_list = [];
getOpenOrdersList();
}
</script>
{% endblock %}

@ -3,6 +3,7 @@
{% load user_tags %}
{% load activeurl %}
{% load sass_tags %}
{% load common_tags %}
{% if request.user.is_contractor %}
{% url 'users:contractor-profile' pk=request.user.pk as profile_url %}
@ -15,13 +16,16 @@
<div class="wrTop {% if request.user.is_authenticated %} disTab {% endif %}">
<div class="container-fluid topMain">
<div class="row">
<div class="col-lg-3">
<a href="/"><div class="logo"></div></a>
<div style="float: left">
<a href="/">
<div class="logo"></div>
</a>
</div>
{% activeurl %}
<div style="height: 100%; display: inline-block; text-align: center">
{% if request.user.is_authenticated %}
<div class="col-lg-7">
<ul class="mainMenu">
<li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
@ -35,6 +39,10 @@
</a>
<span></span>
</li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a>
<span></span>
</li>
{% endif %}
{% if request.user.is_customer %}
@ -43,14 +51,13 @@
<span></span>
</li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Работы на продажу</a>
<a href="{% url 'work_sell:list' %}">Готовые проекты</a>
<span></span>
</li>
{% endif %}
</ul>
</div>
<div style="clear: both"></div>
{% else %}
<div class="col-lg-7">
<ul class="mainMenu">
<li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
@ -61,17 +68,16 @@
<span></span>
</li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Работы на продажу</a>
<a href="{% url 'work_sell:list' %}">Готовые проекты</a>
<span></span>
</li>
</ul>
</div>
{% endif %}
</div>
{% endactiveurl %}
<div style="float: right">
{% if request.user.is_authenticated %}
<div class="col-lg-2">
{% if request.user.is_contractor %}
{% contractor_indicator request.user %}
{% endif %}
@ -103,11 +109,12 @@
Профиль<span></span>
</a>
</li>
<li class="icon_mm3">
<a href="{% url 'chat:chat-user' %}">Сообщения<span></span>
<li class="icon_chat">
<a href="{% url 'chat:chat-user' %}">Сообщения<span></span></a>
{% if request.user %}
{% count_new_message request.user %}
{% endif %}</a>
<div class="circle js-all-messages">{{ new_messages_count| max_count:99 }}</div>
{# {% count_new_message request.user %}#}
{% endif %}
</li>
<li class="icon_mm4">
<a href="{% url 'wallets:score-detail' pk=request.user.pk %}">Счет<span></span></a>
@ -119,10 +126,15 @@
<li class="icon_mm6">
<a href="/pages/faq">FAQ<span></span></a>
</li>
{% if request.user.is_contractor %}
<li class="icon_mm2">
<a href="{% url 'auth_logout' %}">Выйти<span></span></a>
</li>
{% else %}
<li class="icon_mm7">
<a href="{% url 'auth_logout' %}">Выйти<span></span></a>
</li>
{% endif %}
</ul>
</div>
@ -150,14 +162,25 @@
</a>
{% endif %}
</div>
{% if request.user.is_contractor %}
<div class="user-info">
<a href="{% url 'wallets:score-detail' pk=request.user.pk %}"
class="cash">{{ user_balance|floatformat:2 }}р</a>
<a href="{% url 'chat:chat-user' %}#order{{ fist_order_id }}"
class="icon_hand">{{ num_orders_in_work }}</a>
<a href="{% url 'chat:chat-user' %}" class="icon_chat js-all-messages">
{{ new_messages_count| max_count:99 }}
</a>
</div>
{% endif %}
{% else %}
<div class="col-lg-2">
<a href="{% url 'registration_register' %}" class="reg">Регистрация</a>
<a href="{% url 'auth_login' %}"><div class="lock"></div></a>
</div>
<a href="{% url 'auth_login' %}">
<div class="lock"></div>
</a>
{% endif %}
</div>
</div>
</div>
</div>

@ -7,14 +7,61 @@
.topMain
width: 1200px
margin: 0 auto
color: #ffffff
.dropdown-menu > li > a
display: inline-block
.col-lg-7
width: 55%
.col-lg-2
width: 19%
.mainMenu li
cursor: pointer
padding-right: 25px
a
font-size: 15px
//&:hover
cursor: pointer
.user-info
float: right
height: 100%
a
display: block
color: white
cursor: pointer
&:hover
text-decoration: none
color: #FF0029
.cash
text-align: right
padding-top: 4px
.icon_hand
padding-left: 26px
background:
image: url("#{$static}/img/icons/icon_hands.png")
size: 24px 24px
repeat: no-repeat
&:hover
background-image: url("#{$static}/img/icons/icon_hands_red.png")
.icon_chat
margin-top: 4px
padding-left: 26px
background:
image: url("#{$static}/img/icons/icon_speach-ball.png")
size: 18px 18px
repeat: no-repeat
&:hover
background-image: url("#{$static}/img/icons/icon_speach-ball_red.png")
.circle
background-color: red
border-radius: 50%
width: 30px
height: 30px
line-height: 30px
display: inline-block
text-align: center
//align-items: center
.welcomeMain
width: 100%
@ -41,6 +88,7 @@
.mainMenu
float: left
margin: 26px 0 0 0
padding-left: 60px
li
float: left
position: relative
@ -161,14 +209,16 @@
&.icon_tm3.active span
background: url('#{$static}/img/listMain2.png') no-repeat right !important
li.officeList.icon_tml > a > p
li.officeList.icon_tml > a > .count
display: inline-block
padding: 5px 7px 3px 7px
background: #ff0000
border-radius: 35px
position: absolute
right: -34px
top: -4px
color: red
font-family: 'pfbeausanspro-reg', sans-serif
//padding: 5px 7px 3px 7px
background: none
border-radius: 0
position: inherit
//right: -34px
//top: -4px
.reg, .reg:link, .reg:visited
color: #fb1818
@ -191,7 +241,8 @@ li.officeList.icon_tml > a > p
width: 75px
height: 75px
float: right
margin: 0 0 0 -60px
margin: 0
padding-left: 5px
img
display: block
width: 100%
@ -282,6 +333,13 @@ li.officeList.icon_tml > a > p
height: 20px
background-size: contain
background: url('#{$static}/img/user-5.png') no-repeat 0 0
.icon_chat a span
height: 20px
background:
image: url("#{$static}/img/icons/icon_speach-ball.png")
size: contain
repeat: no-repeat
.icon_mm1 a:hover span
height: 20px
background: url('#{$static}/img/menu2.png') no-repeat center !important
@ -315,3 +373,9 @@ li.officeList.icon_tml > a > p
height: 20px
background-size: contain
background: url('#{$static}/img/user-4.png') no-repeat 0 0
.icon_chat a:hover span
height: 20px
background:
image: url("#{$static}/img/icons/icon_speach-ball_red.png")
size: contain
repeat: no-repeat

@ -1 +1 @@
<span class="badge badge-count">{{ new_count }}</span>
<div class="circle">{{ new_count }}</div>

@ -1 +1 @@
<p>{{ new_count }}</p>
<div id="my_office" class="count">{{ new_count }}</div>

@ -10,7 +10,6 @@ from projects.models import Order
from reviews.models import Review
from users.helpers import get_projects_grouped
register = template.Library()
@ -50,7 +49,13 @@ def count_new_message(context, user):
@register.inclusion_tag('templatetags/user_new_count_orders.html', takes_context=True)
def count_new_message_orders(context, user):
new_count = NewMessage.objects.filter(user=user, message__order__in=user.orders.all(),
"""
:param context:
:param user:
:return:
"""
new_count = NewMessage.objects.filter(user=user, message__order__in=user.orders.filter(status='created'),
message__team__isnull=True).count()
try:
team = user.team
@ -58,23 +63,30 @@ def count_new_message_orders(context, user):
team = None
if team:
new_count_team = NewMessage.objects.filter(user=user, message__order__in=user.team.orders.all(),
new_count_team = NewMessage.objects.filter(user=user,
message__order__in=user.team.orders.filter(status='created'),
message__team__isnull=True).count()
new_count += new_count_team
if new_count > 99:
new_count = '99+'
return {
'new_count': new_count,
}
@register.simple_tag
def get_new_count_message(team_pk,user=None):
def get_new_count_message(team_pk, user=None):
count = NewMessage.objects.filter(user=user, message__team=team_pk, message__order__isnull=True).count()
return count
@register.simple_tag
def get_new_count_for_contact(contact, current_user):
count = current_user.new_messages.filter(message__sender=contact, message__order__isnull=True, message__team__isnull=True).count()
count = current_user.new_messages.filter(message__sender=contact, message__order__isnull=True,
message__team__isnull=True).count()
if count > 99:
new_count = '99+'
return count
@ -114,13 +126,16 @@ def get_customer_chat_open_projects(user):
@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)
projects = user.customer_projects.filter(state='active').exclude(order__contractor__isnull=True,
order__team__isnull=True)
return projects.aggregate(c=Count('answers__messages'))['c']
elif user.is_contractor():
message_count = user.contractor_answers.filter(project__state='active', rejected=False).aggregate(c=Count('messages'))['c']
message_count = \
user.contractor_answers.filter(project__state='active', rejected=False).aggregate(c=Count('messages'))['c']
if util.has_related(user, 'team'):
message_count += user.team.answers.filter(project__state='active', rejected=False).aggregate(c=Count('messages'))['c']
message_count += \
user.team.answers.filter(project__state='active', rejected=False).aggregate(c=Count('messages'))['c']
return message_count

@ -41,7 +41,7 @@ class InvoiceHistory(models.Model):
current_sum_info = InvoiceHistory.objects.filter(user=self.user, type="score").aggregate(Sum('sum'))
current_sum = current_sum_info['sum__sum'] or 0
if self.type == "score":
self.balance = current_sum + self.sum
self.balavoids_atnce = current_sum + self.sum
else:
self.balance = current_sum
super().save(*args, **kwargs)

@ -76,15 +76,15 @@ class ScoreView(LoginRequiredMixin, View):
template_name = 'score-detail.html'
def get(self, request, *args, **kwargs):
# transaction = Transaction.objects.get_or_create(customer=request.user, complete=False)
transaction = Transaction.objects.get_or_create(customer=request.user, type='add', complete=False)
transaction, created = Transaction.objects.get_or_create(customer=request.user, type='add', complete=False)
# transaction = Transaction.objects.filter(customer=request.user, type='add', complete=False)
user_score = get_object_or_404(User.objects, pk=kwargs.get('pk'))
current_sum_info = InvoiceHistory.objects.filter(user=user_score, type="score").aggregate(Sum('sum'))
user_score_balance = current_sum_info['sum__sum'] or 0
form = WithDrawForm
return render(request, self.template_name, {
'transaction': transaction[0],
'transaction': transaction,
'YANDEX_MONEY': settings.YANDEX_MONEY,
'user_score': user_score,
'user_score_balance': user_score_balance,

Loading…
Cancel
Save