Merge branch 'PR-14'

Пересобран HEADER
remotes/origin/PR-46
booblegum 9 years ago
commit 924e66ef6e
  1. 1
      .gitignore
  2. 10
      README.md
  3. 2
      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. 21
      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. 73
      chat/templates/chat_contractor.html
  49. 39
      chat/templates/chat_customer.html
  50. 56
      chat/templates/inc-contact-card.html
  51. 4
      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. 62
      projects/templates/customer_project_create.html
  59. 49
      projects/views.py
  60. 1
      reviews/signals.py
  61. 190
      templates/home.html
  62. 40
      templates/partials/base.html
  63. 190
      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. 6
      templates/partials/sass/footer.sass
  68. 401
      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. 29
      users/templatetags/user_tags.py
  79. 2
      wallets/models.py
  80. 6
      wallets/views.py
  81. 2
      webpack.config.js
  82. 55
      work_sell/templates/worksell_create.html
  83. 32
      work_sell/views.py

1
.gitignore vendored

@ -4,6 +4,7 @@ env/
.ar/
ar/
archilance/settings/local.py
chat/settings/local.py
media/*
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'])
def current_user(self, request, *args, **kwargs):
if self.request.user.__dict__:
queryset = self.queryset.filter(user=self.request.user)
serialiser = self.serializer_class(queryset, many=True)
return Response(serialiser.data)
return Response([])
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',
'social.apps.django_app.context_processors.backends',
'social.apps.django_app.context_processors.login_redirect',
'context_processors.user_info.user_info'
],
# Load these templatetags by default:
@ -339,6 +340,7 @@ SITE_ID = 1
# else:
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# sudo python3 -m smtpd -n -c DebuggingServer localhost:25
EMAIL_HOST = 'localhost'
EMAIL_HOST_PASSWORD = ''
EMAIL_HOST_USER = ''
@ -377,4 +379,5 @@ DEFAULT_FILE_STORAGE = 'archilance.util.ASCIIFileSystemStorage'
RECAPTCHA_PUBLIC_KEY = '6LftaQgUAAAAAG0oKrt1ORtop1jfIEzkTnCL4S3Q'
RECAPTCHA_PRIVATE_KEY = '6LftaQgUAAAAAMaIK-YCL1u1AfakVXjblULQCvfa'
# CAPTCHA_AJAX = True
NOCAPTCHA = True

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

@ -85,15 +85,15 @@ a, a:hover, a:focus, a:active {
background-color: black;
}
.logo {
width: 183px;
height: 36px;
background: url('../img/logo.png') no-repeat center;
background-size: cover;
float: left;
margin: 18px 0 21px 10px;
cursor: pointer;
}
/*.logo {*/
/*width: 183px;*/
/*height: 36px;*/
/*background: url('../img/logo.png') no-repeat center;*/
/*background-size: cover;*/
/*float: left;*/
/*margin: 18px 0 21px 10px;*/
/*cursor: pointer;*/
/*}*/
.mainMenu {
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 _test_seeds = __webpack_require__(9);
var _ajax_registration = __webpack_require__(9);
var _test_seeds = __webpack_require__(10);
function showHideRealry() {
var check = $('#checkbox-sb-realty');
@ -83,6 +85,7 @@
(0, _only_one_checkbox.onlyOneCheckboxInit)('#safe', '#by_agreement');
(0, _scroll_on_required.scrollOnRequiredInit)();
(0, _popups.showPopupsInit)();
(0, _ajax_registration.ajaxRegistrationInit)('customer');
window.addMessage = _popups.addMessage;
});
@ -369,6 +372,104 @@
/***/ },
/* 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) {
"use strict";

@ -48,18 +48,21 @@
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 _popups = __webpack_require__(7);
var _ajax_registration = __webpack_require__(9);
$(function () {
// fileUploadInit();
// previewImg();
(0, _image_upload.imageUploadInit)();
(0, _scroll_on_required.scrollOnRequiredInit)();
(0, _popups.showPopupsInit)();
(0, _ajax_registration.ajaxRegistrationInit)('contractor');
window.addMessage = _popups.addMessage;
});
@ -233,8 +236,106 @@
exports.scrollOnRequiredInit = scrollOnRequiredInit;
/***/ },
/* 9 */,
/* 10 */
/* 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 */,
/* 11 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
@ -293,12 +394,9 @@
$fileUploadWidget.css('display', 'block');
if ($fileImg.length) {
console.log('+');
var reader = new FileReader();
reader.onload = function (e) {
// document.getElementById('clock').style.backgroundImage = "url(" + reader.result + ")";
$fileImg.css('background-image', 'url(' + e.target.result + ')');
// $fileImg.attr('src', e.target.result);
};
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';
var _SelectedContainer = __webpack_require__(11);
var _SelectedContainer = __webpack_require__(13);
var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer);
var _SelectedContainerCreate = __webpack_require__(15);
var _SelectedContainerCreate = __webpack_require__(17);
var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate);
var _NoTreeSelect = __webpack_require__(16);
var _NoTreeSelect = __webpack_require__(18);
var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect);
var _TreeSelect = __webpack_require__(18);
var _TreeSelect = __webpack_require__(20);
var _TreeSelect2 = _interopRequireDefault(_TreeSelect);
var _SingleTreeSelect = __webpack_require__(19);
var _SingleTreeSelect = __webpack_require__(21);
var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect);
var _SelectOrCreate = __webpack_require__(20);
var _SelectOrCreate = __webpack_require__(22);
var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate);
@ -177,7 +177,9 @@
/* 8 */,
/* 9 */,
/* 10 */,
/* 11 */
/* 11 */,
/* 12 */,
/* 13 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
@ -192,15 +194,15 @@
var _desc, _value, _class; // `
var _DataTree = __webpack_require__(12);
var _DataTree = __webpack_require__(14);
var _DataTree2 = _interopRequireDefault(_DataTree);
var _NoTreeData = __webpack_require__(13);
var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
var _decorators = __webpack_require__(14);
var _decorators = __webpack_require__(16);
var _decorators2 = _interopRequireDefault(_decorators);
@ -431,7 +433,7 @@
exports.default = SelectedContainer;
/***/ },
/* 12 */
/* 14 */
/***/ function(module, exports) {
"use strict";
@ -586,7 +588,7 @@
exports.default = DataTree;
/***/ },
/* 13 */
/* 15 */
/***/ function(module, exports) {
"use strict";
@ -642,7 +644,7 @@
exports.default = NoTreeData;
/***/ },
/* 14 */
/* 16 */
/***/ function(module, exports) {
"use strict";
@ -726,7 +728,7 @@
// export {onBind};
/***/ },
/* 15 */
/* 17 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
@ -742,11 +744,11 @@
var _desc, _value, _class;
var _SelectedContainer2 = __webpack_require__(11);
var _SelectedContainer2 = __webpack_require__(13);
var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2);
var _decorators = __webpack_require__(14);
var _decorators = __webpack_require__(16);
var _decorators2 = _interopRequireDefault(_decorators);
@ -827,7 +829,7 @@
exports.default = SelectedContainerCreate;
/***/ },
/* 16 */
/* 18 */
/***/ function(module, exports, __webpack_require__) {
'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 _AbsBaseSelect2 = __webpack_require__(17);
var _AbsBaseSelect2 = __webpack_require__(19);
var _NoTreeData = __webpack_require__(13);
var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -910,7 +912,7 @@
exports.default = NoTreeSelect;
/***/ },
/* 17 */
/* 19 */
/***/ function(module, exports) {
"use strict";
@ -1454,7 +1456,7 @@
exports.AbsBaseSelect = AbsBaseSelect;
/***/ },
/* 18 */
/* 20 */
/***/ function(module, exports, __webpack_require__) {
'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 _AbsBaseSelect2 = __webpack_require__(17);
var _AbsBaseSelect2 = __webpack_require__(19);
var _DataTree = __webpack_require__(12);
var _DataTree = __webpack_require__(14);
var _DataTree2 = _interopRequireDefault(_DataTree);
@ -1579,7 +1581,7 @@
exports.default = TreeSelect;
/***/ },
/* 19 */
/* 21 */
/***/ function(module, exports, __webpack_require__) {
'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 _AbsBaseSelect = __webpack_require__(17);
var _AbsBaseSelect = __webpack_require__(19);
var _TreeSelect2 = __webpack_require__(18);
var _TreeSelect2 = __webpack_require__(20);
var _TreeSelect3 = _interopRequireDefault(_TreeSelect2);
@ -1674,7 +1676,7 @@
exports.default = SingleTreeSelect;
/***/ },
/* 20 */
/* 22 */
/***/ function(module, exports, __webpack_require__) {
'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 _AbsBaseSelect2 = __webpack_require__(17);
var _AbsBaseSelect2 = __webpack_require__(19);
var _NoTreeData = __webpack_require__(13);
var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData);

@ -46,27 +46,27 @@
'use strict';
var _SelectedContainer = __webpack_require__(11);
var _SelectedContainer = __webpack_require__(13);
var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer);
var _SelectedContainerCreate = __webpack_require__(15);
var _SelectedContainerCreate = __webpack_require__(17);
var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate);
var _NoTreeSelect = __webpack_require__(16);
var _NoTreeSelect = __webpack_require__(18);
var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect);
var _TreeSelect = __webpack_require__(18);
var _TreeSelect = __webpack_require__(20);
var _TreeSelect2 = _interopRequireDefault(_TreeSelect);
var _SingleTreeSelect = __webpack_require__(19);
var _SingleTreeSelect = __webpack_require__(21);
var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect);
var _SelectOrCreate = __webpack_require__(20);
var _SelectOrCreate = __webpack_require__(22);
var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate);
@ -212,7 +212,9 @@
/* 8 */,
/* 9 */,
/* 10 */,
/* 11 */
/* 11 */,
/* 12 */,
/* 13 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
@ -227,15 +229,15 @@
var _desc, _value, _class; // `
var _DataTree = __webpack_require__(12);
var _DataTree = __webpack_require__(14);
var _DataTree2 = _interopRequireDefault(_DataTree);
var _NoTreeData = __webpack_require__(13);
var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
var _decorators = __webpack_require__(14);
var _decorators = __webpack_require__(16);
var _decorators2 = _interopRequireDefault(_decorators);
@ -466,7 +468,7 @@
exports.default = SelectedContainer;
/***/ },
/* 12 */
/* 14 */
/***/ function(module, exports) {
"use strict";
@ -621,7 +623,7 @@
exports.default = DataTree;
/***/ },
/* 13 */
/* 15 */
/***/ function(module, exports) {
"use strict";
@ -677,7 +679,7 @@
exports.default = NoTreeData;
/***/ },
/* 14 */
/* 16 */
/***/ function(module, exports) {
"use strict";
@ -761,7 +763,7 @@
// export {onBind};
/***/ },
/* 15 */
/* 17 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
@ -777,11 +779,11 @@
var _desc, _value, _class;
var _SelectedContainer2 = __webpack_require__(11);
var _SelectedContainer2 = __webpack_require__(13);
var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2);
var _decorators = __webpack_require__(14);
var _decorators = __webpack_require__(16);
var _decorators2 = _interopRequireDefault(_decorators);
@ -862,7 +864,7 @@
exports.default = SelectedContainerCreate;
/***/ },
/* 16 */
/* 18 */
/***/ function(module, exports, __webpack_require__) {
'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 _AbsBaseSelect2 = __webpack_require__(17);
var _AbsBaseSelect2 = __webpack_require__(19);
var _NoTreeData = __webpack_require__(13);
var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -945,7 +947,7 @@
exports.default = NoTreeSelect;
/***/ },
/* 17 */
/* 19 */
/***/ function(module, exports) {
"use strict";
@ -1489,7 +1491,7 @@
exports.AbsBaseSelect = AbsBaseSelect;
/***/ },
/* 18 */
/* 20 */
/***/ function(module, exports, __webpack_require__) {
'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 _AbsBaseSelect2 = __webpack_require__(17);
var _AbsBaseSelect2 = __webpack_require__(19);
var _DataTree = __webpack_require__(12);
var _DataTree = __webpack_require__(14);
var _DataTree2 = _interopRequireDefault(_DataTree);
@ -1614,7 +1616,7 @@
exports.default = TreeSelect;
/***/ },
/* 19 */
/* 21 */
/***/ function(module, exports, __webpack_require__) {
'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 _AbsBaseSelect = __webpack_require__(17);
var _AbsBaseSelect = __webpack_require__(19);
var _TreeSelect2 = __webpack_require__(18);
var _TreeSelect2 = __webpack_require__(20);
var _TreeSelect3 = _interopRequireDefault(_TreeSelect2);
@ -1709,7 +1711,7 @@
exports.default = SingleTreeSelect;
/***/ },
/* 20 */
/* 22 */
/***/ function(module, exports, __webpack_require__) {
'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 _AbsBaseSelect2 = __webpack_require__(17);
var _AbsBaseSelect2 = __webpack_require__(19);
var _NoTreeData = __webpack_require__(13);
var _NoTreeData = __webpack_require__(15);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData);

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

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

@ -5,6 +5,7 @@ import {readMoreInit} from './seeds/read_more'
import {onlyOneCheckboxInit} from './seeds/only_one_checkbox'
import {showPopupsInit, addMessage} from './seeds/popups'
import {scrollOnRequiredInit} from './seeds/scroll_on_required'
import {ajaxRegistrationInit} from './seeds/ajax_registration'
import {print} from './seeds/test_seeds'
function showHideRealry() {
@ -28,5 +29,6 @@ $(function () {
onlyOneCheckboxInit('#safe', '#by_agreement');
scrollOnRequiredInit();
showPopupsInit();
ajaxRegistrationInit('customer');
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({
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
display: block
li, ul
margin: 0
padding: 0
.select-box-header
white-space: nowrap
@ -37,10 +40,6 @@
margin: 0
padding: 0
.select-box-options li, ul
margin: 0
padding: 0
.select-box-options ul
border-right: 1px solid #{map_get($component_colors, border)}

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

@ -6,24 +6,39 @@ $static : '/static'
font-weight: normal
font-style: normal
@font-face
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")
font-weight: normal
font-style: normal
@font-face
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")
font-weight: normal
font-style: normal
@font-face
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?#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-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-style: normal
font-size: 14pt
display: inline-block
color: #000
&:hover
color: #000
text-decoration: none
box-shadow: 0 0 15px rgba(0, 0, 0, 0.2)
-webkit-transform: scale(1.04)
-moz-transform: scale(1.04)
@ -163,7 +167,7 @@ textarea.description
.border
flex: 1 1 auto
margin: 10px 0 0 25px
margin-top: 10px
border-top: 1px solid #CFCFCF
.btn-plus

@ -1,6 +1,8 @@
@import "base/fonts.sass"
@import "base/colors.sass"
@import "base/fonts"
@import "base/colors"
@import "base/variavles"
@import "common/parts"
@import "modules/mods"
body
font-size: 11pt
@ -39,34 +41,18 @@ body
@extend %header
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
$pad: 30px
padding-top: $pad
padding-bottom: $pad
margin-top: $pad
border-top: 1px solid #{map_get($component_colors, border)}
border-bottom: 1px solid #{map_get($component_colors, border)}
.select-text
color: #{map_get($component_colors, select)}
.slide
display: none
margin-bottom: 20px
.slide.active
display: block

@ -1,6 +1,24 @@
.mod-align-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
-ms-flex-align: center
-webkit-align-items: 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 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.httpserver import HTTPServer
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">
<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 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 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>
</ul>
@ -40,29 +43,7 @@
<div class="messageBlock box-sizing disTab">
<p>Контакты</p>
{% for contact in contacts_users %}
<div class="message messd user-block" id="userBlock{{ contact.pk }}" data-id="{{ contact.pk }}">
<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>
{% include 'inc-contact-card.html' %}
{% endfor %}
</div>
@ -74,7 +55,8 @@
<input type="hidden" value="{{ request.user.pk }}" name="senderId" id="senderContactId"/>
<input type="hidden" value="" name="recipentId" id="recipentContactId"/>
<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="setChat box-sizing upload">
@ -101,7 +83,8 @@
</ul>
<form id="add-form-contractor-note">
<p>Для заметок</p>
<input type="hidden" name="sender" id="senderNoteContractor" value="{{ request.user.pk }}"/>
<input type="hidden" name="sender" id="senderNoteContractor"
value="{{ request.user.pk }}"/>
<input type="hidden" name="recipent" id="recipentNoteContractor" value=""/>
<textarea id="chat2" name="text"></textarea>
@ -123,12 +106,15 @@
<p>Заказы</p>
{% for order in orders %}
<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>
<p class="titleOB">{{ order }}</p>
<div class="hideOBB">
<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>
<a href="#" class="linkChat11 full-order-info">
@ -163,7 +149,8 @@
</span>
</p>
<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>
</div>
@ -183,7 +170,8 @@
<input type="hidden" id="senderId" name="senderId" value="{{ request.user.pk }}">
<input type="hidden" id="recipentId" name="recipentId" value="">
<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="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-order">
@ -280,7 +268,8 @@
<p>Заказы</p>
{% for torder in team_orders %}
<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 }}"
data-id="{{ torder.pk }}">
<span class="dimovChat"></span>
<p class="titleOB">
{{ torder }}
@ -288,7 +277,8 @@
<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 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>
<ul class="listChat1">
@ -318,14 +308,16 @@
{% endfor %}
{% 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 }}"
data-team-id="{{ yteam.pk }}">
<span class="dimovChat"></span>
<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 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">
@ -336,11 +328,13 @@
<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>
<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>
<span class="team-chat-user"
data-id="{{ tuser.pk }}">{{ tuser.username }} </span>
{% endif %}
{% endfor %}
</p>
@ -361,7 +355,8 @@
<input type="hidden" name="team_ids" id="teamIds">
<input type="hidden" name="document-send" id="documentSendIds">
<textarea id="chatText" class="chat-textarea 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="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-team">

@ -35,35 +35,7 @@
<div class="messageBlock box-sizing disTab">
<p>Контакты</p>
{% for contact in contacts_users %}
<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><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>
{% include 'inc-contact-card.html' %}
{% endfor %}
</div>
@ -127,7 +99,8 @@
<p>Заказы</p>
{% for order in orders %}
<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 }}"
id="orderBlock{{ order.order.id }}"
data-secure-deal="{% if order.order.secure %}true{% else %}false{% endif %}"
@ -140,7 +113,8 @@
<p class="titleOB">{{ order }}</p>
<div class="hideOBB">
<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>
{% if order.order.contractor %}
{{ order.order.contractor.get_full_name }}
@ -184,7 +158,8 @@
</span>
</p>
<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>
</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()
def __init__(self, *args, **kwargs):
try:
self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
if self.request.GET.get('type') == 'customer':
self.fields['user_type'].initial = 'customer'
elif self.request.GET.get('type') == 'contractor':
self.fields['user_type'].initial = 'contractor'
except KeyError:
super().__init__(*args, **kwargs)
attrs = self.fields['user_type'].widget.attrs
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 import login
from django.core.exceptions import PermissionDenied
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.views.generic import View
from django.template import RequestContext, loader
class NoCsrfMixin(View):
@ -25,3 +30,37 @@ class ContractorRequiredMixin(LoginRequiredMixin, View):
return super().dispatch(request, *args, **kwargs)
else:
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)
@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()))

@ -12,7 +12,7 @@ from sorl.thumbnail import get_thumbnail
from archilance import util
from archilance.mixins import BaseMixin
from common.mixins import NoCsrfMixin
from common.mixins import NoCsrfMixin, AjaxUserAuthMixin
from users.models import ContractorResume
from .forms import PrintOrderForm, CustomRegistrationForm
from .models import PrintDocuments, PrintOrder, Settings, LiveImageUpload
@ -110,7 +110,7 @@ class LiveImageUploadDeleteView(NoCsrfMixin, LoginRequiredMixin, View):
return JsonResponse({'status': 'error'})
class CustomRegistrationView(RegistrationView):
class CustomRegistrationView(AjaxUserAuthMixin, RegistrationView):
form_class = CustomRegistrationForm
template_name = 'registration/registration_form.html'
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.utils import timezone
from .models import Stage
from .models import Stage, Order
@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/components/custom-components.sass" %}'>
<link rel='stylesheet' href='{% sass_src "lib/proekton-components/sass/components.sass" %}'>
{% endblock %}
{% block content %}
{% include 'partials/modals/project_work_type_suggestion.html' %}
{% include 'partials/modals/modal-registration_form.html' %}
{% include 'partials/header.html' %}
<div class="container main-scope">
<div class="row title-scope">
@ -53,6 +53,7 @@
<div class="" id="select-box-1"></div>
</div>
<div class="col-lg-3">
<div class="header">&nbsp;</div>
<div href="#" onclick="return false" data-toggle="modal"
data-target="#projectWorkTypeSuggestionModal"
class="btn btn-simple btn-plus">Нет нужной специальности хочу добавить
@ -266,16 +267,15 @@
</div>
</div>
</div>
{# <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="row">
<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="col-lg-12">
<label class="header mod-align-center">
@ -344,23 +344,57 @@
{% if form.cro.value %} checked{% endif %}>
</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> <!-- slide -->
<div class="row top-line">
<div id="is_customer"
{% if request.user.is_authenticated and request.user.is_customer or unregister_user %}
{% else %}
style="display: none"
{% endif %}>
<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"
value="ПРЕДВАРИТЕЛЬНЫЙ ПРОСМОТР">
</div>
</div>
<div id="not_customer"
{% if not request.user.is_authenticated or request.user.is_contractor %}
{% 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>
<input type="hidden" name="not_auth_user_id" value="{{ unregister_user }}">
</div>
</form>
</div> <!-- content -->
</div>

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

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

@ -1,100 +1,150 @@
{% 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 %}
<section class="mainContainer">
{% include 'partials/header.html' %}
<div class="container-fluid">
<div class="home">
<div class="container">
<div class="row">
<div class="col-lg-12">
<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">
<div class="row mod-row-eq-height">
<div class="col-lg-5 col-lg-offset-1 mod-no-padding">
<div class="infoBlock 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 %}
<a href="{% url 'registration_register' %}?type=customer">Я заказчик</a>
<a class="to-profile" href="{% url 'registration_register' %}?type=customer">Я заказчик</a>
{% endif %}
<p>
{{ main_settings.customer_text|safe }}
</p>
<ul class="customer-list">
<li>
<div class="icon-1"></div>
<div class="text">
Ресурс для специалистов по проектированию, дизайну, оформлению и сопровождению
проектной документации
</div>
<div class="square">
<div class="insetSquare"></div>
</li>
<li>
<div class="icon-2"></div>
<div class="text">
Удобный и быстрый поиск исполнителей
</div>
</li>
<li>
<div class="icon-3"></div>
<div class="text">
Готовые сформированные группы исполнителей
</div>
<div class="col-lg-6">
<div class="changeBlock changeBlock1">
</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>
<a class="create" href="{% url 'projects:customer-project-create' %}">Разместить заказ</a>
</div>
</div>
<div class="col-lg-5 mod-no-padding">
<div class="infoBlock 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 %}
<a href="{% url 'registration_register' %}?type=contractor">Я исполнитель</a>
<a class="to-profile" href="{% url 'registration_register' %}?type=contractor">Я
исполнитель</a>
{% endif %}
<p>
{{ main_settings.contractor_text|safe }}
</p>
<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>
<a class="create" href="{% url 'work_sell:create' %}">Разместить проект</a>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row">
<a class="popup-youtube" href="{{ main_settings.video_code }}">
<div class="youtube"></div>
<div class="col-lg-12">
<a class="popup-youtube youtube" href="{{ main_settings.video_code }}">
</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>
</div>
</div>
</div>
</div>
<div style="background-color: #F7F7F7;">
<div class="container">
{% include 'partials/footer.html' %}
</div>
</div>
{% endblock %}
{% block old_js %}
<script src='{% static "js/bootstrap.min.js" %}'></script>
{% 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>
{{ block.super }}
<script src='{% static "js/jquery.magnific-popup.js" %}'></script>
<script src='{% static "js/build/home_page.js" %}'></script>
{% endblock %}

@ -1,4 +1,5 @@
<!doctype html>{% load staticfiles %}
<!doctype html>
{% load staticfiles %}
{#{% load compress %}#}
<html lang="ru">
<head>
@ -14,7 +15,6 @@
{# {% compress css %}#}
{% block old_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/font-awesome.min.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 "lib/jquery.fileupload/css/jquery.fileupload.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/extra.css" %}'> <!-- Our additional CSS -->
{% endblock %}
{% block common_css %}
<link rel='stylesheet' href='{% static "css/bootstrap.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 %}
{% block head_css %}
@ -98,14 +99,37 @@
<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-jgrowl/jquery.jgrowl.min.js" %}'></script>
<script src='{% static "my-libs.js" %}'></script>
<script src='{% static "js/main.js" %}'></script> <!-- Файл верстальщика -->
<script src='{% static "index.js" %}'></script> <!-- Файл программистов -->
{% endblock %}
{% block ws_block %}
<script src='{% static "lib/jquery-jgrowl/jquery.jgrowl.min.js" %}'></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 domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
@ -130,12 +154,18 @@
sock.onmessage = function (event) {
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 = "";
if (notificationData.answer_type == 'add_message_contact') {
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')) {
outMessage += "<a href='/chat/#order" + notificationData.order_id + "'>" + notificationData.msg + "<a>";
}
console.log("Вам пришло новое сообщение!<br />" + outMessage);
$.jGrowl("Вам пришло новое сообщение!<br />" + outMessage, {life: 15000});
};
this.add_message = function (messageData) {
@ -147,6 +177,8 @@
var userId = '{{ request.user.pk }}';
if (userId) {
var socketMain = new SocketHandlerMain(userId);
var open_order_list = [];
getOpenOrdersList();
}
</script>
{% endblock %}

@ -3,6 +3,7 @@
{% 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 %}
@ -11,71 +12,56 @@
{% 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">
<header>
<div class="container">
<div class="row">
<div class="col-lg-3">
<a href="/"><div class="logo"></div></a>
<div class="logo">
<a href="/">
<img src="{% static 'img/logo.png' %}">
</a>
</div>
{% activeurl %}
{% if request.user.is_authenticated %}
<div class="col-lg-7">
<ul class="mainMenu">
<li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
<span></span>
</li>
<div class="user-nav">
<ul class="user-items">
{% if request.user.is_contractor %}
<li class="officeList icon_tml">
<a href="{% url 'users:contractor-office' %}">
Мой офис {% count_new_message_orders request.user %}
<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>
<span></span>
</div>
</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>
<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 %}
</ul>
</div>
</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 %}
<div class="col-lg-7">
<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>
</div>
<img src="{% static 'img/profile.jpg' %}" alt="profile-image">
{% endif %}
{% endactiveurl %}
{% if request.user.is_authenticated %}
<div class="col-lg-2">
{% if request.user.is_contractor %}
{% contractor_indicator request.user %}
</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"
@ -103,11 +89,12 @@
Профиль<span></span>
</a>
</li>
<li class="icon_mm3">
<a href="{% url 'chat:chat-user' %}">Сообщения<span></span>
<li class="icon_chat">
<a href="{% url 'chat:chat-user' %}">Сообщения<span></span></a>
{% if request.user %}
{% count_new_message request.user %}
{% endif %}</a>
<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>
@ -115,49 +102,84 @@
<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">
</li>
<li>
{% 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">
{% contractor_indicator request.user %}
{% 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">
{% 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 %}
</div>
</li>
</ul>
</div> <!--// user-nav -->
{% activeurl %}
<div class="menu-nav">
<ul class="menu-items">
{% if request.user.is_authenticated %}
<li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
</li>
</div>
{% if request.user.is_contractor %}
<li class="icon_tml">
<a href="{% url 'users:contractor-office' %}">
Мой офис {% count_new_message_orders request.user %}
</a>
</li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a>
</li>
{% endif %}
{% if request.user.is_customer %}
<li class="icon_tm2">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
</li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a>
</li>
{% endif %}
{% else %}
<div class="col-lg-2">
<a href="{% url 'registration_register' %}" class="reg">Регистрация</a>
<a href="{% url 'auth_login' %}"><div class="lock"></div></a>
</div>
<li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
</li>
<li class="icon_tm2">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
</li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a>
</li>
{% endif %}
</ul>
</div>
{% endactiveurl %}
</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
height: 3px
background-color: black
ul
margin: 0
padding: 0
.logoF
@ -89,3 +92,6 @@ footer
font-family: 'Arial-MT-Regular', sans-serif
color: #6c6c6c
font-size: 15px
&:hover
text-decoration: none
color: #383838

@ -1,134 +1,190 @@
$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
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
%icons
content: ''
display: inline-block
vertical-align: middle
margin-right: 5px
background-size: cover
header
font-size: 11pt
ul
padding-left: 0
margin: 0
background-color: #000
color: #FFF
.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
height: 75px
display: flex
align-items: center
.mainMenu
float: left
margin: 26px 0 0 0
.menu-nav
display: flex
justify-content: center
//align-items: center
height: 75px
a, a:hover
color: #FFF
text-decoration: none
padding-left: 4px
.menu-items
display: inline-flex
.count
display: inline-block
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
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
display: flex
align-items: center
height: 75px
margin-right: 20px
cursor: pointer
border-bottom: 3px solid black
pointer-events: stroke
.icon_tm1 a:before
@extend %icons
width: 26px
//background: url('../img/listMain.png') no-repeat left
background-size: cover
height: 26px
background: url('#{$static}/img/listMain.png') no-repeat 0 0
.icon_tm2 span
.icon_tm2 a:before
@extend %icons
width: 22px
background-size: cover
height: 22px
background: url('#{$static}/img/listMain.png') no-repeat -26px 0
.icon_tm3 span
.icon_tm3 a:before
@extend %icons
width: 24px
background-size: cover
height: 24px
background: url('#{$static}/img/listMain.png') no-repeat -48px 0
.icon_tml span
content: ''
position: absolute
.icon_tml a:before
@extend %icons
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
background: url('#{$static}/img/list4.png') no-repeat center
.icon_tm1:hover span
width: 26px
background: url('#{$static}/img/listMain2.png') no-repeat left !important
.icon_tml a:hover
border-bottom: 3px solid red
&:before
background: url('#{$static}/img/list4tml.png') no-repeat center
background-size: cover
background-position: 0 0 !important
.icon_tm2:hover span
.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: url('#{$static}/img/listMain2.png') no-repeat left !important
background-size: cover
background-position: -26px 0 !important
background: url('#{$static}/img/listMain2.png') no-repeat -26px 0
.icon_tm3:hover span
width: 26px !important
background: url('#{$static}/img/listMain2.png') no-repeat left !important
.icon_tm3 a:hover
border-bottom: 3px solid red
&:before
background:
image: url('#{$static}/img/listMain2.png')
repeat: no-repeat
position: -50px 0
background-size: cover
background-position: -49px 0 !important
.user-nav
float: right
height: 75px
.user-items
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
.rating
width: 46px
height: 46px
.lock
width: 75px
height: 75px
background: url('#{$static}/img/lock.png') no-repeat center, white
float: right
border-radius: 100%
background-color: #4D4D4D
margin: 15px 0 0 10px
cursor: pointer
margin-left: 20px
margin-right: 0
.rating
display: flex
align-items: center
position: relative
cursor: pointer
margin-left: 10px
.ratingInset
width: 46px
height: 46px
border-radius: 100%
background-color: #FF0027
position: absolute
display: inline-block
/* position: absolute; */
/* left: -1.859px; */
/* bottom: 3px; */
clip: rect(0, 22px, 50px, 0)
transform: rotate(-90deg)
.iconRating
width: 100%
height: 100%
width: 46px
height: 46px
position: absolute
left: 0
top: 0
@ -138,143 +194,10 @@ $static: '/static'
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
float: right
margin-right: -15px
background-color: rgba(0, 0, 0, 0.7)
&a
&:link,
&:visited
background: url('#{$static}/img/button2.png') no-repeat 27px, white
color: black
padding: 24px 26px 20px 72px
.changeBlock
p
font-family: 'Arial-MT-Regular', sans-serif
.changeBlock1
p
color: white
.changeBlock2
p
color: black
.changeBlock
min-height: 500px
display: table
padding: 143px 20px 120px 20px
&:after
content: ''
position: absolute
width: 66px
height: 1px
left: 50%
margin-left: -30px
background-color: white
bottom: 60px
.changeBlock2
float: right
margin-right: -15px
background-color: rgba(0, 0, 0, 0.7)
.square
width: 46px
height: 46px
position: absolute
right: -23px
top: 100px
z-index: 9
-webkit-transform: rotate(135deg)
-moz-transform: rotate(135deg)
transform: rotate(135deg)
background-color: #DCDCDD
.insetSquare
width: 100%
height: 100%
position: relative
-webkit-transform: rotate(-135deg)
-moz-transform: rotate(-135deg)
transform: rotate(-135deg)
background: url('#{$static}/img/arrow.png') no-repeat center
.imgProfile
width: 75px
height: 75px
float: right
margin: 0 0 0 -60px
img
display: block
width: 100%
height: 100%
margin: 0
padding-left: 8px
.infoProfile
float: right
.btn-group
.btn
width: 75px
@ -303,6 +226,7 @@ li.officeList.icon_tml > a > p
padding: 30px 20px 15px 40px
border-top: 3px solid #ff2c2c
li
display: block
margin-bottom: 10px
&:last-child
margin-bottom: 0
@ -358,6 +282,23 @@ li.officeList.icon_tml > a > p
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_chat a
display: inline-block
.circle
background-color: red
border-radius: 50%
width: 30px
height: 30px
line-height: 30px
display: inline-block
text-align: center
.icon_mm1 a:hover span
height: 20px
background: url('#{$static}/img/menu2.png') no-repeat center !important
@ -391,3 +332,9 @@ li.officeList.icon_tml > a > p
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">
<p class="titleScore">Регистрация </p>
</div>
<div class="form-regestration">
<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/inc-registration_form.html' %}
{% include 'partials/footer.html' %}
</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="ratingInset" style="clip:rect(0px, {{ current_indicator_px }}px, 50px, 0px);"></div>
<div class="iconRating"></div>
<p class="ratingPer">{{ current_indicator }}%</p>
</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 users.helpers import get_projects_grouped
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)
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()
try:
team = user.team
@ -58,9 +63,13 @@ def count_new_message_orders(context, user):
team = None
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()
new_count += new_count_team
if new_count > 99:
new_count = '99+'
return {
'new_count': new_count,
}
@ -74,7 +83,10 @@ def get_new_count_message(team_pk,user=None):
@register.simple_tag
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
@ -114,13 +126,16 @@ def get_customer_chat_open_projects(user):
@register.filter
def get_project_message_count(user):
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']
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'):
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

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

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

@ -14,6 +14,8 @@ module.exports = {
//worksell
create_worksell: "./assets/js/src/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/components/custom-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 %}
{% block content %}
{% include 'partials/modals/project_work_type_suggestion.html' %}
{% include 'partials/modals/modal-registration_form.html' %}
{% include 'partials/header.html' %}
<div class="container main-scope">
<div class="row title-scope">
@ -73,6 +61,7 @@
<div class="" id="select-box-1"></div>
</div>
<div class="col-lg-3">
<div class="header">&nbsp;</div>
<div href="#" onclick="return false" data-toggle="modal"
data-target="#projectWorkTypeSuggestionModal"
class="btn btn-simple btn-plus">Нет нужной специальности хочу добавить
@ -192,18 +181,54 @@
</div>
</div>
<div class="row top-line">
<div id="is_customer"
{% if request.user.is_authenticated and request.user.is_contractor %}
{% else %}
style="display: none"
{% endif %}>
<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 id="not_customer"
{% if not request.user.is_authenticated or request.user.is_customer %}
{% else %}
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>
<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>
</form>
</div>

@ -6,7 +6,7 @@ import pydash as _;
_.map = _.map_;
_.filter = _.filter_
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.contrib import messages
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.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 .forms import WorkSellForm, WorkSellFilterForm, ContractorWorkSellTrashForm
from .serialize import serialize
from .response import JSONResponse, response_mimetype
from archilance.mixins import BaseMixin
class PictureCreateView(CreateView):
@ -174,11 +177,17 @@ class WorkSellCreateView(BaseMixin, View):
work_type_suggestion_form = ProjectWorkTypeSuggestionForm
template_name = 'worksell_create.html'
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_contractor():
return super().dispatch(request, *args, **kwargs)
else:
raise PermissionDenied
# def dispatch(self, request, *args, **kwargs):
# if request.user.is_authenticated() and request.user.is_contractor():
# return super().dispatch(request, *args, **kwargs)
# else:
# 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):
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
@ -207,10 +216,15 @@ class WorkSellCreateView(BaseMixin, View):
else:
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():
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()
form.save_m2m()

Loading…
Cancel
Save