From a8f2cc350c432f94a9cce209bbdd298ae93fe0ed Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Tue, 6 Sep 2016 22:40:36 +0300 Subject: [PATCH 1/3] #ARC-4 Section 7 --- assets/index.js | 37 +++++++++++++++++++ assets/js/chat.js | 2 +- common/migrations/0014_auto_20160906_1713.py | 19 ++++++++++ common/views.py | 2 +- templates/partials/base.html | 2 +- templates/test.html | 10 +---- users/filters.py | 23 +++++++++++- users/models.py | 3 ++ users/serializers.py | 3 ++ users/templates/contractor_office.html | 32 +++++++++++++++- users/templates/contractor_profile.html | 32 ++++++++-------- .../partials/modals/add_team_member.html | 19 ++++++++++ users/urls.py | 5 ++- users/views.py | 12 ++++++ 14 files changed, 170 insertions(+), 31 deletions(-) create mode 100644 common/migrations/0014_auto_20160906_1713.py create mode 100644 users/templates/partials/modals/add_team_member.html diff --git a/assets/index.js b/assets/index.js index eb6b5ec..12a62af 100644 --- a/assets/index.js +++ b/assets/index.js @@ -196,6 +196,43 @@ function initSimpleSpecSelect2($select, specId) { +// Team invitation contractor select ------------------------------- + + +var contractorSelectOptions = { + language: 'ru', + placeholder: 'Выберите пользователя', // Required by `allowClear` + allowClear: true, +} + +function initContractorSelect($select) { + return $.ajax({url: '/api/users/?is_contractor=true', method: 'GET', dataType: 'json'}) + .then(function(res) { + var contractors = res.results + + $select.select2(_.merge(contractorSelectOptions, { + data: _.map(function(contractor) { + return { + id: contractor.id, + text: contractor.username, + origItem: contractor, + } + }, contractors), + })) + }) +} + + + + + + + + + + + + // Location select ---------------------------------------------- diff --git a/assets/js/chat.js b/assets/js/chat.js index f38847e..320f51c 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 () { diff --git a/common/migrations/0014_auto_20160906_1713.py b/common/migrations/0014_auto_20160906_1713.py new file mode 100644 index 0000000..b71874c --- /dev/null +++ b/common/migrations/0014_auto_20160906_1713.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-06 14:13 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('common', '0013_liveimageupload'), + ] + + operations = [ + migrations.AlterModelOptions( + name='liveimageupload', + options={'verbose_name': 'Живая загрузка изображений', 'verbose_name_plural': 'Живая загрузка изображений'}, + ), + ] diff --git a/common/views.py b/common/views.py index ca08433..7dce5a1 100644 --- a/common/views.py +++ b/common/views.py @@ -111,7 +111,7 @@ class LiveImageUploadDeleteView(NoCsrfMixin, LoginRequiredMixin, View): live_img.delete() return JsonResponse({'status': 'success'}) else: - return JsonResponse({'status': 'failure'}) + return JsonResponse({'status': 'error'}) class CustomRegistrationView(RegistrationView): diff --git a/templates/partials/base.html b/templates/partials/base.html index 4c32a99..6d947d1 100644 --- a/templates/partials/base.html +++ b/templates/partials/base.html @@ -87,7 +87,7 @@ if ((queryString.indexOf('/chat') != 0) && (queryString.indexOf('/users/contractor-office/510/work-projects') != 0)) { 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 () { diff --git a/templates/test.html b/templates/test.html index fe6da23..b09ae45 100644 --- a/templates/test.html +++ b/templates/test.html @@ -15,7 +15,7 @@
- Hello there + {{ request.get_host }}{{ request.get_full_path }}
@@ -26,13 +26,5 @@ - - diff --git a/users/filters.py b/users/filters.py index 6c6d611..7969b44 100755 --- a/users/filters.py +++ b/users/filters.py @@ -1,23 +1,41 @@ -from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter +from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter, MethodFilter +import pydash as _; _.map = _.map_; _.filter = _.filter_ + from .models import User, Team, ContractorResumeFiles, ContractorResume class UserFilterSet(FilterSet): - id = AllLookupsFilter() email = AllLookupsFilter() first_name = AllLookupsFilter() + id = AllLookupsFilter() is_active = AllLookupsFilter() is_admin = AllLookupsFilter() + is_contractor = MethodFilter() + is_customer = MethodFilter() last_name = AllLookupsFilter() + projects = RelatedFilter('projects.filters.ProjectFilterSet') class Meta: model = User + + def filter_is_contractor(self, name, qs, value): + if value == 'true': + return _.filter(qs, lambda user: user.is_contractor()) + + return qs + + def filter_is_customer(self, name, qs, value): + if value == 'true': + return _.filter(qs, lambda user: user.is_customer()) + + return qs class TeamFilterSet(FilterSet): id = AllLookupsFilter() name = AllLookupsFilter() + owner = RelatedFilter('users.filters.UserFilterSet') class Meta: @@ -37,6 +55,7 @@ class ContractorResumeFilesFilterSet(FilterSet): id = AllLookupsFilter() title = AllLookupsFilter() img = AllLookupsFilter() + resume = RelatedFilter('users.filters.ContractorResumeFilterSet') class Meta: diff --git a/users/models.py b/users/models.py index 391f71c..00a9b76 100644 --- a/users/models.py +++ b/users/models.py @@ -212,6 +212,9 @@ class User(AbstractBaseUser, PermissionsMixin): def is_customer(self): return self.groups.filter(name='Заказчики').exists() + def has_team(self): + return self.is_contractor() and bool(util.get_related_or_none(self, 'team')) + def is_owner_profile(self, user_id): pass diff --git a/users/serializers.py b/users/serializers.py index 96df7b4..c618117 100755 --- a/users/serializers.py +++ b/users/serializers.py @@ -51,8 +51,11 @@ class UserSerializer(ModelSerializer): 'financial_info', 'first_name', 'gender', + 'has_team', 'id', 'is_active', + 'is_contractor', + 'is_customer', 'last_name', 'last_time_visit', 'location', diff --git a/users/templates/contractor_office.html b/users/templates/contractor_office.html index ade5edf..716c0fa 100644 --- a/users/templates/contractor_office.html +++ b/users/templates/contractor_office.html @@ -5,6 +5,7 @@ {% block content %} + {% include 'partials/modals/add_team_member.html' %} {% include 'partials/header.html' %}
@@ -75,7 +76,7 @@