#ARC-23 Fix bugs

remotes/origin/PR-39
Mukhtar 10 years ago
parent 96e2c1be44
commit 419a21ff23
  1. 2
      api/views.py
  2. 17
      archilance/settings/base.py
  3. BIN
      assets/img/favicon.jpg
  4. BIN
      assets/img/favicon128.jpg
  5. BIN
      assets/img/favicon18.jpg
  6. BIN
      assets/img/favicon50.jpg
  7. 47
      assets/js/chat.js
  8. 2
      chat/admin.py
  9. 4
      chat/chat.py
  10. 26
      chat/migrations/0010_auto_20160901_1247.py
  11. 2
      chat/models.py
  12. 12
      chat/serializers.py
  13. 28
      chat/templates/chat_contractor.html
  14. 19
      chat/templates/contact-info.html
  15. 21
      chat/templates/order_info.html
  16. 5
      chat/templates/reverse_stage_modal.html
  17. 35
      projects/migrations/0024_auto_20160901_1247.py
  18. 43
      projects/serializers.py
  19. 6
      users/pipeline.py
  20. 2
      users/signals.py
  21. 4
      users/templates/add_email_form.html
  22. 21
      wallets/migrations/0012_auto_20160901_1247.py
  23. 20
      work_sell/migrations/0009_auto_20160901_1247.py

@ -73,7 +73,7 @@ class DocumentViewSet(ModelViewSet):
queryset = Documents.objects.all()
serializer_class = DocumentsSerializer
# filter_class = DocumentsFilterSet
# permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
def get_queryset(self):
queryset = Documents.objects.all()

@ -111,6 +111,8 @@ TEMPLATES = [
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
'django.core.context_processors.request',
'social.apps.django_app.context_processors.backends',
'social.apps.django_app.context_processors.login_redirect',
],
# Load these templatetags by default:
@ -189,11 +191,11 @@ SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = 's69NCyhSlwY0OuGGT8_dFI7E'
# SOCIAL_AUTH_TWITTER_KEY = 'YAe05K4IYYxHhA6J1mTOdDBjq'
# SOCIAL_AUTH_TWITTER_SECRET = 'iRuYqRRaoGkCD4ip74NICb8FeZMxvM6MZ8HLMbm1jX99o7pcaL'
SOCIAL_AUTH_TWITTER_KEY = 'vZvKDqyosgeGuRwnY8mKy9sHV'
SOCIAL_AUTH_TWITTER_SECRET = 'ulPAOEMWscoBh7hldpKXXQksACUuSfp25GWAOSv5PiMV1o6Sah'
SOCIAL_AUTH_TWITTER_KEY = 'dRdPuFDlx8kMxJmECRNjd7ng9'
SOCIAL_AUTH_TWITTER_SECRET = 'WhXRHP6BzNwFS8x94pcaCBwxCSMkAEVm3Rg82XhzUaIqsf2Ur0'
SOCIAL_AUTH_VK_OAUTH2_KEY = '5469025'
SOCIAL_AUTH_VK_OAUTH2_SECRET = '3Wild7HqYq6YFiLz9i7l'
SOCIAL_AUTH_VK_OAUTH2_KEY = '5542865'
SOCIAL_AUTH_VK_OAUTH2_SECRET = 'BsOSDhmyNiDte7cMJlVq'
SOCIAL_AUTH_VK_OAUTH2_SCOPE = [
'notify',
@ -201,9 +203,10 @@ SOCIAL_AUTH_VK_OAUTH2_SCOPE = [
'email',
]
SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/'
SOCIAL_AUTH_NEW_USER_REDIRECT_URL = '/'
SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = '/'
# SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/'
# SOCIAL_AUTH_NEW_USER_REDIRECT_URL = 'http://proekton.com/'
# SOCIAL_AUTH_NEW_ASSOCIATION_REDIRECT_URL = 'http://proekton.com/'
SOCIAL_AUTH_PIPELINE = (
'social.pipeline.social_auth.social_details',

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

@ -1,6 +1,6 @@
var SocketHandler = function () {
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + '/chat/' + userId + '/';
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
@ -35,6 +35,7 @@ var SocketHandler = function () {
}, 2000);
console.log('approve stages');
}
if (inbox) {
var textMessage = message.msg;
var classMessage = 'youChat';
@ -106,6 +107,7 @@ function csrfSafeMethod(method) {
var socket = new SocketHandler();
var csrftoken = getCookie('csrftoken');
$(function () {
var currentHash = URI(location.href).hash();
@ -133,7 +135,28 @@ $(function () {
$(".full-order-info").click('on',function(e){
e.preventDefault();
e.stopPropagation();
$("#order-info").modal('show');
var orderId = $(this).closest('.orderBlock').attr('data-id');
$.ajax({
url: '/api/orders/' + orderId + '/',
data: {
csrfmiddlewaretoken: csrftoken,
},
dataType: 'json',
success: function(data){
var outTable = '';
outTable += '<tr><td>Название</td><td>'+data.project.name +'</td>';
outTable += '<tr><td>Безопасная сделка</td><td>'+data.secure +'</td>';
if(data.project.realty) {
outTable += '<tr><td>Тип здания</td><td>' + data.project.realty.building_classification.name + '</td>';
outTable += '<tr><td>Классификация здания</td><td>' + data.project.realty.construction_type.name + '</td>';
}
$("#order-info table").html(outTable);
$("#order-info").modal('show');
},
error: function(e,jqxhr){
console.log(e);
}
});
});
$(".conMess").click('on',function(e){
@ -143,6 +166,12 @@ $(function () {
});
$("#paymentfromSite").on('click',function(){
var sum = $("#stageSumPay").val();
alert(sum);
});
// Вытащить сообщения для конактов
$('.user-block').on('click', function () {
@ -296,7 +325,7 @@ $(function () {
var orderId = $("#chat-order-add #orderId").val();
if (chatMessage) {
$("#chat-order-add .errorEmptyMessage").hide();
//$("#chat-order-add .errorEmptyMessage").hide();
chatMessage += '<br />' + $("#document-send-order").html();
socket.add_contact_message({
"format_type": "add_message_order",
@ -325,13 +354,19 @@ $(function () {
var senderId = $("#senderContactId").val();
if (chatMessage) {
$("#contact-chat-form .errorEmptyMessage").hide();
chatMessage += '<br />' + $("#document-send-contact").html();
var sendLinks = $("#document-send-contact a");
var sendLinkIds = "";
$.each(sendLinks, function(i, v){
sendLinkIds += $(this).attr('data-id') + ';';
});
console.log(sendLinkIds);
socket.add_contact_message({
"format_type": "add_message_contact",
"data": {
"sender_id": senderId,
"recipent_id": recipentId,
"chat_message": chatMessage,
"document_send_links": sendLinkIds,
}
});
$("#chat").val("");
@ -424,7 +459,7 @@ $(function () {
// var currentValue = '';
// currentValue += file.id + ';';
//$("#documentSendIds").val(currentValue);
var htmlImg = '<p>' + file.name + '</p>';
var htmlImg = '<a href="'+ file.url+'" class="send-doc" data-id="'+ file.id +'">' + file.name + '</a>';
var document_send = $(htmlImg).appendTo("#document-send-order");
});
},
@ -467,7 +502,7 @@ $(function () {
dataType: 'json',
done: function (e, data) {
$.each(data.result.files, function (index, file) {
var htmlImg = '<a href="#">' + file.name + '</a>';
var htmlImg = '<a href="'+ file.url+'" class="send-doc" data-id="'+ file.id +'">' + file.name + '</a>';
var document_send = $(htmlImg).appendTo("#document-send-contact");
});
},

@ -11,7 +11,7 @@ class NotesAdmin(admin.ModelAdmin):
class DocumentsAdmin(admin.ModelAdmin):
list_display = ('file', 'sender', 'recipent', 'order','team')
list_display = ('sender', 'recipent', 'order','team')
admin.site.register(Message, MessageAdmin)

@ -59,7 +59,9 @@ class ChatHandler(websocket.WebSocketHandler):
order_id = message_data['data'].get('order_id', None)
team_id = message_data['data'].get('team_id', None)
message = message_data['data'].get('chat_message', None)
# message = html.escape(message)
document_send_links = message_data['data'].get('document_send_links', None)
message = html.escape(message)
message = message.replace('\n', '<br />')
answer_type = message_data['format_type']

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-01 09:47
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('chat', '0009_auto_20160829_1120'),
]
operations = [
migrations.AddField(
model_name='documents',
name='is_send',
field=models.BooleanField(default=False),
),
migrations.AddField(
model_name='documents',
name='message',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='documents', to='chat.Message'),
),
]

@ -46,6 +46,8 @@ class Documents(models.Model):
sender = models.ForeignKey(User, related_name='sender_documents')
recipent = models.ForeignKey(User, related_name='recipent_documents', null=True, blank=True)
created = models.DateTimeField(auto_now_add=True)
is_send = models.BooleanField(default=False)
message = models.ForeignKey(Message, related_name='documents', null=True, blank=True)
def __str__(self):
return self.file.url

@ -14,6 +14,7 @@ class DocumentsSerializer(ModelSerializer):
model = Documents
fields = (
'id',
'file',
'file_size',
'file_url',
@ -21,6 +22,8 @@ class DocumentsSerializer(ModelSerializer):
'recipent',
'team',
'order',
'is_send',
'message',
)
def get_file(self, obj):
@ -38,6 +41,8 @@ class MessageSerializer(ModelSerializer):
sender = UserSerializer()
recipent = UserSerializer()
created = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")
documents = DocumentsSerializer(read_only=True, many=True)
text = serializers.SerializerMethodField()
class Meta:
model = Message
@ -50,8 +55,15 @@ class MessageSerializer(ModelSerializer):
'recipent',
'private_type',
'team',
'documents',
)
def get_text(self, obj):
out = obj.text
documents = '<br />'.join([doc.file.name for doc in obj.documents.all()])
out += '<br />' + documents
return out
class NoteSerializer(ModelSerializer):

@ -142,14 +142,14 @@
<div class="col-lg-6 commChat">
<div id="message-chat-order-space"></div>
<form id="chat-order-add">
<input type="hidden" id="orderId">
<input type="hidden" id="senderId" value="{{ request.user.pk }}"/>
<input type="hidden" id="recipentId">
<input type="text" id="orderId" name="orderId">
<input type="text" id="senderId" name="senderId" value="{{ request.user.pk }}">
<input type="text" id="recipentId" name="recipentId" value="">
<textarea id="chat" class="box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя отправить</p>
<div class="bunChat">
<div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-order"/>
<input type="file" name="file" id="upload-document-order">
<p>Прикрепить файл</p>
</div>
<div id="document-send-order"></div>
@ -164,7 +164,7 @@
<div class="stepssBlock box-sizing disTab">
<p class="titleStepss">1 / Согласование условий</p>
<p class="textStepss">
Обсуджение задания и условий выполнения работы.
Обсуждение задания и условий выполнения работы.
Подтверждение заказа исполнителем.
</p>
</div>
@ -204,12 +204,6 @@
<!-- Arbitration add -->
{% include 'arbitration_modal.html' %}
<!-- -->
<!-- order-info -->
{% include 'order_info.html' %}
<!-- -->
<div class="textAreaBlock2 box-sizing disTab">
<ul class="notes-block">
</ul>
@ -234,7 +228,7 @@
<p>Заказы</p>
{% for torder in team_orders %}
<div class="team-order-block orderBlock box-sizing"
data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk }}">
data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk }}" data-id="{{ torder.pk }}">
<span class="dimovChat"></span>
<p class="titleOB">
{{ torder }}
@ -273,9 +267,9 @@
<div class="col-lg-6 commChat">
<div id="message-chat-team-space"></div>
<form id="team-chat-form">
<input type="hidden" name="sender" id="senderId" value="{{ request.user.pk }}"/>
<input type="hidden" name="recipent" id="recipentId" value=""/>
<input type="hidden" name="order" id="orderId" value=""/>
<input type="hidden" name="sender" id="senderTeamId" value="{{ request.user.pk }}"/>
<input type="hidden" name="recipent" id="recipenTeamtId" value=""/>
<input type="hidden" name="order" id="orderTeamId">
<input type="hidden" name="team" id="teamId" value=""/>
<input type="hidden" name="document-send" id="documentSendIds"/>
<textarea id="chatText" class="chat-textarea box-sizing"></textarea>
@ -299,6 +293,10 @@
</div>
<!-- End block Tab3-->
{% endif %}
<!-- order-info -->
{% include 'order_info.html' %}
<!-- -->
</div>
{% include 'partials/footer.html' %}
</div>

@ -6,17 +6,16 @@
</button>
<h4 class="modal-title">Контакты</h4>
</div>
<form id="arbitration-add-form" method="POST">
<div class="modal-body">
<div class="modal-body">
<table class="table">
<tr>
<td>Ф.И.О.</td>
<td></td>
</tr>
</table>
</div>
<div class="modal-footer"></div>
<table class="table">
<tr>
<td>Ф.И.О.</td>
<td></td>
</tr>
</table>
</div>
<div class="modal-footer"></div>
</div>
</div>
</div>

@ -6,27 +6,8 @@
</button>
<h4 class="modal-title">Полное описапие заказа</h4>
</div>
<form id="arbitration-add-form" method="POST">
<div class="modal-body">
<table class="table">
<tr>
<td>Название заказа</td>
<td>Название</td>
</tr>
<tr>
<td>Исполнитель</td>
<td>Название</td>
</tr>
<tr>
<td>Дата создания</td>
<td>Название</td>
</tr>
<tr>
<td>Безопасная сделка</td>
<td>Название</td>
</tr>
</table>
<table class="table"></table>
</div>
<div class="modal-footer"></div>
</div>

@ -65,6 +65,11 @@
</div>
</form>
<button id="paymentfromSite" class="btn btn-primary" >Пополнить с сайта</button>
</div>
</div>

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-01 09:47
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0023_auto_20160830_1024'),
]
operations = [
migrations.AlterField(
model_name='answer',
name='term_type',
field=models.CharField(blank=True, choices=[('day', 'За день'), ('hour', 'За час'), ('month', 'За месяц'), ('project', 'За проект')], max_length=10, null=True),
),
migrations.AlterField(
model_name='portfolio',
name='term_type',
field=models.CharField(blank=True, choices=[('day', 'За день'), ('hour', 'За час'), ('month', 'За месяц'), ('project', 'За проект')], default='hour', max_length=20, null=True),
),
migrations.AlterField(
model_name='project',
name='term_type',
field=models.CharField(choices=[('day', 'За день'), ('hour', 'За час'), ('month', 'За месяц'), ('project', 'За проект')], default='hour', max_length=20),
),
migrations.AlterField(
model_name='stage',
name='term_type',
field=models.CharField(choices=[('day', 'За день'), ('hour', 'За час'), ('month', 'За месяц'), ('project', 'За проект')], default='hour', max_length=10),
),
]

@ -71,32 +71,14 @@ class StageSerializer(ModelSerializer):
)
class OrderSerializer(ModelSerializer):
stages = StageSerializer(many=True, read_only=True)
class Meta:
model = Order
fields = (
'id',
'contractor',
'team',
'created',
'project',
'secure',
'status',
'stages',
)
class ProjectSerializer(ModelSerializer):
customer = UserSerializer()
specialization = SpecializationSerializer()
realty = RealtySerializer()
class Meta:
model = Project
fields = (
'budget',
'budget_by_agreement',
@ -115,6 +97,27 @@ class ProjectSerializer(ModelSerializer):
'term_type',
'text',
'work_type',
)
class OrderSerializer(ModelSerializer):
stages = StageSerializer(many=True, read_only=True)
project = ProjectSerializer(read_only=True)
class Meta:
model = Order
fields = (
'id',
'contractor',
'team',
'created',
'project',
'secure',
'status',
'stages',
'project',
)

@ -1,4 +1,4 @@
from django.shortcuts import redirect, render_to_response
from django.shortcuts import redirect, render_to_response, render
from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template, render_to_string
from social.pipeline.partial import partial
@ -38,8 +38,8 @@ def add_email_for_user(backend, details, response, is_new=False, *args, **kwargs
data = backend.strategy.request_data()
if is_new:
if not details.get('email'):
if 'email' in kwargs['request']:
return {'email': kwargs['request']['email']}
if 'email' in data:
return {'email': data.get('email')}
else:
return render_to_response('add_email_form.html')

@ -6,7 +6,7 @@ from users.models import ContractorResume
@receiver(user_registered)
def user_registered_callback(sender, user, request, **kwargs):
# import code; code.interact(local=dict(globals(), **locals()))
group_name = request.POST['group_id'] or None
group_name = request.POST['group_id'] or 'Исполнители'
g = Group.objects.get(name=group_name)
g.user_set.add(user)
if group_name == 'Исполнители':

@ -1,7 +1,7 @@
{% extends 'partials/base.html' %}
{% block content %}
{% include 'partials/header.html' %}
<div class="container mainScore">
<div class="row">
<div class="col-lg-12">
@ -13,7 +13,7 @@
<input type="submit" value="Send">
</form>
</div>
{% include 'partials/footer.html' %}
</div>
</div>

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-01 09:47
from __future__ import unicode_literals
import django.core.validators
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('wallets', '0011_withdraw_complete'),
]
operations = [
migrations.AlterField(
model_name='withdraw',
name='sum',
field=models.DecimalField(decimal_places=0, max_digits=10, validators=[django.core.validators.MinValueValidator(1)]),
),
]

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-09-01 09:47
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('work_sell', '0008_merge'),
]
operations = [
migrations.AlterField(
model_name='worksell',
name='term_type',
field=models.CharField(blank=True, choices=[('day', 'За день'), ('hour', 'За час'), ('month', 'За месяц'), ('project', 'За проект')], default='hour', max_length=20, null=True),
),
]
Loading…
Cancel
Save