remotes/origin/PR-39
ArturBaybulatov 9 years ago
commit 04c639b97d
  1. 10
      assets/css/main.css
  2. 64
      assets/js/chat.js
  3. 46
      assets/js/chat_customer.js
  4. 23
      chat/chat.py
  5. 8
      chat/templates/chat_customer.html
  6. 12
      projects/serializers.py
  7. 2
      templates/partials/base.html
  8. 4
      users/templates/contractor_filter.html
  9. 10
      users/templates/contractor_office.html
  10. 2
      users/templates/contractor_profile.html
  11. 2
      users/templates/partials/customer_profile_info_block.html
  12. 2
      users/templates/team_profile.html

@ -3389,7 +3389,7 @@ input[type="checkbox"]:checked + span {
float: left;
margin: 24px 0 0 0;
padding: 0 15px;
border-bottom: 1px solid #BEBEBE;
/*border-bottom: 1px solid #BEBEBE;*/
text-align: center;
}
@ -6033,11 +6033,17 @@ input[type="radio"]{
.addWork, .upload2, .documentsChat a{
transition: all 0.3s;
}
.changeBlock1 > a:hover, .changeBlock2 > a:hover, .addWork:hover,
.changeBlock1 > a:hover, .addWork:hover,
.upload2:hover, .documentsChat a:hover{
box-shadow: 0 0 15px rgba(0, 0, 0, 0.8);
-webkit-transform: scale(1.04);
-moz-transform: scale(1.04);
transform: scale(1.04);
}
.changeBlock2 > a:hover{
box-shadow: 0 0 15px rgba(255, 255, 255, 0.8);
-webkit-transform: scale(1.04);
-moz-transform: scale(1.04);
transform: scale(1.04);
}
/*end_new*/

@ -184,38 +184,60 @@ function dialog (message, yesCallback, notCallback) {
$("a[href='#tab1']").trigger('click');
}
$("#trashed-button").on('click',function(e){
e.preventDefault();
var trashedOrderHtml = "";
$(".messageBlock").on('click','.trashedOrderBlock',function(){
$("#chat-order-add").css("display", "none");
$('.order-block, .trashedOrderBlock').each(function () {
$(this).removeClass('orAct');
});
$(this).addClass('orAct');
var inbox = document.getElementById('message-chat-order-space');
var docList = document.getElementById('documentOrderSpace');
inbox.innerHTML = '';
docList.innerHTML = '';
var orderId = $(this).attr('data-id');
location.hash = '#order' + orderId;
$.ajax({
url: '/api/orders/',
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId, 'team__isnull': 'true'},
dataType: 'json',
success: function(json){
console.log(json.results);
$.each(json.results, function(i, v){
var temp = '<div class="orderBlock box-sizing"><span class="dimovChat"></span>' +
'<p class="titleOB">'+ v.project.name +'</p><div class="hideOBB"><p class="pOB">' +
'<span>Исполнитель:</span> </p>' +
'<a href="#" class="linkChat11 full-order-info">' +
'<span class="glyphicon glyphicon-info-sign" aria-hidden="true">' +
'</span>Полное описание заказа </a></div></div>';
trashedOrderHtml += temp;
success: function (json) {
$.each(json.results, function (i, v) {
var senderName = 'Вы';
var className = 'youChat';
if (v.sender.id !== userId) {
senderName = v.sender.username;
className = '';
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat ' + className + '"><div class="topCommChat">' +
'<p class="nameCommChat">' + senderName + '</p><span>' + v.created + '</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
});
$("#trashed-orders").html(trashedOrderHtml);
},
error: function(e, jqxhr){
console.log(e);
var height = inbox.scrollHeight;
inbox.scrollTop = height;
}
})
});
$("#order-stages").html("");
$("#completeWork").hide();
$("#add-form-order-note").hide();
});
// Информация о заказе
$(".full-order-info").click('on', function (e) {
$(".messageBlock").on('click','.full-order-info', function (e) {
e.preventDefault();
e.stopPropagation();
var orderId = $(this).closest('.orderBlock').attr('data-id');
if (!orderId){
orderId = $(this).closest('.trashedOrderBlock').attr('data-id');
}
$.ajax({
url: '/api/orders/' + orderId + '/',
data: {

@ -408,9 +408,55 @@ $(function () {
}
});
$("#trashed-button").on('click',function(e){
e.preventDefault();
var state = $(this).attr('data-show');
var trashedOrderHtml = "";
if (state == 'true') {
$(this).attr('data-show','false');
$(this).text("Скрыть архивные заказы");
$.ajax({
url: '/api/orders/',
type: 'GET',
dataType: 'json',
success: function (json) {
console.log(json.results);
$.each(json.results, function (i, v) {
var temp = '<div data-id="'+ v.id +'" class="trashedOrderBlock box-sizing"><span class="dimovChat"></span>' +
'<p class="titleOB">' + v.project.name + '</p><div class="hideOBB"><p class="pOB">' +
'<span>Исполнитель:</span>'+ v.contractor_name +' </p>' +
'<a href="#" class="linkChat11 full-order-info">' +
'<span class="glyphicon glyphicon-info-sign" aria-hidden="true">' +
'</span>Полное описание заказа </a></div></div>';
trashedOrderHtml += temp;
});
$("#trashed-orders").html(trashedOrderHtml);
},
error: function (e, jqxhr) {
console.log(e);
}
});
}else {
$(this).attr('data-show','true');
$(this).text("Показать архивные заказы");
$("#trashed-orders").html("");
}
});
// Для заказов все вытащить
$('.order-block').on('click', function () {
$("#chat-order-add").css("display", "block");
$("#add-form-order-note").css("display", "block");
$("#formsetStage").css("display", "block");
$('.order-block').each(function () {

@ -43,17 +43,16 @@ class ChatHandler(websocket.WebSocketHandler):
@gen.coroutine
def approve_stages(self, data):
print(data)
data['data']['chat_message'] = data['data']['msg']
self.add_message(data)
sender_id = data['data']['sender_id']
recipent_id = data['data']['recipent_id']
order_id = data['data'].get('order_id')
message = data['data'].get('msg', 'Этапы обновлены')
answer_type = data['format_type']
waiters = tuple(w for c, w in self.waiters if c == recipent_id or c == sender_id)
for waiter in waiters:
waiter.write_message({'msg': message, 'order_id': order_id, 'answer_type': answer_type})
# sender_id = data['data']['sender_id']
# recipent_id = data['data']['recipent_id']
# order_id = data['data'].get('order_id')
# message = data['data'].get('msg', 'Этапы обновлены')
# answer_type = data['format_type']
# waiters = tuple(w for c, w in self.waiters if c == recipent_id or c == sender_id)
# for waiter in waiters:
# waiter.write_message({'msg': message, 'order_id': order_id, 'answer_type': answer_type})
@gen.coroutine
def add_message(self, message_data):
@ -71,8 +70,10 @@ class ChatHandler(websocket.WebSocketHandler):
docs_links = ''
docs_attach = ''
message = html.escape(message)
message = message.replace('\n', '<br />')
message_type = message_data.get('message_type', None)
if not message_type:
message = html.escape(message)
message = message.replace('\n', '<br />')
answer_type = message_data['format_type']
private_type = 'true' if not order_id and not team_id else 'false'

@ -148,17 +148,17 @@
{% endfor %}
<div class="textAreaBlock2 FFD box-sizing disTab">
<a href="#" id="trashed-button">Показать архивные заказы</a>
<a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a>
</div>
<p>Архивные заказы</p>
<p id="show-archive-label">Архивные заказы</p>
<div id="trashed-orders"></div>
</div>
</div>
</div>
<div class="col-lg-6 commChat">
<div id="message-chat-order-space"></div>
<form id="chat-order-add">
<form id="chat-order-add" style="display:none;">
<input type="hidden" name="senderId" id="senderId" value="{{ request.user.pk }}"/>
<input type="hidden" name="recipentId" id="recipentId">
<input type="hidden" name="orderId" id="orderId">

@ -204,6 +204,7 @@ class OrderSerializer(ModelSerializer):
stages = StageSerializer(many=True, read_only=True)
project = ProjectSerializer(read_only=True)
has_user_review = serializers.SerializerMethodField(read_only=True)
contractor_name = serializers.SerializerMethodField(read_only=True)
class Meta:
model = Order
@ -219,9 +220,18 @@ class OrderSerializer(ModelSerializer):
'has_user_review',
'stages',
'project',
'contractor_name',
)
def get_has_user_review(self,obj):
def get_contractor_name(self, obj):
if obj.contractor:
return obj.contractor.get_full_name() or obj.contractor.username
elif obj.team:
return obj.team.owner.get_full_name() or obj.team.owner.username
else:
return 'Исполнитель не определен'
def get_has_user_review(self, obj):
curr_user = self.context['request'].user
if curr_user.is_customer():
return curr_user.customer_reviews.filter(project=obj.project).exists()

@ -90,7 +90,6 @@
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
//console.log("Start connect");
intervalId = setInterval(function () {
sock.send('{"dummy": 1}');
}, 15000);
@ -104,7 +103,6 @@
}else if((notificationData.answer_type == 'approve_stages') || (notificationData.answer_type == 'add_message_order')){
outMessage += "<a href='/chat/#order" + notificationData.order_id + "'>"+ notificationData.msg +"<a>";
}
$.jGrowl("Вам пришло новое сообщение!<br />" + outMessage, { life: 15000});
};
this.add_message = function (messageData) {

@ -214,7 +214,7 @@
{% endif %}
</li>
<li>
<a href="{% url 'chat:chat-user' %}?user_id={{ team.owner.pk }}">
<a href="{% url 'chat:chat-user' %}?user_id={{ team.owner.pk }}#user{{ team.owner.pk }}">
написать сообщение
</a>
</li>
@ -335,7 +335,7 @@
{% endif %}
<li>
<a href="{% url 'chat:chat-user' %}?user_id={{ contractor.pk }}">
<a href="{% url 'chat:chat-user' %}?user_id={{ contractor.pk }}#user{{ contractor.pk }}">
написать сообщение
</a>
</li>

@ -298,10 +298,8 @@
var $moreWorkSellsfBtn = $('.-more-work-sells-btn').first()
var workSellAbsUrl = '/work_sell/'
var contractorId =
{{ contractor.pk }}
var teamId =
{{ contractor.team.pk }}
var contractorId ={{ contractor.pk }}
var teamId ={{ contractor.team.pk }}
var contractorIds = [contractorId]
var portfUrl = new URI('/api/portfolios/')
@ -387,11 +385,11 @@
if (res.status === 'success') {
socketMain.add_message({
format_type: 'add_message_contact',
message_type: 'invite_team',
data: {
sender_id: '{{ contractor.pk }}',
recipent_id: String(contractor2Id),
chat_message: 'Приглашаю в группу http://{{ request.get_host }}{% url 'users:accept-team-invitation' owner_id=contractor.pk %}',
chat_message: 'Приглашаю в группу <a href="http://{{ request.get_host }}{% url 'users:accept-team-invitation' owner_id=contractor.pk %}">http://{{ request.get_host }}{% url 'users:accept-team-invitation' owner_id=contractor.pk %}</a>',
},
})

@ -44,7 +44,7 @@
{% if contractor.pk != request.user.pk %}
<li class="icon_um3">
<a href="{% url 'chat:chat-user' %}?user_id={{ contractor.pk }}">
<a href="{% url 'chat:chat-user' %}?user_id={{ contractor.pk }}#user{{ contractor.pk }}">
написать сообщение
</a>
<span></span>

@ -34,7 +34,7 @@
<div class="col-lg-4">
{% if request.user.pk != customer.pk %}
<a href="javascript:void(0)" class="new-prop new-prop1">показать контакты</a>
<a href="{% url 'chat:chat-user' %}?user_id={{ pk }}" class="new-prop new-prop2">написать сообщение</a>
<a href="{% url 'chat:chat-user' %}?user_id={{ pk }}#user{{ pk }}" class="new-prop new-prop2">написать сообщение</a>
{% else %}
<a href="{% url 'users:user-profile-edit' pk=pk %}" class="new-red">редактировать профиль</a>
{% endif %}

@ -77,7 +77,7 @@
<div class="statusUser busy">Занят</div>
{% endif %}
<a href="{% url 'chat:chat-user' %}?user_id={{ team.owner.pk }}" class="new-prop new-prop2 new-prop3">написать сообщение</a>
<a href="{% url 'chat:chat-user' %}?user_id={{ team.owner.pk }}#user{{ team.owner.pk }}" class="new-prop new-prop2 new-prop3">написать сообщение</a>
</div>
<div class="col-lg-4">

Loading…
Cancel
Save