Merge branch 'PR-14'

Пересобран HEADER
remotes/origin/PR-46
booblegum 9 years ago
commit 924e66ef6e
  1. 1
      .gitignore
  2. 10
      README.md
  3. 8
      api/views.py
  4. 12
      archilance/local.py
  5. 3
      archilance/settings/base.py
  6. 7
      archilance/views.py
  7. 18
      assets/css/main.css
  8. BIN
      assets/fonts/MyriadPro/MyriadPro-Bold.otf
  9. BIN
      assets/fonts/MyriadPro/MyriadPro-BoldCond.otf
  10. BIN
      assets/fonts/MyriadPro/MyriadPro-BoldCondIt.otf
  11. BIN
      assets/fonts/MyriadPro/MyriadPro-BoldIt.otf
  12. BIN
      assets/fonts/MyriadPro/MyriadPro-Cond.otf
  13. BIN
      assets/fonts/MyriadPro/MyriadPro-CondIt.otf
  14. BIN
      assets/fonts/MyriadPro/MyriadPro-It.otf
  15. BIN
      assets/fonts/MyriadPro/MyriadPro-Regular.otf
  16. BIN
      assets/fonts/MyriadPro/MyriadPro-Semibold.otf
  17. BIN
      assets/fonts/MyriadPro/MyriadPro-SemiboldIt.otf
  18. BIN
      assets/images/Thumbs.db
  19. BIN
      assets/img/icons/icon_hands.png
  20. BIN
      assets/img/icons/icon_hands_red.png
  21. BIN
      assets/img/icons/icon_speach-ball.png
  22. BIN
      assets/img/icons/icon_speach-ball_red.png
  23. BIN
      assets/img/main.png
  24. 0
      assets/img/old_main.jpg
  25. BIN
      assets/img/sprite.png
  26. BIN
      assets/img/youtube.png
  27. 103
      assets/js/build/create_project.js
  28. 110
      assets/js/build/create_worksell.js
  29. 81
      assets/js/build/home_page.js
  30. 60
      assets/js/build/init_create_worksell.js
  31. 60
      assets/js/build/init_customer_project_create.js
  32. 13
      assets/js/chat.js
  33. 2
      assets/js/src/create_worksell.js
  34. 2
      assets/js/src/customer_project_create.js
  35. 5
      assets/js/src/home_page.js
  36. 67
      assets/js/src/seeds/ajax_registration.js
  37. 12
      assets/js/src/seeds/popup-youtube.js
  38. 17
      assets/js/src/seeds/send_data.js
  39. 7
      assets/lib/proekton-components/sass/parts/_select-box.sass
  40. 7
      assets/lib/proekton-components/sass/parts/_selected-container.sass
  41. 25
      assets/sass/base/_fonts.sass
  42. 6
      assets/sass/components/custom-components.sass
  43. 24
      assets/sass/main.sass
  44. 20
      assets/sass/modules/_mods.sass
  45. 2
      chat/chat.py
  46. 16
      chat/settings/base.py
  47. 6
      chat/settings/dev.py
  48. 387
      chat/templates/chat_contractor.html
  49. 73
      chat/templates/chat_customer.html
  50. 56
      chat/templates/inc-contact-card.html
  51. 16
      common/forms.py
  52. 39
      common/mixins.py
  53. 0
      common/templatetags/__init__.py
  54. 7
      common/templatetags/common_tags.py
  55. 4
      common/views.py
  56. 26
      context_processors/user_info.py
  57. 2
      projects/signals.py
  58. 74
      projects/templates/customer_project_create.html
  59. 53
      projects/views.py
  60. 1
      reviews/signals.py
  61. 220
      templates/home.html
  62. 42
      templates/partials/base.html
  63. 264
      templates/partials/header.html
  64. 3
      templates/partials/inc-captcha.html
  65. 61
      templates/partials/inc-registration_form.html
  66. 19
      templates/partials/modals/modal-registration_form.html
  67. 8
      templates/partials/sass/footer.sass
  68. 693
      templates/partials/sass/header.sass
  69. 174
      templates/partials/sass/home.sass
  70. 119
      templates/partials/sass/registration.sass
  71. 186
      templates/partials/trash/header.html
  72. 370
      templates/partials/trash/header.sass
  73. 70
      templates/registration/registration_form.html
  74. 100
      templates/trash/home.html
  75. 2
      users/templates/templatetags/contractor_indicator.html
  76. 2
      users/templates/templatetags/user_new_count.html
  77. 2
      users/templates/templatetags/user_new_count_orders.html
  78. 35
      users/templatetags/user_tags.py
  79. 2
      wallets/models.py
  80. 6
      wallets/views.py
  81. 2
      webpack.config.js
  82. 71
      work_sell/templates/worksell_create.html
  83. 32
      work_sell/views.py

1
.gitignore vendored

@ -4,6 +4,7 @@ env/
.ar/ .ar/
ar/ ar/
archilance/settings/local.py archilance/settings/local.py
chat/settings/local.py
media/* media/*
static/* static/*

@ -101,3 +101,13 @@ python manage.py generate_reviews
``` ```
---------------------------------------- ----------------------------------------
## Local smtp debug server
```
sudo python3 -m smtpd -n -c DebuggingServer localhost:25
```
## Local char server
```
python3 -m tornado.autoreload chat/chat.py
```

@ -169,9 +169,11 @@ class RealtyViewSet(ModelViewSet):
@list_route(methods=['get']) @list_route(methods=['get'])
def current_user(self, request, *args, **kwargs): def current_user(self, request, *args, **kwargs):
queryset = self.queryset.filter(user=self.request.user) if self.request.user.__dict__:
serialiser = self.serializer_class(queryset, many=True) queryset = self.queryset.filter(user=self.request.user)
return Response(serialiser.data) serialiser = self.serializer_class(queryset, many=True)
return Response(serialiser.data)
return Response([])
class BuildingClassificationViewSet(ModelViewSet): class BuildingClassificationViewSet(ModelViewSet):

@ -1,12 +0,0 @@
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'proekton2',
'USER': 'postgres',
'PASSWORD': 'gum1756',
'HOST': 'localhost',
'PORT': '',
}
}
TEMPLATE_DEBUG = True

@ -118,6 +118,7 @@ TEMPLATES = [
'django.core.context_processors.request', 'django.core.context_processors.request',
'social.apps.django_app.context_processors.backends', 'social.apps.django_app.context_processors.backends',
'social.apps.django_app.context_processors.login_redirect', 'social.apps.django_app.context_processors.login_redirect',
'context_processors.user_info.user_info'
], ],
# Load these templatetags by default: # Load these templatetags by default:
@ -339,6 +340,7 @@ SITE_ID = 1
# else: # else:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# sudo python3 -m smtpd -n -c DebuggingServer localhost:25
EMAIL_HOST = 'localhost' EMAIL_HOST = 'localhost'
EMAIL_HOST_PASSWORD = '' EMAIL_HOST_PASSWORD = ''
EMAIL_HOST_USER = '' EMAIL_HOST_USER = ''
@ -377,4 +379,5 @@ DEFAULT_FILE_STORAGE = 'archilance.util.ASCIIFileSystemStorage'
RECAPTCHA_PUBLIC_KEY = '6LftaQgUAAAAAG0oKrt1ORtop1jfIEzkTnCL4S3Q' RECAPTCHA_PUBLIC_KEY = '6LftaQgUAAAAAG0oKrt1ORtop1jfIEzkTnCL4S3Q'
RECAPTCHA_PRIVATE_KEY = '6LftaQgUAAAAAMaIK-YCL1u1AfakVXjblULQCvfa' RECAPTCHA_PRIVATE_KEY = '6LftaQgUAAAAAMaIK-YCL1u1AfakVXjblULQCvfa'
# CAPTCHA_AJAX = True
NOCAPTCHA = True NOCAPTCHA = True

@ -1,17 +1,16 @@
import pydash as _;
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.shortcuts import render from django.shortcuts import render
from django.views.generic import View from django.views.generic import View
_.map = _.map_;
_.filter = _.filter_
from .mixins import BaseMixin from .mixins import BaseMixin
from chat.models import Documents from chat.models import Documents
from common.models import MainPage from common.models import MainPage
from users.models import User from users.models import User
from work_sell.models import Picture from work_sell.models import Picture
import pydash as _;
_.map = _.map_;
_.filter = _.filter_
class HomeTemplateView(BaseMixin, View): class HomeTemplateView(BaseMixin, View):

@ -85,15 +85,15 @@ a, a:hover, a:focus, a:active {
background-color: black; background-color: black;
} }
.logo { /*.logo {*/
width: 183px; /*width: 183px;*/
height: 36px; /*height: 36px;*/
background: url('../img/logo.png') no-repeat center; /*background: url('../img/logo.png') no-repeat center;*/
background-size: cover; /*background-size: cover;*/
float: left; /*float: left;*/
margin: 18px 0 21px 10px; /*margin: 18px 0 21px 10px;*/
cursor: pointer; /*cursor: pointer;*/
} /*}*/
.mainMenu { .mainMenu {
float: left; float: left;

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 MiB

Before

Width:  |  Height:  |  Size: 257 KiB

After

Width:  |  Height:  |  Size: 257 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 57 KiB

@ -60,7 +60,9 @@
var _scroll_on_required = __webpack_require__(8); var _scroll_on_required = __webpack_require__(8);
var _test_seeds = __webpack_require__(9); var _ajax_registration = __webpack_require__(9);
var _test_seeds = __webpack_require__(10);
function showHideRealry() { function showHideRealry() {
var check = $('#checkbox-sb-realty'); var check = $('#checkbox-sb-realty');
@ -83,6 +85,7 @@
(0, _only_one_checkbox.onlyOneCheckboxInit)('#safe', '#by_agreement'); (0, _only_one_checkbox.onlyOneCheckboxInit)('#safe', '#by_agreement');
(0, _scroll_on_required.scrollOnRequiredInit)(); (0, _scroll_on_required.scrollOnRequiredInit)();
(0, _popups.showPopupsInit)(); (0, _popups.showPopupsInit)();
(0, _ajax_registration.ajaxRegistrationInit)('customer');
window.addMessage = _popups.addMessage; window.addMessage = _popups.addMessage;
}); });
@ -369,6 +372,104 @@
/***/ }, /***/ },
/* 9 */ /* 9 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var $form = $('#form-registration');
function clearErrors() {
var $error_tags = $form.find('.errorlist');
if ($error_tags.length > 0) $error_tags.remove();
}
function sendData(form_data) {
// console.log("form_data = ", form_data);
$.ajax({
url: '/users/register/',
type: 'post',
data: form_data,
success: function success(data) {
// console.log("success data -->", data);
$('#registrationFormModal').modal('toggle');
$('input[name=not_auth_user_id]').val(data.pk);
$('#not_customer').hide();
$('#is_customer').show();
},
error: function error(xhr, ajaxOptions, thrownError) {
var status = xhr.status;
if (status == 400) {
var data = JSON.parse(xhr.responseText);
$.each(data, function (key, value) {
var ul = $("<ul class='errorlist'></ul>");
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = value[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var error = _step.value;
ul.append('<li>' + error + '</li>');
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var $field = void 0;
if (key == 'captcha_html') {
// console.log("captcha html = ", key, '/', value);
$form.find('.captcha').html(value);
return;
} else if (key == 'captcha') {
$field = $form.find('.g-recaptcha');
} else if (key == 'tos') {
$field = $form.find('input[name=' + key + ']').parent();
} else {
$field = $form.find('input[name=' + key + ']');
if ($field.length == 0) console.log('!!!field ' + key + ' not found');
}
if ($field.length > 0) $field.parent().append(ul);
});
// console.log('captcha error = ', data.captcha);
// console.log('data type = ', typeof data);
}
// console.log("data = ", xhr.responseText);
// console.log(ajaxOptions);
// console.log(thrownError);
}
});
}
function ajaxRegistrationInit(user_type) {
// const $form = $('#form-registration');
$form.on("submit", function (e) {
e.preventDefault();
// get form data and add user_type
clearErrors();
var form_data = $form.serialize() + "&user_type=" + encodeURIComponent(user_type);
sendData(form_data);
});
}
exports.ajaxRegistrationInit = ajaxRegistrationInit;
/***/ },
/* 10 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";

@ -48,18 +48,21 @@
var _file_upload = __webpack_require__(1); var _file_upload = __webpack_require__(1);
var _image_upload = __webpack_require__(10); var _image_upload = __webpack_require__(11);
var _scroll_on_required = __webpack_require__(8); var _scroll_on_required = __webpack_require__(8);
var _popups = __webpack_require__(7); var _popups = __webpack_require__(7);
var _ajax_registration = __webpack_require__(9);
$(function () { $(function () {
// fileUploadInit(); // fileUploadInit();
// previewImg(); // previewImg();
(0, _image_upload.imageUploadInit)(); (0, _image_upload.imageUploadInit)();
(0, _scroll_on_required.scrollOnRequiredInit)(); (0, _scroll_on_required.scrollOnRequiredInit)();
(0, _popups.showPopupsInit)(); (0, _popups.showPopupsInit)();
(0, _ajax_registration.ajaxRegistrationInit)('contractor');
window.addMessage = _popups.addMessage; window.addMessage = _popups.addMessage;
}); });
@ -233,8 +236,106 @@
exports.scrollOnRequiredInit = scrollOnRequiredInit; exports.scrollOnRequiredInit = scrollOnRequiredInit;
/***/ }, /***/ },
/* 9 */, /* 9 */
/* 10 */ /***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var $form = $('#form-registration');
function clearErrors() {
var $error_tags = $form.find('.errorlist');
if ($error_tags.length > 0) $error_tags.remove();
}
function sendData(form_data) {
// console.log("form_data = ", form_data);
$.ajax({
url: '/users/register/',
type: 'post',
data: form_data,
success: function success(data) {
// console.log("success data -->", data);
$('#registrationFormModal').modal('toggle');
$('input[name=not_auth_user_id]').val(data.pk);
$('#not_customer').hide();
$('#is_customer').show();
},
error: function error(xhr, ajaxOptions, thrownError) {
var status = xhr.status;
if (status == 400) {
var data = JSON.parse(xhr.responseText);
$.each(data, function (key, value) {
var ul = $("<ul class='errorlist'></ul>");
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = value[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var error = _step.value;
ul.append('<li>' + error + '</li>');
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
var $field = void 0;
if (key == 'captcha_html') {
// console.log("captcha html = ", key, '/', value);
$form.find('.captcha').html(value);
return;
} else if (key == 'captcha') {
$field = $form.find('.g-recaptcha');
} else if (key == 'tos') {
$field = $form.find('input[name=' + key + ']').parent();
} else {
$field = $form.find('input[name=' + key + ']');
if ($field.length == 0) console.log('!!!field ' + key + ' not found');
}
if ($field.length > 0) $field.parent().append(ul);
});
// console.log('captcha error = ', data.captcha);
// console.log('data type = ', typeof data);
}
// console.log("data = ", xhr.responseText);
// console.log(ajaxOptions);
// console.log(thrownError);
}
});
}
function ajaxRegistrationInit(user_type) {
// const $form = $('#form-registration');
$form.on("submit", function (e) {
e.preventDefault();
// get form data and add user_type
clearErrors();
var form_data = $form.serialize() + "&user_type=" + encodeURIComponent(user_type);
sendData(form_data);
});
}
exports.ajaxRegistrationInit = ajaxRegistrationInit;
/***/ },
/* 10 */,
/* 11 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -293,12 +394,9 @@
$fileUploadWidget.css('display', 'block'); $fileUploadWidget.css('display', 'block');
if ($fileImg.length) { if ($fileImg.length) {
console.log('+');
var reader = new FileReader(); var reader = new FileReader();
reader.onload = function (e) { reader.onload = function (e) {
// document.getElementById('clock').style.backgroundImage = "url(" + reader.result + ")";
$fileImg.css('background-image', 'url(' + e.target.result + ')'); $fileImg.css('background-image', 'url(' + e.target.result + ')');
// $fileImg.attr('src', e.target.result);
}; };
reader.readAsDataURL($fileInput[0].files[0]); reader.readAsDataURL($fileInput[0].files[0]);

@ -0,0 +1,81 @@
/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/ // Flag the module as loaded
/******/ module.loaded = true;
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/ // Load entry module and return exports
/******/ return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ({
/***/ 0:
/***/ function(module, exports, __webpack_require__) {
'use strict';
var _popupYoutube = __webpack_require__(12);
$(function () {
(0, _popupYoutube.popupYoutubeInit)();
});
/***/ },
/***/ 12:
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function popupYoutubeInit() {
$('.popup-youtube').magnificPopup({
disableOn: 700,
type: 'iframe',
mainClass: 'mfp-fade',
removalDelay: 160,
preloader: false,
fixedContentPos: false
});
}
exports.popupYoutubeInit = popupYoutubeInit;
/***/ }
/******/ });

@ -46,27 +46,27 @@
'use strict'; 'use strict';
var _SelectedContainer = __webpack_require__(11); var _SelectedContainer = __webpack_require__(13);
var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer); var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer);
var _SelectedContainerCreate = __webpack_require__(15); var _SelectedContainerCreate = __webpack_require__(17);
var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate); var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate);
var _NoTreeSelect = __webpack_require__(16); var _NoTreeSelect = __webpack_require__(18);
var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect); var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect);
var _TreeSelect = __webpack_require__(18); var _TreeSelect = __webpack_require__(20);
var _TreeSelect2 = _interopRequireDefault(_TreeSelect); var _TreeSelect2 = _interopRequireDefault(_TreeSelect);
var _SingleTreeSelect = __webpack_require__(19); var _SingleTreeSelect = __webpack_require__(21);
var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect); var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect);
var _SelectOrCreate = __webpack_require__(20); var _SelectOrCreate = __webpack_require__(22);
var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate); var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate);
@ -177,7 +177,9 @@
/* 8 */, /* 8 */,
/* 9 */, /* 9 */,
/* 10 */, /* 10 */,
/* 11 */ /* 11 */,
/* 12 */,
/* 13 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -192,15 +194,15 @@
var _desc, _value, _class; // ` var _desc, _value, _class; // `
var _DataTree = __webpack_require__(12); var _DataTree = __webpack_require__(14);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
var _NoTreeData = __webpack_require__(13); var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
var _decorators = __webpack_require__(14); var _decorators = __webpack_require__(16);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -431,7 +433,7 @@
exports.default = SelectedContainer; exports.default = SelectedContainer;
/***/ }, /***/ },
/* 12 */ /* 14 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -586,7 +588,7 @@
exports.default = DataTree; exports.default = DataTree;
/***/ }, /***/ },
/* 13 */ /* 15 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -642,7 +644,7 @@
exports.default = NoTreeData; exports.default = NoTreeData;
/***/ }, /***/ },
/* 14 */ /* 16 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -726,7 +728,7 @@
// export {onBind}; // export {onBind};
/***/ }, /***/ },
/* 15 */ /* 17 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -742,11 +744,11 @@
var _desc, _value, _class; var _desc, _value, _class;
var _SelectedContainer2 = __webpack_require__(11); var _SelectedContainer2 = __webpack_require__(13);
var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2); var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2);
var _decorators = __webpack_require__(14); var _decorators = __webpack_require__(16);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -827,7 +829,7 @@
exports.default = SelectedContainerCreate; exports.default = SelectedContainerCreate;
/***/ }, /***/ },
/* 16 */ /* 18 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -841,9 +843,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(17); var _AbsBaseSelect2 = __webpack_require__(19);
var _NoTreeData = __webpack_require__(13); var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -910,7 +912,7 @@
exports.default = NoTreeSelect; exports.default = NoTreeSelect;
/***/ }, /***/ },
/* 17 */ /* 19 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -1454,7 +1456,7 @@
exports.AbsBaseSelect = AbsBaseSelect; exports.AbsBaseSelect = AbsBaseSelect;
/***/ }, /***/ },
/* 18 */ /* 20 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1468,9 +1470,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(17); var _AbsBaseSelect2 = __webpack_require__(19);
var _DataTree = __webpack_require__(12); var _DataTree = __webpack_require__(14);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
@ -1579,7 +1581,7 @@
exports.default = TreeSelect; exports.default = TreeSelect;
/***/ }, /***/ },
/* 19 */ /* 21 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1591,9 +1593,9 @@
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _AbsBaseSelect = __webpack_require__(17); var _AbsBaseSelect = __webpack_require__(19);
var _TreeSelect2 = __webpack_require__(18); var _TreeSelect2 = __webpack_require__(20);
var _TreeSelect3 = _interopRequireDefault(_TreeSelect2); var _TreeSelect3 = _interopRequireDefault(_TreeSelect2);
@ -1674,7 +1676,7 @@
exports.default = SingleTreeSelect; exports.default = SingleTreeSelect;
/***/ }, /***/ },
/* 20 */ /* 22 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1688,9 +1690,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(17); var _AbsBaseSelect2 = __webpack_require__(19);
var _NoTreeData = __webpack_require__(13); var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);

@ -46,27 +46,27 @@
'use strict'; 'use strict';
var _SelectedContainer = __webpack_require__(11); var _SelectedContainer = __webpack_require__(13);
var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer); var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer);
var _SelectedContainerCreate = __webpack_require__(15); var _SelectedContainerCreate = __webpack_require__(17);
var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate); var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate);
var _NoTreeSelect = __webpack_require__(16); var _NoTreeSelect = __webpack_require__(18);
var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect); var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect);
var _TreeSelect = __webpack_require__(18); var _TreeSelect = __webpack_require__(20);
var _TreeSelect2 = _interopRequireDefault(_TreeSelect); var _TreeSelect2 = _interopRequireDefault(_TreeSelect);
var _SingleTreeSelect = __webpack_require__(19); var _SingleTreeSelect = __webpack_require__(21);
var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect); var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect);
var _SelectOrCreate = __webpack_require__(20); var _SelectOrCreate = __webpack_require__(22);
var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate); var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate);
@ -212,7 +212,9 @@
/* 8 */, /* 8 */,
/* 9 */, /* 9 */,
/* 10 */, /* 10 */,
/* 11 */ /* 11 */,
/* 12 */,
/* 13 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -227,15 +229,15 @@
var _desc, _value, _class; // ` var _desc, _value, _class; // `
var _DataTree = __webpack_require__(12); var _DataTree = __webpack_require__(14);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
var _NoTreeData = __webpack_require__(13); var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
var _decorators = __webpack_require__(14); var _decorators = __webpack_require__(16);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -466,7 +468,7 @@
exports.default = SelectedContainer; exports.default = SelectedContainer;
/***/ }, /***/ },
/* 12 */ /* 14 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -621,7 +623,7 @@
exports.default = DataTree; exports.default = DataTree;
/***/ }, /***/ },
/* 13 */ /* 15 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -677,7 +679,7 @@
exports.default = NoTreeData; exports.default = NoTreeData;
/***/ }, /***/ },
/* 14 */ /* 16 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -761,7 +763,7 @@
// export {onBind}; // export {onBind};
/***/ }, /***/ },
/* 15 */ /* 17 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -777,11 +779,11 @@
var _desc, _value, _class; var _desc, _value, _class;
var _SelectedContainer2 = __webpack_require__(11); var _SelectedContainer2 = __webpack_require__(13);
var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2); var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2);
var _decorators = __webpack_require__(14); var _decorators = __webpack_require__(16);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -862,7 +864,7 @@
exports.default = SelectedContainerCreate; exports.default = SelectedContainerCreate;
/***/ }, /***/ },
/* 16 */ /* 18 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -876,9 +878,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(17); var _AbsBaseSelect2 = __webpack_require__(19);
var _NoTreeData = __webpack_require__(13); var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -945,7 +947,7 @@
exports.default = NoTreeSelect; exports.default = NoTreeSelect;
/***/ }, /***/ },
/* 17 */ /* 19 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -1489,7 +1491,7 @@
exports.AbsBaseSelect = AbsBaseSelect; exports.AbsBaseSelect = AbsBaseSelect;
/***/ }, /***/ },
/* 18 */ /* 20 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1503,9 +1505,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(17); var _AbsBaseSelect2 = __webpack_require__(19);
var _DataTree = __webpack_require__(12); var _DataTree = __webpack_require__(14);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
@ -1614,7 +1616,7 @@
exports.default = TreeSelect; exports.default = TreeSelect;
/***/ }, /***/ },
/* 19 */ /* 21 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1626,9 +1628,9 @@
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _AbsBaseSelect = __webpack_require__(17); var _AbsBaseSelect = __webpack_require__(19);
var _TreeSelect2 = __webpack_require__(18); var _TreeSelect2 = __webpack_require__(20);
var _TreeSelect3 = _interopRequireDefault(_TreeSelect2); var _TreeSelect3 = _interopRequireDefault(_TreeSelect2);
@ -1709,7 +1711,7 @@
exports.default = SingleTreeSelect; exports.default = SingleTreeSelect;
/***/ }, /***/ },
/* 20 */ /* 22 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1723,9 +1725,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(17); var _AbsBaseSelect2 = __webpack_require__(19);
var _NoTreeData = __webpack_require__(13); var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);

@ -28,7 +28,8 @@ window.confirm = function (message, callback, caption) {
}; };
var SocketHandler = function () { var SocketHandler = function () {
domain = domain.replace(':' + port, ''); //TODO: получать порт с файла настроек
domain = domain.replace(':' + port, ':8888');
if (window.location.protocol == 'https:') { if (window.location.protocol == 'https:') {
var ws = "wss://"; var ws = "wss://";
} else { } else {
@ -112,6 +113,13 @@ var socket = new SocketHandler();
var csrftoken = getCookie('csrftoken'); var csrftoken = getCookie('csrftoken');
function updateCounts() {
var my_office = $('#my_office');
var all_messages = $('.js-all-messages');
my_office.html('0');
all_messages.html('0');
}
$(function () { $(function () {
function dialog (message, yesCallback, notCallback) { function dialog (message, yesCallback, notCallback) {
$("#dialog_delete .modal-title").html(message); $("#dialog_delete .modal-title").html(message);
@ -146,6 +154,9 @@ function dialog (message, yesCallback, notCallback) {
break; break;
case 'tab2': case 'tab2':
console.log("tab2");
// /api/message?recipent__id=5
updateCounts();
setTimeout(function () { setTimeout(function () {
if (liveHash.indexOf("#order") == 0) { if (liveHash.indexOf("#order") == 0) {
var ordHashId = liveHash.replace("#order", ""); var ordHashId = liveHash.replace("#order", "");

@ -2,6 +2,7 @@ import {fileUploadInit} from './seeds/file_upload'
import {imageUploadInit} from './seeds/image_upload' import {imageUploadInit} from './seeds/image_upload'
import {scrollOnRequiredInit} from './seeds/scroll_on_required' import {scrollOnRequiredInit} from './seeds/scroll_on_required'
import {showPopupsInit, addMessage} from './seeds/popups' import {showPopupsInit, addMessage} from './seeds/popups'
import {ajaxRegistrationInit} from './seeds/ajax_registration'
$(function () { $(function () {
// fileUploadInit(); // fileUploadInit();
@ -9,5 +10,6 @@ $(function () {
imageUploadInit(); imageUploadInit();
scrollOnRequiredInit(); scrollOnRequiredInit();
showPopupsInit(); showPopupsInit();
ajaxRegistrationInit('contractor');
window.addMessage = addMessage; window.addMessage = addMessage;
}); });

@ -5,6 +5,7 @@ import {readMoreInit} from './seeds/read_more'
import {onlyOneCheckboxInit} from './seeds/only_one_checkbox' import {onlyOneCheckboxInit} from './seeds/only_one_checkbox'
import {showPopupsInit, addMessage} from './seeds/popups' import {showPopupsInit, addMessage} from './seeds/popups'
import {scrollOnRequiredInit} from './seeds/scroll_on_required' import {scrollOnRequiredInit} from './seeds/scroll_on_required'
import {ajaxRegistrationInit} from './seeds/ajax_registration'
import {print} from './seeds/test_seeds' import {print} from './seeds/test_seeds'
function showHideRealry() { function showHideRealry() {
@ -28,5 +29,6 @@ $(function () {
onlyOneCheckboxInit('#safe', '#by_agreement'); onlyOneCheckboxInit('#safe', '#by_agreement');
scrollOnRequiredInit(); scrollOnRequiredInit();
showPopupsInit(); showPopupsInit();
ajaxRegistrationInit('customer');
window.addMessage = addMessage; window.addMessage = addMessage;
}); });

@ -0,0 +1,5 @@
import {popupYoutubeInit} from './seeds/popup-youtube'
$(function () {
popupYoutubeInit()
});

@ -0,0 +1,67 @@
const $form = $('#form-registration');
function clearErrors() {
let $error_tags = $form.find('.errorlist');
if ($error_tags.length > 0) $error_tags.remove();
}
function sendData(form_data) {
// console.log("form_data = ", form_data);
$.ajax({
url: '/users/register/',
type: 'post',
data: form_data,
success: function (data) {
// console.log("success data -->", data);
$('#registrationFormModal').modal('toggle');
$('input[name=not_auth_user_id]').val(data.pk);
$('#not_customer').hide();
$('#is_customer').show();
},
error: function (xhr, ajaxOptions, thrownError) {
let status = xhr.status;
if (status == 400) {
let data = JSON.parse(xhr.responseText);
$.each(data, function (key, value) {
let ul = $("<ul class='errorlist'></ul>");
for (let error of value) {
ul.append(`<li>${error}</li>`)
}
let $field;
if (key == 'captcha_html') {
// console.log("captcha html = ", key, '/', value);
$form.find('.captcha').html(value);
return;
} else if (key == 'captcha') {
$field = $form.find('.g-recaptcha');
} else if (key == 'tos') {
$field = $form.find(`input[name=${key}]`).parent();
} else {
$field = $form.find(`input[name=${key}]`);
if ($field.length == 0) console.log(`!!!field ${key} not found`);
}
if ($field.length > 0) $field.parent().append(ul);
});
// console.log('captcha error = ', data.captcha);
// console.log('data type = ', typeof data);
}
// console.log("data = ", xhr.responseText);
// console.log(ajaxOptions);
// console.log(thrownError);
}
})
}
function ajaxRegistrationInit(user_type) {
// const $form = $('#form-registration');
$form.on("submit", function (e) {
e.preventDefault();
// get form data and add user_type
clearErrors();
let form_data = $form.serialize() + "&user_type=" + encodeURIComponent(user_type);
sendData(form_data);
})
}
export {ajaxRegistrationInit}

@ -0,0 +1,12 @@
function popupYoutubeInit() {
$('.popup-youtube').magnificPopup({
disableOn: 700,
type: 'iframe',
mainClass: 'mfp-fade',
removalDelay: 160,
preloader: false,
fixedContentPos: false
});
}
export {popupYoutubeInit}

@ -1,6 +1,17 @@
function sendData(){ function sendData(form_data) {
console.log("form_data = ", form_data);
$.ajax({ $.ajax({
url: '', url: '/users/register/',
type: 'post',
data: form_data,
success: function (data) {
console.log("success data -->", data)
},
error: function (xhr, ajaxOptions, thrownError) {
console.log("status = ", xhr.status);
console.log("data = ", xhr.responseText);
console.log(ajaxOptions);
console.log(thrownError);
}
}) })
} }

@ -4,6 +4,9 @@
.select-box-container .select-box-container
display: block display: block
li, ul
margin: 0
padding: 0
.select-box-header .select-box-header
white-space: nowrap white-space: nowrap
@ -37,10 +40,6 @@
margin: 0 margin: 0
padding: 0 padding: 0
.select-box-options li, ul
margin: 0
padding: 0
.select-box-options ul .select-box-options ul
border-right: 1px solid #{map_get($component_colors, border)} border-right: 1px solid #{map_get($component_colors, border)}

@ -4,7 +4,7 @@
min-height: 40px min-height: 40px
//padding-bottom: 20px //padding-bottom: 20px
.selected-element .selected-element
padding: 5px 35px 5px 10px padding: 7px 35px 3px 10px
margin-top: 8px margin-top: 8px
min-height: 45px min-height: 45px
background-color: #e3e3e3 background-color: #e3e3e3
@ -19,6 +19,7 @@
text-overflow: ellipsis text-overflow: ellipsis
overflow: hidden overflow: hidden
width: 100% width: 100%
display: block
.header .header
font-size: 7pt font-size: 7pt
color: #676363 color: #676363
@ -39,9 +40,9 @@
.horizontal .horizontal
&.selected-container &.selected-container
//display: inline-block //display: inline-block
.header, .name //.header, .name
//max-width: 300px //max-width: 300px
display: inline-block //display: block
.selected-element .selected-element
max-width: 300px max-width: 300px
display: inline-block display: inline-block

@ -1,4 +1,4 @@
$static : '/static' $static: '/static'
@font-face @font-face
font-family: 'pfbeausanspro-reg' font-family: 'pfbeausanspro-reg'
@ -6,24 +6,39 @@ $static : '/static'
font-weight: normal font-weight: normal
font-style: normal font-style: normal
@font-face @font-face
font-family: 'pfbeausanspro-thin' font-family: 'pfbeausanspro-thin'
src: url('#{$static}/fonts/PFBeauSansPro-Thin/PFBeauSansPro-Thin.eot?#iefix') format("embedded-opentype"), url('#{$static}/fonts/PFBeauSansPro-Thin/PFBeauSansPro-Thin.woff') format("woff"), url('#{$static}/fonts/PFBeauSansPro-Thin/PFBeauSansPro-Thin.ttf') format("truetype"), url('#{$static}/fonts/PFBeauSansPro-Thin/PFBeauSansPro-Thin.svg#PFBeauSansPro-Thin') format("svg") src: url('#{$static}/fonts/PFBeauSansPro-Thin/PFBeauSansPro-Thin.eot?#iefix') format("embedded-opentype"), url('#{$static}/fonts/PFBeauSansPro-Thin/PFBeauSansPro-Thin.woff') format("woff"), url('#{$static}/fonts/PFBeauSansPro-Thin/PFBeauSansPro-Thin.ttf') format("truetype"), url('#{$static}/fonts/PFBeauSansPro-Thin/PFBeauSansPro-Thin.svg#PFBeauSansPro-Thin') format("svg")
font-weight: normal font-weight: normal
font-style: normal font-style: normal
@font-face @font-face
font-family: 'pfdintextcomppro-regular' font-family: 'pfdintextcomppro-regular'
src: url('#{$static}/fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.eot?#iefix') format("embedded-opentype"), url('#{$static}/fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.woff') format("woff"), url('#{$static}/fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.ttf') format("truetype"), url('#{$static}/fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.svg#PFDinTextCompPro-Regular') format("svg") src: url('#{$static}/fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.eot?#iefix') format("embedded-opentype"), url('#{$static}/fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.woff') format("woff"), url('#{$static}/fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.ttf') format("truetype"), url('#{$static}/fonts/PFDinTextCompPro-Regular/PFDinTextCompPro-Regular.svg#PFDinTextCompPro-Regular') format("svg")
font-weight: normal font-weight: normal
font-style: normal font-style: normal
@font-face @font-face
font-family: 'Arial-MT-Regular' font-family: 'Arial-MT-Regular'
src: url('#{$static}/fonts/Arial-MT-Regular/Arial-MT-Regular.eot') src: url('#{$static}/fonts/Arial-MT-Regular/Arial-MT-Regular.eot')
src: url('#{$static}/fonts/Arial-MT-Regular/Arial-MT-Regular.eot?#iefix') format("embedded-opentype"), url('#{$static}/fonts/Arial-MT-Regular/Arial-MT-Regular.woff') format("woff"), url('#{$static}/fonts/Arial-MT-Regular/Arial-MT-Regular.ttf') format("truetype"), url('#{$static}/fonts/Arial-MT-Regular/Arial-MT-Regular.svg#Arial-MT-Regular') format("svg") src: url('#{$static}/fonts/Arial-MT-Regular/Arial-MT-Regular.eot?#iefix') format("embedded-opentype"), url('#{$static}/fonts/Arial-MT-Regular/Arial-MT-Regular.woff') format("woff"), url('#{$static}/fonts/Arial-MT-Regular/Arial-MT-Regular.ttf') format("truetype"), url('#{$static}/fonts/Arial-MT-Regular/Arial-MT-Regular.svg#Arial-MT-Regular') format("svg")
font-weight: normal font-weight: normal
font-style: normal font-style: normal
@font-face
font-family: "Myriad"
src: url('#{$static}/fonts/MyriadPro/MyriadPro-Cond.otf')
font-weight: normal
font-style: normal
@font-face
font-family: "Myriad"
src: url("#{$static}/fonts/MyriadPro/MyriadPro-BoldCond.otf")
font-weight: bold
font-style: normal
@font-face
font-family: "Myriad"
src: url("#{$static}/fonts/MyriadPro/MyriadPro-CondIt.otf")
font-weight: normal
font-style: italic

@ -73,7 +73,11 @@ textarea.description
font-weight: normal font-weight: normal
font-style: normal font-style: normal
font-size: 14pt font-size: 14pt
display: inline-block
color: #000
&:hover &:hover
color: #000
text-decoration: none
box-shadow: 0 0 15px rgba(0, 0, 0, 0.2) box-shadow: 0 0 15px rgba(0, 0, 0, 0.2)
-webkit-transform: scale(1.04) -webkit-transform: scale(1.04)
-moz-transform: scale(1.04) -moz-transform: scale(1.04)
@ -163,7 +167,7 @@ textarea.description
.border .border
flex: 1 1 auto flex: 1 1 auto
margin: 10px 0 0 25px margin-top: 10px
border-top: 1px solid #CFCFCF border-top: 1px solid #CFCFCF
.btn-plus .btn-plus

@ -1,6 +1,8 @@
@import "base/fonts.sass" @import "base/fonts"
@import "base/colors.sass" @import "base/colors"
@import "base/variavles"
@import "common/parts" @import "common/parts"
@import "modules/mods"
body body
font-size: 11pt font-size: 11pt
@ -39,34 +41,18 @@ body
@extend %header @extend %header
max-width: 100% max-width: 100%
// TODO: move to modules/_mods.sass
.mod-align-bottom
display: flex
//-ms-flex-align: center
//-webkit-align-items: center
//-webkit-box-align: center
align-items: flex-end
.mod-align-center
display: flex
//-ms-flex-align: center
//-webkit-align-items: center
//-webkit-box-align: center
align-items: center
.logical-block .logical-block
$pad: 30px $pad: 30px
padding-top: $pad padding-top: $pad
padding-bottom: $pad padding-bottom: $pad
margin-top: $pad margin-top: $pad
border-top: 1px solid #{map_get($component_colors, border)}
border-bottom: 1px solid #{map_get($component_colors, border)}
.select-text .select-text
color: #{map_get($component_colors, select)} color: #{map_get($component_colors, select)}
.slide .slide
display: none display: none
margin-bottom: 20px
.slide.active .slide.active
display: block display: block

@ -1,6 +1,24 @@
.mod-align-bottom,
.vertical-bottom .vertical-bottom
//deprecated
display: flex
-ms-flex-align: end
-webkit-align-items: flex-end
-webkit-box-align: end
align-items: flex-end
.mod-align-center
display: flex display: flex
-ms-flex-align: center -ms-flex-align: center
-webkit-align-items: center -webkit-align-items: center
-webkit-box-align: center -webkit-box-align: center
align-items: flex-end align-items: center
.mod-no-padding
padding: 0 !important
.mod-row-eq-height
display: -webkit-box
display: -webkit-flex
display: -ms-flexbox
display: flex

@ -1,7 +1,7 @@
import html import html
import momoko import momoko
from settings import settings, PORT, DATABASE_DSN from chat.settings.dev import settings, PORT, DATABASE_DSN
from tornado import gen, web, websocket, escape from tornado import gen, web, websocket, escape
from tornado.httpserver import HTTPServer from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop from tornado.ioloop import IOLoop

@ -0,0 +1,16 @@
import os
PORT = 8888
settings = {
'cookie_secret': '__TODO:_GENERATE_YOUR_OWN_RANDOM_VALUE_HERE__',
'template_path': os.path.join(os.path.dirname(__file__), 'templates'),
'static_path': os.path.join(os.path.dirname(__file__), 'static'),
'login_url': '/login',
'xsrf_cookies': True,
'debug': True,
'autoreload': True,
'server_traceback': True,
}
DATABASE_DSN = 'dbname=archilance user=postgres password=postgres host=localhost'

@ -0,0 +1,6 @@
from .base import *
try:
from .local import *
except ImportError:
pass

@ -17,15 +17,18 @@
<ul class="nav nav-tabs nav-justified"> <ul class="nav nav-tabs nav-justified">
<li role="presentation"> <li role="presentation">
<a href="#tab1" data-toggle="tab">Личные<span class="count-tab" id="count-tab-contact">{{ contacts_users_count }}</span></a> <a href="#tab1" data-toggle="tab">Личные<span class="count-tab"
id="count-tab-contact">{{ contacts_users_count }}</span></a>
</li> </li>
<li role="presentation"> <li role="presentation">
<a href="#tab2" data-toggle="tab">Заказчики<span class="count-tab" id="count-tab-order">{{ orders_ms_count }}</span></a> <a href="#tab2" data-toggle="tab">Заказчики<span class="count-tab"
id="count-tab-order">{{ orders_ms_count }}</span></a>
</li> </li>
<li role="presentation"> <li role="presentation">
<a href="#tab3" data-toggle="tab">Исполнители,Группы<span class="count-tab" id="count-tab-team">{{ teams_ms_count }}</span></a> <a href="#tab3" data-toggle="tab">Исполнители,Группы<span class="count-tab"
id="count-tab-team">{{ teams_ms_count }}</span></a>
</li> </li>
</ul> </ul>
@ -40,29 +43,7 @@
<div class="messageBlock box-sizing disTab"> <div class="messageBlock box-sizing disTab">
<p>Контакты</p> <p>Контакты</p>
{% for contact in contacts_users %} {% for contact in contacts_users %}
<div class="message messd user-block" id="userBlock{{ contact.pk }}" data-id="{{ contact.pk }}"> {% include 'inc-contact-card.html' %}
<div class="imgMess">
{% thumbnail contact.avatar "60x60" crop="center" as im %}
<img src="{{ im.url }}" alt="mess-image">
{% endthumbnail %}
</div>
<p class="nameMess">
{% if contact.is_contractor %}
{% url "users:contractor-profile" pk=contact.pk as contact_url %}
{% else %}
{% url "users:customer-profile-open-projects" pk=contact.pk as contact_url %}
{% endif %}
<div><a href="{{ contact_url }}" style="color:black;">{{ contact.username }}</a></div>
</p>
<a href="#" data-id="{{ contact.id }}" class="conMess">Контакты</a>
<span class="contact-count-{{ contact.pk|add:request.user.pk }}">
{% get_new_count_for_contact contact request.user %}</span>
<a href="#" class="deleteMess" data-recipent-id="{{ contact.pk }}">
Удалить контакт
</a>
</div>
{% endfor %} {% endfor %}
</div> </div>
@ -74,12 +55,13 @@
<input type="hidden" value="{{ request.user.pk }}" name="senderId" id="senderContactId"/> <input type="hidden" value="{{ request.user.pk }}" name="senderId" id="senderContactId"/>
<input type="hidden" value="" name="recipentId" id="recipentContactId"/> <input type="hidden" value="" name="recipentId" id="recipentContactId"/>
<textarea id="chat" name="chat_message" class="box-sizing"></textarea> <textarea id="chat" name="chat_message" class="box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя отправить</p> <p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
отправить</p>
<div class="bunChat"> <div class="bunChat">
<div class="setChat box-sizing upload"> <div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-contact"> <input type="file" name="file" id="upload-document-contact">
<p>Прикрепить файл</p> <p>Прикрепить файл</p>
</div> </div>
<div id="document-send-contact"></div> <div id="document-send-contact"></div>
<a id="contact-chat-add-message" href="#">отправить</a> <a id="contact-chat-add-message" href="#">отправить</a>
@ -89,29 +71,30 @@
<div class="col-lg-3 wrChat1"> <div class="col-lg-3 wrChat1">
<div class="col-lg-12 documentsChat"> <div class="col-lg-12 documentsChat">
<p>Прикрепленные документы</p> <p>Прикрепленные документы</p>
<ul id="documentSpace"> <ul id="documentSpace">
</ul> </ul>
<a href="{% url 'common:create' %}"> <a href="{% url 'common:create' %}">
Распечатать с помощью ресурса Распечатать с помощью ресурса
</a> </a>
</div> </div>
<div class="textAreaBlock2 box-sizing disTab"> <div class="textAreaBlock2 box-sizing disTab">
<ul class="contractor-notes-block"> <ul class="contractor-notes-block">
</ul> </ul>
<form id="add-form-contractor-note"> <form id="add-form-contractor-note">
<p>Для заметок</p> <p>Для заметок</p>
<input type="hidden" name="sender" id="senderNoteContractor" value="{{ request.user.pk }}"/> <input type="hidden" name="sender" id="senderNoteContractor"
<input type="hidden" name="recipent" id="recipentNoteContractor" value=""/> value="{{ request.user.pk }}"/>
<input type="hidden" name="recipent" id="recipentNoteContractor" value=""/>
<textarea id="chat2" name="text"></textarea> <textarea id="chat2" name="text"></textarea>
<a href="#" id="add-note-contractor">сохранить</a> <a href="#" id="add-note-contractor">сохранить</a>
</form> </form>
</div> </div>
<!-- order-info --> <!-- order-info -->
{% include 'contact-info.html' %} {% include 'contact-info.html' %}
<!-- --> <!-- -->
</div> </div>
</div> </div>
<!-- End block Tab1 --> <!-- End block Tab1 -->
@ -123,12 +106,15 @@
<p>Заказы</p> <p>Заказы</p>
{% for order in orders %} {% for order in orders %}
<div class="orderBlock box-sizing order-block" data-project-id="{{ order.project.id }}" <div class="orderBlock box-sizing order-block" data-project-id="{{ order.project.id }}"
id="orderBlock{{ order.id }}" data-team-id="{% if order.team %}{{ order.team.pk }}{% else %}0{% endif %}" data-recipent-id="{{ order.project.customer.pk }}" data-id="{{ order.id }}"> id="orderBlock{{ order.id }}"
data-team-id="{% if order.team %}{{ order.team.pk }}{% else %}0{% endif %}"
data-recipent-id="{{ order.project.customer.pk }}" data-id="{{ order.id }}">
<span class="dimovChat"></span> <span class="dimovChat"></span>
<p class="titleOB">{{ order }}</p> <p class="titleOB">{{ order }}</p>
<div class="hideOBB"> <div class="hideOBB">
<p class="pOB"> <p class="pOB">
<span style="display: none;" class="order-count-{{ order.id }}">{% get_new_count_for_order request.user order.id %}</span> <span style="display: none;"
class="order-count-{{ order.id }}">{% get_new_count_for_order request.user order.id %}</span>
<span>Исполнитель:</span> {{ request.user.get_full_name }}</p> <span>Исполнитель:</span> {{ request.user.get_full_name }}</p>
<a href="#" class="linkChat11 full-order-info"> <a href="#" class="linkChat11 full-order-info">
@ -143,17 +129,17 @@
{% if archive_orders %} {% if archive_orders %}
<div class="textAreaBlock2 FFD box-sizing disTab"> <div class="textAreaBlock2 FFD box-sizing disTab">
<a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a> <a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a>
</div> </div>
<p id="show-archive-label" style="display: none;">Архивные заказы</p> <p id="show-archive-label" style="display: none;">Архивные заказы</p>
<div id="archive-space" style="display:none;"> <div id="archive-space" style="display:none;">
<div id="trashed-orders"> <div id="trashed-orders">
{% for order in archive_orders %} {% for order in archive_orders %}
<div data-id="{{ order.id }}" class="trashedOrderBlock box-sizing"> <div data-id="{{ order.id }}" class="trashedOrderBlock box-sizing">
<span class="dimovChat"></span> <span class="dimovChat"></span>
<p class="titleOB"> {{ order.project.name }}</p> <p class="titleOB"> {{ order.project.name }}</p>
<div class="hideOBB"><p class="pOB"> <div class="hideOBB"><p class="pOB">
<span>Исполнитель: <span>Исполнитель:
{% if order.contractor %} {% if order.contractor %}
{{ order.contractor.get_full_name }} {{ order.contractor.get_full_name }}
@ -161,15 +147,16 @@
{{ order.team.name }} {{ order.team.name }}
{% endif %} {% endif %}
</span> </span>
</p> </p>
<a href="#" class="linkChat11 full-order-info"> <a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> <span class="glyphicon glyphicon-info-sign"
Полное описание заказа aria-hidden="true"></span>
</a> Полное описание заказа
</a>
</div>
</div> </div>
</div> {% endfor %}
{% endfor %} </div>
</div>
</div> </div>
{% endif %} {% endif %}
</div> </div>
@ -183,11 +170,12 @@
<input type="hidden" id="senderId" name="senderId" value="{{ request.user.pk }}"> <input type="hidden" id="senderId" name="senderId" value="{{ request.user.pk }}">
<input type="hidden" id="recipentId" name="recipentId" value=""> <input type="hidden" id="recipentId" name="recipentId" value="">
<textarea id="chat" class="box-sizing"></textarea> <textarea id="chat" class="box-sizing"></textarea>
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя отправить</p> <p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
отправить</p>
<div class="bunChat"> <div class="bunChat">
<div class="setChat box-sizing upload"> <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> <p>Прикрепить файл</p>
</div> </div>
<div id="document-send-order"></div> <div id="document-send-order"></div>
@ -218,28 +206,28 @@
<div class="stepssBlock box-sizing disTab" id="completeWork"> <div class="stepssBlock box-sizing disTab" id="completeWork">
<p class="titleStepss">3 / Выполнение работы</p> <p class="titleStepss">3 / Выполнение работы</p>
<p class="textStepss"> <p class="textStepss">
Процесс выполнения задания в заказе до получения Процесс выполнения задания в заказе до получения
заказчиком итогового результата работы. заказчиком итогового результата работы.
</p> </p>
<div id="stagesWork" class="stages-work textAreaBlock2"> <div id="stagesWork" class="stages-work textAreaBlock2">
</div> </div>
</div> </div>
<div id="leaveReview" style="display: none;"> <div id="leaveReview" style="display: none;">
<div class="closeChat closeChat1"> <div class="closeChat closeChat1">
<a href="#" data-toggle="modal" data-target="#review-add" data-review-type="positive"> <a href="#" data-toggle="modal" data-target="#review-add" data-review-type="positive">
Закрыть проект<br>и оставить отзыв Закрыть проект<br>и оставить отзыв
</a> </a>
</div> </div>
<div class="closeChat closeChat2"> <div class="closeChat closeChat2">
<a href="#" data-toggle="modal" data-target="#review-add" data-review-type="negative"> <a href="#" data-toggle="modal" data-target="#review-add" data-review-type="negative">
Закрыть проект<br>и оставить отзыв Закрыть проект<br>и оставить отзыв
</a> </a>
</div> </div>
</div> </div>
<!-- Review add --> <!-- Review add -->
@ -250,12 +238,12 @@
<!-- --> <!-- -->
<div class="col-lg-12 documentsChat"> <div class="col-lg-12 documentsChat">
<p>Прикрепленные документы</p> <p>Прикрепленные документы</p>
<ul id="documentOrderSpace"></ul> <ul id="documentOrderSpace"></ul>
<a href="{% url 'common:create' %}"> <a href="{% url 'common:create' %}">
Распечатать с помощью ресурса Распечатать с помощью ресурса
</a> </a>
</div> </div>
<div class="textAreaBlock2 box-sizing disTab"> <div class="textAreaBlock2 box-sizing disTab">
<ul class="order-notes-block"> <ul class="order-notes-block">
@ -273,118 +261,125 @@
</div> </div>
<!-- End block Tab2--> <!-- End block Tab2-->
<!-- Tab3 groups block --> <!-- Tab3 groups block -->
<div class="chatBlock disTab tab-pane fade" id="tab3"> <div class="chatBlock disTab tab-pane fade" id="tab3">
<div class="col-lg-3 wrMessages"> <div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab"> <div class="messageBlock box-sizing disTab">
<p>Заказы</p> <p>Заказы</p>
{% for torder in team_orders %} {% for torder in team_orders %}
<div class="team-order-block orderBlock box-sizing" id="teamOrderBlock{{ torder.pk }}" <div class="team-order-block orderBlock box-sizing" id="teamOrderBlock{{ torder.pk }}"
data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk }}" data-id="{{ torder.pk }}"> data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk }}"
<span class="dimovChat"></span> data-id="{{ torder.pk }}">
<p class="titleOB"> <span class="dimovChat"></span>
{{ torder }} <p class="titleOB">
{{ torder }}
</p>
<div class="hideOBB disTab">
<p class="pOB">
<span style="display: none;"
class="teamorder-count-{{ torder.team.id }}">{% get_new_count_for_team request.user torder.team.id torder.pk %}</span>
<span>Исполнитель:</span> {{ torder.team.name }}
</p> </p>
<div class="hideOBB disTab"> <ul class="listChat1">
<p class="pOB"> {% for tuser in torder.team.users.all %}
<li>{{ tuser }}</li>
<span style="display: none;" class="teamorder-count-{{ torder.team.id }}">{% get_new_count_for_team request.user torder.team.id torder.pk %}</span> {% endfor %}
<span>Исполнитель:</span> {{ torder.team.name }} </ul>
</p> <p class="pOB">
<ul class="listChat1"> <span>Чаты:</span>
{% for tuser in torder.team.users.all %} {% if request.user.pk != torder.team.owner.pk %}
<li>{{ tuser }}</li> <span class="team-chat-user"
{% endfor %} data-id="{{ torder.team.owner.pk }}">{{ torder.team.owner.username }}</span>
</ul> {% endif %}
<p class="pOB"> {% for tuser in torder.team.contractors.all %}
<span>Чаты:</span> {% if request.user.pk != tuser.pk %}
{% if request.user.pk != torder.team.owner.pk %} <span class="team-chat-user"
<span class="team-chat-user" data-id="{{ tuser.pk }}">{{ tuser.username }}</span>
data-id="{{ torder.team.owner.pk}}">{{ torder.team.owner.username }}</span> {% endif %}
{% endif %} {% endfor %}
{% for tuser in torder.team.contractors.all %} </p>
{% if request.user.pk != tuser.pk %} <a href="#" class="linkChat11 full-order-info">
<span class="team-chat-user" <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
data-id="{{ tuser.pk }}">{{ tuser.username }}</span> Полное описание заказа
{% endif %} </a>
{% endfor %}
</p>
<a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
</a>
</div>
</div> </div>
{% endfor %} </div>
{% endfor %}
{% for yteam in your_teams %} {% for yteam in your_teams %}
<div class="team-block orderBlock box-sizing" id="teamMyBlock{{ yteam.pk }}" data-team-id="{{ yteam.pk }}"> <div class="team-block orderBlock box-sizing" id="teamMyBlock{{ yteam.pk }}"
<span class="dimovChat"></span> data-team-id="{{ yteam.pk }}">
<p class="titleOB"> <span class="dimovChat"></span>
{{ yteam }} <p class="titleOB">
{{ yteam }}
</p>
<div class="hideOBB disTab">
<p class="pOB">
<span style="display: none;"
class="team-count-{{ yteam.id }}">{% get_new_count_for_team request.user yteam.id %}</span>
<span>Владелец группы:</span> {{ yteam.owner }}
</p>
<ul class="listChat1">
{% for tuser in yteam.contractors.all %}
<li>{{ tuser }}</li>
{% endfor %}
</ul>
<p class="pOB">
<span>Чаты:</span>
{% if request.user.pk != torder.team.owner.pk %}
<span class="team-chat-user"
data-id="{{ yteam.owner.pk }}">{{ yteam.owner.username }}</span>
{% endif %}
{% for tuser in yteam.contractors.all %}
{% if request.user.pk != tuser.pk %}
<span class="team-chat-user"
data-id="{{ tuser.pk }}">{{ tuser.username }} </span>
{% endif %}
{% endfor %}
</p> </p>
<div class="hideOBB disTab">
<p class="pOB">
<span style="display: none;" class="team-count-{{ yteam.id }}">{% get_new_count_for_team request.user yteam.id %}</span>
<span>Владелец группы:</span> {{ yteam.owner }}
</p>
<ul class="listChat1">
{% for tuser in yteam.contractors.all %}
<li>{{ tuser }}</li>
{% endfor %}
</ul>
<p class="pOB">
<span>Чаты:</span>
{% if request.user.pk != torder.team.owner.pk %}
<span class="team-chat-user" data-id="{{ yteam.owner.pk}}">{{ yteam.owner.username }}</span>
{% endif %}
{% for tuser in yteam.contractors.all %}
{% if request.user.pk != tuser.pk %}
<span class="team-chat-user" data-id="{{ tuser.pk }}">{{ tuser.username }} </span>
{% endif %}
{% endfor %}
</p>
</div>
</div> </div>
</div>
{% endfor %} {% endfor %}
</div>
</div> </div>
<div class="col-lg-6 commChat"> </div>
<div id="message-chat-team-space"></div> <div class="col-lg-6 commChat">
<form id="team-chat-form"> <div id="message-chat-team-space"></div>
<input type="hidden" name="sender" id="senderTeamId" value="{{ request.user.pk }}"> <form id="team-chat-form">
<input type="hidden" name="recipent" id="recipentTeamId"> <input type="hidden" name="sender" id="senderTeamId" value="{{ request.user.pk }}">
<input type="hidden" name="order" id="orderTeamId"> <input type="hidden" name="recipent" id="recipentTeamId">
<input type="hidden" name="team" id="teamId"> <input type="hidden" name="order" id="orderTeamId">
<input type="hidden" name="team_ids" id="teamIds"> <input type="hidden" name="team" id="teamId">
<input type="hidden" name="document-send" id="documentSendIds"> <input type="hidden" name="team_ids" id="teamIds">
<textarea id="chatText" class="chat-textarea box-sizing"></textarea> <input type="hidden" name="document-send" id="documentSendIds">
<p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя отправить</p> <textarea id="chatText" class="chat-textarea box-sizing"></textarea>
<div class="bunChat"> <p class="errorEmptyMessage" style="color: red;display:none;">Пустое сообщение нельзя
<div class="setChat box-sizing upload"> отправить</p>
<input type="file" name="file" id="upload-document-team"> <div class="bunChat">
<p>Прикрепить файл</p> <div class="setChat box-sizing upload">
</div> <input type="file" name="file" id="upload-document-team">
<div id="progress" class="progress"> <p>Прикрепить файл</p>
<div class="progress-bar progress-bar-success"></div> </div>
</div> <div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
<div id="document-send"></div>
<a href="#" id="add-team-chat-message">отправить</a>
</div> </div>
</form>
</div> <div id="document-send"></div>
<div class="col-lg-3 wrstepschat"> <a href="#" id="add-team-chat-message">отправить</a>
</div>
</form>
</div>
<div class="col-lg-3 wrstepschat">
<div class="col-lg-12 documentsChat"> <div class="col-lg-12 documentsChat">
<p>Прикрепленные документы</p> <p>Прикрепленные документы</p>
<ul id="documentTeamSpace"></ul> <ul id="documentTeamSpace"></ul>
<a href="{% url 'common:create' %}"> <a href="{% url 'common:create' %}">
Распечатать с помощью ресурса Распечатать с помощью ресурса
</a> </a>
</div> </div>
<div class="textAreaBlock2 box-sizing disTab"> <div class="textAreaBlock2 box-sizing disTab">
<ul class="team-notes-block"> <ul class="team-notes-block">
@ -400,12 +395,12 @@
</form> </form>
</div> </div>
</div>
</div> </div>
<!-- End block Tab3--> </div>
<!-- order-info --> <!-- End block Tab3-->
{% include 'order_info.html' %} <!-- order-info -->
<!-- --> {% include 'order_info.html' %}
<!-- -->
</div> </div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
</div> </div>
@ -414,12 +409,12 @@
{% endblock %} {% endblock %}
{% block js_block %} {% block js_block %}
<script type="text/javascript"> <script type="text/javascript">
var userId = {{ request.user.pk }}; var userId = {{ request.user.pk }};
var domain = '{{ request.META.HTTP_HOST }}'; var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}'; var port = '{{ request.META.SERVER_PORT }}';
</script> </script>
<script type="text/javascript" src='{% static "js/chat.js" %}'></script> <script type="text/javascript" src='{% static "js/chat.js" %}'></script>
<script type="text/javascript" src='{% static "js/chat_contractor.js" %}'></script> <script type="text/javascript" src='{% static "js/chat_contractor.js" %}'></script>
{% endblock %} {% endblock %}

@ -35,35 +35,7 @@
<div class="messageBlock box-sizing disTab"> <div class="messageBlock box-sizing disTab">
<p>Контакты</p> <p>Контакты</p>
{% for contact in contacts_users %} {% for contact in contacts_users %}
<div class="message messd user-block" id="userBlock{{ contact.pk }}" {% include 'inc-contact-card.html' %}
data-id="{{ contact.pk }}">
<div class="imgMess">
{% if contact.avatar %}
{% thumbnail contact.avatar "60x60" crop="center" as im %}
<img src="{{ im.url }}" alt="mess-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="mess-image">
{% endif %}
</div>
<p class="nameMess">
{% if contact.is_contractor %}
{% url "users:contractor-profile" pk=contact.pk as contact_url %}
{% else %}
{% url "users:customer-profile-open-projects" pk=contact.pk as contact_url %}
{% endif %}
<div><a href="{{ contact_url }}">{{ contact.username }}</a></div>
</p>
<a href="#" data-id="{{ contact.id }}" class="conMess">Контакты</a>
<span class="contact-count-{{ contact.pk|add:request.user.pk }}">
{% get_new_count_for_contact contact request.user %}
</span>
<a href="#" class="deleteMess" data-recipent-id="{{ contact.pk }}">
Удалить контакт
</a>
</div>
{% endfor %} {% endfor %}
</div> </div>
@ -127,7 +99,8 @@
<p>Заказы</p> <p>Заказы</p>
{% for order in orders %} {% for order in orders %}
<div class="orderBlock box-sizing order-block" <div class="orderBlock box-sizing order-block"
data-team-id="{% if order.order.team %}{{ order.order.team.pk }}{% else %}0{% endif %}" data-team-id="
{% if order.order.team %}{{ order.order.team.pk }}{% else %}0{% endif %}"
data-project-id="{{ order.id }}" data-project-id="{{ order.id }}"
id="orderBlock{{ order.order.id }}" id="orderBlock{{ order.order.id }}"
data-secure-deal="{% if order.order.secure %}true{% else %}false{% endif %}" data-secure-deal="{% if order.order.secure %}true{% else %}false{% endif %}"
@ -140,7 +113,8 @@
<p class="titleOB">{{ order }}</p> <p class="titleOB">{{ order }}</p>
<div class="hideOBB"> <div class="hideOBB">
<p class="pOB"> <p class="pOB">
<span style="display: none;" class="order-count-{{ order.order.id }}">{% get_new_count_for_order request.user order.order.id %}</span> <span style="display: none;"
class="order-count-{{ order.order.id }}">{% get_new_count_for_order request.user order.order.id %}</span>
<span>Исполнитель:</span> <span>Исполнитель:</span>
{% if order.order.contractor %} {% if order.order.contractor %}
{{ order.order.contractor.get_full_name }} {{ order.order.contractor.get_full_name }}
@ -152,9 +126,9 @@
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> <span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа Полное описание заказа
</a> </a>
{# <a href="#" class="deleteOrder" data-project-id="{{ order.pk }}">#} {# <a href="#" class="deleteOrder" data-project-id="{{ order.pk }}">#}
{# Удалить заказ#} {# Удалить заказ#}
{# </a>#} {# </a>#}
</div> </div>
</div> </div>
@ -164,17 +138,17 @@
{% if archive_projects %} {% if archive_projects %}
<div class="textAreaBlock2 FFD box-sizing disTab"> <div class="textAreaBlock2 FFD box-sizing disTab">
<a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a> <a href="#" data-show="true" id="trashed-button">Показать архивные заказы</a>
</div> </div>
<p id="show-archive-label" style="display: none;">Архивные заказы</p> <p id="show-archive-label" style="display: none;">Архивные заказы</p>
<div id="archive-space" style="display:none;"> <div id="archive-space" style="display:none;">
<div id="trashed-orders"> <div id="trashed-orders">
{% for proj in archive_projects %} {% for proj in archive_projects %}
<div data-id="{{ proj.order.id }}" class="trashedOrderBlock box-sizing"> <div data-id="{{ proj.order.id }}" class="trashedOrderBlock box-sizing">
<span class="dimovChat"></span> <span class="dimovChat"></span>
<p class="titleOB"> {{ proj.name }}</p> <p class="titleOB"> {{ proj.name }}</p>
<div class="hideOBB"><p class="pOB"> <div class="hideOBB"><p class="pOB">
<span>Исполнитель: <span>Исполнитель:
{% if proj.order.contractor %} {% if proj.order.contractor %}
{{ proj.order.contractor.get_full_name }} {{ proj.order.contractor.get_full_name }}
@ -182,15 +156,16 @@
{{ proj.order.team.name }} {{ proj.order.team.name }}
{% endif %} {% endif %}
</span> </span>
</p> </p>
<a href="#" class="linkChat11 full-order-info"> <a href="#" class="linkChat11 full-order-info">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> <span class="glyphicon glyphicon-info-sign"
Полное описание заказа aria-hidden="true"></span>
</a> Полное описание заказа
</a>
</div>
</div> </div>
</div> {% endfor %}
{% endfor %} </div>
</div>
</div> </div>
{% endif %} {% endif %}
</div> </div>

@ -0,0 +1,56 @@
{% load thumbnail %}
{% load static %}
{% load user_tags %}
<style>
div.icon_mm1 {
display: inline-block;
height: 20px;
width: 20px;
margin-right: 5px;
background-size: cover;
background: url('/static/img/menu2.png') no-repeat 0 0;
}
div.icon_mm2 {
display: inline-block;
height: 20px;
width: 20px;
margin-right: 5px;
background-size: cover;
background: url('/static/img/menu2.png') no-repeat 0 -20px;
}
</style>
<div class="message messd user-block" id="userBlock{{ contact.pk }}" data-id="{{ contact.pk }}">
<div class="imgMess">
{% if contact.avatar %}
{% thumbnail contact.avatar "60x60" crop="center" as im %}
<img src="{{ im.url }}" alt="mess-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="mess-image">
{% endif %}
</div>
<p class="nameMess">
{% if contact.is_contractor %}
{% url "users:contractor-profile" pk=contact.pk as contact_url %}
{% else %}
{% url "users:customer-profile-open-projects" pk=contact.pk as contact_url %}
{% endif %}
<div style="display: flex; align-items: center">
{% if request.user.is_contractor %}
<div class="icon_mm1"></div>
{% else %}
<div class="icon_mm2"></div>
{% endif %}
<a href="{{ contact_url }}" style="color:black;">{{ contact.username }}</a>
</div>
</p>
<a href="#" data-id="{{ contact.id }}" class="conMess">Контакты</a>
<span class="contact-count-{{ contact.pk|add:request.user.pk }}">
{% get_new_count_for_contact contact request.user %}</span>
<a href="#" class="deleteMess" data-recipent-id="{{ contact.pk }}">
Удалить контакт
</a>
</div>

@ -46,13 +46,15 @@ class CustomRegistrationForm(RegistrationFormTermsOfService):
captcha = ReCaptchaField() captcha = ReCaptchaField()
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request') try:
super().__init__(*args, **kwargs) self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
if self.request.GET.get('type') == 'customer': if self.request.GET.get('type') == 'customer':
self.fields['user_type'].initial = 'customer' self.fields['user_type'].initial = 'customer'
elif self.request.GET.get('type') == 'contractor': elif self.request.GET.get('type') == 'contractor':
self.fields['user_type'].initial = 'contractor' self.fields['user_type'].initial = 'contractor'
except KeyError:
super().__init__(*args, **kwargs)
attrs = self.fields['user_type'].widget.attrs attrs = self.fields['user_type'].widget.attrs
attrs['class'] = _.join(_.compact((attrs.get('class'), 'selectpicker3')), ' ') attrs['class'] = _.join(_.compact((attrs.get('class'), 'selectpicker3')), ' ')

@ -1,8 +1,13 @@
import json
from django.http import HttpResponse
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth import login
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.views.generic import View from django.views.generic import View
from django.template import RequestContext, loader
class NoCsrfMixin(View): class NoCsrfMixin(View):
@ -25,3 +30,37 @@ class ContractorRequiredMixin(LoginRequiredMixin, View):
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
else: else:
raise PermissionDenied raise PermissionDenied
class AjaxUserAuthMixin:
"""
Mixin to add AJAX support to a form.
Must be used with an object-based FormView (e.g. CreateView)
"""
def render_to_json_response(self, context, **response_kwargs):
user_form = self.form_class()
captcha_html = loader.render_to_string('partials/inc-captcha.html', {"user_form": user_form})
context.update({"captcha_html": captcha_html})
data = json.dumps(context, ensure_ascii=False)
response_kwargs['content_type'] = 'application/json'
return HttpResponse(data, **response_kwargs)
def form_invalid(self, form):
response = super().form_invalid(form)
if self.request.is_ajax():
return self.render_to_json_response(form.errors, status=400)
else:
return response
def form_valid(self, form):
if self.request.is_ajax():
new_user = self.register(form)
data = {
'pk': new_user.pk,
}
return self.render_to_json_response(data)
else:
response = super().form_valid(form)
return response

@ -148,4 +148,11 @@ def get(dic, key):
return dic.get(key) return dic.get(key)
@register.filter
def max_count(value, max_value):
value = int(value) or 0
if value > max_value:
return '99+'
return str(value)
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))

@ -12,7 +12,7 @@ from sorl.thumbnail import get_thumbnail
from archilance import util from archilance import util
from archilance.mixins import BaseMixin from archilance.mixins import BaseMixin
from common.mixins import NoCsrfMixin from common.mixins import NoCsrfMixin, AjaxUserAuthMixin
from users.models import ContractorResume from users.models import ContractorResume
from .forms import PrintOrderForm, CustomRegistrationForm from .forms import PrintOrderForm, CustomRegistrationForm
from .models import PrintDocuments, PrintOrder, Settings, LiveImageUpload from .models import PrintDocuments, PrintOrder, Settings, LiveImageUpload
@ -110,7 +110,7 @@ class LiveImageUploadDeleteView(NoCsrfMixin, LoginRequiredMixin, View):
return JsonResponse({'status': 'error'}) return JsonResponse({'status': 'error'})
class CustomRegistrationView(RegistrationView): class CustomRegistrationView(AjaxUserAuthMixin, RegistrationView):
form_class = CustomRegistrationForm form_class = CustomRegistrationForm
template_name = 'registration/registration_form.html' template_name = 'registration/registration_form.html'
success_url = reverse_lazy('registration_complete') success_url = reverse_lazy('registration_complete')

@ -0,0 +1,26 @@
# from django.core.context_processors import request
from django.db.models import Sum
from wallets.models import InvoiceHistory
from chat.models import NewMessage
from projects.models import Order
def user_info(request):
if request.user.is_authenticated():
current_sum_info = InvoiceHistory.objects.filter(user=request.user, type="score").aggregate(Sum('sum'))
user_balance = current_sum_info['sum__sum'] or 0
new_messages_count = NewMessage.objects.filter(user=request.user).count()
num_orders_in_work = request.user.orders.filter(status='process').count()
try:
fist_order_id = request.user.orders.all()[0].id
except IndexError:
fist_order_id = ""
return {
"user_balance": user_balance,
"new_messages_count": new_messages_count,
"num_orders_in_work": num_orders_in_work,
"fist_order_id": fist_order_id
}
return {}

@ -2,7 +2,7 @@ from django.db.models.signals import post_save
from django.dispatch import receiver from django.dispatch import receiver
from django.utils import timezone from django.utils import timezone
from .models import Stage from .models import Stage, Order
@receiver(post_save, sender=Stage) @receiver(post_save, sender=Stage)

@ -9,11 +9,11 @@
<link rel='stylesheet' href='{% sass_src "sass/main.sass" %}'> <link rel='stylesheet' href='{% sass_src "sass/main.sass" %}'>
<link rel='stylesheet' href='{% sass_src "sass/components/custom-components.sass" %}'> <link rel='stylesheet' href='{% sass_src "sass/components/custom-components.sass" %}'>
<link rel='stylesheet' href='{% sass_src "lib/proekton-components/sass/components.sass" %}'> <link rel='stylesheet' href='{% sass_src "lib/proekton-components/sass/components.sass" %}'>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% include 'partials/modals/project_work_type_suggestion.html' %} {% include 'partials/modals/project_work_type_suggestion.html' %}
{% include 'partials/modals/modal-registration_form.html' %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
<div class="container main-scope"> <div class="container main-scope">
<div class="row title-scope"> <div class="row title-scope">
@ -53,6 +53,7 @@
<div class="" id="select-box-1"></div> <div class="" id="select-box-1"></div>
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
<div class="header">&nbsp;</div>
<div href="#" onclick="return false" data-toggle="modal" <div href="#" onclick="return false" data-toggle="modal"
data-target="#projectWorkTypeSuggestionModal" data-target="#projectWorkTypeSuggestionModal"
class="btn btn-simple btn-plus">Нет нужной специальности хочу добавить class="btn btn-simple btn-plus">Нет нужной специальности хочу добавить
@ -266,16 +267,15 @@
</div> </div>
</div> </div>
</div> </div>
{# <div class="row">#} <div class="row">
{# <div class="col-lg-12">#}
{# <div class="separator">#}
{# <div class="border"></div>#}
{# </div>#}
{# </div>#}
{# </div>#}
<!-- bottom block -->
<div class="row logical-block">
<div class="col-lg-12"> <div class="col-lg-12">
<div class="row">
<div class="col-lg-12">
<div class="separator">
<div class="border"></div>
</div>
</div>
</div>
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<label class="header mod-align-center"> <label class="header mod-align-center">
@ -344,22 +344,56 @@
{% if form.cro.value %} checked{% endif %}> {% if form.cro.value %} checked{% endif %}>
</div> </div>
</div> </div>
</div> <!-- //bottom block --> </div>
<div class="row">
<div class="col-lg-12">
<div class="separator">
<div class="border"></div>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> <!-- slide --> </div> <!-- slide -->
<div class="row top-line"> <div class="row top-line">
<div class="col-lg-3" style="text-align: center">
<div class="header">&nbsp;</div> <div id="is_customer"
<input style="width: 100%" type="submit" class="btn btn-simple" {% if request.user.is_authenticated and request.user.is_customer or unregister_user %}
value="РАЗМЕСТИТЬ ЗАКАЗ"> {% else %}
style="display: none"
{% endif %}>
<div class="col-lg-3" style="text-align: center">
<input style="width: 100%" type="submit" class="btn btn-simple"
value="РАЗМЕСТИТЬ ЗАКАЗ">
</div>
<div class="col-lg-3 col-lg-offset-6" style="text-align: center">
<input style="width: 100%" type="button" class="btn btn-simple"
value="ПРЕДВАРИТЕЛЬНЫЙ ПРОСМОТР">
</div>
</div> </div>
<div class="col-lg-3 col-lg-offset-6" style="text-align: center">
<div class="header">&nbsp;</div> <div id="not_customer"
<input style="width: 100%" type="button" class="btn btn-simple" {% if not request.user.is_authenticated or request.user.is_contractor %}
value="ПРЕДВАРИТЕЛЬНЫЙ ПРОСМОТР"> {% else %}
style="display: none"
{% endif %}
{% if unregister_user %}
style="display: none"
{% endif %}>
<div class="col-lg-12" style="text-align: center">
<a onclick="return false" class="btn-simple" data-toggle="modal"
data-target="#registrationFormModal">
ДЛЯ РАЗМЕЩЕНИЯ ЗАКАЗА НЕОБХОДИМО ЗАРЕГИСТРИРОВАТЬСЯ
{% if request.user.is_contractor %}
КАК ЗАКАЗЧИК
{% endif %}
</a>
</div>
</div> </div>
<input type="hidden" name="not_auth_user_id" value="{{ unregister_user }}">
</div> </div>
</form> </form>
</div> <!-- content --> </div> <!-- content -->

@ -62,6 +62,7 @@ from .forms import (
from specializations.models import Specialization from specializations.models import Specialization
from common.models import Location from common.models import Location
from common.forms import CustomRegistrationForm
_.map = _.map_ _.map = _.map_
_.filter = _.filter_ _.filter = _.filter_
@ -115,6 +116,7 @@ class ProjectDetailWithAnswerView(BaseMixin, View):
return render(request, self.template_name, context) return render(request, self.template_name, context)
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
# @Отклик на Проект(Project)
if request.user.is_authenticated() and request.user.is_contractor(): if request.user.is_authenticated() and request.user.is_contractor():
context = self.get_context_data(**kwargs) context = self.get_context_data(**kwargs)
answer_as_team = None answer_as_team = None
@ -137,6 +139,7 @@ class ProjectDetailWithAnswerView(BaseMixin, View):
else: else:
form = self.form_class(request.POST, request=request, project=project) form = self.form_class(request.POST, request=request, project=project)
# FIXME: еще раз находим проект?
project = get_object_or_404(Project, pk=kwargs.get('pk')) project = get_object_or_404(Project, pk=kwargs.get('pk'))
context.update({'project': project}) context.update({'project': project})
@ -490,11 +493,18 @@ class CustomerProjectCreateView(BaseMixin, View):
work_type_suggestion_form = ProjectWorkTypeSuggestionForm work_type_suggestion_form = ProjectWorkTypeSuggestionForm
template_name = 'customer_project_create.html' template_name = 'customer_project_create.html'
def dispatch(self, request, *args, **kwargs): # def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer(): # if request.user.is_authenticated() and request.user.is_customer():
return super().dispatch(request, *args, **kwargs) # return super().dispatch(request, *args, **kwargs)
else: # else:
raise PermissionDenied # raise PermissionDenied
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
# ctx['hide_user_type'] = False
user_form = CustomRegistrationForm()
ctx['user_form'] = user_form
return ctx
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({}, request.GET, kwargs)) context = self.get_context_data(**_.merge({}, request.GET, kwargs))
@ -518,13 +528,20 @@ class CustomerProjectCreateView(BaseMixin, View):
realty = form.cleaned_data.get('realty') realty = form.cleaned_data.get('realty')
if realty: if realty:
print("Has Realty")
realty_form = self.realty_form(request.POST, instance=realty, request=request, prefix='realty_form') realty_form = self.realty_form(request.POST, instance=realty, request=request, prefix='realty_form')
else: else:
print("Create new Realty")
realty_form = self.realty_form(request.POST, request=request, prefix='realty_form') realty_form = self.realty_form(request.POST, request=request, prefix='realty_form')
if form.is_valid() and realty_form.is_valid(): if form.is_valid() and realty_form.is_valid():
project = form.save(commit=False) project = form.save(commit=False)
project.customer = request.user unregister_user = request.POST.get('not_auth_user_id')
if unregister_user:
user = get_object_or_404(User, pk=unregister_user)
else:
user = request.user
project.customer = user
project.save() project.save()
form.save_m2m() form.save_m2m()
@ -533,14 +550,13 @@ class CustomerProjectCreateView(BaseMixin, View):
for file in request.FILES.getlist('new_files'): for file in request.FILES.getlist('new_files'):
ProjectFile.objects.create(file=file, project=project) ProjectFile.objects.create(file=file, project=project)
if realty: if not realty:
realty_form.save()
else:
realty = realty_form.save(commit=False) realty = realty_form.save(commit=False)
realty.user = request.user realty.user = user
print('new_realty_name = ', request.POST.get('new_realty_name'))
if not request.POST.get('new_realty_name'): if not request.POST.get('new_realty_name'):
print("Virtual!")
realty.is_virtual = True realty.is_virtual = True
print("Set realty name -->", request.POST.get('new_realty_name'))
realty.name = request.POST.get('new_realty_name') realty.name = request.POST.get('new_realty_name')
realty.save() realty.save()
realty_form.save_m2m() realty_form.save_m2m()
@ -566,6 +582,10 @@ class CustomerProjectCreateView(BaseMixin, View):
context = self.get_context_data(**kwargs) context = self.get_context_data(**kwargs)
context.update({'form': form, 'realty_form': realty_form}) context.update({'form': form, 'realty_form': realty_form})
unregister_user = request.POST.get('not_auth_user_id')
if unregister_user:
context.update({'unregister_user': unregister_user})
return render(request, self.template_name, context) return render(request, self.template_name, context)
@ -832,6 +852,7 @@ class CustomerOfferOrderView(View):
template_name = 'chattest.html' template_name = 'chattest.html'
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
# @ Утверждение Исполнителя
project_id = kwargs.get('project_id') project_id = kwargs.get('project_id')
answer_id = kwargs.get('answer_id') answer_id = kwargs.get('answer_id')
try: try:
@ -848,12 +869,14 @@ class CustomerOfferOrderView(View):
if not order.contractor and not order.team: if not order.contractor and not order.team:
if isinstance(answer.author, User): if isinstance(answer.author, User):
order.contractor = answer.author order.contractor = answer.author
order.save() # order.status = 'process'
status = True # order.save()
# status = True
elif isinstance(answer.author, Team): elif isinstance(answer.author, Team):
order.team = answer.author order.team = answer.author
order.save() order.status = 'process'
status = True order.save()
status = True
if status: if status:
hs_rating = HistoryRating() hs_rating = HistoryRating()
hs_rating.user = request.user hs_rating.user = request.user

@ -23,6 +23,7 @@ def add_rating_review(sender, instance, created, **kwargs):
hs_rating.save() hs_rating.save()
count_reviews = Review.objects.filter(project=instance.project).count() count_reviews = Review.objects.filter(project=instance.project).count()
print("count_reviews = ", count_reviews)
if count_reviews == 2: if count_reviews == 2:
order = instance.project.order order = instance.project.order
order.status = 'completed' order.status = 'completed'

@ -1,100 +1,150 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %}
{% load sass_tags %}
{% load thumbnail %}
{% block old_css %}{% endblock %}
{% block head_css %}
<link rel='stylesheet' href='{% static "js/magnific-popup.css" %}'>
<link rel='stylesheet' href='{% sass_src "sass/main.sass" %}'>
<link rel='stylesheet' href='{% sass_src "partials/sass/home.sass" %}'>
{% endblock %}
{% block content %} {% block content %}
<section class="mainContainer"> {% include 'partials/header.html' %}
{% include 'partials/header.html' %} <div class="home">
<div class="container">
<div class="container-fluid"> <div class="row">
<div class="row"> <div class="col-lg-12">
<p class="welcomeMain">{{ main_settings.heading }}</p> <p class="welcomeMain">{{ main_settings.heading }}</p>
</div> </div>
</div> </div>
<div class="container-fluid"> <div class="row mod-row-eq-height">
<div class="row"> <div class="col-lg-5 col-lg-offset-1 mod-no-padding">
<div class="col-lg-6"> <div class="infoBlock customer">
<div class="changeBlock changeBlock2">
{% if request.user.is_authenticated and request.user.is_customer %} {% if request.user.is_authenticated and request.user.is_customer %}
<a href="{% url 'users:customer-profile-open-projects' pk=request.user.pk %}">Я заказчик</a> <a class="to-profile"
href="{% url 'users:customer-profile-open-projects' pk=request.user.pk %}">Я заказчик</a>
{% else %} {% else %}
<a href="{% url 'registration_register' %}?type=customer">Я заказчик</a> <a class="to-profile" href="{% url 'registration_register' %}?type=customer">Я заказчик</a>
{% endif %} {% endif %}
<p> <p>
{{ main_settings.customer_text|safe }} <ul class="customer-list">
<li>
<div class="icon-1"></div>
<div class="text">
Ресурс для специалистов по проектированию, дизайну, оформлению и сопровождению
проектной документации
</div>
</li>
<li>
<div class="icon-2"></div>
<div class="text">
Удобный и быстрый поиск исполнителей
</div>
</li>
<li>
<div class="icon-3"></div>
<div class="text">
Готовые сформированные группы исполнителей
</div>
</li>
<li>
<div class="icon-4"></div>
<div class="text">
Безопасная сделка (договор без риска)
</div>
</li>
<li>
<div class="icon-5"></div>
<div class="text">
Адекватная оценка стоимости работы
</div>
</li>
<li>
<div class="icon-6"></div>
<div class="text">
Возможность купить готовые проекты, работы
</div>
</li>
</ul>
</p> </p>
</div> <a class="create" href="{% url 'projects:customer-project-create' %}">Разместить заказ</a>
<div class="square"> </div>
<div class="insetSquare"></div> </div>
</div> <div class="col-lg-5 mod-no-padding">
</div> <div class="infoBlock contractor">
<div class="col-lg-6">
<div class="changeBlock changeBlock1">
{% if request.user.is_authenticated and request.user.is_contractor %} {% if request.user.is_authenticated and request.user.is_contractor %}
<a href="{% url 'users:contractor-profile' pk=request.user.pk %}">Я исполнитель</a> <a class="to-profile" href="{% url 'users:contractor-profile' pk=request.user.pk %}">Я
исполнитель</a>
{% else %} {% else %}
<a href="{% url 'registration_register' %}?type=contractor">Я исполнитель</a> <a class="to-profile" href="{% url 'registration_register' %}?type=contractor">Я
исполнитель</a>
{% endif %} {% endif %}
<p> <p>
{{ main_settings.contractor_text|safe }} <ul class="contractor-list">
<li>
<div class="icon-7"></div>
<div class="text">
Большой выбор заказов для исполнителей
</div>
</li>
<li>
<div class="icon-8"></div>
<div class="text">
Удобный и быстрый поиск заказчиков
</div>
</li>
<li>
<div class="icon-9"></div>
<div class="text">
Безопасная сделка (договор без риска)
</div>
</li>
<li>
<div class="icon-10"></div>
<div class="text">
Печать, брошюровка и доставка проектной документации
</div>
</li>
<li>
<div class="icon-11"></div>
<div class="text">
Возможность продать готовые проекты, работы
</div>
</li>
<li>
<div class="icon-12"></div>
<div class="text">
Платформа разработана для проектировщиков дизайнеров и технических заказчиков
</div>
</li>
</ul>
</p> </p>
</div> <a class="create" href="{% url 'work_sell:create' %}">Разместить проект</a>
</div>
</div> </div>
</div>
</div> <div class="row">
</div> <div class="col-lg-12">
<a class="popup-youtube youtube" href="{{ main_settings.video_code }}">
<div class="container-fluid"> </a>
<div class="row"> </div>
<a class="popup-youtube" href="{{ main_settings.video_code }}"> </div>
<div class="youtube"></div> </div>
</a> </div>
<div style="background-color: #F7F7F7;">
{# <!-- Modal HTML -->#} <div class="container">
{# <div id="myModal" class="modal fade">#} {% include 'partials/footer.html' %}
{# <div class="modal-dialog">#} </div>
{# <div class="modal-content">#} </div>
{# <div class="modal-header">#}
{# <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>#}
{# <h4 class="modal-title">Видео</h4>#}
{# </div>#}
{# <div class="modal-body">#}
{# <div id="modal-body-video">#}
{# {{ main_settings.video_code | safe }}#}
{# </div>#}
{# </div>#}
{# </div>#}
{# </div>#}
{# </div>#}
</div>
</div>
</section>
{% endblock %} {% endblock %}
{% block old_js %}
<script src='{% static "js/bootstrap.min.js" %}'></script>
{% endblock %}
{% block js_block %} {% block js_block %}
<script> {{ block.super }}
$(document).ready(function() { <script src='{% static "js/jquery.magnific-popup.js" %}'></script>
$('.popup-youtube').magnificPopup({ <script src='{% static "js/build/home_page.js" %}'></script>
disableOn: 700,
type: 'iframe',
mainClass: 'mfp-fade',
removalDelay: 160,
preloader: false,
fixedContentPos: false
});
});
{# $(document).ready(function(){#}
{# var modalBodyVideo = $("#modal-body-video").clone(true);#}
{# #}
{# $("#myModal").on('hide.bs.modal', function(){#}
{# $("#modal-body-video").remove();#}
{# });#}
{# #}
{# $("#myModal").on('show.bs.modal', function(){#}
{# $("#modal-body-video").remove();#}
{# modalBodyVideo.appendTo('.modal-body');#}
{# });#}
{# });#}
</script>
{% endblock %} {% endblock %}

@ -1,4 +1,5 @@
<!doctype html>{% load staticfiles %} <!doctype html>
{% load staticfiles %}
{#{% load compress %}#} {#{% load compress %}#}
<html lang="ru"> <html lang="ru">
<head> <head>
@ -14,7 +15,6 @@
{# {% compress css %}#} {# {% compress css %}#}
{% block old_css %} {% block old_css %}
<link rel='stylesheet' href='{% static "css/reset.css" %}'> <link rel='stylesheet' href='{% static "css/reset.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery-ui/jquery-ui.css" %}'>
<link rel='stylesheet' href='{% static "css/bootstrap.css" %}'> <link rel='stylesheet' href='{% static "css/bootstrap.css" %}'>
<link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'> <link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'>
<link rel='stylesheet' href='{% static "lib/bootstrap-select/css/bootstrap-select.css" %}'> <link rel='stylesheet' href='{% static "lib/bootstrap-select/css/bootstrap-select.css" %}'>
@ -22,13 +22,14 @@
<link rel='stylesheet' href='{% static "css/swiper.min.css" %}'> <link rel='stylesheet' href='{% static "css/swiper.min.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery.fileupload/css/jquery.fileupload.css" %}'> <link rel='stylesheet' href='{% static "lib/jquery.fileupload/css/jquery.fileupload.css" %}'>
<link rel='stylesheet' href='{% static "js/magnific-popup.css" %}'> <link rel='stylesheet' href='{% static "js/magnific-popup.css" %}'>
<link rel="stylesheet" href='{% static "lib/jquery-jgrowl/jquery.jgrowl.min.css" %}'>
<link rel='stylesheet' href='{% static "css/main.css" %}'> <link rel='stylesheet' href='{% static "css/main.css" %}'>
<link rel='stylesheet' href='{% static "css/extra.css" %}'> <!-- Our additional CSS --> <link rel='stylesheet' href='{% static "css/extra.css" %}'> <!-- Our additional CSS -->
{% endblock %} {% endblock %}
{% block common_css %} {% block common_css %}
<link rel='stylesheet' href='{% static "css/bootstrap.css" %}'> <link rel='stylesheet' href='{% static "css/bootstrap.css" %}'>
<link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'> <link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'>
<link rel="stylesheet" href='{% static "lib/jquery-jgrowl/jquery.jgrowl.min.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery-ui/jquery-ui.css" %}'>
{% endblock %} {% endblock %}
{% block head_css %} {% block head_css %}
@ -76,7 +77,7 @@
{% block common_js %} {% block common_js %}
<script src='{% static "js/jquery-2.2.3.min.js" %}'></script> <script src='{% static "js/jquery-2.2.3.min.js" %}'></script>
{# <script src='{% static "js/bootstrap.min.js" %}'></script>#} {# <script src='{% static "js/bootstrap.min.js" %}'></script>#}
{% endblock %} {% endblock %}
{#{% compress js %}#} {#{% compress js %}#}
{% block old_js %} {% block old_js %}
@ -98,14 +99,37 @@
<script src='{% static "js/jquery.magnific-popup.min.js" %}'></script> <script src='{% static "js/jquery.magnific-popup.min.js" %}'></script>
<script src='{% static "lib/jquery.cookie/jquery.cookie.min.js" %}'></script> <script src='{% static "lib/jquery.cookie/jquery.cookie.min.js" %}'></script>
<script src='{% static "lib/jquery-jgrowl/jquery.jgrowl.min.js" %}'></script>
<script src='{% static "my-libs.js" %}'></script> <script src='{% static "my-libs.js" %}'></script>
<script src='{% static "js/main.js" %}'></script> <!-- Файл верстальщика --> <script src='{% static "js/main.js" %}'></script> <!-- Файл верстальщика -->
<script src='{% static "index.js" %}'></script> <!-- Файл программистов --> <script src='{% static "index.js" %}'></script> <!-- Файл программистов -->
{% endblock %}
{% block ws_block %}
<script src='{% static "lib/jquery-jgrowl/jquery.jgrowl.min.js" %}'></script>
<script> <script>
function getOpenOrdersList() {
$.ajax({
url: '/api/orders?status=created',
type: 'get',
success: function (data) {
$.each(data.results, function (key, value) {
open_order_list.push(parseInt(value.id))
})
}
})
}
function message_count_plus(selector) {
var all_messages = $(selector);
var count = parseInt(all_messages.html()) + 1;
if (count > 99) count = '99+';
all_messages.html(count);
}
var SocketHandlerMain = function (userId) { var SocketHandlerMain = function (userId) {
var domain = '{{ request.META.HTTP_HOST }}'; var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}'; var port = '{{ request.META.SERVER_PORT }}';
@ -130,12 +154,18 @@
sock.onmessage = function (event) { sock.onmessage = function (event) {
var notificationData = JSON.parse(event.data); var notificationData = JSON.parse(event.data);
if (open_order_list.indexOf(parseInt(notificationData.order_id)) != -1) {
{# console.log("in");#}
message_count_plus('#my_office');
}
message_count_plus('.js-all-messages');
var outMessage = ""; var outMessage = "";
if (notificationData.answer_type == 'add_message_contact') { if (notificationData.answer_type == 'add_message_contact') {
outMessage += "<a href='/chat/?user_id=" + notificationData.sender_id + "'>" + notificationData.msg + "<a>"; outMessage += "<a href='/chat/?user_id=" + notificationData.sender_id + "'>" + notificationData.msg + "<a>";
} else if ((notificationData.answer_type == 'approve_stages') || (notificationData.answer_type == 'add_message_order')) { } else if ((notificationData.answer_type == 'approve_stages') || (notificationData.answer_type == 'add_message_order')) {
outMessage += "<a href='/chat/#order" + notificationData.order_id + "'>" + notificationData.msg + "<a>"; outMessage += "<a href='/chat/#order" + notificationData.order_id + "'>" + notificationData.msg + "<a>";
} }
console.log("Вам пришло новое сообщение!<br />" + outMessage);
$.jGrowl("Вам пришло новое сообщение!<br />" + outMessage, {life: 15000}); $.jGrowl("Вам пришло новое сообщение!<br />" + outMessage, {life: 15000});
}; };
this.add_message = function (messageData) { this.add_message = function (messageData) {
@ -147,6 +177,8 @@
var userId = '{{ request.user.pk }}'; var userId = '{{ request.user.pk }}';
if (userId) { if (userId) {
var socketMain = new SocketHandlerMain(userId); var socketMain = new SocketHandlerMain(userId);
var open_order_list = [];
getOpenOrdersList();
} }
</script> </script>
{% endblock %} {% endblock %}

@ -3,161 +3,183 @@
{% load user_tags %} {% load user_tags %}
{% load activeurl %} {% load activeurl %}
{% load sass_tags %} {% load sass_tags %}
{% load common_tags %}
{% if request.user.is_contractor %} {% if request.user.is_contractor %}
{% url 'users:contractor-profile' pk=request.user.pk as profile_url %} {% url 'users:contractor-profile' pk=request.user.pk as profile_url %}
{% elif request.user.is_customer %} {% elif request.user.is_customer %}
{% url 'users:customer-profile-open-projects' pk=request.user.pk as profile_url %} {% url 'users:customer-profile-open-projects' pk=request.user.pk as profile_url %}
{% endif %} {% endif %}
<link rel='stylesheet' href='{% sass_src "partials/sass/header.sass" %}'> <link rel='stylesheet' href='{% sass_src "partials/sass/header.sass" %}'>
<header>
<div class="wrTop {% if request.user.is_authenticated %} disTab {% endif %}"> <div class="container">
<div class="container-fluid topMain">
<div class="row"> <div class="row">
<div class="col-lg-3"> <div class="logo">
<a href="/"><div class="logo"></div></a> <a href="/">
<img src="{% static 'img/logo.png' %}">
</a>
</div> </div>
<div class="user-nav">
<ul class="user-items">
{% if request.user.is_contractor %}
<li>
<div class="user-info">
<a href="{% url 'wallets:score-detail' pk=request.user.pk %}"
class="cash">{{ user_balance|floatformat:2 }}р</a>
<a href="{% url 'chat:chat-user' %}#order{{ fist_order_id }}"
class="icon_hand">{{ num_orders_in_work }}</a>
<a href="{% url 'chat:chat-user' %}" class="icon_chat js-all-messages">
{{ new_messages_count| max_count:99 }}
</a>
</div>
</li>
{% endif %}
<li>
<div class="imgProfile">
{% if request.user.is_contractor %}
<a href="{{ profile_url }}">
{% if request.user.avatar %}
{% thumbnail request.user.avatar "75x75" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="profile-image">
{% endif %}
</a>
{% elif request.user.is_customer %}
<a href="{{ profile_url }}">
{% if request.user.avatar %}
{% thumbnail request.user.avatar "75x75" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="profile-image">
{% endif %}
</a>
{% endif %}
</div> <!-- //imgProfile -->
</li>
{% if request.user.is_authenticated %}
<li>
<div class="infoProfile disTab">
<div class="btn-group" role="group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-menu-hamburger" aria-hidden="true"></span>
</button>
<ul class="dropdown-menu menu-drop-new">
{% if request.user.is_contractor %}
<li class="icon_mm1">
<a href="{% url 'auth_login' %}">
Войти заказчиком
<span></span>
</a>
</li>
{% else %}
<li class="icon_mm2">
<a href="{% url 'auth_login' %}">
Войти исполнителем
<span></span>
</a>
</li>
{% endif %}
<li class="icon_mm8">
<a href="{{ profile_url }}">
Профиль<span></span>
</a>
</li>
<li class="icon_chat">
<a href="{% url 'chat:chat-user' %}">Сообщения<span></span></a>
{% if request.user %}
<div class="circle js-all-messages">{{ new_messages_count| max_count:99 }}</div>
{# {% count_new_message request.user %}#}
{% endif %}
</li>
<li class="icon_mm4">
<a href="{% url 'wallets:score-detail' pk=request.user.pk %}">Счет<span></span></a>
</li>
<li class="icon_mm5">
<a href="{% url 'users:user-profile-edit' pk=request.user.pk %}">Настройки<span></span></a>
</li>
<li class="icon_mm6">
<a href="/pages/faq">FAQ<span></span></a>
</li>
{% if request.user.is_contractor %}
<li class="icon_mm2">
<a href="{% url 'auth_logout' %}">Выйти<span></span></a>
</li>
{% else %}
<li class="icon_mm7">
<a href="{% url 'auth_logout' %}">Выйти<span></span></a>
</li>
{% endif %}
</ul>
</div>
</div>
</li>
<li>
{% if request.user.is_contractor %}
{% contractor_indicator request.user %}
{% endif %}
{% if request.user.is_contractor %}
{% endif %}
{% else %}
<a href="{% url 'registration_register' %}" class="reg">Регистрация</a>
<a href="{% url 'auth_login' %}">
<div class="lock"></div>
</a>
{% endif %}
</li>
</ul>
</div> <!--// user-nav -->
{% activeurl %} {% activeurl %}
{% if request.user.is_authenticated %} <div class="menu-nav">
<div class="col-lg-7"> <ul class="menu-items">
<ul class="mainMenu"> {% if request.user.is_authenticated %}
<li class="icon_tm1"> <li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Поиск заказов</a> <a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
<span></span>
</li> </li>
{% if request.user.is_contractor %} {% if request.user.is_contractor %}
<li class="officeList icon_tml"> <li class="icon_tml">
<a href="{% url 'users:contractor-office' %}"> <a href="{% url 'users:contractor-office' %}">
Мой офис {% count_new_message_orders request.user %} Мой офис {% count_new_message_orders request.user %}
</a> </a>
<span></span> </li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a>
</li> </li>
{% endif %} {% endif %}
{% if request.user.is_customer %} {% if request.user.is_customer %}
<li class="icon_tm2"> <li class="icon_tm2">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a> <a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
<span></span>
</li> </li>
<li class="icon_tm3"> <li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Работы на продажу</a> <a href="{% url 'work_sell:list' %}">Готовые проекты</a>
<span></span>
</li> </li>
{% endif %} {% endif %}
</ul> {% else %}
</div>
{% else %}
<div class="col-lg-7">
<ul class="mainMenu">
<li class="icon_tm1"> <li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Поиск заказов</a> <a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
<span></span>
</li> </li>
<li class="icon_tm2"> <li class="icon_tm2">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a> <a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
<span></span>
</li> </li>
<li class="icon_tm3"> <li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Работы на продажу</a> <a href="{% url 'work_sell:list' %}">Готовые проекты</a>
<span></span>
</li> </li>
</ul>
</div>
{% endif %}
{% endactiveurl %}
{% if request.user.is_authenticated %}
<div class="col-lg-2">
{% if request.user.is_contractor %}
{% contractor_indicator request.user %}
{% endif %}
<div class="infoProfile disTab">
<div class="btn-group" role="group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-menu-hamburger" aria-hidden="true"></span>
</button>
<ul class="dropdown-menu menu-drop-new">
{% if request.user.is_contractor %}
<li class="icon_mm1">
<a href="{% url 'auth_login' %}">
Войти заказчиком
<span></span>
</a>
</li>
{% else %}
<li class="icon_mm2">
<a href="{% url 'auth_login' %}">
Войти исполнителем
<span></span>
</a>
</li>
{% endif %}
<li class="icon_mm8">
<a href="{{ profile_url }}">
Профиль<span></span>
</a>
</li>
<li class="icon_mm3">
<a href="{% url 'chat:chat-user' %}">Сообщения<span></span>
{% if request.user %}
{% count_new_message request.user %}
{% endif %}</a>
</li>
<li class="icon_mm4">
<a href="{% url 'wallets:score-detail' pk=request.user.pk %}">Счет<span></span></a>
</li>
<li class="icon_mm5">
<a href="{% url 'users:user-profile-edit' pk=request.user.pk %}">Настройки<span></span></a>
</li>
<li class="icon_mm6">
<a href="/pages/faq">FAQ<span></span></a>
</li>
<li class="icon_mm7">
<a href="{% url 'auth_logout' %}">Выйти<span></span></a>
</li>
</ul>
</div>
</div>
<div class="imgProfile">
{% if request.user.is_contractor %}
<a href="{{ profile_url }}">
{% if request.user.avatar %}
{% thumbnail request.user.avatar "75x75" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="profile-image">
{% endif %}
</a>
{% elif request.user.is_customer %}
<a href="{{ profile_url }}">
{% if request.user.avatar %}
{% thumbnail request.user.avatar "75x75" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="profile-image">
{% endif %}
</a>
{% endif %} {% endif %}
</div> </ul>
</div> </div>
{% else %} {% endactiveurl %}
<div class="col-lg-2">
<a href="{% url 'registration_register' %}" class="reg">Регистрация</a>
<a href="{% url 'auth_login' %}"><div class="lock"></div></a>
</div>
{% endif %}
</div> </div>
</div> </div>
</div> </header>

@ -0,0 +1,3 @@
{{ form.captcha }}
{{ user_form.captcha }}
{{ form.captcha.errors }}

@ -0,0 +1,61 @@
{% load sass_tags %}
<link rel='stylesheet' href='{% sass_src "partials/sass/registration.sass" %}'>
<script type="text/javascript" src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>
<div class="form-regestration">
<form method="post" id="form-registration">{% csrf_token %}
{{ form.non_field_errors }}
{% if not hide_user_type %}
<div class="col-lg-12 select-reg polsF1">
{{ form.user_type }}
{{ form.user_type.errors }}
</div>
{% endif %}
<div class="col-lg-12 select-reg">
<input type="text" name="username" value="{{ form.username.value }}"
class="box-sizing email-reg"
placeholder="Nickname">
{{ form.username.errors }}
</div>
<div class="col-lg-12 select-reg ">
<input type="text" name="email" class="box-sizing email-reg"
value="{{ form.email.value }}" placeholder="Электронная почта">
{{ form.email.errors }}
</div>
<div class="col-lg-12 select-reg">
<input type="password" name="password1" class="box-sizing pass-reg"
placeholder="Пароль">
{{ form.password1.errors }}
</div>
<div class="col-lg-12 select-reg">
<input type="password" name="password2" class="box-sizing pass-reg"
placeholder="Пароль">
{{ form.password2.errors }}
</div>
<div class="col-lg-12 select-reg captcha">
{% include 'partials/inc-captcha.html' %}
</div>
<div class="col-lg-12 select-reg">
<button class="reg-sub">Зарегистрироваться</button>
</div>
<div class="clearfix"></div>
{% include 'registration/social.html' %}
<div class="col-lg-12 select-reg">
<div class="check-reg">
<label><input type="checkbox" name="tos" {{ form.tos.value }} /><span></span></label>
<p>Регистрируясь, я подтверждаю свое согласие у условиями <a href="#">пользовательского соглашения</a>
</p>
{{ form.tos.errors }}
</div>
</div>
</form>
<div class="col-lg-12 select-reg">
<a href="{% url 'auth_login' %}" class="have-ac">Я уже зарегистрирован на ресурсе</a>
</div>
</div>

@ -0,0 +1,19 @@
<div class="modal fade" id="registrationFormModal" tabindex="-2">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"><span>&times;</span></button>
<h4 class="modal-title">Регистрация</h4>
</div>
<div class="modal-body">
{% include 'partials/inc-registration_form.html' %}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Отмена</button>
{# <button type="button" class="btn btn-primary -action-button">Предложить</button>#}
</div>
</div>
</div>
</div>

@ -7,6 +7,9 @@ footer
width: 300px width: 300px
height: 3px height: 3px
background-color: black background-color: black
ul
margin: 0
padding: 0
.logoF .logoF
@ -88,4 +91,7 @@ footer
&:link, &:visited &:link, &:visited
font-family: 'Arial-MT-Regular', sans-serif font-family: 'Arial-MT-Regular', sans-serif
color: #6c6c6c color: #6c6c6c
font-size: 15px font-size: 15px
&:hover
text-decoration: none
color: #383838

@ -1,393 +1,340 @@
$static: '/static' @import "base/variavles"
.wrTop
width: 100%
background-color: black
.topMain
width: 1200px
margin: 0 auto
.col-lg-7
width: 55%
.col-lg-2
width: 19%
.mainMenu li
padding-right: 25px
a
font-size: 15px
.welcomeMain %icons
width: 100% content: ''
float: left display: inline-block
font-size: 48px vertical-align: middle
text-align: center margin-right: 5px
padding: 54px 0 39px 0
font-family: 'pfbeausanspro-thin', sans-serif
.welcomeMain
line-height: 48px
font-family: 'pfdintextcomppro-regular', sans-serif
font-size: 43px
.logo
width: 183px
height: 36px
background: url('#{$static}/img/logo.png') no-repeat center
background-size: cover background-size: cover
float: left
margin: 18px 0 21px 10px
cursor: pointer
.mainMenu header
float: left font-size: 11pt
margin: 26px 0 0 0 ul
li padding-left: 0
margin: 0
background-color: #000
color: #FFF
.logo
float: left float: left
position: relative height: 75px
padding-right: 30px display: flex
list-style: none align-items: center
a
text-decoration: none
border-bottom: 3px solid transparent
-webkit-transition: all 0.4s ease-out
-moz-transition: all 0.4s ease-out
transition: all 0.4s ease-out
&:hover a
border-color: #ff0029
span
content: ''
position: absolute
height: 23px
left: 0
top: -1px
.icon_tm1 span
width: 26px
//background: url('../img/listMain.png') no-repeat left
background-size: cover
background: url('#{$static}/img/listMain.png') no-repeat 0 0
.icon_tm2 span
width: 22px
background-size: cover
background: url('#{$static}/img/listMain.png') no-repeat -26px 0
.icon_tm3 span
width: 24px
background-size: cover
background: url('#{$static}/img/listMain.png') no-repeat -48px 0
.icon_tml span
content: ''
position: absolute
width: 27px
height: 24px
//left: -35px
top: 0
background: url('#{$static}/img/list4.png') no-repeat center !important
background-size: cover !important
.icon_tml:hover span
background: url('#{$static}/img/list4tml.png') no-repeat center !important
background-size: cover !important
.icon_tm1:hover span
width: 26px
background: url('#{$static}/img/listMain2.png') no-repeat left !important
background-size: cover
background-position: 0 0 !important
.icon_tm2:hover span
width: 22px
background: url('#{$static}/img/listMain2.png') no-repeat left !important
background-size: cover
background-position: -26px 0 !important
.icon_tm3:hover span
width: 26px !important
background: url('#{$static}/img/listMain2.png') no-repeat left !important
background-size: cover
background-position: -49px 0 !important
.rating
width: 46px
height: 46px
float: right
border-radius: 100%
background-color: #4D4D4D
margin: 15px 0 0 10px
position: relative
.ratingInset
width: 46px
height: 46px
border-radius: 100%
background-color: #FF0027
position: absolute
/*left:-1.859px;*/
/*bottom: 3px;*/
clip: rect(0, 22px, 50px, 0)
transform: rotate(-90deg)
.iconRating
width: 100%
height: 100%
position: absolute
left: 0
top: 0
background: url('#{$static}/img/button12.png') no-repeat center
.ratingPer
color: #ff2c2c
font-size: 18px
font-family: 'pfdintextcomppro-regular', sans-serif
float: right
margin: 28px 0 0 9px
cursor: pointer
.mainMenu li
&:last-child
padding-right: 0
a
color: white
font-size: 18px
padding: 30px 0 27px 40px
font-family: 'pfbeausanspro-reg', sans-serif
&.active > a
border-color: #ff0029
&.icon_tm1.active span
background: url('#{$static}/img/listMain2.png') no-repeat !important
&.officeList.active span
background: url('#{$static}/img/list4tml.png') no-repeat center !important
&.icon_tm2.active span
background: url('#{$static}/img/listMain2.png') no-repeat center !important
&.icon_tm3.active span
background: url('#{$static}/img/listMain2.png') no-repeat right !important
li.officeList.icon_tml > a > p
display: inline-block
padding: 5px 7px 3px 7px
background: #ff0000
border-radius: 35px
position: absolute
right: -34px
top: -4px
.changeBlock
width: 485px
overflow: hidden
padding: 113px 0 0 0
position: relative
&a
border: none
cursor: pointer
height: 40px
border-radius: 40px
font-size: 20px
text-transform: uppercase
font-family: 'pfdintextcomppro-regular', sans-serif
letter-spacing: 4px
position: relative
top: -60px
display: table
margin: auto
.changeBlock1
float: left
margin-left: -15px
background-color: rgba(255, 0, 6, 0.7)
&a
&:link,
&:visited
background: url('#{$static}/img/button1.png') no-repeat 25px, black
color: white
padding: 24px 26px 20px 72px
.changeBlock2 .menu-nav
float: right display: flex
margin-right: -15px justify-content: center
background-color: rgba(0, 0, 0, 0.7) //align-items: center
&a height: 75px
&:link, a, a:hover
&:visited color: #FFF
background: url('#{$static}/img/button2.png') no-repeat 27px, white text-decoration: none
color: black padding-left: 4px
padding: 24px 26px 20px 72px .menu-items
display: inline-flex
.changeBlock .count
p display: inline-block
font-family: 'Arial-MT-Regular', sans-serif color: red
font-family: 'pfbeausanspro-reg', sans-serif
background: none
border-radius: 0
position: inherit
padding-left: 5px
padding-bottom: 0
line-height: 1em
line-break: auto
li
list-style: none
a
display: flex
align-items: center
.changeBlock1 height: 75px
p margin-right: 20px
color: white cursor: pointer
border-bottom: 3px solid black
pointer-events: stroke
.icon_tm1 a:before
@extend %icons
width: 26px
height: 26px
background: url('#{$static}/img/listMain.png') no-repeat 0 0
.icon_tm2 a:before
@extend %icons
width: 22px
height: 22px
background: url('#{$static}/img/listMain.png') no-repeat -26px 0
.icon_tm3 a:before
@extend %icons
width: 24px
height: 24px
background: url('#{$static}/img/listMain.png') no-repeat -48px 0
.icon_tml a:before
@extend %icons
width: 27px
height: 24px
background: url('#{$static}/img/list4.png') no-repeat center
.changeBlock2 .icon_tml a:hover
p border-bottom: 3px solid red
color: black &:before
background: url('#{$static}/img/list4tml.png') no-repeat center
background-size: cover
.icon_tm1 a:hover
border-bottom: 3px solid red
&:before
background-size: cover
width: 26px
background: url('#{$static}/img/listMain2.png') no-repeat 0 0
.icon_tm2 a:hover
border-bottom: 3px solid red
&:before
width: 22px
background-size: cover
background: url('#{$static}/img/listMain2.png') no-repeat -26px 0
.changeBlock .icon_tm3 a:hover
min-height: 500px border-bottom: 3px solid red
display: table &:before
padding: 143px 20px 120px 20px background:
&:after image: url('#{$static}/img/listMain2.png')
content: '' repeat: no-repeat
position: absolute position: -50px 0
width: 66px background-size: cover
height: 1px .user-nav
left: 50% float: right
margin-left: -30px height: 75px
background-color: white .user-items
bottom: 60px display: flex
align-items: center
li
display: inline-block
.user-info
vertical-align: middle
padding-right: 5px
a
display: block
color: white
cursor: pointer
&:hover
text-decoration: none
color: #FF0029
.cash
text-align: right
padding-top: 4px
.icon_hand
padding-left: 26px
background:
image: url("#{$static}/img/icons/icon_hands.png")
size: 24px 24px
repeat: no-repeat
&:hover
background-image: url("#{$static}/img/icons/icon_hands_red.png")
.icon_chat
margin-top: 4px
padding-left: 26px
background:
image: url("#{$static}/img/icons/icon_speach-ball.png")
size: 18px 18px
repeat: no-repeat
&:hover
background-image: url("#{$static}/img/icons/icon_speach-ball_red.png")
.imgProfile
margin: 0 //глушим main.css
img
width: 75px
height: 75px
.reg, .reg:link, .reg:visited
color: #fb1818
font-size: 16px
text-transform: uppercase
float: left
line-height: 75px
font-family: 'pfdintextcomppro-regular', sans-serif
letter-spacing: 4px
text-decoration: none
.changeBlock2 .lock
float: right width: 75px
margin-right: -15px height: 75px
background-color: rgba(0, 0, 0, 0.7) background: url('#{$static}/img/lock.png') no-repeat center, white
float: right
cursor: pointer
margin-left: 20px
margin-right: 0
.rating
display: flex
align-items: center
position: relative
cursor: pointer
margin-left: 10px
.square .ratingInset
width: 46px width: 46px
height: 46px height: 46px
position: absolute border-radius: 100%
right: -23px background-color: #FF0027
top: 100px display: inline-block
z-index: 9 /* position: absolute; */
-webkit-transform: rotate(135deg) /* left: -1.859px; */
-moz-transform: rotate(135deg) /* bottom: 3px; */
transform: rotate(135deg) clip: rect(0, 22px, 50px, 0)
background-color: #DCDCDD transform: rotate(-90deg)
.insetSquare .iconRating
width: 100% width: 46px
height: 100% height: 46px
position: relative position: absolute
-webkit-transform: rotate(-135deg) left: 0
-moz-transform: rotate(-135deg) top: 0
transform: rotate(-135deg) background: url('#{$static}/img/button12.png') no-repeat center
background: url('#{$static}/img/arrow.png') no-repeat center
.imgProfile .ratingPer
width: 75px color: #ff2c2c
height: 75px font-size: 18px
float: right font-family: 'pfdintextcomppro-regular', sans-serif
margin: 0 0 0 -60px margin: 0
img padding-left: 8px
display: block
width: 100%
height: 100%
.infoProfile .infoProfile
float: right .btn-group
.btn-group .btn
.btn width: 75px
width: 75px height: 75px
height: 75px float: left
float: left border-radius: 0 !important
border-radius: 0 !important background-color: black
border: none
span
color: white
font-size: 26px
.dropdown-toggle
&:hover, &:active, &:focus
-webkit-box-shadow: inset 0 3px 5px rgba(255, 0, 39, 0.99)
-moz-box-shadow: inset 0 3px 5px rgba(255, 0, 39, 0.99)
box-shadow: inset 0 3px 5px rgba(255, 0, 39, 0.99)
background-color: rgb(255, 0, 39)
.dropdown-menu
border-radius: 0
background-color: black background-color: black
border: none left: -174px
span margin: -1px 100% 0 0
color: white float: left
font-size: 26px width: 250px
.dropdown-toggle height: auto
&:hover, &:active, &:focus padding: 30px 20px 15px 40px
-webkit-box-shadow: inset 0 3px 5px rgba(255, 0, 39, 0.99) border-top: 3px solid #ff2c2c
-moz-box-shadow: inset 0 3px 5px rgba(255, 0, 39, 0.99) li
box-shadow: inset 0 3px 5px rgba(255, 0, 39, 0.99) display: block
background-color: rgb(255, 0, 39) margin-bottom: 10px
.dropdown-menu &:last-child
border-radius: 0 margin-bottom: 0
background-color: black a
left: -174px
margin: -1px 100% 0 0
float: left
width: 250px
height: auto
padding: 30px 20px 15px 40px
border-top: 3px solid #ff2c2c
li
margin-bottom: 10px
&:last-child
margin-bottom: 0
a
color: white
font-size: 17px
font-family: 'pfbeausanspro-reg', sans-serif
position: relative
&:link, &:visited
color: white color: white
font-size: 17px font-size: 17px
font-family: 'pfbeausanspro-reg', sans-serif font-family: 'pfbeausanspro-reg', sans-serif
position: relative position: relative
&:hover, &:active &:link, &:visited
background-color: black !important color: white
color: #ff2c2c font-size: 17px
span font-family: 'pfbeausanspro-reg', sans-serif
content: '' position: relative
position: absolute &:hover, &:active
width: 20px background-color: black !important
left: -18px color: #ff2c2c
top: 4px span
.icon_mm1 a span content: ''
height: 20px position: absolute
background-size: cover width: 20px
background: url('#{$static}/img/menu.png') no-repeat 0 0 left: -18px
.icon_mm2 a span top: 4px
height: 22px .icon_mm1 a span
background-size: cover height: 20px
background: url('#{$static}/img/menu.png') no-repeat 0 -20px background-size: cover
.icon_mm3 a span background: url('#{$static}/img/menu.png') no-repeat 0 0
height: 13px .icon_mm2 a span
background-size: cover height: 22px
background: url('#{$static}/img/menu.png') no-repeat 0 -42px background-size: cover
top: 6px background: url('#{$static}/img/menu.png') no-repeat 0 -20px
.icon_mm4 a span .icon_mm3 a span
height: 20px height: 13px
background-size: cover background-size: cover
background: url('#{$static}/img/menu.png') no-repeat 0 -55px background: url('#{$static}/img/menu.png') no-repeat 0 -42px
.icon_mm5 a span top: 6px
height: 20px .icon_mm4 a span
background-size: cover height: 20px
background: url('#{$static}/img/menu.png') no-repeat 0 -75px background-size: cover
.icon_mm6 a span background: url('#{$static}/img/menu.png') no-repeat 0 -55px
height: 20px .icon_mm5 a span
background-size: cover height: 20px
background: url('#{$static}/img/menu.png') no-repeat 0 -95px background-size: cover
.icon_mm7 a span background: url('#{$static}/img/menu.png') no-repeat 0 -75px
height: 20px .icon_mm6 a span
background-size: cover height: 20px
background: url('#{$static}/img/menu.png') no-repeat 0 0 background-size: cover
.icon_mm8 a span background: url('#{$static}/img/menu.png') no-repeat 0 -95px
height: 20px .icon_mm7 a span
background-size: contain height: 20px
background: url('#{$static}/img/user-5.png') no-repeat 0 0 background-size: cover
.icon_mm1 a:hover span background: url('#{$static}/img/menu.png') no-repeat 0 0
height: 20px .icon_mm8 a span
background: url('#{$static}/img/menu2.png') no-repeat center !important height: 20px
background-size: cover !important background-size: contain
background-position: 0 0 !important background: url('#{$static}/img/user-5.png') no-repeat 0 0
.icon_mm2 a:hover span .icon_chat a span
height: 22px height: 20px
background-size: cover background:
background: url('#{$static}/img/menu2.png') no-repeat 0 -20px image: url("#{$static}/img/icons/icon_speach-ball.png")
.icon_mm3 a:hover span size: contain
height: 13px repeat: no-repeat
background-size: cover .icon_chat a
background: url('#{$static}/img/menu2.png') no-repeat 0 -42px display: inline-block
.icon_mm4 a:hover span .circle
height: 20px background-color: red
background-size: cover border-radius: 50%
background: url('#{$static}/img/menu2.png') no-repeat 0 -55px width: 30px
.icon_mm5 a:hover span height: 30px
height: 20px line-height: 30px
background-size: cover display: inline-block
background: url('#{$static}/img/menu2.png') no-repeat 0 -75px text-align: center
.icon_mm6 a:hover span
height: 20px .icon_mm1 a:hover span
background-size: cover height: 20px
background: url('#{$static}/img/menu2.png') no-repeat 0 -95px background: url('#{$static}/img/menu2.png') no-repeat center !important
.icon_mm7 a:hover span background-size: cover !important
height: 20px background-position: 0 0 !important
background-size: cover .icon_mm2 a:hover span
background: url('#{$static}/img/menu2.png') no-repeat 0 0 height: 22px
.icon_mm8 a:hover span background-size: cover
height: 20px background: url('#{$static}/img/menu2.png') no-repeat 0 -20px
background-size: contain .icon_mm3 a:hover span
background: url('#{$static}/img/user-4.png') no-repeat 0 0 height: 13px
background-size: cover
background: url('#{$static}/img/menu2.png') no-repeat 0 -42px
.icon_mm4 a:hover span
height: 20px
background-size: cover
background: url('#{$static}/img/menu2.png') no-repeat 0 -55px
.icon_mm5 a:hover span
height: 20px
background-size: cover
background: url('#{$static}/img/menu2.png') no-repeat 0 -75px
.icon_mm6 a:hover span
height: 20px
background-size: cover
background: url('#{$static}/img/menu2.png') no-repeat 0 -95px
.icon_mm7 a:hover span
height: 20px
background-size: cover
background: url('#{$static}/img/menu2.png') no-repeat 0 0
.icon_mm8 a:hover span
height: 20px
background-size: contain
background: url('#{$static}/img/user-4.png') no-repeat 0 0
.icon_chat a:hover span
height: 20px
background:
image: url("#{$static}/img/icons/icon_speach-ball_red.png")
size: contain
repeat: no-repeat

@ -0,0 +1,174 @@
@import "base/variavles"
@import "base/fonts"
.home
background:
image: url("#{$static}/img/main.png")
repeat: no-repeat
position: center
size: cover
.icons
display: inline-block
width: 24px
height: 24px
background:
image: url("#{$static}/img/sprite.png")
repeat: no-repeat
.welcomeMain
width: 100%
float: left
font-size: 48px
text-align: center
padding: 54px 0 39px 0
font-family: 'pfbeausanspro-thin', sans-serif
.welcomeMain
line-height: 48px
font-family: 'pfdintextcomppro-regular', sans-serif
font-size: 43px
.infoBlock
//padding: 113px 0 0 0
height: 100%
text-align: center
padding: 80px 0 40px
ul
&.customer-list,
&.contractor-list
text-align: left
padding-left: 60px
padding-right: 20px
li
display: flex
align-items: center
padding-top: 10px
list-style: none
font-size: 12px
.text
padding-left: 10px
display: inline-block
.icon
&-1
@extend .icons
width: 40px
background-position: 0 0
&-2
@extend .icons
background-position: 0 -24px
&-3
@extend .icons
background-position: 0 -48px
&-4
@extend .icons
background-position: 0 -72px
&-5
@extend .icons
background-position: 0 -96px
&-6
@extend .icons
background-position: 0 -120px
&-7
@extend .icons
background-position: 0 -144px
&-8
@extend .icons
background-position: 0 -168px
&-9
@extend .icons
background-position: 0 -192px
&-10
@extend .icons
background-position: 0 -216px
&-11
@extend .icons
background-position: 0 -240px
&-12
@extend .icons
background-position: 0 -264px
&.customer-list
li
color: #c7c5c5
&.contractor-list
li
color: #353434
a
text-decoration: none
border: none
cursor: pointer
& > a.to-profile
height: 40px
border-radius: 40px
font-size: 20px
text-transform: uppercase
font-family: 'pfdintextcomppro-regular', sans-serif
letter-spacing: 4px
position: relative
display: table
margin: 0 auto
a.create
font-family: Myriad, sans-serif
font-weight: normal
font-size: 20px
letter-spacing: 4px
display: inline-block
margin-top: 40px
text-transform: uppercase
&.customer
background-color: rgba(0, 0, 0, 0.7)
p, a.create
color: #c7c5c5
&:hover
color: #f3f1f1
& > a.to-profile
&:link, &:visited
background: url('#{$static}/img/button2.png') no-repeat 27px, white
color: black
padding: 24px 26px 20px 72px
&:hover
box-shadow: 0 0 15px rgba(255, 255, 255, 0.8)
-webkit-transform: scale(1.04)
-moz-transform: scale(1.04)
transform: scale(1.04)
&.contractor
background-color: rgba(255, 0, 6, 0.7)
p, a.create
color: #353434
&:hover
color: #141313
& > a.to-profile
&:link, &:visited
background: url('#{$static}/img/button1.png') no-repeat 25px, black
color: white
padding: 24px 26px 20px 72px
&:hover
box-shadow: 0 0 15px rgba(0, 0, 0, 0.8)
-webkit-transform: scale(1.04)
-moz-transform: scale(1.04)
transform: scale(1.04)
.youtube
display: block
border-radius: 50%
width: 80px
height: 80px
margin: 20px auto 40px
//border-radius: 100%
cursor: pointer
background:
image: url('#{$static}/img/youtube.png')
repeat: no-repeat
position: center
size: cover
&:hover
box-shadow: 0 0 15px rgba(255, 19, 19, 0.8)
-webkit-transform: scale(1.04)
-moz-transform: scale(1.04)
transform: scale(1.04)
&:focus
outline: none

@ -0,0 +1,119 @@
@import "base/variavles"
.form-regestration
display: table
width: 100%
float: left
margin: 0 0 80px 0
padding: 67px 0
//padding: 20px 0 67px 0
background-color: #ddd
text-align: center
a, a:hover
text-decoration: none
a:hover
color: #6f7bff
.select-reg
.btn-group
display: inline-block
vertical-align: top
&.captcha
text-align: center
.g-recaptcha
display: inline-table
margin: 25px 0 0 0
input[type="checkbox"] + span
position: absolute
left: 0
top: 0
width: 100%
height: 100%
background:
image: url('#{$static}/img/check.png')
repeat: no-repeat
position: 0 0
size: cover
cursor: pointer
label
width: 23px
height: 23px
display: block
position: relative
margin-right: 10px
input[type="checkbox"]:checked + span
background-position: 0 -23px
.email-reg, .pass-reg
width: 360px
height: 51px
display: inline-block
vertical-align: top
padding: 0 15px
font-size: 15px
background-color: white
color: black
margin: 20px 0 0 0
font-family: 'Arial-MT-Regular', sans-serif
border: none !important
.reg-sub
width: 360px
height: 51px
color: white
text-align: center
font-family: 'pfdintextcomppro-regular', sans-serif
letter-spacing: 2px
line-height: 51px
border: none
background-color: #42B476
border-radius: 40px
display: inline-block
vertical-align: top
margin-top: 20px
font-size: 15px
text-transform: uppercase
&:active, &:focus
outline: none !important
.check-reg
width: 360px
display: inline-block
vertical-align: top
margin-top: 20px
label
float: left
p
font-family: 'Arial-MT-Regular', sans-serif
color: #6c6c6c
font-size: 15px
float: left
/*margin: -2px 0 0 10px;
line-height: 18px
width: 90%
text-align: left
> a
color: #009DD9
&:link, &:visited
color: #009DD9
&:hover
color: #6f7bff
.have-ac, .have-ac:link, .have-ac:visited
color: #009DD9
font-size: 17px
font-family: 'Arial-MT-Regular', sans-serif
text-transform: uppercase
display: inline-block
.form-regestration
.errorlist
color: red
//width: 360px
//margin: 0 auto
//text-align: left
font-family: 'Arial-MT-Regular', sans-serif
font-size: 15px
li
list-style: none

@ -0,0 +1,186 @@
{% load staticfiles %}
{% load thumbnail %}
{% load user_tags %}
{% load activeurl %}
{% load sass_tags %}
{% load common_tags %}
{% if request.user.is_contractor %}
{% url 'users:contractor-profile' pk=request.user.pk as profile_url %}
{% elif request.user.is_customer %}
{% url 'users:customer-profile-open-projects' pk=request.user.pk as profile_url %}
{% endif %}
<link rel='stylesheet' href='{% sass_src "partials/sass/header.sass" %}'>
<div class="wrTop {% if request.user.is_authenticated %} disTab {% endif %}">
<div class="container-fluid topMain">
<div class="row">
<div style="float: left">
<a href="/">
<div class="logo"></div>
</a>
</div>
{% activeurl %}
<div style="height: 100%; display: inline-block; text-align: center">
{% if request.user.is_authenticated %}
<ul class="mainMenu">
<li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
<span></span>
</li>
{% if request.user.is_contractor %}
<li class="officeList icon_tml">
<a href="{% url 'users:contractor-office' %}">
Мой офис {% count_new_message_orders request.user %}
</a>
<span></span>
</li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a>
<span></span>
</li>
{% endif %}
{% if request.user.is_customer %}
<li class="icon_tm2">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
<span></span>
</li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a>
<span></span>
</li>
{% endif %}
</ul>
<div style="clear: both"></div>
{% else %}
<ul class="mainMenu">
<li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
<span></span>
</li>
<li class="icon_tm2">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
<span></span>
</li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a>
<span></span>
</li>
</ul>
{% endif %}
</div>
{% endactiveurl %}
<div style="float: right">
{% if request.user.is_authenticated %}
{% if request.user.is_contractor %}
{% contractor_indicator request.user %}
{% endif %}
<div class="infoProfile disTab">
<div class="btn-group" role="group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown"
aria-haspopup="true" aria-expanded="false">
<span class="glyphicon glyphicon-menu-hamburger" aria-hidden="true"></span>
</button>
<ul class="dropdown-menu menu-drop-new">
{% if request.user.is_contractor %}
<li class="icon_mm1">
<a href="{% url 'auth_login' %}">
Войти заказчиком
<span></span>
</a>
</li>
{% else %}
<li class="icon_mm2">
<a href="{% url 'auth_login' %}">
Войти исполнителем
<span></span>
</a>
</li>
{% endif %}
<li class="icon_mm8">
<a href="{{ profile_url }}">
Профиль<span></span>
</a>
</li>
<li class="icon_chat">
<a href="{% url 'chat:chat-user' %}">Сообщения<span></span></a>
{% if request.user %}
<div class="circle js-all-messages">{{ new_messages_count| max_count:99 }}</div>
{# {% count_new_message request.user %}#}
{% endif %}
</li>
<li class="icon_mm4">
<a href="{% url 'wallets:score-detail' pk=request.user.pk %}">Счет<span></span></a>
</li>
<li class="icon_mm5">
<a href="{% url 'users:user-profile-edit' pk=request.user.pk %}">Настройки<span></span></a>
</li>
<li class="icon_mm6">
<a href="/pages/faq">FAQ<span></span></a>
</li>
{% if request.user.is_contractor %}
<li class="icon_mm2">
<a href="{% url 'auth_logout' %}">Выйти<span></span></a>
</li>
{% else %}
<li class="icon_mm7">
<a href="{% url 'auth_logout' %}">Выйти<span></span></a>
</li>
{% endif %}
</ul>
</div>
</div>
<div class="imgProfile">
{% if request.user.is_contractor %}
<a href="{{ profile_url }}">
{% if request.user.avatar %}
{% thumbnail request.user.avatar "75x75" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="profile-image">
{% endif %}
</a>
{% elif request.user.is_customer %}
<a href="{{ profile_url }}">
{% if request.user.avatar %}
{% thumbnail request.user.avatar "75x75" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="profile-image">
{% endif %}
</a>
{% endif %}
</div>
{% if request.user.is_contractor %}
<div class="user-info">
<a href="{% url 'wallets:score-detail' pk=request.user.pk %}"
class="cash">{{ user_balance|floatformat:2 }}р</a>
<a href="{% url 'chat:chat-user' %}#order{{ fist_order_id }}"
class="icon_hand">{{ num_orders_in_work }}</a>
<a href="{% url 'chat:chat-user' %}" class="icon_chat js-all-messages">
{{ new_messages_count| max_count:99 }}
</a>
</div>
{% endif %}
{% else %}
<a href="{% url 'registration_register' %}" class="reg">Регистрация</a>
<a href="{% url 'auth_login' %}">
<div class="lock"></div>
</a>
{% endif %}
</div>
</div>
</div>
</div>

@ -0,0 +1,370 @@
@import "base/variavles"
.wrTop
width: 100%
background-color: black
.topMain
width: 1200px
margin: 0 auto
color: #ffffff
.dropdown-menu > li > a
display: inline-block
.col-lg-7
width: 55%
.col-lg-2
width: 19%
.mainMenu li
cursor: pointer
padding-right: 25px
a
font-size: 15px
//&:hover
cursor: pointer
.user-info
float: right
height: 100%
a
display: block
color: white
cursor: pointer
&:hover
text-decoration: none
color: #FF0029
.cash
text-align: right
padding-top: 4px
.icon_hand
padding-left: 26px
background:
image: url("#{$static}/img/icons/icon_hands.png")
size: 24px 24px
repeat: no-repeat
&:hover
background-image: url("#{$static}/img/icons/icon_hands_red.png")
.icon_chat
margin-top: 4px
padding-left: 26px
background:
image: url("#{$static}/img/icons/icon_speach-ball.png")
size: 18px 18px
repeat: no-repeat
&:hover
background-image: url("#{$static}/img/icons/icon_speach-ball_red.png")
.circle
background-color: red
border-radius: 50%
width: 30px
height: 30px
line-height: 30px
display: inline-block
text-align: center
//align-items: center
.logo
width: 183px
height: 36px
background: url('#{$static}/img/logo.png') no-repeat center
background-size: cover
float: left
margin: 18px 0 21px 10px
cursor: pointer
.mainMenu
float: left
margin: 26px 0 0 0
padding-left: 60px
li
float: left
position: relative
padding-right: 30px
list-style: none
a
text-decoration: none
border-bottom: 3px solid transparent
-webkit-transition: all 0.4s ease-out
-moz-transition: all 0.4s ease-out
transition: all 0.4s ease-out
&:hover a
border-color: #ff0029
span
content: ''
position: absolute
height: 23px
left: 0
top: -1px
.icon_tm1 span
width: 26px
//background: url('../img/listMain.png') no-repeat left
background-size: cover
background: url('#{$static}/img/listMain.png') no-repeat 0 0
.icon_tm2 span
width: 22px
background-size: cover
background: url('#{$static}/img/listMain.png') no-repeat -26px 0
.icon_tm3 span
width: 24px
background-size: cover
background: url('#{$static}/img/listMain.png') no-repeat -48px 0
.icon_tml span
content: ''
position: absolute
width: 27px
height: 24px
//left: -35px
top: 0
background: url('#{$static}/img/list4.png') no-repeat center !important
background-size: cover !important
.icon_tml:hover span
background: url('#{$static}/img/list4tml.png') no-repeat center !important
background-size: cover !important
.icon_tm1:hover span
width: 26px
background: url('#{$static}/img/listMain2.png') no-repeat left !important
background-size: cover
background-position: 0 0 !important
.icon_tm2:hover span
width: 22px
background: url('#{$static}/img/listMain2.png') no-repeat left !important
background-size: cover
background-position: -26px 0 !important
.icon_tm3:hover span
width: 26px !important
background: url('#{$static}/img/listMain2.png') no-repeat left !important
background-size: cover
background-position: -49px 0 !important
.rating
width: 46px
height: 46px
float: right
border-radius: 100%
background-color: #4D4D4D
margin: 15px 0 0 10px
position: relative
.ratingInset
width: 46px
height: 46px
border-radius: 100%
background-color: #FF0027
position: absolute
/*left:-1.859px;*/
/*bottom: 3px;*/
clip: rect(0, 22px, 50px, 0)
transform: rotate(-90deg)
.iconRating
width: 100%
height: 100%
position: absolute
left: 0
top: 0
background: url('#{$static}/img/button12.png') no-repeat center
.ratingPer
color: #ff2c2c
font-size: 18px
font-family: 'pfdintextcomppro-regular', sans-serif
float: right
margin: 28px 0 0 9px
cursor: pointer
.mainMenu li
&:last-child
padding-right: 0
a
color: white
font-size: 18px
padding: 30px 0 27px 40px
font-family: 'pfbeausanspro-reg', sans-serif
&.active > a
border-color: #ff0029
&.icon_tm1.active span
background: url('#{$static}/img/listMain2.png') no-repeat !important
&.officeList.active span
background: url('#{$static}/img/list4tml.png') no-repeat center !important
&.icon_tm2.active span
background: url('#{$static}/img/listMain2.png') no-repeat center !important
&.icon_tm3.active span
background: url('#{$static}/img/listMain2.png') no-repeat right !important
li.officeList.icon_tml > a > .count
display: inline-block
color: red
font-family: 'pfbeausanspro-reg', sans-serif
//padding: 5px 7px 3px 7px
background: none
border-radius: 0
position: inherit
//right: -34px
//top: -4px
.reg, .reg:link, .reg:visited
color: #fb1818
font-size: 16px
text-transform: uppercase
float: left
line-height: 75px
font-family: 'pfdintextcomppro-regular', sans-serif
letter-spacing: 4px
text-decoration: none
.lock
width: 75px
height: 75px
background: url('#{$static}/img/lock.png') no-repeat center, white
float: right
cursor: pointer
margin-left: 20px
margin-right: 0
.imgProfile
width: 75px
height: 75px
float: right
margin: 0
padding-left: 5px
img
display: block
width: 100%
height: 100%
.infoProfile
float: right
.btn-group
.btn
width: 75px
height: 75px
float: left
border-radius: 0 !important
background-color: black
border: none
span
color: white
font-size: 26px
.dropdown-toggle
&:hover, &:active, &:focus
-webkit-box-shadow: inset 0 3px 5px rgba(255, 0, 39, 0.99)
-moz-box-shadow: inset 0 3px 5px rgba(255, 0, 39, 0.99)
box-shadow: inset 0 3px 5px rgba(255, 0, 39, 0.99)
background-color: rgb(255, 0, 39)
.dropdown-menu
border-radius: 0
background-color: black
left: -174px
margin: -1px 100% 0 0
float: left
width: 250px
height: auto
padding: 30px 20px 15px 40px
border-top: 3px solid #ff2c2c
li
margin-bottom: 10px
&:last-child
margin-bottom: 0
a
color: white
font-size: 17px
font-family: 'pfbeausanspro-reg', sans-serif
position: relative
&:link, &:visited
color: white
font-size: 17px
font-family: 'pfbeausanspro-reg', sans-serif
position: relative
&:hover, &:active
background-color: black !important
color: #ff2c2c
span
content: ''
position: absolute
width: 20px
left: -18px
top: 4px
.icon_mm1 a span
height: 20px
background-size: cover
background: url('#{$static}/img/menu.png') no-repeat 0 0
.icon_mm2 a span
height: 22px
background-size: cover
background: url('#{$static}/img/menu.png') no-repeat 0 -20px
.icon_mm3 a span
height: 13px
background-size: cover
background: url('#{$static}/img/menu.png') no-repeat 0 -42px
top: 6px
.icon_mm4 a span
height: 20px
background-size: cover
background: url('#{$static}/img/menu.png') no-repeat 0 -55px
.icon_mm5 a span
height: 20px
background-size: cover
background: url('#{$static}/img/menu.png') no-repeat 0 -75px
.icon_mm6 a span
height: 20px
background-size: cover
background: url('#{$static}/img/menu.png') no-repeat 0 -95px
.icon_mm7 a span
height: 20px
background-size: cover
background: url('#{$static}/img/menu.png') no-repeat 0 0
.icon_mm8 a span
height: 20px
background-size: contain
background: url('#{$static}/img/user-5.png') no-repeat 0 0
.icon_chat a span
height: 20px
background:
image: url("#{$static}/img/icons/icon_speach-ball.png")
size: contain
repeat: no-repeat
.icon_mm1 a:hover span
height: 20px
background: url('#{$static}/img/menu2.png') no-repeat center !important
background-size: cover !important
background-position: 0 0 !important
.icon_mm2 a:hover span
height: 22px
background-size: cover
background: url('#{$static}/img/menu2.png') no-repeat 0 -20px
.icon_mm3 a:hover span
height: 13px
background-size: cover
background: url('#{$static}/img/menu2.png') no-repeat 0 -42px
.icon_mm4 a:hover span
height: 20px
background-size: cover
background: url('#{$static}/img/menu2.png') no-repeat 0 -55px
.icon_mm5 a:hover span
height: 20px
background-size: cover
background: url('#{$static}/img/menu2.png') no-repeat 0 -75px
.icon_mm6 a:hover span
height: 20px
background-size: cover
background: url('#{$static}/img/menu2.png') no-repeat 0 -95px
.icon_mm7 a:hover span
height: 20px
background-size: cover
background: url('#{$static}/img/menu2.png') no-repeat 0 0
.icon_mm8 a:hover span
height: 20px
background-size: contain
background: url('#{$static}/img/user-4.png') no-repeat 0 0
.icon_chat a:hover span
height: 20px
background:
image: url("#{$static}/img/icons/icon_speach-ball_red.png")
size: contain
repeat: no-repeat

@ -6,75 +6,7 @@
<div class="col-lg-12"> <div class="col-lg-12">
<p class="titleScore">Регистрация </p> <p class="titleScore">Регистрация </p>
</div> </div>
<div class="form-regestration"> {% include 'partials/inc-registration_form.html' %}
<form method="post">{% csrf_token %}
{{ form.non_field_errors }}
{% if not hide_user_type %}
<div class="col-lg-12 select-reg polsF1">
{# {% if request.GET.type == 'customer' %}#}
{# <input type="hidden" name="user_type" value="customer">#}
{# {% elif request.GET.type == 'contractor' %}#}
{# <input type="hidden" name="user_type" value="contractor">#}
{# {% else %}#}
{# <select name="{{ form.user_type.html_name }}" class="selectpicker3">#}
{# {% for val, text in form.user_type.field.choices %}#}
{# <option value="{{ val }}" {% if form.user_type.value == val %}selected{% endif %}>{{ text }}</option>#}
{# {% endfor %}#}
{# </select>#}
{# {% endif %}#}
{{ form.user_type }}
{{ form.user_type.errors }}
</div>
{% endif %}
<div class="col-lg-12 select-reg">
<input type="text" name="{{ form.username.name }}" value="{{ form.username.value }}" class="box-sizing email-reg"
placeholder="Nickname">
{{ form.username.errors }}
</div>
<div class="col-lg-12 select-reg ">
<input type="text" name="{{ form.email.name }}" class="box-sizing email-reg"
value="{{ form.email.value }}" placeholder="Электронная почта">
{{ form.email.errors }}
</div>
<div class="col-lg-12 select-reg">
<input type="password" name="{{ form.password1.name }}" class="box-sizing pass-reg"
placeholder="Пароль">
{{ form.password1.errors }}
</div>
<div class="col-lg-12 select-reg">
<input type="password" name="{{ form.password2.name }}" class="box-sizing pass-reg"
placeholder="Пароль">
{{ form.password2.errors }}
</div>
<div class="col-lg-12 select-reg captcha">
{{ form.captcha }}
{{ form.captcha.errors }}
</div>
<div class="col-lg-12 select-reg">
<button class="reg-sub">Зарегистрироваться</button>
</div>
<div class="clearfix"></div>
{% include 'registration/social.html' %}
<div class="col-lg-12 select-reg">
<div class="check-reg">
<label><input type="checkbox" name="{{ form.tos.name }}" {{ form.tos.value }} /><span></span></label>
<p>Регистрируясь, я подтверждаю свое согласие у условиями <a href="#">пользовательского соглашения</a></p>
{{ form.tos.errors }}
</div>
</div>
</form>
<div class="col-lg-12 select-reg">
<a href="{% url 'auth_login' %}" class="have-ac">Я уже зарегистрирован на ресурсе</a>
</div>
</div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
</div> </div>

@ -0,0 +1,100 @@
{% extends 'partials/base.html' %}
{% block content %}
<section class="mainContainer">
{% include 'partials/header.html' %}
<div class="container-fluid">
<div class="row">
<p class="welcomeMain">{{ main_settings.heading }}</p>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-lg-6">
<div class="changeBlock changeBlock2">
{% if request.user.is_authenticated and request.user.is_customer %}
<a href="{% url 'users:customer-profile-open-projects' pk=request.user.pk %}">Я заказчик</a>
{% else %}
<a href="{% url 'registration_register' %}?type=customer">Я заказчик</a>
{% endif %}
<p>
{{ main_settings.customer_text|safe }}
</p>
</div>
<div class="square">
<div class="insetSquare"></div>
</div>
</div>
<div class="col-lg-6">
<div class="changeBlock changeBlock1">
{% if request.user.is_authenticated and request.user.is_contractor %}
<a href="{% url 'users:contractor-profile' pk=request.user.pk %}">Я исполнитель</a>
{% else %}
<a href="{% url 'registration_register' %}?type=contractor">Я исполнитель</a>
{% endif %}
<p>
{{ main_settings.contractor_text|safe }}
</p>
</div>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row">
<a class="popup-youtube" href="{{ main_settings.video_code }}">
<div class="youtube"></div>
</a>
{# <!-- Modal HTML -->#}
{# <div id="myModal" class="modal fade">#}
{# <div class="modal-dialog">#}
{# <div class="modal-content">#}
{# <div class="modal-header">#}
{# <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>#}
{# <h4 class="modal-title">Видео</h4>#}
{# </div>#}
{# <div class="modal-body">#}
{# <div id="modal-body-video">#}
{# {{ main_settings.video_code | safe }}#}
{# </div>#}
{# </div>#}
{# </div>#}
{# </div>#}
{# </div>#}
</div>
</div>
</section>
{% endblock %}
{% block js_block %}
<script>
$(document).ready(function() {
$('.popup-youtube').magnificPopup({
disableOn: 700,
type: 'iframe',
mainClass: 'mfp-fade',
removalDelay: 160,
preloader: false,
fixedContentPos: false
});
});
{# $(document).ready(function(){#}
{# var modalBodyVideo = $("#modal-body-video").clone(true);#}
{# #}
{# $("#myModal").on('hide.bs.modal', function(){#}
{# $("#modal-body-video").remove();#}
{# });#}
{# #}
{# $("#myModal").on('show.bs.modal', function(){#}
{# $("#modal-body-video").remove();#}
{# modalBodyVideo.appendTo('.modal-body');#}
{# });#}
{# });#}
</script>
{% endblock %}

@ -1,5 +1,5 @@
<p class="ratingPer">{{ current_indicator }}%</p>
<div class="rating"> <div class="rating">
<div class="ratingInset" style="clip:rect(0px, {{ current_indicator_px }}px, 50px, 0px);"></div> <div class="ratingInset" style="clip:rect(0px, {{ current_indicator_px }}px, 50px, 0px);"></div>
<div class="iconRating"></div> <div class="iconRating"></div>
<p class="ratingPer">{{ current_indicator }}%</p>
</div> </div>

@ -1 +1 @@
<span class="badge badge-count">{{ new_count }}</span> <div class="circle">{{ new_count }}</div>

@ -1 +1 @@
<p>{{ new_count }}</p> <div id="my_office" class="count">{{ new_count }}</div>

@ -10,7 +10,6 @@ from projects.models import Order
from reviews.models import Review from reviews.models import Review
from users.helpers import get_projects_grouped from users.helpers import get_projects_grouped
register = template.Library() register = template.Library()
@ -50,7 +49,13 @@ def count_new_message(context, user):
@register.inclusion_tag('templatetags/user_new_count_orders.html', takes_context=True) @register.inclusion_tag('templatetags/user_new_count_orders.html', takes_context=True)
def count_new_message_orders(context, user): def count_new_message_orders(context, user):
new_count = NewMessage.objects.filter(user=user, message__order__in=user.orders.all(), """
:param context:
:param user:
:return:
"""
new_count = NewMessage.objects.filter(user=user, message__order__in=user.orders.filter(status='created'),
message__team__isnull=True).count() message__team__isnull=True).count()
try: try:
team = user.team team = user.team
@ -58,23 +63,30 @@ def count_new_message_orders(context, user):
team = None team = None
if team: if team:
new_count_team = NewMessage.objects.filter(user=user, message__order__in=user.team.orders.all(), new_count_team = NewMessage.objects.filter(user=user,
message__order__in=user.team.orders.filter(status='created'),
message__team__isnull=True).count() message__team__isnull=True).count()
new_count += new_count_team new_count += new_count_team
if new_count > 99:
new_count = '99+'
return { return {
'new_count': new_count, 'new_count': new_count,
} }
@register.simple_tag @register.simple_tag
def get_new_count_message(team_pk,user=None): def get_new_count_message(team_pk, user=None):
count = NewMessage.objects.filter(user=user, message__team=team_pk, message__order__isnull=True).count() count = NewMessage.objects.filter(user=user, message__team=team_pk, message__order__isnull=True).count()
return count return count
@register.simple_tag @register.simple_tag
def get_new_count_for_contact(contact, current_user): def get_new_count_for_contact(contact, current_user):
count = current_user.new_messages.filter(message__sender=contact, message__order__isnull=True, message__team__isnull=True).count() count = current_user.new_messages.filter(message__sender=contact, message__order__isnull=True,
message__team__isnull=True).count()
if count > 99:
new_count = '99+'
return count return count
@ -114,14 +126,17 @@ def get_customer_chat_open_projects(user):
@register.filter @register.filter
def get_project_message_count(user): def get_project_message_count(user):
if user.is_customer(): if user.is_customer():
projects = user.customer_projects.filter(state='active').exclude(order__contractor__isnull=True, order__team__isnull=True) projects = user.customer_projects.filter(state='active').exclude(order__contractor__isnull=True,
order__team__isnull=True)
return projects.aggregate(c=Count('answers__messages'))['c'] return projects.aggregate(c=Count('answers__messages'))['c']
elif user.is_contractor(): elif user.is_contractor():
message_count = user.contractor_answers.filter(project__state='active', rejected=False).aggregate(c=Count('messages'))['c'] message_count = \
user.contractor_answers.filter(project__state='active', rejected=False).aggregate(c=Count('messages'))['c']
if util.has_related(user, 'team'): if util.has_related(user, 'team'):
message_count += user.team.answers.filter(project__state='active', rejected=False).aggregate(c=Count('messages'))['c'] message_count += \
user.team.answers.filter(project__state='active', rejected=False).aggregate(c=Count('messages'))['c']
return message_count return message_count

@ -41,7 +41,7 @@ class InvoiceHistory(models.Model):
current_sum_info = InvoiceHistory.objects.filter(user=self.user, type="score").aggregate(Sum('sum')) current_sum_info = InvoiceHistory.objects.filter(user=self.user, type="score").aggregate(Sum('sum'))
current_sum = current_sum_info['sum__sum'] or 0 current_sum = current_sum_info['sum__sum'] or 0
if self.type == "score": if self.type == "score":
self.balance = current_sum + self.sum self.balavoids_atnce = current_sum + self.sum
else: else:
self.balance = current_sum self.balance = current_sum
super().save(*args, **kwargs) super().save(*args, **kwargs)

@ -76,15 +76,15 @@ class ScoreView(LoginRequiredMixin, View):
template_name = 'score-detail.html' template_name = 'score-detail.html'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
# transaction = Transaction.objects.get_or_create(customer=request.user, complete=False) transaction, created = Transaction.objects.get_or_create(customer=request.user, type='add', complete=False)
transaction = Transaction.objects.get_or_create(customer=request.user, type='add', complete=False) # transaction = Transaction.objects.filter(customer=request.user, type='add', complete=False)
user_score = get_object_or_404(User.objects, pk=kwargs.get('pk')) user_score = get_object_or_404(User.objects, pk=kwargs.get('pk'))
current_sum_info = InvoiceHistory.objects.filter(user=user_score, type="score").aggregate(Sum('sum')) current_sum_info = InvoiceHistory.objects.filter(user=user_score, type="score").aggregate(Sum('sum'))
user_score_balance = current_sum_info['sum__sum'] or 0 user_score_balance = current_sum_info['sum__sum'] or 0
form = WithDrawForm form = WithDrawForm
return render(request, self.template_name, { return render(request, self.template_name, {
'transaction': transaction[0], 'transaction': transaction,
'YANDEX_MONEY': settings.YANDEX_MONEY, 'YANDEX_MONEY': settings.YANDEX_MONEY,
'user_score': user_score, 'user_score': user_score,
'user_score_balance': user_score_balance, 'user_score_balance': user_score_balance,

@ -14,6 +14,8 @@ module.exports = {
//worksell //worksell
create_worksell: "./assets/js/src/create_worksell.js", create_worksell: "./assets/js/src/create_worksell.js",
init_create_worksell: './assets/js/src/init_create_worksell.js', init_create_worksell: './assets/js/src/init_create_worksell.js',
//home
home_page: "./assets/js/src/home_page.js",
}, },

@ -8,24 +8,12 @@
<link rel='stylesheet' href='{% sass_src "sass/main.sass" %}'> <link rel='stylesheet' href='{% sass_src "sass/main.sass" %}'>
<link rel='stylesheet' href='{% sass_src "sass/components/custom-components.sass" %}'> <link rel='stylesheet' href='{% sass_src "sass/components/custom-components.sass" %}'>
<link rel='stylesheet' href='{% sass_src "lib/proekton-components/sass/components.sass" %}'> <link rel='stylesheet' href='{% sass_src "lib/proekton-components/sass/components.sass" %}'>
{# <style>#}
{# .-live-image-upload-container .-position-relative-parent {#}
{# position: relative#}
{# }#}
{##}
{# .-live-image-upload-container .-image-delete,#}
{# .-live-image-upload-container .-live-image-delete {#}
{# position: absolute;#}
{# top: 0;#}
{# right: 0;#}
{# background-color: white;#}
{# }#}
{# </style>#}
{% endblock %} {% endblock %}
{% block content %} {% block content %}
{% include 'partials/modals/project_work_type_suggestion.html' %} {% include 'partials/modals/project_work_type_suggestion.html' %}
{% include 'partials/modals/modal-registration_form.html' %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
<div class="container main-scope"> <div class="container main-scope">
<div class="row title-scope"> <div class="row title-scope">
@ -73,6 +61,7 @@
<div class="" id="select-box-1"></div> <div class="" id="select-box-1"></div>
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
<div class="header">&nbsp;</div>
<div href="#" onclick="return false" data-toggle="modal" <div href="#" onclick="return false" data-toggle="modal"
data-target="#projectWorkTypeSuggestionModal" data-target="#projectWorkTypeSuggestionModal"
class="btn btn-simple btn-plus">Нет нужной специальности хочу добавить class="btn btn-simple btn-plus">Нет нужной специальности хочу добавить
@ -132,7 +121,7 @@
style="position: absolute; top: -1000px; left: -1000px"> style="position: absolute; top: -1000px; left: -1000px">
<div class="preview-container"> <div class="preview-container">
<div class="btn close file-upload-remove-img-btn">&times;</div> <div class="btn close file-upload-remove-img-btn">&times;</div>
{# <div class="file-upload-remove-img-btn"></div>#} {# <div class="file-upload-remove-img-btn"></div>#}
<div class="preview"></div> <div class="preview"></div>
<textarea name="img_description" rows="2" data-limit-rows="true" <textarea name="img_description" rows="2" data-limit-rows="true"
class="description"></textarea> class="description"></textarea>
@ -192,17 +181,53 @@
</div> </div>
</div> </div>
<div class="row top-line"> <div class="row top-line">
<div class="col-lg-3" style="text-align: center">
<div class="header">&nbsp;</div> <div id="is_customer"
<input style="width: 100%" type="submit" class="btn btn-simple" {% if request.user.is_authenticated and request.user.is_contractor %}
value="РАЗМЕСТИТЬ ЗАКАЗ"> {% else %}
style="display: none"
{% endif %}>
<div class="col-lg-3" style="text-align: center">
<input style="width: 100%" type="submit" class="btn btn-simple"
value="РАЗМЕСТИТЬ ЗАКАЗ">
</div>
<div class="col-lg-3 col-lg-offset-6" style="text-align: center">
<input style="width: 100%" type="button" class="btn btn-simple"
onclick="addMessage('Функционал временно не работает', 'info')"
value="ПРЕДВАРИТЕЛЬНЫЙ ПРОСМОТР">
</div>
</div> </div>
<div class="col-lg-3 col-lg-offset-6" style="text-align: center">
<div class="header">&nbsp;</div> <div id="not_customer"
<input style="width: 100%" type="button" class="btn btn-simple" {% if not request.user.is_authenticated or request.user.is_customer %}
onclick="addMessage('Функционал временно не работает', 'info')" {% else %}
value="ПРЕДВАРИТЕЛЬНЫЙ ПРОСМОТР"> style="display: none"
{% endif %}>
<div class="col-lg-12" style="text-align: center">
<a onclick="return false" class="btn-simple" data-toggle="modal"
data-target="#registrationFormModal">
ДЛЯ РАЗМЕЩЕНИЯ ЗАКАЗА НЕОБХОДИМО ЗАРЕГИСТРИРОВАТЬСЯ
{% if request.user.is_customer %}
КАК ИСПОЛНИТЕЛЬ
{% endif %}
</a>
</div>
</div> </div>
<input type="hidden" name="not_auth_user_id">
{# <div class="row top-line">#}
{# <div class="col-lg-3" style="text-align: center">#}
{# <div class="header">&nbsp;</div>#}
{# <input style="width: 100%" type="submit" class="btn btn-simple"#}
{# value="РАЗМЕСТИТЬ ЗАКАЗ">#}
{# </div>#}
{# <div class="col-lg-3 col-lg-offset-6" style="text-align: center">#}
{# <div class="header">&nbsp;</div>#}
{# <input style="width: 100%" type="button" class="btn btn-simple"#}
{# onclick="addMessage('Функционал временно не работает', 'info')"#}
{# value="ПРЕДВАРИТЕЛЬНЫЙ ПРОСМОТР">#}
{# </div>#}
</div> </div>
</form> </form>
</div> </div>

@ -6,7 +6,7 @@ import pydash as _;
_.map = _.map_; _.map = _.map_;
_.filter = _.filter_ _.filter = _.filter_
from pprint import pformat from pprint import pformat
from django.shortcuts import render, redirect from django.shortcuts import render, redirect, get_object_or_404
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.db.models import Q from django.db.models import Q
@ -20,11 +20,14 @@ from django.views.generic import ListView, DetailView, CreateView, View, \
from projects.models import BuildingClassfication, ConstructionType from projects.models import BuildingClassfication, ConstructionType
from projects.forms import ProjectWorkTypeSuggestionForm from projects.forms import ProjectWorkTypeSuggestionForm
from archilance.mixins import BaseMixin
from common.forms import CustomRegistrationForm
from users.models import User
from .models import WorkSell, Picture, WorkSellPhoto, WorkSellPhoto from .models import WorkSell, Picture, WorkSellPhoto, WorkSellPhoto
from .forms import WorkSellForm, WorkSellFilterForm, ContractorWorkSellTrashForm from .forms import WorkSellForm, WorkSellFilterForm, ContractorWorkSellTrashForm
from .serialize import serialize from .serialize import serialize
from .response import JSONResponse, response_mimetype from .response import JSONResponse, response_mimetype
from archilance.mixins import BaseMixin
class PictureCreateView(CreateView): class PictureCreateView(CreateView):
@ -174,11 +177,17 @@ class WorkSellCreateView(BaseMixin, View):
work_type_suggestion_form = ProjectWorkTypeSuggestionForm work_type_suggestion_form = ProjectWorkTypeSuggestionForm
template_name = 'worksell_create.html' template_name = 'worksell_create.html'
def dispatch(self, request, *args, **kwargs): # def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_contractor(): # if request.user.is_authenticated() and request.user.is_contractor():
return super().dispatch(request, *args, **kwargs) # return super().dispatch(request, *args, **kwargs)
else: # else:
raise PermissionDenied # raise PermissionDenied
def get_context_data(self, **kwargs):
ctx = super().get_context_data()
user_form = CustomRegistrationForm()
ctx['user_form'] = user_form
return ctx
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({}, request.GET, kwargs)) context = self.get_context_data(**_.merge({}, request.GET, kwargs))
@ -207,10 +216,15 @@ class WorkSellCreateView(BaseMixin, View):
else: else:
request.POST.setlist('el_format', request.POST.get('el_format', "").split(',')) request.POST.setlist('el_format', request.POST.get('el_format', "").split(','))
print("POST before = ", request.POST) # print("POST before = ", request.POST)
if form.is_valid(): if form.is_valid():
work_sell = form.save(commit=False) work_sell = form.save(commit=False)
work_sell.contractor = request.user unregister_user = request.POST.get('not_auth_user_id')
if unregister_user:
user = get_object_or_404(User, pk=unregister_user)
else:
user = request.user
work_sell.contractor = user
work_sell.save() work_sell.save()
form.save_m2m() form.save_m2m()

Loading…
Cancel
Save