#ARC-25 Fixes bugs in stages project

remotes/origin/PR-39
Mukhtar 10 years ago
parent 7fe3406f1d
commit 9239c2992f
  1. 11
      api/views.py
  2. 122
      assets/js/chat.js
  3. 631
      chat/templates/chat.js
  4. 75
      chat/templates/chat1.js
  5. 68
      chat/templates/chat2.js
  6. 112
      chat/templates/chat_contractor.html
  7. 162
      chat/templates/chat_customer.html
  8. 16
      chat/testapp.py
  9. 8
      reviews/models.py
  10. 7
      templates/partials/header.html
  11. 6
      users/templates/contractor_profile.html
  12. 5
      users/templates/templatetags/contractor_indicator.html
  13. 0
      users/templatetags/__init__.py
  14. 19
      users/templatetags/user_tags.py

@ -74,6 +74,17 @@ class NoteViewSet(ModelViewSet):
filter_class = NoteFilterSet
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
def get_queryset(self):
queryset = Notes.objects.all()
search_param = self.request.query_params.get('operand', None)
recipent_id = self.request.query_params.get('recipent_id', None)
sender_id = self.request.query_params.get('sender_id', None)
if search_param:
# import code; code.interact(local=dict(globals(), **locals()))
if search_param == 'in':
queryset = queryset.filter(Q(sender__in=[sender_id,recipent_id]),Q(recipent__in=[sender_id,recipent_id])).order_by('created')
return queryset
class MessageViewSet(ModelViewSet):
queryset = Message.objects.all()
serializer_class = MessageSerializer

@ -1,10 +1,6 @@
/**
* Created by mukhtar on 04.07.16.
*/
var SocketHandler = function () {
var url = 'ws://127.0.0.1:8888/chat';
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
@ -16,11 +12,36 @@ var SocketHandler = function () {
sock.onmessage = function (event) {
console.log(event.data);
var message = JSON.parse(event.data);
var inbox = document.getElementById('message-chat-space');
var inbox;
if (message.answer_type == 'contact' || message.answer_type == 'add_message_contact') {
inbox = document.getElementById('message-chat-space');
} else if (message.answer_type == 'order' || message.answer_type == 'add_message_order') {
inbox = document.getElementById('message-chat-order-space');
} else if (message.answer_type == 'add_message_team') {
inbox = document.getElementById('message-chat-team-space');
}else if (message.answer_type == 'approve_stages') {
alert('approve stages');
}
if(inbox) {
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Иванов</p> <span>13.0.2016</span></div>' +
'<p class="nameCommChat">ВЫ</p> <span>Сейчас</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
}
};
this.send_order_message = function (orderId) {
var data = {
"format_type": "order_message",
"order_id": orderId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.send_stages_approve = function(data){
sock.send(JSON.stringify(data));
console.log(data);
};
this.send_contact_message = function (userId) {
@ -32,6 +53,12 @@ var SocketHandler = function () {
console.log(data);
};
this.add_team_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
}
this.add_contact_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
@ -49,82 +76,39 @@ var SocketHandler = function () {
sock.send(JSON.stringify(data));
var textareaMessage = document.getElementById("message");
textareaMessage.value = "";
}
}
$(function () {
var socket = new SocketHandler();
var form = document.getElementById('message_form');
var csrftoken = getCookie('csrftoken');
// Вытащить сообщения для чата заказа
$('.order-block').on('click', function () {
var orderId = $(this).attr('data-id');
$("#chat-contractor-order #orderId").val(orderId);
var inbox = document.getElementById('message-chat-order-space');
inbox.innerHTML = '';
$.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Иванов</p> <span>13.0.2016</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
});
function csrfSafeMethod(method) {
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
});
});
// Вытащить сообщения для конактов
$('.user-block').on('click', function () {
var userId = $(this).attr('data-id');
$("#contact-chat-form #recipentId").val(userId);
var inbox = document.getElementById('message-chat-space');
inbox.innerHTML = '';
$(function(){
$('#add-note-contractor').on('click', function (e) {
e.preventDefault();
$.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'recipent__id': userId},
url: '/api/note/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: $("#add-form-contractor-note").serialize(),
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
console.log(v.sender.id);
console.log(v.recipent.id);
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Иванов</p> <span>13.0.2016</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
});
console.log(json);
$("#add-form-contractor-note #chat2").val("");
$('<li>' + json.text + '</li>').appendTo(".contractor-notes-block");
},
error: function (e) {
console.log('error');
console.log(e);
}
});
});
// Добавить сообщение для контакта
$('#contact-chat-add-message').on('click', function () {
var chatMessage = $("#chat").val();
var recipentId = $("#recipentId").val();
var senderId = $("#senderId").val();
socket.add_contact_message({
"format_type": "add_message_contact",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
}
});
$("#chat").val("");
});
});

@ -1,12 +1,7 @@
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
var SocketHandler = function () {
var userId = {{ request.user.pk }};
var url = 'ws://127.0.0.1:8888/chat/' + userId + '/';
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
@ -19,7 +14,6 @@
console.log(event.data);
var message = JSON.parse(event.data);
var inbox;
if (message.answer_type == 'contact' || message.answer_type == 'add_message_contact') {
inbox = document.getElementById('message-chat-space');
} else if (message.answer_type == 'order' || message.answer_type == 'add_message_order') {
@ -27,617 +21,8 @@
} else if (message.answer_type == 'add_message_team') {
inbox = document.getElementById('message-chat-team-space');
}
console.log(message.answer_type);
console.log(message.msg);
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">ВЫ</p> <span>13.0.2016</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
};
this.send_contact_message = function (userId) {
var data = {
"format_type": "add_message",
"user_id": userId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.add_team_message = function(messageData){
console.log(messageData);
sock.send(JSON.stringify(messageData));
}
this.add_contact_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
};
this.send_message = function (form) {
var elements = form.elements;
var data = {};
var i = 0;
for (var i; i < elements.length; i++) {
if (elements[i].name == 'message') {
data[elements[i].name] = elements[i].value;
}
}
sock.send(JSON.stringify(data));
var textareaMessage = document.getElementById("message");
textareaMessage.value = "";
}
}
$(function () {
var currentChatUser = {{ request.user.pk }};
var socket = new SocketHandler();
var form = document.getElementById('message_form');
var csrftoken = getCookie('csrftoken');
setTimeout(function(){
$(".user-block").first().trigger('click');
}, 10);
setTimeout(function(){
$(".order-block").first().trigger('click');
}, 100);
setTimeout(function(){
$(".team-order-block").first().trigger('click');
}, 1000);
var url = '/work_sell/basic/';
$('#upload-document-team').fileupload({
url: url,
crossDomain: false,
beforeSend: function (xhr, settings) {
$('#progress .progress-bar').css(
'width',
'0%'
);
if (!csrfSafeMethod(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
},
dataType: 'json',
done: function (e, data) {;
$.each(data.result.files, function (index, file) {
var currentValue = $("#documentSendIds").val();
currentValue += file.id + ';';
$("#documentSendIds").val(currentValue);
var htmlImg = '<p>'+ file.name+'</p>';
var document_send = $(htmlImg).appendTo("#document-send");
});
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
$("#approve-stages").on('click', function(){
$(".stage-block-approve").each(function(){
var stageId = $(this).attr('data-id');
});
});
$(".team-chat-user").on('click',function(e){
e.stopPropagation();
var recipentId = $(this).attr('data-id');
$("#team-chat-form #recipentId").val(recipentId);
});
$(".team-order-block").on('click', function(){
$('.team-order-block').each(function () {
$(this).removeClass('orAct');
});
$(this).addClass('orAct');
var teamId = $(this).attr('data-team-id');
var orderId = $(this).attr('data-order-id');
$("#team-chat-form #teamId").val(teamId);
$("#team-chat-form #orderId").val(orderId);
var inbox = document.getElementById('message-chat-team-space');
inbox.innerHTML = '';
$.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'team': teamId,'order': orderId},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
var senderName = 'Вы';
var className = 'youChat';
if (v.sender.id !== currentChatUser) {
senderName = v.sender.username;
className = '';
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">' + senderName + '</p> <span>' + v.created + '</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
});
}
});
});
// Вытащить сообщения для чата заказа
$('.order-block').on('click', function () {
$('.order-block').each(function () {
$(this).removeClass('orAct');
});
$(this).addClass('orAct');
var orderId = $(this).attr('data-id');
var recipentId = $(this).attr('data-recipent-id');
$("#chat-contractor-order #orderId").val(orderId);
$("#add-form-order-note #orderNote").val(orderId);
$("#chat-contractor-order #recipentOrderId").val(recipentId);
$("#add-form-order-note #recipentNote").val(recipentId);
var inbox = document.getElementById('message-chat-order-space');
inbox.innerHTML = '';
$.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
var senderName = 'Вы';
var className = 'youChat';
if (v.sender.id !== currentChatUser) {
senderName = v.sender.username;
className = '';
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">' + senderName + '</p> <span>' + v.created + '</span></div>' +
'<p class="textCommChat">' + v.text + '</p></div>';
});
}
});
$.ajax({
url: '/api/note/',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId},
dataType: 'json',
success: function (json) {
console.log(json.results);
var noteHtmlInbox = '';
$.each(json.results, function (i, v) {
noteHtmlInbox += '<li>'+ v.text +'<li>';
});
$(".notes-block").html(noteHtmlInbox);
}
});
$.ajax({
url: '/api/stages/',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId},
dataType: 'json',
success: function (json) {
console.log(json.results);
var htmlInbox = "";
var stagesReservedHtml = "";
if (json.results.length > 0) {
$.each(json.results, function (i, v) {
if(v.is_paid){
stagesReservedHtml += '<li class="reserved">Сумма за этап '+ i +'.Зарезервирована.</li>';
}else{
stagesReservedHtml += '<li class="unreserved">Сумма за этап '+ i +'.Не зарезервирована.</li>';
}
htmlInbox += '<div data-id="' + v.id + '" class="numberStepp box-sizing stage-block-approve"><div class="insetNumStepp">' +
'<p class="titleNumStepp"><span>Этап ' + v.pos + '</span>' + v.name + '</p>' +
'<p class="textNumStepp">Результаты этапа:' + v.result + '</p><div>' +
'<p>'+ v.status+'</p><span>' + v.cost + '<i class="fa fa-rub"></i></span></div></div></div>';
});
htmlInbox += '<div class="textAreaBlock2 FFD box-sizing disTab"><a id="approve-stages" href="javascript:void()">согласовать</a></div>';
}
$("#order-stages").html(htmlInbox);
$(".stages-paid").html(stagesReservedHtml);
}
});
});
$('#add-note-button').on('click', function(){
$.ajax({
url: '/api/note/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data:$("#add-form-order-note").serialize(),
dataType: 'json',
success: function (json) {
console.log(json);
$("#add-form-order-note #chat2").val("");
},
error: function(e){
console.log('error');
console.log(e);
}
});
});
// Вытащить сообщения для конактов
$('.user-block').on('click', function () {
var userId = $(this).attr('data-id');
$("#contact-chat-form #recipentId").val(userId);
var inbox = document.getElementById('message-chat-space');
inbox.innerHTML = '';
$.ajax({
url: '/api/message',
type: 'GET',
data: {
csrfmiddlewaretoken: csrftoken,
'operand': 'in',
'sender_id': currentChatUser,
'recipent_id': userId
},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
console.log(v.sender.id);
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>';
});
}
});
});
//Добавить сообщение для исполнителей в группе
$("#add-team-chat-message").on('click', function(){
var chatMessage = $("#team-chat-form #chatText").val();
var recipentId = $("#team-chat-form #recipentId").val();
var senderId = $("#team-chat-form #senderId").val();
var teamId = $("#team-chat-form #teamId").val();
var orderId = $("#team-chat-form #orderId").val();
var documentSendIds = $("#documentSendIds").val();
console.log(documentSendIds);
var teamDocumentIds = documentSendIds.split(';');
teamDocumentIds.pop();
console.log(teamDocumentIds);
socket.add_team_message({
"format_type": "add_message_team",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
"team_id": teamId,
"order_id": orderId,
}
});
$("#team-chat-form #chatText").val("");
});
// Добавить сообщение для контакта
$('#contact-chat-add-message').on('click', function () {
var chatMessage = $("#chat").val();
var recipentId = $("#recipentId").val();
var senderId = $("#senderId").val();
socket.add_contact_message({
"format_type": "add_message_contact",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
}
});
var inbox = $('#message-chat-space').html();
$('#message-chat-space').html(inbox + '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Вы</p> <span>Сейчас</span></div>' +
'<p class="textCommChat">' + chatMessage + '</p></div>');
$("#chat").val("");
});
$('#order-chat-add-message').on('click', function () {
var chatMessage = $("#chat-contractor-order #chat").val();
var recipentId = $("#chat-contractor-order #recipentOrderId").val();
var senderId = $("#chat-contractor-order #senderOrderId").val();
var orderId = $("#chat-contractor-order #orderId").val();
socket.add_contact_message({
"format_type": "add_message_order",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
"order_id": orderId,
}
});
$("#chat-contractor-order #chat").val("");
});
});
$(function () {
var currentChatUser = {{ request.user.pk }};
var socket = new SocketHandler();
var form = document.getElementById('message_form');
var csrftoken = getCookie('csrftoken');
setTimeout(function(){
$(".user-block").first().trigger('click');
}, 10);
setTimeout(function(){
$(".order-block").first().trigger('click');
}, 100);
$("#order-stages").on('click', "#addStagesForm", function(){
$(".new-stages-form").each(function(i,v){
console.log($(this).serialize());
alert($(this).serialize());
$.ajax({
url: '/api/stages/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data:$(this).serialize(),
dataType: 'json',
success: function (json) {
console.log(json);
},
error: function(e){
console.log('error');
console.log(e);
}
});
});
});
$('#order-stages-tab').on('change', '#countStage', function(){
var countStage = parseInt($(this).val());
var updateFormStages = $(".update-stages-form");
alert(updateFormStages.length);
alert(typeof updateFormStages.length);
var limitCount = countStage + 1;
for (var i = 2; i < limitCount; i++) {
var stageCopy = $("#stage1").clone().attr("id", "stage" + i).addClass("stages_form");
$("#stage1").after(stageCopy);
}
});
$('.order-block').on('click', function () {
$("#chat-order-add").css("display", "block");
$("#formsetStage").css("display","block");
$('.order-block').each(function () {
$(this).removeClass('orAct');
});
$(this).addClass('orAct');
var orderId = $(this).attr('data-id');
var recipentId = $(this).attr('data-recipent-id');
$("#chat-order-add #orderId").val(orderId);
$("#chat-order-add #recipentId").val(recipentId);
$(".orderStagesInput").val(orderId);
var inbox = document.getElementById('message-chat-order-space');
inbox.innerHTML = '';
$.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
var senderName = 'Вы';
var className = 'youChat';
if (v.sender.id !== currentChatUser) {
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>';
});
}
});
$.ajax({
url: '/api/stages/',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'order': orderId},
dataType: 'json',
success: function (json) {
var stageCount = json.results.length;
if (stageCount == 0){
stageCountVal = 1;
}else{
stageCountVal = stageCount;
}
var htmlInbox = "";
var htmlInboxStage = '<p class="textStepss">Какое кол-во этапов подразумевает работа? ' +
'<input type="text" id="countStage" value="'+ stageCountVal +'"size="3"/></p>';
if (stageCount == 0){
htmlInboxStage += '<div class="numberStepp box-sizing" id="stage1">' +
'<p>Этап <span class="stage-span-id">1</span></p><form class="new-stages-form" id="stage-form">' +
'<label for="">Название</label><input class="form-control" name="name" type="text" />' +
'<label for="">Цена</label><input class="form-control" name="cost" type="text" />' +
'<input class="form-control" name="order" type="text" value="'+ orderId +'" class="orderStagesInput"/> />' +
'<label for="">Срок</label><input class="form-control" name="term" type="text" />' +
'<label for="">Результат</label><input class="form-control" name="result" type="text" />' +
'</form></div>';
}
var statusNotAgreed = true;
$.each(json.results, function (i, v) {
if (v.status == "not_agreed") {
htmlInbox += '<div class="numberStepp box-sizing">' +
'<p>Этап</p><form class="update-stages-form" id="stage-form-'+ v.pos +'">' +
'<label for="">Название</label><input class="form-control" type="text" value="'+ v.name +'" />' +
'<label for="">Цена</label><input class="form-control" type="text" value="'+ v.cost +'" />' +
'<input class="form-control" type="hidden" value="'+ v.order +'" />' +
'<label for="">Срок</label><input class="form-control" type="text" value="'+ v.term +'" />' +
'<label for="">Результат</label><input class="form-control" type="text" value="'+ v.result +'" />' +
'</form></div>';
} else {
statusNotAgreed = false;
htmlInboxStage = "";
htmlInbox += '<div class="numberStepp box-sizing"><div class="insetNumStepp">' +
'<p class="titleNumStepp"><span>Этап ' + v.pos + '</span>' + v.name + '</p>' +
'<p class="textNumStepp">Результаты этапа:' + v.result + '</p><div>' +
'<p>до 16.03.2015</p><span>' + v.cost + '<i class="fa fa-rub"></i></span></div></div></div>';
}
});
if (statusNotAgreed) {
htmlInbox += '<div class="box-sizing disTab" style="text-align:center;"><div class="checkbox"><input type="checkbox" style="opacity:1">Перейти в режим безопасной сделки' +
'</div></div><div class="textAreaBlock2 box-sizing disTab">' +
'<a href="javascript:void()" id="addStagesForm">отправить на согласование</a> </div>';
}
htmlInbox = htmlInboxStage + htmlInbox;
$("#order-stages").html(htmlInbox);
}
});
});
// Вытащить сообщения для конактов
$('.user-block').on('click', function () {
var userId = $(this).attr('data-id');
$("#contact-chat-form #recipentId").val(userId);
var inbox = document.getElementById('message-chat-space');
inbox.innerHTML = '';
$.ajax({
url: '/api/message',
type: 'GET',
data: {
csrfmiddlewaretoken: csrftoken,
'operand': 'in',
'sender_id': currentChatUser,
'recipent_id': userId
},
dataType: 'json',
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>';
});
}
});
});
$('#contact-chat-add-message').on('click', function () {
var chatMessage = $("#chat").val();
var recipentId = $("#recipentId").val();
var senderId = $("#senderId").val();
socket.add_contact_message({
"format_type": "add_message_contact",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
}
});
$("#chat").val("");
});
$('#order-chat-add-message').on('click', function () {
var chatMessage = $("#chat-order-add #chat").val();
var recipentId = $("#chat-order-add #recipentId").val();
var senderId = $("#chat-order-add #senderId").val();
var orderId = $("#chat-order-add #orderId").val();
socket.add_contact_message({
"format_type": "add_message_order",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
"order_id": orderId,
}
});
$("#chat-order-add #chat").val("");
});
});
var userId = '{{ request.user.pk }}';
var SocketHandler = function () {
var url = 'ws://127.0.0.1:8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
console.log("Start connect");
intervalId = setInterval(function () {
sock.send('{"dummy": 1}');
}, 150);
};
sock.onmessage = function (event) {
console.log(event.data);
var message = JSON.parse(event.data);
var inbox;
if (message.answer_type == 'contact') {
inbox = document.getElementById('message-chat-space');
} else if (message.answer_type == 'order' || message.answer_type == 'add_order') {
inbox = document.getElementById('message-chat-order-space')
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Иванов</p> <span>13.0.2016</span></div>' +
'<p class="nameCommChat">ВЫ</p> <span>Сейчас</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
};
@ -660,6 +45,12 @@
console.log(data);
};
this.add_team_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
}
this.add_contact_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
@ -677,7 +68,7 @@
sock.send(JSON.stringify(data));
var textareaMessage = document.getElementById("message");
textareaMessage.value = "";
}
}

@ -0,0 +1,75 @@
var SocketHandler = function () {
var userId = {{ request.user.pk }};
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
console.log("Start connect");
intervalId = setInterval(function () {
sock.send('{"dummy": 1}');
}, 150000);
};
sock.onmessage = function (event) {
console.log(event.data);
var message = JSON.parse(event.data);
var inbox;
if (message.answer_type == 'contact' || message.answer_type == 'add_message_contact') {
inbox = document.getElementById('message-chat-space');
} else if (message.answer_type == 'order' || message.answer_type == 'add_message_order') {
inbox = document.getElementById('message-chat-order-space');
} else if (message.answer_type == 'add_message_team') {
inbox = document.getElementById('message-chat-team-space');
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">ВЫ</p> <span>Сейчас</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
};
this.send_order_message = function (orderId) {
var data = {
"format_type": "order_message",
"order_id": orderId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.send_contact_message = function (userId) {
var data = {
"format_type": "add_message",
"user_id": userId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.add_team_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
}
this.add_contact_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
};
this.send_message = function (form) {
var elements = form.elements;
var data = {};
var i = 0;
for (var i; i < elements.length; i++) {
if (elements[i].name == 'message') {
data[elements[i].name] = elements[i].value;
}
}
sock.send(JSON.stringify(data));
var textareaMessage = document.getElementById("message");
textareaMessage.value = "";
}
}

@ -0,0 +1,68 @@
var SocketHandler = function () {
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
console.log("Start connect");
intervalId = setInterval(function () {
sock.send('{"dummy": 1}');
}, 150000);
};
sock.onmessage = function (event) {
console.log(event.data);
var message = JSON.parse(event.data);
var inbox;
if (message.answer_type == 'contact' || message.answer_type == 'add_message_contact') {
inbox = document.getElementById('message-chat-space');
} else if (message.answer_type == 'order' || message.answer_type == 'add_message_order') {
inbox = document.getElementById('message-chat-order-space');
} else if (message.answer_type == 'add_message_team') {
inbox = document.getElementById('message-chat-team-space');
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Вы</p> <span>Сейчас</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
};
this.send_order_message = function (orderId) {
var data = {
"format_type": "order_message",
"order_id": orderId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.send_contact_message = function (userId) {
var data = {
"format_type": "add_message",
"user_id": userId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.add_contact_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
};
this.send_message = function (form) {
var elements = form.elements;
var data = {};
var i = 0;
for (var i; i < elements.length; i++) {
if (elements[i].name == 'message') {
data[elements[i].name] = elements[i].value;
}
}
sock.send(JSON.stringify(data));
var textareaMessage = document.getElementById("message");
textareaMessage.value = "";
}
}

@ -80,9 +80,16 @@
<div class="col-lg-3 wrChat1">
<div class="textAreaBlock2 box-sizing disTab">
<ul class="contractor-notes-block">
</ul>
<form id="add-form-contractor-note">
<p>Для заметок</p>
<textarea id="chat2"></textarea>
<a href="javascript:void()">сохранить</a>
<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>
<a href="#" id="add-note-contractor">сохранить</a>
</form>
</div>
</div>
</div>
@ -246,84 +253,14 @@
{% endblock %}
{% block js_block %}
{# <script type="text/javascript" src="{% static 'js/chat.js' %}"></script>#}
<script type="text/javascript">
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
var SocketHandler = function () {
var userId = {{ request.user.pk }};
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
console.log("Start connect");
intervalId = setInterval(function () {
sock.send('{"dummy": 1}');
}, 150000);
};
sock.onmessage = function (event) {
console.log(event.data);
var message = JSON.parse(event.data);
var inbox;
if (message.answer_type == 'contact' || message.answer_type == 'add_message_contact') {
inbox = document.getElementById('message-chat-space');
} else if (message.answer_type == 'order' || message.answer_type == 'add_message_order') {
inbox = document.getElementById('message-chat-order-space');
} else if (message.answer_type == 'add_message_team') {
inbox = document.getElementById('message-chat-team-space');
}
console.log(message.answer_type);
console.log(message.msg);
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">ВЫ</p> <span>Сейчас</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
};
this.send_contact_message = function (userId) {
var data = {
"format_type": "add_message",
"user_id": userId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.add_team_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
}
this.add_contact_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
};
this.send_message = function (form) {
var elements = form.elements;
var data = {};
var i = 0;
for (var i; i < elements.length; i++) {
if (elements[i].name == 'message') {
data[elements[i].name] = elements[i].value;
}
}
sock.send(JSON.stringify(data));
var textareaMessage = document.getElementById("message");
textareaMessage.value = "";
}
}
</script>
<script type="text/javascript" src='{% static "js/chat.js" %}'></script>
<script type="text/javascript">
$(function () {
var currentChatUser = {{ request.user.pk }};
var socket = new SocketHandler();
@ -533,7 +470,8 @@
});
$('#add-note-button').on('click', function () {
$('#add-note-button').on('click', function (e) {
e.preventDefault();
$.ajax({
url: '/api/note/',
type: 'POST',
@ -554,10 +492,13 @@
});
});
// Вытащить сообщения для конактов
$('.user-block').on('click', function () {
var userId = $(this).attr('data-id');
$("#contact-chat-form #recipentId").val(userId);
$("#add-form-contractor-note #recipentNoteContractor").val(userId);
$('.user-block').each(function () {
$(this).removeClass('mesAct');
});
@ -591,6 +532,25 @@
}
});
$.ajax({
url: '/api/note/',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken,
'operand': 'in',
'sender_id': currentChatUser,
'recipent_id': userId},
dataType: 'json',
success: function (json) {
console.log(json.results);
var noteHtmlInbox = '';
$.each(json.results, function (i, v) {
noteHtmlInbox += '<li>' + v.text + '<li>';
});
$(".contractor-notes-block").html(noteHtmlInbox);
}
});
});
//Добавить сообщение для исполнителей в группе

@ -80,9 +80,15 @@
</div>
<div class="col-lg-3 wrChat1">
<div class="textAreaBlock2 box-sizing disTab">
<ul class="contractor-notes-block">
</ul>
<form id="add-form-contractor-note">
<p>Для заметок</p>
<textarea id="chat2"></textarea>
<a href="#">сохранить</a>
<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>
<a href="#" id="add-note-contractor">сохранить</a>
</form>
</div>
</div>
</div>
@ -192,7 +198,7 @@
<div class="textAreaBlock2 box-sizing disTab">
<p>Для заметок</p>
<textarea id="chat2"></textarea>
<a href="javascript:void()">сохранить</a>
<a href="#">сохранить</a>
</div>
@ -267,14 +273,20 @@
{% block js_block %}
<script type="text/javascript">
var userId = {{ request.user.pk }};
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
</script>
<script type="text/javascript" src='{% static "js/chat.js" %}'></script>
<script type="text/javascript">
$(function () {
var currentChatUser = {{ request.user.pk }};
var socket = new SocketHandler();
var form = document.getElementById('message_form');
var csrftoken = getCookie('csrftoken');
function getStages(orderId) {
function getStages(orderId, senderId, recipentId) {
$.ajax({
url: '/api/stages/',
@ -299,7 +311,7 @@
'<p>Этап <span class="stage-span-id">1</span></p><form class="new-stages-form" id="stage-form">' +
'<label for="">Название</label><input class="form-control" name="name" type="text" />' +
'<label for="">Цена</label><input class="form-control" name="cost" type="text" />' +
'<input class="form-control" name="order" type="hidden" value="' + orderId + '" class="orderStagesInput"/>' +
'<input class="form-control orderStagesInput" name="order" type="hidden" value="' + orderId + '"/>' +
'<label for="">Срок</label><input class="form-control" name="term" type="text" />' +
'<label for="">Результат</label><input class="form-control" name="result" type="text" />' +
'</form></div>';
@ -311,7 +323,7 @@
'<p>Этап</p><form class="update-stages-form" data-stage-id="' + v.id + '" id="stage-form-' + v.pos + '">' +
'<label for="">Название</label><input class="form-control" type="text" name="name" value="' + v.name + '" />' +
'<label for="">Цена</label><input class="form-control" type="text" name="cost" value="' + v.cost + '" />' +
'<input class="form-control" type="hidden" name="order" value="' + v.order + '" />' +
'<input class="form-control orderStagesInput" type="hidden" name="order" value="' + v.order + '"/>' +
'<label for="">Срок</label><input class="form-control" type="text" name="term" value="' + v.term + '" />' +
'<label for="">Результат</label><input class="form-control" type="text" name="result" value="' + v.result + '" />' +
'</form></div>';
@ -329,7 +341,7 @@
if (statusNotAgreed) {
htmlInbox += '<div class="box-sizing disTab" style="text-align:center;"><div class="checkbox"><input type="checkbox" style="opacity:1">Перейти в режим безопасной сделки' +
'</div></div><div class="textAreaBlock2 box-sizing disTab">' +
'<a href="#" data-order-id="' + orderId + '" id="addStagesForm">отправить на согласование</a> </div>';
'<a href="#" data-sender-id="' + senderId +'" data-recipent-id="' + recipentId +'" data-order-id="' + orderId + '" id="addStagesForm">отправить на согласование</a> </div>';
}
htmlInbox = htmlInboxStage + htmlInbox;
$("#order-stages").html(htmlInbox);
@ -392,8 +404,20 @@
var currentOrderId = $(this).attr('data-order-id');
currentOrderId = parseInt(currentOrderId);
getStages(currentOrderId);
var currentRecipentId = $(this).attr('data-recipent-id');
{# currentOrderId = parseInt(currentOrderId);#}
{# currentRecipentId= parseInt(currentRecipentId);#}
getStages(currentOrderId,userId,currentRecipentId);
socket.send_stages_approve({
"format_type": "approve_stages",
"data": {
"sender_id": userId,
"recipent_id": currentRecipentId,
"order_id": currentOrderId,
}
});
});
@ -401,19 +425,45 @@
$('#order-stages-tab').on('change', '#countStage', function () {
var countStage = parseInt($(this).val());
var currentCountStage = $(".numberStepp").length;
alert(countStage);
alert(currentCountStage);
var updateFormStages = $(".update-stages-form");
var limitCount = countStage + 1;
for (var i = 2; i < limitCount; i++) {
var stageCopy = $("#stage1").clone().attr("id", "stage" + i).addClass("stages_form");
stageCopy.find('.stage-span-id').html(i);
//var j = i-1;
// var prevStage = "#stage" + j;
$("#stage1").after(stageCopy);
if (countStage > currentCountStage){
for(var jj=currentCountStage; jj<countStage;jj++){
var lastFormStage = $(".numberStepp").last();
var orderId = lastFormStage.find('.orderStagesInput').val();
var addFormTemplate = '<div class="numberStepp box-sizing" id="stage1">' +
'<p>Этап <span class="stage-span-id">1</span></p><form class="new-stages-form" id="stage-form">' +
'<label for="">Название</label><input class="form-control" name="name" type="text" />' +
'<label for="">Цена</label><input class="form-control" name="cost" type="text" />' +
'<input class="form-control orderStagesInput" name="order" type="hidden" value="' + orderId + '" />' +
'<label for="">Срок</label><input class="form-control" name="term" type="text" />' +
'<label for="">Результат</label><input class="form-control" name="result" type="text" />' +
'</form></div>';
lastFormStage.after(addFormTemplate);
}
}else if (countStage < currentCountStage) {
var ii = currentCountStage;
$($(".numberStepp").get().reverse()).each(function(){
var currenFormName = ($(this).find('form').attr('class'));
if(ii>countStage) {
$(this).remove();
}
ii--;
});
}
{# #}
{# var updateFormStages = $(".update-stages-form");#}
{# var limitCount = countStage + 1;#}
{# for (var i = 2; i < limitCount; i++) {#}
{# var stageCopy = $("#stage1").clone().attr("id", "stage" + i).addClass("stages_form");#}
{# stageCopy.find('.stage-span-id').html(i);#}
{# $("#stage1").after(stageCopy);#}
{##}
{# }#}
});
$('.order-block').on('click', function () {
@ -455,14 +505,14 @@
});
}
});
getStages(orderId);
getStages(orderId,userId,recipentId);
});
// Вытащить сообщения для конактов
$('.user-block').on('click', function () {
var userId = $(this).attr('data-id');
$("#contact-chat-form #recipentId").val(userId);
$("#add-form-contractor-note #recipentNoteContractor").val(userId);
$('.user-block').each(function () {
$(this).removeClass('mesAct');
@ -498,6 +548,7 @@
});
$('#contact-chat-add-message').on('click', function () {
var chatMessage = $("#chat").val();
var recipentId = $("#recipentId").val();
@ -540,74 +591,7 @@
});
});
var userId = '{{ request.user.pk }}';
var SocketHandler = function () {
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
console.log("Start connect");
intervalId = setInterval(function () {
sock.send('{"dummy": 1}');
}, 150);
};
sock.onmessage = function (event) {
console.log(event.data);
var message = JSON.parse(event.data);
var inbox;
if (message.answer_type == 'contact' || message.answer_type == 'add_message_contact') {
inbox = document.getElementById('message-chat-space');
} else if (message.answer_type == 'order' || message.answer_type == 'add_message_order') {
inbox = document.getElementById('message-chat-order-space')
}
inbox.innerHTML += '<div class="col-lg-12 insetCommChat"><div class="topCommChat">' +
'<p class="nameCommChat">Вы</p> <span>Сейчас</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
};
this.send_order_message = function (orderId) {
var data = {
"format_type": "order_message",
"order_id": orderId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.send_contact_message = function (userId) {
var data = {
"format_type": "add_message",
"user_id": userId
}
sock.send(JSON.stringify(data));
console.log(data);
};
this.add_contact_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
};
this.send_message = function (form) {
var elements = form.elements;
var data = {};
var i = 0;
for (var i; i < elements.length; i++) {
if (elements[i].name == 'message') {
data[elements[i].name] = elements[i].value;
}
}
sock.send(JSON.stringify(data));
var textareaMessage = document.getElementById("message");
textareaMessage.value = "";
}
}
</script>
{% endblock %}

@ -43,13 +43,25 @@ class ChatHandler(websocket.WebSocketHandler):
if 'dummy' in parsed:
return
print(parsed['format_type'])
if 'approve_stages' in parsed['format_type']:
self.approve_stages(parsed)
else:
self.add_message(parsed)
def on_close(self):
self.waiters.remove((self.user_id, self))
# waiter.write_message({'msg': message, 'answer_type': 'add_contact'})
# waiter.write_message({'msg': message, 'answer_type': 'add_order'})
@gen.coroutine
def approve_stages(self, data):
print(data)
sender_id = data['data']['sender_id']
recipent_id = data['data']['recipent_id']
order_id = data['data'].get('order_id')
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': 'Этапы обновлены', 'answer_type': answer_type})
@gen.coroutine
def add_message(self, message_data):

@ -14,11 +14,11 @@ class Review(models.Model):
type = models.CharField(max_length=30, choices=TYPE_REVIEWS, default='neutral')
text = models.TextField()
created = models.DateTimeField(default=timezone.now)
target_customer = models.ForeignKey('users.User', related_name='reviews_by_contractor', null=True, blank=True)
target_contractor = models.ForeignKey('users.User', related_name='reviews_by_customer', null=True, blank=True)
target_customer = models.ForeignKey('users.User', related_name='reviews_by_customer', null=True, blank=True)
target_contractor = models.ForeignKey('users.User', related_name='reviews_by_contractor', null=True, blank=True)
target_team = models.ForeignKey('users.Team', related_name='reviews_by_team', null=True, blank=True)
from_customer = models.ForeignKey('users.User', related_name='contractor_reviews', null=True, blank=True)
from_contractor = models.ForeignKey('users.User', related_name='customer_reviews', null=True, blank=True)
from_customer = models.ForeignKey('users.User', related_name='customer_reviews', null=True, blank=True)
from_contractor = models.ForeignKey('users.User', related_name='contractor_reviews', null=True, blank=True)
from_team = models.ForeignKey('users.Team', related_name='team_reviews', null=True, blank=True)
def __str__(self):

@ -1,5 +1,6 @@
{% load staticfiles %}
{% load thumbnail %}
{% load user_tags %}
<div class="wrTop {% if request.user.is_authenticated %} disTab {% endif %}">
<div class="container-fluid topMain">
@ -122,11 +123,7 @@
</div>
{% if request.user.is_contractor %}
<div class="rating">
<div class="ratingInset"></div>
<div class="iconRating"></div>
</div>
<p class="ratingPer">45%</p>
{% contractor_indicator request.user %}
{% endif %}
</div>
{% else %}

@ -463,11 +463,11 @@
<div id="tab14" class="tab-pane fade">
{% for review in contractor.contractor_reviews.all %}
{% for review in contractor.reviews_by_contractor.all %}
<div class="new-comm-44">
<div class="col-lg-12">
<p class="nameComm">
<a href="#">{{ review.get_sender }}</a>
<a href="">{{ review.get_sender }}</a>
</p>
{% if review.project.deal_type == 'secure_deal' %}
<span class="dateComm44">
@ -478,7 +478,7 @@
<a href="#">положительный отзыв</a>
</div>
<p class="textComm44">
{{ review.text }}
{{ review.text|safe }}
</p>
</div>
</div>

@ -0,0 +1,5 @@
<div class="rating">
<div class="ratingInset" style="clip:rect(0px, {{ current_indicator_px }}px, 50px, 0px);"></div>
<div class="iconRating"></div>
</div>
<p class="ratingPer">{{ current_indicator }}%</p>

@ -1,8 +1,27 @@
import math
from django import template
register = template.Library()
@register.inclusion_tag('templatetags/contractor_indicator.html', takes_context=True)
def contractor_indicator(context, contractor):
fields = ['avatar','cro','first_name','gender',
'last_name', 'patronym', 'phone',
'skype','website','location']
indicator_sum = 0
for f in fields:
if hasattr(contractor,f) and getattr(contractor, f):
indicator_sum += 1
current_indicator = math.ceil(math.ceil(100 / len(fields)) * indicator_sum)
current_indicator_px = math.ceil(current_indicator / 2)
return {
'current_indicator': current_indicator,
'current_indicator_px': current_indicator_px,
}
@register.filter('has_group')
def has_group(user, group_name):

Loading…
Cancel
Save