remotes/origin/PR-39
ArturBaybulatov 10 years ago
commit 3ed593b96c
  1. 19
      projects/migrations/0005_auto_20160812_1931.py
  2. 3
      projects/models.py
  3. 61
      projects/templates/comparison.html
  4. 2
      projects/urls.py
  5. 37
      projects/views.py
  6. 3
      users/templates/contractor_profile.html
  7. 5
      work_sell/templates/worksell_edit.html

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-12 16:31
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('projects', '0004_merge'),
]
operations = [
migrations.AlterModelOptions(
name='candidate',
options={'ordering': ('position',), 'verbose_name': 'Кандидат', 'verbose_name_plural': 'Кандидаты'},
),
]

@ -206,9 +206,10 @@ class Candidate(models.Model):
position = models.PositiveIntegerField(default=0) position = models.PositiveIntegerField(default=0)
def __str__(self): def __str__(self):
return self.answer.user.get_full_name() return str(self.answer.pk)
class Meta: class Meta:
ordering = ('position',)
verbose_name = 'Кандидат' verbose_name = 'Кандидат'
verbose_name_plural = 'Кандидаты' verbose_name_plural = 'Кандидаты'

@ -14,7 +14,8 @@
<div class="titleBlockComparison disTab"> <div class="titleBlockComparison disTab">
<div class="triangle1"></div> <div class="triangle1"></div>
<p>{{ object }}</p> <p>{{ object }}</p>
<table class="compTable"> <table class="compTable" id="compTable">
<thead>
<tr> <tr>
<th></th> <th></th>
<th>Кандидат</th> <th>Кандидат</th>
@ -25,11 +26,13 @@
<th>Безопасные сделки</th> <th>Безопасные сделки</th>
<th>Решение</th> <th>Решение</th>
</tr> </tr>
</thead>
<tbody>
{% for cand in object.candidates.all %} {% for cand in object.candidates.all %}
<tr> <tr style="cursor:move;" class="items[]_{{ cand.pk }}" data-class="items[]_{{ cand.pk }}">
<td>{{ forloop.counter }}</td> <td>{{ cand.position }}</td>
<td> <td>
{{ cand.answer.contractor.get_full_name }} {{ cand.answer.author.username }}
</td> </td>
<td>{{ cand.answer.budget }} <i class="fa fa-rub"></i></td> <td>{{ cand.answer.budget }} <i class="fa fa-rub"></i></td>
@ -66,13 +69,20 @@
<td> <td>
<div class="tableButtons disTab"> <div class="tableButtons disTab">
<div class="btnTab btnTab1"></div> <div class="btnTab btnTab1"></div>
<a href="/test">
<div class="btnTab btnTab2"></div> <div class="btnTab btnTab2"></div>
</a>
<a href="/delete">
<div class="btnTab btnTab3"></div> <div class="btnTab btnTab3"></div>
</a>
<div class="btnTab btnTab4"></div> <div class="btnTab btnTab4"></div>
</div> </div>
</td> </td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody>
</table> </table>
</div> </div>
@ -80,3 +90,46 @@
</div> </div>
</div> </div>
{% endblock %} {% endblock %}
{% block js_block %}
<script src="https://code.jquery.com/ui/1.12.0/jquery-ui.min.js"
integrity="sha256-eGE6blurk5sHj+rmkfsGYeKyZx3M4bG+ZlFyA7Kns7E=" crossorigin="anonymous"></script>
<script type="text/javascript">
$(function () {
var fixHelper = function (e, ui) {
ui.children().each(function () {
$(this).width($(this).width());
});
return ui;
};
$("#compTable tbody").sortable({
forcePlaceholderSize: true,
forceHelperSize: true,
items: 'tr',
update: function () {
var serial = $('#compTable tbody').sortable('serialize', {key: 'items[]', attribute: 'data-class'});
console.log(serial);
$.ajax({
url: '/projects/candidate/comparison/sort/',
method: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
},
data: serial,
dataType: 'json',
success: function (json) {
console.log(json);
},
error: function (jqXHR, e) {
console.log(jqXHR);
console.log(e);
}
});
},
helper: fixHelper,
}).disableSelection();
;
});
</script>
{% endblock %}

@ -3,6 +3,7 @@ from django.views.generic import TemplateView
from .views import ( from .views import (
add_candidate, add_candidate,
sort_candidates,
contractor_portfolio_create, contractor_portfolio_create,
ContractorPortfolioTrashView, ContractorPortfolioTrashView,
ContractorPortfolioUpdateView, ContractorPortfolioUpdateView,
@ -34,6 +35,7 @@ urlpatterns = [
urls.url(r'^portfolio/(?P<pk>\d+)/edit/$', ContractorPortfolioUpdateView.as_view(), name='contractor-portfolio-edit'), urls.url(r'^portfolio/(?P<pk>\d+)/edit/$', ContractorPortfolioUpdateView.as_view(), name='contractor-portfolio-edit'),
urls.url(r'^candidate/add/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', add_candidate, name='add-candidate'), urls.url(r'^candidate/add/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', add_candidate, name='add-candidate'),
urls.url(r'^candidate/comparison/sort/$', sort_candidates, name='comparison-sort'),
urls.url(r'^candidate/comparison/(?P<pk>\d+)/$', ProjectComparisonView.as_view(), name='comparison'), urls.url(r'^candidate/comparison/(?P<pk>\d+)/$', ProjectComparisonView.as_view(), name='comparison'),
urls.url(r'^offerorder/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', OfferOrderView.as_view(), name='offer-order'), urls.url(r'^offerorder/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', OfferOrderView.as_view(), name='offer-order'),

@ -11,7 +11,10 @@ from django.views.generic import ListView, DetailView, CreateView, View, UpdateV
from django.views.generic.base import ContextMixin from django.views.generic.base import ContextMixin
from pprint import pprint, pformat from pprint import pprint, pformat
import json import json
import pydash as _; _.map = _.map_; _.filter = _.filter_ import pydash as _;
_.map = _.map_;
_.filter = _.filter_
import re import re
from .mixins import LastAccessMixin from .mixins import LastAccessMixin
@ -57,8 +60,10 @@ class ProjectDetailWithContractorAnswerView(BaseMixin, View):
team = None team = None
answer = None answer = None
try: team = contractor.team try:
except Team.DoesNotExist: pass team = contractor.team
except Team.DoesNotExist:
pass
if team: if team:
answer = team.answers.first() answer = team.answers.first()
@ -255,7 +260,8 @@ class CustomerProjectCreateView(BaseMixin, View):
return render(request, self.template_name, context) return render(request, self.template_name, context)
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
form = self.form_class(request.POST, request=request) # Passing `request.FILES` seems unnecessary here. Files are added manually below form = self.form_class(request.POST,
request=request) # Passing `request.FILES` seems unnecessary here. Files are added manually below
form.is_valid() form.is_valid()
realty = form.cleaned_data.get('realty') realty = form.cleaned_data.get('realty')
@ -350,7 +356,8 @@ class CustomerProjectEditView(BaseMixin, View):
if form.is_valid() and realty_form.is_valid(): if form.is_valid() and realty_form.is_valid():
project = form.save(commit=False) project = form.save(commit=False)
project.customer = request.user project.customer = request.user
project.files = form.cleaned_data.get('files') # TODO: Should we somehow get rid of this explicit assignment? project.files = form.cleaned_data.get(
'files') # TODO: Should we somehow get rid of this explicit assignment?
project.save() project.save()
form.save_m2m() form.save_m2m()
@ -405,6 +412,7 @@ class ContractorPortfolioTrashView(View):
redirect_to = request.POST.get('next') redirect_to = request.POST.get('next')
return redirect(redirect_to) return redirect(redirect_to)
class CustomerProjectTrashView(View): class CustomerProjectTrashView(View):
form_class = CustomerProjectTrashForm form_class = CustomerProjectTrashForm
@ -495,6 +503,22 @@ def add_candidate(request, answer_id, project_id):
return HttpResponseRedirect(reverse('projects:detail', args=[project_id])) return HttpResponseRedirect(reverse('projects:detail', args=[project_id]))
def sort_candidates(request):
if request.is_ajax():
items = request.POST.getlist('items[]')
i = 1
for item in items:
candidate = Candidate.objects.get(pk=item)
candidate.position = i
candidate.save()
i += 1
data = {
'success': 'ok',
}
return HttpResponse(json.dumps(data), content_type='application/json')
class OfferOrderView(View): class OfferOrderView(View):
template_name = 'chattest.html' template_name = 'chattest.html'
@ -536,9 +560,10 @@ class ContractorPortfolioUpdateView(UpdateView):
from django.views.generic import DeleteView from django.views.generic import DeleteView
class PortfolioDelete(DeleteView): class PortfolioDelete(DeleteView):
model = Portfolio model = Portfolio
success_url = reverse_lazy('users:contractor-profile') success_url = reverse_lazy('users:contractor-profile')
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))

@ -201,13 +201,14 @@
{% for ws in user.work_sell.all %} {% for ws in user.work_sell.all %}
<div class="col-lg-4"> <div class="col-lg-4">
<div class="insetCol box-sizing disTab"> <div class="insetCol box-sizing disTab">
<a href="{% url 'work_sell:detail' ws.pk %}">
{% thumbnail ws.get_cover "224x224" crop="center" as im %} {% thumbnail ws.get_cover "224x224" crop="center" as im %}
<div class="imgGal" <div class="imgGal"
style="background:rgba(0, 0, 0, 0) url('{{ im.url }}') no-repeat scroll center center / cover ;"> style="background:rgba(0, 0, 0, 0) url('{{ im.url }}') no-repeat scroll center center / cover ;">
<div class="imgFigure"></div> <div class="imgFigure"></div>
</div> </div>
{% endthumbnail %} {% endthumbnail %}
</a>
<div class="cenaImg box-sizing"> <div class="cenaImg box-sizing">
<div class="cenaImgInset"> <div class="cenaImgInset">

@ -83,9 +83,10 @@
{{ form.building_classification}} {{ form.building_classification}}
</div> </div>
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="polsF1 polsF2 disTab">
<input type="file" name="{{ form.img.html_name }}" > {% form.ins %}
</div> </div>
<div class="searchF1 polsF1 polsFF links-filter"> <div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Сохранить проект"> <input class="btn-submit-link" type="submit" value="Сохранить проект">
</div> </div>

Loading…
Cancel
Save