diff --git a/api/views.py b/api/views.py
index a499d4a..f66b1d7 100755
--- a/api/views.py
+++ b/api/views.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()
diff --git a/archilance/settings/base.py b/archilance/settings/base.py
index 40003c7..b275586 100644
--- a/archilance/settings/base.py
+++ b/archilance/settings/base.py
@@ -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',
diff --git a/assets/img/favicon.jpg b/assets/img/favicon.jpg
new file mode 100644
index 0000000..1912f69
Binary files /dev/null and b/assets/img/favicon.jpg differ
diff --git a/assets/img/favicon128.jpg b/assets/img/favicon128.jpg
new file mode 100644
index 0000000..5a53549
Binary files /dev/null and b/assets/img/favicon128.jpg differ
diff --git a/assets/img/favicon18.jpg b/assets/img/favicon18.jpg
new file mode 100644
index 0000000..22092e6
Binary files /dev/null and b/assets/img/favicon18.jpg differ
diff --git a/assets/img/favicon50.jpg b/assets/img/favicon50.jpg
new file mode 100644
index 0000000..b47fca4
Binary files /dev/null and b/assets/img/favicon50.jpg differ
diff --git a/assets/js/chat.js b/assets/js/chat.js
index 5648c1b..a3305c6 100644
--- a/assets/js/chat.js
+++ b/assets/js/chat.js
@@ -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 += '
| Название | '+data.project.name +' | ';
+ outTable += '
| Безопасная сделка | '+data.secure +' | ';
+ if(data.project.realty) {
+ outTable += '
| Тип здания | ' + data.project.realty.building_classification.name + ' | ';
+ outTable += '
| Классификация здания | ' + data.project.realty.construction_type.name + ' | ';
+ }
+ $("#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 += '
' + $("#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 += '
' + $("#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 = '' + file.name + '
';
+ var htmlImg = '' + file.name + '';
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 = '' + file.name + '';
+ var htmlImg = '' + file.name + '';
var document_send = $(htmlImg).appendTo("#document-send-contact");
});
},
diff --git a/chat/admin.py b/chat/admin.py
index bad96cc..d91a0a7 100644
--- a/chat/admin.py
+++ b/chat/admin.py
@@ -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)
diff --git a/chat/chat.py b/chat/chat.py
index f9d1d05..171bd6d 100644
--- a/chat/chat.py
+++ b/chat/chat.py
@@ -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', '
')
answer_type = message_data['format_type']
diff --git a/chat/migrations/0010_auto_20160901_1247.py b/chat/migrations/0010_auto_20160901_1247.py
new file mode 100644
index 0000000..e31ec3c
--- /dev/null
+++ b/chat/migrations/0010_auto_20160901_1247.py
@@ -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'),
+ ),
+ ]
diff --git a/chat/models.py b/chat/models.py
index 5cc9468..585c754 100644
--- a/chat/models.py
+++ b/chat/models.py
@@ -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
diff --git a/chat/serializers.py b/chat/serializers.py
index 56ad2bd..00ef5df 100644
--- a/chat/serializers.py
+++ b/chat/serializers.py
@@ -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 = '
'.join([doc.file.name for doc in obj.documents.all()])
+ out += '
' + documents
+ return out
+
class NoteSerializer(ModelSerializer):
diff --git a/chat/templates/chat_contractor.html b/chat/templates/chat_contractor.html
index 88a4f5f..38263a8 100644
--- a/chat/templates/chat_contractor.html
+++ b/chat/templates/chat_contractor.html
@@ -142,14 +142,14 @@
diff --git a/chat/templates/order_info.html b/chat/templates/order_info.html
index 1017f84..0e2842f 100644
--- a/chat/templates/order_info.html
+++ b/chat/templates/order_info.html
@@ -6,27 +6,8 @@
Полное описапие заказа
-
+
+
+
+
+
diff --git a/projects/migrations/0024_auto_20160901_1247.py b/projects/migrations/0024_auto_20160901_1247.py
new file mode 100644
index 0000000..b9304af
--- /dev/null
+++ b/projects/migrations/0024_auto_20160901_1247.py
@@ -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),
+ ),
+ ]
diff --git a/projects/serializers.py b/projects/serializers.py
index 183309b..a78bf2f 100755
--- a/projects/serializers.py
+++ b/projects/serializers.py
@@ -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',
)
diff --git a/users/pipeline.py b/users/pipeline.py
index ddd79c6..16e2b64 100644
--- a/users/pipeline.py
+++ b/users/pipeline.py
@@ -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')
diff --git a/users/signals.py b/users/signals.py
index b32c869..e78c6ef 100644
--- a/users/signals.py
+++ b/users/signals.py
@@ -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 == 'Исполнители':
diff --git a/users/templates/add_email_form.html b/users/templates/add_email_form.html
index e32ce1f..58e4c02 100644
--- a/users/templates/add_email_form.html
+++ b/users/templates/add_email_form.html
@@ -1,7 +1,7 @@
{% extends 'partials/base.html' %}
{% block content %}
- {% include 'partials/header.html' %}
+
diff --git a/wallets/migrations/0012_auto_20160901_1247.py b/wallets/migrations/0012_auto_20160901_1247.py
new file mode 100644
index 0000000..dc3b386
--- /dev/null
+++ b/wallets/migrations/0012_auto_20160901_1247.py
@@ -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)]),
+ ),
+ ]
diff --git a/work_sell/migrations/0009_auto_20160901_1247.py b/work_sell/migrations/0009_auto_20160901_1247.py
new file mode 100644
index 0000000..2c85f21
--- /dev/null
+++ b/work_sell/migrations/0009_auto_20160901_1247.py
@@ -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),
+ ),
+ ]