#ARC-23 Fixes bugs

remotes/origin/setup
Mukhtar 10 years ago
parent 45b607b256
commit eea72e96a3
  1. 4
      api/urls.py
  2. 20
      api/views.py
  3. 2
      archilance/settings/base.py
  4. 1
      common/templates/printorder_detail.html
  5. 2
      common/urls.py
  6. 11
      common/views.py
  7. 2
      templates/registration/registration_form.html
  8. 23
      users/filters.py
  9. 14
      users/forms.py
  10. 4
      users/models.py
  11. 30
      users/pipeline.py
  12. 56
      users/serializers.py
  13. 21
      users/templates/add_email_form.html
  14. 78
      users/templates/contractor_profile.html
  15. 2
      users/urls.py
  16. 56
      users/views.py
  17. 15
      work_sell/models.py
  18. 14
      work_sell/templates/worksell_detail.html
  19. 2
      work_sell/views.py

@ -11,6 +11,8 @@ from .views import (
NoteViewSet, NoteViewSet,
DocumentViewSet, DocumentViewSet,
ReviewViewSet, ReviewViewSet,
ContractorResumeViewSet,
ContractorResumeFilesViewSet,
) )
@ -20,6 +22,8 @@ router.register(r'locations', LocationViewSet)
router.register(r'projects', ProjectViewSet) router.register(r'projects', ProjectViewSet)
router.register(r'stages', StageViewSet) router.register(r'stages', StageViewSet)
router.register(r'reviews', ReviewViewSet) router.register(r'reviews', ReviewViewSet)
router.register(r'contractorresume', ContractorResumeViewSet)
router.register(r'contractorresumefiles', ContractorResumeFilesViewSet)
router.register(r'documents', DocumentViewSet) router.register(r'documents', DocumentViewSet)
router.register(r'realties', RealtyViewSet) router.register(r'realties', RealtyViewSet)
router.register(r'specializations', SpecializationViewSet) router.register(r'specializations', SpecializationViewSet)

@ -10,9 +10,9 @@ from specializations.models import Specialization
from specializations.serializers import SpecializationSerializer from specializations.serializers import SpecializationSerializer
from specializations.filters import SpecializationFilterSet from specializations.filters import SpecializationFilterSet
from users.models import User from users.models import User, ContractorResumeFiles, ContractorResume
from users.serializers import UserSerializer from users.serializers import UserSerializer, ContractorResumeFilesSerializer, ContractorResumeSerializer
from users.filters import UserFilterSet from users.filters import UserFilterSet, ContractorResumeFilesFilterSet, ContractorResumeFilterSet
from common.models import Location from common.models import Location
from common.serializers import LocationSerializer from common.serializers import LocationSerializer
@ -27,6 +27,20 @@ from reviews.serializers import ReviewSerializer
from reviews.filters import ReviewFilterSet from reviews.filters import ReviewFilterSet
class ContractorResumeFilesViewSet(ModelViewSet):
queryset = ContractorResumeFiles.objects.all()
serializer_class = ContractorResumeFilesSerializer
# filter_class = ContractorResumeFilesFilterSet
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class ContractorResumeViewSet(ModelViewSet):
queryset = ContractorResume.objects.all()
serializer_class = ContractorResumeSerializer
# filter_class = ContractorResumeFilterSet
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
class StageViewSet(ModelViewSet): class StageViewSet(ModelViewSet):
queryset = Stage.objects.all() queryset = Stage.objects.all()
serializer_class = StageSerializer serializer_class = StageSerializer

@ -183,12 +183,12 @@ SOCIAL_AUTH_PIPELINE = (
'social.pipeline.social_auth.social_user', 'social.pipeline.social_auth.social_user',
'social.pipeline.user.get_username', 'social.pipeline.user.get_username',
'users.pipeline.add_email_for_user', 'users.pipeline.add_email_for_user',
# 'users.pipeline.test_contractor',
'social.pipeline.mail.mail_validation', 'social.pipeline.mail.mail_validation',
'social.pipeline.user.create_user', 'social.pipeline.user.create_user',
'social.pipeline.social_auth.associate_user', 'social.pipeline.social_auth.associate_user',
'social.pipeline.social_auth.load_extra_data', 'social.pipeline.social_auth.load_extra_data',
'social.pipeline.user.user_details', 'social.pipeline.user.user_details',
'users.pipeline.test_contractor',
) )
FIELDS_STORED_IN_SESSION = ['user_type'] FIELDS_STORED_IN_SESSION = ['user_type']

@ -2,10 +2,12 @@ from django.conf import urls
from .views import ( from .views import (
PrintDocumentCreate, PrintDocumentCreate,
PrintOrderDetailView,
) )
app_name = 'common' app_name = 'common'
urlpatterns = [ urlpatterns = [
urls.url(r'^printdocument/create/$', PrintDocumentCreate.as_view(), name='create'), urls.url(r'^printdocument/create/$', PrintDocumentCreate.as_view(), name='create'),
urls.url(r'^printorder/(?P<pk>\d+)/$', PrintOrderDetailView.as_view(), name='print-order-detail'),
] ]

@ -2,13 +2,18 @@ from django.shortcuts import render, redirect
from django.contrib import messages from django.contrib import messages
from django.core.mail import send_mail, EmailMultiAlternatives from django.core.mail import send_mail, EmailMultiAlternatives
from django.template.loader import get_template, render_to_string from django.template.loader import get_template, render_to_string
from django.views.generic import View from django.views.generic import View, DetailView
from archilance.mixins import BaseMixin from archilance.mixins import BaseMixin
from .forms import PrintOrderForm from .forms import PrintOrderForm
from .models import PrintDocuments, PrintOrder, Settings from .models import PrintDocuments, PrintOrder, Settings
class PrintOrderDetailView(DetailView):
model = PrintOrder
template_name = 'printorder_detail.html'
class PrintDocumentCreate(BaseMixin, View): class PrintDocumentCreate(BaseMixin, View):
form_class = PrintOrderForm form_class = PrintOrderForm
template_name = 'printdocument_create.html' template_name = 'printdocument_create.html'
@ -27,7 +32,7 @@ class PrintDocumentCreate(BaseMixin, View):
print_doc = PrintDocuments.objects.create(file=file, printorder=print_order) print_doc = PrintDocuments.objects.create(file=file, printorder=print_order)
print_doc.save() print_doc.save()
print_documents = PrintDocuments.objects.all() print_documents = print_order.print_documents.all()
limit_size = 10 * 1024 * 1024 limit_size = 10 * 1024 * 1024
attachments = [] attachments = []
link_files = [] link_files = []
@ -57,7 +62,7 @@ class PrintDocumentCreate(BaseMixin, View):
msg.send() msg.send()
messages.info(request, 'Заявка на распечатку принята') messages.info(request, 'Заявка на распечатку принята')
return redirect('common:create') return redirect('common:print-order-detail',pk=print_order.pk)
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))
else: else:
context = self.get_context_data(**kwargs) context = self.get_context_data(**kwargs)

@ -57,7 +57,7 @@
</div> </div>
<div class="pull-left -social -tw"> <div class="pull-left -social -tw">
<a href="{% url 'social:begin' 'twitter' %}"> <a href="{% url 'social:begin' 'twitter' %}?user_type=contractor">
<img src="http://nepesh.com/static/img/social/tw.png" alt="tw"> <img src="http://nepesh.com/static/img/social/tw.png" alt="tw">
</a> </a>
</div> </div>

@ -1,5 +1,6 @@
from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter
from .models import User, Team from .models import User, Team, ContractorResumeFiles, ContractorResume
class UserFilterSet(FilterSet): class UserFilterSet(FilterSet):
id = AllLookupsFilter() id = AllLookupsFilter()
@ -19,6 +20,24 @@ class TeamFilterSet(FilterSet):
name = AllLookupsFilter() name = AllLookupsFilter()
owner = RelatedFilter('users.filters.UserFilterSet') owner = RelatedFilter('users.filters.UserFilterSet')
class Meta: class Meta:
model = Team model = Team
class ContractorResumeFilterSet(FilterSet):
id = AllLookupsFilter()
text = AllLookupsFilter()
resume_file = AllLookupsFilter()
class Meta:
model = ContractorResume
class ContractorResumeFilesFilterSet(FilterSet):
id = AllLookupsFilter()
title = AllLookupsFilter()
img = AllLookupsFilter()
resume = RelatedFilter('users.filters.ContractorResumeFilterSet')
class Meta:
model = ContractorResumeFiles

@ -2,7 +2,7 @@ from django import forms
import itertools import itertools
import pydash as _; _.map = _.map_; _.filter = _.filter_ import pydash as _; _.map = _.map_; _.filter = _.filter_
from .models import User, UserFinancialInfo, Team, ContractorResume, GENDERS from .models import User, UserFinancialInfo, Team, ContractorResume, ContractorResumeFiles, GENDERS
from common.models import Location from common.models import Location
from projects.models import Project, Realty, BuildingClassfication, ConstructionType from projects.models import Project, Realty, BuildingClassfication, ConstructionType
from specializations.models import Specialization from specializations.models import Specialization
@ -26,6 +26,18 @@ class ContractorResumeForm(forms.ModelForm):
'text', 'text',
) )
class ContractorResumeFilesForm(forms.ModelForm):
class Meta:
model = ContractorResumeFiles
fields = (
'type',
'resume',
)
class UserProfileEditForm(forms.ModelForm): class UserProfileEditForm(forms.ModelForm):
gender = forms.ChoiceField( gender = forms.ChoiceField(
choices=GENDERS, choices=GENDERS,

@ -101,8 +101,8 @@ class ContractorResumeFiles(models.Model):
description = models.TextField(blank=True) description = models.TextField(blank=True)
img = models.ImageField(upload_to='users/resume/images/') img = models.ImageField(upload_to='users/resume/images/')
resume = models.ForeignKey(ContractorResume, related_name='resume_files') resume = models.ForeignKey(ContractorResume, related_name='resume_files')
title = models.CharField(max_length=255) title = models.CharField(max_length=255,blank=True)
type = models.CharField(max_length=50, choices=RESUME_TYPE_FILES) type = models.CharField(max_length=50, choices=RESUME_TYPE_FILES, default='diplom')
def __str__(self): def __str__(self):
return self.title return self.title

@ -1,21 +1,30 @@
from django.shortcuts import redirect, render_to_response from django.shortcuts import redirect, render_to_response
from social.pipeline.partial import partial from social.pipeline.partial import partial
from django.contrib.auth.models import Group
from users.models import ContractorResume
@partial @partial
def test_contractor(backend, details, response, is_new=False, *args, **kwargs): def test_contractor(backend, details, response, user,is_new=False, *args, **kwargs):
import code; code.interact(local=dict(globals(), **locals())) if is_new:
group_name = 'Исполнители'
g = Group.objects.get(name=group_name)
g.user_set.add(user)
if group_name == 'Исполнители':
resume = ContractorResume.objects.create(text='Здесь должна быть описание вашего резюме')
user.contractor_resume = resume
user.save()
@partial @partial
def add_email_for_user(backend, details, response, is_new=False, *args, **kwargs): def add_email_for_user(backend, details, response, is_new=False, *args, **kwargs):
data = backend.strategy.request_data() data = backend.strategy.request_data()
# import code; code.interact(local=dict(globals(), **locals())) if is_new:
if not details.get('email'): if not details.get('email'):
if 'email' in kwargs['request']: if 'email' in kwargs['request']:
return {'email': kwargs['request']['email']} return {'email': kwargs['request']['email']}
else: else:
return render_to_response('add_email_form.html') return render_to_response('add_email_form.html')
@partial @partial
def require_email(strategy, details, user=None, is_new=False, *args, **kwargs): def require_email(strategy, details, user=None, is_new=False, *args, **kwargs):
if kwargs.get('ajax') or user and user.email: if kwargs.get('ajax') or user and user.email:
@ -26,3 +35,4 @@ def require_email(strategy, details, user=None, is_new=False, *args, **kwargs):
details['email'] = email details['email'] = email
else: else:
return redirect('require_email') return redirect('require_email')

@ -1,11 +1,36 @@
from rest_framework.serializers import ModelSerializer from rest_framework.serializers import ModelSerializer
from .models import User, Team from .models import User, Team, ContractorResumeFiles, ContractorResume
from projects.models import Project from projects.models import Project
class TeamSerializer(ModelSerializer): class ContractorResumeSerializer(ModelSerializer):
class Meta:
model = ContractorResume
fields = (
'id',
'resume_file',
'text',
)
class ContractorResumeFilesSerializer(ModelSerializer):
class Meta:
model = ContractorResumeFiles
fields = (
'id',
'description',
'img',
'resume',
'title',
'type',
'resume',
)
class TeamSerializer(ModelSerializer):
class Meta: class Meta:
model = Team model = Team
@ -17,8 +42,8 @@ class TeamSerializer(ModelSerializer):
'users', 'users',
) )
class UserSerializer(ModelSerializer):
class UserSerializer(ModelSerializer):
class Meta: class Meta:
model = User model = User
@ -49,19 +74,18 @@ class UserSerializer(ModelSerializer):
# 'is_admin', # 'is_admin',
# ) # )
# def create(self, validated_data): # def create(self, validated_data):
# return User.objects.create(**validated_data) # return User.objects.create(**validated_data)
# def update(self, inst, validated_data):
# inst.email = validated_data.get('email', inst.email)
# inst.first_name = validated_data.get('first_name', inst.first_name)
# inst.is_active = validated_data.get('is_active', inst.is_active)
# inst.last_name = validated_data.get('last_name', inst.last_name)
# # inst.projects = validated_data.get('projects', inst.projects)
#
# inst.save()
#
# return inst
# def update(self, inst, validated_data):
# inst.email = validated_data.get('email', inst.email)
# inst.first_name = validated_data.get('first_name', inst.first_name)
# inst.is_active = validated_data.get('is_active', inst.is_active)
# inst.last_name = validated_data.get('last_name', inst.last_name)
# # inst.projects = validated_data.get('projects', inst.projects)
#
# inst.save()
#
# return inst
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))

@ -1,9 +1,20 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% block content %} {% block content %}
<h1>Введите свой email</h1> {% include 'partials/header.html' %}
<form method="post"> <div class="container mainScore">
<input type="email" name="email"> <div class="row">
<input type="submit" value="Send"> <div class="col-lg-12">
</form> <p class="titleScore">Введите свой email</p>
</div>
<div class="form-regestration">
<form method="post">
<input type="email" name="email">
<input type="submit" value="Send">
</form>
</div>
{% include 'partials/footer.html' %}
</div>
</div>
{% endblock %} {% endblock %}

@ -313,7 +313,6 @@
</button> </button>
<h4 class="modal-title">Редактировать текст резюме</h4> <h4 class="modal-title">Редактировать текст резюме</h4>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<div style="height: 180px;"> <div style="height: 180px;">
<form id="resume-edit-form"> <form id="resume-edit-form">
@ -334,7 +333,7 @@
</div> </div>
<!-- Конец блока (resume-modal)--> <!-- Конец блока (resume-modal)-->
<div class="gal-pluss"> <div class="gal-pluss" id="diplom-cro-gallery">
<div class="inset-gp"> <div class="inset-gp">
<p class="title-gp">Дипломы / Сертификаты</p> <p class="title-gp">Дипломы / Сертификаты</p>
<div class="upload2 up-l3"> <div class="upload2 up-l3">
@ -358,8 +357,8 @@
{{ diplom.title }} {{ diplom.title }}
</p> </p>
<div class="buttonsImg" distab=""> <div class="buttonsImg" distab="">
<div class="insetBI insetBI2"> <div class="insetBI insetBI2 delete-resume-file" data-id="{{ diplom.pk }}">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
</div> </div>
</div> </div>
</div> </div>
@ -392,7 +391,7 @@
{{ cro.title }} {{ cro.title }}
</p> </p>
<div class="buttonsImg" distab=""> <div class="buttonsImg" distab="">
<div class="insetBI insetBI2"> <div class="insetBI insetBI2 delete-resume-file" data-id="{{ cro.pk }}">
<i class="fa fa-times"></i> <i class="fa fa-times"></i>
</div> </div>
</div> </div>
@ -447,6 +446,8 @@
<script type="text/javascript"> <script type="text/javascript">
var userId = '{{ contractor.pk }}'; var userId = '{{ contractor.pk }}';
$(function () { $(function () {
$('#resume-edit-form').on('submit', function (e) { $('#resume-edit-form').on('submit', function (e) {
e.preventDefault(); e.preventDefault();
var resumeEditUrl = "{% url 'users:contractor-resume-update' contractor.contractor_resume.pk %}"; var resumeEditUrl = "{% url 'users:contractor-resume-update' contractor.contractor_resume.pk %}";
@ -477,6 +478,28 @@
}); });
$("#diplom-cro-gallery").on('click', '.delete-resume-file',function(e){
e.preventDefault();
var _this = $(this);
var deleteResumeUrl = '/api/contractorresumefiles/' + $(this).attr('data-id') + '/';
$.ajax({
url:deleteResumeUrl,
type: 'DELETE',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
success: function(json){
_this.parent().parent().parent().remove();
console.log(json);
},
error: function(jqXHR, e){
console.log(jqXHR.statusCode);
}
});
});
$('#worksell-add-form').on('submit', function (e) { $('#worksell-add-form').on('submit', function (e) {
e.preventDefault(); e.preventDefault();
var dataSerializer = $(this).serialize(); var dataSerializer = $(this).serialize();
@ -597,6 +620,35 @@
.parent().addClass($.support.fileInput ? undefined : 'disabled'); .parent().addClass($.support.fileInput ? undefined : 'disabled');
function add_resume_file(resumeType, imgUrl,imgPk, galleryId){
$.ajax({
url: '/users/contractorsresumefiles/create/',
method: 'POST',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'))
},
data: 'type='+ resumeType+'&img_id=' + imgPk + '&resume={{ contractor.contractor_resume.pk }}',
dataType: 'json',
success: function (data) {
if (data.status == 'ok') {
var htmlImg = '<div class="col-lg-4"><div class="insetCol box-sizing disTab"><div class="imgGal" style="background: url(' + imgUrl +') no-repeat center;"><div class="imgFigure"></div></div></div> ' +
'<div class="insetCol2 box-sizing disTab"><div class="buttonsImg" distab="">' +
'<div class="insetBI insetBI2 delete-resume-file" data-id="' + data.pk +'"><i class="fa fa-times"></i></div></div></div></div>';
var img = $(htmlImg).appendTo(galleryId);
} else if (data.status == 'no') {
$.each(data.form_errors, function (k, v) {
$('.error-' + k).html(v).show();
});
}
},
error: function (jqXHR, exception) {
console.log(jqXHR);
console.log(jqXHR.statusCode);
}
});
}
$('#diplom-upload').fileupload({ $('#diplom-upload').fileupload({
url: url, url: url,
crossDomain: false, crossDomain: false,
@ -611,14 +663,8 @@
}, },
dataType: 'json', dataType: 'json',
done: function (e, data) { done: function (e, data) {
;
$.each(data.result.files, function (index, file) { $.each(data.result.files, function (index, file) {
var htmlImg = '<div class="col-lg-4"><div class="insetCol box-sizing disTab"><div class="imgGal" style="background: url(+ file.url +) no-repeat center;"><div class="imgFigure"></div></div></div> ' + add_resume_file('diplom', file.url,file.id, '#diplom-gallery');
'<div class="insetCol2 box-sizing disTab"><p>Название</p><div class="buttonsImg" distab="">' +
'<div class="insetBI insetBI2"><i class="fa fa-times"></i></div></div></div></div>';
var img = $(htmlImg).appendTo("#diplom-gallery");
}); });
}, },
progressall: function (e, data) { progressall: function (e, data) {
@ -645,14 +691,8 @@
}, },
dataType: 'json', dataType: 'json',
done: function (e, data) { done: function (e, data) {
;
$.each(data.result.files, function (index, file) { $.each(data.result.files, function (index, file) {
var htmlImg = '<div class="col-lg-4"><div class="insetCol box-sizing disTab"><div class="imgGal" style="background: url(+ file.url +) no-repeat center;"><div class="imgFigure"></div></div></div> ' + add_resume_file('cro', file.url, file.id,'#cro-gallery');
'<div class="insetCol2 box-sizing disTab"><p>Название</p><div class="buttonsImg" distab="">' +
'<div class="insetBI insetBI2"><i class="fa fa-times"></i></div></div></div></div>';
var img = $(htmlImg).appendTo("#cro-gallery");
}); });
}, },
progressall: function (e, data) { progressall: function (e, data) {

@ -16,6 +16,7 @@ from .views import (
UserProfileEditView, UserProfileEditView,
TeamCreateView, TeamCreateView,
ContractorResumeUpdateView, ContractorResumeUpdateView,
contractor_resumefile_create,
) )
@ -36,6 +37,7 @@ urlpatterns = [
urls.url(r'^contractors/resume/(?P<pk>\d+)/edit/$', ContractorResumeUpdateView.as_view(), name='contractor-resume-update'), urls.url(r'^contractors/resume/(?P<pk>\d+)/edit/$', ContractorResumeUpdateView.as_view(), name='contractor-resume-update'),
urls.url(r'^contractors/team/create/$', TeamCreateView.as_view(), name='team-create'), urls.url(r'^contractors/team/create/$', TeamCreateView.as_view(), name='team-create'),
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'^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+)/$', ContractorOfficeDetailView.as_view(), name='contractor-office'),

@ -1,9 +1,9 @@
from django.conf import settings from django.conf import settings
from django.contrib import messages from django.contrib import messages
from django.views.generic import UpdateView from django.views.generic import UpdateView
from .models import ContractorResume from .models import ContractorResume, ContractorResumeFiles
from .forms import ContractorResumeForm from django.http import JsonResponse, Http404
from django.http import JsonResponse 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
@ -13,12 +13,13 @@ 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 pprint import pprint, pformat from pprint import pprint, pformat
import itertools import itertools
import json
import natsort 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
from .forms import TeamForm from .forms import TeamForm, ContractorResumeFilesForm, ContractorResumeForm
from archilance import util from archilance import util
from archilance.mixins import BaseMixin from archilance.mixins import BaseMixin
from projects.forms import PortfolioForm from projects.forms import PortfolioForm
@ -26,7 +27,7 @@ from projects.models import Project, Portfolio
from reviews.models import Review from reviews.models import Review
from specializations.models import Specialization from specializations.models import Specialization
from work_sell.forms import WorkSellForm from work_sell.forms import WorkSellForm
from work_sell.models import WorkSell from work_sell.models import WorkSell, Picture
from .forms import ( from .forms import (
ContractorFilterForm, ContractorFilterForm,
@ -522,6 +523,51 @@ class ContractorResumeUpdateView(UpdateView):
return super().form_invalid(form) return super().form_invalid(form)
class ContractorResumeFileCreateView(CreateView):
model = ContractorResumeFiles
form_class = ContractorResumeFilesForm
def form_valid(self, request, form):
if self.request.is_ajax():
img_id = request.POST.get('img_id')
picture = Picture.objects.get(pk=img_id)
temp_file = ContentFile(picture.file.read())
temp_file.name = picture.file.name
instance = form.save(commit=False)
instance.img = temp_file
instance.save()
data = {
'pk': instance.pk,
'status': 'ok',
}
return JsonResponse(data)
return super().form_valid(form)
def form_invalid(self, form):
if self.request.is_ajax():
return JsonResponse(form.errors, status=400)
return super().form_invalid(form)
def contractor_resumefile_create(request):
if request.is_ajax():
form = ContractorResumeFilesForm(data=request.POST)
# import code; code.interact(local=dict(globals(), **locals()))
if form.is_valid():
# import code; code.interact(local=dict(globals(), **locals()))
img_id = request.POST.get('img_id')
picture = Picture.objects.get(pk=img_id)
temp_file = ContentFile(picture.file.read())
temp_file.name = picture.file.name
instance = form.save(commit=False)
instance.img = temp_file
instance.save()
data = {'status': 'ok', 'pk': instance.pk}
else:
data = {'status': 'no', 'form_errors': form.errors}
return HttpResponse(json.dumps(data), content_type='application/json')
else:
raise Http404
class CustomerProfileReviewsView(BaseMixin, View): class CustomerProfileReviewsView(BaseMixin, View):
template_name = 'customer_profile_reviews.html' template_name = 'customer_profile_reviews.html'

@ -2,6 +2,7 @@ from mptt.models import TreeForeignKey
from sorl.thumbnail import ImageField from sorl.thumbnail import ImageField
from django.db import models from django.db import models
from django.utils import timezone from django.utils import timezone
from users.models import User, Team from users.models import User, Team
@ -14,7 +15,7 @@ class WorkSell(models.Model):
building_classification = models.ForeignKey(BuildingClassfication, related_name='worksells', null=True, blank=True) building_classification = models.ForeignKey(BuildingClassfication, related_name='worksells', null=True, blank=True)
construction_type = models.ForeignKey(ConstructionType, related_name='worksells', null=True, blank=True) construction_type = models.ForeignKey(ConstructionType, related_name='worksells', null=True, blank=True)
contractor = models.ForeignKey(User, related_name='work_sell', null=True, blank=True) contractor = models.ForeignKey(User, related_name='work_sell', null=True, blank=True)
created = models.DateTimeField(default=timezone.now, null=True, blank=True) created = models.DateTimeField(default=timezone.now)
currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES, null=True, blank=True) currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES, null=True, blank=True)
description = models.TextField(blank=True) description = models.TextField(blank=True)
img = ImageField(upload_to='worksell/worksell', null=True, blank=True) img = ImageField(upload_to='worksell/worksell', null=True, blank=True)
@ -31,6 +32,18 @@ class WorkSell(models.Model):
def is_author_for_work(self): def is_author_for_work(self):
pass pass
def get_prev(self):
try:
return self.get_previous_by_created()
except self.DoesNotExist:
return None
def get_next(self):
try:
return self.get_next_by_created()
except self.DoesNotExist:
return None
def get_cover(self): def get_cover(self):
photo = self.photos.first() photo = self.photos.first()
return photo and photo.img return photo and photo.img

@ -7,12 +7,18 @@
<div class="row"> <div class="row">
<div class="col-lg-12 allProjects"> <div class="col-lg-12 allProjects">
<p class="titleScore">{{ object }}</p> <p class="titleScore">{{ object }}</p>
{% if object.get_prev %}
<div class="all all1"> <div class="all all1">
<p>предыдущий</p> <p><a href="{% url 'work_sell:detail' object.get_prev.pk %}"> предыдущий</a></p>
</div> </div>
{% endif %}
{% if object.get_next %}
<div class="all all2"> <div class="all all2">
<p>следующий</p> <p><a href="{% url 'work_sell:detail' object.get_next.pk %}">следующий</a></p>
</div> </div>
{% endif %}
</div> </div>
<div class="btnReadyBlock disTab"> <div class="btnReadyBlock disTab">
<div class="triangle1"></div> <div class="triangle1"></div>
@ -93,11 +99,11 @@
<div class="gallMini disTab"> <div class="gallMini disTab">
{% for worksell in worksell_related %} {% for worksell in worksell_related %}
<div class="col-lg-3"> <div class="col-lg-3">
<div class="insetCol box-sizing disTab"> <div class="insetCol box-sizing disTab">
{% thumbnail worksell.img "265x265" crop="center" as im %} {% thumbnail worksell.get_cover "265x265" crop="center" as im %}
<div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;"> <div class="imgGal" style="background: url('{{ im.url }}') no-repeat center;">
<div class="imgFigure"></div> <div class="imgFigure"></div>
</div> </div>

@ -69,7 +69,7 @@ class WorkSellDetail(DetailView):
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['worksell_related'] = WorkSell.objects.all()[:5] context['worksell_related'] = WorkSell.objects.exclude(pk=self.get_object().pk)[:5]
return context return context

Loading…
Cancel
Save