#ARC-26 Fixes (section 1)

remotes/origin/PR-39
ArturBaybulatov 10 years ago
parent 0a7055358d
commit 71dd79518f
  1. 2
      archilance/settings/base.py
  2. 2
      projects/models.py
  3. 13
      projects/views.py
  4. 34
      templates/message.html
  5. 5
      templates/partials/base.html
  6. 4
      templates/partials/pagination.html
  7. 5
      users/forms.py
  8. 367
      users/templates/contractor_office.html
  9. 146
      users/templates/contractor_office_open_projects.html
  10. 95
      users/templates/contractor_office_open_projects_archive.html
  11. 61
      users/templates/partials/contractor_profile_tabs.html
  12. 105
      users/views.py

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

@ -84,7 +84,7 @@ class Project(models.Model, HitCountMixin):
created = models.DateTimeField(default=timezone.now) created = models.DateTimeField(default=timezone.now)
cro = models.BooleanField(default=False) cro = models.BooleanField(default=False)
currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES) currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES)
customer = models.ForeignKey(User, related_name='projects') customer = models.ForeignKey(User, related_name='projects') # Related name should've been "customer_projects"
deal_type = models.CharField(max_length=20, default='secure_deal', choices=DEAL_TYPES) deal_type = models.CharField(max_length=20, default='secure_deal', choices=DEAL_TYPES)
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
price_and_term_required = models.BooleanField(default=False) price_and_term_required = models.BooleanField(default=False)

@ -1,5 +1,4 @@
from django.conf import settings from django.conf import settings
from django.core.exceptions import PermissionDenied
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
@ -10,7 +9,6 @@ from django.db.models import Q, F
from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse, Http404 from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse, Http404
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 ListView, DetailView, CreateView, DeleteView, View, UpdateView, TemplateView, FormView from django.views.generic import ListView, DetailView, CreateView, DeleteView, View, UpdateView, TemplateView, FormView
from hitcount.models import HitCount from hitcount.models import HitCount
from hitcount.views import HitCountMixin from hitcount.views import HitCountMixin
from pprint import pprint, pformat from pprint import pprint, pformat
@ -128,7 +126,7 @@ class ProjectDetailWithAnswerView(BaseMixin, View):
context.update({'form': form}) context.update({'form': form})
return render(request, self.template_name, context) return render(request, self.template_name, context)
else: else:
return HttpResponseForbidden('403 Forbidden') raise PermissionDenied
class ProjectAnswerCreateMessageView(BaseMixin, View): class ProjectAnswerCreateMessageView(BaseMixin, View):
@ -138,7 +136,7 @@ class ProjectAnswerCreateMessageView(BaseMixin, View):
if request.user.is_authenticated(): if request.user.is_authenticated():
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
else: else:
return HttpResponseForbidden('403 Forbidden') raise PermissionDenied
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, request=request) form = self.form_class(request.POST, request=request)
@ -515,7 +513,7 @@ class CustomerProjectTrashView(View):
if request.user.is_authenticated() and request.user.is_customer(): if request.user.is_authenticated() and request.user.is_customer():
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
else: else:
return HttpResponseForbidden('403 Forbidden') raise PermissionDenied
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
form = self.form_class(_.merge({}, req.POST, kwargs), req=req) form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
@ -540,7 +538,7 @@ class CustomerProjectRestoreView(View):
if request.user.is_authenticated() and request.user.is_customer(): if request.user.is_authenticated() and request.user.is_customer():
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
else: else:
return HttpResponseForbidden('403 Forbidden') raise PermissionDenied
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
form = self.form_class(_.merge({}, req.POST, kwargs), req=req) form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
@ -565,7 +563,7 @@ class CustomerProjectDeleteView(View):
if request.user.is_authenticated() and request.user.is_customer(): if request.user.is_authenticated() and request.user.is_customer():
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
else: else:
return HttpResponseForbidden('403 Forbidden') raise PermissionDenied
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
form = self.form_class(_.merge({}, req.POST, kwargs), req=req) form = self.form_class(_.merge({}, req.POST, kwargs), req=req)
@ -717,5 +715,4 @@ class PortfolioDetail(DetailView):
template_name = 'portfolio_detail.html' template_name = 'portfolio_detail.html'
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))

@ -1,11 +1,37 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% block head %}
<meta http-equiv="refresh" content="15;URL='{% url 'wallets:score-detail' pk=request.user.pk %}'">
{% endblock %}
{% block content %} {% block content %}
<div class='container-fluid'> {% include 'partials/header.html' %}
<div class='row'>
<div class='col-xs-12' style='margin-top: 15px'> <div class="container mainScore">
<h1 style="text-align: center">{{ message }}</h1> <div class="row">
<div class='col-xs-12' style='margin-top: 15px; text-align: center'>
<h1>{{ message }}</h1>
{% if request.user.is_authenticated %}
<div>
<a href="{% url 'wallets:score-detail' pk=request.user.pk %}">
Вернуться на страницу личного счёта
</a>
(автоматически через 15 секунд)
</div>
{% endif %}
</div> </div>
{% include 'partials/footer.html' %}
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block js_block %}
<script>
setTimeout(function() {
window.location.href = '{% url 'wallets:score-detail' pk=request.user.pk %}'
}, 15000)
</script>
{% endblock %}

@ -1,4 +1,6 @@
{% load staticfiles %} {% load staticfiles %}
{% load compress %}
<!doctype html> <!doctype html>
<html> <html>
@ -7,9 +9,10 @@
<meta http-equiv='X-UA-Compatible' content='IE=edge, chrome=1'> <meta http-equiv='X-UA-Compatible' content='IE=edge, chrome=1'>
<meta name='viewport' content='width=device-width, initial-scale=1'> <meta name='viewport' content='width=device-width, initial-scale=1'>
<!--<meta name='viewport' content='initial-scale=1.0, user-scalable=no, maximum-scale=1'>--> <!--<meta name='viewport' content='initial-scale=1.0, user-scalable=no, maximum-scale=1'>-->
{% block head %}{% endblock %}
<title>Archilance</title> <title>Archilance</title>
{% load compress %}
{% compress css %} {% compress css %}
<link rel='stylesheet' href='{% static "lib/jquery-ui/jquery-ui.css" %}'> <link rel='stylesheet' href='{% static "lib/jquery-ui/jquery-ui.css" %}'>

@ -53,9 +53,9 @@
<script> <script>
function paginateTo(pageNum) { function paginateTo(pageNum) {
var urlObj = new URI(location.href) var urlObj = new URI(window.location.href)
urlObj.setQuery('page', pageNum) urlObj.setQuery('page', pageNum)
location.href = urlObj.href() window.location.href = urlObj.href()
} }
</script> </script>
{% endif %} {% endif %}

@ -9,9 +9,9 @@ from specializations.models import Specialization
class TeamForm(forms.ModelForm): class TeamForm(forms.ModelForm):
class Meta: class Meta:
model = Team model = Team
fields = ( fields = (
'name', 'name',
'owner', 'owner',
@ -19,15 +19,14 @@ class TeamForm(forms.ModelForm):
class ContractorResumeForm(forms.ModelForm): class ContractorResumeForm(forms.ModelForm):
class Meta: class Meta:
model = ContractorResume model = ContractorResume
fields = ( fields = (
'text', 'text',
) )
class ContractorResumeFilesForm(forms.ModelForm): class ContractorResumeFilesForm(forms.ModelForm):
class Meta: class Meta:
model = ContractorResumeFiles model = ContractorResumeFiles

@ -1,18 +1,20 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %}
{% load specializtions_tags %} {% load specializtions_tags %}
{% load thumbnail %} {% load thumbnail %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
<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> <p class="titleScore">Личный кабинет</p>
</div> </div>
{% include 'partials/contractor_profile_tabs.html' with contractor_pk=request.user.pk active='groups' %}
{% include 'partials/contractor_profile_tabs.html' %}
<div class="buttonGP disTab"> <div class="buttonGP disTab">
<div class="btn-group valProject2 val-pro3" role="group" aria-label="..."> <div class="btn-group valProject2 val-pro3" role="group" aria-label="...">
<button type="button" class="btn btn-default"> <button type="button" class="btn btn-default">
@ -55,208 +57,209 @@
</div> </div>
</div> </div>
</div> </div>
{% if contractor.is_owner_team %}
<div class="projectsBlock disTab"> {% if contractor.is_owner_team %}
<div class="col-lg-12"> <div class="projectsBlock disTab">
<div class="col-lg-3 divCol3"> <div class="col-lg-12">
<div class="avatar"> <div class="col-lg-3 divCol3">
<div class="avatarInset"> <div class="avatar">
{% thumbnail contractor.avatar "265x264" crop="center" as im %} <div class="avatarInset">
<img src="{{ im.url }}" alt="profile-image"> {% thumbnail contractor.avatar "265x264" crop="center" as im %}
{% endthumbnail %} <img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
</div>
</div> </div>
</div>
<div class="menuUser disTab">
<div class="menuUser disTab"> <a href="{% url 'users:contractor-filter' %}" class="add-man">
<a href="{% url 'users:contractor-filter' %}" class="add-man"> добавить участника
добавить участника </a>
</a>
<div class="block-users">
<div class="block-users"> <p>Состав группы</p>
<p>Состав группы</p>
{% for p in participants %}
{% for p in participants %}
<div class="message-new">
<div class="message-new">
<div class="imgMess">
<div class="imgMess"> {% thumbnail p.avatar "60x60" crop="center" as im %}
{% thumbnail p.avatar "60x60" crop="center" as im %} <img src="{{ im.url }}" alt="mess-image">
<img src="{{ im.url }}" alt="mess-image"> {% endthumbnail %}
{% endthumbnail %} </div>
<p class="nameMess">
<a href="{% url 'users:contractor-profile' p.pk %}">{{ p.get_full_name }}</a>
</p>
<span>Программист</span>
</div> </div>
{% empty %}
<p class="nameMess"> В группе пока нет участников
<a href="{% url 'users:contractor-profile' p.pk %}">{{ p.get_full_name }}</a> {% endfor %}
</p> </div>
<span>Программист</span>
</div>
{% empty %}
В группе пока нет участников
{% endfor %}
</div> </div>
</div> </div>
</div>
<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 }}
{{ 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">На сайте {{ contractor.team.created }}</p> <p class="navv">
<p class="navv"> Кол-во человек: <span>{{ participants_count }}</span>
Кол-во человек: <span>{{ participants_count }}</span> </p>
</p> <p class="navv">
<p class="navv"> Выполненных проектов: <span>0</span>
Выполненных проектов: <span>0</span> </p>
</p> <div class="statusUser st-new">Свободен</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>
<div class="col-lg-4">
<div class="col-lg-4"> {% specialization_team_widget contractor.team.pk %}
{% specialization_team_widget contractor.team.pk %} </div>
</div>
<div class="col-lg-4">
<div class="col-lg-4"> {% if contractor.team %}
{% if contractor.team %} {% ratings_team_widget contractor.team.pk %}
{% ratings_team_widget contractor.team.pk %} {% endif %}
{% endif %}
{% if contractor.cro %}
{% if contractor.cro %} <div class="sroUser">
<div class="sroUser"> <div class="iconSRO"></div>
<div class="iconSRO"></div> <p>Есть допуск СРО</p>
<p>Есть допуск СРО</p> </div>
{% endif %}
</div> </div>
{% endif %}
</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="#tab11" data-toggle="tab">Портфолио</a>
<a href="#tab11" data-toggle="tab">Портфолио</a> </li>
</li> <li role="presentation">
<li role="presentation"> <a href="#tab12" data-toggle="tab">Готовые проекты</a>
<a href="#tab12" data-toggle="tab">Готовые проекты</a> </li>
</li> <li role="presentation">
<li role="presentation"> <a href="#tab13" data-toggle="tab">Отзывы</a>
<a href="#tab13" data-toggle="tab">Отзывы</a> </li>
</li> </ul>
</ul> </div>
</div> </div>
</div>
<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">
<div class="galleryWork2 disTab col-lg-9">
<div class="galleryWork2 disTab col-lg-9"> {% for p in portfolios %}
{% 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" style="background:rgba(0, 0, 0, 0) url('{{ p.get_cover }}') no-repeat scroll center center / cover ;">
style="background:rgba(0, 0, 0, 0) url('{{ p.get_cover }}') no-repeat scroll center center / cover ;"> <div class="imgFigure"></div>
<div class="imgFigure"></div> </div>
</div> </div>
</div> <div class="insetCol2 box-sizing disTab">
<div class="insetCol2 box-sizing disTab"> <a href="{% url 'projects:contractor-portfolio-detail' p.pk %}">{{ p }}</a>
<a href="{% url 'projects:contractor-portfolio-detail' p.pk %}">{{ p }}</a> <div class="buttonsImg" disTab>
<div class="buttonsImg" disTab> <a href="{% url 'projects:contractor-portfolio-edit' p.pk %}">
<a href="{% url 'projects:contractor-portfolio-edit' p.pk %}"> <div class="insetBI insetBI1">
<div class="insetBI insetBI1"> <i class="fa fa-pencil"></i>
<i class="fa fa-pencil"></i> </div>
</a>
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div> </div>
</a>
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div> </div>
</div> </div>
</div> </div>
</div> {% empty %}
{% empty %} <div class="col-lg-12">
<div class="col-lg-12"> <p style="text-align: center;margin-top: 25px;">Работ в портфолио пока нет</p>
<p style="text-align: center;margin-top: 25px;">Работ в портфолио пока нет</p> </div>
</div> {% endfor %}
{% endfor %}
</div>
</div> {# TODO:#}
{# TODO:#} {# <div class="col-lg-9 col-lg-offset-3">#}
{# <div class="col-lg-9 col-lg-offset-3">#} {# <div class="linkElse">#}
{# <div class="linkElse">#} {# <a href="javascript:void(0)" class="showElse">показать еще</a>#}
{# <a href="javascript:void(0)" class="showElse">показать еще</a>#} {# </div>#}
{# </div>#} {# </div>#}
{# </div>#} </div>
</div>
<div id="tab12" class="tab-pane fade">
<div id="tab12" class="tab-pane fade">
<div class="galleryWork2 disTab">
<div class="galleryWork2 disTab"> {% for ws in work_sells %}
{% for ws in work_sells %} <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" style="background:rgba(0, 0, 0, 0) url('/media/{{ ws.img }}') no-repeat scroll center center / cover ;">
style="background:rgba(0, 0, 0, 0) url('/media/{{ ws.img }}') no-repeat scroll center center / cover ;"> <div class="imgFigure"></div>
<div class="imgFigure"></div> </div>
</div> <div class="cenaImg box-sizing">
<div class="cenaImg box-sizing"> <div class="cenaImgInset">
<div class="cenaImgInset"> {{ ws.budget }} <i class="fa fa-rub"></i>
{{ ws.budget }} <i class="fa fa-rub"></i> </div>
</div> </div>
</div> </div>
<div class="insetCol2 box-sizing disTab">
<a href="{% url 'work_sell:detail' ws.pk %}">{{ ws }}</a>
</div>
</div> </div>
<div class="insetCol2 box-sizing disTab"> {% empty %}
<a href="{% url 'work_sell:detail' ws.pk %}">{{ ws }}</a> <div class="col-lg-12">
</div> <p style="text-align: center;margin-top: 25px;">Готовых работ пока нет</p>
</div> </div>
{% empty %} {% endfor %}
<div class="col-lg-12"> </div>
<p style="text-align: center;margin-top: 25px;">Готовых работ пока нет</p> {# TODO#}
</div> {# <div class="col-lg-9 col-lg-offset-3">#}
{% endfor %} {# <div class="linkElse">#}
</div> {# <a href="javascript:void(0)" class="showElse">показать еще</a>#}
{# TODO#} {# </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 id="tab13" class="tab-pane fade">
<div id="tab13" class="tab-pane fade"> {% for review in reviews %}
{% for review in reviews %} <div class="new-comm-44">
<div class="new-comm-44"> <div class="col-lg-12">
<div class="col-lg-12"> <p class="nameComm">
<p class="nameComm"> <a href="">{{ review.get_sender }}</a>
<a href="">{{ review.get_sender }}</a> </p>
</p> {% if review.project.deal_type == 'secure_deal' %}
{% if review.project.deal_type == 'secure_deal' %} <span class="dateComm44">
<span class="dateComm44"> Безопасная сделка
Безопасная сделка </span>
</span> {% endif %}
{% endif %} <div class="stars box-sizing">
<div class="stars box-sizing"> <a href="#">положительный отзыв</a>
<a href="#">положительный отзыв</a> </div>
<p class="textComm44">
{{ review.text|safe }}
</p>
</div> </div>
<p class="textComm44">
{{ review.text|safe }}
</p>
</div> </div>
{% empty %}
<div class="new-comm-44">
<p style="text-align: center;">Отзывов пока нет</p>
</div>
{% endfor %}
</div> </div>
{% empty %}
<div class="new-comm-44">
<p style="text-align: center;">Отзывов пока нет</p>
</div>
{% endfor %}
</div> </div>
</div> </div>
</div> </div>
</div> {% endif %}
{% endif %}
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
</div> </div>
</div> </div>

@ -1,9 +1,9 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %}
{% load specializtions_tags %} {% load specializtions_tags %}
{% load thumbnail %} {% load thumbnail %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
@ -12,85 +12,103 @@
<div class="col-lg-12"> <div class="col-lg-12">
<p class="titleScore">Личный кабинет</p> <p class="titleScore">Личный кабинет</p>
</div> </div>
{% include 'partials/contractor_profile_tabs.html' with contractor_pk=request.user.pk active='open' all_project_count=projects_count %}
{% include 'partials/contractor_profile_tabs.html' %}
<div class="buttonGP disTab"> <div class="buttonGP disTab">
<div class="btn-group valProject2" role="group" aria-label="..."> <div class="btn-group valProject2" role="group">
<a href="{% url 'users:contractor-office-open-projects' pk=request.user.pk %}" class="btn btn-default">Все</a> <a href="#" onclick="query('owner', ''); return false" class="btn btn-default">Все</a>
<a href="{% url 'users:contractor-office-open-projects' pk=request.user.pk %}?owner=private" class="btn btn-default">Личные</a> <a href="#" onclick="query('owner', 'private'); return false" class="btn btn-default">Личные</a>
<a href="{% url 'users:contractor-office-open-projects' pk=request.user.pk %}?owner=teams" class="btn btn-default">От именни группы</a> <a href="#" onclick="query('owner', 'teams'); return false" class="btn btn-default">От именни группы</a>
</div> </div>
<div class="btn-group valProject2" role="group" aria-label="...">
<button type="button" class="btn btn-default"> <div class="btn-group valProject2" role="group">
<a href="#" onclick="query('archived', ''); return false" class="btn btn-default">
Открытые проекты Открытые проекты
<span><mark>{{ current_projects_count }}</mark> / <span>{{ projects_count }}</span></span> <span><mark>0</mark> / <span>{{ active_project_count }}</span></span>
</button> </a>
<button type="button" class="btn btn-default">
<a href="#" onclick="query('archived', 'on'); return false" class="btn btn-default">
Архив Архив
<span><mark></mark><span>{{ archive_count }}</span></span> <span><mark></mark><span>{{ archived_project_count }}</span></span>
</button> </a>
</div> </div>
</div> </div>
<div class="projectsBlock disTab"> <div class="projectsBlock disTab">
{% for proj in open_projects %} {% for project in projects %}
<div class="projectPro clearfix"> <div class="projectPro clearfix">
<div class="col-lg-9 leftPro"> <div class="col-lg-9 leftPro">
<a href="{% url 'projects:detail' proj.pk %}"> <a href="{% url 'projects:detail' project.pk %}">
<p class="titlePro"> <p class="titlePro">{{ project.name }}</p>
{{ proj }}
</p>
</a> </a>
<ul class="desPro">
<li> <ul class="desPro">
Объект "{{ proj.realty.name }}" <li>Объект "{{ project.realty.name }}"</li>
</li> </ul>
</ul>
<p class="textPro"> <p class="textPro">{{ project.text|linebreaksbr|truncatechars:300 }}</p>
</p>
<ul class="listPro"> {% if TEMPLATE_DEBUG %}
<li> <pre><!--
{{ proj.created }} --><b>State:</b> {{ project.state }}<br><!--
</li> --><br><!--
<li> --><b>Specialization:</b> {{ proj.specialization }}<br><!--
0 --><br><!--
</li> --><b>Realty location:</b> {{ proj.realty.location }}<br><!--
<li> --><br><!--
0 --><b>Constr. type:</b> {{ proj.realty.construction_type }}<br><!--
</li> --><br><!--
<li> --><b>Build. classif.:</b> {{ proj.realty.building_classification }}<br><!--
{{ proj.customer.username }} --></pre>
</li>
</ul>
</div>
<div class="col-lg-3 rightPro">
<p class="cenaPro">
{{ proj.budget }} <i class="fa fa-rub"></i>
</p>
<ul>
{% if proj.cro %}
<li>
Безопасная сделка
</li>
{% endif %} {% endif %}
<ul class="listPro">
<li>{{ project.created }}</li>
<li>{{ project.hit_count.hits }}</li>
<li>{{ project.answers.count }}</li>
<li>{{ project.customer.username }}</li>
</ul>
</div>
<div class="col-lg-3 rightPro">
<p class="cenaPro">
{{ project.budget }} <i class="fa fa-rub"></i>
</p>
<ul>
{% if proj.secure_deal %}
<li>Безопасная сделка</li>
{% endif %}
<li> <li>
<form action="{% url 'projects:contractor-answer-archive' %}" method="POST" novalidate> {{ project.specialization.name }}
</li>
<li>
<form action="{% url 'projects:contractor-answer-archive' %}" method="POST" novalidate>
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}"> <input type="hidden" name="next" value="{{ request.path }}">
<input type="hidden" name="project_pk" value="{{ proj.pk }}"> <input type="hidden" name="project_pk" value="{{ project.pk }}">
<input type="hidden" name="user_pk" value="{{ request.user.pk }}"> <input type="hidden" name="user_pk" value="{{ contractor.pk }}">
<a href="#" onclick="$(this).closest('form').submit(); return false">Отказаться и переместить в архив</a> <a href="#" onclick="$(this).closest('form').submit(); return false">Отказаться и переместить в архив</a>
</form> </form>
</li>
</li> </ul>
</div>
</ul> </div>
</div>
</div>
{% endfor %} {% endfor %}
</div> </div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
</div> </div>
</div> </div>
<script>
function query(paramName, paramVal) {
var urlObj = new URI(window.location.href)
paramVal === '' ? urlObj.removeQuery(paramName) : urlObj.setQuery(paramName, paramVal)
window.location.href = urlObj.href()
}
</script>
{% endblock %} {% endblock %}

@ -1,95 +0,0 @@
{% extends 'partials/base.html' %}
{% load staticfiles %}
{% load specializtions_tags %}
{% load thumbnail %}
{% block content %}
{% include 'partials/header.html' %}
<div class="container mainScore" >
<div class="row">
<div class="col-lg-12">
<p class="titleScore">Личный кабинет</p>
</div>
{% include 'partials/contractor_profile_tabs.html' with contractor_pk=request.user.pk active='open' all_project_count=projects_count %}
<div class="buttonGP disTab">
<div class="btn-group valProject2" role="group" aria-label="...">
<a href="{% url 'users:contractor-office-open-projects' pk=request.user.pk %}" class="btn btn-default">Все</a>
<a href="{% url 'users:contractor-office-open-projects' pk=request.user.pk %}?owner=private" class="btn btn-default">Личные</a>
<a href="{% url 'users:contractor-office-open-projects' pk=request.user.pk %}?owner=teams" class="btn btn-default">От именни группы</a>
</div>
<div class="btn-group valProject2" role="group" aria-label="...">
<button type="button" class="btn btn-default">
Открытые проекты
<span><mark>{{ current_projects_count }}</mark> / <span>{{ projects_count }}</span></span>
</button>
<button type="button" class="btn btn-default">
Архив
<span><mark></mark><span>{{ archive_count }}</span></span>
</button>
</div>
</div>
<div class="projectsBlock disTab">
{% for proj in open_projects %}
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<a href="{% url 'projects:detail' proj.pk %}">
<p class="titlePro">
{{ proj }}
</p>
</a>
<ul class="desPro">
<li>
Объект "{{ proj.realty.name }}"
</li>
</ul>
<p class="textPro">
</p>
<ul class="listPro">
<li>
{{ proj.created }}
</li>
<li>
0
</li>
<li>
0
</li>
<li>
{{ proj.customer.username }}
</li>
</ul>
</div>
<div class="col-lg-3 rightPro">
<p class="cenaPro">
{{ proj.budget }} <i class="fa fa-rub"></i>
</p>
<ul>
{% if proj.cro %}
<li>
Безопасная сделка
</li>
{% endif %}
<li>
<form action="{% url 'projects:contractor-answer-archive' %}" method="POST" novalidate>
{% csrf_token %}
<input type="hidden" name="next" value="{{ request.path }}">
<input type="hidden" name="project_pk" value="{{ proj.pk }}">
<input type="hidden" name="user_pk" value="{{ request.user.pk }}">
<a href="#" onclick="$(this).closest('form').submit(); return false">Отказаться и переместить в архив</a>
</form>
</li>
</ul>
</div>
</div>
{% endfor %}
</div>
{% include 'partials/footer.html' %}
</div>
</div>
{% endblock %}

@ -1,30 +1,33 @@
{% url 'users:contractor-office' pk=contractor.pk as contractor_office_url %}
{% url 'users:contractor-office-open-projects' pk=contractor.pk as contractor_office_open_projects_url %}
<div class="profileTabs"> <div class="profileTabs">
<ul class="nav nav-tabs nav-justified"> <ul class="nav nav-tabs nav-justified">
<li role="presentation"> <li role="presentation">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей </a> <a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
</li> </li>
<li role="presentation" {% if active == 'groups' %}class="active"{% endif %}>
<a href="{% url 'users:contractor-office' pk=contractor_pk %}" > <li role="presentation" {% if request.path == contractor_office_url %}class="active"{% endif %}>
Мои группы <a href="{{ contractor_office_url }}">Мои группы</a>
</a> <div class="roundsCount"></div>
<div class="roundsCount"> </li>
</div>
</li> <li role="presentation" {% if request.path == contractor_office_open_projects_url %}class="active"{% endif %}>
<li role="presentation" {% if active == 'open' %}class="active"{% endif %}> <a href="{{ contractor_office_open_projects_url }}" >Открытые проекты</a>
<a href="{% url 'users:contractor-office-open-projects' pk=contractor_pk %}" >Открытые проекты</a> <span class="desPresent">в процессе обсуждения</span>
<span class="desPresent">
в процессе обсуждения <div class="roundsCount">
</span> <div class="countR">0</div>
<div class="roundsCount"> <div class="countG">{{ all_project_count }}</div>
<div class="countR">0</div> </div>
<div class="countG">{{ all_project_count}}</div> </li>
</div>
</li> <li role="presentation">
<li role="presentation"> <a href="{% url 'chat:chat-user' %}">Проекты в работе</a>
<a href="{% url 'chat:chat-user' %}">Проекты в работе</a>
<div class="roundsCount"> <div class="roundsCount">
<div class="countG">0</div> <div class="countG">0</div>
</div> </div>
</li> </li>
</ul> </ul>
</div> </div>

@ -1,16 +1,14 @@
from .models import ContractorResume, ContractorResumeFiles
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.core.exceptions import PermissionDenied
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.core.mail import send_mail from django.core.mail import send_mail
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db.models import Q from django.db.models import Q
from django.http import HttpResponse, HttpResponseForbidden from django.http import HttpResponse, HttpResponseForbidden, JsonResponse, Http404
from django.http import JsonResponse, Http404
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 ListView, DetailView, View, UpdateView, CreateView from django.views.generic import ListView, DetailView, View, UpdateView, CreateView
from django.views.generic import UpdateView
from pprint import pprint, pformat from pprint import pprint, pformat
import itertools import itertools
import json import json
@ -18,7 +16,7 @@ import natsort
import pydash as _; _.map = _.map_; _.filter = _.filter_ 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, ContractorResume, ContractorResumeFiles
from .forms import TeamForm, ContractorResumeFilesForm, ContractorResumeForm from .forms import TeamForm, ContractorResumeFilesForm, ContractorResumeForm
from archilance import util from archilance import util
from archilance.mixins import BaseMixin from archilance.mixins import BaseMixin
@ -32,8 +30,8 @@ from work_sell.models import WorkSell, Picture
from .forms import ( from .forms import (
ContractorFilterForm, ContractorFilterForm,
CustomerProfileProjectRealtyForm, CustomerProfileProjectRealtyForm,
UserProfileBasicInfoEditForm,
UserFinancialInfoEditForm, UserFinancialInfoEditForm,
UserProfileBasicInfoEditForm,
UserProfileEditForm, UserProfileEditForm,
) )
@ -46,7 +44,7 @@ class UserProfileEditView(BaseMixin, View):
if request.user.is_authenticated() and request.user.pk == int(kwargs.get('pk')): if request.user.is_authenticated() and request.user.pk == int(kwargs.get('pk')):
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
else: else:
return HttpResponseForbidden('403 Forbidden') raise PermissionDenied
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({}, request.GET, kwargs)) context = self.get_context_data(**_.merge({}, request.GET, kwargs))
@ -90,7 +88,7 @@ class UserFinancialInfoEditView(BaseMixin, View):
if request.user.is_authenticated() and request.user.pk == int(kwargs.get('pk')): if request.user.is_authenticated() and request.user.pk == int(kwargs.get('pk')):
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
else: else:
return HttpResponseForbidden('403 Forbidden') raise PermissionDenied
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({}, request.GET, kwargs)) context = self.get_context_data(**_.merge({}, request.GET, kwargs))
@ -365,7 +363,7 @@ class ContractorOfficeDetailView(DetailView):
template_name = 'contractor_office.html' template_name = 'contractor_office.html'
context_object_name = 'contractor' context_object_name = 'contractor'
form_team = TeamForm form_team = TeamForm
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context['form_team'] = TeamForm context['form_team'] = TeamForm
@ -383,58 +381,50 @@ class ContractorOfficeDetailView(DetailView):
return context return context
class ContractorOfficeOpenProjectsView(BaseMixin,View): class ContractorOfficeOpenProjectsView(BaseMixin, View):
template_name = 'contractor_office_open_projects.html' template_name = 'contractor_office_open_projects.html'
def get(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({},request.GET, kwargs)) # if request.user.is_authenticated() and request.user.is_contractor() and request.user.pk == int(kwargs.get('pk')):
contractor = get_object_or_404(User.contractor_objects,pk=kwargs.get('pk')) if request.user.is_authenticated():
owner = request.GET.get('owner') return super().dispatch(request, *args, **kwargs)
# import code; code.interact(local=dict(globals(), **locals()))
if owner and owner == 'private':
all_project_ids = [a.project.pk for a in contractor.contractor_answers.filter(is_archive=False)]
elif owner and owner == 'teams':
all_project_ids = [a.project.pk for a in contractor.team.answers.filter(is_archive=False)]
else: else:
team_project_ids = [a.project.pk for a in contractor.team.answers.filter(is_archive=False)] raise PermissionDenied
contractor_project_ids = [a.project.pk for a in contractor.contractor_answers.filter(is_archive=False)]
all_project_ids = contractor_project_ids + team_project_ids
open_projects = Project.objects.filter(pk__in=all_project_ids)
archive_contractor_count = contractor.contractor_answers.filter(is_archive=True).count()
archive_team_count = contractor.team.answers.filter(is_archive=True).count()
archive_count = archive_contractor_count + archive_team_count
context.update({
'open_projects': open_projects,
'projects_count': len(open_projects),
'current_projects_count': len(open_projects),
'archive_count': archive_count,
})
return render(request, self.template_name, context)
class ContractorOfficeOpenProjectsArchiveView(BaseMixin,View):
template_name = 'contractor_office_open_projects_archive.html'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({},request.GET, kwargs)) context = self.get_context_data(**kwargs)
contractor = get_object_or_404(User.contractor_objects,pk=kwargs.get('pk'))
owner = request.GET.get('owner') contractor = get_object_or_404(User.contractor_objects, pk=kwargs.get('pk'))
# import code; code.interact(local=dict(globals(), **locals())) context['contractor'] = contractor
if owner and owner == 'private':
all_project_ids = [a.project.pk for a in contractor.contractor_answers.all()] private_projects = tuple(a.project for a in contractor.contractor_answers.all())
elif owner and owner == 'teams': private_project_count = len(private_projects)
all_project_ids = [a.project.pk for a in contractor.team.answers.all()]
team_projects = tuple(a.project for a in contractor.team.answers.all())
team_project_count = len(team_projects)
context['all_project_count'] = private_project_count + team_project_count
if request.GET.get('owner') == 'private':
projects = private_projects
elif request.GET.get('owner') == 'teams':
projects = team_projects
else: else:
team_project_ids = [a.project.pk for a in contractor.team.answers.all()] projects = itertools.chain(private_projects, team_projects)
contractor_project_ids = [a.project.pk for a in contractor.contractor_answers.all()]
all_project_ids = contractor_project_ids + team_project_ids active_projects = _.filter(projects, lambda p: p.state == 'active')
context['active_project_count'] = len(active_projects)
open_projects = Project.objects.filter(pk__in=all_project_ids)
context.update({ archived_projects = _.filter(projects, lambda p: p.state == 'trashed')
'open_projects': open_projects, context['archived_project_count'] = len(archived_projects)
'projects_count': len(open_projects),
}) if request.GET.get('archived') == 'on':
projects = archived_projects
else:
projects = active_projects
context['projects'] = projects
return render(request, self.template_name, context) return render(request, self.template_name, context)
@ -644,3 +634,4 @@ class CustomerProfileReviewsView(BaseMixin, View):
return render(request, self.template_name, context) return render(request, self.template_name, context)
# import code; code.interact(local=dict(globals(), **locals()))

Loading…
Cancel
Save