#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 = [
url(r'^$', HomeTemplateView.as_view()),
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'^test/$', TemplateView.as_view(template_name='test.html'), name='test'),
url(r'^projects/', include('projects.urls')),

@ -4,6 +4,7 @@ from django.template.loader import render_to_string
from projects.models import Order
from common.models import MainPage, PrintDocuments
from users.models import ContractorResumeFiles
class HomeTemplateView(View):
@ -18,28 +19,5 @@ class TestChatTemplateView(View):
template_name = 'chat_test.html'
def get(self, request, *args, **kwargs):
from common.models import PrintDocuments
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})
diploms = ContractorResumeFiles.objects.all()
return render(request, 'chat_test.html', {'diploms': diploms})

@ -6,7 +6,7 @@ from django.views.generic import View
from archilance.mixins import BaseMixin
from .forms import PrintOrderForm
from .models import PrintDocuments, PrintOrder
from .models import PrintDocuments, PrintOrder, Settings
class PrintDocumentCreate(BaseMixin, View):
@ -45,7 +45,9 @@ class PrintDocumentCreate(BaseMixin, View):
'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)
html_content = get_template('document_email.html').render(ctx_dict)
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])

@ -1,17 +1,112 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Демо чат</h1>
<h2>{{ order}}</h2>
<div id="message_chat">
{{ html_content }}
</div>
</body>
</html>
{% extends 'partials/base.html' %}
{% load thumbnail %}
{% block content %}
{% include 'partials/header.html' %}
<h1>Test file</h1>
<div class="gal-pluss">
<div class="inset-gp">
<p class="title-gp">Дипломы / Сертификаты</p>
<div class="upload2 up-l3">
<input type="file" name="upload" id="diplom-upload" class="diplom-upload">
<p>Загрузить файл</p>
</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 "lib/jquery.fileupload/css/jquery.fileupload.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/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-process.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="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='{% static "my-libs.js" %}'></script>

@ -2,12 +2,22 @@ from django import forms
import itertools
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 projects.models import Project, Realty, BuildingClassfication, ConstructionType
from specializations.models import Specialization
class TeamForm(forms.ModelForm):
class Meta:
model = Team
fields = (
'name',
'owner',
)
class UserProfileEditForm(forms.ModelForm):
gender = forms.ChoiceField(
choices=GENDERS,

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

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

@ -117,12 +117,14 @@
<div class="tab-content">
<div id="tab11" class="tab-pane fade in active">
{% if contractor.pk == request.user.pk %}
<div class="col-lg-9">
<p class="addWork">
<a href="#" data-toggle="modal" data-target="#portfolio-modal">Добавить работу</a>
</p>
</div>
<div id="portfolio-modal" class="modal fade">
<div class="modal-dialog" style="width:900px;">
<div class="modal-content">
@ -135,7 +137,7 @@
</div>
</div>
</div>
{% endif %}
<div class="galleryWork2 disTab">
{% for p in user.portfolios.all %}
@ -172,6 +174,7 @@
</div>
<div id="tab12" class="tab-pane fade">
{% if contractor.pk == request.user.pk %}
<div class="col-lg-9">
<p class="addWork">
<a href="#" data-toggle="modal" data-target="#worksell-modal">Добавить проект</a>
@ -189,6 +192,8 @@
</div>
</div>
</div>
{% endif %}
<div class="galleryWork2 disTab">
{% for ws in user.work_sell.all %}
<div class="col-lg-4">
@ -319,10 +324,10 @@
<div class="inset-gp">
<p class="title-gp">Дипломы / Сертификаты</p>
<div class="upload2 up-l3">
<input type="file" name="upload">
<input type="file" name="file" id="diplom-upload" multiple>
<p>Загрузить файл</p>
</div>
<div class="galleryWork2 gal-iss disTab">
<div class="galleryWork2 gal-iss disTab" id="diplom-gallery">
{% for diplom in resume_diploms %}
<div class="col-lg-4">
@ -353,10 +358,10 @@
<div class="inset-gp">
<p class="title-gp">Допуск СРО</p>
<div class="upload2 up-l3">
<input type="file" name="upload">
<input type="file" name="file" id="cro-upload">
<p>Загрузить файл</p>
</div>
<div class="galleryWork2 gal-iss disTab">
<div class="galleryWork2 gal-iss disTab" id="cro-gallery">
{% for cro in resume_cro %}
<div class="col-lg-4">
@ -488,6 +493,7 @@
});
var url = '/work_sell/basic/';
var csrftoken = $.cookie('csrftoken');
$('#fileupload').fileupload({
url: url,
crossDomain: false,
@ -522,6 +528,73 @@
}
}).prop('disabled', !$.support.fileInput)
.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 .models import User, Team, UserFinancialInfo
from .forms import TeamForm
from archilance import util
from archilance.mixins import BaseMixin
from projects.forms import PortfolioForm
from projects.models import Project
from projects.models import Project, Portfolio
from reviews.models import Review
from specializations.models import Specialization
from work_sell.forms import WorkSellForm
from work_sell.models import WorkSell
from .forms import (
ContractorFilterForm,
@ -341,6 +343,22 @@ class ContractorOfficeDetailView(DetailView):
model = User
template_name = 'contractor_office.html'
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):

Loading…
Cancel
Save