#ARC-2 Fixes links and templates

remotes/origin/PR-39
Mukhtar 10 years ago
parent 0eaa171dbf
commit 99d88a87f4
  1. 1
      archilance/settings/base.py
  2. 243
      chat/templates/chat_contractor.html
  3. 53
      chat/templates/chat_customer.html
  4. 3
      chat/views.py
  5. 1
      common/models.py
  6. 16
      projects/migrations/0006_merge.py
  7. 6
      templates/partials/footer.html
  8. 2
      templates/partials/header.html
  9. 4
      templates/registration/login.html
  10. 33
      work_sell/forms.py
  11. 5
      work_sell/templates/worksell_detail.html
  12. 2
      work_sell/templates/worksell_edit.html
  13. 28
      work_sell/templates/worksells_list.html
  14. 3
      work_sell/urls.py
  15. 68
      work_sell/views.py

@ -224,6 +224,7 @@ AUTH_USER_MODEL = 'users.User'
ACCOUNT_ACTIVATION_DAYS = 7
REGISTRATION_AUTO_LOGIN = True
LOGIN_REDIRECT_URL = '/projects/'
LOGIN_URL = '/users/login/'
if DEBUG:
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'

@ -24,9 +24,9 @@
</li>
{% if team_orders %}
<li role="presentation">
<a href="#tab3" data-toggle="tab">Исполнители</a>
</li>
<li role="presentation">
<a href="#tab3" data-toggle="tab">Исполнители</a>
</li>
{% endif %}
</ul>
</div>
@ -34,7 +34,7 @@
</div>
<div class="tab-content">
<!-- Tab1 contacts block -->
<!-- Tab1 contacts block -->
<div class="chatBlock disTab tab-pane fade in active" id="tab1">
<div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab">
@ -47,9 +47,24 @@
{% endthumbnail %}
</div>
<p class="nameMess">
<div><a href="#" style="color:black;">{{ contact.username }}</a></div>
<div><a href="#" style="color:black;">{{ contact.username }}</a></div>
</p>
<a href="javascript:void(0)" class="conMess">Контакты</a>
<div class="modal fade" id="userModal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button class="close" type="button" data-dismiss="modal">x</button>
<h4 class="modal-title" id="myModalLabel">Название модального
окна</h4>
</div>
<div class="modal-body">
<h3>Содержимое модального окна</h3>
</div>
</div>
</div>
</div>
<a href="#" data-target="#userModal" data-toggle="modal" class="conMess">Контакты</a>
<span>0</span>
<a href="javascript:void(0)" class="deleteMess">
@ -70,7 +85,7 @@
<div class="bunChat">
<div class="setChat box-sizing">
<p>Прикрепить файл</p>
<span>Не более 10 файлов с общим объемом 500мб</span>
<span>Не более 10 файлов с общим объемом 500мб</span>
</div>
<a id="contact-chat-add-message" href="javascript:void(0)">отправить</a>
</div>
@ -85,16 +100,17 @@
</div>
</div>
</div>
<!-- End block Tab1 -->
<!-- End block Tab1 -->
<!-- Tab2 chat order block -->
<!-- Tab2 chat order block -->
<div class="chatBlock disTab tab-pane fade" id="tab2">
<div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab">
<p>Заказы</p>
{% for order in orders %}
<div class="orderBlock box-sizing order-block" data-recipent-id="{{ order.project.customer.pk }}" data-id="{{ order.id }}">
<div class="orderBlock box-sizing order-block"
data-recipent-id="{{ order.project.customer.pk }}" data-id="{{ order.id }}">
<span class="dimovChat"></span>
<p class="titleOB">{{ order }}</p>
<div class="hideOBB">
@ -121,7 +137,7 @@
<div class="bunChat">
<div class="setChat box-sizing">
<p>Прикрепить файл</p>
<span>Не более 10 файлов с общим объемом 500мб</span>
<span>Не более 10 файлов с общим объемом 500мб</span>
</div>
<a href="javascript:void(0)" id="order-chat-add-message">отправить</a>
</div>
@ -154,87 +170,89 @@
<p>Для заметок</p>
<form id="add-form-order-note">
<textarea id="chat2" name="text"></textarea>
<input type="hidden" name="order" id="orderNote" value="" />
<input type="hidden" name="sender" id="senderNote" value="{{ request.user.pk }}" />
<input type="hidden" name="recipent" id="recipentNote" value="" />
<input type="hidden" name="order" id="orderNote" value=""/>
<input type="hidden" name="sender" id="senderNote" value="{{ request.user.pk }}"/>
<input type="hidden" name="recipent" id="recipentNote" value=""/>
<a href="#" id="add-note-button">сохранить</a>
</form>
</div>
</div>
</div>
<!-- End block Tab2-->
{% if team_orders %}
<!-- Tab3 groups block -->
<div class="chatBlock disTab tab-pane fade" id="tab3">
<div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab">
<p>Заказы</p>
{% for torder in team_orders %}
<div class="team-order-block orderBlock box-sizing" data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk}}">
<span class="dimovChat"></span>
<p class="titleOB">
{{ torder }}
</p>
<div class="hideOBB disTab">
<p class="pOB">
{# <span>Заказчик:</span> {{ torder.project.customer }}#}
<span>Исполнитель:</span> {{ torder.team.name }}
</p>
<ul class="listChat1">
{% for tuser in torder.team.users.all %}
<li>{{ tuser }}</li>
{% endfor %}
</ul>
<p class="pOB">
<span>Чаты:</span>
{% for tuser in torder.team.users.all %}
{% if request.user.pk != tuser.pk %}
<span class="team-chat-user" data-id="{{ tuser.pk }}">{{ tuser.username }},</span>
{% endif %}
{% endfor %}
</p>
<a href="#" class="linkChat11">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
</a>
</div>
<!-- End block Tab2-->
{% if team_orders %}
<!-- Tab3 groups block -->
<div class="chatBlock disTab tab-pane fade" id="tab3">
<div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab">
<p>Заказы</p>
{% for torder in team_orders %}
<div class="team-order-block orderBlock box-sizing"
data-team-id="{{ torder.team.pk }}" data-order-id="{{ torder.pk }}">
<span class="dimovChat"></span>
<p class="titleOB">
{{ torder }}
</p>
<div class="hideOBB disTab">
<p class="pOB">
{# <span>Заказчик:</span> {{ torder.project.customer }}#}
<span>Исполнитель:</span> {{ torder.team.name }}
</p>
<ul class="listChat1">
{% for tuser in torder.team.users.all %}
<li>{{ tuser }}</li>
{% endfor %}
</ul>
<p class="pOB">
<span>Чаты:</span>
{% for tuser in torder.team.users.all %}
{% if request.user.pk != tuser.pk %}
<span class="team-chat-user"
data-id="{{ tuser.pk }}">{{ tuser.username }},</span>
{% endif %}
{% endfor %}
</p>
<a href="#" class="linkChat11">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
</a>
</div>
</div>
{% endfor %}
</div>
{% endfor %}
</div>
</div>
<div class="col-lg-6 commChat">
<div id="message-chat-team-space"></div>
<form id="team-chat-form">
<input type="text" name="sender" id="senderId" value="{{ request.user.pk }}" />
<input type="text" name="recipent" id="recipentId" value="" />
<input type="text" name="order" id="orderId" value="" />
<input type="text" name="team" id="teamId" value="" />
<input type="text" name="document-send" id="documentSendIds" />
<textarea id="chatText" class="chat-textarea box-sizing"></textarea>
<div class="bunChat">
<div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-team"/>
<p>Прикрепить файл</p>
</div>
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
</div>
<div class="col-lg-6 commChat">
<div id="message-chat-team-space"></div>
<form id="team-chat-form">
<input type="text" name="sender" id="senderId" value="{{ request.user.pk }}"/>
<input type="text" name="recipent" id="recipentId" value=""/>
<input type="text" name="order" id="orderId" value=""/>
<input type="text" name="team" id="teamId" value=""/>
<input type="text" name="document-send" id="documentSendIds"/>
<textarea id="chatText" class="chat-textarea box-sizing"></textarea>
<div class="bunChat">
<div class="setChat box-sizing upload">
<input type="file" name="file" id="upload-document-team"/>
<p>Прикрепить файл</p>
</div>
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
</div>
<div id="document-send">
<div id="document-send">
</div>
<a href="javascript:void(0)" id="add-team-chat-message">отправить</a>
</div>
<a href="javascript:void(0)" id="add-team-chat-message">отправить</a>
</div>
</form>
</div>
</form>
</div>
<div class="col-lg-3 wrstepschat">
<div class="col-lg-3 wrstepschat">
</div>
</div>
</div>
<!-- End block Tab3-->
{% endif %}
<!-- End block Tab3-->
{% endif %}
</div>
{% include 'partials/footer.html' %}
</div>
@ -256,7 +274,7 @@
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain +':8888/chat/' + userId + '/';
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
@ -274,7 +292,7 @@
inbox = document.getElementById('message-chat-space');
} else if (message.answer_type == 'order' || message.answer_type == 'add_message_order') {
inbox = document.getElementById('message-chat-order-space');
} else if(message.answer_type == 'add_message_team'){
} else if (message.answer_type == 'add_message_team') {
inbox = document.getElementById('message-chat-team-space');
}
console.log(message.answer_type);
@ -294,7 +312,7 @@
console.log(data);
};
this.add_team_message = function(messageData){
this.add_team_message = function (messageData) {
console.log(messageData);
sock.send(JSON.stringify(messageData));
@ -327,16 +345,16 @@
var form = document.getElementById('message_form');
var csrftoken = getCookie('csrftoken');
setTimeout(function(){
$(".user-block").first().trigger('click');
setTimeout(function () {
$(".user-block").first().trigger('click');
}, 10);
setTimeout(function(){
$(".order-block").first().trigger('click');
setTimeout(function () {
$(".order-block").first().trigger('click');
}, 100);
setTimeout(function(){
$(".team-order-block").first().trigger('click');
setTimeout(function () {
$(".team-order-block").first().trigger('click');
}, 1000);
@ -354,12 +372,13 @@
}
},
dataType: 'json',
done: function (e, data) {;
done: function (e, data) {
;
$.each(data.result.files, function (index, file) {
var currentValue = $("#documentSendIds").val();
currentValue += file.id + ';';
$("#documentSendIds").val(currentValue);
var htmlImg = '<p>'+ file.name+'</p>';
var htmlImg = '<p>' + file.name + '</p>';
var document_send = $(htmlImg).appendTo("#document-send");
});
},
@ -374,23 +393,23 @@
.parent().addClass($.support.fileInput ? undefined : 'disabled');
$("#order-stages").on('click',"#approve-stages",function(e){
$("#order-stages").on('click', "#approve-stages", function (e) {
e.preventDefault();
$(".stage-block-approve").each(function(){
var stageId = $(this).attr('data-id');
$(".stage-block-approve").each(function () {
var stageId = $(this).attr('data-id');
$.ajax({
url: '/api/stages/' + stageId + '/',
type: 'PATCH',
beforeSend: function(xhr){
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: "status=in_process",
dataType:'json',
success: function(json){
dataType: 'json',
success: function (json) {
console.log(json);
},
error: function(e){
error: function (e) {
console.log('error');
console.log(e);
}
@ -399,13 +418,13 @@
});
});
$(".team-chat-user").on('click',function(e){
$(".team-chat-user").on('click', function (e) {
e.stopPropagation();
var recipentId = $(this).attr('data-id');
$("#team-chat-form #recipentId").val(recipentId);
});
$(".team-order-block").on('click', function(){
$(".team-order-block").on('click', function () {
$('.team-order-block').each(function () {
$(this).removeClass('orAct');
@ -423,7 +442,7 @@
$.ajax({
url: '/api/message',
type: 'GET',
data: {csrfmiddlewaretoken: csrftoken, 'team': teamId,'order': orderId},
data: {csrfmiddlewaretoken: csrftoken, 'team': teamId, 'order': orderId},
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
@ -489,7 +508,7 @@
console.log(json.results);
var noteHtmlInbox = '';
$.each(json.results, function (i, v) {
noteHtmlInbox += '<li>'+ v.text +'<li>';
noteHtmlInbox += '<li>' + v.text + '<li>';
});
$(".notes-block").html(noteHtmlInbox);
@ -508,15 +527,15 @@
if (json.results.length > 0) {
$.each(json.results, function (i, v) {
if(v.is_paid){
stagesReservedHtml += '<li class="reserved">Сумма за этап '+ i +'.Зарезервирована.</li>';
}else{
stagesReservedHtml += '<li class="unreserved">Сумма за этап '+ i +'.Не зарезервирована.</li>';
if (v.is_paid) {
stagesReservedHtml += '<li class="reserved">Сумма за этап ' + i + '.Зарезервирована.</li>';
} else {
stagesReservedHtml += '<li class="unreserved">Сумма за этап ' + i + '.Не зарезервирована.</li>';
}
htmlInbox += '<div data-id="' + v.id + '" class="numberStepp box-sizing stage-block-approve"><div class="insetNumStepp">' +
'<p class="titleNumStepp"><span>Этап ' + v.pos + '</span>' + v.name + '</p>' +
'<p class="textNumStepp">Результаты этапа:' + v.result + '</p><div>' +
'<p>'+ v.status+'</p><span>' + v.cost + '<i class="fa fa-rub"></i></span></div></div></div>';
'<p>' + v.status + '</p><span>' + v.cost + '<i class="fa fa-rub"></i></span></div></div></div>';
});
htmlInbox += '<div class="textAreaBlock2 FFD box-sizing disTab"><a id="approve-stages" href="#">согласовать</a></div>';
@ -529,21 +548,21 @@
});
$('#add-note-button').on('click', function(){
$('#add-note-button').on('click', function () {
$.ajax({
url: '/api/note/',
type: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data:$("#add-form-order-note").serialize(),
data: $("#add-form-order-note").serialize(),
dataType: 'json',
success: function (json) {
console.log(json);
$("#add-form-order-note #chat2").val("");
},
error: function(e){
error: function (e) {
console.log('error');
console.log(e);
}
@ -586,7 +605,7 @@
//Добавить сообщение для исполнителей в группе
$("#add-team-chat-message").on('click', function(){
$("#add-team-chat-message").on('click', function () {
var chatMessage = $("#team-chat-form #chatText").val();
var recipentId = $("#team-chat-form #recipentId").val();
var senderId = $("#team-chat-form #senderId").val();

@ -32,14 +32,21 @@
{% for contact in contacts_users %}
<div class="message messd user-block" data-id="{{ contact.pk }}">
<div class="imgMess">
{% thumbnail contact.avatar "60x60" crop="center" as im %}
<img src="{{ im.url }}" alt="mess-image">
{% endthumbnail %}
{% if contact.avatar %}
{% thumbnail contact.avatar "60x60" crop="center" as im %}
<img src="{{ im.url }}" alt="mess-image">
{% endthumbnail %}
{% else %}
<img src="{% static 'img/profile.jpg' %}" alt="mess-image">
{% endif %}
</div>
<p class="nameMess">
<a href="#">{{ contact.username }} {{ contact.username }}</a>
<div><a href="#">{{ contact.username }} {{ contact.username }}</a></div>
</p>
<a href="javascript:void(0)" class="conMess">Контакты</a>
<a href="#" data-target="#userModal" data-toggle="modal"
class="conMess">Контакты</a>
<span>0</span>
<a href="javascript:void(0)" class="deleteMess">
Удалить контакт
@ -49,6 +56,20 @@
</div>
</div>
<div class="modal fade" id="userModal" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button class="close" type="button" data-dismiss="modal">x</button>
<h4 class="modal-title" id="myModalLabel">Название модального
окна</h4>
</div>
<div class="modal-body">
<h3>Содержимое модального окна</h3>
</div>
</div>
</div>
</div>
<div class="col-lg-6 commChat" id="contact-chat">
<div id="message-chat-space">
</div>
@ -209,7 +230,7 @@
</button>
<h4 class="modal-title">Оставить отзыв</h4>
</div>
<form id="review-adds-form" method="POST">{% csrf_token %}
<form id="review-adds-form" method="POST">{% csrf_token %}
<div class="modal-body">
<div style="height: 250px;">
@ -225,10 +246,12 @@
</div>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<textarea cols="40" name="text" rows="10"></textarea>
<input type="hidden" name="from_customer" value="{{ request.user.pk }}" />
<input type="hidden" name="target_contractor" id="targetContractorId" />
<input type="hidden" name="project" id="projectReviewId" />
<textarea cols="40" name="text" rows="10"></textarea>
<input type="hidden" name="from_customer"
value="{{ request.user.pk }}"/>
<input type="hidden" name="target_contractor"
id="targetContractorId"/>
<input type="hidden" name="project" id="projectReviewId"/>
</div>
</div>
</div>
@ -236,7 +259,9 @@
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Закрыть
</button>
<button type="submit" id="order-review-add" class="btn btn-primary">Оставить отзыв</button>
<button type="submit" id="order-review-add" class="btn btn-primary">Оставить
отзыв
</button>
</div>
</form>
@ -494,8 +519,8 @@
$("#chat").val("");
});
$('#order-review-add').on('click', function(){
alert('add review');
$('#order-review-add').on('click', function () {
alert('add review');
});
$('#order-chat-add-message').on('click', function () {
@ -526,7 +551,7 @@
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain +':8888/chat/' + userId + '/';
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {

@ -2,6 +2,7 @@ from django.shortcuts import render
from django.views.generic import View
from django.db.models import Q
from django.forms import formset_factory
from django.contrib.auth.mixins import LoginRequiredMixin
from .models import Message
from .forms import ArticleForm
@ -9,7 +10,7 @@ from reviews.forms import Review
from users.models import User
class ChatUserView(View):
class ChatUserView(LoginRequiredMixin, View):
template_name = ''
def get(self, request, *args, **kwargs):

@ -43,6 +43,7 @@ class Settings(models.Model):
document_send_time_remove = models.IntegerField(default=14)
recalculation_spec_time = models.TimeField()
recalculation_rating_time = models.TimeField()
# worksell_count = models.PositiveIntegerField(default=20)
def __str__(self):
return 'Настройки сайта'

@ -0,0 +1,16 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-15 10:48
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('projects', '0005_auto_20160812_1931'),
('projects', '0005_auto_20160812_1956'),
]
operations = [
]

@ -24,15 +24,15 @@
</li>
<li>
<a href="">Регистрация</a>
<a href="{% url 'registration_register' %}">Регистрация</a>
</li>
<li>
<a href="">Востановить доступ</a>
<a href="{% url 'password_reset_recover' %}">Востановить доступ</a>
</li>
<li>
<a href="">Опубликовать проект</a>
<a href="{% url 'projects:customer-project-create' %}">Опубликовать проект</a>
</li>
</ul>
</div>

@ -47,7 +47,7 @@
<span></span>
</li>
<li class="icon_tm3">
<a href="#">Работы на продажу</a>
<a href="{% url 'work_sell:list' %}">Работы на продажу</a>
<span></span>
</li>
</ul>

@ -11,11 +11,11 @@
{{ form.errors }}
<form method="post">{% csrf_token %}
<div class="col-lg-12 select-reg">
<input type="text" name="{{ form.username.name }}" class="box-sizing email-reg"
<input type="text" name="{{ form.username.name }}" value="{{ form.username.value }}" class="box-sizing email-reg"
placeholder="Электронная почта">
</div>
<div class="col-lg-12 select-reg">
<input type="password" name="{{ form.password.name }}" class="box-sizing pass-reg" placeholder="Пароль">
<input type="password" name="{{ form.password.name }}" value="{{ form.password.value }}"class="box-sizing pass-reg" placeholder="Пароль">
</div>
<div class="col-lg-12 select-reg">
<div class="check-reg">

@ -1,7 +1,9 @@
import itertools
from django import forms
from common.models import Location
from .models import WorkSell
from specializations.models import Specialization
class ContractorWorkSellTrashForm(forms.Form):
@ -41,12 +43,33 @@ class WorkSellForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
# self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants()
self.fields['location'].queryset = Location.objects.root_nodes()[0].get_descendants()
# self.fields['location'].queryset = Location.objects # Migrate with this enabled
# class WorkSellFilterForm(forms.ModelForm):
#
# class Meta:
# model = WorkSell
class WorkSellFilterForm(forms.ModelForm):
keywords = forms.CharField(required=False, max_length=255)
class Meta:
model = WorkSell
fields = (
'location',
'building_classification',
'construction_type',
'specialization',
)
widgets = {
'building_classification': forms.Select(attrs={'class': 'selectpicker'}),
'construction_type': forms.Select(attrs={'class': 'selectpicker'}),
}
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
self.fields['specialization'].required = False
self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants()

@ -25,16 +25,19 @@
<div class="col-lg-3">
<p class="cenaReady">{{ object.budget }} <i class="fa fa-rub"></i></p>
</div>
{% if request.user.is_authenticated %}
<div class="col-lg-3">
<a href="{% url 'users:contractor-profile' object.contractor.pk %}" class="linkReady LR1">
купить
</a>
</div>
<div class="col-lg-3">
<a href="{% url 'chat:chat-user' %}" class="linkReady LR2">
<a href="{% url 'chat:chat-user' %}?user_id={{ object.contractor.pk }}" class="linkReady LR2">
Написать сообщение
</a>
</div>
{% endif %}
<div class="col-lg-3">
<a href="#" data-toggle="modal" data-target="#contact-contactor-modal" class="linkReady LR3">
посмотреть контакты

@ -84,7 +84,7 @@
</div>
<div class="polsF1 polsF2 disTab">
{% form.ins %}
</div>
<div class="searchF1 polsF1 polsFF links-filter">

@ -13,22 +13,11 @@
</div>
<form action="{% url 'projects:project-filter' %}" method="GET" novalidate>
<form action="{% url 'work_sell:list' %}" method="GET" novalidate>
<div class="col-lg-12">
<div class="filter clearfix">
<div class="triangle1"></div>
<div class="titleF1 disTab">
<div class="col-lg-3">Тип работы</div>
</div>
<div class="polsF1 disTab">
<div class="col-lg-3">
{{ form.work_type }}
</div>
</div>
<div class="titleF1 disTab">
<div class="col-lg-3">Специализации</div>
<div class="col-lg-9"></div>
@ -67,7 +56,7 @@
</a>
</div>
<div class="col-lg-3">
<a href="{% url 'projects:project-filter' %}" class="clearSearch">
<a href="{% url 'work_sell:list' %}" class="clearSearch">
Очистить фильтр
</a>
</div>
@ -104,11 +93,11 @@
<div class="polsF1 disTab">
<div class="col-lg-3">
{{ realty_form.building_classification }}
{{ form.building_classification }}
</div>
<div class="col-lg-3">
{{ realty_form.construction_type }}
{{ form.construction_type }}
</div>
</div>
</div>
@ -138,12 +127,7 @@
<input type="hidden" id="chosenLocationId" name="{{ realty_form.location.html_name }}" value="{{ realty_form.location.value }}">
</div>
<div class="sro">
<div class="col-lg-12">
<label>{{ form.cro }}<span></span></label>
<p>Требуется допуск (СРО)</p>
</div>
</div>
</div>
</div>
</div>
@ -153,7 +137,7 @@
<div class="galleryWork disTab">
{% for work in object_list %}
{% for work in work_sells %}
<div class="col-lg-3">
<div class="insetCol box-sizing disTab">
<a href="{% url 'work_sell:detail' work.pk %}">

@ -11,13 +11,14 @@ from .views import (
BasicCreateView,
PictureCreateView,
ContractorWorkSellTrashView,
WorkSellFilterView,
)
app_name = 'work_sell'
urlpatterns = [
urls.url(r'^$', WorkSellsView.as_view(), name='list'),
urls.url(r'^$', WorkSellFilterView.as_view(), name='list'),
# urls.url(r'^create/$', WorkSellCreateView.as_view(), name='create'),
urls.url(r'^upload/$', UploadView.as_view(), name='upload'),
urls.url(r'^(?P<pk>\d+)/edit/$',WorkSellUpdateView.as_view(), name='edit'),

@ -1,12 +1,16 @@
import json
import re
import pydash as _;
_.map = _.map_;
_.filter = _.filter_
from pprint import pprint, pformat
from django.shortcuts import render, redirect
from django.conf import settings
from django.contrib import messages
from django.db.models import Q
from django.core.urlresolvers import reverse
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.http import JsonResponse, HttpResponse
from django.core.files.base import ContentFile
from django.views.generic import ListView, DetailView, CreateView, View, \
@ -14,10 +18,10 @@ from django.views.generic import ListView, DetailView, CreateView, View, \
from projects.models import BuildingClassfication, ConstructionType
from .models import WorkSell, Picture, WorkSellPhoto
from .forms import WorkSellForm, ContractorWorkSellTrashForm
from .forms import WorkSellForm, WorkSellFilterForm, ContractorWorkSellTrashForm
from .serialize import serialize
from .response import JSONResponse, response_mimetype
from archilance.mixins import BaseMixin
class PictureCreateView(CreateView):
model = Picture
@ -63,15 +67,69 @@ class WorkSellsView(ListView):
return context
class WorkSellFilterView(View):
class WorkSellFilterView(BaseMixin,View):
template_name = 'worksells_list.html'
form_class = WorkSellFilterForm
def get(self, request, *args, **kwargs):
context = {}
form = self.form_class(request.GET, request=request)
context = self.get_context_data(**_.merge({}, request.GET,kwargs))
work_sells = WorkSell.objects
if form.is_valid():
keywords = form.cleaned_data.get('keywords')
specialization = form.cleaned_data.get('specialization')
building_classification = form.cleaned_data.get('building_classification')
construction_type = form.cleaned_data.get('construction_type')
location = form.cleaned_data.get('location')
if keywords:
keywords = tuple(filter(None, re.split(r'\s|,|;', keywords)))
for k in keywords:
work_sells = work_sells.filter(Q(name__icontains=k) | Q(text__icontains=k))
if specialization:
work_sells = work_sells.filter(
specialization__lft__gte=specialization.lft,
specialization__rght__lte=specialization.rght,
)
if building_classification:
work_sells = work_sells.filter(building_classification=building_classification)
if construction_type:
work_sells = work_sells.filter(construction_type=construction_type)
if location:
work_sells = work_sells.filter(
location__lft__gte=location.lft,
location__rght__lte=location.rght,
)
paginator = Paginator(work_sells.all(), settings.PAGE_SIZE)
page = request.GET.get('page')
try:
work_sells = paginator.page(page)
except PageNotAnInteger:
work_sells = paginator.page(1)
except EmptyPage:
work_sells = paginator.page(paginator.num_pages)
context.update({
'form': form,
'work_sells': work_sells,
'is_paginated': True,
'page_obj': work_sells,
})
return render(request, self.template_name, context)
class WorkSellDetail(DetailView):
model = WorkSell
template_name = 'worksell_detail.html'
@ -87,7 +145,9 @@ def work_sell_create(request):
form = WorkSellForm(data=request.POST)
if form.is_valid():
instance = form.save(commit=False)
# import code; code.interact(local=dict(globals(), **locals()))
instance.save()
form.save_m2m()
images_ids = request.POST.get('images-ids').split(';')[:-1]
for pk in images_ids:
picture = Picture.objects.get(pk=pk)

Loading…
Cancel
Save