PR-15 Профиль настроек исполнителя модификация

Сделан дизайн и компонеты
Не реализовано сохранение/отображени данных пользователя
remotes/origin/PR-15
booblegum 9 years ago
parent 384d0f36bc
commit 6937616692
  1. 12
      assets/css/reset.css
  2. BIN
      assets/img/avatar_default.png
  3. 7
      assets/lib/proekton-components/bash/browserify.sh
  4. 5
      assets/lib/proekton-components/bash/watchify.sh
  5. 16
      assets/lib/proekton-components/css/select-box.css
  6. 42
      assets/lib/proekton-components/js/build/init.js
  7. 1173
      assets/lib/proekton-components/js/build/init_user_profile.js
  8. 43
      assets/lib/proekton-components/js/src/SelectedContainer.js
  9. 66
      assets/lib/proekton-components/js/src/init_user_profile.js
  10. 6
      projects/static/css/project_filter.css
  11. 2
      templates/partials/base.html
  12. 2
      users/forms.py
  13. 41
      users/static/css/custom-checkboxes.css
  14. 96
      users/static/css/user_profile_edit.css
  15. 267
      users/templates/user_profile_edit_new.html
  16. 2
      users/urls.py
  17. 60
      users/views.py

@ -17,17 +17,17 @@ body, code, dl, dd, form, pre {
margin: 0; margin: 0;
} }
a:link { /*a:link {*/
color: #009; /*color: #009;*/
} /*}*/
a:link, a:visited, ins { a:link, a:visited, ins {
text-decoration: none; text-decoration: none;
} }
a:visited { /*a:visited {*/
color: #505; /*color: #505;*/
} /*}*/
a:link img, a:visited img, object, fieldset, abbr, acronym { a:link img, a:visited img, object, fieldset, abbr, acronym {
border: none; border: none;

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

@ -0,0 +1,7 @@
#!/usr/bin/env bash
echo "run browserify"
cd ..
source ~/venv/proekton/bin/activate
#browserify ./js/src/init.js -o ./js/build/init.js -t babelify
browserify ./js/src/init_user_profile.js -o ./js/build/init_user_profile.js -t babelify
#watchify ./js/src/init.js -t babelify -o ./js/build/init.js

@ -1,5 +0,0 @@
#!/usr/bin/env bash
echo "run watchify"
cd ..
source ~/venv/proekton/bin/activate
watchify ./js/src/init.js -t babelify -o ./js/build/init.js

@ -11,24 +11,28 @@
} }
.select-box-header { .select-box-header {
font-size: 12pt;
white-space: nowrap; white-space: nowrap;
word-wrap: break-word; word-wrap: break-word;
} }
.header{
font-size: 12pt;
color: black;
}
.select-box-header .header { .select-box-header .header {
display: inline-block; display: inline-block;
color: black;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
word-wrap: break-word; word-wrap: break-word;
vertical-align: bottom;
max-width: 220px; max-width: 220px;
} }
.select-box-header .fa { .select-box-header .fa {
color: #5e5e5e; color: #5e5e5e;
position: relative; position: relative;
top: -3px; /*top: -3px;*/
} }
.select-box-header .fa:hover { .select-box-header .fa:hover {
@ -158,9 +162,9 @@ button.button-add {
} }
.button-add { .button-add {
position: relative; position: absolute;
top: 3px; top: 54px;
float: right; right: 0;
z-index: 999; z-index: 999;
font-family: Myriad; font-family: Myriad;
font-weight: normal; font-weight: normal;

@ -108,13 +108,16 @@ var SelectedContainer = function () {
var obj = _ref.obj, var obj = _ref.obj,
_ref$noTree = _ref.noTree, _ref$noTree = _ref.noTree,
noTree = _ref$noTree === undefined ? false : _ref$noTree; noTree = _ref$noTree === undefined ? false : _ref$noTree,
_ref$onlyOne = _ref.onlyOne,
onlyOne = _ref$onlyOne === undefined ? false : _ref$onlyOne;
_classCallCheck(this, SelectedContainer); _classCallCheck(this, SelectedContainer);
// TODO: rename variables to camelCase // TODO: rename variables to camelCase
this.$self = $container; this.$self = $container;
this.elements_id = []; // [spec_id, spec_id, ...] this.elements_id = []; // [spec_id, spec_id, ...]
this.onlyOne = onlyOne;
var self = this; var self = this;
obj.dataPromise.then(function (data) { obj.dataPromise.then(function (data) {
@ -160,11 +163,39 @@ var SelectedContainer = function () {
if (this.$input) this.$input.val(this.elements_id.join(',')); if (this.$input) this.$input.val(this.elements_id.join(','));
e.preventDefault(); e.preventDefault();
} }
}, {
key: 'replace',
value: function replace(_id, max_len) {
console.log("replace");
var id = Number(_id);
if (this.elements_id.length > 1) throw new RangeError("Replace error: more than one element");
this.elements_id = [id];
// Remove old
this._removeById(this.elements_id[0]);
//Add new
this._addElementToHtml(id, max_len);
}
}, {
key: '_addElementToHtml',
value: function _addElementToHtml(id, max_len) {
var self = this;
var header = SelectedContainer.getHeader(this.dataTree.getSpecChain(id), "", max_len);
var name = this.dataTree.getElementById(id).name;
this.elements_id.push(id);
if (this.$input) this.$input.val(this.elements_id.join(','));
this.$self.append(SelectedContainer.getTemplate(header || " ", name, id));
this.btn_remove = this.$self.find('.icon-remove');
this.btn_remove.on("click", this.remove.bind(self));
}
}, { }, {
key: 'add', key: 'add',
value: function add(_id, max_len) { value: function add(_id, max_len) {
var id = Number(_id); var id = Number(_id);
var self = this; var self = this;
if (this.onlyOne) {
this.replace(_id, max_len);
return;
}
var has_already = this.elements_id.filter(function (el) { var has_already = this.elements_id.filter(function (el) {
return self.dataTree.isChild(el, id); return self.dataTree.isChild(el, id);
@ -182,14 +213,7 @@ var SelectedContainer = function () {
not_valid.forEach(function (el) { not_valid.forEach(function (el) {
self._removeById(el); self._removeById(el);
}); });
this._addElementToHtml(id, max_len);
var header = SelectedContainer.getHeader(this.dataTree.getSpecChain(id), "", max_len);
var name = this.dataTree.getElementById(id).name;
this.elements_id.push(id);
if (this.$input) this.$input.val(this.elements_id.join(','));
this.$self.append(SelectedContainer.getTemplate(header || " ", name, id));
this.btn_remove = this.$self.find('.icon-remove');
this.btn_remove.on("click", this.remove.bind(self));
} }
}], [{ }], [{
key: 'getTemplate', key: 'getTemplate',

File diff suppressed because it is too large Load Diff

@ -16,10 +16,11 @@ let tmpl_selectedElement = (header, name, id) =>
`; `;
export default class SelectedContainer { export default class SelectedContainer {
constructor($container, {obj, noTree = false}) { constructor($container, {obj, noTree = false, onlyOne = false}) {
// TODO: rename variables to camelCase // TODO: rename variables to camelCase
this.$self = $container; this.$self = $container;
this.elements_id = []; // [spec_id, spec_id, ...] this.elements_id = []; // [spec_id, spec_id, ...]
this.onlyOne = onlyOne;
const self = this; const self = this;
obj.dataPromise obj.dataPromise
@ -64,12 +65,12 @@ export default class SelectedContainer {
return str_chain; return str_chain;
} }
_removeById(spec_id) { _removeById(id) {
let index = this.elements_id.indexOf(spec_id); let index = this.elements_id.indexOf(id);
if (index >= 0) { if (index >= 0) {
this.elements_id.splice(index, 1); this.elements_id.splice(index, 1);
} }
this.$self.find(`span[data-id='${spec_id}']`).parents('.selected-element').remove(); this.$self.find(`span[data-id='${id}']`).parents('.selected-element').remove();
} }
_onLoadDataError(error) { _onLoadDataError(error) {
@ -84,9 +85,34 @@ export default class SelectedContainer {
e.preventDefault(); e.preventDefault();
} }
replace(_id, max_len) {
const id = Number(_id);
if (this.elements_id.length > 1) throw new RangeError("Replace error: more than one element");
// Remove old
this._removeById(this.elements_id[0]);
//Add new
this._addElementToHtml(id, max_len);
this.elements_id = [id];
}
_addElementToHtml(id, max_len) {
let self = this;
const header = SelectedContainer.getHeader(this.dataTree.getSpecChain(id), "", max_len);
const name = this.dataTree.getElementById(id).name;
this.elements_id.push(id);
if (this.$input) this.$input.val(this.elements_id.join(','));
this.$self.append(SelectedContainer.getTemplate(header || " ", name, id));
this.btn_remove = this.$self.find('.icon-remove');
this.btn_remove.on("click", this.remove.bind(self));
}
add(_id, max_len) { add(_id, max_len) {
const id = Number(_id); const id = Number(_id);
let self = this; let self = this;
if (this.onlyOne) {
this.replace(_id, max_len);
return
}
let has_already = this.elements_id.filter(function (el) { let has_already = this.elements_id.filter(function (el) {
return self.dataTree.isChild(el, id) return self.dataTree.isChild(el, id)
@ -104,13 +130,6 @@ export default class SelectedContainer {
not_valid.forEach(function (el) { not_valid.forEach(function (el) {
self._removeById(el); self._removeById(el);
}); });
this._addElementToHtml(id, max_len);
const header = SelectedContainer.getHeader(this.dataTree.getSpecChain(id), "", max_len);
const name = this.dataTree.getElementById(id).name;
this.elements_id.push(id);
if (this.$input) this.$input.val(this.elements_id.join(','));
this.$self.append(SelectedContainer.getTemplate(header || " ", name, id));
this.btn_remove = this.$self.find('.icon-remove');
this.btn_remove.on("click", this.remove.bind(self));
} }
} }

@ -0,0 +1,66 @@
import SelectedContainer from './SelectedContainer';
import NoTreeSelect from './NoTreeSelect';
import TreeSelect from './TreeSelect';
$(function () {
function createFilterSpecs(url) {
// SPECIALIZATIONS FILTER
let sb_main = new TreeSelect($('#select-box-1'), {url, 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, 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);
}
createFilterSpecs('/api/specializations_flat');
createFilterBuildingClass('/api/building_classifications');
createFilterConstructionType('/api/construction_type');
createFilerLocations('/api/locations_flat');
});

@ -27,6 +27,11 @@ body {
display: inline-block display: inline-block
} }
.header{
font-size: 12pt;
color: black;
}
.custom-check .checked{ .custom-check .checked{
background: url("../img/checkbox_Check.png.png") no-repeat center; background: url("../img/checkbox_Check.png.png") no-repeat center;
background-size: 210px 51px; background-size: 210px 51px;
@ -64,7 +69,6 @@ button.resButton:focus {outline:0;}
} }
.flex .header{ .flex .header{
font-size: 12pt;
padding-right: 10px; padding-right: 10px;
} }
.header .fa { .header .fa {

@ -12,10 +12,10 @@
<title>PROEKTON</title> <title>PROEKTON</title>
{# {% compress css %}#} {# {% compress css %}#}
<link rel='stylesheet' href='{% static "css/reset.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery-ui/jquery-ui.css" %}'> <link rel='stylesheet' href='{% static "lib/jquery-ui/jquery-ui.css" %}'>
<link rel='stylesheet' href='{% static "css/bootstrap.css" %}'> <link rel='stylesheet' href='{% static "css/bootstrap.css" %}'>
<link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'> <link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'>
<link rel='stylesheet' href='{% static "css/reset.css" %}'>
<link rel='stylesheet' href='{% static "lib/bootstrap-select/css/bootstrap-select.css" %}'> <link rel='stylesheet' href='{% static "lib/bootstrap-select/css/bootstrap-select.css" %}'>
<link rel='stylesheet' href='{% static "lib/select2/select2.css" %}'> <!-- Tmp --> <link rel='stylesheet' href='{% static "lib/select2/select2.css" %}'> <!-- Tmp -->
<link rel='stylesheet' href='{% static "css/swiper.min.css" %}'> <link rel='stylesheet' href='{% static "css/swiper.min.css" %}'>

@ -75,7 +75,7 @@ class UserProfileEditForm(forms.ModelForm):
widgets = { widgets = {
# TODO: Use common format with jQueryUI Datepicker: # TODO: Use common format with jQueryUI Datepicker:
'date_of_birth': forms.TextInput(attrs={'class': 'datepicker box-sizing surr surr2'}), 'date_of_birth': forms.TextInput(attrs={'class': 'datepicker box-sizing simple-input'}),
} }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

@ -0,0 +1,41 @@
.rad {
cursor: pointer;
user-select: none;
-webkit-user-select: none;
-webkit-touch-callout: none;
}
.rad > input { /* HIDE ORG RADIO & CHECKBOX */
visibility: hidden;
position: absolute;
}
/* RADIO & CHECKBOX STYLES */
.rad > i { /* DEFAULT <i> STYLE */
display: inline-block;
vertical-align: middle;
width: 24px;
height: 24px;
border-radius: 50%;
transition: 0.2s;
box-shadow: inset 0 0 0 16px #fff;
border: 1px solid #cccccc;
background: #cccccc;
margin-right: 5px;
}
/* CHECKBOX OVERWRITE STYLES */
.rad:hover > i { /* HOVER <i> STYLE */
box-shadow: inset 0 0 0 3px #fff;
background: #cccccc;
}
.rad > input:checked + i { /* (RADIO CHECKED) <i> STYLE */
box-shadow: inset 0 0 0 3px #fff;
background: #cccccc;
}
label.rad {
font-style: italic;
color: #606060;
}

@ -0,0 +1,96 @@
.mainContent {
padding: 43px 25px 40px 25px;
}
.simple-input {
height: 51px;
width: 100%;
border: 1px solid #cccccc;
outline: none;
padding: 5px 40px 5px 20px;
background-color: white;
margin-bottom: -1px;
}
.toggle .btn {
padding: 14px 20px;
border-radius: 40px;
}
.bottom-line {
padding-bottom: 10px;
border-bottom: 1px solid #cccccc;
}
.top-line {
/*padding-bottom: 10px;*/
border-top: 1px solid #cccccc;
}
/* СУПЕР-костыльная кнопка. Не прикасаться!*/
.upload-new {
width: 75%;
height: 30px;
overflow: hidden;
cursor: pointer;
/*float: left;*/
/*margin: 0 0 10px 0;*/
border-radius: 40px;
border: 1px solid #FF0029;
}
.upload-new:hover {
box-shadow: 0 0 15px rgba(0, 0, 0, 0.2);
-webkit-transform: scale(1.04);
-moz-transform: scale(1.04);
transform: scale(1.04);
}
.upload-new {
transition: all 0.3s;
cursor: pointer;
}
.upload-new input {
display: block !important;
width: 100% !important;
height: 30px !important;
opacity: 0 !important;
cursor: pointer;
}
.upload-new p {
line-height: 30px;
text-transform: uppercase;
margin: -30px 0 0 0;
/*padding: 0 5px 0 5px;*/
font-size: 12px;
text-align: center;
font-family: Arial-MT-Regular;
}
/** Конец супер-костыля**/
.row-eq-height {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
.info {
background-color: #F2F2F2;
padding: 60px 40px;
margin-top: 20px;
}
.btn-simple {
border-radius: 40px;
padding: 10px 15px;
border: 1px solid #FF0029;
color: black;
}
.no-margin .selected-element {
margin: 0;
}

@ -0,0 +1,267 @@
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% block head_css %}
<link rel='stylesheet' href='{% static "lib/proekton-components/css/fonts.css" %}'>
<link rel='stylesheet' href='{% static "lib/proekton-components/css/selected-container.css" %}'>
<link rel='stylesheet' href='{% static "lib/proekton-components/css/editable-container.css" %}'>
<link rel='stylesheet' href='{% static "lib/proekton-components/css/select-box.css" %}'>
<link rel='stylesheet' href='{% static "css/project_filter.css" %}'>{# other #}
<link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'>
<link rel='stylesheet' href='{% static "css/user_profile_edit.css" %}'>
<link rel='stylesheet' href='{% static "css/custom-checkboxes.css" %}'>
{% endblock %}
{% load thumbnail %}
{% load thumbnail %}
{% block content %}
{% include 'partials/header.html' %}
{# <form method="POST" enctype="multipart/form-data" novalidate>#}
{# {% csrf_token %}#}
{##}
{# {% if request.user.is_customer %}#}
{# <input type="hidden" name="next"#}
{# value="{% url 'users:customer-profile-open-projects' pk=pk %}">#}
{# {% elif request.user.is_contractor %}#}
{# <input type="hidden" name="next" value="{% url 'users:contractor-profile' pk=pk %}">#}
{# {% endif %}#}
<div class="container mainScore">
<div class="row mainContent">
<div class="col-lg-12">
<div class="row row-eq-height">
<div class="col-lg-3">
<div class="avatar" style="float: none">
<div class="avatarInset -position-relative-parent">
<a href="#" onclick="return false" class="btn close -live-image-delete"
style="display: none">&times;</a>
{# {% thumbnail request.user.avatar "235x224" crop="center" as avatar %}#}
{# {% if request.user.avatar %}#}
{# <img src="{{ avatar.url }}" alt="profile-image" class="-avatar-image">#}
{# {% else %}#}
<img src="{% static 'img/avatar_default.png' %}" alt="profile-image"
class="-avatar-image">
{# {% endif %}#}
{# {% endthumbnail %}#}
</div>
</div> <!-- avatar -->
<div style="margin-top: 15px">
<div class="upload-new">
<input type="file" name="image" class="-live-image-upload">
<p>Загрузить фотографию</p>
</div>
</div>
</div>
<div class="col-lg-9">
<div class="row">
<div class="col-lg-12">
<div class="bottom-line">
<span class="header">
Параметры заполнения прифиля влияют на фильтр поиска специалистов, ранжирования в списке
<i class="fa fa-question-circle-o" aria-hidden="true" title=""></i>
</span>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12" style="padding-bottom: 10px">
<span class="header">
Личная информация <i class="fa fa-question-circle-o" aria-hidden="true"
title=""></i>
</span>
</div>
</div>
<div class="row">
<div class="col-lg-4">
<input name="first_name" class="simple-input" placeholder="Фамилия">
</div>
<div class="col-lg-4">
<input name="last_name" class="simple-input" placeholder="Имя">
</div>
<div class="col-lg-4">
<input name="patronym" class="simple-input" placeholder="Отчество">
</div>
<div class="col-lg-4">
<div class="vertical-child" id="sb-location-1">
</div>
</div>
<div class="col-lg-4">
<div class="vertical-child" id="sb-location-2">
</div>
</div>
<div class="col-lg-4">
<div class="vertical-child" id="sb-location-3">
</div>
</div>
<div class="col-lg-4">
<div class="selected-container vertical-child no-margin" id="selected-location">
<div class="header">&nbsp;</div>
<input type="hidden" name="location"
value="{{ location }}">
</div>
</div>
</div>
</div>
</div> <!-- top -->
<div class="row">
<div class="col-lg-12">
<div class="row">
<div class="col-lg-offset-3 col-lg-9">
<div class="top-line">
<span class="header">
Мой опыт работы в проектировании / дизайне / сопровождении проектной документации
<i class="fa fa-question-circle-o" aria-hidden="true" title=""></i>
</span>
</div>
</div>
</div>
<div class="row">
<div class="col-lg-12">
<div class="" 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">
<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="select-box-header vertical-child">
<span style="width: 180px" 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="cro" type="checkbox" hidden {% if cro %} checked{% endif %}>
</div>
</div>
</div>
</div>
</div> <!-- center -->
<div class="row">
<div class="col-lg-12">
<div class="row">
<div class="col-lg-12">
<div class="top-line" style="padding-top: 15px">
<div class="btn-group toggle" role="group" aria-label="...">
<a href="{% url 'users:user-profile-edit' pk=pk %}" role="button"
class="btn btn-default">Общая информация</a>
<a href="{% url 'users:user-financial-info-edit' pk=pk %}"
class="btn btn-default" role="button">Финансовая информация</a>
</div>
</div>
</div>
</div>
<div class="row info">
<div class="col-lg-3">
<div class="header"> Дата рождения</div>
<div class="birth_edit_dat">
{{ form.date_of_birth }}
</div>
</div>
<div class="col-lg-3">
<div class="header">Пол</div>
<div class="checkbox">
<label class="rad">
<input type="radio" name="gender" value="male" id="male">
<i></i>Мужской
</label>
<label class="rad">
<input type="radio" name="gender" value="female" id="female">
<i></i>Женский
</label>
</div>
</div>
<div class="col-lg-3">
<div class="header">Статус</div>
{{ form.contractor_status }}
</div>
<div class="col-lg-3">
<div class="header">Skype</div>
<input name="skype" class="simple-input" placeholder="skype id">
</div>
<div class="clearfix visible-lg"></div>
<div class="col-lg-3 vertical-child">
<div class="header">Сайт</div>
<input name="site" class="simple-input" placeholder="example.com">
</div>
<div class="col-lg-3 vertical-child">
<div class="header">Телефон</div>
<input name="phone-1" class="simple-input" placeholder="+7 909 999 00 00">
</div>
<div class="col-lg-3 vertical-child">
<div class="header">Второй телефон</div>
<input name="phone-2" class="simple-input" placeholder="+7 909 999 00 00">
</div>
<div class="col-lg-3 vertical-child" style="text-align: center">
<div class="header">&nbsp;</div>
<a href="#" class="btn btn-simple">СОХРАНИТЬ</a>
</div>
</div>
</div>
</div> <!-- bottom -->
</div>
</div>
<div class="row">
{% include 'partials/footer.html' %}
</div>
</div>
{% endblock %}
{% block js_block %}
{{ block.super }}
<script src='{% static "lib/proekton-components/js/build/init_user_profile.js" %}'></script>
<script src='{% static "projects-filter.js" %}'></script>
{% endblock %}

@ -18,12 +18,14 @@ from .views import (
TeamProfileView, TeamProfileView,
UserFinancialInfoEditView, UserFinancialInfoEditView,
UserProfileEditView, UserProfileEditView,
UserProfileEditViewPlus,
) )
app_name = 'users' app_name = 'users'
urlpatterns = [ urlpatterns = [
urls.url(r'^(?P<pk>\d+)/edit/$', UserProfileEditView.as_view(), name='user-profile-edit'), urls.url(r'^(?P<pk>\d+)/edit/$', UserProfileEditView.as_view(), name='user-profile-edit'),
urls.url(r'^(?P<pk>\d+)/edit_plus/$', UserProfileEditViewPlus.as_view(), name='user-profile-edit'),
urls.url(r'^(?P<pk>\d+)/financial-info/edit/$', UserFinancialInfoEditView.as_view(), urls.url(r'^(?P<pk>\d+)/financial-info/edit/$', UserFinancialInfoEditView.as_view(),
name='user-financial-info-edit'), name='user-financial-info-edit'),

@ -100,6 +100,66 @@ class UserProfileEditView(BaseMixin, View):
return render(request, self.template_name, context) return render(request, self.template_name, context)
class UserProfileEditViewPlus(BaseMixin, View):
form_class = UserProfileEditForm
template_name = 'user_profile_edit_new.html'
# def dispatch(self, request, *args, **kwargs):
# if request.resolver_match.url_name == 'user-experience-edit':
# if not request.user.is_contractor():
# raise PermissionDenied
# self.form_class = UserProfileExperienceEditForm
# request.experience_edit = True
# if request.user.is_authenticated() and request.user.pk == int(kwargs.get('pk')):
# 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, instance=request.user)
context.update({'form': form})
return render(request, self.template_name, context)
def post(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
specs = request.POST.getlist('contractor_specializations')
request.POST.setlist('contractor_specializations', _.compact(specs)) # Ignore empty input values
form = self.form_class(request.POST, request=request, instance=request.user)
if form.is_valid():
user = form.save()
live_image = form.cleaned_data.get('live_image')
if live_image:
new_image = ContentFile(live_image.file.read())
new_image.name = live_image.file.name
user.avatar = new_image
user.save()
live_image.file.delete()
live_image.delete()
messages.info(request, 'Пользователь успешно отредактирован')
redirect_to = request.POST.get('next')
return redirect(redirect_to)
else:
if form.errors:
messages.info(request, (
'<p>Произошла ошибка (form)</p>'
'<pre>{form}</pre>'
).format(form=pformat(form.errors)))
context.update({'form': form})
return render(request, self.template_name, context)
class UserFinancialInfoEditView(BaseMixin, View): class UserFinancialInfoEditView(BaseMixin, View):
form_class = UserProfileBasicInfoEditForm form_class = UserProfileBasicInfoEditForm
fin_info_form_class = UserFinancialInfoEditForm fin_info_form_class = UserFinancialInfoEditForm

Loading…
Cancel
Save