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) {
var $form = $('#filter-form');
var postfix = "&page=" + pageNum;
var $container = $('#contractorsBlock');
var $container = $('#resultsBlock');
(0, _ajax_set_filter.sendData)($form, $container, pageNum);
(0, _ajax_set_filter.modUrl)($form, postfix);
@ -218,7 +218,7 @@
// console.log('type = ', $target.data("type"));
$parent.find('input').val($target.data("type"));
// 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) {
var $form = $('#filter-form');
var postfix = "&page=" + pageNum;
var $container = $('#projectsBlock');
var $container = $('#resultsBlock');
(0, _ajax_set_filter.sendData)($form, $container, pageNum);
(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) {
const $form = $('#filter-form');
const postfix = "&page=" + pageNum;
const $container = $('#contractorsBlock');
const $container = $('#resultsBlock');
sendData($form, $container, pageNum);
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) {
const $form = $('#filter-form');
const postfix = "&page=" + pageNum;
const $container = $('#projectsBlock');
const $container = $('#resultsBlock');
sendData($form, $container, pageNum);
modUrl($form, postfix);

@ -13,7 +13,7 @@ function filterToggleInit() {
// console.log('type = ', $target.data("type"));
$parent.find('input').val($target.data("type"));
// 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);
}
const $container = $('#projectsBlock');
const $container = $('#resultsBlock');
$.ajax({
url: url,
type: "POST",

@ -10,6 +10,9 @@
label
font-weight: normal
.flex
display: flex
.nav
li.active
border-top: 3px solid black
@ -361,3 +364,138 @@ textarea.description
.btn-up_down.clicked
&:after
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
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
margin-top: 30px

@ -54,7 +54,7 @@
</div>
<div class="col-lg-3">
{# $(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>
</div>

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

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

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

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

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

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

@ -23,6 +23,8 @@ module.exports = {
init_contractor_filter: "./assets/js/src/init_contractor_filter.js",
contractor_filter: "./assets/js/src/contractor_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
init_portfolio_create_edit: "./assets/js/src/init_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'
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'^upload/$', UploadView.as_view(), name='upload'),
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 .serialize import serialize
from .response import JSONResponse, response_mimetype
from specializations.models import Specialization
from common.models import Location
from archilance import util
class PictureCreateView(CreateView):
model = Picture
@ -74,62 +76,96 @@ class WorkSellsView(ListView):
class WorkSellFilterView(BaseMixin, View):
template_name = 'worksells_list.html'
form_class = WorkSellFilterForm
def get(self, request, *args, **kwargs):
form = self.form_class(request.GET, request=request)
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
work_sells = WorkSell.objects
if form.is_valid():
keywords = form.cleaned_data.get('keywords')
specialization = form.cleaned_data.get('specialization')
building_classification = form.cleaned_data.get('building_classification')
construction_type = form.cleaned_data.get('construction_type')
location = form.cleaned_data.get('location')
if keywords:
keywords = tuple(filter(None, re.split(r'\s|,|;', keywords)))
for k in keywords:
work_sells = work_sells.filter(Q(name__icontains=k) | Q(description__icontains=k))
if specialization:
work_sells = work_sells.filter(
specialization__lft__gte=specialization.lft,
specialization__rght__lte=specialization.rght,
)
if building_classification:
work_sells = work_sells.filter(building_classification=building_classification)
if construction_type:
work_sells = work_sells.filter(construction_type=construction_type)
if location:
work_sells = work_sells.filter(
location__lft__gte=location.lft,
location__rght__lte=location.rght,
)
paginator = Paginator(work_sells.all(), settings.PAGE_SIZE)
page = request.GET.get('page')
template_name = 'worksell_filter.html'
# form_class = WorkSellFilterForm
include_template = 'partials/inc-worksell-results.html'
PROJECT_ORDER_CHOICES = ( # "Упорядочить по"...
('name', 'названию'),
('budget', 'цене'),
)
def set_filter(self, objects, request_data):
specialization = request_data.get('specialization')
keywords = request_data.get('keywords')
building_classification = request_data.get('building_classification')
construction_type = request_data.get('construction_type')
location = request_data.get('location')
el_format = request_data.get('el_format')
if keywords:
keywords = tuple(filter(None, re.split(r'\s|,|;', keywords)))
for k in keywords:
objects = objects.filter(Q(name__icontains=k.lower()) | Q(description__icontains=k.lower()))
if specialization:
query = util.build_query(specialization, Specialization,
'specializations__lft__gte',
'specializations__rght__lte')
objects = objects.filter(query)
if building_classification:
query = util.build_query(building_classification, BuildingClassfication,
'building_classification__lft__gte',
'building_classification__rght__lte')
objects = objects.filter(query)
#
if construction_type:
objects = objects.filter(construction_type__in=
tuple(filter(None, re.split(r'\s|,|;', construction_type))))
if location:
query = util.build_query(location, Location,
'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:
work_sells = paginator.page(page)
objects = paginator.page(page)
except PageNotAnInteger:
work_sells = paginator.page(1)
objects = paginator.page(1)
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({
'form': form,
'work_sells': work_sells,
'choices': self.PROJECT_ORDER_CHOICES,
'worksells': worksells,
'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):
@ -276,7 +312,7 @@ class WorkSellDeleteView(DeleteView):
template_name = 'worksell_delete.html'
def get_success_url(self):
return reverse('work_sell:list')
return reverse('work_sell:filter')
class ContractorWorkSellTrashView(View):

Loading…
Cancel
Save