Merge branch 'PR-16'

remotes/origin/PR-9
booblegum 9 years ago
commit e556d365b5
  1. 6
      api/urls.py
  2. 10
      api/views.py
  3. BIN
      assets/img/aui-icon-close.png
  4. BIN
      assets/img/close-img-icon.png
  5. 173
      assets/js/build/create_project.js
  6. 318
      assets/js/build/create_worksell.js
  7. 1908
      assets/js/build/init_create_worksell.js
  8. 80
      assets/js/build/init_customer_project_create.js
  9. 13
      assets/js/src/create_worksell.js
  10. 7
      assets/js/src/customer_project_create.js
  11. 104
      assets/js/src/init_create_worksell.js
  12. 2
      assets/js/src/init_customer_project_create.js
  13. 28
      assets/js/src/seeds/file_upload.js
  14. 69
      assets/js/src/seeds/image_upload.js
  15. 43
      assets/js/src/seeds/popups.js
  16. 10
      assets/js/src/seeds/scroll_on_required.js
  17. 6
      assets/js/src/seeds/send_data.js
  18. 16
      assets/js/src/seeds/textareas_max-rows.js
  19. 36
      assets/js/src/utils.js
  20. 2
      assets/lib/proekton-components/js/src/SelectedContainerCreate.js
  21. 10
      assets/lib/proekton-components/js/src/base/AbsBaseSelect.js
  22. 9
      assets/lib/proekton-components/sass/parts/_selected-container.sass
  23. 4
      assets/sass/common/_parts.sass
  24. 34
      assets/sass/components/custom-components.sass
  25. 14
      common/serializers.py
  26. 2
      projects/forms.py
  27. 20
      projects/migrations/0050_auto_20161207_1637.py
  28. 2
      projects/models.py
  29. 51
      projects/templates/customer_project_create.html
  30. 3
      projects/views.py
  31. 34
      templates/partials/base.html
  32. 8
      templates/partials/inc-message-popup.html
  33. 59
      templates/partials/sass/header.sass
  34. 28
      templates/partials/sass/popups.sass
  35. 46
      users/templates/contractor_profile.html
  36. 2
      users/templates/user_profile_edit.html
  37. 7
      webpack.config.js
  38. 3
      work_sell/admin.py
  39. 57
      work_sell/forms.py
  40. 30
      work_sell/migrations/0020_auto_20161207_0034.py
  41. 27
      work_sell/migrations/0021_auto_20161207_1210.py
  42. 37
      work_sell/migrations/0022_auto_20161207_1213.py
  43. 20
      work_sell/migrations/0023_worksellphoto_description.py
  44. 26
      work_sell/models.py
  45. 279
      work_sell/templates/worksell_create.html
  46. 7
      work_sell/urls.py
  47. 109
      work_sell/views.py

@ -5,6 +5,7 @@ from .views import (
ContractorResumeFilesViewSet, ContractorResumeFilesViewSet,
ContractorResumeViewSet, ContractorResumeViewSet,
DocumentViewSet, DocumentViewSet,
ElFormatViewSet,
LocationViewSet, LocationViewSet,
LocationViewSetFlat, LocationViewSetFlat,
MessageViewSet, MessageViewSet,
@ -29,9 +30,12 @@ from .views import (
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r'answers', AnswerViewSet) router.register(r'answers', AnswerViewSet)
router.register(r'building_classifications', BuildingClassificationViewSet)
router.register(r'construction_type', ConstructionTypeViewSet)
router.register(r'contractorresume', ContractorResumeViewSet) router.register(r'contractorresume', ContractorResumeViewSet)
router.register(r'contractorresumefiles', ContractorResumeFilesViewSet) router.register(r'contractorresumefiles', ContractorResumeFilesViewSet)
router.register(r'documents', DocumentViewSet) router.register(r'documents', DocumentViewSet)
router.register(r'el_format', ElFormatViewSet)
router.register(r'locations', LocationViewSet) router.register(r'locations', LocationViewSet)
router.register(r'locations_flat', LocationViewSetFlat) router.register(r'locations_flat', LocationViewSetFlat)
router.register(r'message', MessageViewSet, base_name='Message') router.register(r'message', MessageViewSet, base_name='Message')
@ -41,8 +45,6 @@ router.register(r'portfolio-photos', PortfolioPhotoViewSet)
router.register(r'portfolios', PortfolioViewSet) router.register(r'portfolios', PortfolioViewSet)
router.register(r'projects', ProjectViewSet) router.register(r'projects', ProjectViewSet)
router.register(r'realties', RealtyViewSet) router.register(r'realties', RealtyViewSet)
router.register(r'building_classifications', BuildingClassificationViewSet)
router.register(r'construction_type', ConstructionTypeViewSet)
router.register(r'reviews', ReviewViewSet) router.register(r'reviews', ReviewViewSet)
router.register(r'specializations', SpecializationViewSet) router.register(r'specializations', SpecializationViewSet)
router.register(r'specializations_flat', SpecializationViewSetFlat) router.register(r'specializations_flat', SpecializationViewSetFlat)

@ -11,7 +11,7 @@ from chat.models import Message, Notes, Documents, NewMessage
from chat.serializers import MessageSerializer, NoteSerializer, DocumentsSerializer from chat.serializers import MessageSerializer, NoteSerializer, DocumentsSerializer
from common.filters import LocationFilterSet from common.filters import LocationFilterSet
from common.models import Location from common.models import Location
from common.serializers import LocationSerializer, LocationSerializerFlat from common.serializers import LocationSerializer, LocationSerializerFlat, ElFormatSerializer
from projects.filters import ( from projects.filters import (
ProjectFilterSet, RealtyFilterSet, StageFilterSet, PortfolioFilterSet, OrderFilterSet, ProjectFilterSet, RealtyFilterSet, StageFilterSet, PortfolioFilterSet, OrderFilterSet,
PortfolioPhotoFilterSet, AnswerFilterSet, BuildingClassficationFilterSet, ConstructionTypeFilterSet PortfolioPhotoFilterSet, AnswerFilterSet, BuildingClassficationFilterSet, ConstructionTypeFilterSet
@ -33,7 +33,7 @@ from users.models import User, ContractorResumeFiles, ContractorResume, Team
from users.serializers import UserSerializer, ContractorResumeFilesSerializer, ContractorResumeSerializer, \ from users.serializers import UserSerializer, ContractorResumeFilesSerializer, ContractorResumeSerializer, \
TeamSerializer TeamSerializer
from work_sell.filters import WorkSellFilterSet, WorkSellPhotoFilterSet from work_sell.filters import WorkSellFilterSet, WorkSellPhotoFilterSet
from work_sell.models import WorkSell, WorkSellPhoto from work_sell.models import WorkSell, WorkSellPhoto, ElFormat
from work_sell.serializers import WorkSellSerializer, WorkSellPhotoSerializer from work_sell.serializers import WorkSellSerializer, WorkSellPhotoSerializer
@ -230,6 +230,12 @@ class LocationViewSetFlat(ModelViewSet):
filter_class = LocationFilterSet filter_class = LocationFilterSet
class ElFormatViewSet(ModelViewSet):
queryset = ElFormat.objects.all().order_by('name')
serializer_class = ElFormatSerializer
# filter_class = LocationFilterSet
class PortfolioPagination(PageNumberPagination): class PortfolioPagination(PageNumberPagination):
page_size = settings.API_PAGE_SIZE # Default page size page_size = settings.API_PAGE_SIZE # Default page size
page_size_query_param = 'page_size' # Provide custom page size through a query param page_size_query_param = 'page_size' # Provide custom page size through a query param

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

@ -48,19 +48,19 @@
var _file_upload = __webpack_require__(1); var _file_upload = __webpack_require__(1);
var _file_upload2 = _interopRequireDefault(_file_upload); var _extended_field = __webpack_require__(3);
var _extended_field = __webpack_require__(2); var _custom_check = __webpack_require__(4);
var _custom_check = __webpack_require__(3); var _read_more = __webpack_require__(5);
var _read_more = __webpack_require__(4); var _only_one_checkbox = __webpack_require__(6);
var _only_one_checkbox = __webpack_require__(5); var _popups = __webpack_require__(7);
var _test_seeds = __webpack_require__(6); var _scroll_on_required = __webpack_require__(8);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _test_seeds = __webpack_require__(9);
function showHideRealry() { function showHideRealry() {
var check = $('#checkbox-sb-realty'); var check = $('#checkbox-sb-realty');
@ -75,40 +75,29 @@
} }
$(function () { $(function () {
(0, _file_upload2.default)(); (0, _file_upload.fileUploadInit)();
(0, _extended_field.extendedFieldInit)(); (0, _extended_field.extendedFieldInit)();
(0, _custom_check.customCheckInit)(); (0, _custom_check.customCheckInit)();
showHideRealry(); showHideRealry();
(0, _read_more.readMoreInit)(); (0, _read_more.readMoreInit)();
(0, _only_one_checkbox.onlyOneCheckboxInit)('#safe', '#by_agreement'); (0, _only_one_checkbox.onlyOneCheckboxInit)('#safe', '#by_agreement');
(0, _scroll_on_required.scrollOnRequiredInit)();
(0, _popups.showPopupsInit)();
window.addMessage = _popups.addMessage;
}); });
/***/ }, /***/ },
/* 1 */ /* 1 */
/***/ function(module, exports) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
Object.defineProperty(exports, "__esModule", { Object.defineProperty(exports, "__esModule", {
value: true value: true
}); });
exports.default = fileUploadInit; exports.fileUploadInit = undefined;
function humanFileSize(bytes, si) {
var thresh = si ? 1000 : 1024;
if (Math.abs(bytes) < thresh) return bytes + ' B';
var units = si ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
var u = -1;
do {
bytes /= thresh;
++u;
} while (Math.abs(bytes) >= thresh && u < units.length - 1);
return bytes.toFixed(1) + ' ' + units[u]; var _utils = __webpack_require__(2);
}
function fileUploadInit() { function fileUploadInit() {
var $fileUploadContainer = $('#fileUploadContainer'); var $fileUploadContainer = $('#fileUploadContainer');
@ -123,7 +112,7 @@
var filePath = $fileInput.val().replace(/\\/g, '/'); var filePath = $fileInput.val().replace(/\\/g, '/');
var fileName = path.basename(filePath); var fileName = path.basename(filePath);
//var fileExt = path.extname(filePath) //var fileExt = path.extname(filePath)
var fileSize = $fileInput.get(0).files && humanFileSize($fileInput.get(0).files[0].size); var fileSize = $fileInput.get(0).files && (0, _utils.humanFileSize)($fileInput.get(0).files[0].size);
if (fileName) { if (fileName) {
$fileUploadWidget.find('.file-upload-label').text(fileName + ' ' + fileSize); $fileUploadWidget.find('.file-upload-label').text(fileName + ' ' + fileSize);
@ -141,19 +130,60 @@
var $btn = $(this); var $btn = $(this);
$btn.closest('.file-upload-widget').remove(); $btn.closest('.file-upload-widget').remove();
}); });
$fileUploadContainer.on('click', '.existing-file-remove-btn', function ($evt) {
var $btn = $(this);
$btn.closest('.existing-file-widget').remove();
});
} }
exports.fileUploadInit = fileUploadInit;
/***/ }, /***/ },
/* 2 */ /* 2 */
/***/ function(module, exports) { /***/ function(module, exports) {
'use strict'; 'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == name + '=') {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
function humanFileSize(bytes, si) {
var thresh = si ? 1000 : 1024;
if (Math.abs(bytes) < thresh) return bytes + ' B';
var units = si ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
var u = -1;
do {
bytes /= thresh;
++u;
} while (Math.abs(bytes) >= thresh && u < units.length - 1);
return bytes.toFixed(1) + ' ' + units[u];
}
exports.humanFileSize = humanFileSize;
exports.getCookie = getCookie;
/***/ },
/* 3 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", { Object.defineProperty(exports, "__esModule", {
value: true value: true
}); });
@ -179,7 +209,7 @@
exports.extendedFieldInit = extendedFieldInit; exports.extendedFieldInit = extendedFieldInit;
/***/ }, /***/ },
/* 3 */ /* 4 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -208,7 +238,7 @@
exports.customCheckInit = customCheckInit; exports.customCheckInit = customCheckInit;
/***/ }, /***/ },
/* 4 */ /* 5 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -234,7 +264,7 @@
exports.readMoreInit = readMoreInit; exports.readMoreInit = readMoreInit;
/***/ }, /***/ },
/* 5 */ /* 6 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -265,7 +295,80 @@
exports.onlyOneCheckboxInit = onlyOneCheckboxInit; exports.onlyOneCheckboxInit = onlyOneCheckboxInit;
/***/ }, /***/ },
/* 6 */ /* 7 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function showMessage(container, template, message, type) {
var $popup = $(template);
$popup.hide();
$popup.find('.message').html(message);
$popup.addClass(type);
container.append($popup);
$popup.fadeIn(1000, function () {
setTimeout(function (el) {
$(el).fadeOut(1000);
}, 2000, this);
});
}
function addMessage(message, type) {
var $popups_storage = $('#popups-storage');
var li = '<li class="' + type + '">' + message + '</li>';
$popups_storage.append(li);
}
function showPopupsInit() {
var $popups_storage = $('#popups-storage');
var $popups_container = $('#popups-container');
var $popup = $popups_container.find(".popup");
var popup_html = $popup[0].outerHTML;
$popup.remove();
if (!$popups_storage.length) return;
$.each($popups_storage.find("li"), function (key, value) {
var message = $(value).html();
var type = $(value).attr('class');
showMessage($popups_container, popup_html, message, type);
$(value).remove();
});
$popups_storage.bind("DOMNodeInserted", function () {
var $li = $(this).find('li');
var message = $li.html();
var type = $li.attr('class');
$li.remove();
showMessage($popups_container, popup_html, message, type);
});
}
exports.showPopupsInit = showPopupsInit;
exports.addMessage = addMessage;
/***/ },
/* 8 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function scrollOnRequiredInit() {
var $required = $('.required.error');
// console.log($required);
if (!$required.length) return;
$('html, body').animate({
scrollTop: $required.offset().top - 25
}, 1000);
}
exports.scrollOnRequiredInit = scrollOnRequiredInit;
/***/ },
/* 9 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";

@ -0,0 +1,318 @@
/******/ (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 _file_upload = __webpack_require__(1);
var _image_upload = __webpack_require__(10);
var _scroll_on_required = __webpack_require__(8);
var _popups = __webpack_require__(7);
$(function () {
// fileUploadInit();
// previewImg();
(0, _image_upload.imageUploadInit)();
(0, _scroll_on_required.scrollOnRequiredInit)();
(0, _popups.showPopupsInit)();
window.addMessage = _popups.addMessage;
});
/***/ },
/* 1 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.fileUploadInit = undefined;
var _utils = __webpack_require__(2);
function fileUploadInit() {
var $fileUploadContainer = $('#fileUploadContainer');
$('#fileUploadAddBtn').on('click', function ($evt) {
$fileUploadContainer.find('.file-upload-widget').last().find('.file-upload-input').click();
});
$fileUploadContainer.on('change', '.file-upload-input', function ($evt) {
var $fileInput = $(this);
var $fileUploadWidget = $fileInput.closest('.file-upload-widget');
var filePath = $fileInput.val().replace(/\\/g, '/');
var fileName = path.basename(filePath);
//var fileExt = path.extname(filePath)
var fileSize = $fileInput.get(0).files && (0, _utils.humanFileSize)($fileInput.get(0).files[0].size);
if (fileName) {
$fileUploadWidget.find('.file-upload-label').text(fileName + ' ' + fileSize);
var $newFileUploadWidget = $fileUploadWidget.clone();
$newFileUploadWidget.find('.file-upload-label').text('');
$fileUploadContainer.find('ul').first().append($newFileUploadWidget);
$fileUploadWidget.css('display', 'block');
}
});
$fileUploadContainer.on('click', '.file-upload-remove-btn', function ($evt) {
var $btn = $(this);
$btn.closest('.file-upload-widget').remove();
});
}
exports.fileUploadInit = fileUploadInit;
/***/ },
/* 2 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == name + '=') {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
function humanFileSize(bytes, si) {
var thresh = si ? 1000 : 1024;
if (Math.abs(bytes) < thresh) return bytes + ' B';
var units = si ? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] : ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
var u = -1;
do {
bytes /= thresh;
++u;
} while (Math.abs(bytes) >= thresh && u < units.length - 1);
return bytes.toFixed(1) + ' ' + units[u];
}
exports.humanFileSize = humanFileSize;
exports.getCookie = getCookie;
/***/ },
/* 3 */,
/* 4 */,
/* 5 */,
/* 6 */,
/* 7 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function showMessage(container, template, message, type) {
var $popup = $(template);
$popup.hide();
$popup.find('.message').html(message);
$popup.addClass(type);
container.append($popup);
$popup.fadeIn(1000, function () {
setTimeout(function (el) {
$(el).fadeOut(1000);
}, 2000, this);
});
}
function addMessage(message, type) {
var $popups_storage = $('#popups-storage');
var li = '<li class="' + type + '">' + message + '</li>';
$popups_storage.append(li);
}
function showPopupsInit() {
var $popups_storage = $('#popups-storage');
var $popups_container = $('#popups-container');
var $popup = $popups_container.find(".popup");
var popup_html = $popup[0].outerHTML;
$popup.remove();
if (!$popups_storage.length) return;
$.each($popups_storage.find("li"), function (key, value) {
var message = $(value).html();
var type = $(value).attr('class');
showMessage($popups_container, popup_html, message, type);
$(value).remove();
});
$popups_storage.bind("DOMNodeInserted", function () {
var $li = $(this).find('li');
var message = $li.html();
var type = $li.attr('class');
$li.remove();
showMessage($popups_container, popup_html, message, type);
});
}
exports.showPopupsInit = showPopupsInit;
exports.addMessage = addMessage;
/***/ },
/* 8 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function scrollOnRequiredInit() {
var $required = $('.required.error');
// console.log($required);
if (!$required.length) return;
$('html, body').animate({
scrollTop: $required.offset().top - 25
}, 1000);
}
exports.scrollOnRequiredInit = scrollOnRequiredInit;
/***/ },
/* 9 */,
/* 10 */
/***/ function(module, exports, __webpack_require__) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.imageUploadInit = undefined;
var _utils = __webpack_require__(2);
// function previewImg() {
// let $fileUploadWidgets = $('.file-upload-widget');
// $.each($fileUploadWidgets, function (ind, el) {
// let $fileImg = $(el).find('img');
// let $fileInput = $(el).find('.file-upload-input');
// // console.log("$fileInput[0].files.length = ", $fileInput[0].files.length);
// // console.log("$fileInput.val() = ", $fileInput.val());
// console.log("$fileInput = ", $fileInput);
// if ($fileInput[0].files.length) {
// console.log("Попытка загрузить файл");
// let reader = new FileReader();
// reader.onload = function (e) {
// $fileImg.attr('src', e.target.result);
// };
//
// reader.readAsDataURL($fileInput[0].files[0]);
// }
// })
// }
function imageUploadInit() {
var $fileUploadContainer = $('#fileUploadContainer');
$('#fileUploadAddBtn').on('click', function ($evt) {
$fileUploadContainer.find('.file-upload-widget').last().find('.file-upload-input').click();
});
$fileUploadContainer.on('change', '.file-upload-input', function ($evt) {
var $fileInput = $(this);
var $fileUploadWidget = $fileInput.closest('.file-upload-widget');
var $fileImg = $fileUploadWidget.find('.preview');
var filePath = $fileInput.val().replace(/\\/g, '/');
var fileName = path.basename(filePath);
var fileSize = $fileInput.get(0).files && (0, _utils.humanFileSize)($fileInput.get(0).files[0].size);
console.log("file path", filePath);
console.log("file path2 ", $fileInput[0].files[0]);
if (fileName) {
$fileUploadWidget.find('.file-upload-label').text(fileName + ' ' + fileSize);
var $newFileUploadWidget = $fileUploadWidget.clone();
$newFileUploadWidget.find('.file-upload-label').text('');
$fileUploadContainer.find('.list-new-new').append($newFileUploadWidget);
$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]);
}
}
});
$fileUploadContainer.on('click', '.file-upload-remove-img-btn', function ($evt) {
var $btn = $(this);
$btn.closest('.file-upload-widget').remove();
});
} //TODO: оформить Upload'еры в виде классов
exports.imageUploadInit = imageUploadInit;
// export {imageUploadInit, previewImg}
/***/ }
/******/ ]);

File diff suppressed because it is too large Load Diff

@ -46,27 +46,27 @@
'use strict'; 'use strict';
var _SelectedContainer = __webpack_require__(7); var _SelectedContainer = __webpack_require__(11);
var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer); var _SelectedContainer2 = _interopRequireDefault(_SelectedContainer);
var _SelectedContainerCreate = __webpack_require__(11); var _SelectedContainerCreate = __webpack_require__(15);
var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate); var _SelectedContainerCreate2 = _interopRequireDefault(_SelectedContainerCreate);
var _NoTreeSelect = __webpack_require__(12); var _NoTreeSelect = __webpack_require__(16);
var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect); var _NoTreeSelect2 = _interopRequireDefault(_NoTreeSelect);
var _TreeSelect = __webpack_require__(14); var _TreeSelect = __webpack_require__(18);
var _TreeSelect2 = _interopRequireDefault(_TreeSelect); var _TreeSelect2 = _interopRequireDefault(_TreeSelect);
var _SingleTreeSelect = __webpack_require__(15); var _SingleTreeSelect = __webpack_require__(19);
var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect); var _SingleTreeSelect2 = _interopRequireDefault(_SingleTreeSelect);
var _SelectOrCreate = __webpack_require__(16); var _SelectOrCreate = __webpack_require__(20);
var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate); var _SelectOrCreate2 = _interopRequireDefault(_SelectOrCreate);
@ -76,7 +76,7 @@
function createSpecs(url) { function createSpecs(url) {
// SPECIALIZATIONS // SPECIALIZATIONS
var sb_main = new _TreeSelect2.default($('#select-box-1'), { url: url, visible: true, required: true }); var sb_main = new _TreeSelect2.default($('#select-box-1'), { url: url, visible: true, required: true });
sb_main.setHeader("Специальность"); // sb_main.setHeader("Специальность");
var select_container = new _SelectedContainer2.default($('#selected-spec'), { var select_container = new _SelectedContainer2.default($('#selected-spec'), {
obj: sb_main, obj: sb_main,
onlyOne: true onlyOne: true
@ -174,19 +174,15 @@
if (!sb_realty_top.dataTree.data.length) sb_realty_top.hide(); if (!sb_realty_top.dataTree.data.length) sb_realty_top.hide();
}); });
select_realty.on("add", function (args) { select_realty.on("add", function (args) {
// console.log("add args = ", args);
console.log('on add');
//TODO: Костыли!!! //TODO: Костыли!!!
$('#checkbox-sb-realty').prop("checked", true); $('#checkbox-sb-realty').prop("checked", true);
sb_realty.show(); sb_realty.show();
var id = args[0]; var id = args[0];
if (id.text) return; if (id.text) return;
console.log("id = ", id);
var el = sb_realty.dataTree.getElementById(id); var el = sb_realty.dataTree.getElementById(id);
sb_realty_top.$searchInput.val(el.name); sb_realty_top.$searchInput.val(el.name);
sb_realty_top.selectedEl.id = id; sb_realty_top.selectedEl.id = id;
sb_realty_top.selectedEl.value = el.name; sb_realty_top.selectedEl.value = el.name;
// sb_realty_top.show();
sb_realty.selectedEl.id = id; sb_realty.selectedEl.id = id;
sb_realty._fillBoxes(); sb_realty._fillBoxes();
}); });
@ -212,7 +208,11 @@
/* 4 */, /* 4 */,
/* 5 */, /* 5 */,
/* 6 */, /* 6 */,
/* 7 */ /* 7 */,
/* 8 */,
/* 9 */,
/* 10 */,
/* 11 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -227,15 +227,15 @@
var _desc, _value, _class; // ` var _desc, _value, _class; // `
var _DataTree = __webpack_require__(8); var _DataTree = __webpack_require__(12);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
var _NoTreeData = __webpack_require__(9); var _NoTreeData = __webpack_require__(13);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
var _decorators = __webpack_require__(10); var _decorators = __webpack_require__(14);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -466,7 +466,7 @@
exports.default = SelectedContainer; exports.default = SelectedContainer;
/***/ }, /***/ },
/* 8 */ /* 12 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -621,7 +621,7 @@
exports.default = DataTree; exports.default = DataTree;
/***/ }, /***/ },
/* 9 */ /* 13 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -677,7 +677,7 @@
exports.default = NoTreeData; exports.default = NoTreeData;
/***/ }, /***/ },
/* 10 */ /* 14 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -761,7 +761,7 @@
// export {onBind}; // export {onBind};
/***/ }, /***/ },
/* 11 */ /* 15 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -777,11 +777,11 @@
var _desc, _value, _class; var _desc, _value, _class;
var _SelectedContainer2 = __webpack_require__(7); var _SelectedContainer2 = __webpack_require__(11);
var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2); var _SelectedContainer3 = _interopRequireDefault(_SelectedContainer2);
var _decorators = __webpack_require__(10); var _decorators = __webpack_require__(14);
var _decorators2 = _interopRequireDefault(_decorators); var _decorators2 = _interopRequireDefault(_decorators);
@ -844,7 +844,7 @@
this._removeById(this.elements_id[0]); this._removeById(this.elements_id[0]);
this.elements_id = [0]; this.elements_id = [0];
this.$input_id = this.$self.find('input[type="hidden"].-id'); this.$input_id = this.$self.find('input[type="hidden"].-id');
this.$input_id.val(); this.$input_id.val("");
this.$input_name = this.$self.find('input[type="hidden"].-name'); this.$input_name = this.$self.find('input[type="hidden"].-name');
this.$input_name.val(_id.text); this.$input_name.val(_id.text);
this.$self.append(_SelectedContainer3.default.getTemplate("", _id.text, 0)); this.$self.append(_SelectedContainer3.default.getTemplate("", _id.text, 0));
@ -862,7 +862,7 @@
exports.default = SelectedContainerCreate; exports.default = SelectedContainerCreate;
/***/ }, /***/ },
/* 12 */ /* 16 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -876,9 +876,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(13); var _AbsBaseSelect2 = __webpack_require__(17);
var _NoTreeData = __webpack_require__(9); var _NoTreeData = __webpack_require__(13);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);
@ -945,7 +945,7 @@
exports.default = NoTreeSelect; exports.default = NoTreeSelect;
/***/ }, /***/ },
/* 13 */ /* 17 */
/***/ function(module, exports) { /***/ function(module, exports) {
"use strict"; "use strict";
@ -1086,7 +1086,7 @@
var selectBox = this.hasEditableContainer ? tmpl_selectBoxEditCont() : tmpl_selectBox(); var selectBox = this.hasEditableContainer ? tmpl_selectBoxEditCont() : tmpl_selectBox();
classes = classes ? classes.join(" ") : ""; classes = classes ? classes.join(" ") : "";
return htmlTemplate({ return htmlTemplate({
header: "TestHeader", selectBox: selectBox, required: this.required, id: this.containerId, classes: classes, header: "", selectBox: selectBox, required: this.required, id: this.containerId, classes: classes,
tmpl_selectBoxOptions: tmpl_selectBoxOptions, tmpl_selectBoxResults: tmpl_selectBoxResults tmpl_selectBoxOptions: tmpl_selectBoxOptions, tmpl_selectBoxResults: tmpl_selectBoxResults
}); });
} }
@ -1139,7 +1139,8 @@
value: function setHeader(header) { value: function setHeader(header) {
if (this.$header) { if (this.$header) {
this.$header.html(header); this.$header.find('.header').html(header);
this.$header.show();
} else { } else {
this.header = header; this.header = header;
} }
@ -1192,8 +1193,9 @@
this.$container.replaceWith(template); this.$container.replaceWith(template);
this.$selectBox = $("#" + this.containerId); this.$selectBox = $("#" + this.containerId);
this.$header = this.$selectBox.find('.select-box-header .header'); this.$header = this.$selectBox.find('.select-box-header');
this.$header.html(this.header); this.$header.find('.header').html(this.header);
if (!this.header) this.$header.hide();
this.$resultsBox = this.$selectBox.find('.select-box-results'); this.$resultsBox = this.$selectBox.find('.select-box-results');
this.$optionsBox = this.$selectBox.find('.select-box-options'); this.$optionsBox = this.$selectBox.find('.select-box-options');
this.$searchInput = this.$selectBox.find('input.select-box-search'); this.$searchInput = this.$selectBox.find('input.select-box-search');
@ -1487,7 +1489,7 @@
exports.AbsBaseSelect = AbsBaseSelect; exports.AbsBaseSelect = AbsBaseSelect;
/***/ }, /***/ },
/* 14 */ /* 18 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1501,9 +1503,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(13); var _AbsBaseSelect2 = __webpack_require__(17);
var _DataTree = __webpack_require__(8); var _DataTree = __webpack_require__(12);
var _DataTree2 = _interopRequireDefault(_DataTree); var _DataTree2 = _interopRequireDefault(_DataTree);
@ -1612,7 +1614,7 @@
exports.default = TreeSelect; exports.default = TreeSelect;
/***/ }, /***/ },
/* 15 */ /* 19 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1624,9 +1626,9 @@
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _AbsBaseSelect = __webpack_require__(13); var _AbsBaseSelect = __webpack_require__(17);
var _TreeSelect2 = __webpack_require__(14); var _TreeSelect2 = __webpack_require__(18);
var _TreeSelect3 = _interopRequireDefault(_TreeSelect2); var _TreeSelect3 = _interopRequireDefault(_TreeSelect2);
@ -1707,7 +1709,7 @@
exports.default = SingleTreeSelect; exports.default = SingleTreeSelect;
/***/ }, /***/ },
/* 16 */ /* 20 */
/***/ function(module, exports, __webpack_require__) { /***/ function(module, exports, __webpack_require__) {
'use strict'; 'use strict';
@ -1721,9 +1723,9 @@
var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } }; var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
var _AbsBaseSelect2 = __webpack_require__(13); var _AbsBaseSelect2 = __webpack_require__(17);
var _NoTreeData = __webpack_require__(9); var _NoTreeData = __webpack_require__(13);
var _NoTreeData2 = _interopRequireDefault(_NoTreeData); var _NoTreeData2 = _interopRequireDefault(_NoTreeData);

@ -0,0 +1,13 @@
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'
$(function () {
// fileUploadInit();
// previewImg();
imageUploadInit();
scrollOnRequiredInit();
showPopupsInit();
window.addMessage = addMessage;
});

@ -1,8 +1,10 @@
import fileUploadInit from './seeds/file_upload' import {fileUploadInit} from './seeds/file_upload'
import {extendedFieldInit} from './seeds/extended_field' import {extendedFieldInit} from './seeds/extended_field'
import {customCheckInit} from './seeds/custom_check' import {customCheckInit} from './seeds/custom_check'
import {readMoreInit} from './seeds/read_more' import {readMoreInit} from './seeds/read_more'
import {onlyOneCheckboxInit} from './seeds/only_one_checkbox' import {onlyOneCheckboxInit} from './seeds/only_one_checkbox'
import {showPopupsInit, addMessage} from './seeds/popups'
import {scrollOnRequiredInit} from './seeds/scroll_on_required'
import {print} from './seeds/test_seeds' import {print} from './seeds/test_seeds'
function showHideRealry() { function showHideRealry() {
@ -24,4 +26,7 @@ $(function () {
showHideRealry(); showHideRealry();
readMoreInit(); readMoreInit();
onlyOneCheckboxInit('#safe', '#by_agreement'); onlyOneCheckboxInit('#safe', '#by_agreement');
scrollOnRequiredInit();
showPopupsInit();
window.addMessage = addMessage;
}); });

@ -0,0 +1,104 @@
import SelectedContainer from 'components/SelectedContainer';
import SelectedContainerCreate from 'components/SelectedContainerCreate';
import NoTreeSelect from 'components/NoTreeSelect';
import TreeSelect from 'components/TreeSelect';
import SingleTreeSelect from 'components/SingleTreeSelect'
import SelectOrCreate from 'components/SelectOrCreate'
$(function () {
function createSpecs(url) {
// SPECIALIZATIONS
let sb_main = new TreeSelect($('#select-box-1'), {url, visible: true, required: true});
// sb_main.setHeader("Тип готовой работы");
let select_container = new SelectedContainer($('#selected-spec'),
{
obj: sb_main,
});
sb_main.connectSelectedContainer(select_container);
let sb_1 = new TreeSelect($('#select-box-2'), {obj: sb_main});
let sb_2 = new TreeSelect($('#select-box-3'), {obj: sb_main});
let sb_3 = new TreeSelect($('#select-box-4'), {obj: sb_main});
let sb_4 = new TreeSelect($('#select-box-5'), {obj: sb_main});
// select_container.on("add", () => {
// let $container = $('#spec-value');
// $container.html($('#selected-spec').find(".selected-element").find(".name").html());
// });
sb_main.setNearbySelectBox(sb_1);
sb_1.setNearbySelectBox(sb_2, sb_main);
sb_2.setNearbySelectBox(sb_3, sb_1);
sb_3.setNearbySelectBox(sb_4, sb_2);
sb_4.setNearbySelectBox("", sb_3);
}
function createBuildingClass(url) {
// BUILDING-CLASSIFICATION
sb_build_main = new TreeSelect($('#sb-building-classification'), {url, visible: true});
sb_build_main.setHeader("Классификация здания");
let sb_build_1 = new TreeSelect($('#sb-building-sub-classification'), {obj: sb_build_main});
let select_build_container = new SelectedContainer($('#selected-building-classification'),
{
obj: sb_build_main,
onlyOne: true
});
sb_build_main.connectSelectedContainer(select_build_container);
sb_build_main.setNearbySelectBox(sb_build_1);
sb_build_1.setNearbySelectBox("", sb_build_main);
}
function createConstructionType(url) {
sb_constr_main = new NoTreeSelect($('#sb-construction-type'), {url, visible: true});
sb_constr_main.setHeader("Вид строительства");
let select_constr_type = new SelectedContainer($('#selected-construction-type'), {
obj: sb_constr_main,
noTree: true,
onlyOne: true
});
sb_constr_main.connectSelectedContainer(select_constr_type);
}
function createLocations(url) {
sb_loc_main = new TreeSelect($('#sb-location-1'), {url, visible: true});
sb_loc_main.setHeader("Проектное местоположение");
let select_loc = new SelectedContainer($('#selected-location'),
{
obj: sb_loc_main,
onlyOne: true
});
sb_loc_main.connectSelectedContainer(select_loc);
let sb_loc_1 = new TreeSelect($('#sb-location-2'), {obj: sb_loc_main});
let sb_loc_2 = new TreeSelect($('#sb-location-3'), {obj: sb_loc_main});
sb_loc_main.setNearbySelectBox(sb_loc_1);
sb_loc_1.setNearbySelectBox(sb_loc_2, sb_loc_main);
sb_loc_2.setNearbySelectBox("", sb_loc_1);
}
function createFormat(url) {
let sb_format_main = new NoTreeSelect($('#sb-format'), {url, visible: true});
sb_format_main.setHeader("Формат электронной версии");
let select_format = new SelectedContainer($('#selected-format'), {
obj: sb_format_main,
noTree: true,
// onlyOne: true
});
sb_format_main.connectSelectedContainer(select_format);
}
let sb_loc_main, sb_constr_main, sb_build_main;
createSpecs('/api/specializations_flat');
createBuildingClass('/api/building_classifications');
createConstructionType('/api/construction_type');
createLocations('/api/locations_flat');
createFormat('/api/el_format');
// createRealty('/api/realties/current_user')
});

@ -9,7 +9,7 @@ $(function () {
function createSpecs(url) { function createSpecs(url) {
// SPECIALIZATIONS // SPECIALIZATIONS
let sb_main = new TreeSelect($('#select-box-1'), {url, visible: true, required: true}); let sb_main = new TreeSelect($('#select-box-1'), {url, visible: true, required: true});
sb_main.setHeader("Специальность"); // sb_main.setHeader("Специальность");
let select_container = new SelectedContainer($('#selected-spec'), let select_container = new SelectedContainer($('#selected-spec'),
{ {
obj: sb_main, obj: sb_main,

@ -1,24 +1,6 @@
function humanFileSize(bytes, si) { import {humanFileSize} from '../utils'
var thresh = si ? 1000 : 1024;
if (Math.abs(bytes) < thresh) function fileUploadInit() {
return bytes + ' B';
var units = si
? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
var u = -1;
do {
bytes /= thresh;
++u
} while (Math.abs(bytes) >= thresh && u < units.length - 1);
return bytes.toFixed(1) + ' ' + units[u]
}
export default function fileUploadInit() {
var $fileUploadContainer = $('#fileUploadContainer'); var $fileUploadContainer = $('#fileUploadContainer');
$('#fileUploadAddBtn').on('click', function ($evt) { $('#fileUploadAddBtn').on('click', function ($evt) {
@ -50,8 +32,6 @@ export default function fileUploadInit() {
$btn.closest('.file-upload-widget').remove() $btn.closest('.file-upload-widget').remove()
}); });
$fileUploadContainer.on('click', '.existing-file-remove-btn', function ($evt) {
var $btn = $(this);
$btn.closest('.existing-file-widget').remove()
});
} }
export {fileUploadInit}

@ -0,0 +1,69 @@
//TODO: оформить Upload'еры в виде классов
import {humanFileSize} from '../utils'
// function previewImg() {
// let $fileUploadWidgets = $('.file-upload-widget');
// $.each($fileUploadWidgets, function (ind, el) {
// let $fileImg = $(el).find('img');
// let $fileInput = $(el).find('.file-upload-input');
// // console.log("$fileInput[0].files.length = ", $fileInput[0].files.length);
// // console.log("$fileInput.val() = ", $fileInput.val());
// console.log("$fileInput = ", $fileInput);
// if ($fileInput[0].files.length) {
// console.log("Попытка загрузить файл");
// let reader = new FileReader();
// reader.onload = function (e) {
// $fileImg.attr('src', e.target.result);
// };
//
// reader.readAsDataURL($fileInput[0].files[0]);
// }
// })
// }
function imageUploadInit() {
var $fileUploadContainer = $('#fileUploadContainer');
$('#fileUploadAddBtn').on('click', function ($evt) {
$fileUploadContainer.find('.file-upload-widget').last().find('.file-upload-input').click()
});
$fileUploadContainer.on('change', '.file-upload-input', function ($evt) {
var $fileInput = $(this);
var $fileUploadWidget = $fileInput.closest('.file-upload-widget');
let $fileImg = $fileUploadWidget.find('.preview');
var filePath = $fileInput.val().replace(/\\/g, '/');
var fileName = path.basename(filePath);
var fileSize = $fileInput.get(0).files && humanFileSize($fileInput.get(0).files[0].size);
console.log("file path", filePath);
console.log("file path2 ", $fileInput[0].files[0]);
if (fileName) {
$fileUploadWidget.find('.file-upload-label').text(fileName + ' ' + fileSize);
var $newFileUploadWidget = $fileUploadWidget.clone();
$newFileUploadWidget.find('.file-upload-label').text('');
$fileUploadContainer.find('.list-new-new').append($newFileUploadWidget);
$fileUploadWidget.css('display', 'block');
if ($fileImg.length) {
let reader = new FileReader();
reader.onload = function (e) {
$fileImg.css('background-image', 'url('+e.target.result +')');
};
reader.readAsDataURL($fileInput[0].files[0]);
}
}
});
$fileUploadContainer.on('click', '.file-upload-remove-img-btn', function ($evt) {
var $btn = $(this);
$btn.closest('.file-upload-widget').remove()
});
}
export {imageUploadInit}
// export {imageUploadInit, previewImg}

@ -0,0 +1,43 @@
function showMessage(container, template, message, type) {
let $popup = $(template);
$popup.hide();
$popup.find('.message').html(message);
$popup.addClass(type);
container.append($popup);
$popup.fadeIn(1000, function () {
setTimeout(function (el) {
$(el).fadeOut(1000);
}, 2000, this)
});
}
function addMessage(message, type) {
const $popups_storage = $('#popups-storage');
let li = `<li class="${type}">${message}</li>`;
$popups_storage.append(li);
}
function showPopupsInit() {
const $popups_storage = $('#popups-storage');
const $popups_container = $('#popups-container');
let $popup = $popups_container.find(".popup");
let popup_html = $popup[0].outerHTML;
$popup.remove();
if (!$popups_storage.length) return;
$.each($popups_storage.find("li"), function (key, value) {
let message = $(value).html();
let type = $(value).attr('class');
showMessage($popups_container, popup_html, message, type);
$(value).remove();
});
$popups_storage.bind("DOMNodeInserted", function () {
let $li = $(this).find('li');
let message = $li.html();
let type = $li.attr('class');
$li.remove();
showMessage($popups_container, popup_html, message, type);
});
}
export {showPopupsInit, addMessage}

@ -0,0 +1,10 @@
function scrollOnRequiredInit() {
let $required = $('.required.error');
// console.log($required);
if (!$required.length) return;
$('html, body').animate({
scrollTop: $required.offset().top - 25
}, 1000);
}
export {scrollOnRequiredInit}

@ -0,0 +1,6 @@
function sendData(){
$.ajax({
url: '',
})
}

@ -0,0 +1,16 @@
function textareasMaxRowsInit() {
$('textarea[data-limit-rows=true]')
.on('keypress', function (event) {
console.log("work");
var textarea = $(this),
text = textarea.val(),
numberOfLines = (text.match(/\n/g) || []).length + 1,
maxRows = parseInt(textarea.attr('rows'));
if (event.which === 13 && numberOfLines === maxRows) {
return false;
}
});
}
export {textareasMaxRowsInit}

@ -0,0 +1,36 @@
function getCookie(name) {
var cookieValue = null;
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i < cookies.length; i++) {
var cookie = jQuery.trim(cookies[i]);
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
function humanFileSize(bytes, si) {
var thresh = si ? 1000 : 1024;
if (Math.abs(bytes) < thresh)
return bytes + ' B';
var units = si
? ['kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
: ['KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB'];
var u = -1;
do {
bytes /= thresh;
++u
} while (Math.abs(bytes) >= thresh && u < units.length - 1);
return bytes.toFixed(1) + ' ' + units[u]
}
export {humanFileSize, getCookie}

@ -14,7 +14,7 @@ export default class SelectedContainerCreate extends SelectedContainer {
this._removeById(this.elements_id[0]); this._removeById(this.elements_id[0]);
this.elements_id = [0]; this.elements_id = [0];
this.$input_id = this.$self.find('input[type="hidden"].-id'); this.$input_id = this.$self.find('input[type="hidden"].-id');
this.$input_id.val(); this.$input_id.val("");
this.$input_name = this.$self.find('input[type="hidden"].-name'); this.$input_name = this.$self.find('input[type="hidden"].-name');
this.$input_name.val(_id.text); this.$input_name.val(_id.text);
this.$self.append(SelectedContainer.getTemplate("", _id.text, 0)); this.$self.append(SelectedContainer.getTemplate("", _id.text, 0));

@ -143,7 +143,7 @@ export default class AbsBaseSelect {
let selectBox = this.hasEditableContainer ? tmpl_selectBoxEditCont() : tmpl_selectBox(); let selectBox = this.hasEditableContainer ? tmpl_selectBoxEditCont() : tmpl_selectBox();
classes = classes ? classes.join(" ") : ""; classes = classes ? classes.join(" ") : "";
return htmlTemplate({ return htmlTemplate({
header: "TestHeader", selectBox, required: this.required, id: this.containerId, classes, header: "", selectBox, required: this.required, id: this.containerId, classes,
tmpl_selectBoxOptions, tmpl_selectBoxResults tmpl_selectBoxOptions, tmpl_selectBoxResults
}) })
} }
@ -224,7 +224,8 @@ export default class AbsBaseSelect {
setHeader(header) { setHeader(header) {
if (this.$header) { if (this.$header) {
this.$header.html(header) this.$header.find('.header').html(header);
this.$header.show();
} else { } else {
this.header = header this.header = header
} }
@ -273,8 +274,9 @@ export default class AbsBaseSelect {
this.$container.replaceWith(template); this.$container.replaceWith(template);
this.$selectBox = $(`#${this.containerId}`); this.$selectBox = $(`#${this.containerId}`);
this.$header = this.$selectBox.find('.select-box-header .header'); this.$header = this.$selectBox.find('.select-box-header');
this.$header.html(this.header); this.$header.find('.header').html(this.header);
if (!this.header) this.$header.hide();
this.$resultsBox = this.$selectBox.find('.select-box-results'); this.$resultsBox = this.$selectBox.find('.select-box-results');
this.$optionsBox = this.$selectBox.find('.select-box-options'); this.$optionsBox = this.$selectBox.find('.select-box-options');
this.$searchInput = this.$selectBox.find('input.select-box-search'); this.$searchInput = this.$selectBox.find('input.select-box-search');

@ -38,7 +38,10 @@
.horizontal .horizontal
&.selected-container &.selected-container
display: inline-block //display: inline-block
max-width: 300px
.header, .name .header, .name
max-width: 300px //max-width: 300px
display: inline-block
.selected-element
max-width: 300px
display: inline-block

@ -19,4 +19,6 @@
.required .required
font: font:
size: 10pt size: 10pt
color: #9f9f9f color: #9f9f9f
&.error
color: red

@ -20,7 +20,7 @@ label
margin-bottom: -1px margin-bottom: -1px
&:-webkit-autofill &:-webkit-autofill
-webkit-box-shadow: 0 0 0 1000px white inset -webkit-box-shadow: 0 0 0 1000px white inset
//transition: background-color 5000s ease-in-out 0s //transition: background-color 5000s ease-in-out 0s
&.icon-rub &.icon-rub
background: background:
image: url("#{$static}/img/rub.png") image: url("#{$static}/img/rub.png")
@ -209,15 +209,39 @@ textarea.description
color: darkgray color: darkgray
.file-upload-remove-btn .file-upload-remove-btn
display: inline-block display: inline-block
//position: absolute
width: 11px width: 11px
height: 11px height: 11px
background: url('#{$static}/img/delDoc.png') no-repeat center background: url('#{$static}/img/delDoc.png') no-repeat center
//background-size: cover
//right: -20px !important
//top: 2px
cursor: pointer cursor: pointer
.preview-container
position: relative
//display: inline-block
.file-upload-remove-img-btn
position: absolute
top: 0
right: 0
background-color: white
//width: 16px
//height: 16px
//background: url('#{$static}/img/aui-icon-close.png') no-repeat center
cursor: pointer
textarea.description
font-size: 9pt
color: darkgray
resize: vertical
max-height: 68px
.file-upload-widget
.preview
width: 100%
height: 200px
background:
repeat: no-repeat
position-x: center
position-y: center
size: cover
.complete .complete
display: none display: none

@ -2,6 +2,7 @@ from django.contrib.contenttypes.models import ContentType
from rest_framework.serializers import ModelSerializer from rest_framework.serializers import ModelSerializer
from .models import Location from .models import Location
from work_sell.models import ElFormat
class NestedLocationSerializer(ModelSerializer): class NestedLocationSerializer(ModelSerializer):
@ -64,6 +65,19 @@ class LocationSerializerFlat(ModelSerializer):
'parent') 'parent')
class ElFormatSerializer(ModelSerializer):
# children = NestedLocationSerializerFlat(many=True)
# parent = NestedLocationSerializerFlat()
class Meta:
model = Location
fields = (
'id',
'name',
)
class ContentTypeSerializer(ModelSerializer): class ContentTypeSerializer(ModelSerializer):
class Meta: class Meta:
model = ContentType model = ContentType

@ -191,7 +191,7 @@ class CustomerProjectEditFormNew(forms.ModelForm):
# self.fields['realty'].queryset = self.request.user.realties.all() # self.fields['realty'].queryset = self.request.user.realties.all()
# self.fields['budget'].required = False self.fields['text'].required = True
# self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() # self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants()
# self.fields['specialization'].queryset = Specialization.objects # Migrate with this enabled # self.fields['specialization'].queryset = Specialization.objects # Migrate with this enabled

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-12-07 13:37
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0049_auto_20161201_2157'),
]
operations = [
migrations.AlterField(
model_name='project',
name='budget',
field=models.DecimalField(blank=True, decimal_places=0, default=0, max_digits=10),
),
]

@ -105,7 +105,7 @@ class Project(models.Model, HitCountMixin):
state = models.CharField(default='active', max_length=20, choices=STATES) state = models.CharField(default='active', max_length=20, choices=STATES)
specialization = TreeForeignKey(Specialization, related_name='projects') specialization = TreeForeignKey(Specialization, related_name='projects')
budget = models.DecimalField(max_digits=10, decimal_places=0) budget = models.DecimalField(max_digits=10, decimal_places=0, default=0, blank=True)
budget_by_agreement = models.BooleanField(default=False) budget_by_agreement = models.BooleanField(default=False)
currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES) currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES)

@ -33,8 +33,8 @@
<div class="simple-field"> <div class="simple-field">
<div class="header">Название заказа</div> <div class="header">Название заказа</div>
<i class="fa fa-question-circle-o" aria-hidden="true"></i> <i class="fa fa-question-circle-o" aria-hidden="true"></i>
<span class="required">Обязательно</span> <span class="required {% if form.name.errors %}error{% endif %}">Обязательно</span>
<input value="{{ form.name.value }}" name="{{ form.name.html_name }}" <input value="{{ form.name.value }}" name="name"
class="simple-input italic" class="simple-input italic"
placeholder="Пример: Дизайн квартиры, Армирование фундамента, Конструкции перекрытия и т.д." placeholder="Пример: Дизайн квартиры, Армирование фундамента, Конструкции перекрытия и т.д."
autocomplete="off" autocomplete="off"
@ -47,6 +47,9 @@
</div> </div>
<div class="row vertical-child mod-align-bottom"> <div class="row vertical-child mod-align-bottom">
<div class="col-lg-9"> <div class="col-lg-9">
<div class="header">Специальность</div>
<i class="fa fa-question-circle-o" aria-hidden="true"></i>
<span class="required {% if form.specialization.errors %}error{% endif %}">Обязательно</span>
<div class="" id="select-box-1"></div> <div class="" id="select-box-1"></div>
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
@ -85,18 +88,19 @@
<div style="margin-top: 45px" class="row"> <div style="margin-top: 45px" class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<div class="simple-field"> <div class="simple-field">
<div class="header">Подобно опишите задание для / <div class="header">Подробно опишите задание для /
<span class="select-text" id="spec-value"></span> <span class="select-text" id="spec-value"></span>
</div> </div>
<i class="fa fa-question-circle-o" aria-hidden="true" title=""></i> <i class="fa fa-question-circle-o" aria-hidden="true" title=""></i>
<span class="required">Обязательно</span> <span class="required {% if form.text.errors %}error{% endif %}">Обязательно</span>
<textarea class="description" rows="6" placeholder= <textarea name="text" class="description" rows="6"
" Пример №1 placeholder=
" Пример №1
Разработать архиьектурные решения для жилого дома на основании эскизной проработки Разработать архиьектурные решения для жилого дома на основании эскизной проработки
Пример №2 Пример №2
Разработать проект по електроснабжению и освещению гаража"></textarea> Разработать проект по електроснабжению и освещению гаража">{{ form.text.value }}</textarea>
</div> </div>
<div class="documentsChat mod" id="fileUploadContainer"> <div class="documentsChat mod" id="fileUploadContainer">
@ -343,23 +347,32 @@
</div> <!-- //bottom block --> </div> <!-- //bottom block -->
</div> </div>
</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>
<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> <!-- slide --> </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>
<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>
</form> </form>
</div> <!-- content --> </div> <!-- content -->
</div> </div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
<ul id="popups-storage" hidden>
{% if form.errors %}
<li class="error">Форма заполнена неполностью</li>
{% endif %}
{# <li class="info">Message-1</li>#}
{# <li class="warning">Message-1</li>#}
</ul>
{% include 'partials/inc-message-popup.html' %}
</div> </div>
{% endblock %} {% endblock %}

@ -513,7 +513,7 @@ class CustomerProjectCreateView(BaseMixin, View):
def post(self, request, *args, **kwargs): 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 form = self.form_class(request.POST, request=request) # Passing `request.FILES` seems unnecessary here. Files are added manually below
print('POST = ', request.POST)
form.is_valid() form.is_valid()
realty = form.cleaned_data.get('realty') realty = form.cleaned_data.get('realty')
@ -538,6 +538,7 @@ class CustomerProjectCreateView(BaseMixin, View):
else: else:
realty = realty_form.save(commit=False) realty = realty_form.save(commit=False)
realty.user = request.user realty.user = request.user
print('new_realty_name = ', request.POST.get('new_realty_name'))
if not request.POST.get('new_realty_name'): if not request.POST.get('new_realty_name'):
realty.is_virtual = True realty.is_virtual = True
realty.name = request.POST.get('new_realty_name') realty.name = request.POST.get('new_realty_name')

@ -51,25 +51,27 @@
</head> </head>
<body> <body>
{% if messages %}
{% for message in messages %}
<div class="c"
style="position: relative; padding: 10px; margin-bottom: 6px; z-index: 100">{{ message|safe }}</div>
{% endfor %}
{% endif %}
{% if TEMPLATE_DEBUG %} {% if TEMPLATE_DEBUG %}
<div ondblclick="$(this).css('display', 'none')" {% if messages %}
style="position: absolute; left: 0; bottom: 0; padding: 6px; color: black; background-color: {% if request.user.is_contractor %}#BADA55{% else %}#C0FFEE{% endif %}; z-index: 50"> {% for message in messages %}
{{ request.user }}<br> <div class="c"
style="position: relative; padding: 10px; margin-bottom: 6px; z-index: 100">{{ message|safe }}</div>
{% if request.user.is_authenticated %} {% endfor %}
<b>PK:</b> {{ request.user.pk }}<br> {% endif %}
<b>Groups:</b> {{ request.user.groups.all }}
{% endif %}
</div>
{% endif %} {% endif %}
{#{% if TEMPLATE_DEBUG %}#}
{# <div ondblclick="$(this).css('display', 'none')"#}
{# style="position: absolute; left: 0; bottom: 0; padding: 6px; color: black; background-color: {% if request.user.is_contractor %}#BADA55{% else %}#C0FFEE{% endif %}; z-index: 50">#}
{# {{ request.user }}<br>#}
{##}
{# {% if request.user.is_authenticated %}#}
{# <b>PK:</b> {{ request.user.pk }}<br>#}
{# <b>Groups:</b> {{ request.user.groups.all }}#}
{# {% endif %}#}
{# </div>#}
{#{% endif %}#}
{% block content %}{% endblock %} {% block content %}{% endblock %}
{% block common_js %} {% block common_js %}

@ -0,0 +1,8 @@
{% load sass_tags %}
<link rel='stylesheet' href='{% sass_src "partials/sass/popups.sass" %}'>
<div class="popups-container" id="popups-container">
<div style="display: none" class="popup">
<div class="message">
</div>
</div>
</div>

@ -74,6 +74,20 @@ $static: '/static'
background-size: cover background-size: cover
background: url('#{$static}/img/listMain.png') no-repeat -48px 0 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 .icon_tm1:hover span
width: 26px width: 26px
background: url('#{$static}/img/listMain2.png') no-repeat left !important background: url('#{$static}/img/listMain2.png') no-repeat left !important
@ -92,6 +106,42 @@ $static: '/static'
background-size: cover background-size: cover
background-position: -49px 0 !important 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 .mainMenu li
&:last-child &:last-child
padding-right: 0 padding-right: 0
@ -111,6 +161,15 @@ $static: '/static'
&.icon_tm3.active span &.icon_tm3.active span
background: url('#{$static}/img/listMain2.png') no-repeat right !important 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 .changeBlock
width: 485px width: 485px
overflow: hidden overflow: hidden

@ -0,0 +1,28 @@
.popups-container
width: 100%
position: fixed
top: 0
left: 0
opacity: 0.8
.popup
width: 100%
min-height: 50px
background-color: #7a8529
border-radius: 20px
border: 1px solid #ffffff
display: flex
-ms-flex-align: center
-webkit-align-items: center
-webkit-box-align: center
align-items: center
//text-align: center
.message
color: white
width: 100%
text-align: center
&.warning
background-color: #ffc649
&.error
background-color: #ff4146
&.info
background-color: #4e58ff

@ -247,43 +247,25 @@
</div> </div>
</div> </div>
<div id="tab12" class="tab-pane fade"> <div id="tab12" class="tab-pane fade">
{% if contractor.pk == request.user.pk %} {% if contractor.pk == request.user.pk %}
<div class="col-lg-9"> <div class="col-lg-9">
<p class="addWork"> <p class="addWork">
<a href="#" data-toggle="modal" data-target="#worksell-modal">Добавить проект</a> <a href="{% url 'work_sell:create'%}">Добавить проект</a>
</p> </p>
</div> </div>
<div id="worksell-modal" class="modal fade"> {# <div id="worksell-modal" class="modal fade">#}
<div class="modal-dialog" style="width: 900px;"> {# <div class="modal-dialog" style="width: 900px;">#}
<div class="modal-content"> {# <div class="modal-content">#}
<div class="modal-header"> {# <div class="modal-header">#}
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> {# <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>#}
<h4 class="modal-title">Добавить готовую работу</h4> {# <h4 class="modal-title">Добавить готовую работу</h4>#}
</div> {# </div>#}
{##}
{% include 'worksell_create_form.html' %} {# {% include 'worksell_create_form.html' %}#}
</div> {# </div>#}
</div> {# </div>#}
</div> {# </div>#}
{% endif %} {% endif %}
<div class="galleryWork2 disTab -work-sells-container"> <div class="galleryWork2 disTab -work-sells-container">
@ -817,7 +799,7 @@
data: dataSerializer, data: dataSerializer,
dataType: 'json', dataType: 'json',
success: function (data) { success: function (data) {
console.log(data); consoCoole.log(data);
if (data.status == 'ok') { if (data.status == 'ok') {
$("#resume-text-out").html(data.text); $("#resume-text-out").html(data.text);
$("#resume-text-edit").modal('hide'); $("#resume-text-edit").modal('hide');

@ -65,7 +65,7 @@
<div class="col-lg-12"> <div class="col-lg-12">
<div class="bottom-line"> <div class="bottom-line">
<span class="header"> <span class="header">
Параметры заполнения прифиля влияют на фильтр поиска специалистов, ранжирования в списке Параметры заполнения прифоля влияют на фильтр поиска специалистов, ранжирования в списке
<i class="fa fa-question-circle-o" aria-hidden="true" title=""></i> <i class="fa fa-question-circle-o" aria-hidden="true" title=""></i>
</span> </span>
</div> </div>

@ -8,9 +8,12 @@ module.exports = {
// context: path.join(__dirname, "static", "js"), // context: path.join(__dirname, "static", "js"),
entry: { entry: {
// user: "./user", // projects
create_project: "./assets/js/src/customer_project_create.js", create_project: "./assets/js/src/customer_project_create.js",
init_customer_project_create: './assets/js/src/init_customer_project_create.js' init_customer_project_create: './assets/js/src/init_customer_project_create.js',
//worksell
create_worksell: "./assets/js/src/create_worksell.js",
init_create_worksell: './assets/js/src/init_create_worksell.js',
}, },

@ -1,7 +1,8 @@
from django.contrib import admin from django.contrib import admin
from .models import WorkSell, WorkSellPhoto, Picture from .models import WorkSell, WorkSellPhoto, Picture, ElFormat
admin.site.register(WorkSell) admin.site.register(WorkSell)
admin.site.register(ElFormat)
admin.site.register(Picture) admin.site.register(Picture)
admin.site.register(WorkSellPhoto) admin.site.register(WorkSellPhoto)

@ -18,28 +18,6 @@ class ContractorWorkSellTrashForm(forms.Form):
class WorkSellForm(forms.ModelForm): class WorkSellForm(forms.ModelForm):
# Define a form field manually for a reverse model vield:
photos = forms.ModelMultipleChoiceField(
queryset=WorkSellPhoto.objects.none(),
widget=forms.CheckboxSelectMultiple,
required=False,
)
live_images = forms.ModelMultipleChoiceField(
queryset=LiveImageUpload.objects.all(),
widget=forms.CheckboxSelectMultiple,
required=False,
)
building_classification = TreeNodeChoiceField(
BuildingClassfication.objects.exclude(name='_root'),
widget=forms.Select(attrs={
'class': 'selectpicker'
}),
required=False,
level_indicator='',
)
class Meta: class Meta:
model = WorkSell model = WorkSell
@ -48,28 +26,43 @@ class WorkSellForm(forms.ModelForm):
'building_classification', 'building_classification',
'construction_type', 'construction_type',
'specialization', 'specialization',
'specializations',
'contractor', 'contractor',
'location',
'budget', 'budget',
'currency', 'currency',
'description', 'description',
'el_format',
'name', 'name',
'term', 'term',
'term_type', 'term_type',
'work_type', # 'photos'
) )
widgets = { # def clean(self):
'construction_type': forms.Select(attrs={'class': 'selectpicker'}), # print("CLEAN", self.cleaned_data)
'currency': forms.Select(attrs={'class': 'selectpicker'}), # data = self.cleaned_data.get('specializations')
'term_type': forms.Select(attrs={'class': 'selectpicker'}), # print("before data = ", data)
'work_type': forms.Select(attrs={'class': 'selectpicker -project-work-type-select-field'}), # # print('spec = ', data.split(','))
} # # self.cleaned_data['specialization'] = data.split(',')
# super().clean()
# def clean_specializations(self):
# data = self.cleaned_data['specializations']
# print("before data = ", data)
# # data = data.split(',')
# print("after data = ", data)
# return data
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
# self.request = kwargs.pop('request') try:
self.request = kwargs.pop('request')
except KeyError:
pass
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['specializations'].required = True
self.fields['photos'].queryset = self.instance.photos.all() self.fields['description'].required = True
# self.fields['photos'].queryset = self.instance.photos.all()
class WorkSellFilterForm(forms.ModelForm): class WorkSellFilterForm(forms.ModelForm):

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-12-06 21:34
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('work_sell', '0019_auto_20161201_2003'),
]
operations = [
migrations.CreateModel(
name='ElFormat',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=32)),
],
options={
'verbose_name': 'Формат электронной версии',
},
),
migrations.AddField(
model_name='worksell',
name='el_format',
field=models.ManyToManyField(blank=True, related_name='work_sell', to='work_sell.ElFormat'),
),
]

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-12-07 09:10
from __future__ import unicode_literals
from django.db import migrations, models
import mptt.fields
class Migration(migrations.Migration):
dependencies = [
('specializations', '0004_auto_20161014_2344'),
('work_sell', '0020_auto_20161207_0034'),
]
operations = [
migrations.AddField(
model_name='worksell',
name='specializations',
field=mptt.fields.TreeManyToManyField(blank=True, to='specializations.Specialization'),
),
migrations.AlterField(
model_name='worksell',
name='work_type',
field=models.IntegerField(blank=True, choices=[(403, 'Проектирование777'), (87, 'Техническое сопровождение666')], default=1),
),
]

@ -0,0 +1,37 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-12-07 09:13
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import mptt.fields
class Migration(migrations.Migration):
dependencies = [
('work_sell', '0021_auto_20161207_1210'),
]
operations = [
migrations.AlterField(
model_name='worksell',
name='building_classification',
field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='work_sells', to='projects.BuildingClassfication'),
),
migrations.AlterField(
model_name='worksell',
name='construction_type',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='work_sells', to='projects.ConstructionType'),
),
migrations.AlterField(
model_name='worksell',
name='location',
field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='work_sells', to='common.Location'),
),
migrations.AlterField(
model_name='worksell',
name='specialization',
field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='work_sells', to='specializations.Specialization'),
),
]

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-12-07 16:16
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('work_sell', '0022_auto_20161207_1213'),
]
operations = [
migrations.AddField(
model_name='worksellphoto',
name='description',
field=models.TextField(blank=True),
),
]

@ -1,5 +1,5 @@
from django.db import models from django.db import models
from mptt.models import TreeForeignKey from mptt.models import TreeForeignKey, TreeManyToManyField
from sorl.thumbnail import ImageField from sorl.thumbnail import ImageField
from projects.models import BuildingClassfication, ConstructionType, TERM_TYPES, CURRENCIES, Project from projects.models import BuildingClassfication, ConstructionType, TERM_TYPES, CURRENCIES, Project
@ -11,20 +11,23 @@ class WorkSell(models.Model):
# TODO: Add consistency ("work_sell" vs "worksell"): # TODO: Add consistency ("work_sell" vs "worksell"):
budget = models.DecimalField(max_digits=10, decimal_places=0, default=0, null=True, blank=True) budget = models.DecimalField(max_digits=10, decimal_places=0, default=0, null=True, blank=True)
building_classification = TreeForeignKey(BuildingClassfication, related_name='worksells', null=True, blank=True) building_classification = TreeForeignKey(BuildingClassfication, related_name='work_sells', null=True, blank=True)
construction_type = models.ForeignKey(ConstructionType, related_name='worksells', null=True, blank=True) construction_type = models.ForeignKey(ConstructionType, related_name='work_sells', null=True, blank=True)
contractor = models.ForeignKey(User, related_name='work_sell', null=True, contractor = models.ForeignKey(User, related_name='work_sell', null=True,
blank=True) # TODO: Pluralize related name blank=True) # TODO: Pluralize related name
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES, null=True, blank=True) currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES, null=True, blank=True)
description = models.TextField(blank=True) description = models.TextField(blank=True)
location = TreeForeignKey('common.Location', related_name='worksells', null=True, blank=True) el_format = models.ManyToManyField('ElFormat', related_name='work_sell', blank=True)
location = TreeForeignKey('common.Location', related_name='work_sells', null=True, blank=True)
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
specialization = TreeForeignKey(Specialization, related_name='worksells', null=True, blank=True) # deprecated
specialization = TreeForeignKey(Specialization, related_name='work_sells', null=True, blank=True)
specializations = TreeManyToManyField(Specialization, blank=True)
team = models.ForeignKey(Team, related_name='work_sells', null=True, blank=True) team = models.ForeignKey(Team, related_name='work_sells', null=True, blank=True)
term = models.IntegerField(default=0, null=True, blank=True) term = models.IntegerField(default=0, null=True, blank=True)
term_type = models.CharField(max_length=20, choices=TERM_TYPES, default='hour', null=True, blank=True) term_type = models.CharField(max_length=20, choices=TERM_TYPES, default='hour', null=True, blank=True)
work_type = models.IntegerField(default=1, choices=Project.WORK_TYPES) work_type = models.IntegerField(default=1, choices=Project.WORK_TYPES, blank=True)
def __str__(self): def __str__(self):
return self.name return self.name
@ -57,6 +60,7 @@ class WorkSell(models.Model):
class WorkSellPhoto(models.Model): class WorkSellPhoto(models.Model):
img = ImageField(upload_to='worksell/worksell/') img = ImageField(upload_to='worksell/worksell/')
worksell = models.ForeignKey(WorkSell, related_name='photos') worksell = models.ForeignKey(WorkSell, related_name='photos')
description = models.TextField(blank=True)
class Meta: class Meta:
verbose_name = 'Изображение Готовая работа' verbose_name = 'Изображение Готовая работа'
@ -80,3 +84,13 @@ class Picture(models.Model):
def delete(self, *args, **kwargs): def delete(self, *args, **kwargs):
self.file.delete(False) self.file.delete(False)
super().delete(*args, **kwargs) super().delete(*args, **kwargs)
class ElFormat(models.Model):
name = models.CharField(max_length=32)
def __str__(self):
return self.name
class Meta:
verbose_name = 'Формат электронной версии'

@ -1,55 +1,240 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% block content %} {% load staticfiles %}
<form method="post" enctype="multipart/form-data">{% csrf_token %} {% load sass_tags %}
{% load thumbnail %}
{% block old_css %}{% endblock %}
{% block head_css %}
<link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'>
<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 %}
<div class="col-lg-7"> {% block content %}
<!-- The fileinput-button span is used to style the file input field as button --> {% include 'partials/modals/project_work_type_suggestion.html' %}
<span class="btn btn-success fileinput-button"> {% include 'partials/header.html' %}
<i class="glyphicon glyphicon-plus"></i> <div class="container main-scope">
<span>Add files...</span> <div class="row title-scope">
<input type="file" name="files[]" multiple> <div class="col-lg-12">
</span> {# <div class="title-scope">#}
<h1>Добавить готовую работу</h1>
{# </div>#}
</div>
</div> </div>
<input type="submit" value="Save12"/> <div class="row main-content">
</form> <div class="col-lg-12">
{% endblock %} <form action="{% url 'work_sell:create' %}" method="POST"
enctype="multipart/form-data" novalidate>
{% csrf_token %}
<div class="row">
<div class="col-lg-9">
<div class="simple-field">
<div class="header">Название проекта</div>
<i class="fa fa-question-circle-o" aria-hidden="true"></i>
<span class="required {% if form.name.errors %}error{% endif %}">Обязательно</span>
<input value="{{ form.name.value }}" name="{{ form.name.html_name }}"
class="simple-input italic"
placeholder="Пример: Дизайн проект квартиры, Армирование фундамента, Конструкции перекрытия и т.д."
autocomplete="off"
required>
</div>
</div>
<div class="col-lg-3">
<div class="header ">Стоимость готового проекта
<i class="fa fa-question-circle-o" aria-hidden="true" title=""></i>
</div>
<input name="{{ form.budget.html_name }}" class="simple-input icon-rub js-number-format"
placeholder="Введите сумму"
{% if form.budget.value %}
value="{{ form.budget.value }}"
{% endif %}
autocomplete="off">
</div>
</div>
<div class="row vertical-child mod-align-bottom">
<div class="col-lg-9">
<div class="header">Тип готовой работы</div>
<i class="fa fa-question-circle-o" aria-hidden="true"></i>
<span class="required {% if form.specializations.errors %}error{% endif %}">Обязательно</span>
<div class="" id="select-box-1"></div>
</div>
<div class="col-lg-3">
<div href="#" onclick="return false" data-toggle="modal"
data-target="#projectWorkTypeSuggestionModal"
class="btn btn-simple btn-plus">Нет нужной специальности хочу добавить
</div>
</div>
</div>
<div class="row">
<div class="col-lg-3">
<div class="vertical-child" id="select-box-2">
</div>
</div>
<div class="col-lg-3">
<div class="vertical-child" id="select-box-3">
</div>
</div>
<div class="col-lg-3">
<div class="vertical-child" id="select-box-4">
</div>
</div>
<div class="col-lg-3">
<div class="vertical-child" id="select-box-5">
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12 vertical-child">
<div class="selected-container horizontal" id="selected-spec">
<input type="hidden" name="specializations"
value="{{ form.specializations.value }}">
</div>
</div>
</div>
<div style="margin-top: 45px" class="row">
<div class="col-lg-12">
<div class="simple-field">
<div class="header">Подробно опишите проект
<span class="select-text" id="spec-value"></span>
</div>
<i class="fa fa-question-circle-o" aria-hidden="true" title=""></i>
<span class="required {% if form.description.errors %}error{% endif %}">Обязательно</span>
<textarea name="{{ form.description.html_name }}" class="description"
rows="8">{{ form.description.value }}</textarea>
{% block js_block %} </div>
<div class="documentsChat mod" id="fileUploadContainer">
<div style="display: inline-block;vertical-align: middle;">
<div style="display: inline-block;vertical-align: inherit;"
class="upload-new paper-clip">
<p id="fileUploadAddBtn" style="margin: 0">прикрепить файл</p>
</div>
<span style="display: inline-block;vertical-align: inherit;">ДО 100 ФАЙЛОВ</span>
</div>
<script type="text/javascript"> <div class="row list-new-new" style="margin-top: 10px">
<div class="col-lg-3 file-upload-widget" style="display: none">
<input type="file" name="new_files" class="file-upload-input"
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="preview"></div>
<textarea name="img_description" rows="2" data-limit-rows="true"
class="description"></textarea>
</div>
<span style="display:none" class="file-upload-label"></span>
$(function(){ </div>
$.ajax({ </div>
url : '/work_sell/test/', </div>
</div>
success:function(data){ </div>
alert(data); <div class="row">
console.log(data); <div class="col-lg-3">
} <div class="vertical-child" id="sb-building-classification">
}); </div>
}); <div class="vertical-child" id="sb-building-sub-classification">
</div>
<div class="selected-container" id="selected-building-classification">
<input type="hidden"
name="{{ form.building_classification.html_name }}"
value="{{ form.building_classification.value }}">
</div>
</div>
<div class="col-lg-3">
<div class="vertical-child" id="sb-construction-type">
</div>
<div class="selected-container" id="selected-construction-type">
<input type="hidden"
name="{{ form.construction_type.html_name }}"
value="{{ form.construction_type.value }}">
</div>
</div>
<div class="col-lg-3">
<div class="vertical-child" id="sb-location-1"></div>
<div class="vertical-child" id="sb-location-2"></div>
<div class="vertical-child" id="sb-location-3"></div>
<div class="selected-container" id="selected-location">
<input type="hidden"
name="{{ form.location.html_name }}"
value="{{ form.location.value }}">
</div>
</div>
<div class="col-lg-3">
<div class="vertical-child" id="sb-format"></div>
<div class="selected-container" id="selected-format">
<input type="hidden"
name="{{ form.el_format.html_name }}"
value="{{ form.el_format.value }}">
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="separator">
<div class="border"></div>
</div>
</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>
<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>
{# $(function(){#} </div>
{# var files;#} {% include 'partials/footer.html' %}
{# $('input[type=file]').on('change', prepareUpload);#} <ul id="popups-storage" hidden>
{# $('form').on('submit', uploadFiles);#} {% if form.errors %}
{##} <li class="error">Форма заполнена неполностью</li>
{# function uploadFiles(e){#} {% endif %}
{# console.log('submit');#} {# <li class="info">Message-1</li>#}
{# e.stopPropagation();#} {# <li class="warning">Message-1</li>#}
{# e.preventDefault();#} </ul>
{# var data = new FormData();#} {% include 'partials/inc-message-popup.html' %}
{# $.each(files, function(k,v){#} </div>
{# console.log(k);#} {% endblock %}
{# console.log(v);#} {% block old_js %}
{# data.append(k, v);#} <script src='{% static "lib/jquery.fileupload/js/vendor/jquery.ui.widget.js" %}'></script>
{# });#} <script src='{% static "lib/jquery.fileupload/js/jquery.iframe-transport.js" %}'></script>
{# console.log(data);#} <script src='{% static "lib/jquery.fileupload/js/jquery.fileupload.js" %}'></script>
{# }#} <script src='{% static "lib/jquery.fileupload/js/jquery.fileupload-process.js" %}'></script>
{# function prepareUpload(e){#} <script src='{% static "lib/lodash/lodash.js" %}'></script>
{# files = e.target.files;#} <script src='{% static "my-libs.js" %}'></script>
{# }#}
{##}
{# });#}
</script>
{% endblock %} {% endblock %}
{% block js_block %}
<script src='{% static "js/bootstrap.min.js" %}'></script>
<script src='{% static "js/build/init_create_worksell.js" %}'></script>
<script src='{% static "js/build/create_worksell.js" %}'></script>
<script src='{% static "js/jquery.mask.min.js" %}'></script>
<script>
$(function () {
$('.js-number-format').mask('0000000000');
})
</script>
{% endblock %}

@ -5,7 +5,8 @@ from .views import (
WorkSellUpdateView, WorkSellUpdateView,
WorkSellDeleteView, WorkSellDeleteView,
UploadView, UploadView,
work_sell_create, # work_sell_create,
WorkSellCreateView,
BasicCreateView, BasicCreateView,
PictureCreateView, PictureCreateView,
ContractorWorkSellTrashView, ContractorWorkSellTrashView,
@ -17,12 +18,12 @@ app_name = 'work_sell'
urlpatterns = [ urlpatterns = [
urls.url(r'^$', WorkSellFilterView.as_view(), name='list'), urls.url(r'^$', WorkSellFilterView.as_view(), name='list'),
# urls.url(r'^create/$', WorkSellCreateView.as_view(), name='create'), urls.url(r'^create/$', WorkSellCreateView.as_view(), name='create'),
urls.url(r'^upload/$', UploadView.as_view(), name='upload'), urls.url(r'^upload/$', UploadView.as_view(), name='upload'),
urls.url(r'^(?P<pk>\d+)/edit/$', WorkSellUpdateView.as_view(), name='edit'), urls.url(r'^(?P<pk>\d+)/edit/$', WorkSellUpdateView.as_view(), name='edit'),
urls.url(r'^(?P<pk>\d+)/delete/$', WorkSellDeleteView.as_view(), name='delete'), urls.url(r'^(?P<pk>\d+)/delete/$', WorkSellDeleteView.as_view(), name='delete'),
urls.url(r'^(?P<pk>\d+)/trash/$', ContractorWorkSellTrashView.as_view(), name='contractor-worksell-trash'), urls.url(r'^(?P<pk>\d+)/trash/$', ContractorWorkSellTrashView.as_view(), name='contractor-worksell-trash'),
urls.url(r'^create/$', work_sell_create, name='create'), # urls.url(r'^create/$', work_sell_create, name='create'),
urls.url(r'^basic/$', BasicCreateView.as_view(), name='upload-basic'), urls.url(r'^basic/$', BasicCreateView.as_view(), name='upload-basic'),
urls.url(r'^new/$', PictureCreateView.as_view(), name='upload-new'), urls.url(r'^new/$', PictureCreateView.as_view(), name='upload-new'),
urls.url(r'^(?P<pk>\d+)/$', WorkSellDetail.as_view(), name='detail'), urls.url(r'^(?P<pk>\d+)/$', WorkSellDetail.as_view(), name='detail'),

@ -12,13 +12,15 @@ from django.contrib import messages
from django.db.models import Q from django.db.models import Q
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.exceptions import PermissionDenied
from django.http import JsonResponse, HttpResponse, HttpResponseForbidden from django.http import JsonResponse, HttpResponse, HttpResponseForbidden
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.views.generic import ListView, DetailView, CreateView, View, \ from django.views.generic import ListView, DetailView, CreateView, View, \
UpdateView, DeleteView, TemplateView UpdateView, DeleteView, TemplateView
from projects.models import BuildingClassfication, ConstructionType from projects.models import BuildingClassfication, ConstructionType
from .models import WorkSell, Picture, WorkSellPhoto from projects.forms import ProjectWorkTypeSuggestionForm
from .models import WorkSell, Picture, WorkSellPhoto, WorkSellPhoto
from .forms import WorkSellForm, WorkSellFilterForm, ContractorWorkSellTrashForm from .forms import WorkSellForm, WorkSellFilterForm, ContractorWorkSellTrashForm
from .serialize import serialize from .serialize import serialize
from .response import JSONResponse, response_mimetype from .response import JSONResponse, response_mimetype
@ -143,33 +145,92 @@ class WorkSellDetail(DetailView):
return context return context
def work_sell_create(request): # def work_sell_create(request):
if request.is_ajax(): # if request.is_ajax():
form = WorkSellForm(data=request.POST) # form = WorkSellForm(data=request.POST)
# if form.is_valid():
# instance = form.save(commit=False)
# # import code; code.interact(local=dict(globals(), **locals()))
# instance.save()
# form.save_m2m()
# images_ids = request.POST.get('images-ids').split(';')[:-1]
# for pk in images_ids:
# picture = Picture.objects.get(pk=pk)
# temp_file = ContentFile(picture.file.read())
# temp_file.name = picture.file.name
# w_photo = WorkSellPhoto()
# w_photo.img = temp_file
# w_photo.worksell = instance
# w_photo.save()
# data = {'status': 'ok'}
# else:
# data = {'status': 'no', 'form_errors': form.errors}
# return HttpResponse(json.dumps(data), content_type='application/json')
class WorkSellCreateView(BaseMixin, View):
model = WorkSell
form_class = WorkSellForm
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 get(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
form = self.form_class(request=request)
work_type_suggestion_form = self.work_type_suggestion_form(request=request, prefix='work_type_suggestion')
context.update({
'form': form,
'work_type_suggestion_form': work_type_suggestion_form,
})
return render(request, self.template_name, context)
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
# TODO: fix it on front
# Если фронт не будет возвращать пустую строку при незаполненных данных, то if'ы будут не нужны
if request.POST.get('specializations') == "":
request.POST.pop('specializations')
else:
request.POST.setlist('specializations', request.POST.get('specializations', "").split(','))
if request.POST.get('el_format') == "":
request.POST.pop('el_format')
else:
request.POST.setlist('el_format', request.POST.get('el_format', "").split(','))
print("POST before = ", request.POST)
if form.is_valid(): if form.is_valid():
instance = form.save(commit=False) work_sell = form.save(commit=False)
# import code; code.interact(local=dict(globals(), **locals())) work_sell.contractor = request.user
instance.save() work_sell.save()
form.save_m2m() form.save_m2m()
images_ids = request.POST.get('images-ids').split(';')[:-1]
for pk in images_ids:
picture = Picture.objects.get(pk=pk)
temp_file = ContentFile(picture.file.read())
temp_file.name = picture.file.name
w_photo = WorkSellPhoto()
w_photo.img = temp_file
w_photo.worksell = instance
w_photo.save()
data = {'status': 'ok'}
else:
data = {'status': 'no', 'form_errors': form.errors}
return HttpResponse(json.dumps(data), content_type='application/json')
for file, desc in zip(request.FILES.getlist('new_files'), request.POST.getlist('img_description')):
WorkSellPhoto.objects.create(img=file, description=desc, worksell=work_sell)
class WorkSellCreateView(CreateView): messages.info(request, 'Работа успешно создана')
model = WorkSell redirect_to = reverse('work_sell:detail', kwargs={'pk': work_sell.pk})
form_class = WorkSellForm return redirect(redirect_to)
template_name = 'worksell_create.html' else:
if form.errors:
messages.info(request, (
'<p>Произошла ошибка (form)</p>'
'<pre>{form}</pre>'
).format(form=pformat(form.errors)))
context = self.get_context_data(**kwargs)
context.update({'form': form})
# context.update({'photos': WorkSellPhoto.objects.filter(worksell__id=)})
return render(request, self.template_name, context)
class WorkSellUpdateView(UpdateView): class WorkSellUpdateView(UpdateView):

Loading…
Cancel
Save