remotes/origin/PR-39
ArturBaybulatov 10 years ago
parent 4905b2e5f6
commit 776d96a165
  1. 3
      archilance/settings/base.py
  2. 34
      archilance/util.py
  3. 2
      assets/js/chat.js
  4. 2
      assets/lib/jquery.cookie/jquery.cookie.min.js
  5. 8
      common/templatetags/common_tags.py
  6. 30
      projects/templates/project_detail.html
  7. 6
      templates/partials/base.html
  8. 20
      users/models.py
  9. 271
      users/templates/contractor_profile.html

@ -116,9 +116,10 @@ TEMPLATES = [
# Load these templatetags by default:
'builtins': [
'common.templatetags.common_tags',
'django.contrib.humanize.templatetags.humanize',
'django.templatetags.static',
'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.utils import timezone
from pprint import pprint, pformat
import datetime
import natsort
import pydash as _; _.map = _.map_; _.filter = _.filter_
import random
@ -39,7 +40,7 @@ def random_phone():
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():
@ -119,3 +120,34 @@ def validate_phone(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 () {
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + '/chat/' + userId + '/';
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {

@ -0,0 +1,2 @@
/*! jquery.cookie v1.4.1 | MIT */
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?a(require("jquery")):a(jQuery)}(function(a){function b(a){return h.raw?a:encodeURIComponent(a)}function c(a){return h.raw?a:decodeURIComponent(a)}function d(a){return b(h.json?JSON.stringify(a):String(a))}function e(a){0===a.indexOf('"')&&(a=a.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\"));try{return a=decodeURIComponent(a.replace(g," ")),h.json?JSON.parse(a):a}catch(b){}}function f(b,c){var d=h.raw?b:e(b);return a.isFunction(c)?c(d):d}var g=/\+/g,h=a.cookie=function(e,g,i){if(void 0!==g&&!a.isFunction(g)){if(i=a.extend({},h.defaults,i),"number"==typeof i.expires){var j=i.expires,k=i.expires=new Date;k.setTime(+k+864e5*j)}return document.cookie=[b(e),"=",d(g),i.expires?"; expires="+i.expires.toUTCString():"",i.path?"; path="+i.path:"",i.domain?"; domain="+i.domain:"",i.secure?"; secure":""].join("")}for(var l=e?void 0:{},m=document.cookie?document.cookie.split("; "):[],n=0,o=m.length;o>n;n++){var p=m[n].split("="),q=c(p.shift()),r=p.join("=");if(e&&e===q){l=f(r,g);break}e||void 0===(r=f(r))||(l[q]=r)}return l};h.defaults={},a.removeCookie=function(b,c){return void 0===a.cookie(b)?!1:(a.cookie(b,"",a.extend({},c,{expires:-1})),!a.cookie(b))}});

@ -1,6 +1,7 @@
from django import template
from pprint import pprint, pformat
import os
import pydash as _; _.map = _.map_; _.filter = _.filter_
from archilance import util
from common.models import Tooltip
@ -107,4 +108,11 @@ def tooltip_placement(**kwargs):
if tooltip:
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()))

@ -302,12 +302,6 @@
{% endfor %}
<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">
<form action="{% url 'projects:create-answer-message' pk=answer.pk %}" method="POST" novalidate>
{% csrf_token %}
@ -643,21 +637,13 @@
{% endfor %}
<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">
<form action="{% url 'projects:create-answer-message' pk=answer.pk %}" method="POST" novalidate>
{% csrf_token %}
<input type="hidden" name="next" value="{% url 'projects:detail' pk=project.pk %}">
<div><textarea name="text"></textarea></div>
<div><button type="submit">Отправить</button></div>
<div><textarea name="text" class="fr_answer"></textarea></div>
<div><button type="submit" class="fr_answer_sen">Отправить</button></div>
</form>
</div>
</div>
@ -801,21 +787,13 @@
{% endfor %}
<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">
<form action="{% url 'projects:create-answer-message' pk=answer.pk %}" method="POST" novalidate>
{% csrf_token %}
<input type="hidden" name="next" value="{% url 'projects:detail' pk=project.pk %}">
<div><textarea name="text"></textarea></div>
<div><button type="submit">Отправить</button></div>
<div><textarea name="text" class="fr_answer"></textarea></div>
<div><button type="submit" class="fr_answer_sen">Отправить</button></div>
</form>
</div>
</div>

@ -24,7 +24,7 @@
<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 "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/extra.css" %}'> <!-- Our additional CSS -->
@ -67,9 +67,9 @@
<script src='{% static "lib/jquery.fileupload/js/jquery.fileupload.js" %}'></script>
<script src='{% static "lib/jquery.fileupload/js/jquery.fileupload-process.js" %}'></script>
<script src='{% static "js/jquery.magnific-popup.min.js" %}'></script>
<script src='{% static "lib/jquery.cookie/jquery.cookie.min.js" %}'></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script> <!-- TODO: Download locally -->
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.js"></script> <!-- TODO: Download locally -->
{#<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.js"></script> <!-- TODO: Download locally -->#}
<script src='{% static "my-libs.js" %}'></script>

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

@ -359,165 +359,168 @@
<div id="tab13" class="tab-pane fade">
<div class="col-lg-9">
<div class="col-lg-12 resume">
<form enctype="multipart/form-data">
<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 %}
<div class="col-lg-12 resume">
<form enctype="multipart/form-data">
<input type="hidden" name="text" value="Hello">
<p class="who-summ">
{{ contractor.get_gender }}, {{ contractor.date_of_birth }}
</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 class="upload2 up-l1">
<input type="file" name="upload" id="upload-resume">
<p>Загрузить резюме</p>
</div>
</div>
</form>
</div>
<div class="col-lg-12 wr-inset-pluss">
<div class="pluss-block" id="resume-text-out">
{{ contractor.contractor_resume.text | safe }}
<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>
<a href="#" data-toggle="modal" data-target="#resume-text-edit">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
</a>
<!-- Редактирование текста резюме (модальное окно)-->
<div id="resume-text-edit" class="modal fade">
<div class="modal-dialog" style="width:900px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Редактировать текст резюме</h4>
<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">
{{ 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 class="modal-body">
<div style="height: 180px;">
<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 class="col-lg-6 col-lg-offset-2">
{% specialization_widget contractor.pk %}
</div>
<div class="modal-footer"></div>
</div>
</div>
</div>
<!-- Конец блока (resume-modal)-->
<div class="gal-pluss" id="diplom-cro-gallery">
<div class="inset-gp">
<p class="title-gp">Дипломы / Сертификаты</p>
<div class="upload2 up-l3">
<input type="file" name="file" id="diplom-upload" multiple>
<p>Загрузить файл</p>
</div>
<div class="galleryWork2 gal-iss disTab" id="diplom-gallery">
{% for diplom in resume_diploms %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
{% thumbnail diplom.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 class="col-lg-12 wr-inset-pluss">
<div class="pluss-block" id="resume-text-out">
{{ contractor.contractor_resume.text | safe }}
</div>
<a href="#" data-toggle="modal" data-target="#resume-text-edit">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
</a>
<!-- Редактирование текста резюме (модальное окно)-->
<div id="resume-text-edit" class="modal fade">
<div class="modal-dialog" style="width:900px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">Редактировать текст резюме</h4>
</div>
<div class="modal-body">
<div style="height: 180px;">
<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>
{% 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 class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Сохранить">
</div>
</div>
</form>
</div>
</div>
{% endfor %}
<div class="modal-footer"></div>
</div>
</div>
</div>
<div class="inset-gp">
<p class="title-gp">Допуск СРО</p>
<div class="upload2 up-l3">
<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>
<!-- Конец блока (resume-modal)-->
<div class="gal-pluss" id="diplom-cro-gallery">
<div class="inset-gp">
<p class="title-gp">Дипломы / Сертификаты</p>
<div class="upload2 up-l3">
<input type="file" name="file" id="diplom-upload" multiple>
<p>Загрузить файл</p>
</div>
<div class="galleryWork2 gal-iss disTab" id="diplom-gallery">
{% for diplom in resume_diploms %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
{% thumbnail diplom.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>
{{ 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>
{% endthumbnail %}
</div>
</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>
{% endfor %}
</div>
</div>
<div class="inset-gp">
<p class="title-gp">Допуск СРО</p>
<div class="upload2 up-l3">
<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>
{% endfor %}
{% endfor %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="tab14" class="tab-pane fade">

Loading…
Cancel
Save