remotes/origin/setup
ArturBaybulatov 10 years ago
commit 29b1d99301
  1. 20
      archilance/settings/base.py
  2. 52
      assets/css/extra.css
  3. 3
      assets/index.js
  4. 17
      chat/models.py
  5. 127
      chat/templates/chat_contractor.html
  6. 4
      chat/views.py
  7. 2
      projects/models.py
  8. 23
      templates/partials/base.html
  9. 1
      users/models.py
  10. 17
      users/templates/contractor_profile.html
  11. 1
      work_sell/views.py

@ -43,16 +43,16 @@ THIRD_PARTY_APPS = [
]
LOCAL_APPS = [
'api',
'common',
'work_sell',
'archilance',
'projects',
'specializations',
'users',
'reviews',
'chat',
'wallets',
'specializations',
'api',
'common',
'work_sell',
'archilance',
'projects',
'users',
'reviews',
'chat',
'wallets',
]
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS

@ -4,11 +4,11 @@
border-radius: 40px;
font-size: 15px;
font-family: 'Arial-MT-Regular', sans-serif;
}
}
.btn-group.valProject2 a.btn span mark {
background: none;
color: #ff2c2c;
color: #ff2c2c;
}
.btn-group.valProject2 a.btn > span {
@ -34,32 +34,35 @@
* Simple fade transition,
*/
.mfp-fade.mfp-bg {
opacity: 0;
-webkit-transition: all 0.15s ease-out;
-moz-transition: all 0.15s ease-out;
transition: all 0.15s ease-out;
opacity: 0;
-webkit-transition: all 0.15s ease-out;
-moz-transition: all 0.15s ease-out;
transition: all 0.15s ease-out;
}
.mfp-fade.mfp-bg.mfp-ready {
opacity: 0.8;
opacity: 0.8;
}
.mfp-fade.mfp-bg.mfp-removing {
opacity: 0;
opacity: 0;
}
.mfp-fade.mfp-wrap .mfp-content {
opacity: 0;
-webkit-transition: all 0.15s ease-out;
-moz-transition: all 0.15s ease-out;
transition: all 0.15s ease-out;
opacity: 0;
-webkit-transition: all 0.15s ease-out;
-moz-transition: all 0.15s ease-out;
transition: all 0.15s ease-out;
}
.mfp-fade.mfp-wrap.mfp-ready .mfp-content {
opacity: 1;
opacity: 1;
}
.mfp-fade.mfp-wrap.mfp-removing .mfp-content {
opacity: 0;
opacity: 0;
}
#jGrowl .jGrowl-notification {
background-color: #00bb7b;
font-size: 17px;
@ -69,16 +72,27 @@
margin: 0;
}
.stepssBlock ul li.reserved::before {
background: rgba(0, 0, 0, 0) url("../img/reserved2.png") no-repeat scroll center center / cover ;
background: rgba(0, 0, 0, 0) url("../img/reserved2.png") no-repeat scroll center center / cover;
height: 16px;
width: 17px;
}
.stepssBlock ul li.unreserved::before {
background: rgba(0, 0, 0, 0) url("../img/reserved.png") no-repeat scroll center center / cover ;
background: rgba(0, 0, 0, 0) url("../img/reserved.png") no-repeat scroll center center / cover;
height: 14px;
width: 13px;
}
.chat-textarea {
width: 100%;
height: 110px;
border: 1px solid #cdcdcd;
resize: none;
padding: 10px 15px;
color: #3c1a06;
font-family: 'Arial-MT-Regular', sans-serif;
font-size: 14px;
float: left;
margin: 33px 0 0 0;
}

@ -547,3 +547,6 @@ function getCookie(name) {
}
return cookieValue;
}

@ -36,6 +36,17 @@ class Notes(models.Model):
verbose_name = 'Заметка'
verbose_name_plural = 'Заметки'
# class Channel(models.Model):
# owner = models.ForeignKey(User, related_name='chanells')
# companion = models.ForeignKey(User, related_name='companion_channels')
class Documents(models.Model):
file = models.FileField(upload_to='chat/documents/')
order = models.ForeignKey(Order, related_name='order_documents',null=True, blank=True)
team = models.ForeignKey(Team, related_name='team_documents',null=True, blank=True)
sender = models.ForeignKey(User, related_name='sender_documents')
recipent = models.ForeignKey(User, related_name='recipent_documents')
def __str__(self):
return self.file.url
class Meta:
verbose_name = 'Входящие Документы'
verbose_name_plural = 'Входящие Документы'

@ -47,8 +47,7 @@
{% endthumbnail %}
</div>
<p class="nameMess">
<a href="#">
{{ contact.username }}{{ contact.username }}{{ contact.first_name }} {{ contact.last_name }}</a>
<div><a href="#" style="color:black;">{{ contact.username }}</a></div>
</p>
<a href="javascript:void(0)" class="conMess">Контакты</a>
@ -172,7 +171,7 @@
<div class="messageBlock box-sizing disTab">
<p>Заказы</p>
{% for torder in team_orders %}
<div class="team-order-block orderBlock box-sizing orAct" data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk}}">
<div class="team-order-block orderBlock box-sizing" data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk}}">
<span class="dimovChat"></span>
<p class="titleOB">
{{ torder }}
@ -184,14 +183,16 @@
</p>
<ul class="listChat1">
{% for tuser in torder.team.users.all %}
<li>{{ tuser }}</li>
<li>{{ tuser }}</li>
{% endfor %}
</ul>
<p class="pOB">
<span>Чаты:</span>
{% for tuser in torder.team.users.all %}
{% if request.user.pk != tuser.pk %}
<span class="team-chat-user" data-id="{{ tuser.pk }}">{{ tuser.username }},</span>
{% endif %}
{% endfor %}
</p>
<a href="javascript:void(0)" class="linkChat11">
@ -204,19 +205,21 @@
</div>
</div>
<div class="col-lg-6 commChat">
<div id="message-chat-team-space"></div>
<form id="team-chat-form">
<input type="text" name="sender" id="senderId" value="{{ request.user.pk }}" />
<input type="text" name="recipent" id="recipentId" value="" />
<input type="text" name="order" id="orderId" value="" />
<input type="text" name="team" id="teamId" value="" />
<textarea id="chatText" class="box-sizing"></textarea>
<textarea id="chatText" class="chat-textarea box-sizing"></textarea>
<div class="bunChat">
<div class="setChat box-sizing">
<div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-team"/>
<p>Прикрепить файл</p>
<span>
Не более 10 файлов с общим объемом 500мб
</span>
</div>
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
</div>
<a href="javascript:void(0)" id="add-team-chat-message">отправить</a>
</div>
</form>
@ -238,6 +241,11 @@
{# <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 url = 'ws://127.0.0.1:8888/chat/' + userId + '/';
@ -258,7 +266,12 @@
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>13.0.2016</span></div>' +
'<p class="textCommChat">' + message.msg + '</p></div>';
@ -274,6 +287,7 @@
};
this.add_team_message = function(messageData){
console.log(messageData);
sock.send(JSON.stringify(messageData));
}
@ -305,23 +319,106 @@
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) {
alert(file.url);
{# var htmlImg = '<div class="col-lg-4"><div class="insetCol box-sizing disTab"><div class="imgGal" style="background: url(+ file.url +) no-repeat center;"><div class="imgFigure"></div></div></div> ' +#}
{# '<div class="insetCol2 box-sizing disTab"><p>Название</p><div class="buttonsImg" distab="">' +#}
{# '<div class="insetBI insetBI2"><i class="fa fa-times"></i></div></div></div></div>';#}
{##}
{# var img = $(htmlImg).appendTo("#diplom-gallery");#}
});
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
alert(progress);
$('#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(){
var recipentId = $(this).attr('data-id');
$("#team-chat-form #recipentId").val(recipentId);
$(".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>';
});
}
});
});
// Вытащить сообщения для чата заказа
@ -474,6 +571,7 @@
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();
socket.add_team_message({
"format_type": "add_message_team",
@ -482,8 +580,11 @@
"recipent_id": recipentId,
"chat_message": chatMessage,
"team_id": teamId,
"order_id": orderId,
}
});
$("#team-chat-form #chatText").val("");
});
// Добавить сообщение для контакта

@ -14,7 +14,7 @@ class ChatUserView(View):
def get(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer():
customer_contacts = Message.objects.values_list('sender_id', 'recipent_id'). \
filter(Q(recipent_id=request.user.pk) | Q(sender_id=request.user.pk)).distinct()
filter(Q(recipent_id=request.user.pk) | Q(sender_id=request.user.pk)).filter(Q(team_id=None)).distinct()
users_ids = []
for msg in customer_contacts:
@ -34,7 +34,7 @@ class ChatUserView(View):
else:
orders = request.user.orders.all()
contractor_contacts = Message.objects.values_list('sender_id', 'recipent_id').filter(
Q(recipent_id=request.user.pk) | Q(sender_id=request.user.pk)).distinct()
Q(recipent_id=request.user.pk) | Q(sender_id=request.user.pk)).filter(Q(team_id=None)).distinct()
users_ids = []
for msg in contractor_contacts:
a, b = msg

@ -121,7 +121,7 @@ class Answer(models.Model):
budget = models.DecimalField(max_digits=10, decimal_places=0)
created = models.DateTimeField(default=timezone.now)
currency = models.CharField(max_length=5, choices=CURRENCIES, default='rur')
portfolios = models.ManyToManyField('Portfolio', related_name ='answers', blank=True)
portfolios = models.ManyToManyField('Portfolio', related_name ='portfolios_answers', blank=True)
project = models.ForeignKey(Project, related_name='answers')
secure_deal_only = models.BooleanField(default=False)
term = models.IntegerField(default=0)

@ -71,5 +71,28 @@
{% block js_block %}
{% endblock %}
<script type="text/javascript">
var userId = '{{ request.user.pk }}';
var SocketHandlerMain = 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}');
}, 150000);
};
sock.onmessage = function (event) {
var notificationData = JSON.parse(event.data);
$.jGrowl("Вам пришло новое сообщение!" + notificationData.msg, {sticky: true});
};
}
$(function () {
var socketMain = new SocketHandlerMain();
});
</script>
</body>
</html>

@ -20,6 +20,7 @@ class UserManager(BaseUserManager):
user = self.model(username=username,
email=UserManager.normalize_email(email),)
user.set_password(password)
user.save(using=self._db)
return user

@ -432,25 +432,8 @@
{% block js_block %}
<script type="text/javascript">
var userId = '{{ contractor.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}');
}, 150000);
};
sock.onmessage = function (event) {
var notificationData = JSON.parse(event.data);
$.jGrowl("Вам пришло новое сообщение!" + notificationData.msg, {sticky: true});
};
}
$(function () {
var socket = new SocketHandler();
$('#worksell-add-form').on('submit', function (e) {
e.preventDefault();
var dataSerializer = $(this).serialize();

@ -11,6 +11,7 @@ from .forms import WorkSellForm
from .serialize import serialize
from .response import JSONResponse, response_mimetype
class PictureCreateView(CreateView):
model = Picture
fields = '__all__'

Loading…
Cancel
Save