remotes/origin/PR-39
Mukhtar 10 years ago
commit 96e2c1be44
  1. 4
      archilance/management/commands/generate_portfolios.py
  2. 4
      archilance/management/commands/generate_projects.py
  3. 4
      archilance/management/commands/generate_work_sells.py
  4. 2
      archilance/management/commands/tmp.py
  5. 3
      archilance/mixins.py
  6. 1
      archilance/settings/base.py
  7. 3
      archilance/settings/dev.py
  8. 1
      archilance/settings/prod.py
  9. 4
      archilance/urls.py
  10. 28
      archilance/views.py
  11. 15
      common/templatetags/common_tags.py
  12. 34
      projects/models.py
  13. 22
      projects/templates/comparison.html
  14. 42
      projects/templates/project_detail.html
  15. 2
      projects/templates/project_filter.html
  16. 46
      projects/views.py
  17. 48
      templates/partials/base_test.html
  18. 78
      templates/partials/header.html
  19. 6
      templates/test.html
  20. 11
      users/models.py
  21. 2
      users/templates/contractor_office_open_projects.html
  22. 16
      users/templates/contractor_profile.html
  23. 2
      users/templates/customer_profile_open_projects.html
  24. 2
      users/templates/customer_profile_trashed_projects.html
  25. 4
      work_sell/models.py
  26. 2
      work_sell/templates/worksell_detail.html
  27. 2
      work_sell/templates/worksells_list.html

@ -7,7 +7,7 @@ import random
from archilance import util
from common.models import Location
from projects.models import Portfolio, PortfolioPhoto, CURRENCIES, TERMS, BuildingClassfication , ConstructionType
from projects.models import Portfolio, PortfolioPhoto, CURRENCIES, TERM_TYPES, BuildingClassfication , ConstructionType
from specializations.models import Specialization
from users.models import User, Team, GENDERS
@ -42,7 +42,7 @@ class Command(BaseCommand):
budget=util.random_amount(),
currency=_.sample(CURRENCIES)[0],
term=_.random(0, 20),
term_type=_.sample(TERMS)[0],
term_type=_.sample(TERM_TYPES)[0],
worksell=_.sample((True, False)),
)

@ -6,7 +6,7 @@ import pydash as _; _.map = _.map_; _.filter = _.filter_
import random
from archilance import util
from projects.models import Project, Order, CURRENCIES, TERMS, Specialization, Realty
from projects.models import Project, Order, CURRENCIES, TERM_TYPES, Specialization, Realty
from users.models import User
@ -62,7 +62,7 @@ class Command(BaseCommand):
price_and_term_required=_.sample((True, False)),
deal_type=_.sample(Project.DEAL_TYPES)[0],
term=_.random(0, 20),
term_type=_.sample(TERMS)[0],
term_type=_.sample(TERM_TYPES)[0],
text=util.lorem(_.random(5, 30)),
work_type=_.sample(Project.WORK_TYPES)[0],
state='active',

@ -7,7 +7,7 @@ import random
from archilance import util
from common.models import Location
from projects.models import TERMS, CURRENCIES, BuildingClassfication, ConstructionType
from projects.models import TERM_TYPES, CURRENCIES, BuildingClassfication, ConstructionType
from specializations.models import Specialization
from users.models import User
from work_sell.models import WorkSell, WorkSellPhoto
@ -27,7 +27,7 @@ class Command(BaseCommand):
description=util.lorem(),
name=util.lorem(words=_.random(2, 20), sentences=1),
term=_.random(0, 20),
term_type=_.sample(TERMS)[0],
term_type=_.sample(TERM_TYPES)[0],
)
ws.save()

@ -7,7 +7,7 @@ import random
from archilance import util
from common.models import Location
from projects.models import Project, Order, CURRENCIES, TERMS, Specialization, Realty
from projects.models import Project, Order, CURRENCIES, TERM_TYPES, Specialization, Realty
from users.models import User, Team

@ -17,7 +17,8 @@ class BaseMixin(ContextMixin):
c['domain'] = Site.objects.get_current().domain
c['TEMPLATE_DEBUG'] = settings.TEMPLATE_DEBUG
c['TEMPLATE_DEBUG'] = getattr(settings, 'TEMPLATE_DEBUG', None)
c['TESTING'] = getattr(settings, 'TESTING', None)
return c

@ -14,7 +14,6 @@ SECRET_KEY = 'vb6@b9zj7^f!^+x*e8=e!oundyu1!e*&0i(3gu2xwo4%fx4h&n'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
TEMPLATE_DEBUG = True # Show debug info in templates. See `projects/templates/project_filter.html`
ALLOWED_HOSTS = []

@ -1,8 +1,5 @@
from .base import *
# AUTH_PASSWORD_VALIDATORS = []
# INSTALLED_APPS += ['debug_toolbar',]
try:
from .local import *
except ImportError:

@ -14,7 +14,6 @@ DATABASES = {
DEBUG = True
TEMPLATE_DEBUG = True
THUMBNAIL_DEBUG = True
SECRET_KEY = 'vb6@b9zj7^f!^+x*e8=e!oundyu1!e*&0i(3gu2xwo4%fx4h&n'

@ -5,7 +5,7 @@ from django.contrib import admin
from django.contrib.staticfiles.urls import staticfiles_urlpatterns
from django.views.generic import TemplateView
from .views import HomeTemplateView, TestChatTemplateView
from .views import HomeTemplateView, TestChatTemplateView, TestView
from wallets.views import TmpCheckOrderView, TmpPaymentAvisoView
from wagtail.wagtailadmin import urls as wagtailadmin_urls
@ -17,7 +17,7 @@ urlpatterns = [
url('', include('social.apps.django_app.urls', namespace='social')),
url(r'^chattest/$', TestChatTemplateView.as_view()),
url(r'^work_sell/', include('work_sell.urls')),
url(r'^test/$', TemplateView.as_view(template_name='test.html'), name='test'),
url(r'^test/$', TestView.as_view(), name='test'),
url(r'^projects/', include('projects.urls')),
url(r'^reviews/', include('reviews.urls')),
url(r'^wallets/', include('wallets.urls')),

@ -1,9 +1,15 @@
from django.conf import settings
from django.contrib import messages
from django.core.exceptions import PermissionDenied
from django.core.files.base import ContentFile
from django.shortcuts import render
from django.template.loader import render_to_string
from django.core.urlresolvers import reverse, reverse_lazy
from django.http import HttpResponseForbidden, JsonResponse, HttpResponseRedirect, HttpResponse, Http404
from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import TemplateView, View
from pprint import pprint, pformat
import logging
from .mixins import BaseMixin
from chat.models import Documents
from common.models import MainPage, PrintDocuments
from projects.models import Order
@ -11,12 +17,16 @@ from users.models import ContractorResumeFiles
from work_sell.models import Picture
class HomeTemplateView(View):
class HomeTemplateView(BaseMixin, View):
template_name = 'home.html'
def get(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs)
main_settings = MainPage.objects.get(pk=1)
return render(request, self.template_name, {'main_settings': main_settings})
context['main_settings'] = main_settings
return render(request, self.template_name, context)
class TestChatTemplateView(View):
@ -36,3 +46,13 @@ class TestChatTemplateView(View):
document.file = temp_file
document.save()
class TestView(BaseMixin, View):
template_name = 'test.html'
def get(self, request, *args, **kwargs):
# context = self.get_context_data(**kwargs)
# context['foo'] = 'bar'
# return render(request, self.template_name, context)
return redirect('projects:detail', pk=153)

@ -115,4 +115,19 @@ def morph(number, words_string):
return '%s %s' % (number, util.morph(number, words))
@register.simple_tag
def fa_currency_classes(currency):
CURRENCIES = {'rur': 'rub', 'eur': 'eur', 'usd': 'usd'}
currency_class = CURRENCIES.get(currency)
if currency_class:
return 'fa fa-%s' % currency_class
@register.filter
def get(dic, key):
if isinstance(dic, dict):
return dic.get(key)
# import code; code.interact(local=dict(globals(), **locals()))

@ -17,13 +17,20 @@ CURRENCIES = (
('eur', 'EUR'),
)
TERMS = (
('project', 'За проект'),
('hour', 'За час'),
TERM_TYPES = (
('day', 'За день'),
('hour', 'За час'),
('month', 'За месяц'),
('project', 'За проект'),
)
TERM_TYPE_MORPHS = {
'day': 'день,дня,дней',
'hour': 'час,часа,часов',
'month': 'месяц,месяца,месяцев',
'project': 'проект,проекта,проектов'
}
class BuildingClassfication(models.Model):
name = models.CharField(max_length=255)
@ -92,7 +99,7 @@ class Project(models.Model, HitCountMixin):
specialization = TreeForeignKey(Specialization, related_name='projects')
state = models.CharField(default='active', max_length=20, choices=STATES)
term = models.IntegerField(default=0)
term_type = models.CharField(max_length=20, choices=TERMS, default='hour')
term_type = models.CharField(max_length=20, choices=TERM_TYPES, default='hour')
text = models.TextField(blank=True)
work_type = models.IntegerField(default=1, choices=WORK_TYPES)
@ -131,7 +138,7 @@ class Answer(models.Model):
project = models.ForeignKey(Project, related_name='answers')
secure_deal_only = models.BooleanField(default=False)
term = models.IntegerField(blank=True, null=True)
term_type = models.CharField(max_length=10, choices=TERMS, blank=True, null=True)
term_type = models.CharField(max_length=10, choices=TERM_TYPES, blank=True, null=True)
is_archive = models.BooleanField(default=False)
rejected = models.BooleanField(default=False)
@ -141,15 +148,6 @@ class Answer(models.Model):
def get_first_message(self):
return self.messages.first().text
def get_term_type_labels(self):
term_type_labels = {
'hour': 'час,часа,часов',
'day': 'день,дня,дней',
'month': 'месяц,месяца,месяцев',
'project': 'проект,проект,проект'
}
return term_type_labels.get(self.term_type)
def __str__(self):
return "{author}'s answer ({id})".format(author=type(self.author).__name__, id=self.pk)
@ -252,7 +250,7 @@ class Stage(models.Model):
order = models.ForeignKey(Order, related_name='stages')
result = models.CharField(max_length=255)
term = models.DateField()
term_type = models.CharField(max_length=10, choices=TERMS, default='hour')
term_type = models.CharField(max_length=10, choices=TERM_TYPES, default='hour')
status = models.CharField(choices=STATUSES, max_length=30, default='not_agreed')
created = models.DateTimeField(default=timezone.now)
pos = models.IntegerField(default=0, null=True, blank=True)
@ -270,8 +268,8 @@ class Stage(models.Model):
class Candidate(models.Model):
answer = models.ForeignKey(Answer, related_name='candidates')
project = models.ForeignKey(Project, related_name='candidates')
answer = models.ForeignKey(Answer, related_name='candidates') # TODO: Swap to "OneToOneField"
project = models.ForeignKey(Project, related_name='candidates') # TODO: Remove this redundant field at all (we've got "candidate.answer.project")
status = models.BooleanField(default=False)
position = models.PositiveIntegerField(default=0)
@ -295,7 +293,7 @@ class Portfolio(models.Model):
name = models.CharField(max_length=255)
specialization = TreeForeignKey(Specialization, related_name='portfolios', null=True, blank=True)
term = models.IntegerField(default=0, null=True, blank=True)
term_type = models.CharField(max_length=20, choices=TERMS, default='hour', null=True, blank=True)
term_type = models.CharField(max_length=20, choices=TERM_TYPES, default='hour', null=True, blank=True)
user = models.ForeignKey(User, related_name='portfolios', null=True, blank=True)
worksell = models.BooleanField(default=False)

@ -33,20 +33,27 @@
{% for cand in object.candidates.all %}
<tr style="cursor:move;" class="items[]_{{ cand.pk }}" data-class="items[]_{{ cand.pk }}">
<td>{{ cand.position }}</td>
<td>
{{ cand.answer.author.username }}
{% if cand.answer.author|class_name == 'User' %}
{{ cand.answer.author.get_full_name }}
{% elif cand.answer.author|class_name == 'Team' %}
{{ cand.answer.author.name }}
{% endif %}
</td>
<td>{{ cand.answer.budget }} <i class="fa fa-rub"></i></td>
<td>{{ cand.answer.budget }} <i class="{% fa_currency_classes cand.answer.currency %}"></i></td>
<td>
{{ cand.answer.term }}<br> <span>
{% morph_words cand.answer.term cand.answer.get_term_type_labels %}
</span>
{% if cand.answer.term_type == 'project' %}
За проект
{% else %}
{% morph cand.answer.term TERM_TYPE_MORPHS|get:cand.answer.term_type %}
{% endif %}
</td>
<td>
<span class="glyphicon glyphicon-info-sign" aria-hidden="true" data-toggle="tooltip" data-placement="right" title="{{ cand.answer.get_first_message }}"></span>
<span class="glyphicon glyphicon-info-sign" aria-hidden="true" data-tooltip data-placement="right" title="{{ cand.answer.get_first_message }}"></span>
</td>
<td>
@ -89,8 +96,9 @@
<form method="POST" action="{% url 'projects:delete-candidate' cand.pk %}">
{% csrf_token %}<input class="btnTab btnTab3" type="submit" value="">
</form>
<a href="{% url 'users:contractor-profile' cand.answer.author.pk %}#open-contact">
<div class="btnTab btnTab4"></div>
<div class="btnTab btnTab4"></div>
</a>
</div>
</td>

@ -19,7 +19,7 @@
{% if request.user.is_contractor %}
<div class="col-lg-12 new-p">
<p>{{ project.budget|intcomma }} <i class="fa fa-rub"></i></p>
<p>{{ project.budget|intcomma }} <i class="{% fa_currency_classes project.currency %}"></i></p>
</div>
{% endif %}
@ -237,10 +237,14 @@
<p>
Цена:
<span>{{ answer.budget|intcomma }}</span>
<i class="fa fa-rub"></i>
<i class="{% fa_currency_classes answer.currency %}"></i>
</p>
<p>
Срок: <span>{{ answer.term }} {{ answer.get_currency_display }} {{ answer.get_term_type_display|decap }}</span>
{% if answer.term_type == 'project' %}
Срок: <span>За проект</span>
{% else %}
Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span>
{% endif %}
</p>
<p>Опубликован: {{ answer.created|date:'M d, Y' }}</p>
</div>
@ -563,10 +567,14 @@
<p>
Цена:
<span>{{ answer.budget|intcomma }}</span>
<i class="fa fa-rub"></i>
<i class="{% fa_currency_classes answer.currency %}"></i>
</p>
<p>
Срок: <span>{{ answer.term }} {{ answer.get_currency_display }} {{ answer.get_term_type_display|decap }}</span>
{% if answer.term_type == 'project' %}
Срок: <span>За проект</span>
{% else %}
Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span>
{% endif %}
</p>
<p>Опубликован: {{ answer.created|date:'M d, Y' }}</p>
</div>
@ -695,7 +703,7 @@
<div class="col-lg-3 retts">
{% if answer.author|class_name == 'User' %}
{% ratings_widget answer.author.pk 'restList2' %}
{% ratings_widget answer.author.pk 'restList2' %}
{% elif answer.author|class_name == 'Team'%}
{% ratings_team_widget answer.author.pk 'restList2' %}
{% endif %}
@ -719,15 +727,25 @@
<p>
Цена:
<span>{{ answer.budget|intcomma }}</span>
<i class="fa fa-rub"></i>
<i class="{% fa_currency_classes answer.currency %}"></i>
</p>
<p>
Срок: <span>{{ answer.term }} {{ answer.get_currency_display }} {{ answer.get_term_type_display|decap }}</span>
{% if answer.term_type == 'project' %}
Срок: <span>За проект</span>
{% else %}
Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span>
{% endif %}
</p>
<p>Опубликован: {{ answer.created|date:'M d, Y' }}</p>
</div>
<div class="col-lg-3 retts">
{% if TESTING %}
<a href="{% url 'projects:add-candidate' answer_id=answer.pk project_id=project.pk %}" class="candLink candLink1">
Кандидат
</a>
{% endif %}
{% if not project.order.contractor and not project.order.team %}
<form action="{% url 'projects:customer-offer-order' answer_id=answer.pk project_id=project.pk %}" method="POST" novalidate>
{% csrf_token %}
@ -867,10 +885,14 @@
<p>
Цена:
<span>{{ answer.budget|intcomma }}</span>
<i class="fa fa-rub"></i>
<i class="{% fa_currency_classes answer.currency %}"></i>
</p>
<p>
Срок: <span>{{ answer.term }} {{ answer.get_currency_display }} {{ answer.get_term_type_display|decap }}</span>
{% if answer.term_type == 'project' %}
Срок: <span>За проект</span>
{% else %}
Срок: <span>{% morph answer.term TERM_TYPE_MORPHS|get:answer.term_type %}</span>
{% endif %}
</p>
<p>Опубликован: {{ answer.created|date:'M d, Y' }}</p>
</div>

@ -214,7 +214,7 @@
</div>
<div class="col-lg-3 rightPro">
<p class="cenaPro">
{{ project.budget }} <i class="fa fa-rub"></i>
{{ project.budget }} <i class="{% fa_currency_classes project.currency %}"></i>
</p>
<ul>

@ -18,12 +18,26 @@ import pydash as _; _.map = _.map_; _.filter = _.filter_
import re
from .mixins import LastAccessMixin
from .models import Arbitration, Project, ProjectFile, Portfolio, PortfolioPhoto, Candidate, Answer, AnswerFile, AnswerMessage, Realty, Order
from archilance import util
from archilance.mixins import BaseMixin
from users.models import User, Team
from work_sell.models import Picture, WorkSell, WorkSellPhoto
from .models import (
Answer,
AnswerFile,
AnswerMessage,
Arbitration,
Candidate,
Order,
Portfolio,
PortfolioPhoto,
Project,
ProjectFile,
Realty,
TERM_TYPE_MORPHS,
)
from .forms import (
ContractorPortfolioTrashForm,
CustomerProjectDeleteForm,
@ -45,7 +59,9 @@ class ProjectDetailWithAnswerView(BaseMixin, View):
def get(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
context.update({'TERM_TYPE_MORPHS': TERM_TYPE_MORPHS})
project = get_object_or_404(Project, pk=kwargs.get('pk'))
context.update({'project': project})
@ -205,6 +221,11 @@ class RejectProjectAnswerView(BaseMixin, View):
answer.rejected = True
answer.save()
candidate = Candidate.objects.filter(answer=answer)
if candidate:
candidate.delete()
messages.info(request, 'Успешный отказ от проекта')
redirect_to = request.POST.get('next')
@ -589,19 +610,28 @@ class CustomerProjectDeleteView(View):
class ProjectComparisonView(DetailView):
model = Project
template_name = 'comparison.html'
# def get(self, request, **kwargs):
# self.object = self.get_object()
def get_context_data(self, **kwargs):
c = super().get_context_data(**kwargs)
c['TERM_TYPE_MORPHS'] = TERM_TYPE_MORPHS
return c
def add_candidate(request, answer_id, project_id):
answer = Answer.objects.get(pk=answer_id)
project = Project.objects.get(pk=project_id)
count_answers = Candidate.objects.filter(project=project).count()
count_answers += 1
candidate = Candidate.objects.create(answer=answer, project=project, position=count_answers)
return HttpResponseRedirect(reverse('projects:detail', args=[project_id]))
candidate = Candidate.objects.filter(answer=answer).first()
if not candidate:
Candidate.objects.create(answer=answer, project=project, position=count_answers)
return redirect('projects:detail', pk=project_id)
class CandidateDeleteView(DeleteView):

@ -1,48 +0,0 @@
{% load staticfiles %}
<!doctype html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge, chrome=1'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<!--<meta name='viewport' content='initial-scale=1.0, user-scalable=no, maximum-scale=1'>-->
<title>Archilance</title>
<link rel='stylesheet' href='{% static "css/bootstrap.css" %}'>
<link rel='stylesheet' href='{% static "lib/bootstrap-select/css/bootstrap-select.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 "css/dev-colors.css" %}'> <!-- Dev-time only, temporary!!! -->
</head>
<body>
{% if messages %}
{% for message in messages %}
<div class="c" style='padding: 10px; margin-bottom: 6px'>{{ message | safe }}</div>
{% endfor %}
{% endif %}
{% block content %}{% endblock %}
<script src='{% static "lib/lodash/lodash.js" %}'></script>
<script src='{% static "lib/lodash/lodash.fp.js" %}'></script>
<script src='{% static "js/jquery-2.2.3.min.js" %}'></script>
<script src='{% static "js/bootstrap.min.js" %}'></script>
<script src='{% static "lib/bootstrap-select/js/bootstrap-select.js" %}'></script>
<script src='{% static "lib/jquery.fileupload/js/vendor/jquery.ui.widget.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 "my-libs.js" %}'></script>
<script src='{% static "js/main.js" %}'></script> <!-- Файл верстальщика -->
<script src='{% static "index.js" %}'></script> <!-- Файл программистов -->
{% block js_block %}{% endblock %}
</body>
</html>

@ -7,25 +7,44 @@
<div class="container-fluid topMain">
<div class="row">
<div class="col-lg-3">
<div class="logo" onClick="window.location='/'"></div>
<a href="/"><div class="logo"></div></a>
</div>
{% activeurl %}
{% if request.user.is_authenticated %}
<div class="col-lg-7">
<ul class="mainMenu">
<li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Биржа проектов</a>
<span></span>
</li>
{% if request.user.is_contractor %}
<li class="officeList icon_tml">
<a href="{% url 'users:contractor-office' pk=request.user.pk %}">Мой офис</a>
{% activeurl %}
{% if request.user.is_authenticated %}
<div class="col-lg-7">
<ul class="mainMenu">
<li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Биржа проектов</a>
<span></span>
</li>
{% if request.user.is_contractor %}
<li class="officeList icon_tml">
<a href="{% url 'users:contractor-office' pk=request.user.pk %}">Мой офис</a>
<span></span>
</li>
{% endif %}
{% if request.user.is_customer %}
<li class="icon_tm2">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
<span></span>
</li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Работы на продажу</a>
<span></span>
</li>
{% endif %}
</ul>
</div>
{% else %}
<div class="col-lg-7">
<ul class="mainMenu">
<li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Биржа проектов</a>
<span></span>
</li>
{% endif %}
{% if request.user.is_customer %}
<li class="icon_tm2">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
<span></span>
@ -34,28 +53,11 @@
<a href="{% url 'work_sell:list' %}">Работы на продажу</a>
<span></span>
</li>
{% endif %}
</ul>
</div>
{% else %}
<div class="col-lg-7">
<ul class="mainMenu">
<li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Биржа проектов</a>
<span></span>
</li>
<li class="icon_tm2">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
<span></span>
</li>
<li class="icon_tm3">
<a href="{% url 'work_sell:list' %}">Работы на продажу</a>
<span></span>
</li>
</ul>
</div>
{% endif %}
{% endactiveurl %}
</ul>
</div>
{% endif %}
{% endactiveurl %}
{% if request.user.is_authenticated %}
<div class="col-lg-2">
<div class="imgProfile">

@ -1,6 +1,6 @@
{% extends 'partials/base_test.html' %}
{#{% extends 'partials/base.html' %}#}
{% block content %}
{#{% block content %}#}
<div class='container-fluid'>
<div class='row'>
<div class='col-xs-12' style='margin-top: 15px'>
@ -8,4 +8,4 @@
</div>
</div>
</div>
{% endblock %}
{#{% endblock %}#}

@ -182,12 +182,17 @@ class User(AbstractBaseUser, PermissionsMixin):
return current_sum
def summary(self):
age = relativedelta(timezone.now(), util.to_local_datetime(self.date_of_birth)).years
if self.date_of_birth:
years = relativedelta(timezone.now(), util.to_local_datetime(self.date_of_birth)).years
age = '%s %s' % (years, util.morph(years, ('год', 'года', 'лет')))
dob = formats.date_format(self.date_of_birth, 'DATE_FORMAT')
else:
age = dob = None
return _.join(_.filter((
self.get_gender_display(),
'%s %s' % (age, util.morph(age, ('год', 'года', 'лет'))),
formats.date_format(self.date_of_birth, 'DATE_FORMAT'),
age,
dob,
), _.identity), ', ')
USERNAME_FIELD = 'username'

@ -78,7 +78,7 @@
<div class="col-lg-3 rightPro">
<p class="cenaPro">
{{ project.budget }} <i class="fa fa-rub"></i>
{{ project.budget }} <i class="{% fa_currency_classes project.currency %}"></i>
</p>
<ul>

@ -281,7 +281,7 @@
<div class="cenaImg box-sizing">
<div class="cenaImgInset">
{{ ws.budget }} <i class="fa fa-rub"></i>
{{ ws.budget }} <i class="{% fa_currency_classes ws.currency %}"></i>
</div>
</div>
</div>
@ -418,7 +418,7 @@
</div>
<div class="col-lg-12 wr-inset-pluss">
<div class="pluss-block" id="resume-text-out">
{{ contractor.contractor_resume.text | safe }}
{{ 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>
@ -562,7 +562,7 @@
{% block js_block %}
<script type="text/javascript">
;(function() {
(function() {
// Pagination ---------------------------------------------------
var $portfoliosContainer = $('.-portfolios-container').first()
@ -653,6 +653,16 @@
loadMoreWorkSells()
// Persistent Bootstrap tabs --------------------------------------
$('a[data-toggle="tab"][href="' + window.location.hash + '"]').tab('show')
$('a[data-toggle="tab"]').on('click', function($evt) { // Better handle "shown.bs.tab" event?
window.location.hash = $(this).attr('href')
})
//-----------------------------------------------------------------

@ -71,7 +71,7 @@
<div class="col-lg-3 rightPro right-pro-red">
<p class="cenaPro">
{{ proj.budget }} <i class="fa fa-rub"></i>
{{ proj.budget }} <i class="{% fa_currency_classes proj.currency %}"></i>
</p>
{% if request.user == proj.customer %}

@ -68,7 +68,7 @@
</div>
<div class="col-lg-3 rightPro right-pro-red">
<p class="cenaPro">
{{ proj.budget }} <i class="fa fa-rub"></i>
{{ proj.budget }} <i class="{% fa_currency_classes proj.currency %}"></i>
</p>
{% if request.user == proj.customer %}

@ -4,7 +4,7 @@ from mptt.models import TreeForeignKey
from sorl.thumbnail import ImageField
from users.models import User, Team
from projects.models import BuildingClassfication, ConstructionType, TERMS, CURRENCIES
from projects.models import BuildingClassfication, ConstructionType, TERM_TYPES, CURRENCIES
from specializations.models import Specialization
@ -22,7 +22,7 @@ class WorkSell(models.Model):
name = models.CharField(max_length=255)
specialization = TreeForeignKey(Specialization, related_name='worksells', null=True, blank=True)
term = models.IntegerField(default=0, null=True, blank=True)
term_type = models.CharField(max_length=20, choices=TERMS, default='hour', null=True, blank=True)
term_type = models.CharField(max_length=20, choices=TERM_TYPES, default='hour', null=True, blank=True)
def __str__(self):
return self.name

@ -23,7 +23,7 @@
<div class="btnReadyBlock disTab">
<div class="triangle1"></div>
<div class="col-lg-3">
<p class="cenaReady">{{ object.budget }} <i class="fa fa-rub"></i></p>
<p class="cenaReady">{{ object.budget }} <i class="{% fa_currency_classes object.currency %}"></i></p>
</div>
{% if request.user.is_authenticated %}
<div class="col-lg-3">

@ -149,7 +149,7 @@
</a>
<div class="cenaImg box-sizing">
<div class="cenaImgInset">
{{ work.budget }}<i class="fa fa-rub"></i>
{{ work.budget }}<i class="{% fa_currency_classes work.currency %}"></i>
</div>
</div>
</div>

Loading…
Cancel
Save