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. 387
      chat/templates/chat_contractor.html
  8. 73
      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. 23
      projects/views.py
  15. 1
      reviews/signals.py
  16. 1
      templates/home.html
  17. 41
      templates/partials/base.html
  18. 125
      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. 35
      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', 'django.core.context_processors.request',
'social.apps.django_app.context_processors.backends', 'social.apps.django_app.context_processors.backends',
'social.apps.django_app.context_processors.login_redirect', 'social.apps.django_app.context_processors.login_redirect',
'context_processors.user_info.user_info'
], ],
# Load these templatetags by default: # 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'); 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 () {
function dialog (message, yesCallback, notCallback) { function dialog (message, yesCallback, notCallback) {
$("#dialog_delete .modal-title").html(message); $("#dialog_delete .modal-title").html(message);
@ -147,6 +154,9 @@ function dialog (message, yesCallback, notCallback) {
break; break;
case 'tab2': case 'tab2':
console.log("tab2");
// /api/message?recipent__id=5
updateCounts();
setTimeout(function () { setTimeout(function () {
if (liveHash.indexOf("#order") == 0) { if (liveHash.indexOf("#order") == 0) {
var ordHashId = liveHash.replace("#order", ""); var ordHashId = liveHash.replace("#order", "");

@ -17,15 +17,18 @@
<ul class="nav nav-tabs nav-justified"> <ul class="nav nav-tabs nav-justified">
<li role="presentation"> <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>
<li role="presentation"> <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>
<li role="presentation"> <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> </li>
</ul> </ul>
@ -40,29 +43,7 @@
<div class="messageBlock box-sizing disTab"> <div class="messageBlock box-sizing disTab">
<p>Контакты</p> <p>Контакты</p>
{% for contact in contacts_users %} {% for contact in contacts_users %}
<div class="message messd user-block" id="userBlock{{ contact.pk }}" data-id="{{ contact.pk }}"> {% include 'inc-contact-card.html' %}
<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>
{% endfor %} {% endfor %}
</div> </div>
@ -74,12 +55,13 @@
<input type="hidden" value="{{ request.user.pk }}" name="senderId" id="senderContactId"/> <input type="hidden" value="{{ request.user.pk }}" name="senderId" id="senderContactId"/>
<input type="hidden" value="" name="recipentId" id="recipentContactId"/> <input type="hidden" value="" name="recipentId" id="recipentContactId"/>
<textarea id="chat" name="chat_message" class="box-sizing"></textarea> <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="bunChat">
<div class="setChat box-sizing upload"> <div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-contact"> <input type="file" name="file" id="upload-document-contact">
<p>Прикрепить файл</p> <p>Прикрепить файл</p>
</div> </div>
<div id="document-send-contact"></div> <div id="document-send-contact"></div>
<a id="contact-chat-add-message" href="#">отправить</a> <a id="contact-chat-add-message" href="#">отправить</a>
@ -89,29 +71,30 @@
<div class="col-lg-3 wrChat1"> <div class="col-lg-3 wrChat1">
<div class="col-lg-12 documentsChat"> <div class="col-lg-12 documentsChat">
<p>Прикрепленные документы</p> <p>Прикрепленные документы</p>
<ul id="documentSpace"> <ul id="documentSpace">
</ul> </ul>
<a href="{% url 'common:create' %}"> <a href="{% url 'common:create' %}">
Распечатать с помощью ресурса Распечатать с помощью ресурса
</a> </a>
</div> </div>
<div class="textAreaBlock2 box-sizing disTab"> <div class="textAreaBlock2 box-sizing disTab">
<ul class="contractor-notes-block"> <ul class="contractor-notes-block">
</ul> </ul>
<form id="add-form-contractor-note"> <form id="add-form-contractor-note">
<p>Для заметок</p> <p>Для заметок</p>
<input type="hidden" name="sender" id="senderNoteContractor" value="{{ request.user.pk }}"/> <input type="hidden" name="sender" id="senderNoteContractor"
<input type="hidden" name="recipent" id="recipentNoteContractor" value=""/> value="{{ request.user.pk }}"/>
<input type="hidden" name="recipent" id="recipentNoteContractor" value=""/>
<textarea id="chat2" name="text"></textarea> <textarea id="chat2" name="text"></textarea>
<a href="#" id="add-note-contractor">сохранить</a> <a href="#" id="add-note-contractor">сохранить</a>
</form> </form>
</div> </div>
<!-- order-info --> <!-- order-info -->
{% include 'contact-info.html' %} {% include 'contact-info.html' %}
<!-- --> <!-- -->
</div> </div>
</div> </div>
<!-- End block Tab1 --> <!-- End block Tab1 -->
@ -123,12 +106,15 @@
<p>Заказы</p> <p>Заказы</p>
{% for order in orders %} {% for order in orders %}
<div class="orderBlock box-sizing order-block" data-project-id="{{ order.project.id }}" <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> <span class="dimovChat"></span>
<p class="titleOB">{{ order }}</p> <p class="titleOB">{{ order }}</p>
<div class="hideOBB"> <div class="hideOBB">
<p class="pOB"> <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> <span>Исполнитель:</span> {{ request.user.get_full_name }}</p>
<a href="#" class="linkChat11 full-order-info"> <a href="#" class="linkChat11 full-order-info">
@ -143,17 +129,17 @@
{% if archive_orders %} {% if archive_orders %}
<div class="textAreaBlock2 FFD box-sizing disTab"> <div class="textAreaBlock2 FFD box-sizing disTab">
<a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a> <a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a>
</div> </div>
<p id="show-archive-label" style="display: none;">Архивные заказы</p> <p id="show-archive-label" style="display: none;">Архивные заказы</p>
<div id="archive-space" style="display:none;"> <div id="archive-space" style="display:none;">
<div id="trashed-orders"> <div id="trashed-orders">
{% for order in archive_orders %} {% for order in archive_orders %}
<div data-id="{{ order.id }}" class="trashedOrderBlock box-sizing"> <div data-id="{{ order.id }}" class="trashedOrderBlock box-sizing">
<span class="dimovChat"></span> <span class="dimovChat"></span>
<p class="titleOB"> {{ order.project.name }}</p> <p class="titleOB"> {{ order.project.name }}</p>
<div class="hideOBB"><p class="pOB"> <div class="hideOBB"><p class="pOB">
<span>Исполнитель: <span>Исполнитель:
{% if order.contractor %} {% if order.contractor %}
{{ order.contractor.get_full_name }} {{ order.contractor.get_full_name }}
@ -161,15 +147,16 @@
{{ order.team.name }} {{ order.team.name }}
{% endif %} {% endif %}
</span> </span>
</p> </p>
<a href="#" class="linkChat11 full-order-info"> <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> Полное описание заказа
</a>
</div>
</div> </div>
</div> {% endfor %}
{% endfor %} </div>
</div>
</div> </div>
{% endif %} {% endif %}
</div> </div>
@ -183,11 +170,12 @@
<input type="hidden" id="senderId" name="senderId" value="{{ request.user.pk }}"> <input type="hidden" id="senderId" name="senderId" value="{{ request.user.pk }}">
<input type="hidden" id="recipentId" name="recipentId" value=""> <input type="hidden" id="recipentId" name="recipentId" value="">
<textarea id="chat" class="box-sizing"></textarea> <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="bunChat">
<div class="setChat box-sizing upload"> <div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-order"> <input type="file" name="file" id="upload-document-order">
<p>Прикрепить файл</p> <p>Прикрепить файл</p>
</div> </div>
<div id="document-send-order"></div> <div id="document-send-order"></div>
@ -218,28 +206,28 @@
<div class="stepssBlock box-sizing disTab" id="completeWork"> <div class="stepssBlock box-sizing disTab" id="completeWork">
<p class="titleStepss">3 / Выполнение работы</p> <p class="titleStepss">3 / Выполнение работы</p>
<p class="textStepss"> <p class="textStepss">
Процесс выполнения задания в заказе до получения Процесс выполнения задания в заказе до получения
заказчиком итогового результата работы. заказчиком итогового результата работы.
</p> </p>
<div id="stagesWork" class="stages-work textAreaBlock2"> <div id="stagesWork" class="stages-work textAreaBlock2">
</div> </div>
</div> </div>
<div id="leaveReview" style="display: none;"> <div id="leaveReview" style="display: none;">
<div class="closeChat closeChat1"> <div class="closeChat closeChat1">
<a href="#" data-toggle="modal" data-target="#review-add" data-review-type="positive"> <a href="#" data-toggle="modal" data-target="#review-add" data-review-type="positive">
Закрыть проект<br>и оставить отзыв Закрыть проект<br>и оставить отзыв
</a> </a>
</div> </div>
<div class="closeChat closeChat2"> <div class="closeChat closeChat2">
<a href="#" data-toggle="modal" data-target="#review-add" data-review-type="negative"> <a href="#" data-toggle="modal" data-target="#review-add" data-review-type="negative">
Закрыть проект<br>и оставить отзыв Закрыть проект<br>и оставить отзыв
</a> </a>
</div> </div>
</div> </div>
<!-- Review add --> <!-- Review add -->
@ -250,12 +238,12 @@
<!-- --> <!-- -->
<div class="col-lg-12 documentsChat"> <div class="col-lg-12 documentsChat">
<p>Прикрепленные документы</p> <p>Прикрепленные документы</p>
<ul id="documentOrderSpace"></ul> <ul id="documentOrderSpace"></ul>
<a href="{% url 'common:create' %}"> <a href="{% url 'common:create' %}">
Распечатать с помощью ресурса Распечатать с помощью ресурса
</a> </a>
</div> </div>
<div class="textAreaBlock2 box-sizing disTab"> <div class="textAreaBlock2 box-sizing disTab">
<ul class="order-notes-block"> <ul class="order-notes-block">
@ -273,118 +261,125 @@
</div> </div>
<!-- End block Tab2--> <!-- End block Tab2-->
<!-- Tab3 groups block --> <!-- Tab3 groups block -->
<div class="chatBlock disTab tab-pane fade" id="tab3"> <div class="chatBlock disTab tab-pane fade" id="tab3">
<div class="col-lg-3 wrMessages"> <div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab"> <div class="messageBlock box-sizing disTab">
<p>Заказы</p> <p>Заказы</p>
{% for torder in team_orders %} {% for torder in team_orders %}
<div class="team-order-block orderBlock box-sizing" id="teamOrderBlock{{ torder.pk }}" <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 }}"
<span class="dimovChat"></span> data-id="{{ torder.pk }}">
<p class="titleOB"> <span class="dimovChat"></span>
{{ torder }} <p class="titleOB">
{{ torder }}
</p>
<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>Исполнитель:</span> {{ torder.team.name }}
</p> </p>
<div class="hideOBB disTab"> <ul class="listChat1">
<p class="pOB"> {% for tuser in torder.team.users.all %}
<li>{{ tuser }}</li>
<span style="display: none;" class="teamorder-count-{{ torder.team.id }}">{% get_new_count_for_team request.user torder.team.id torder.pk %}</span> {% endfor %}
<span>Исполнитель:</span> {{ torder.team.name }} </ul>
</p> <p class="pOB">
<ul class="listChat1"> <span>Чаты:</span>
{% for tuser in torder.team.users.all %} {% if request.user.pk != torder.team.owner.pk %}
<li>{{ tuser }}</li> <span class="team-chat-user"
{% endfor %} data-id="{{ torder.team.owner.pk }}">{{ torder.team.owner.username }}</span>
</ul> {% endif %}
<p class="pOB"> {% for tuser in torder.team.contractors.all %}
<span>Чаты:</span> {% if request.user.pk != tuser.pk %}
{% if request.user.pk != torder.team.owner.pk %} <span class="team-chat-user"
<span class="team-chat-user" data-id="{{ tuser.pk }}">{{ tuser.username }}</span>
data-id="{{ torder.team.owner.pk}}">{{ torder.team.owner.username }}</span> {% endif %}
{% endif %} {% endfor %}
{% for tuser in torder.team.contractors.all %} </p>
{% if request.user.pk != tuser.pk %} <a href="#" class="linkChat11 full-order-info">
<span class="team-chat-user" <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
data-id="{{ tuser.pk }}">{{ tuser.username }}</span> Полное описание заказа
{% endif %} </a>
{% endfor %}
</p>
<a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
</a>
</div>
</div> </div>
{% endfor %} </div>
{% endfor %}
{% for yteam in your_teams %} {% 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 }}"
<span class="dimovChat"></span> data-team-id="{{ yteam.pk }}">
<p class="titleOB"> <span class="dimovChat"></span>
{{ yteam }} <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>Владелец группы:</span> {{ yteam.owner }}
</p>
<ul class="listChat1">
{% for tuser in yteam.contractors.all %}
<li>{{ tuser }}</li>
{% endfor %}
</ul>
<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>
{% 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>
{% endif %}
{% endfor %}
</p> </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>Владелец группы:</span> {{ yteam.owner }}
</p>
<ul class="listChat1">
{% for tuser in yteam.contractors.all %}
<li>{{ tuser }}</li>
{% endfor %}
</ul>
<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>
{% 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>
{% endif %}
{% endfor %}
</p>
</div>
</div> </div>
</div>
{% endfor %} {% endfor %}
</div>
</div> </div>
<div class="col-lg-6 commChat"> </div>
<div id="message-chat-team-space"></div> <div class="col-lg-6 commChat">
<form id="team-chat-form"> <div id="message-chat-team-space"></div>
<input type="hidden" name="sender" id="senderTeamId" value="{{ request.user.pk }}"> <form id="team-chat-form">
<input type="hidden" name="recipent" id="recipentTeamId"> <input type="hidden" name="sender" id="senderTeamId" value="{{ request.user.pk }}">
<input type="hidden" name="order" id="orderTeamId"> <input type="hidden" name="recipent" id="recipentTeamId">
<input type="hidden" name="team" id="teamId"> <input type="hidden" name="order" id="orderTeamId">
<input type="hidden" name="team_ids" id="teamIds"> <input type="hidden" name="team" id="teamId">
<input type="hidden" name="document-send" id="documentSendIds"> <input type="hidden" name="team_ids" id="teamIds">
<textarea id="chatText" class="chat-textarea box-sizing"></textarea> <input type="hidden" name="document-send" id="documentSendIds">
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя отправить</p> <textarea id="chatText" class="chat-textarea box-sizing"></textarea>
<div class="bunChat"> <p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
<div class="setChat box-sizing upload"> отправить</p>
<input type="file" name="file" id="upload-document-team"> <div class="bunChat">
<p>Прикрепить файл</p> <div class="setChat box-sizing upload">
</div> <input type="file" name="file" id="upload-document-team">
<div id="progress" class="progress"> <p>Прикрепить файл</p>
<div class="progress-bar progress-bar-success"></div> </div>
</div> <div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
<div id="document-send"></div>
<a href="#" id="add-team-chat-message">отправить</a>
</div> </div>
</form>
</div> <div id="document-send"></div>
<div class="col-lg-3 wrstepschat"> <a href="#" id="add-team-chat-message">отправить</a>
</div>
</form>
</div>
<div class="col-lg-3 wrstepschat">
<div class="col-lg-12 documentsChat"> <div class="col-lg-12 documentsChat">
<p>Прикрепленные документы</p> <p>Прикрепленные документы</p>
<ul id="documentTeamSpace"></ul> <ul id="documentTeamSpace"></ul>
<a href="{% url 'common:create' %}"> <a href="{% url 'common:create' %}">
Распечатать с помощью ресурса Распечатать с помощью ресурса
</a> </a>
</div> </div>
<div class="textAreaBlock2 box-sizing disTab"> <div class="textAreaBlock2 box-sizing disTab">
<ul class="team-notes-block"> <ul class="team-notes-block">
@ -400,12 +395,12 @@
</form> </form>
</div> </div>
</div>
</div> </div>
<!-- End block Tab3--> </div>
<!-- order-info --> <!-- End block Tab3-->
{% include 'order_info.html' %} <!-- order-info -->
<!-- --> {% include 'order_info.html' %}
<!-- -->
</div> </div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
</div> </div>
@ -414,12 +409,12 @@
{% endblock %} {% endblock %}
{% block js_block %} {% block js_block %}
<script type="text/javascript"> <script type="text/javascript">
var userId = {{ request.user.pk }}; var userId = {{ request.user.pk }};
var domain = '{{ request.META.HTTP_HOST }}'; var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}'; var port = '{{ request.META.SERVER_PORT }}';
</script> </script>
<script type="text/javascript" src='{% static "js/chat.js" %}'></script> <script type="text/javascript" src='{% static "js/chat.js" %}'></script>
<script type="text/javascript" src='{% static "js/chat_contractor.js" %}'></script> <script type="text/javascript" src='{% static "js/chat_contractor.js" %}'></script>
{% endblock %} {% endblock %}

@ -35,35 +35,7 @@
<div class="messageBlock box-sizing disTab"> <div class="messageBlock box-sizing disTab">
<p>Контакты</p> <p>Контакты</p>
{% for contact in contacts_users %} {% for contact in contacts_users %}
<div class="message messd user-block" id="userBlock{{ contact.pk }}" {% include 'inc-contact-card.html' %}
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>
{% endfor %} {% endfor %}
</div> </div>
@ -127,7 +99,8 @@
<p>Заказы</p> <p>Заказы</p>
{% for order in orders %} {% for order in orders %}
<div class="orderBlock box-sizing order-block" <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 }}" data-project-id="{{ order.id }}"
id="orderBlock{{ order.order.id }}" id="orderBlock{{ order.order.id }}"
data-secure-deal="{% if order.order.secure %}true{% else %}false{% endif %}" data-secure-deal="{% if order.order.secure %}true{% else %}false{% endif %}"
@ -140,7 +113,8 @@
<p class="titleOB">{{ order }}</p> <p class="titleOB">{{ order }}</p>
<div class="hideOBB"> <div class="hideOBB">
<p class="pOB"> <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> <span>Исполнитель:</span>
{% if order.order.contractor %} {% if order.order.contractor %}
{{ order.order.contractor.get_full_name }} {{ order.order.contractor.get_full_name }}
@ -152,9 +126,9 @@
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа Полное описание заказа
</a> </a>
{# <a href="#" class="deleteOrder" data-project-id="{{ order.pk }}">#} {# <a href="#" class="deleteOrder" data-project-id="{{ order.pk }}">#}
{# Удалить заказ#} {# Удалить заказ#}
{# </a>#} {# </a>#}
</div> </div>
</div> </div>
@ -164,17 +138,17 @@
{% if archive_projects %} {% if archive_projects %}
<div class="textAreaBlock2 FFD box-sizing disTab"> <div class="textAreaBlock2 FFD box-sizing disTab">
<a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a> <a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a>
</div> </div>
<p id="show-archive-label" style="display: none;">Архивные заказы</p> <p id="show-archive-label" style="display: none;">Архивные заказы</p>
<div id="archive-space" style="display:none;"> <div id="archive-space" style="display:none;">
<div id="trashed-orders"> <div id="trashed-orders">
{% for proj in archive_projects %} {% for proj in archive_projects %}
<div data-id="{{ proj.order.id }}" class="trashedOrderBlock box-sizing"> <div data-id="{{ proj.order.id }}" class="trashedOrderBlock box-sizing">
<span class="dimovChat"></span> <span class="dimovChat"></span>
<p class="titleOB"> {{ proj.name }}</p> <p class="titleOB"> {{ proj.name }}</p>
<div class="hideOBB"><p class="pOB"> <div class="hideOBB"><p class="pOB">
<span>Исполнитель: <span>Исполнитель:
{% if proj.order.contractor %} {% if proj.order.contractor %}
{{ proj.order.contractor.get_full_name }} {{ proj.order.contractor.get_full_name }}
@ -182,15 +156,16 @@
{{ proj.order.team.name }} {{ proj.order.team.name }}
{% endif %} {% endif %}
</span> </span>
</p> </p>
<a href="#" class="linkChat11 full-order-info"> <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> Полное описание заказа
</a>
</div>
</div> </div>
</div> {% endfor %}
{% endfor %} </div>
</div>
</div> </div>
{% endif %} {% endif %}
</div> </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) 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())) # 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.dispatch import receiver
from django.utils import timezone from django.utils import timezone
from .models import Stage from .models import Stage, Order
@receiver(post_save, sender=Stage) @receiver(post_save, sender=Stage)

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

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

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

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

@ -3,11 +3,12 @@
{% load user_tags %} {% load user_tags %}
{% load activeurl %} {% load activeurl %}
{% load sass_tags %} {% load sass_tags %}
{% load common_tags %}
{% if request.user.is_contractor %} {% if request.user.is_contractor %}
{% url 'users:contractor-profile' pk=request.user.pk as profile_url %} {% url 'users:contractor-profile' pk=request.user.pk as profile_url %}
{% elif request.user.is_customer %} {% elif request.user.is_customer %}
{% url 'users:customer-profile-open-projects' pk=request.user.pk as profile_url %} {% url 'users:customer-profile-open-projects' pk=request.user.pk as profile_url %}
{% endif %} {% endif %}
<link rel='stylesheet' href='{% sass_src "partials/sass/header.sass" %}'> <link rel='stylesheet' href='{% sass_src "partials/sass/header.sass" %}'>
@ -15,19 +16,22 @@
<div class="wrTop {% if request.user.is_authenticated %} disTab {% endif %}"> <div class="wrTop {% if request.user.is_authenticated %} disTab {% endif %}">
<div class="container-fluid topMain"> <div class="container-fluid topMain">
<div class="row"> <div class="row">
<div class="col-lg-3"> <div style="float: left">
<a href="/"><div class="logo"></div></a> <a href="/">
<div class="logo"></div>
</a>
</div> </div>
{% activeurl %} {% activeurl %}
{% if request.user.is_authenticated %} <div style="height: 100%; display: inline-block; text-align: center">
<div class="col-lg-7"> {% if request.user.is_authenticated %}
<ul class="mainMenu"> <ul class="mainMenu">
<li class="icon_tm1"> <li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Поиск заказов</a> <a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
<span></span> <span></span>
</li> </li>
{% if request.user.is_contractor %} {% if request.user.is_contractor %}
<li class="officeList icon_tml"> <li class="officeList icon_tml">
<a href="{% url 'users:contractor-office' %}"> <a href="{% url 'users:contractor-office' %}">
@ -35,22 +39,25 @@
</a> </a>
<span></span> <span></span>
</li> </li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a>
<span></span>
</li>
{% endif %} {% endif %}
{% if request.user.is_customer %} {% if request.user.is_customer %}
<li class="icon_tm2"> <li class="icon_tm2">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a> <a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
<span></span> <span></span>
</li> </li>
<li class="icon_tm3"> <li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Работы на продажу</a> <a href="{% url 'work_sell:list' %}">Готовые проекты</a>
<span></span> <span></span>
</li> </li>
{% endif %} {% endif %}
</ul> </ul>
</div> <div style="clear: both"></div>
{% else %} {% else %}
<div class="col-lg-7">
<ul class="mainMenu"> <ul class="mainMenu">
<li class="icon_tm1"> <li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Поиск заказов</a> <a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
@ -61,17 +68,16 @@
<span></span> <span></span>
</li> </li>
<li class="icon_tm3"> <li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Работы на продажу</a> <a href="{% url 'work_sell:list' %}">Готовые проекты</a>
<span></span> <span></span>
</li> </li>
</ul> </ul>
</div>
{% endif %}
{% endactiveurl %}
{% if request.user.is_authenticated %}
<div class="col-lg-2">
{% endif %}
</div>
{% endactiveurl %}
<div style="float: right">
{% if request.user.is_authenticated %}
{% if request.user.is_contractor %} {% if request.user.is_contractor %}
{% contractor_indicator request.user %} {% contractor_indicator request.user %}
{% endif %} {% endif %}
@ -84,30 +90,31 @@
</button> </button>
<ul class="dropdown-menu menu-drop-new"> <ul class="dropdown-menu menu-drop-new">
{% if request.user.is_contractor %} {% if request.user.is_contractor %}
<li class="icon_mm1"> <li class="icon_mm1">
<a href="{% url 'auth_login' %}"> <a href="{% url 'auth_login' %}">
Войти заказчиком Войти заказчиком
<span></span> <span></span>
</a> </a>
</li> </li>
{% else %} {% else %}
<li class="icon_mm2"> <li class="icon_mm2">
<a href="{% url 'auth_login' %}"> <a href="{% url 'auth_login' %}">
Войти исполнителем Войти исполнителем
<span></span> <span></span>
</a> </a>
</li> </li>
{% endif %} {% endif %}
<li class="icon_mm8"> <li class="icon_mm8">
<a href="{{ profile_url }}"> <a href="{{ profile_url }}">
Профиль<span></span> Профиль<span></span>
</a> </a>
</li> </li>
<li class="icon_mm3"> <li class="icon_chat">
<a href="{% url 'chat:chat-user' %}">Сообщения<span></span> <a href="{% url 'chat:chat-user' %}">Сообщения<span></span></a>
{% if request.user %} {% if request.user %}
{% count_new_message request.user %} <div class="circle js-all-messages">{{ new_messages_count| max_count:99 }}</div>
{% endif %}</a> {# {% count_new_message request.user %}#}
{% endif %}
</li> </li>
<li class="icon_mm4"> <li class="icon_mm4">
<a href="{% url 'wallets:score-detail' pk=request.user.pk %}">Счет<span></span></a> <a href="{% url 'wallets:score-detail' pk=request.user.pk %}">Счет<span></span></a>
@ -119,10 +126,15 @@
<li class="icon_mm6"> <li class="icon_mm6">
<a href="/pages/faq">FAQ<span></span></a> <a href="/pages/faq">FAQ<span></span></a>
</li> </li>
{% if request.user.is_contractor %}
<li class="icon_mm7"> <li class="icon_mm2">
<a href="{% url 'auth_logout' %}">Выйти<span></span></a> <a href="{% url 'auth_logout' %}">Выйти<span></span></a>
</li> </li>
{% else %}
<li class="icon_mm7">
<a href="{% url 'auth_logout' %}">Выйти<span></span></a>
</li>
{% endif %}
</ul> </ul>
</div> </div>
@ -150,14 +162,25 @@
</a> </a>
{% endif %} {% endif %}
</div> </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 %}
</div> {% else %}
{% else %}
<div class="col-lg-2">
<a href="{% url 'registration_register' %}" class="reg">Регистрация</a> <a href="{% url 'registration_register' %}" class="reg">Регистрация</a>
<a href="{% url 'auth_login' %}"><div class="lock"></div></a> <a href="{% url 'auth_login' %}">
</div> <div class="lock"></div>
{% endif %} </a>
{% endif %}
</div>
</div> </div>
</div> </div>
</div> </div>

@ -7,14 +7,61 @@
.topMain .topMain
width: 1200px width: 1200px
margin: 0 auto margin: 0 auto
color: #ffffff
.dropdown-menu > li > a
display: inline-block
.col-lg-7 .col-lg-7
width: 55% width: 55%
.col-lg-2 .col-lg-2
width: 19% width: 19%
.mainMenu li .mainMenu li
cursor: pointer
padding-right: 25px padding-right: 25px
a a
font-size: 15px 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 .welcomeMain
width: 100% width: 100%
@ -41,6 +88,7 @@
.mainMenu .mainMenu
float: left float: left
margin: 26px 0 0 0 margin: 26px 0 0 0
padding-left: 60px
li li
float: left float: left
position: relative position: relative
@ -161,14 +209,16 @@
&.icon_tm3.active span &.icon_tm3.active span
background: url('#{$static}/img/listMain2.png') no-repeat right !important 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 display: inline-block
padding: 5px 7px 3px 7px color: red
background: #ff0000 font-family: 'pfbeausanspro-reg', sans-serif
border-radius: 35px //padding: 5px 7px 3px 7px
position: absolute background: none
right: -34px border-radius: 0
top: -4px position: inherit
//right: -34px
//top: -4px
.reg, .reg:link, .reg:visited .reg, .reg:link, .reg:visited
color: #fb1818 color: #fb1818
@ -191,7 +241,8 @@ li.officeList.icon_tml > a > p
width: 75px width: 75px
height: 75px height: 75px
float: right float: right
margin: 0 0 0 -60px margin: 0
padding-left: 5px
img img
display: block display: block
width: 100% width: 100%
@ -282,6 +333,13 @@ li.officeList.icon_tml > a > p
height: 20px height: 20px
background-size: contain background-size: contain
background: url('#{$static}/img/user-5.png') no-repeat 0 0 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 .icon_mm1 a:hover span
height: 20px height: 20px
background: url('#{$static}/img/menu2.png') no-repeat center !important background: url('#{$static}/img/menu2.png') no-repeat center !important
@ -315,3 +373,9 @@ li.officeList.icon_tml > a > p
height: 20px height: 20px
background-size: contain background-size: contain
background: url('#{$static}/img/user-4.png') no-repeat 0 0 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 reviews.models import Review
from users.helpers import get_projects_grouped from users.helpers import get_projects_grouped
register = template.Library() 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) @register.inclusion_tag('templatetags/user_new_count_orders.html', takes_context=True)
def count_new_message_orders(context, user): 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() message__team__isnull=True).count()
try: try:
team = user.team team = user.team
@ -58,23 +63,30 @@ def count_new_message_orders(context, user):
team = None team = None
if team: 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() message__team__isnull=True).count()
new_count += new_count_team new_count += new_count_team
if new_count > 99:
new_count = '99+'
return { return {
'new_count': new_count, 'new_count': new_count,
} }
@register.simple_tag @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() count = NewMessage.objects.filter(user=user, message__team=team_pk, message__order__isnull=True).count()
return count return count
@register.simple_tag @register.simple_tag
def get_new_count_for_contact(contact, current_user): 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 return count
@ -114,14 +126,17 @@ def get_customer_chat_open_projects(user):
@register.filter @register.filter
def get_project_message_count(user): def get_project_message_count(user):
if user.is_customer(): 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'] return projects.aggregate(c=Count('answers__messages'))['c']
elif user.is_contractor(): 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'): 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 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_info = InvoiceHistory.objects.filter(user=self.user, type="score").aggregate(Sum('sum'))
current_sum = current_sum_info['sum__sum'] or 0 current_sum = current_sum_info['sum__sum'] or 0
if self.type == "score": if self.type == "score":
self.balance = current_sum + self.sum self.balavoids_atnce = current_sum + self.sum
else: else:
self.balance = current_sum self.balance = current_sum
super().save(*args, **kwargs) super().save(*args, **kwargs)

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

Loading…
Cancel
Save