remotes/origin/PR-39
ArturBaybulatov 10 years ago
commit 1c9984f6fb
  1. 11
      assets/css/extra.css
  2. 2
      assets/css/main.css
  3. 20
      projects/migrations/0009_project_is_archive.py
  4. 24
      projects/migrations/0010_auto_20160816_1831.py
  5. 1
      projects/models.py
  6. 2
      projects/urls.py
  7. 17
      projects/views.py
  8. 2
      ratings/templatetags/specializtions_tags.py
  9. 49
      templates/registration/login.html
  10. 3
      templates/registration/registration_complete.html
  11. 10
      templates/registration/registration_form.html
  12. 38
      users/templates/contractor_office.html
  13. 99
      users/templates/contractor_office_open_projects.html
  14. 98
      users/templates/contractor_office_open_projects_archive.html
  15. 30
      users/templates/partials/contractor_profile_tabs.html
  16. 4
      users/urls.py
  17. 55
      users/views.py

@ -96,3 +96,14 @@
float: left;
margin: 33px 0 0 0;
}
.form-regestration .errorlist {
color: red;
width: 360px;
margin: 0 auto;
text-align: left;
font-family: 'Arial-MT-Regular', sans-serif;
font-size: 15px;
}

@ -4345,7 +4345,7 @@ input[type="checkbox"]:checked + span {
width: 100%;
float: left;
margin: 0 0 80px 0;
padding: 67px 0 0 0;
padding: 67px 0 15px 0;
background-color: #ddd;
text-align: center;
}

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-16 13:58
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0008_auto_20160815_1900'),
]
operations = [
migrations.AddField(
model_name='project',
name='is_archive',
field=models.BooleanField(default=False),
),
]

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-16 15:31
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0009_project_is_archive'),
]
operations = [
migrations.RemoveField(
model_name='project',
name='is_archive',
),
migrations.AddField(
model_name='answer',
name='is_archive',
field=models.BooleanField(default=False),
),
]

@ -126,6 +126,7 @@ class Answer(models.Model):
secure_deal_only = models.BooleanField(default=False)
term = models.IntegerField(blank=True, null=True)
term_type = models.CharField(max_length=10, choices=TERMS, blank=True, null=True)
is_archive = models.BooleanField(default=False)
content_type = models.ForeignKey(ContentType, limit_choices_to=Q(app_label='users', model='user') | Q(app_label='users', model='team'))
object_id = models.IntegerField()

@ -16,6 +16,7 @@ from .views import (
ProjectComparisonView,
ProjectDetailWithAnswerView,
ProjectFilterView,
ContractorAnswerArchiveView,
sort_candidates,
)
@ -28,6 +29,7 @@ urlpatterns = [
urls.url(r'^create/$', CustomerProjectCreateView.as_view(), name='customer-project-create'),
urls.url(r'^(?P<pk>\d+)/edit/$', CustomerProjectEditView.as_view(), name='customer-project-edit'),
urls.url(r'^(?P<pk>\d+)/trash/$', CustomerProjectTrashView.as_view(), name='customer-project-trash'),
urls.url(r'^answer/move/archive/$', ContractorAnswerArchiveView.as_view(), name='contractor-answer-archive'),
urls.url(r'^portfolio/(?P<pk>\d+)/trash/$', ContractorPortfolioTrashView.as_view(), name='contractor-portfolio-trash'),
urls.url(r'^(?P<pk>\d+)/restore/$', CustomerProjectRestoreView.as_view(), name='customer-project-restore'),
urls.url(r'^(?P<pk>\d+)/delete/$', CustomerProjectDeleteView.as_view(), name='customer-project-delete'),

@ -193,8 +193,9 @@ class ProjectFilterView(BaseMixin, View):
for k in keywords:
projects = projects.filter(Q(name__icontains=k) | Q(text__icontains=k))
projects = projects.filter(cro=cro)
# projects = projects.filter(cro=cro)
if work_type:
projects = projects.filter(work_type=work_type)
@ -430,6 +431,18 @@ class CustomerProjectEditView(BaseMixin, View):
return render(request, self.template_name, context)
class ContractorAnswerArchiveView(View):
def post(self, request, *args, **kwargs):
project_pk = request.POST.get('project_pk')
user_pk = request.POST.get('user_pk')
answer = Answer.objects.filter(project_id=project_pk,object_id=user_pk, content_type__model='user').first()
answer.is_archive = True
answer.save()
redirect_to = request.POST.get('next')
return redirect(redirect_to)
class ContractorPortfolioTrashView(View):
form_class = ContractorPortfolioTrashForm

@ -7,7 +7,7 @@ from ratings.models import SpecializationRating
register = template.Library()
@register.inclusion_tag('templatetags/specializations_widget.html', takes_context=True)
def specialization_widget(context, user_id):
def specialization_widget(context, user_id, class_name=None):
user_id = int(user_id)
specializations = SpecializationRating.objects.select_related('specialization').filter(user_id=user_id)
return {

@ -8,22 +8,63 @@
<p class="titleScore">Вход на сайт</p>
</div>
<div class="form-regestration">
{{ form.errors }}
<form method="post">{% csrf_token %}
{{ form.non_field_errors }}
<div class="col-lg-12 select-reg">
<input type="text" name="{{ form.username.name }}" value="{{ form.username.value }}" class="box-sizing email-reg"
placeholder="Электронная почта">
{{ form.username.errors }}
</div>
<div class="col-lg-12 select-reg">
<input type="password" name="{{ form.password.name }}" value="{{ form.password.value }}"class="box-sizing pass-reg" placeholder="Пароль">
{{ form.password.errors }}
</div>
<div class="col-lg-12 select-reg">
<div class="check-reg">
<label><input type="checkbox" name="check-reg"><span></span></label>
<p>Запомнить</p>
<p><a href="{% url 'password_reset_recover' %}">Забыли пароль ?</a></p>
<p style="width: 35%;margin-top: 2px;">Запомнить</p>
<p style="width: 50%;float: right;text-align: right;margin-top: 2px;"><a href="{% url 'password_reset_recover' %}">Забыли пароль ?</a></p>
</div>
</div>
</div>
<div class="col-lg-12" style="margin-top: 10px;">
<div class="col-xs-12 text-center">
<div class="btn-group" role="group">
<div class="pull-left -social -fb">
<a href="{% url 'social:begin' 'facebook' %}?user_type={% if request.GET.type == 'customer' %}Заказчики{% else %}Исполнители{% endif %}">
<img src="http://nepesh.com/static/img/social/fb.png" alt="fb">
</a>
</div>
<div class="pull-left -social -tw">
<a href="{% url 'social:begin' 'twitter' %}?user_type={% if request.GET.type == 'customer' %}Заказчики{% else %}Исполнители{% endif %}">
<img src="http://nepesh.com/static/img/social/tw.png" alt="tw">
</a>
</div>
<div class="pull-left -social -gplus">
<a href="{% url 'social:begin' 'google-oauth2' %}">
<img src="http://nepesh.com/static/img/social/gplus.png" alt="gplus">
</a>
</div>
<div class="pull-left -social -vk">
<a href="{% url 'social:begin' 'vk-oauth2' %}">
<img src="http://nepesh.com/static/img/social/vk.png" alt="vk">
</a>
</div>
<div class="pull-left -social -ok">
<a href="{% url 'social:begin' 'odnoklassniki-oauth2' %}">
<img src="http://nepesh.com/static/img/social/ok.gif" alt="yt">
</a>
</div>
</div>
</div>
</div>
<div class="col-lg-12 select-reg">
<button class="reg-sub">Вход</button>

@ -7,6 +7,9 @@
<div class="col-lg-12">
<p class="titleScore">Регистрация прошла успешно</p>
<p style="text-align: center;">Вам необходимо активировать этот аккаунт. Перейдите по ссылке в письме,
которое вам отправлено на почту
</p>
</div>
{% include 'partials/footer.html' %}

@ -8,7 +8,7 @@
</div>
<div class="form-regestration">
<form method="post">{% csrf_token %}
{{ form.errors }}
{{ form.non_field_errors }}
<div class="col-lg-12 select-reg polsF1">
{% if request.GET.type == 'customer' %}
<input type="hidden" name="group_id" value="Заказчики"/>
@ -27,19 +27,23 @@
<div class="col-lg-12 select-reg">
<input type="text" name="{{ form.username.name }}" value="{{ form.username.value }}" class="box-sizing email-reg"
placeholder="Nickname">
{{ form.username.errors }}
</div>
<div class="col-lg-12 select-reg">
<div class="col-lg-12 select-reg ">
<input type="text" name="{{ form.email.name }}" class="box-sizing email-reg"
value="{{ form.email.value }}" placeholder="Электронная почта">
{{ form.email.errors }}
</div>
<div class="col-lg-12 select-reg">
<input type="password" name="{{ form.password1.name }}" class="box-sizing pass-reg"
placeholder="Пароль">
{{ form.password1.errors }}
</div>
<div class="col-lg-12 select-reg">
<input type="password" name="{{ form.password2.name }}" class="box-sizing pass-reg"
placeholder="Пароль">
{{ form.password2.errors }}
</div>
<div class="col-lg-12 select-reg">
<button class="reg-sub">Зарегистрироваться</button>
@ -92,7 +96,7 @@
</div>
</form>
<div class="col-lg-12 select-reg">
<a href="" class="have-ac">Я уже зарегистрирован на ресурсе</a>
<a href="{% url 'auth_login' %}" class="have-ac">Я уже зарегистрирован на ресурсе</a>
</div>
</div>

@ -7,46 +7,12 @@
{% block content %}
{% include 'partials/header.html' %}
<div class="container mainScore" xmlns="http://www.w3.org/1999/html">
<div class="container mainScore">
<div class="row">
<div class="col-lg-12">
<p class="titleScore">Личный кабинет</p>
</div>
<div class="profileTabs">
<ul class="nav nav-tabs nav-justified">
<li role="presentation">
<a href="{% url 'users:contractor-filter' %}">Поиск исполнителей</a>
</li>
<li role="presentation" class="active">
<a href="#">Мои группы</a>
<div class="roundsCount">
<div class="countR">1</div>
<div class="countG">2</div>
</div>
</li>
<li role="presentation">
<a href="#">Открытые проекты</a>
<span class="desPresent">
в процессе обсуждения
</span>
<div class="roundsCount">
<div class="countR">1</div>
<div class="countG">2</div>
</div>
</li>
<li role="presentation">
<a href="#">Проекты в работе</a>
<div class="roundsCount">
<div class="countG">2</div>
</div>
</li>
</ul>
</div>
{% include 'partials/contractor_profile_tabs.html' with contractor_pk=request.user.pk active='groups' %}
<div class="buttonGP disTab">
<div class="btn-group valProject2 val-pro3" role="group" aria-label="...">
<button type="button" class="btn btn-default">

@ -0,0 +1,99 @@
{% 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>
<li>
<span>0</span> ответ от имени группы
</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 %}

@ -0,0 +1,98 @@
{% 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>
<li>
<span>0</span> ответ от имени группы
</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 %}

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

@ -16,6 +16,7 @@ from .views import (
UserProfileEditView,
TeamCreateView,
ContractorResumeUpdateView,
ContractorOfficeOpenProjectsView,
contractor_resumefile_create,
)
@ -40,6 +41,7 @@ urlpatterns = [
urls.url(r'^contractorsresumefiles/create/$', contractor_resumefile_create, name='contractor-resume-file-create'),
urls.url(r'^contractors/(?P<pk>\d+)/$', ContractorProfileDetailView.as_view(), name='contractor-profile'),
urls.url(r'^contractor-office/(?P<pk>\d+)/$', ContractorOfficeDetailView.as_view(), name='contractor-office'),
urls.url(r'^contractor-office/(?P<pk>\d+)/open-projects/$', ContractorOfficeOpenProjectsView.as_view(), name='contractor-office-open-projects'),
urls.url(r'^test/$', send_mail_test),
]

@ -384,6 +384,60 @@ class ContractorOfficeDetailView(DetailView):
return context
class ContractorOfficeOpenProjectsView(BaseMixin,View):
template_name = 'contractor_office_open_projects.html'
def get(self, request, *args, **kwargs):
context = self.get_context_data(**_.merge({},request.GET, kwargs))
contractor = get_object_or_404(User.contractor_objects,pk=kwargs.get('pk'))
owner = request.GET.get('owner')
# 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:
team_project_ids = [a.project.pk for a in contractor.team.answers.filter(is_archive=False)]
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):
context = self.get_context_data(**_.merge({},request.GET, kwargs))
contractor = get_object_or_404(User.contractor_objects,pk=kwargs.get('pk'))
owner = request.GET.get('owner')
# 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.all()]
elif owner and owner == 'teams':
all_project_ids = [a.project.pk for a in contractor.team.answers.all()]
else:
team_project_ids = [a.project.pk for a in contractor.team.answers.all()]
contractor_project_ids = [a.project.pk for a in contractor.contractor_answers.all()]
all_project_ids = contractor_project_ids + team_project_ids
open_projects = Project.objects.filter(pk__in=all_project_ids)
context.update({
'open_projects': open_projects,
'projects_count': len(open_projects),
})
return render(request, self.template_name, context)
class CustomerProfileOpenProjectsView(BaseMixin, View):
template_name = 'customer_profile_open_projects.html'
@ -491,7 +545,6 @@ class CustomerProfileCurrentProjectsView(BaseMixin, DetailView):
context_object_name = 'customer'
class TeamCreateView(View):
form_class = TeamForm

Loading…
Cancel
Save