#ARC-19 Add group office page

remotes/origin/setup
Mukhtar 10 years ago
parent 5d06b0e51d
commit 744df48a0f
  1. 2
      archilance/urls.py
  2. 28
      archilance/views.py
  3. 6
      common/views.py
  4. 129
      templates/chat_test.html
  5. 6
      templates/partials/base.html
  6. 12
      users/forms.py
  7. 3
      users/models.py
  8. 198
      users/templates/contractor_office.html
  9. 83
      users/templates/contractor_profile.html
  10. 20
      users/views.py

@ -11,7 +11,7 @@ from .views import HomeTemplateView, TestChatTemplateView
urlpatterns = [ urlpatterns = [
url(r'^$', HomeTemplateView.as_view()), url(r'^$', HomeTemplateView.as_view()),
url('', include('social.apps.django_app.urls', namespace='social')), url('', include('social.apps.django_app.urls', namespace='social')),
url(r'^chattest$', TestChatTemplateView.as_view()), url(r'^chattest/$', TestChatTemplateView.as_view()),
url(r'^work_sell/', include('work_sell.urls')), url(r'^work_sell/', include('work_sell.urls')),
url(r'^test/$', TemplateView.as_view(template_name='test.html'), name='test'), url(r'^test/$', TemplateView.as_view(template_name='test.html'), name='test'),
url(r'^projects/', include('projects.urls')), url(r'^projects/', include('projects.urls')),

@ -4,6 +4,7 @@ from django.template.loader import render_to_string
from projects.models import Order from projects.models import Order
from common.models import MainPage, PrintDocuments from common.models import MainPage, PrintDocuments
from users.models import ContractorResumeFiles
class HomeTemplateView(View): class HomeTemplateView(View):
@ -18,28 +19,5 @@ class TestChatTemplateView(View):
template_name = 'chat_test.html' template_name = 'chat_test.html'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
from common.models import PrintDocuments diploms = ContractorResumeFiles.objects.all()
return render(request, 'chat_test.html', {'diploms': diploms})
print_documents = PrintDocuments.objects.all()
limit_size = 10 * 1024 * 1024
attachments = []
link_files = []
for f in print_documents:
if f.file.size > limit_size:
link_files.append(f.file.path)
else:
attachments.append(f.file.path)
html_content = render_to_string('document_email.txt',
{
'username': 'Mukhtar',
'phone': '89634004278',
'files': link_files,
}
)
print(html_content)
return render(request, 'chat_test.html', {'html_content': html_content})

@ -6,7 +6,7 @@ from django.views.generic import View
from archilance.mixins import BaseMixin from archilance.mixins import BaseMixin
from .forms import PrintOrderForm from .forms import PrintOrderForm
from .models import PrintDocuments, PrintOrder from .models import PrintDocuments, PrintOrder, Settings
class PrintDocumentCreate(BaseMixin, View): class PrintDocumentCreate(BaseMixin, View):
@ -45,7 +45,9 @@ class PrintDocumentCreate(BaseMixin, View):
'files': link_files, 'files': link_files,
} }
subject, from_email, to = 'Заявка на распечатку', 'mukhtar@mukhtar', 'muhtarzubanchi05@gmail.com'
settings = Settings.objects.all().first().doc
subject, from_email, to = 'Заявка на распечатку', 'mukhtar@mukhtar', settings.document_send_email
text_content = render_to_string('document_email.txt', ctx_dict) text_content = render_to_string('document_email.txt', ctx_dict)
html_content = get_template('document_email.html').render(ctx_dict) html_content = get_template('document_email.html').render(ctx_dict)
msg = EmailMultiAlternatives(subject, text_content, from_email, [to]) msg = EmailMultiAlternatives(subject, text_content, from_email, [to])

@ -1,17 +1,112 @@
<!DOCTYPE html> {% extends 'partials/base.html' %}
<html lang="en">
<head> {% load thumbnail %}
<meta charset="UTF-8">
<title>Title</title>
</head> {% block content %}
<body> {% include 'partials/header.html' %}
<h1>Демо чат</h1> <h1>Test file</h1>
<h2>{{ order}}</h2> <div class="gal-pluss">
<div class="inset-gp">
<p class="title-gp">Дипломы / Сертификаты</p>
<div id="message_chat"> <div class="upload2 up-l3">
{{ html_content }}
</div> <input type="file" name="upload" id="diplom-upload" class="diplom-upload">
<p>Загрузить файл</p>
</body>
</html> </div>
<div class="galleryWork2 gal-iss disTab">
{% for diplom in 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;">
<div class="imgFigure"></div>
</div>
{% endthumbnail %}
</div>
<div class="insetCol2 box-sizing disTab">
<p>
{{ diplom.title }}
</p>
<div class="buttonsImg" distab="">
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div>
</div>
</div>
</div>
{% endfor %}
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block js_block %}
<script type="text/javascript">
'use_strict';
function csrfSafeMethod(method) {
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$(function () {
var url = '/work_sell/basic/';
var csrftoken = $.cookie('csrftoken');
alert(csrftoken);
$('#diplom-upload').fileupload({
url: url,
crossDomain: false,
beforeSend: function (xhr, settings) {
$('#progress .progress-bar').css(
'width',
'0%'
);
if (!csrfSafeMethod(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
},
dataType: 'json',
done: function (e, data) {
alert(data);
console.log(data);
$.each(data.result.files, function (index, file) {
var img = $('<img style="width:200px;height:200px;margin:10px;">').attr('src', file.url).appendTo('.galleryWork2');
console.log(file);
{# var currentValue = $("#upload-files-pk").val();#}
{# currentValue += file.id + ';';#}
{# $("#upload-files-pk").val(currentValue);#}
});
},
error: function(e, data){
alert(e);
console.log(e);
console.log(data);
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
console.log(progress);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
</script>
{% endblock %}

@ -20,7 +20,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" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.css" />#} <link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.css" />
<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 -->
@ -60,8 +60,8 @@
<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="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>#} <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
{#<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.js"></script>#} <script src="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.js"></script>
<script src='{% static "my-libs.js" %}'></script> <script src='{% static "my-libs.js" %}'></script>

@ -2,12 +2,22 @@ from django import forms
import itertools import itertools
import pydash as _; _.map = _.map_; _.filter = _.filter_ import pydash as _; _.map = _.map_; _.filter = _.filter_
from .models import User, UserFinancialInfo, GENDERS from .models import User, UserFinancialInfo, Team, GENDERS
from common.models import Location from common.models import Location
from projects.models import Project, Realty, BuildingClassfication, ConstructionType from projects.models import Project, Realty, BuildingClassfication, ConstructionType
from specializations.models import Specialization from specializations.models import Specialization
class TeamForm(forms.ModelForm):
class Meta:
model = Team
fields = (
'name',
'owner',
)
class UserProfileEditForm(forms.ModelForm): class UserProfileEditForm(forms.ModelForm):
gender = forms.ChoiceField( gender = forms.ChoiceField(
choices=GENDERS, choices=GENDERS,

@ -177,6 +177,9 @@ class User(AbstractBaseUser, PermissionsMixin):
def is_owner_profile(self, user_id): def is_owner_profile(self, user_id):
pass pass
def is_owner_team(self):
return Team.objects.filter(owner=self.pk).exists()
class Team(models.Model): class Team(models.Model):
created = models.DateTimeField(default=timezone.now) created = models.DateTimeField(default=timezone.now)

@ -1,6 +1,7 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %} {% load staticfiles %}
{% load thumbnail %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
@ -51,11 +52,31 @@
Группа 1 Группа 1
<span><mark>7</mark></span> <span><mark>7</mark></span>
</button> </button>
{% if contractor.is_owner_team %}
<button type="button" class="btn btn-default add-group"> <button type="button" class="btn btn-default add-group" data-toggle="modal" data-target="#myModal">
+ Добавить группу + Добавить группу
</button> </button>
{% endif %}
</div> </div>
<!-- Modal -->
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
<h4 class="modal-title" id="myModalLabel">Добавление новой группы</h4>
</div>
<div class="modal-body">
{{ form_team }}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Закрыть</button>
<button type="button" class="btn btn-primary">Сохранить</button>
</div>
</div>
</div>
</div>
</div> </div>
<div class="projectsBlock disTab"> <div class="projectsBlock disTab">
@ -63,7 +84,9 @@
<div class="col-lg-3 divCol3"> <div class="col-lg-3 divCol3">
<div class="avatar"> <div class="avatar">
<div class="avatarInset"> <div class="avatarInset">
<img src="img/profile.jpg" alt="profile-image"> {% thumbnail contractor.avatar "265x264" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
</div> </div>
</div> </div>
@ -74,30 +97,25 @@
<div class="block-users"> <div class="block-users">
<p>Состав группы</p> <p>Состав группы</p>
{% for p in participants %}
<div class="message-new"> <div class="message-new">
<div class="imgMess"> <div class="imgMess">
<img src="img/mess.png" alt="mess-image"> {% thumbnail p.avatar "60x60" crop="center" as im %}
</div> <img src="{{ im.url }}" alt="mess-image">
{% endthumbnail %}
<p class="nameMess">
<a href="#">Иванов Петр Иванович</a>
</p>
<span>Программист</span>
</div>
<div class="message-new">
<div class="imgMess">
<img src="img/mess.png" alt="mess-image">
</div> </div>
<p class="nameMess"> <p class="nameMess">
<a href="#">Иванов Петр Иванович</a> <a href="#">{{ p.get_full_name }}</a>
</p> </p>
<span>Программист</span> <span>Программист</span>
</div> </div>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>
@ -105,17 +123,18 @@
<div class="col-lg-9 divCol9"> <div class="col-lg-9 divCol9">
<div class="col-lg-4"> <div class="col-lg-4">
<p class="nameUser"> <p class="nameUser">
Название группы {{ contractor.team }}
</p> </p>
<p class="cityUser">Россия, Москва</p> <p class="cityUser">Россия, Москва</p>
<p class="navv">На сайте 8 лет и 3 месяца</p> {# <p class="navv">На сайте 8 лет и 3 месяца</p>#}
<p class="navv">На сайте {{ contractor.team.created }}</p>
<p class="navv"> <p class="navv">
Кол-во человек: <span>4</span> Кол-во человек: <span>{{participants_count}}</span>
</p> </p>
<p class="navv"> <p class="navv">
Выполненных проектов: <span>78</span> Выполненных проектов: <span>0</span>
</p> </p>
<div class="statusUser st-new">Label</div> <div class="statusUser st-new">Свободен</div>
<a href="javascript:void(0)" class="new-prop new-prop2 new-prop3">написать сообщение</a> <a href="javascript:void(0)" class="new-prop new-prop2 new-prop3">написать сообщение</a>
</div> </div>
@ -167,77 +186,118 @@
</div> </div>
</div> </div>
</div> </div>
<div class="col-lg-9"> <div class="col-lg-9">
<div class="profileTabs2"> <div class="profileTabs2">
<ul class="nav nav-tabs nav-justified"> <ul class="nav nav-tabs nav-justified">
<li role="presentation" class="active"> <li role="presentation" class="active">
<a href="#">Портфолио</a> <a href="#tab11" data-toggle="tab">Портфолио</a>
</li> </li>
<li role="presentation"> <li role="presentation">
<a href="#">Готовые проекты</a> <a href="#tab12" data-toggle="tab">Готовые проекты</a>
</li> </li>
<li role="presentation"> <li role="presentation">
<a href="#">Резюме / Квалификация</a> <a href="#tab13" data-toggle="tab">Отзывы</a>
</li>
<li role="presentation">
<a href="#">Отзывы</a>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
<div class="col-lg-9"> <div class="tab-content">
<p class="addWork">Добавить работу</p> <div id="tab11" class="tab-pane fade in active">
</div>
<div class="galleryWork2 disTab">
<div class="galleryWork2 gw-new disTab"> {% for p in portfolios %}
<div class="col-lg-4"> <div class="col-lg-4">
<div class="insetCol box-sizing disTab"> <div class="insetCol box-sizing disTab">
<div class="imgGal"> <div class="imgGal"
<div class="imgFigure"></div> style="background:rgba(0, 0, 0, 0) url('{{ p.get_cover }}') no-repeat scroll center center / cover ;">
</div> <div class="imgFigure"></div>
</div> </div>
<div class="insetCol2 box-sizing disTab">
<p>
Визуализация
загородного
дома 1500m2
</p>
<div class="buttonsImg" disTab>
<div class="insetBI insetBI1">
<i class="fa fa-pencil"></i>
</div> </div>
<div class="insetBI insetBI2"> <div class="insetCol2 box-sizing disTab">
<i class="fa fa-times"></i> <p>{{ p.name }}</p>
<div class="buttonsImg" disTab>
<a href="{% url 'projects:contractor-portfolio-edit' p.pk %}">
<div class="insetBI insetBI1">
<i class="fa fa-pencil"></i>
</div>
</a>
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div>
</div>
</div> </div>
</div> </div>
{% endfor %}
</div>
<div class="col-lg-9 col-lg-offset-3">
<div class="linkElse">
<a href="javascript:void(0)" class="showElse">показать еще</a>
</div> </div>
</div> </div>
</div>
<div class="col-lg-4">
<div class="insetCol box-sizing disTab"> <div id="tab12" class="tab-pane fade">
<div class="imgGal">
<div class="imgFigure"></div> <div class="galleryWork2 disTab">
{% for ws in work_sells %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
<div class="imgGal"
style="background:rgba(0, 0, 0, 0) url('/media/{{ ws.img }}') no-repeat scroll center center / cover ;">
<div class="imgFigure"></div>
</div>
<div class="cenaImg box-sizing">
<div class="cenaImgInset">
{{ ws.budget }} <i class="fa fa-rub"></i>
</div>
</div>
</div>
<div class="insetCol2 box-sizing disTab">
<p>{{ ws }}</p>
</div>
</div> </div>
{% endfor %}
</div>
<div class="col-lg-9 col-lg-offset-3">
<div class="linkElse">
<a href="javascript:void(0)" class="showElse">показать еще</a>
</div> </div>
<div class="insetCol2 box-sizing disTab"> </div>
<p> </div>
Визуализация
загородного <div id="tab13" class="tab-pane fade">
дома 1500m2 <div class="new-comm-44">
<div class="col-lg-12">
<p class="nameComm">
<a href="#">Иванов Петр Иванович</a>
</p> </p>
<div class="buttonsImg" disTab> <span class="dateComm44">
<div class="insetBI insetBI1"> Безопасная сделка
<i class="fa fa-pencil"></i> </span>
</div> <div class="stars box-sizing">
<div class="insetBI insetBI2"> <span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<i class="fa fa-times"></i> <span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
</div> <span class="glyphicon glyphicon-star starAct" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
<span class="glyphicon glyphicon-star" aria-hidden="true"></span>
<a href="#">положительный отзыв</a>
</div> </div>
<p class="textComm44">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean euismod bibendum
</p>
</div> </div>
</div> </div>
</div> </div>
</div>
</div> </div>
</div> </div>

@ -117,12 +117,14 @@
<div class="tab-content"> <div class="tab-content">
<div id="tab11" class="tab-pane fade in active"> <div id="tab11" class="tab-pane fade in active">
{% if contractor.pk == request.user.pk %}
<div class="col-lg-9"> <div class="col-lg-9">
<p class="addWork"> <p class="addWork">
<a href="#" data-toggle="modal" data-target="#portfolio-modal">Добавить работу</a> <a href="#" data-toggle="modal" data-target="#portfolio-modal">Добавить работу</a>
</p> </p>
</div> </div>
<div id="portfolio-modal" class="modal fade"> <div id="portfolio-modal" class="modal fade">
<div class="modal-dialog" style="width:900px;"> <div class="modal-dialog" style="width:900px;">
<div class="modal-content"> <div class="modal-content">
@ -135,7 +137,7 @@
</div> </div>
</div> </div>
</div> </div>
{% endif %}
<div class="galleryWork2 disTab"> <div class="galleryWork2 disTab">
{% for p in user.portfolios.all %} {% for p in user.portfolios.all %}
@ -172,6 +174,7 @@
</div> </div>
<div id="tab12" class="tab-pane fade"> <div id="tab12" class="tab-pane fade">
{% if contractor.pk == request.user.pk %}
<div class="col-lg-9"> <div class="col-lg-9">
<p class="addWork"> <p class="addWork">
<a href="#" data-toggle="modal" data-target="#worksell-modal">Добавить проект</a> <a href="#" data-toggle="modal" data-target="#worksell-modal">Добавить проект</a>
@ -189,6 +192,8 @@
</div> </div>
</div> </div>
</div> </div>
{% endif %}
<div class="galleryWork2 disTab"> <div class="galleryWork2 disTab">
{% for ws in user.work_sell.all %} {% for ws in user.work_sell.all %}
<div class="col-lg-4"> <div class="col-lg-4">
@ -319,10 +324,10 @@
<div class="inset-gp"> <div class="inset-gp">
<p class="title-gp">Дипломы / Сертификаты</p> <p class="title-gp">Дипломы / Сертификаты</p>
<div class="upload2 up-l3"> <div class="upload2 up-l3">
<input type="file" name="upload"> <input type="file" name="file" id="diplom-upload" multiple>
<p>Загрузить файл</p> <p>Загрузить файл</p>
</div> </div>
<div class="galleryWork2 gal-iss disTab"> <div class="galleryWork2 gal-iss disTab" id="diplom-gallery">
{% for diplom in resume_diploms %} {% for diplom in resume_diploms %}
<div class="col-lg-4"> <div class="col-lg-4">
@ -353,10 +358,10 @@
<div class="inset-gp"> <div class="inset-gp">
<p class="title-gp">Допуск СРО</p> <p class="title-gp">Допуск СРО</p>
<div class="upload2 up-l3"> <div class="upload2 up-l3">
<input type="file" name="upload"> <input type="file" name="file" id="cro-upload">
<p>Загрузить файл</p> <p>Загрузить файл</p>
</div> </div>
<div class="galleryWork2 gal-iss disTab"> <div class="galleryWork2 gal-iss disTab" id="cro-gallery">
{% for cro in resume_cro %} {% for cro in resume_cro %}
<div class="col-lg-4"> <div class="col-lg-4">
@ -488,6 +493,7 @@
}); });
var url = '/work_sell/basic/'; var url = '/work_sell/basic/';
var csrftoken = $.cookie('csrftoken'); var csrftoken = $.cookie('csrftoken');
$('#fileupload').fileupload({ $('#fileupload').fileupload({
url: url, url: url,
crossDomain: false, crossDomain: false,
@ -522,6 +528,73 @@
} }
}).prop('disabled', !$.support.fileInput) }).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled'); .parent().addClass($.support.fileInput ? undefined : 'disabled');
$('#diplom-upload').fileupload({
url: url,
crossDomain: false,
beforeSend: function (xhr, settings) {
$('#progress .progress-bar').css(
'width',
'0%'
);
if (!csrfSafeMethod(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
},
dataType: 'json',
done: function (e, data) {;
$.each(data.result.files, function (index, file) {
var htmlImg = '<div class="col-lg-4"><div class="insetCol box-sizing disTab"><div class="imgGal" style="background: url(+ file.url +) no-repeat center;"><div class="imgFigure"></div></div></div> ' +
'<div class="insetCol2 box-sizing disTab"><p>Название</p><div class="buttonsImg" distab="">' +
'<div class="insetBI insetBI2"><i class="fa fa-times"></i></div></div></div></div>';
var img = $(htmlImg).appendTo("#diplom-gallery");
});
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
$('#cro-upload').fileupload({
url: url,
crossDomain: false,
beforeSend: function (xhr, settings) {
$('#progress .progress-bar').css(
'width',
'0%'
);
if (!csrfSafeMethod(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
},
dataType: 'json',
done: function (e, data) {;
$.each(data.result.files, function (index, file) {
var htmlImg = '<div class="col-lg-4"><div class="insetCol box-sizing disTab"><div class="imgGal" style="background: url(+ file.url +) no-repeat center;"><div class="imgFigure"></div></div></div> ' +
'<div class="insetCol2 box-sizing disTab"><p>Название</p><div class="buttonsImg" distab="">' +
'<div class="insetBI insetBI2"><i class="fa fa-times"></i></div></div></div></div>';
var img = $(htmlImg).appendTo("#cro-gallery");
});
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
}); });

@ -15,13 +15,15 @@ import pydash as _; _.map = _.map_; _.filter = _.filter_
from .mixins import CheckForUserMixin from .mixins import CheckForUserMixin
from .models import User, Team, UserFinancialInfo from .models import User, Team, UserFinancialInfo
from .forms import TeamForm
from archilance import util from archilance import util
from archilance.mixins import BaseMixin from archilance.mixins import BaseMixin
from projects.forms import PortfolioForm from projects.forms import PortfolioForm
from projects.models import Project from projects.models import Project, Portfolio
from reviews.models import Review from reviews.models import Review
from specializations.models import Specialization from specializations.models import Specialization
from work_sell.forms import WorkSellForm from work_sell.forms import WorkSellForm
from work_sell.models import WorkSell
from .forms import ( from .forms import (
ContractorFilterForm, ContractorFilterForm,
@ -341,6 +343,22 @@ class ContractorOfficeDetailView(DetailView):
model = User model = User
template_name = 'contractor_office.html' template_name = 'contractor_office.html'
context_object_name = 'contractor' context_object_name = 'contractor'
form_team = TeamForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['form_team'] = TeamForm
if self.object.is_owner_team():
participants = self.object.team.users.all()
user_ids = [p.pk for p in participants]
context['participants'] = participants
context['participants_count'] = len(participants)
portfolios = Portfolio.objects.filter(user__in=user_ids)
work_sells = WorkSell.objects.filter(contractor__in=user_ids)
context['portfolios'] = portfolios
context['work_sells'] = work_sells
return context
class CustomerProfileOpenProjectsView(BaseMixin, View): class CustomerProfileOpenProjectsView(BaseMixin, View):

Loading…
Cancel
Save