Merge branch 'PR-64'

remotes/origin/HEAD
booblegum 9 years ago
commit 741e584126
  1. 4
      assets/js/build/contractor_filter.js
  2. 1444
      assets/js/build/init_worksell_filter.js
  3. 2
      assets/js/build/project_filter.js
  4. 228
      assets/js/build/worksell_filter.js
  5. 2
      assets/js/src/contractor_filter.js
  6. 65
      assets/js/src/init_worksell_filter.js
  7. 2
      assets/js/src/project_filter.js
  8. 2
      assets/js/src/seeds/filter_toggle.js
  9. 22
      assets/js/src/worksell_filter.js
  10. 2
      assets/projects-filter.js
  11. 138
      assets/sass/components/custom-components.sass
  12. 78
      assets/sass/elements/worksell_card.sass
  13. 11
      assets/sass/main.sass
  14. 2
      projects/templates/partials/inc-projects-filter.html
  15. 2
      projects/templates/project_filter.html
  16. 2
      templates/partials/ajax_pagination.html
  17. 6
      templates/partials/header.html
  18. 6
      templates/partials/trash/header.html
  19. 2
      users/templates/contractor_filter.html
  20. 2
      users/templates/partials/inc-contractors-filter.html
  21. 2
      webpack.config.js
  22. 147
      work_sell/templates/partials/inc-worksell-filter.html
  23. 20
      work_sell/templates/partials/inc-worksell-results.html
  24. 19
      work_sell/templates/partials/inc-worksell_card.html
  25. 0
      work_sell/templates/trash/worksells_list.html
  26. 39
      work_sell/templates/worksell_filter.html
  27. 2
      work_sell/urls.py
  28. 136
      work_sell/views.py

@ -57,7 +57,7 @@
function paginateTo(pageNum) { function paginateTo(pageNum) {
var $form = $('#filter-form'); var $form = $('#filter-form');
var postfix = "&page=" + pageNum; var postfix = "&page=" + pageNum;
var $container = $('#contractorsBlock'); var $container = $('#resultsBlock');
(0, _ajax_set_filter.sendData)($form, $container, pageNum); (0, _ajax_set_filter.sendData)($form, $container, pageNum);
(0, _ajax_set_filter.modUrl)($form, postfix); (0, _ajax_set_filter.modUrl)($form, postfix);
@ -218,7 +218,7 @@
// console.log('type = ', $target.data("type")); // console.log('type = ', $target.data("type"));
$parent.find('input').val($target.data("type")); $parent.find('input').val($target.data("type"));
// console.log('click'); // console.log('click');
sendFilterData($('#filter-form'), $('#contractorsBlock')); sendFilterData($('#filter-form'), $('#resultsBlock'));
}); });
} }

File diff suppressed because it is too large Load Diff

@ -55,7 +55,7 @@
function paginateTo(pageNum) { function paginateTo(pageNum) {
var $form = $('#filter-form'); var $form = $('#filter-form');
var postfix = "&page=" + pageNum; var postfix = "&page=" + pageNum;
var $container = $('#projectsBlock'); var $container = $('#resultsBlock');
(0, _ajax_set_filter.sendData)($form, $container, pageNum); (0, _ajax_set_filter.sendData)($form, $container, pageNum);
(0, _ajax_set_filter.modUrl)($form, postfix); (0, _ajax_set_filter.modUrl)($form, postfix);

@ -0,0 +1,228 @@
/******/ (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 _custom_check = __webpack_require__(1);
var _extended_field = __webpack_require__(2);
var _ajax_set_filter = __webpack_require__(3);
var _filter_toggle = __webpack_require__(4);
function paginateTo(pageNum) {
var $form = $('#filter-form');
var postfix = "&page=" + pageNum;
var $container = $('#resultsBlock');
(0, _ajax_set_filter.sendData)($form, $container, pageNum);
(0, _ajax_set_filter.modUrl)($form, postfix);
return false;
}
$(function () {
(0, _custom_check.customCheckInit)();
(0, _extended_field.extendedFieldInit)();
(0, _filter_toggle.filterToggleInit)();
window.sendFilterData = _ajax_set_filter.sendFilterData;
window.paginateTo = paginateTo;
});
/***/ },
/* 1 */
/***/ function(module, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
function customCheckInit() {
function tuneCheckBoxes($boxes) {
var currentState = $boxes.find("input").prop("checked") ? 'checked' : 'not-checked';
$boxes.find("div").hide();
$boxes.find("div." + currentState).show();
}
var $boxes = $('.custom-check');
tuneCheckBoxes($boxes);
$boxes.on("click", function (e) {
var inside_checkBox = $(e.target).parent().find("input");
inside_checkBox.prop("checked", !inside_checkBox.prop("checked"));
tuneCheckBoxes($boxes);
e.preventDefault();
return false;
});
}
exports.customCheckInit = customCheckInit;
/***/ },
/* 2 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function extendedFieldInit() {
var $buttonF1 = $('.resButton');
if ($('.slide').hasClass("active")) $buttonF1.css('transform', 'rotate(0deg)');
$buttonF1.on("click", function (e) {
e.preventDefault();
var $slide = $('.slide');
if ($slide.hasClass("active")) {
$buttonF1.css('transform', 'rotate(180deg)');
$slide.slideUp(300);
} else {
$buttonF1.css('transform', 'rotate(0deg)');
$slide.slideDown(300);
}
$slide.toggleClass("active");
});
}
exports.extendedFieldInit = extendedFieldInit;
/***/ },
/* 3 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function getFormData($form, pageNum) {
var unindexed_array = $form.serializeArray();
var indexed_array = {};
$.map(unindexed_array, function (n, i) {
indexed_array[n['name']] = n['value'];
});
indexed_array["page"] = pageNum || "";
return indexed_array;
}
// TODO: Восстановление фильтров из URL
function modUrl($form, postfix) {
var curLoc = '?' + $form.serialize() + (postfix || "");
try {
history.replaceState($form.serialize(), null, curLoc);
} catch (e) {
console.log("Error!");
}
}
function sendData($form, $update_container, pageNum) {
function updateResults(html) {
$update_container.html(html);
var title = $('#titleScore').val();
$('.search-num').html(title);
}
console.log("form method = ", $form.attr("method"));
$.ajax({
url: $form.attr("action"),
type: $form.attr("method"),
dataType: 'html',
data: getFormData($form, pageNum),
beforeSend: function beforeSend(xhr) {
xhr.setRequestHeader("X-CSRFToken", $.cookie('csrftoken'));
},
success: updateResults,
error: function error(data) {
return console.log("Error", data);
}
});
}
function sendFilterData($form, $update_container) {
sendData($form, $update_container);
modUrl($form);
return false;
}
exports.sendFilterData = sendFilterData;
exports.sendData = sendData;
exports.modUrl = modUrl;
/***/ },
/* 4 */
/***/ function(module, exports) {
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
function filterToggleInit() {
var $group = $('.btn-group.toggle');
var $buttons = $group.find('a.btn').add('.link-sort a.btn');
// let $input = $('input[name="party_types"]');
$buttons.on("click", function (e) {
e.preventDefault();
var $target = $(e.target);
var $parent = $target.parent();
// console.log('parent class = ', $parent.attr("class"));
$parent.children().removeClass('active');
$target.addClass('active');
// console.log('type = ', $target.data("type"));
$parent.find('input').val($target.data("type"));
// console.log('click');
sendFilterData($('#filter-form'), $('#resultsBlock'));
});
}
exports.filterToggleInit = filterToggleInit;
/***/ }
/******/ ]);

@ -6,7 +6,7 @@ import {filterToggleInit} from './seeds/filter_toggle'
function paginateTo(pageNum) { function paginateTo(pageNum) {
const $form = $('#filter-form'); const $form = $('#filter-form');
const postfix = "&page=" + pageNum; const postfix = "&page=" + pageNum;
const $container = $('#contractorsBlock'); const $container = $('#resultsBlock');
sendData($form, $container, pageNum); sendData($form, $container, pageNum);
modUrl($form, postfix); modUrl($form, postfix);

@ -0,0 +1,65 @@
// `
import SelectedContainer from 'components/SelectedContainer';
import NoTreeSelect from 'components/NoTreeSelect';
import TreeSelect from 'components/TreeSelect';
$(function () {
function createFilterSpecs(url) {
// SPECIALIZATIONS FILTER
let sb_main = new TreeSelect($('#select-box-1'), {url, visible: true, hasEditableContainer: 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});
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 createFilterBuildingClass(url) {
// BUILDING-CLASSIFICATION FILTER
let 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});
sb_build_main.connectSelectedContainer(select_build_container);
sb_build_main.setNearbySelectBox(sb_build_1);
sb_build_1.setNearbySelectBox("", sb_build_main);
}
function createFilterConstructionType(url) {
let 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});
sb_constr_main.connectSelectedContainer(select_constr_type);
}
function createFilerLocations(url) {
let 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});
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);
}
createFilterSpecs('/api/specializations_flat');
createFilterBuildingClass('/api/building_classifications');
createFilterConstructionType('/api/construction_type');
createFilerLocations('/api/locations_flat');
});

@ -5,7 +5,7 @@ import {sendFilterData, sendData, modUrl} from './seeds/ajax_set_filter'
function paginateTo(pageNum) { function paginateTo(pageNum) {
const $form = $('#filter-form'); const $form = $('#filter-form');
const postfix = "&page=" + pageNum; const postfix = "&page=" + pageNum;
const $container = $('#projectsBlock'); const $container = $('#resultsBlock');
sendData($form, $container, pageNum); sendData($form, $container, pageNum);
modUrl($form, postfix); modUrl($form, postfix);

@ -13,7 +13,7 @@ function filterToggleInit() {
// console.log('type = ', $target.data("type")); // console.log('type = ', $target.data("type"));
$parent.find('input').val($target.data("type")); $parent.find('input').val($target.data("type"));
// console.log('click'); // console.log('click');
sendFilterData($('#filter-form'), $('#contractorsBlock')); sendFilterData($('#filter-form'), $('#resultsBlock'));
}) })
} }

@ -0,0 +1,22 @@
import {customCheckInit} from './seeds/custom_check'
import {extendedFieldInit} from './seeds/extended_field'
import {sendFilterData, sendData, modUrl} from './seeds/ajax_set_filter'
import {filterToggleInit} from './seeds/filter_toggle'
function paginateTo(pageNum) {
const $form = $('#filter-form');
const postfix = "&page=" + pageNum;
const $container = $('#resultsBlock');
sendData($form, $container, pageNum);
modUrl($form, postfix);
return false;
}
$(function () {
customCheckInit();
extendedFieldInit();
filterToggleInit();
window.sendFilterData = sendFilterData;
window.paginateTo = paginateTo;
});

@ -104,7 +104,7 @@ function sendData(url, $form, pageNum) {
$container.html(html); $container.html(html);
} }
const $container = $('#projectsBlock'); const $container = $('#resultsBlock');
$.ajax({ $.ajax({
url: url, url: url,
type: "POST", type: "POST",

@ -10,6 +10,9 @@
label label
font-weight: normal font-weight: normal
.flex
display: flex
.nav .nav
li.active li.active
border-top: 3px solid black border-top: 3px solid black
@ -361,3 +364,138 @@ textarea.description
.btn-up_down.clicked .btn-up_down.clicked
&:after &:after
content: "\e252" content: "\e252"
.filter
width: 100%
//float: left
background-color: #F2F2F2
position: relative
padding: 45px 50px
.triangle1
position: absolute
border: 30px solid transparent
border-top: 17px solid white
top: 0
left: 50%
margin-left: -30px
.findReal, .findReal:visited
float: left
color: white
font-size: 16px
font-family: 'pfdintextcomppro-regular', sans-serif
background: url('#{$static}/img/list2.png') no-repeat 41px, #FF0029
padding: 17px 48px 17px 79px
border-radius: 40px
text-transform: uppercase
.clearSearch
font-size: 15px
font-family: Arial, Verdana, Helvetica, sans-serif
float: left
position: relative
color: #8a8989
font-style: italic
margin: 14px 0 0 39px
&:before
content: ''
position: absolute
width: 21px
height: 22px
background: url('#{$static}/img/cenaList.png') no-repeat left
background-size: cover
background-position: 0 -46px
left: -33px
top: -3px
&:hover
text-decoration: none
color: #676666
.insetCol, .insetCol2
width: 100%
float: left
margin-top: 15px
position: relative
.insetCol
background-color: #F2F2F2
padding: 15px
-webkit-transition: all 0.3s ease-out
-moz-transition: all 0.3s ease-out
transition: all 0.3s ease-out
.pagin
text-align: center
margin-top: 30px
nav
display: inline-block
ul
li
float: left
margin-right: 26px
padding: 0 0
line-height: 50px
a
background-color: transparent
color: black
font-size: 20px
line-height: 50px
font-family: 'pfdintextcomppro-regular', sans-serif
border: none
border-radius: 100%
.active a
color: white
background-color: #2c2c2c
padding: 20px !important
line-height: 10px
li a
padding: 20px 0 !important
line-height: 10px
width: 50px !important
height: 50px !important
text-align: center
&:hover, &:active
color: white
background-color: #2c2c2c
border-color: #2c2c2c
li a span
margin-top: -10px
ul
li
&:last-child a:hover, &:first-child a:hover
background: none !important
color: #2c2c2c
opacity: 0.8
float: left
margin-right: 26px
padding: 0 0
line-height: 50px
a
background-color: transparent
color: black
font-size: 20px
line-height: 50px
font-family: 'pfdintextcomppro-regular', sans-serif
border: none
border-radius: 100%
.active a
color: white
background-color: #2c2c2c
padding: 20px !important
line-height: 10px
li a
padding: 20px 0 !important
line-height: 10px
width: 50px !important
height: 50px !important
text-align: center
&:hover, &:active
color: white
background-color: #2c2c2c
border-color: #2c2c2c
li a span
margin-top: -10px
ul li
&:last-child a:hover, &:first-child a:hover
background: none !important
color: #2c2c2c
opacity: 0.8

@ -0,0 +1,78 @@
@import "base/variavles"
$size: 250px
$figure_size: 50px
.cards
display: flex
align-items: flex-start
flex-flow: row wrap
.worksell-card
//&:first-child
// margin-left: 0
// margin-right: 0
margin: 15px
display: inline-block
a
-webkit-transition: all 0.3s ease-out
-moz-transition: all 0.3s ease-out
transition: all 0.3s ease-out
display: inline-block
color: #235080
a:hover,
a:visited
.img-figure
opacity: 1
transform: scale(1.06)
text-decoration: none
color: #121880
box-shadow: 0 0 10px rgba(0,0,0,0.7)
.img-block
width: $size
//border: 1px solid red
position: relative
.img
width: $size
height: $size
border: 10px solid #F2F2F2
background:
repeat: no-repeat
position: center
size: cover
.cost-wrapper
position: absolute
bottom: 0
width: 100%
text-align: center
.cost
color: #fb2c2d
font-size: 18px
display: inline-block
min-width: $size*0.8
background-color: white
padding: 4px 8px
//border: 1px solid black
.name-block
margin-top: 15px
max-width: $size
text-align: center
.img-figure
width: $figure_size
height: $figure_size
-webkit-transition: all 0.3s ease-out
-moz-transition: all 0.3s ease-out
transition: all 0.3s ease-out
border-radius: 100%
background:
image: url("#{$static}/img/img.png")
repeat: no-repeat
position: center
//size: cover
color: rgba(211,211,211,0.8)
position: absolute
top: 50%
left: 50%
margin-left: -$figure_size/2
margin-top: -$figure_size/2
opacity: 0

@ -45,6 +45,17 @@ body
stretch: normal stretch: normal
letter-spacing: 2px letter-spacing: 2px
p
line-height: 36px
padding: 0 100px
width: 100%
text-align: center
float: left
font-family: 'pfbeausanspro-thin', sans-serif
font-size: 36px
margin: 48px 0 45px 0
letter-spacing: 2px
.vertical-child .vertical-child
margin-top: 30px margin-top: 30px

@ -54,7 +54,7 @@
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
{# $(this).closest('form').submit(); return false#} {# $(this).closest('form').submit(); return false#}
<a href="" class="findReal" onclick="sendFilterData($('#filter-form'), $('#projectsBlock')); return false"> <a href="" class="findReal" onclick="sendFilterData($('#filter-form'), $('#resultsBlock')); return false">
найти проект найти проект
</a> </a>
</div> </div>

@ -18,7 +18,7 @@
{% include 'partials/inc-projects-filter.html' %} {% include 'partials/inc-projects-filter.html' %}
<div class="col-lg-12 "> <div class="col-lg-12 ">
<div id="projectsBlock"> <div id="resultsBlock">
{% include 'partials/inc-projects-results.html' %} {% include 'partials/inc-projects-results.html' %}
</div> </div>
</div> </div>

@ -2,7 +2,7 @@
{#function paginateTo(pageNum) {#} {#function paginateTo(pageNum) {#}
{# const $form = $('#filter-form');#} {# const $form = $('#filter-form');#}
{# const postfix = "&page=" + pageNum;#} {# const postfix = "&page=" + pageNum;#}
{# const $container = $('#contractorsBlock');#} {# const $container = $('#resultsBlock');#}
{##} {##}
{# sendData($form, $container, pageNum);#} {# sendData($form, $container, pageNum);#}
{# modUrl($form, postfix);#} {# modUrl($form, postfix);#}

@ -143,7 +143,7 @@
</a> </a>
</li> </li>
<li class="icon_tm3"> <li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a> <a href="{% url 'work_sell:filter' %}">Готовые проекты</a>
</li> </li>
{% endif %} {% endif %}
{% if request.user.is_customer %} {% if request.user.is_customer %}
@ -151,7 +151,7 @@
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a> <a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
</li> </li>
<li class="icon_tm3"> <li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a> <a href="{% url 'work_sell:filter' %}">Готовые проекты</a>
</li> </li>
{% endif %} {% endif %}
{% else %} {% else %}
@ -162,7 +162,7 @@
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a> <a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
</li> </li>
<li class="icon_tm3"> <li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a> <a href="{% url 'work_sell:filter' %}">Готовые проекты</a>
</li> </li>
{% endif %} {% endif %}
</ul> </ul>

@ -40,7 +40,7 @@
<span></span> <span></span>
</li> </li>
<li class="icon_tm3"> <li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a> <a href="{% url 'work_sell:filter' %}">Готовые проекты</a>
<span></span> <span></span>
</li> </li>
{% endif %} {% endif %}
@ -51,7 +51,7 @@
<span></span> <span></span>
</li> </li>
<li class="icon_tm3"> <li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a> <a href="{% url 'work_sell:filter' %}">Готовые проекты</a>
<span></span> <span></span>
</li> </li>
{% endif %} {% endif %}
@ -68,7 +68,7 @@
<span></span> <span></span>
</li> </li>
<li class="icon_tm3"> <li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Готовые проекты</a> <a href="{% url 'work_sell:filter' %}">Готовые проекты</a>
<span></span> <span></span>
</li> </li>
</ul> </ul>

@ -18,7 +18,7 @@
{% include 'partials/inc-contractors-filter.html' %} {% include 'partials/inc-contractors-filter.html' %}
<div class="col-lg-12 "> <div class="col-lg-12 ">
<div id="contractorsBlock"> <div id="resultsBlock">
{% include 'partials/inc-contractors-results.html' %} {% include 'partials/inc-contractors-results.html' %}
</div> </div>
</div> </div>

@ -40,7 +40,7 @@
<div class="col-lg-3"> <div class="col-lg-3">
{# $(this).closest('form').submit(); return false#} {# $(this).closest('form').submit(); return false#}
<a href="" class="findReal" <a href="" class="findReal"
onclick="sendFilterData($('#filter-form'), $('#contractorsBlock')); return false"> onclick="sendFilterData($('#filter-form'), $('#resultsBlock')); return false">
найти исполнителя найти исполнителя
</a> </a>
</div> </div>

@ -23,6 +23,8 @@ module.exports = {
init_contractor_filter: "./assets/js/src/init_contractor_filter.js", init_contractor_filter: "./assets/js/src/init_contractor_filter.js",
contractor_filter: "./assets/js/src/contractor_filter.js", contractor_filter: "./assets/js/src/contractor_filter.js",
project_filter: "./assets/js/src/project_filter.js", project_filter: "./assets/js/src/project_filter.js",
init_worksell_filter: "./assets/js/src/init_worksell_filter.js",
worksell_filter: "./assets/js/src/worksell_filter.js",
//portfolio //portfolio
init_portfolio_create_edit: "./assets/js/src/init_portfolio_create_edit.js", init_portfolio_create_edit: "./assets/js/src/init_portfolio_create_edit.js",
portfolio_create_edit: "./assets/js/src/portfolio_create_edit.js", portfolio_create_edit: "./assets/js/src/portfolio_create_edit.js",

@ -0,0 +1,147 @@
<form id="filter-form" action="{% url 'work_sell:filter' %}" method="POST" novalidate>
<div class="filter form-container">
<div class="triangle1"></div>
<div class="row">
<div class="col-lg-12">
<div id="select-box-1"></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">
<div class="selected-container horizontal" id="selected-spec">
<input type="hidden" name="specialization"
value="{{ specialization }}">
</div>
</div>
</div>
<div class="row separator">
<div class="col-lg-12">
<div class="flex">
<span class="header" style="margin-right: 10px">
<span>Поиск по ключевым словам и фразам </span>
<i class="fa fa-question-circle-o" aria-hidden="true" title="bla-bla-bla..."></i>
</span>
<div class="border"></div>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-6">
<input
type="text"
name="keywords"
{# onkeydown="event.keyCode === 13 && $(this).closest('form').submit()"#}
value="{{ keywords }}"
class="select-box-search"
placeholder="Ключевые слова, фразы">
</div>
<div class="col-lg-3">
{# $(this).closest('form').submit(); return false#}
<a href="" class="findReal"
onclick="sendFilterData($('#filter-form'), $('#resultsBlock')); return false">
найти проект
</a>
</div>
<div class="col-lg-3">
<a href="{% url 'work_sell:filter' %}" class="clearSearch">
{# TODO: Сделать очистку, без перезагрузки#}
Очистить фильтр
</a>
</div>
</div>
<div class="row separator">
<div class="col-lg-12">
<div class="flex">
<span class="header">Расширенные поля</span>
<button class="resButton">
<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span>
</button>
<div class="border"></div>
</div>
</div>
</div>
<div class="slide {% if has_additional_fields %} active{% endif %}">
<div class="row">
<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="building_classification"
value="{{ building_classification }}">
</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="construction_type"
value="{{ construction_type }}">
</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="location"
value="{{ location }}">
</div>
</div>
<div class="col-lg-3">
<div class="select-box-header vertical-child">
<span style="font-size: 11pt" class="header">Требуется электронная версия</span>
<i class="fa fa-question-circle-o" aria-hidden="true"
title="bla-bla-bla..."></i>
</div>
<div class="custom-check">
<div class="checked"></div>
<div style="display: none" class="not-checked"></div>
<input name="el_format" type="checkbox" hidden {% if el_format %} checked{% endif %}>
</div>
</div>
</div>
</div>
</div>
{# <p class="title-scope search-num">#}
{# #}
{# </p>#}
<div class="row title-scope" style="border-bottom: none">
<div class="col-lg-12">
<p class="search-num">
{{ display_msg }}
</p>
</div>
</div>
<div class="link-sort">
<p>Сортировать по:</p>
{% for val, text in choices %}
<a class="btn btn-default"
data-type="{{ val }}"
onclick="">
{{ text }}
</a>
{% endfor %}
<input type="hidden" name="order_by" value="">
</div>
</form>

@ -0,0 +1,20 @@
{% load sass_tags %}
<input id="titleScore" type="hidden" value="{{ display_msg }}">
<div class="row">
<div class="col-lg-12 cards">
{% for work in worksells %}
{# <div class="col-lg-3">#}
{% include 'partials/inc-worksell_card.html' %}
{# </div>#}
{% endfor %}
</div>
</div>
<div class="row">
<div class="col-lg-12 pagin">
{% include 'partials/ajax_pagination.html' %}
</div>
</div>

@ -0,0 +1,19 @@
{% load staticfiles %}
{% load thumbnail %}
{#/static/sass/elements/worksell_card.sass - стиль карточки отдельно#}
<div class="worksell-card">
<a href="{% url 'work_sell:detail' work.pk %}">
<div class="img-block">
<div class="img" style="background-image: url('{{ work.get_cover.url }}')"></div>
<div class="img-figure"></div>
<div class="cost-wrapper">
<span class="cost">
{{ work.budget }}<i class="fa fa-rub"></i>
</span>
</div>
</div>
<div class="name-block">
{{ work }}
</div>
</a>
</div>

@ -0,0 +1,39 @@
{% extends 'partials/_base.html' %}
{% load sass_tags %}
{% load static %}
{% block personal_css %}
<link rel='stylesheet' href='{% sass_src "sass/components/custom-components.sass" %}'>
<link rel='stylesheet' href='{% sass_src "lib/proekton-components/sass/components.sass" %}'>
<link rel='stylesheet' href='{% sass_src "sass/elements/worksell_card.sass" %}'>
{% endblock %}
{% block content %}
<div class="container main-scope">
<div class="row title-scope" style="border-bottom: none">
<div class="col-lg-12">
<p>
Поиск готовых проектов
</p>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="row">
<div class="col-lg-12">
{% include 'partials/inc-worksell-filter.html' %}
</div>
</div>
<div id="resultsBlock">
{% include 'partials/inc-worksell-results.html' %}
</div>
</div>
</div>
</div>
{% endblock %}
{% block personal_js %}
<script src='{% static "js/build/init_worksell_filter.js" %}'></script>
<script src='{% static "js/build/worksell_filter.js" %}'></script>
{% endblock %}

@ -17,7 +17,7 @@ from .views import (
app_name = 'work_sell' app_name = 'work_sell'
urlpatterns = [ urlpatterns = [
urls.url(r'^$', WorkSellFilterView.as_view(), name='list'), urls.url(r'^$', WorkSellFilterView.as_view(), name='filter'),
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'),

@ -27,7 +27,9 @@ from .models import WorkSell, Picture, WorkSellPhoto, WorkSellPhoto
from .forms import WorkSellForm, WorkSellFilterForm, ContractorWorkSellTrashForm from .forms import WorkSellForm, WorkSellFilterForm, ContractorWorkSellTrashForm
from .serialize import serialize from .serialize import serialize
from .response import JSONResponse, response_mimetype from .response import JSONResponse, response_mimetype
from specializations.models import Specialization
from common.models import Location
from archilance import util
class PictureCreateView(CreateView): class PictureCreateView(CreateView):
model = Picture model = Picture
@ -74,62 +76,96 @@ class WorkSellsView(ListView):
class WorkSellFilterView(BaseMixin, View): class WorkSellFilterView(BaseMixin, View):
template_name = 'worksells_list.html' template_name = 'worksell_filter.html'
form_class = WorkSellFilterForm # form_class = WorkSellFilterForm
include_template = 'partials/inc-worksell-results.html'
def get(self, request, *args, **kwargs): PROJECT_ORDER_CHOICES = ( # "Упорядочить по"...
form = self.form_class(request.GET, request=request) ('name', 'названию'),
context = self.get_context_data(**_.merge({}, request.GET, kwargs)) ('budget', 'цене'),
work_sells = WorkSell.objects )
if form.is_valid():
keywords = form.cleaned_data.get('keywords') def set_filter(self, objects, request_data):
specialization = form.cleaned_data.get('specialization') specialization = request_data.get('specialization')
building_classification = form.cleaned_data.get('building_classification') keywords = request_data.get('keywords')
construction_type = form.cleaned_data.get('construction_type') building_classification = request_data.get('building_classification')
location = form.cleaned_data.get('location') construction_type = request_data.get('construction_type')
location = request_data.get('location')
if keywords: el_format = request_data.get('el_format')
keywords = tuple(filter(None, re.split(r'\s|,|;', keywords)))
if keywords:
for k in keywords: keywords = tuple(filter(None, re.split(r'\s|,|;', keywords)))
work_sells = work_sells.filter(Q(name__icontains=k) | Q(description__icontains=k))
for k in keywords:
if specialization: objects = objects.filter(Q(name__icontains=k.lower()) | Q(description__icontains=k.lower()))
work_sells = work_sells.filter(
specialization__lft__gte=specialization.lft, if specialization:
specialization__rght__lte=specialization.rght, query = util.build_query(specialization, Specialization,
) 'specializations__lft__gte',
'specializations__rght__lte')
if building_classification: objects = objects.filter(query)
work_sells = work_sells.filter(building_classification=building_classification)
if building_classification:
if construction_type: query = util.build_query(building_classification, BuildingClassfication,
work_sells = work_sells.filter(construction_type=construction_type) 'building_classification__lft__gte',
'building_classification__rght__lte')
if location: objects = objects.filter(query)
work_sells = work_sells.filter( #
location__lft__gte=location.lft, if construction_type:
location__rght__lte=location.rght, objects = objects.filter(construction_type__in=
) tuple(filter(None, re.split(r'\s|,|;', construction_type))))
if location:
paginator = Paginator(work_sells.all(), settings.PAGE_SIZE) query = util.build_query(location, Location,
page = request.GET.get('page') 'location__lft__gte',
'location__rght__lte')
objects = objects.filter(query)
if el_format:
objects = objects.exclude(el_format=None)
return objects
def sort_by(self, objects, order_by):
if not order_by:
return objects
return objects.order_by(order_by)
def pagination(self, objects, page):
paginator = Paginator(objects, settings.PAGE_SIZE)
try: try:
work_sells = paginator.page(page) objects = paginator.page(page)
except PageNotAnInteger: except PageNotAnInteger:
work_sells = paginator.page(1) objects = paginator.page(1)
except EmptyPage: except EmptyPage:
work_sells = paginator.page(paginator.num_pages) objects = paginator.page(paginator.num_pages)
return objects
def get_context(self, request):
context = request.dict()
worksells = WorkSell.objects.all()
worksells = self.set_filter(worksells, request)
num_results = worksells.count()
worksells = self.sort_by(worksells, request.get("order_by"))
worksells = self.pagination(worksells, request.get("page"))
has_additional_fields = bool(context.get("building_classification") or context.get(
"construction_type") or context.get("location") or context.get("cro"))
display_msg = 'Найдено %s проектов' % num_results if num_results > 0 else 'Ничего не найдено'
context.update({ context.update({
'form': form, 'choices': self.PROJECT_ORDER_CHOICES,
'work_sells': work_sells, 'worksells': worksells,
'is_paginated': True, 'is_paginated': True,
'page_obj': work_sells, 'display_msg': display_msg,
'page_obj': worksells,
'has_additional_fields': has_additional_fields
}) })
return context
return render(request, self.template_name, context) def get(self, request):
return render(request, self.template_name, self.get_context(request.GET))
def post(self, request):
return render(request, self.include_template, self.get_context(request.POST))
class WorkSellDetail(DetailView): class WorkSellDetail(DetailView):
@ -276,7 +312,7 @@ class WorkSellDeleteView(DeleteView):
template_name = 'worksell_delete.html' template_name = 'worksell_delete.html'
def get_success_url(self): def get_success_url(self):
return reverse('work_sell:list') return reverse('work_sell:filter')
class ContractorWorkSellTrashView(View): class ContractorWorkSellTrashView(View):

Loading…
Cancel
Save