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 @@
- - - + + +
- +

Прикрепить файл

@@ -164,7 +164,7 @@

1 / Согласование условий

- Обсуджение задания и условий выполнения работы. + Обсуждение задания и условий выполнения работы. Подтверждение заказа исполнителем.

@@ -204,12 +204,6 @@ {% include 'arbitration_modal.html' %} - - - {% include 'order_info.html' %} - - -
@@ -234,7 +228,7 @@

Заказы

{% for torder in team_orders %}
+ data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk }}" data-id="{{ torder.pk }}">

{{ torder }} @@ -273,9 +267,9 @@

- - - + + + @@ -299,6 +293,10 @@
{% endif %} + + + {% include 'order_info.html' %} +
{% include 'partials/footer.html' %}
diff --git a/chat/templates/contact-info.html b/chat/templates/contact-info.html index f82392c..4e4c5cb 100644 --- a/chat/templates/contact-info.html +++ b/chat/templates/contact-info.html @@ -6,17 +6,16 @@
- - +
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/chat/templates/reverse_stage_modal.html b/chat/templates/reverse_stage_modal.html index 1dd33d8..0074668 100644 --- a/chat/templates/reverse_stage_modal.html +++ b/chat/templates/reverse_stage_modal.html @@ -65,6 +65,11 @@ + + + + + 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' %} +
@@ -13,7 +13,7 @@
- {% include 'partials/footer.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), + ), + ]