remotes/origin/PR-39
Mukhtar 10 years ago
commit 3e4596c7ad
  1. 3
      archilance/settings/base.py
  2. 34
      archilance/util.py
  3. 2
      assets/js/chat.js
  4. 8
      common/templatetags/common_tags.py
  5. 30
      projects/templates/project_detail.html
  6. 2
      templates/partials/base.html
  7. 20
      users/models.py
  8. 271
      users/templates/contractor_profile.html

@ -117,9 +117,10 @@ TEMPLATES = [
# Load these templatetags by default: # Load these templatetags by default:
'builtins': [ 'builtins': [
'common.templatetags.common_tags',
'django.contrib.humanize.templatetags.humanize',
'django.templatetags.static', 'django.templatetags.static',
'mathfilters.templatetags.mathfilters', 'mathfilters.templatetags.mathfilters',
'common.templatetags.common_tags',
], ],
}, },
}, },

@ -3,6 +3,7 @@ from django.core.exceptions import ObjectDoesNotExist
from django.shortcuts import _get_queryset from django.shortcuts import _get_queryset
from django.utils import timezone from django.utils import timezone
from pprint import pprint, pformat from pprint import pprint, pformat
import datetime
import natsort import natsort
import pydash as _; _.map = _.map_; _.filter = _.filter_ import pydash as _; _.map = _.map_; _.filter = _.filter_
import random import random
@ -39,7 +40,7 @@ def random_phone():
def random_date(): def random_date():
return timezone.datetime(_.random(2012, 2018), _.random(1, 12), _.random(1, 28)) return timezone.utc.localize(timezone.datetime(_.random(2012, 2018), _.random(1, 12), _.random(1, 28)))
def random_amount(): def random_amount():
@ -119,3 +120,34 @@ def validate_phone(text):
) )
validate(text) validate(text)
def to_local_datetime(obj):
if not isinstance(obj, datetime.date):
raise TypeError('Date expected')
if not isinstance(obj, datetime.datetime):
obj = datetime.datetime.combine(obj, datetime.time.min)
if not getattr(obj, 'tzinfo', None):
obj = timezone.utc.localize(obj)
return obj
def morph(number, words):
CHOICES = (2, 0, 1, 1, 1, 2)
if 4 < number % 100 < 20:
choice = 2
else:
choice = CHOICES[number % 10 if number % 10 < 5 else 5]
return words[choice]
# # Example:
#
# words = ['яблоко', 'яблока', 'яблок']
#
# for i in range(0, 30):
# print(i, morph(i, words))

@ -1,6 +1,6 @@
var SocketHandler = function () { var SocketHandler = function () {
domain = domain.replace(':' + port, ''); domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + '/chat/' + userId + '/'; var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url); var sock = new WebSocket(url);
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {

@ -1,6 +1,7 @@
from django import template from django import template
from pprint import pprint, pformat from pprint import pprint, pformat
import os import os
import pydash as _; _.map = _.map_; _.filter = _.filter_
from archilance import util from archilance import util
from common.models import Tooltip from common.models import Tooltip
@ -107,4 +108,11 @@ def tooltip_placement(**kwargs):
if tooltip: if tooltip:
return tooltip.position return tooltip.position
@register.simple_tag
def morph(number, words_string):
words = _.split(words_string, ',')
return '%s %s' % (number, util.morph(number, words))
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))

@ -302,12 +302,6 @@
{% endfor %} {% endfor %}
<div class="comm44 disTab"> <div class="comm44 disTab">
{# <div class="i col-lg-10 col-lg-offset-1">#}
{# <a href="#" onclick="return false" class="answerComm">#}
{# Ответить#}
{# </a>#}
{# </div>#}
<div class="col-lg-10 col-lg-offset-1"> <div class="col-lg-10 col-lg-offset-1">
<form action="{% url 'projects:create-answer-message' pk=answer.pk %}" method="POST" novalidate> <form action="{% url 'projects:create-answer-message' pk=answer.pk %}" method="POST" novalidate>
{% csrf_token %} {% csrf_token %}
@ -643,21 +637,13 @@
{% endfor %} {% endfor %}
<div class="comm44 disTab"> <div class="comm44 disTab">
<!--
<div class="i col-lg-10 col-lg-offset-1">
<a href="#" onclick="return false" class="answerComm">
Ответить
</a>
</div>
-->
<div class="col-lg-10 col-lg-offset-1"> <div class="col-lg-10 col-lg-offset-1">
<form action="{% url 'projects:create-answer-message' pk=answer.pk %}" method="POST" novalidate> <form action="{% url 'projects:create-answer-message' pk=answer.pk %}" method="POST" novalidate>
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="next" value="{% url 'projects:detail' pk=project.pk %}"> <input type="hidden" name="next" value="{% url 'projects:detail' pk=project.pk %}">
<div><textarea name="text"></textarea></div> <div><textarea name="text" class="fr_answer"></textarea></div>
<div><button type="submit">Отправить</button></div> <div><button type="submit" class="fr_answer_sen">Отправить</button></div>
</form> </form>
</div> </div>
</div> </div>
@ -801,21 +787,13 @@
{% endfor %} {% endfor %}
<div class="comm44 disTab"> <div class="comm44 disTab">
<!--
<div class="i col-lg-10 col-lg-offset-1">
<a href="#" onclick="return false" class="answerComm">
Ответить
</a>
</div>
-->
<div class="col-lg-10 col-lg-offset-1"> <div class="col-lg-10 col-lg-offset-1">
<form action="{% url 'projects:create-answer-message' pk=answer.pk %}" method="POST" novalidate> <form action="{% url 'projects:create-answer-message' pk=answer.pk %}" method="POST" novalidate>
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="next" value="{% url 'projects:detail' pk=project.pk %}"> <input type="hidden" name="next" value="{% url 'projects:detail' pk=project.pk %}">
<div><textarea name="text"></textarea></div> <div><textarea name="text" class="fr_answer"></textarea></div>
<div><button type="submit">Отправить</button></div> <div><button type="submit" class="fr_answer_sen">Отправить</button></div>
</form> </form>
</div> </div>
</div> </div>

@ -24,7 +24,7 @@
<link rel='stylesheet' href='{% static "css/swiper.min.css" %}'> <link rel='stylesheet' href='{% static "css/swiper.min.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery.fileupload/css/jquery.fileupload.css" %}'> <link rel='stylesheet' href='{% static "lib/jquery.fileupload/css/jquery.fileupload.css" %}'>
<link rel='stylesheet' href='{% static "js/magnific-popup.css" %}'> <link rel='stylesheet' href='{% static "js/magnific-popup.css" %}'>
{# <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.css"> <!-- TODO: Download locally -->#} <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.css"> <!-- TODO: Download locally -->
<link rel='stylesheet' href='{% static "css/main.css" %}'> <link rel='stylesheet' href='{% static "css/main.css" %}'>
<link rel='stylesheet' href='{% static "css/extra.css" %}'> <!-- Our additional CSS --> <link rel='stylesheet' href='{% static "css/extra.css" %}'> <!-- Our additional CSS -->

@ -1,9 +1,14 @@
from dateutil.relativedelta import relativedelta
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, AbstractUser, Group, PermissionsMixin from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, AbstractUser, Group, PermissionsMixin
from django.contrib.contenttypes.fields import GenericRelation from django.contrib.contenttypes.fields import GenericRelation
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone, formats
from mptt.models import TreeForeignKey, TreeManyToManyField from mptt.models import TreeForeignKey, TreeManyToManyField
from pprint import pprint
import datetime
import pydash as _; _.map = _.map_; _.filter = _.filter_
from archilance import util
from specializations.models import Specialization from specializations.models import Specialization
@ -168,11 +173,14 @@ class User(AbstractBaseUser, PermissionsMixin):
def get_profile_image(self): def get_profile_image(self):
return self.avatar return self.avatar
def get_gender(self): def summary(self):
if self.gender: age = relativedelta(timezone.now(), util.to_local_datetime(self.date_of_birth)).years
return 'Мужчина' if self.gender == 'male' else 'Женщина'
else: return _.join(_.filter((
return None self.get_gender_display(),
'%s %s' % (age, util.morph(age, ('год', 'года', 'лет'))),
formats.date_format(self.date_of_birth, 'DATE_FORMAT'),
), _.identity), ', ')
USERNAME_FIELD = 'username' USERNAME_FIELD = 'username'
REQUIRED_FIELDS = [] REQUIRED_FIELDS = []

@ -359,165 +359,168 @@
<div id="tab13" class="tab-pane fade"> <div id="tab13" class="tab-pane fade">
<div class="col-lg-9"> <div class="col-lg-9">
<div class="col-lg-12 resume"> <div class="col-lg-12 resume">
<form enctype="multipart/form-data"> <form enctype="multipart/form-data">
<input type="hidden" name="text" value="Hello"> <input type="hidden" name="text" value="Hello">
<div class="upload2 up-l1">
<input type="file" name="upload" id="upload-resume">
<p>Загрузить резюме</p>
</div>
</form>
</div>
<div class="col-lg-12 resume-block">
<div class="block-is box-sizing">
<div class="block-i">
{% thumbnail contractor.avatar "176x160" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
</div>
</div>
<div class="col-lg-9">
<div class="top-summary">
<p class="name-summ">{{ contractor.get_full_name }}</p>
<div id="resume-success"></div>
{% if contractor.contractor_resume.resume_file %}
<a
style="display: {% if contractor.contractor_resume.resume_file %}block{% else %}none{% endif %};"
href="{% if contractor.contractor_resume.resume_file %}{{ contractor.contractor_resume.resume_file.url }}{% endif %}"
class="download-summ">
скачать резюме
</a>
{% endif %}
<p class="who-summ"> <div class="upload2 up-l1">
{{ contractor.get_gender }}, {{ contractor.date_of_birth }} <input type="file" name="upload" id="upload-resume">
</p> <p>Загрузить резюме</p>
<div class="list-summ-block">
<div class="col-lg-4">
<ul class="list-summ">
{% if contractor.website %}
<li>{{ contractor.website }}</li>
{% endif %}
<li>{{ contractor.email }}</li>
{% if contractor.phone %}
<li>{{ contractor.phone }}</li>
{% endif %}
</ul>
</div>
<div class="col-lg-6 col-lg-offset-2">
{% specialization_widget contractor.pk %}
</div>
</div> </div>
</div> </form>
</div> </div>
<div class="col-lg-12 wr-inset-pluss">
<div class="pluss-block" id="resume-text-out"> <div class="col-lg-12 resume-block">
{{ contractor.contractor_resume.text | safe }} <div class="block-is box-sizing">
<div class="block-i">
{% thumbnail contractor.avatar "176x160" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
</div>
</div> </div>
<a href="#" data-toggle="modal" data-target="#resume-text-edit"> <div class="col-lg-9">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> <div class="top-summary">
</a> <p class="name-summ">{{ contractor.get_full_name }}</p>
<div id="resume-success"></div>
<!-- Редактирование текста резюме (модальное окно)-->
<div id="resume-text-edit" class="modal fade"> {% if contractor.contractor_resume.resume_file %}
<div class="modal-dialog" style="width:900px;"> <a
<div class="modal-content"> style="display: {% if contractor.contractor_resume.resume_file %}block{% else %}none{% endif %};"
<div class="modal-header"> href="{% if contractor.contractor_resume.resume_file %}{{ contractor.contractor_resume.resume_file.url }}{% endif %}"
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> class="download-summ">
<h4 class="modal-title">Редактировать текст резюме</h4> скачать резюме
</a>
{% endif %}
<p class="who-summ">
{{ contractor.summary }}
</p>
<div class="list-summ-block">
<div class="col-lg-4">
<ul class="list-summ">
{% if contractor.website %}
<li>{{ contractor.website }}</li>
{% endif %}
<li>{{ contractor.email }}</li>
{% if contractor.phone %}
<li>{{ contractor.phone }}</li>
{% endif %}
</ul>
</div> </div>
<div class="modal-body"> <div class="col-lg-6 col-lg-offset-2">
<div style="height: 180px;"> {% specialization_widget contractor.pk %}
<form id="resume-edit-form">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<textarea name="text" id="text-new">{{ contractor.contractor_resume.text }}</textarea>
</div>
<div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Сохранить">
</div>
</form>
</div>
</div> </div>
<div class="modal-footer"></div>
</div> </div>
</div> </div>
</div> </div>
<!-- Конец блока (resume-modal)--> <div class="col-lg-12 wr-inset-pluss">
<div class="pluss-block" id="resume-text-out">
<div class="gal-pluss" id="diplom-cro-gallery"> {{ contractor.contractor_resume.text | safe }}
<div class="inset-gp"> </div>
<p class="title-gp">Дипломы / Сертификаты</p> <a href="#" data-toggle="modal" data-target="#resume-text-edit">
<div class="upload2 up-l3"> <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
<input type="file" name="file" id="diplom-upload" multiple> </a>
<p>Загрузить файл</p>
</div> <!-- Редактирование текста резюме (модальное окно)-->
<div class="galleryWork2 gal-iss disTab" id="diplom-gallery"> <div id="resume-text-edit" class="modal fade">
{% for diplom in resume_diploms %} <div class="modal-dialog" style="width:900px;">
<div class="col-lg-4"> <div class="modal-content">
<div class="insetCol box-sizing disTab"> <div class="modal-header">
{% thumbnail diplom.img "210x334" crop="center" as im %} <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<div class="imgGal" <h4 class="modal-title">Редактировать текст резюме</h4>
style="background: url('{{ im.url }}') no-repeat center;"> </div>
<a href="{{ im.url }}" class='open-modal-image'> <div class="modal-body">
<div class="imgFigure"></div> <div style="height: 180px;">
</a> <form id="resume-edit-form">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<textarea name="text" id="text-new">{{ contractor.contractor_resume.text }}</textarea>
</div> </div>
{% endthumbnail %} <div class="searchF1 polsF1 polsFF links-filter">
</div> <input class="btn-submit-link" type="submit" value="Сохранить">
<div class="insetCol2 box-sizing disTab">
<p>
{{ diplom.title }}
</p>
<div class="buttonsImg" distab="">
<div class="insetBI insetBI2 delete-resume-file" data-id="{{ diplom.pk }}">
<i class="fa fa-times"></i>
</div> </div>
</div> </form>
</div> </div>
</div> </div>
{% endfor %} <div class="modal-footer"></div>
</div>
</div> </div>
</div> </div>
<div class="inset-gp"> <!-- Конец блока (resume-modal)-->
<p class="title-gp">Допуск СРО</p>
<div class="upload2 up-l3"> <div class="gal-pluss" id="diplom-cro-gallery">
<input type="file" name="file" id="cro-upload"> <div class="inset-gp">
<p>Загрузить файл</p> <p class="title-gp">Дипломы / Сертификаты</p>
</div> <div class="upload2 up-l3">
<div class="galleryWork2 gal-iss disTab" id="cro-gallery"> <input type="file" name="file" id="diplom-upload" multiple>
{% for cro in resume_cro %} <p>Загрузить файл</p>
<div class="col-lg-4"> </div>
<div class="insetCol box-sizing disTab"> <div class="galleryWork2 gal-iss disTab" id="diplom-gallery">
{% thumbnail cro.img "210x334" crop="center" as im %} {% for diplom in resume_diploms %}
<div class="imgGal" <div class="col-lg-4">
style="background: url('{{ im.url }}') no-repeat center;"> <div class="insetCol box-sizing disTab">
<a href="{{ im.url }}" class='open-modal-image'> {% thumbnail diplom.img "210x334" crop="center" as im %}
<div class="imgFigure"></div> <div class="imgGal"
</a> style="background: url('{{ im.url }}') no-repeat center;">
<a href="{{ im.url }}" class='open-modal-image'>
<div class="imgFigure"></div>
</a>
</div>
{% endthumbnail %}
</div>
<div class="insetCol2 box-sizing disTab">
<p>
{{ diplom.title }}
</p>
<div class="buttonsImg" distab="">
<div class="insetBI insetBI2 delete-resume-file" data-id="{{ diplom.pk }}">
<i class="fa fa-times"></i>
</div>
</div> </div>
{% endthumbnail %} </div>
</div> </div>
<div class="insetCol2 box-sizing disTab"> {% endfor %}
<p> </div>
{{ cro.title }} </div>
</p> <div class="inset-gp">
<div class="buttonsImg" distab=""> <p class="title-gp">Допуск СРО</p>
<div class="insetBI insetBI2 delete-resume-file" data-id="{{ cro.pk }}"> <div class="upload2 up-l3">
<i class="fa fa-times"></i> <input type="file" name="file" id="cro-upload">
<p>Загрузить файл</p>
</div>
<div class="galleryWork2 gal-iss disTab" id="cro-gallery">
{% for cro in resume_cro %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
{% thumbnail cro.img "210x334" crop="center" as im %}
<div class="imgGal"
style="background: url('{{ im.url }}') no-repeat center;">
<a href="{{ im.url }}" class='open-modal-image'>
<div class="imgFigure"></div>
</a>
</div>
{% endthumbnail %}
</div>
<div class="insetCol2 box-sizing disTab">
<p>
{{ cro.title }}
</p>
<div class="buttonsImg" distab="">
<div class="insetBI insetBI2 delete-resume-file" data-id="{{ cro.pk }}">
<i class="fa fa-times"></i>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> {% endfor %}
{% endfor %} </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
</div> </div>
<div id="tab14" class="tab-pane fade"> <div id="tab14" class="tab-pane fade">

Loading…
Cancel
Save