#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,
DocumentViewSet,
ReviewViewSet,
ContractorResumeViewSet,
ContractorResumeFilesViewSet,
)
@ -20,6 +22,8 @@ router.register(r'locations', LocationViewSet)
router.register(r'projects', ProjectViewSet)
router.register(r'stages', StageViewSet)
router.register(r'reviews', ReviewViewSet)
router.register(r'contractorresume', ContractorResumeViewSet)
router.register(r'contractorresumefiles', ContractorResumeFilesViewSet)
router.register(r'documents', DocumentViewSet)
router.register(r'realties', RealtyViewSet)
router.register(r'specializations', SpecializationViewSet)

@ -10,9 +10,9 @@ from specializations.models import Specialization
from specializations.serializers import SpecializationSerializer
from specializations.filters import SpecializationFilterSet
from users.models import User
from users.serializers import UserSerializer
from users.filters import UserFilterSet
from users.models import User, ContractorResumeFiles, ContractorResume
from users.serializers import UserSerializer, ContractorResumeFilesSerializer, ContractorResumeSerializer
from users.filters import UserFilterSet, ContractorResumeFilesFilterSet, ContractorResumeFilterSet
from common.models import Location
from common.serializers import LocationSerializer
@ -27,6 +27,20 @@ from reviews.serializers import ReviewSerializer
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):
queryset = Stage.objects.all()
serializer_class = StageSerializer

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

@ -2,10 +2,12 @@ from django.conf import urls
from .views import (
PrintDocumentCreate,
PrintOrderDetailView,
)
app_name = 'common'
urlpatterns = [
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.core.mail import send_mail, EmailMultiAlternatives
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 .forms import PrintOrderForm
from .models import PrintDocuments, PrintOrder, Settings
class PrintOrderDetailView(DetailView):
model = PrintOrder
template_name = 'printorder_detail.html'
class PrintDocumentCreate(BaseMixin, View):
form_class = PrintOrderForm
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.save()
print_documents = PrintDocuments.objects.all()
print_documents = print_order.print_documents.all()
limit_size = 10 * 1024 * 1024
attachments = []
link_files = []
@ -57,7 +62,7 @@ class PrintDocumentCreate(BaseMixin, View):
msg.send()
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()))
else:
context = self.get_context_data(**kwargs)

@ -57,7 +57,7 @@
</div>
<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">
</a>
</div>

@ -1,5 +1,6 @@
from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter
from .models import User, Team
from .models import User, Team, ContractorResumeFiles, ContractorResume
class UserFilterSet(FilterSet):
id = AllLookupsFilter()
@ -19,6 +20,24 @@ class TeamFilterSet(FilterSet):
name = AllLookupsFilter()
owner = RelatedFilter('users.filters.UserFilterSet')
class Meta:
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 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 projects.models import Project, Realty, BuildingClassfication, ConstructionType
from specializations.models import Specialization
@ -26,6 +26,18 @@ class ContractorResumeForm(forms.ModelForm):
'text',
)
class ContractorResumeFilesForm(forms.ModelForm):
class Meta:
model = ContractorResumeFiles
fields = (
'type',
'resume',
)
class UserProfileEditForm(forms.ModelForm):
gender = forms.ChoiceField(
choices=GENDERS,

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

@ -1,21 +1,30 @@
from django.shortcuts import redirect, render_to_response
from social.pipeline.partial import partial
from django.contrib.auth.models import Group
from users.models import ContractorResume
@partial
def test_contractor(backend, details, response, is_new=False, *args, **kwargs):
import code; code.interact(local=dict(globals(), **locals()))
def test_contractor(backend, details, response, user,is_new=False, *args, **kwargs):
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
def add_email_for_user(backend, details, response, is_new=False, *args, **kwargs):
data = backend.strategy.request_data()
# import code; code.interact(local=dict(globals(), **locals()))
if not details.get('email'):
if 'email' in kwargs['request']:
return {'email': kwargs['request']['email']}
else:
return render_to_response('add_email_form.html')
if is_new:
if not details.get('email'):
if 'email' in kwargs['request']:
return {'email': kwargs['request']['email']}
else:
return render_to_response('add_email_form.html')
@partial
def require_email(strategy, details, user=None, is_new=False, *args, **kwargs):
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
else:
return redirect('require_email')

@ -1,11 +1,36 @@
from rest_framework.serializers import ModelSerializer
from .models import User, Team
from .models import User, Team, ContractorResumeFiles, ContractorResume
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:
model = Team
@ -17,8 +42,8 @@ class TeamSerializer(ModelSerializer):
'users',
)
class UserSerializer(ModelSerializer):
class UserSerializer(ModelSerializer):
class Meta:
model = User
@ -49,19 +74,18 @@ class UserSerializer(ModelSerializer):
# 'is_admin',
# )
# def create(self, 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 create(self, 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
# import code; code.interact(local=dict(globals(), **locals()))

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

@ -313,7 +313,6 @@
</button>
<h4 class="modal-title">Редактировать текст резюме</h4>
</div>
<div class="modal-body">
<div style="height: 180px;">
<form id="resume-edit-form">
@ -334,7 +333,7 @@
</div>
<!-- Конец блока (resume-modal)-->
<div class="gal-pluss">
<div class="gal-pluss" id="diplom-cro-gallery">
<div class="inset-gp">
<p class="title-gp">Дипломы / Сертификаты</p>
<div class="upload2 up-l3">
@ -358,8 +357,8 @@
{{ diplom.title }}
</p>
<div class="buttonsImg" distab="">
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
<div class="insetBI insetBI2 delete-resume-file" data-id="{{ diplom.pk }}">
<i class="fa fa-times"></i>
</div>
</div>
</div>
@ -392,7 +391,7 @@
{{ cro.title }}
</p>
<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>
</div>
</div>
@ -447,6 +446,8 @@
<script type="text/javascript">
var userId = '{{ contractor.pk }}';
$(function () {
$('#resume-edit-form').on('submit', function (e) {
e.preventDefault();
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) {
e.preventDefault();
var dataSerializer = $(this).serialize();
@ -597,6 +620,35 @@
.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({
url: url,
crossDomain: false,
@ -611,14 +663,8 @@
},
dataType: 'json',
done: function (e, data) {
;
$.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> ' +
'<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");
add_resume_file('diplom', file.url,file.id, '#diplom-gallery');
});
},
progressall: function (e, data) {
@ -645,14 +691,8 @@
},
dataType: 'json',
done: function (e, data) {
;
$.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> ' +
'<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");
add_resume_file('cro', file.url, file.id,'#cro-gallery');
});
},
progressall: function (e, data) {

@ -16,6 +16,7 @@ from .views import (
UserProfileEditView,
TeamCreateView,
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/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'^contractor-office/(?P<pk>\d+)/$', ContractorOfficeDetailView.as_view(), name='contractor-office'),

@ -1,9 +1,9 @@
from django.conf import settings
from django.contrib import messages
from django.views.generic import UpdateView
from .models import ContractorResume
from .forms import ContractorResumeForm
from django.http import JsonResponse
from .models import ContractorResume, ContractorResumeFiles
from django.http import JsonResponse, Http404
from django.core.files.base import ContentFile
from django.core.mail import send_mail
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
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 pprint import pprint, pformat
import itertools
import json
import natsort
import pydash as _; _.map = _.map_; _.filter = _.filter_
from .mixins import CheckForUserMixin
from .models import User, Team, UserFinancialInfo
from .forms import TeamForm
from .forms import TeamForm, ContractorResumeFilesForm, ContractorResumeForm
from archilance import util
from archilance.mixins import BaseMixin
from projects.forms import PortfolioForm
@ -26,7 +27,7 @@ from projects.models import Project, Portfolio
from reviews.models import Review
from specializations.models import Specialization
from work_sell.forms import WorkSellForm
from work_sell.models import WorkSell
from work_sell.models import WorkSell, Picture
from .forms import (
ContractorFilterForm,
@ -522,6 +523,51 @@ class ContractorResumeUpdateView(UpdateView):
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):
template_name = 'customer_profile_reviews.html'

@ -2,6 +2,7 @@ from mptt.models import TreeForeignKey
from sorl.thumbnail import ImageField
from django.db import models
from django.utils import timezone
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)
construction_type = models.ForeignKey(ConstructionType, related_name='worksells', 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)
description = models.TextField(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):
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):
photo = self.photos.first()
return photo and photo.img

@ -7,12 +7,18 @@
<div class="row">
<div class="col-lg-12 allProjects">
<p class="titleScore">{{ object }}</p>
{% if object.get_prev %}
<div class="all all1">
<p>предыдущий</p>
<p><a href="{% url 'work_sell:detail' object.get_prev.pk %}"> предыдущий</a></p>
</div>
{% endif %}
{% if object.get_next %}
<div class="all all2">
<p>следующий</p>
<p><a href="{% url 'work_sell:detail' object.get_next.pk %}">следующий</a></p>
</div>
{% endif %}
</div>
<div class="btnReadyBlock disTab">
<div class="triangle1"></div>
@ -93,11 +99,11 @@
<div class="gallMini disTab">
{% for worksell in worksell_related %}
{% for worksell in worksell_related %}
<div class="col-lg-3">
<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="imgFigure"></div>
</div>

@ -69,7 +69,7 @@ class WorkSellDetail(DetailView):
def get_context_data(self, **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

Loading…
Cancel
Save