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. 5
      users/templates/contractor_profile.html

@ -116,9 +116,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 () {

@ -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 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 -->
@ -67,9 +67,9 @@
<script src='{% static "lib/jquery.fileupload/js/jquery.fileupload.js" %}'></script> <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 "lib/jquery.fileupload/js/jquery.fileupload-process.js" %}'></script>
<script src='{% static "js/jquery.magnific-popup.min.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> <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.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 = []

@ -362,12 +362,14 @@
<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"> <div class="upload2 up-l1">
<input type="file" name="upload" id="upload-resume"> <input type="file" name="upload" id="upload-resume">
<p>Загрузить резюме</p> <p>Загрузить резюме</p>
</div> </div>
</form> </form>
</div> </div>
<div class="col-lg-12 resume-block"> <div class="col-lg-12 resume-block">
<div class="block-is box-sizing"> <div class="block-is box-sizing">
<div class="block-i"> <div class="block-i">
@ -391,8 +393,9 @@
{% endif %} {% endif %}
<p class="who-summ"> <p class="who-summ">
{{ contractor.get_gender }}, {{ contractor.date_of_birth }} {{ contractor.summary }}
</p> </p>
<div class="list-summ-block"> <div class="list-summ-block">
<div class="col-lg-4"> <div class="col-lg-4">
<ul class="list-summ"> <ul class="list-summ">

Loading…
Cancel
Save