remotes/origin/PR-39
Mukhtar 10 years ago
commit 6330b48194
  1. 18
      archilance/views.py
  2. 2
      assets/index.js
  3. 2
      assets/js/chat.js
  4. 18
      common/mixins.py
  5. 5
      common/templatetags/common_tags.py
  6. 25
      projects/serializers.py
  7. 165
      projects/templates/comparison.html
  8. 5
      projects/urls.py
  9. 20
      projects/views.py
  10. 2
      templates/partials/base.html
  11. 9
      templates/partials/header.html
  12. 12
      templates/test.html
  13. 115
      users/templates/contractor_filter.html
  14. 83
      users/templates/contractor_profile.html
  15. 5
      users/templatetags/user_tags.py
  16. 37
      work_sell/templates/worksell_detail.html

@ -7,9 +7,11 @@ from django.http import HttpResponseForbidden, JsonResponse, HttpResponseRedirec
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import TemplateView, View from django.views.generic import TemplateView, View
from pprint import pprint, pformat from pprint import pprint, pformat
import json
import logging import logging
from .mixins import BaseMixin from .mixins import BaseMixin
from archilance import util
from chat.models import Documents from chat.models import Documents
from common.models import MainPage, PrintDocuments from common.models import MainPage, PrintDocuments
from projects.models import Order from projects.models import Order
@ -52,8 +54,22 @@ class TestView(BaseMixin, View):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
context = self.get_context_data(**kwargs) context = self.get_context_data(**kwargs)
data = {}
context['foo'] = 'bar' from projects.models import Project
from projects.serializers import ProjectSerializer
from users.models import User
from users.serializers import UserSerializer
contractor = User.contractor_objects.get(pk=11)
project = Project.objects.get(pk=153)
data['contractor'] = UserSerializer(contractor).data
data['project'] = ProjectSerializer(project).data
context['data_json'] = json.dumps(data)
return render(request, self.template_name, context) return render(request, self.template_name, context)
# return redirect('projects:detail', pk=153) # return redirect('projects:detail', pk=153)
# import code; code.interact(local=dict(globals(), **locals()))

@ -239,7 +239,7 @@ var projectSelectOptions = {
} }
function initProjectSelect($select, customerId) { function initProjectSelect($select, customerId) {
return $.ajax({url: '/api/projects/?customer=' + customerId, method: 'GET', dataType: 'json'}) return $.ajax({url: '/api/projects/?state=active&customer=' + customerId, method: 'GET', dataType: 'json'})
.then(function(res) { .then(function(res) {
var projects = res.results var projects = res.results

@ -1,6 +1,6 @@
var SocketHandler = function () { var SocketHandler = function () {
domain = domain.replace(':' + port, ''); domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + '/chat/' + userId + '/'; var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url); var sock = new WebSocket(url);
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {

@ -1,3 +1,5 @@
from django.contrib.auth.mixins import LoginRequiredMixin
from django.core.exceptions import PermissionDenied
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django.views.generic import View from django.views.generic import View
@ -7,3 +9,19 @@ class NoCsrfMixin(View):
@method_decorator(csrf_exempt) @method_decorator(csrf_exempt)
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
class CustomerRequiredMixin(LoginRequiredMixin, View):
def dispatch(self, request, *args, **kwargs):
if request.user.is_customer():
return super().dispatch(request, *args, **kwargs)
else:
raise PermissionDenied
class ContractorRequiredMixin(LoginRequiredMixin, View):
def dispatch(self, request, *args, **kwargs):
if request.user.is_contractor():
return super().dispatch(request, *args, **kwargs)
else:
raise PermissionDenied

@ -61,6 +61,11 @@ def to_list(val):
return list(val) return list(val)
@register.filter('repr')
def to_repr(val):
return repr(val)
@register.filter @register.filter
def class_name(val): def class_name(val):
return type(val).__name__ return type(val).__name__

@ -71,10 +71,33 @@ class StageSerializer(ModelSerializer):
) )
class OrderSerializer_(ModelSerializer):
contractor = UserSerializer()
stages = StageSerializer(many=True)
team = TeamSerializer()
project_id = PrimaryKeyRelatedField(read_only=True, source='project')
class Meta:
model = Order
fields = (
'created',
'id',
'secure',
'status',
'contractor',
'project_id',
'stages',
'team',
)
class ProjectSerializer(ModelSerializer): class ProjectSerializer(ModelSerializer):
customer = UserSerializer() customer = UserSerializer()
specialization = SpecializationSerializer() specialization = SpecializationSerializer()
realty = RealtySerializer() realty = RealtySerializer()
order = OrderSerializer_() # TODO: Can't serialize a reverse/reciprocal relation
class Meta: class Meta:
model = Project model = Project
@ -89,6 +112,7 @@ class ProjectSerializer(ModelSerializer):
'deal_type', 'deal_type',
'id', 'id',
'name', 'name',
'order',
'price_and_term_required', 'price_and_term_required',
'realty', 'realty',
'specialization', 'specialization',
@ -97,7 +121,6 @@ class ProjectSerializer(ModelSerializer):
'term_type', 'term_type',
'text', 'text',
'work_type', 'work_type',
) )

@ -9,8 +9,7 @@
<div class="container mainScore"> <div class="container mainScore">
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<p class="titleScore"> <p class="titleScore">Сравнение кандидатов по проекту</p>
Сравнение кандидатов по проекту</p>
</div> </div>
<div class="titleBlockComparison disTab"> <div class="titleBlockComparison disTab">
@ -18,92 +17,95 @@
<p>{{ object }}</p> <p>{{ object }}</p>
<table class="compTable" id="compTable"> <table class="compTable" id="compTable">
<thead> <thead>
<tr> <tr>
<th></th> <th></th>
<th>Кандидат</th> <th>Кандидат</th>
<th>Цена</th> <th>Цена</th>
<th>Срок</th> <th>Срок</th>
<th>Описание</th> <th>Описание</th>
<th>Рейтинги/отзывы</th> <th>Рейтинги/отзывы</th>
<th>Безопасные сделки</th> <th>Безопасные сделки</th>
<th>Решение</th> <th>Решение</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for cand in object.candidates.all %} {% for cand in object.candidates.all %}
<tr style="cursor:move;" class="items[]_{{ cand.pk }}" data-class="items[]_{{ cand.pk }}"> <tr style="cursor:move;" class="items[]_{{ cand.pk }}" data-class="items[]_{{ cand.pk }}">
<td>{{ cand.position }}</td> <td>{{ cand.position }}</td>
<td> <td>
{% if cand.answer.author|class_name == 'User' %} {% if cand.answer.author|class_name == 'User' %}
{{ cand.answer.author.get_full_name }} {{ cand.answer.author.get_full_name }}
{% elif cand.answer.author|class_name == 'Team' %} {% elif cand.answer.author|class_name == 'Team' %}
{{ cand.answer.author.name }} {{ cand.answer.author.name }}
{% endif %} {% endif %}
</td> </td>
<td>{{ cand.answer.budget }} <i class="{% fa_currency_classes cand.answer.currency %}"></i></td> <td>{{ cand.answer.budget }} <i class="{% fa_currency_classes cand.answer.currency %}"></i></td>
<td> <td>
{% if cand.answer.term_type == 'project' %} {% if cand.answer.term_type == 'project' %}
За проект За проект
{% else %} {% else %}
{% morph cand.answer.term TERM_TYPE_MORPHS|get:cand.answer.term_type %} {% morph cand.answer.term TERM_TYPE_MORPHS|get:cand.answer.term_type %}
{% endif %} {% endif %}
</td> </td>
<td> <td>
<span class="glyphicon glyphicon-info-sign" aria-hidden="true" data-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>
<td> <td>
<ul> <ul>
<li><span>{{ cand.answer.author.rating }}</span></li> <li><span>{{ cand.answer.author.rating }}</span></li>
<li>
<span>+0</span> 0 <small> - 0</small>
</li>
{% if cand.answer.author.cro %}
<li> <li>
СРО <span>+0</span> 0 <small> - 0</small>
</li> </li>
{% if cand.answer.author.cro %}
<li>
СРО
</li>
{% endif %}
</ul>
</td>
<td>
<span>0</span><br>
{% if cand.answer.secure_deal_only %}
Готов работать по безопасной сделке
{% endif %} {% endif %}
</ul> </td>
</td>
<td>
<span>0</span><br>
{% if cand.answer.secure_deal_only %}
Готов работать по безопасной сделке
{% endif %}
</td>
<td>
<div class="tableButtons disTab">
<form action="{% url 'projects:customer-offer-order' answer_id=cand.answer.pk project_id=cand.project.pk %}" method="POST" novalidate>
{% csrf_token %}
<a href="#" onclick="$(this).closest('form').submit(); return false">
<div class="btnTab btnTab1"></div>
</a>
</form>
<a href="{% url 'chat:chat-user' %}?user_id={{ cand.answer.author.pk }}"> <td>
<div class="btnTab btnTab2"></div> <div class="tableButtons disTab">
</a> <form action="{% url 'projects:customer-offer-order' answer_id=cand.answer.pk project_id=cand.project.pk %}" method="POST" novalidate>
{% csrf_token %}
<form method="POST" action="{% url 'projects:delete-candidate' cand.pk %}"> <a href="#" onclick="$(this).closest('form').submit(); return false">
{% csrf_token %}<input class="btnTab btnTab3" type="submit" value=""> <div class="btnTab btnTab1" title="Предложить проект"></div>
</form> </a>
</form>
<a href="{% url 'users:contractor-profile' cand.answer.author.pk %}#open-contact"> <a href="{% url 'chat:chat-user' %}?user_id={{ cand.answer.author.pk }}">
<div class="btnTab btnTab4"></div> <div class="btnTab btnTab2" title="Перейти в чат"></div>
</a> </a>
</div>
</td> <form method="POST" action="{% url 'projects:delete-candidate' cand.pk %}">
</tr> {% csrf_token %}
{% endfor %} <input class="btnTab btnTab3" type="submit" value="" title="Удалить из сравнения">
</form>
<a href="{% url 'users:contractor-profile' cand.answer.author.pk %}#open-contact">
<div class="btnTab btnTab4" title="Показать контакты"></div>
</a>
</div>
</td>
</tr>
{% endfor %}
</tbody> </tbody>
</table> </table>
</div> </div>
@ -112,8 +114,9 @@
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block js_block %} {% block js_block %}
<script type="text/javascript"> <script>
$(function () { $(function () {
var fixHelper = function (e, ui) { var fixHelper = function (e, ui) {
ui.children().each(function () { ui.children().each(function () {

@ -7,6 +7,7 @@ from .views import (
CandidateDeleteView, CandidateDeleteView,
contractor_portfolio_create, contractor_portfolio_create,
ContractorAnswerArchiveView, ContractorAnswerArchiveView,
ContractorOfferOrder,
ContractorPortfolioTrashView, ContractorPortfolioTrashView,
ContractorPortfolioUpdateView, ContractorPortfolioUpdateView,
CustomerOfferOrderView, CustomerOfferOrderView,
@ -22,6 +23,7 @@ from .views import (
ProjectFilterView, ProjectFilterView,
RejectProjectAnswerView, RejectProjectAnswerView,
sort_candidates, sort_candidates,
TeamOfferOrder,
) )
app_name = 'projects' app_name = 'projects'
@ -53,5 +55,6 @@ urlpatterns = [
urls.url(r'^customer-offer-order/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', CustomerOfferOrderView.as_view(), name='customer-offer-order'), urls.url(r'^customer-offer-order/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', CustomerOfferOrderView.as_view(), name='customer-offer-order'),
# urls.url(r'^portfolio/create/$', PortfolioCreateView.as_view(), name='portfolio-create'), urls.url(r'^(?P<project_id>\d+)/contractor-offer-order/(?P<contractor_id>\d+)/$', ContractorOfferOrder.as_view(), name='contractor-offer-order'),
urls.url(r'^(?P<project_id>\d+)/team-offer-order/(?P<team_id>\d+)/$', TeamOfferOrder.as_view(), name='team-offer-order'),
] ]

@ -20,6 +20,7 @@ import re
from .mixins import LastAccessMixin from .mixins import LastAccessMixin
from archilance import util from archilance import util
from archilance.mixins import BaseMixin from archilance.mixins import BaseMixin
from common.mixins import CustomerRequiredMixin, ContractorRequiredMixin, NoCsrfMixin
from users.models import User, Team from users.models import User, Team
from work_sell.models import Picture, WorkSell, WorkSellPhoto from work_sell.models import Picture, WorkSell, WorkSellPhoto
@ -778,4 +779,23 @@ class ArbitrationCreateView(CreateView):
return JsonResponse(form.errors, status=400) return JsonResponse(form.errors, status=400)
return super().form_invalid(form) return super().form_invalid(form)
class ContractorOfferOrder(NoCsrfMixin, CustomerRequiredMixin, View):
def post(self, request, *args, project_id, contractor_id, **kwargs):
project = get_object_or_404(Project, pk=project_id)
contractor = get_object_or_404(User.contractor_objects, pk=contractor_id)
# project.order.contractor
return JsonResponse({'status': 'success'})
class TeamOfferOrder(NoCsrfMixin, CustomerRequiredMixin, View):
def post(self, request, *args, project_id, team_id, **kwargs):
project = get_object_or_404(Project, pk=project_id)
team = get_object_or_404(Team, pk=team_id)
return JsonResponse({'status': 'success'})
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))

@ -87,7 +87,7 @@
if ((queryString.indexOf('/chat') != 0) && (queryString.indexOf('/users/contractor-office/510/work-projects') != 0)) { if ((queryString.indexOf('/chat') != 0) && (queryString.indexOf('/users/contractor-office/510/work-projects') != 0)) {
domain = domain.replace(':' + port, ''); domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + '/chat/' + userId + '/'; var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url); var sock = new WebSocket(url);
var intervalId; var intervalId;
sock.onopen = function () { sock.onopen = function () {

@ -21,7 +21,7 @@
<div class="col-lg-7"> <div class="col-lg-7">
<ul class="mainMenu"> <ul class="mainMenu">
<li class="icon_tm1"> <li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Биржа проектов</a> <a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
<span></span> <span></span>
</li> </li>
@ -48,7 +48,7 @@
<div class="col-lg-7"> <div class="col-lg-7">
<ul class="mainMenu"> <ul class="mainMenu">
<li class="icon_tm1"> <li class="icon_tm1">
<a href="{% url 'projects:project-filter' %}">Биржа проектов</a> <a href="{% url 'projects:project-filter' %}">Поиск заказов</a>
<span></span> <span></span>
</li> </li>
<li class="icon_tm2"> <li class="icon_tm2">
@ -93,7 +93,7 @@
</a> </a>
</li> </li>
{% endif %} {% endif %}
<li class="icon_mm3"> <li class="icon_mm8">
<a href="{{ profile_url }}"> <a href="{{ profile_url }}">
Профиль<span></span> Профиль<span></span>
</a> </a>
@ -112,14 +112,13 @@
<a href="/pages/faq">FAQ<span></span></a> <a href="/pages/faq">FAQ<span></span></a>
</li> </li>
<li class="icon_mm6"> <li class="icon_mm7">
<a href="{% url 'auth_logout' %}">Выйти<span></span></a> <a href="{% url 'auth_logout' %}">Выйти<span></span></a>
</li> </li>
</ul> </ul>
</div> </div>
</div> </div>
<div class="imgProfile"> <div class="imgProfile">
{% if request.user.is_contractor %} {% if request.user.is_contractor %}
<a href="{{ profile_url }}"> <a href="{{ profile_url }}">

@ -9,19 +9,17 @@
<link rel='stylesheet' href='{% static "lib/jquery-ui/jquery-ui.css" %}'> <link rel='stylesheet' href='{% static "lib/jquery-ui/jquery-ui.css" %}'>
<link rel='stylesheet' href='{% static "css/bootstrap.css" %}'> <link rel='stylesheet' href='{% static "css/bootstrap.css" %}'>
<script>
window.djangoData = JSON.parse({{ data_json|repr|safe }})
</script>
</head> </head>
<body> <body>
<div class='container-fluid'> <div class='container-fluid'>
<div class='row'> <div class='row'>
<div class='col-xs-12' style='margin-top: 15px'> <div class='col-xs-12' style='margin-top: 15px'>
{# {% url 'projects:customer-offer-order-answerless' contractor_id=11 project_id=485 as url %}#} <pre>{{ data_json }}</pre>
{# #}
{# <form action="{{ url }}" method="POST" novalidate>#}
{# {% csrf_token %}#}
{# #}
{# <button type="submit">{{ url }}</button>#}
{# </form>#}
</div> </div>
</div> </div>
</div> </div>

@ -173,7 +173,7 @@
{% with team=obj %} {% with team=obj %}
<div class="executorBlock clearfix"> <div class="executorBlock clearfix">
<div class="col-lg-4"> <div class="col-lg-4">
<a href="#" class="aLinkExe"> <a href="{% url 'users:team-profile' pk=team.pk %}" class="aLinkExe">
<div class="imgExecutor"> <div class="imgExecutor">
{% if team.owner.avatar %} {% if team.owner.avatar %}
{% thumbnail team.owner.avatar "126x125" crop="center" as avatar %} {% thumbnail team.owner.avatar "126x125" crop="center" as avatar %}
@ -185,7 +185,7 @@
</div> </div>
</a> </a>
<p class="nameExecutor"> <p class="nameExecutor">
<a href="">{{ team.name }}</a> {# TODO #} <a href="{% url 'users:team-profile' pk=team.pk %}">{{ team.name }}</a>
</p> </p>
<p class="navv2">На сайте 8 лет и 3 месяца</p> <p class="navv2">На сайте 8 лет и 3 месяца</p>
<div class="statusUser">Свободен</div> <div class="statusUser">Свободен</div>
@ -201,15 +201,20 @@
</li> </li>
<li> <li>
{% if request.user.is_customer %} {% if request.user.is_customer %}
<a href="#" onclick="return false" class="-contractor-offer-order" data-contractor-id="{{ team.owner.pk }}" data-is-team-offer="true"> <a
предложить проект href="#"
onclick="return false"
data-contractor-id="{{ team.owner.pk }}"
data-team-id="{{ team.pk }}"
data-is-team-offer="true"
data-toggle="modal"
data-target="#projectSelectionModal">
предложить проект
</a> </a>
{% endif %} {% endif %}
</li> </li>
<li> <li>
{# TODO #} <a href="{% url 'chat:chat-user' %}?user_id={{ team.owner.pk }}">
{# <a href="{% url 'chat:chat-user' %}?user_id={{ team..owner.pk }}">#}
<a href="#">
написать сообщение написать сообщение
</a> </a>
</li> </li>
@ -223,17 +228,9 @@
<div class="col-lg-3 retts"> <div class="col-lg-3 retts">
<ul class="rettList restList2"> {% ratings_team_widget team.pk 'restList2' %}
<li>Рейтинг: <span> 1245</span></li>
<li>Безопасные сделки: <span> 5</span></li> <!-- TODO -->
<li>
<a href="javascript:void(0)">Отзывы:
<span> + 385</span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
<div class="sroUser sroExecutor"> <div class="sroUser sroExecutor">
<div class="iconSRO"></div> <div class="iconSRO"></div>
<p>Есть допуск СРО</p> <p>Есть допуск СРО</p>
@ -329,7 +326,6 @@
<a <a
href="#" href="#"
onclick="return false" onclick="return false"
class="-contractor-offer-order"
data-contractor-id="{{ contractor.pk }}" data-contractor-id="{{ contractor.pk }}"
data-toggle="modal" data-toggle="modal"
data-target="#projectSelectionModal"> data-target="#projectSelectionModal">
@ -354,11 +350,12 @@
<div class="col-lg-3 retts"> <div class="col-lg-3 retts">
{% ratings_widget contractor.pk 'restList2' %} {% ratings_widget contractor.pk 'restList2' %}
{% if contractor.cro %} {% if contractor.cro %}
<div class="sroUser sroExecutor"> <div class="sroUser sroExecutor">
<div class="iconSRO"></div> <div class="iconSRO"></div>
<p>Есть допуск СРО</p> <p>Есть допуск СРО</p>
</div> </div>
{% endif %} {% endif %}
</div> </div>
@ -415,6 +412,9 @@
{% if request.user.is_customer %} {% if request.user.is_customer %}
var customerId = {{ request.user.pk }} var customerId = {{ request.user.pk }}
var $projectSelectionModal = $('#projectSelectionModal') var $projectSelectionModal = $('#projectSelectionModal')
var projectUrl_ = '/projects/%id%/'
var projectOrderChatUrl_ = '/chat/#order%orderId%'
$projectSelectionModal.on('shown.bs.modal', function($evt) { $projectSelectionModal.on('shown.bs.modal', function($evt) {
var $that = $(this) var $that = $(this)
@ -427,33 +427,66 @@
initProjectSelect($projectSelect, customerId) initProjectSelect($projectSelect, customerId)
}) })
$projectSelectionModal.find('.-action-button').first().on('click', function($evt) { $projectSelectionModal.find('.-action-button').first().on('click', function($evt) {
var $projectSelect = $projectSelectionModal.find('.-project-select').first() var $projectSelect = $projectSelectionModal.find('.-project-select').first()
var $modalOpenButton = $projectSelectionModal.data('modalOpenButton') var $modalOpenButton = $projectSelectionModal.data('modalOpenButton')
var isTeamOffer = $modalOpenButton.data('isTeamOffer') var isTeamOffer = $modalOpenButton.data('isTeamOffer')
var project = $projectSelect.select2('data') var project = $projectSelect.select2('data').origItem
var contractorId = $modalOpenButton.data('contractorId') var projectUrl = _.replace('%id%', project.id, projectUrl_)
var projectOrderChatUrl = _.replace('%orderId%', project.order.id, projectOrderChatUrl_)
$projectSelectionModal.modal('hide') $projectSelectionModal.modal('hide')
$projectSelect.select2('destroy')
if (isTeamOffer) if (isTeamOffer) {
var msg = 'Вашей команде предлагается проект ' + project.id var contractorId = $modalOpenButton.data('contractorId')
else var teamId = $modalOpenButton.data('teamId')
var msg = 'Вам предлагается проект ' + project.id
if (project.order.team && project.order.team.id === teamId) {
socketMain.add_message({ window.location.href = projectOrderChatUrl
format_type: 'add_message_contact', } else {
var msg = 'Вашей команде предлагается проект http://{{ request.get_host }}' + projectUrl
socketMain.add_message({
format_type: 'add_message_contact',
data: {
sender_id: customerId,
recipent_id: contractorId,
chat_message: msg,
},
})
}
$.jGrowl('Предложение успешно отправлено')
$modalOpenButton.fadeOut()
} else {
var contractorId = $modalOpenButton.data('contractorId')
if (project.order.contractor && project.order.contractor.id === contractorId) {
window.location.href = projectOrderChatUrl
} else {
var msg = 'Вам предлагается проект http://{{ request.get_host }}' + projectUrl
socketMain.add_message({
format_type: 'add_message_contact',
data: {
sender_id: customerId,
recipent_id: contractorId,
chat_message: msg,
},
})
}
$.jGrowl('Предложение успешно отправлено')
$modalOpenButton.fadeOut()
}
})
data: {
sender_id: customerId,
recipent_id: contractorId,
chat_message: msg,
},
})
$.jGrowl('Предложение успешно отправлено') $projectSelectionModal.on('hidden.bs.modal', function($evt) {
$modalOpenButton.fadeOut() $(this).find('.-project-select').first().select2('destroy')
}) })
{% endif %} {% endif %}
</script> </script>

@ -4,6 +4,7 @@
{% load thumbnail %} {% load thumbnail %}
{% block content %} {% block content %}
{% include 'partials/modals/project_selection.html' %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
<div class="container mainScore mainBlock2"> <div class="container mainScore mainBlock2">
@ -52,8 +53,13 @@
{% if request.user.is_customer %} {% if request.user.is_customer %}
<li class="icon_um4"> <li class="icon_um4">
<a href="javascript:void(0)"> <a
предложить заказ href="#"
onclick="return false"
data-contractor-id="{{ contractor.pk }}"
data-toggle="modal"
data-target="#projectSelectionModal">
предложить заказ
</a> </a>
<span></span> <span></span>
</li> </li>
@ -487,12 +493,13 @@
</div> </div>
</div> </div>
<div class="col-lg-12 wr-inset-pluss"> <div class="col-lg-12 wr-inset-pluss">
<a href="#" data-toggle="modal" data-target="#resume-text-edit" style="float: left; margin-right: 10px;">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
</a>
<div class="pluss-block" id="resume-text-out"> <div class="pluss-block" id="resume-text-out">
{{ contractor.contractor_resume.text|safe }} {{ contractor.contractor_resume.text|safe }}
</div> </div>
<a href="#" data-toggle="modal" data-target="#resume-text-edit">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
</a>
<!-- Редактирование текста резюме (модальное окно)--> <!-- Редактирование текста резюме (модальное окно)-->
<div id="resume-text-edit" class="modal fade"> <div id="resume-text-edit" class="modal fade">
@ -794,6 +801,72 @@
{% endif %} {% endif %}
// Contractor order offer --------------------------------------
{% if request.user.is_customer %}
var customerId = {{ request.user.pk }}
var $projectSelectionModal = $('#projectSelectionModal')
var projectUrl_ = '/projects/%id%/'
var projectOrderChatUrl_ = '/chat/#order%orderId%'
$projectSelectionModal.on('shown.bs.modal', function($evt) {
var $that = $(this)
var $modalOpenButton = $($evt.relatedTarget)
var $projectSelect = $that.find('.-project-select').first()
$that.data('modalOpenButton', $modalOpenButton)
initProjectSelect($projectSelect, customerId)
})
$projectSelectionModal.find('.-action-button').first().on('click', function($evt) {
var $projectSelect = $projectSelectionModal.find('.-project-select').first()
var $modalOpenButton = $projectSelectionModal.data('modalOpenButton')
var contractorId = $modalOpenButton.data('contractorId')
var project = $projectSelect.select2('data').origItem
var projectUrl = _.replace('%id%', project.id, projectUrl_)
var projectOrderChatUrl = _.replace('%orderId%', project.order.id, projectOrderChatUrl_)
$projectSelectionModal.modal('hide')
if (project.order.contractor && project.order.contractor.id === contractorId) {
window.location.href = projectOrderChatUrl
} else {
var msg = 'Вам предлагается проект http://{{ request.get_host }}' + projectUrl
socketMain.add_message({
format_type: 'add_message_contact',
data: {
sender_id: customerId,
recipent_id: contractorId,
chat_message: msg,
},
})
}
$.jGrowl('Предложение успешно отправлено')
$modalOpenButton.closest('.icon_um4').fadeOut()
})
$projectSelectionModal.on('hidden.bs.modal', function($evt) {
$(this).find('.-project-select').first().select2('destroy')
})
{% endif %}
//----------------------------------------------------------------- //-----------------------------------------------------------------

@ -27,8 +27,3 @@ def contractor_indicator(context, contractor):
def has_group(user, group_name): def has_group(user, group_name):
groups = user.groups.all().values_list('name', flat=True) groups = user.groups.all().values_list('name', flat=True)
return True if group_name in groups else False return True if group_name in groups else False
@register.simple_tag
def test():
return 'Hello there'

@ -20,30 +20,33 @@
</div> </div>
{% endif %} {% endif %}
</div> </div>
<div class="btnReadyBlock disTab">
<div class="triangle1"></div> {% if object.contractor %}
<div class="col-lg-3"> <div class="btnReadyBlock disTab">
<p class="cenaReady">{{ object.budget }} <i class="{% fa_currency_classes object.currency %}"></i></p> <div class="triangle1"></div>
</div>
{% if request.user.is_authenticated %}
<div class="col-lg-3"> <div class="col-lg-3">
<a href="{% url 'users:contractor-profile' object.contractor.pk %}" class="linkReady LR1"> <p class="cenaReady">{{ object.budget }} <i class="{% fa_currency_classes object.currency %}"></i></p>
купить
</a>
</div> </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' %}?user_id={{ object.contractor.pk }}" class="linkReady LR2">
Написать сообщение
</a>
</div>
{% endif %}
<div class="col-lg-3"> <div class="col-lg-3">
<a href="{% url 'chat:chat-user' %}?user_id={{ object.contractor.pk }}" class="linkReady LR2"> <a href="{% url 'users:contractor-profile' object.contractor.pk %}" class="linkReady LR3">
Написать сообщение посмотреть контакты
</a> </a>
</div> </div>
{% endif %}
<div class="col-lg-3">
<a href="{% url 'users:contractor-profile' object.contractor.pk %}" class="linkReady LR3">
посмотреть контакты
</a>
</div> </div>
</div> {% endif %}
<div class="desReadyBlock"> <div class="desReadyBlock">

Loading…
Cancel
Save