PR-9 Главная страница - модификация

Изменен дизайн главной страницы
Добавлена возможность создания проектов/работ без регистрации
Поправлены размеры "серых" блоков
remotes/origin/PR-9
booblegum 9 years ago
parent e556d365b5
commit bcc9953a74
  1. 5
      README.md
  2. 8
      api/views.py
  3. 12
      archilance/local.py
  4. 2
      archilance/settings/base.py
  5. 7
      archilance/views.py
  6. BIN
      assets/fonts/MyriadPro/MyriadPro-Bold.otf
  7. BIN
      assets/fonts/MyriadPro/MyriadPro-BoldCond.otf
  8. BIN
      assets/fonts/MyriadPro/MyriadPro-BoldCondIt.otf
  9. BIN
      assets/fonts/MyriadPro/MyriadPro-BoldIt.otf
  10. BIN
      assets/fonts/MyriadPro/MyriadPro-Cond.otf
  11. BIN
      assets/fonts/MyriadPro/MyriadPro-CondIt.otf
  12. BIN
      assets/fonts/MyriadPro/MyriadPro-It.otf
  13. BIN
      assets/fonts/MyriadPro/MyriadPro-Regular.otf
  14. BIN
      assets/fonts/MyriadPro/MyriadPro-Semibold.otf
  15. BIN
      assets/fonts/MyriadPro/MyriadPro-SemiboldIt.otf
  16. BIN
      assets/images/Thumbs.db
  17. BIN
      assets/img/main.jpg
  18. BIN
      assets/img/main.png
  19. 0
      assets/img/old_main.jpg
  20. BIN
      assets/img/sprite.png
  21. BIN
      assets/img/youtube.png
  22. 103
      assets/js/build/create_project.js
  23. 110
      assets/js/build/create_worksell.js
  24. 81
      assets/js/build/home_page.js
  25. 60
      assets/js/build/init_create_worksell.js
  26. 60
      assets/js/build/init_customer_project_create.js
  27. 2
      assets/js/src/create_worksell.js
  28. 2
      assets/js/src/customer_project_create.js
  29. 5
      assets/js/src/home_page.js
  30. 67
      assets/js/src/seeds/ajax_registration.js
  31. 12
      assets/js/src/seeds/popup-youtube.js
  32. 17
      assets/js/src/seeds/send_data.js
  33. 7
      assets/lib/proekton-components/sass/parts/_selected-container.sass
  34. 25
      assets/sass/base/_fonts.sass
  35. 4
      assets/sass/components/custom-components.sass
  36. 22
      assets/sass/main.sass
  37. 20
      assets/sass/modules/_mods.sass
  38. 16
      common/forms.py
  39. 39
      common/mixins.py
  40. 4
      common/views.py
  41. 46
      projects/templates/customer_project_create.html
  42. 34
      projects/views.py
  43. 215
      templates/home.html
  44. 3
      templates/partials/inc-captcha.html
  45. 61
      templates/partials/inc-registration_form.html
  46. 19
      templates/partials/modals/modal-registration_form.html
  47. 5
      templates/partials/sass/footer.sass
  48. 104
      templates/partials/sass/header.sass
  49. 160
      templates/partials/sass/home.sass
  50. 119
      templates/partials/sass/registration.sass
  51. 70
      templates/registration/registration_form.html
  52. 100
      templates/trash/home.html
  53. 2
      webpack.config.js
  54. 70
      work_sell/templates/worksell_create.html
  55. 32
      work_sell/views.py

@ -101,3 +101,8 @@ python manage.py generate_reviews
```
----------------------------------------
## Local smtp debug server
```
sudo python3 -m smtpd -n -c DebuggingServer localhost:25
```

@ -169,9 +169,11 @@ class RealtyViewSet(ModelViewSet):
@list_route(methods=['get'])
def current_user(self, request, *args, **kwargs):
queryset = self.queryset.filter(user=self.request.user)
serialiser = self.serializer_class(queryset, many=True)
return Response(serialiser.data)
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

@ -339,6 +339,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 +378,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):

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 MiB

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);

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

@ -1,4 +1,4 @@
$static : '/static'
$static: '/static'
@font-face
font-family: 'pfbeausanspro-reg'
@ -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-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)

@ -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,21 +41,6 @@ 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
@ -67,6 +54,7 @@ body
.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

@ -46,13 +46,15 @@ class CustomRegistrationForm(RegistrationFormTermsOfService):
captcha = ReCaptchaField()
def __init__(self, *args, **kwargs):
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'
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

@ -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')

@ -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">
@ -349,17 +349,45 @@
</div>
</div> <!-- slide -->
<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 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">
<input style="width: 100%" type="submit" class="btn btn-simple"
value="РАЗМЕСТИТЬ ЗАКАЗ">
</div>
<div class="col-lg-3 col-lg-offset-6" style="text-align: center">
<input style="width: 100%" type="button" class="btn btn-simple"
value="ПРЕДВАРИТЕЛЬНЫЙ ПРОСМОТР">
</div>
</div>
<div 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 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 -->

@ -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_
@ -490,11 +491,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))
@ -513,7 +521,7 @@ class CustomerProjectCreateView(BaseMixin, View):
def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, request=request) # Passing `request.FILES` seems unnecessary here. Files are added manually below
print('POST = ', request.POST)
# print('POST = ', request.POST)
form.is_valid()
realty = form.cleaned_data.get('realty')
@ -524,7 +532,12 @@ class CustomerProjectCreateView(BaseMixin, View):
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()
@ -537,8 +550,7 @@ class CustomerProjectCreateView(BaseMixin, View):
realty_form.save()
else:
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'):
realty.is_virtual = True
realty.name = request.POST.get('new_realty_name')
@ -566,6 +578,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)

@ -1,100 +1,145 @@
{% 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="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">
{% include 'partials/header.html' %}
<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="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>
</li>
<li>
<div class="icon-2"></div>
<div class="text">
Удобный и быстрый поиск исполнителей
</div>
</li>
<li>
<div class="icon-3"></div>
<div class="text">
Готовые сформированные группы исполнителей
</div>
</li>
<li>
<div class="icon-4"></div>
<div class="text">
Безопасная сделка (договор без риска)
</div>
</li>
<li>
<div class="icon-5"></div>
<div class="text">
Адекватная оценка стоимости работы
</div>
</li>
<li>
<div class="icon-6"></div>
<div class="text">
Возможность купить готовые проекты, работы
</div>
</li>
</ul>
</p>
</div>
<div class="square">
<div class="insetSquare"></div>
</div>
</div>
<div class="col-lg-6">
<div class="changeBlock changeBlock1">
<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>
</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>
<a class="create" href="{% url 'work_sell:create' %}">Добавить проект</a>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<a class="popup-youtube youtube" href="{{ main_settings.video_code }}">
</a>
</div>
</div>
</div>
</div>
{% include 'partials/footer.html' %}
{% 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>
<script src='{% static "js/jquery.magnific-popup.js" %}'></script>
<script src='{% static "js/build/home_page.js" %}'></script>
{% endblock %}

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

@ -88,4 +88,7 @@ footer
&:link, &:visited
font-family: 'Arial-MT-Regular', sans-serif
color: #6c6c6c
font-size: 15px
font-size: 15px
&:hover
text-decoration: none
color: #383838

@ -1,4 +1,4 @@
$static: '/static'
@import "base/variavles"
.wrTop
width: 100%
@ -170,98 +170,22 @@ li.officeList.icon_tml > a > p
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
.reg, .reg:link, .reg:visited
color: #fb1818
font-size: 16px
text-transform: uppercase
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
line-height: 75px
font-family: 'pfdintextcomppro-regular', sans-serif
letter-spacing: 4px
.changeBlock2
.lock
width: 75px
height: 75px
background: url('#{$static}/img/lock.png') no-repeat center, white
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
cursor: pointer
margin: 0 -25px 0 0
.imgProfile
width: 75px

@ -0,0 +1,160 @@
@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
.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: 18pt
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

@ -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 %}

@ -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">
@ -132,7 +120,7 @@
style="position: absolute; top: -1000px; left: -1000px">
<div class="preview-container">
<div class="btn close file-upload-remove-img-btn">&times;</div>
{# <div class="file-upload-remove-img-btn"></div>#}
{# <div class="file-upload-remove-img-btn"></div>#}
<div class="preview"></div>
<textarea name="img_description" rows="2" data-limit-rows="true"
class="description"></textarea>
@ -192,17 +180,53 @@
</div>
</div>
<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 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">
<input style="width: 100%" type="submit" class="btn btn-simple"
value="РАЗМЕСТИТЬ ЗАКАЗ">
</div>
<div class="col-lg-3 col-lg-offset-6" style="text-align: center">
<input style="width: 100%" type="button" class="btn btn-simple"
onclick="addMessage('Функционал временно не работает', 'info')"
value="ПРЕДВАРИТЕЛЬНЫЙ ПРОСМОТР">
</div>
</div>
<div 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 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