#ARC-5 Add resume files and output in template

remotes/origin/setup
Mukhtar 10 years ago
parent 0d2396c48e
commit 8e0657a011
  1. 2
      archilance/settings/dev.py
  2. 5
      templates/partials/header.html
  3. 4
      users/admin.py
  4. 47
      users/migrations/0020_auto_20160711_1759.py
  5. 22
      users/migrations/0021_contractorresumefiles_resume.py
  6. 33
      users/models.py
  7. 88
      users/templates/contractor_profile.html
  8. 5
      users/templates/contractor_profile_edit.html
  9. 1
      users/templates/customer_profile_edit.html
  10. 3
      work_sell/admin.py
  11. 23
      work_sell/migrations/0011_picture.py
  12. 16
      work_sell/models.py
  13. 19
      work_sell/response.py
  14. 14
      work_sell/serialize.py
  15. 117
      work_sell/templates/picture_basic_form.html
  16. 5
      work_sell/urls.py
  17. 27
      work_sell/views.py

@ -2,7 +2,7 @@ from .base import *
# AUTH_PASSWORD_VALIDATORS = [] # AUTH_PASSWORD_VALIDATORS = []
# INSTALLED_APPS += ['debug_toolbar',] INSTALLED_APPS += ['debug_toolbar',]
try: try:
from .local import * from .local import *

@ -1,4 +1,5 @@
{% load staticfiles %} {% load staticfiles %}
{% load thumbnail %}
<div class="wrTop {% if request.user.is_authenticated %} disTab {% endif %}"> <div class="wrTop {% if request.user.is_authenticated %} disTab {% endif %}">
<div class="container-fluid topMain"> <div class="container-fluid topMain">
<div class="row"> <div class="row">
@ -54,7 +55,9 @@
<div class="imgProfile"> <div class="imgProfile">
{% if request.user.is_contractor %} {% if request.user.is_contractor %}
<a href="{% url 'users:contractor-profile' pk=request.user.pk %}"> <a href="{% url 'users:contractor-profile' pk=request.user.pk %}">
<img src="/media/img/profile.jpg" alt="profile-image"> {% thumbnail request.user.avatar "75x75" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
</a> </a>
{% elif request.user.is_customer %} {% elif request.user.is_customer %}
<a href="{% url 'users:customer-profile-open-projects' pk=request.user.pk %}"> <a href="{% url 'users:customer-profile-open-projects' pk=request.user.pk %}">

@ -1,6 +1,6 @@
from django.contrib import admin from django.contrib import admin
from .models import User, Team, ContractorFinancialInfo from .models import User, Team, ContractorFinancialInfo, ContractorResume, ContractorResumeFiles
class UserAdmin(admin.ModelAdmin): class UserAdmin(admin.ModelAdmin):
@ -13,3 +13,5 @@ class UserAdmin(admin.ModelAdmin):
admin.site.register(User, UserAdmin) admin.site.register(User, UserAdmin)
admin.site.register(ContractorFinancialInfo) admin.site.register(ContractorFinancialInfo)
admin.site.register(Team) admin.site.register(Team)
admin.site.register(ContractorResume)
admin.site.register(ContractorResumeFiles)

@ -0,0 +1,47 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-11 14:59
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0019_auto_20160710_1950'),
]
operations = [
migrations.CreateModel(
name='ContractorResume',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('text', models.TextField()),
('resume_file', models.FileField(upload_to='users/resume/files/')),
],
options={
'verbose_name': 'Резюме',
'verbose_name_plural': 'Резюме',
},
),
migrations.CreateModel(
name='ContractorResumeFiles',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('img', models.ImageField(upload_to='users/resume/images/')),
('title', models.CharField(max_length=255)),
('description', models.TextField(blank=True)),
('type', models.CharField(choices=[('diplom', 'Дипломы/Сертификаты'), ('cro', 'Допуск CPO')], max_length=50)),
],
options={
'verbose_name': 'Файлы резюме',
'verbose_name_plural': 'Файлы резюме',
},
),
migrations.AddField(
model_name='user',
name='contractor_resume',
field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor', to='users.ContractorResume'),
),
]

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-11 16:27
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('users', '0020_auto_20160711_1759'),
]
operations = [
migrations.AddField(
model_name='contractorresumefiles',
name='resume',
field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='resume_files', to='users.ContractorResume'),
preserve_default=False,
),
]

@ -77,6 +77,38 @@ class ContractorFinancialInfo(models.Model):
verbose_name = 'Финансовая информация' verbose_name = 'Финансовая информация'
verbose_name_plural = 'Финансовая информация' verbose_name_plural = 'Финансовая информация'
class ContractorResume(models.Model):
text = models.TextField()
resume_file = models.FileField(upload_to='users/resume/files/')
def __str__(self):
return self.text
class Meta:
verbose_name = 'Резюме'
verbose_name_plural = 'Резюме'
RESUME_TYPE_FILES = (
('diplom', 'Дипломы/Сертификаты'),
('cro', 'Допуск CPO'),
)
class ContractorResumeFiles(models.Model):
img = models.ImageField(upload_to='users/resume/images/')
title = models.CharField(max_length=255)
description = models.TextField(blank=True)
type = models.CharField(max_length=50, choices=RESUME_TYPE_FILES)
resume = models.ForeignKey(ContractorResume, related_name='resume_files')
def __str__(self):
return self.title
class Meta:
verbose_name = 'Файлы резюме'
verbose_name_plural = 'Файлы резюме'
class User(AbstractBaseUser, PermissionsMixin): class User(AbstractBaseUser, PermissionsMixin):
STATUSES = ( STATUSES = (
@ -96,6 +128,7 @@ class User(AbstractBaseUser, PermissionsMixin):
contractor_specializations = TreeManyToManyField(Specialization, related_name='contractors', blank=True) contractor_specializations = TreeManyToManyField(Specialization, related_name='contractors', blank=True)
contractor_status = models.CharField(default='free', max_length=20, choices=STATUSES) contractor_status = models.CharField(default='free', max_length=20, choices=STATUSES)
contractor_financial_info = models.OneToOneField(ContractorFinancialInfo, related_name='contractor',blank=True, null=True) contractor_financial_info = models.OneToOneField(ContractorFinancialInfo, related_name='contractor',blank=True, null=True)
contractor_resume = models.OneToOneField(ContractorResume, related_name='contractor', blank=True, null=True)
location = TreeForeignKey('common.Location', related_name='users', null=True, blank=True) location = TreeForeignKey('common.Location', related_name='users', null=True, blank=True)
skype = models.CharField(max_length=100, blank=True) skype = models.CharField(max_length=100, blank=True)
gender = models.CharField(max_length=30, choices=GENDERS, blank=True) gender = models.CharField(max_length=30, choices=GENDERS, blank=True)

@ -1,7 +1,7 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %} {% load staticfiles %}
{% load thumbnail %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
@ -11,7 +11,9 @@
<div class="col-lg-3 divCol3"> <div class="col-lg-3 divCol3">
<div class="avatar"> <div class="avatar">
<div class="avatarInset"> <div class="avatarInset">
<img src="{% static 'img/profile.jpg' %}" alt="profile-image"> {% thumbnail contractor.avatar "235x224" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
</div> </div>
</div> </div>
<div class="menuUser disTab"> <div class="menuUser disTab">
@ -23,6 +25,18 @@
</a> </a>
<span></span> <span></span>
</li> </li>
<li class="icon_um1">
<a href="{% url 'users:contractor-edit' pk=contractor.pk %}">
редактировать профиль
</a>
<span></span>
</li>
<li class="icon_um1">
<a href="{% url 'users:contractor-edit' pk=contractor.pk %}">
редактировать профиль
</a>
<span></span>
</li>
{% endif %} {% endif %}
{% if contractor.pk != user.id %} {% if contractor.pk != user.id %}
@ -225,22 +239,27 @@
<div class="col-lg-9 resume-block"> <div class="col-lg-9 resume-block">
<div class="block-is box-sizing"> <div class="block-is box-sizing">
<div class="block-i"> <div class="block-i">
<img src="img/profile.jpg" alt="profile-image"> {% thumbnail contractor.avatar "176x160" crop="center" as im %}
<img src="{{ im.url }}" alt="profile-image">
{% endthumbnail %}
</div> </div>
</div> </div>
<div class="col-lg-9"> <div class="col-lg-9">
<div class="top-summary"> <div class="top-summary">
<p class="name-summ">{{ user.get_full_name }}</p> <p class="name-summ">{{ user.get_full_name }}</p>
<a href="javascript:void(0)" class="download-summ">скачать резюме</a> {% if contractor.contractor_resume.resume_file.url %}
<a href="{{ contractor.contractor_resume.resume_file.url }}" class="download-summ">скачать резюме</a>
{% endif %}
<p class="who-summ"> <p class="who-summ">
Мужчина, 24 года, {{ user.date_of_birth }} {# Мужчина, 24 года, {{ user.date_of_birth }}#}
</p> </p>
<div class="list-summ-block"> <div class="list-summ-block">
<div class="col-lg-4"> <div class="col-lg-4">
<ul class="list-summ"> <ul class="list-summ">
<li>brilliantov.me</li> <li>{{ contractor.website }}</li>
<li>alex@brilliantov.me</li> <li>{{ contractor.email }}</li>
<li>+7 968 009 19 99</li> <li>{{ contractor.phone }}</li>
<li>Россия, Москва</li> <li>Россия, Москва</li>
</ul> </ul>
</div> </div>
@ -264,16 +283,7 @@
</div> </div>
<div class="col-lg-12 wr-inset-pluss"> <div class="col-lg-12 wr-inset-pluss">
<div class="pluss-block"> <div class="pluss-block">
<div class="pluss"> {{ contractor.contractor_resume.text }}
<p>Что я умею 1?</p>
<span>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. </span>
</div>
<div class="pluss">
<p>Что я умею 2?</p>
<span>
Lorem ipsum dolor sit amet, consectetur adipisicing elit.</span>
</div>
</div> </div>
<div class="gal-pluss"> <div class="gal-pluss">
<div class="inset-gp"> <div class="inset-gp">
@ -284,6 +294,7 @@
</div> </div>
<div class="galleryWork2 gal-iss disTab"> <div class="galleryWork2 gal-iss disTab">
{% for diplom in contractor.contractor_resume.resume_files.all %}
<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">
@ -292,7 +303,7 @@
</div> </div>
<div class="insetCol2 box-sizing disTab"> <div class="insetCol2 box-sizing disTab">
<p> <p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. {{ diplom.title }}
</p> </p>
<div class="buttonsImg" distab=""> <div class="buttonsImg" distab="">
<div class="insetBI insetBI2"> <div class="insetBI insetBI2">
@ -301,24 +312,8 @@
</div> </div>
</div> </div>
</div> </div>
{% endfor %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
<div class="imgGal">
<div class="imgFigure"></div>
</div>
</div>
<div class="insetCol2 box-sizing disTab">
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
</p>
<div class="buttonsImg" distab="">
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>
@ -330,6 +325,7 @@
</div> </div>
<div class="galleryWork2 gal-iss disTab"> <div class="galleryWork2 gal-iss disTab">
{% for cro in contractor.contractor_resume.resume_files.all %}
<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">
@ -338,7 +334,7 @@
</div> </div>
<div class="insetCol2 box-sizing disTab"> <div class="insetCol2 box-sizing disTab">
<p> <p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. {{ cro.title }}
</p> </p>
<div class="buttonsImg" distab=""> <div class="buttonsImg" distab="">
<div class="insetBI insetBI2"> <div class="insetBI insetBI2">
@ -347,24 +343,8 @@
</div> </div>
</div> </div>
</div> </div>
{% endfor %}
<div class="col-lg-4">
<div class="insetCol box-sizing disTab">
<div class="imgGal">
<div class="imgFigure"></div>
</div>
</div>
<div class="insetCol2 box-sizing disTab">
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit.
</p>
<div class="buttonsImg" distab="">
<div class="insetBI insetBI2">
<i class="fa fa-times"></i>
</div>
</div>
</div>
</div>
</div> </div>
</div> </div>

@ -2,7 +2,7 @@
{% load staticfiles %} {% load staticfiles %}
{% load common_tags %} {% load common_tags %}
{% block content %} {% block content %}
{% include 'partials/header2.html' %} {% include 'partials/header.html' %}
<div class="container mainScore"> <div class="container mainScore">
<div class="row"> <div class="row">
<form method="post" enctype="multipart/form-data">{% csrf_token %} <form method="post" enctype="multipart/form-data">{% csrf_token %}
@ -13,6 +13,7 @@
<div class="col-lg-3 divCol3"> <div class="col-lg-3 divCol3">
<div class="avatar"> <div class="avatar">
<div class="avatarInset"> <div class="avatarInset">
<img src="/media/{{ form.avatar.value }}" alt="profile-image"> <img src="/media/{{ form.avatar.value }}" alt="profile-image">
</div> </div>
</div> </div>
@ -130,8 +131,6 @@
<script type="text/javascript"> <script type="text/javascript">
$(function(){ $(function(){
var variable = {{ }}
function getCookie(name) { function getCookie(name) {
var cookieValue = null; var cookieValue = null;
if (document.cookie && document.cookie != '') { if (document.cookie && document.cookie != '') {

@ -1,5 +1,6 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load staticfiles %} {% load staticfiles %}
{% load thumbnail %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
<div class="container mainScore"> <div class="container mainScore">

@ -1,5 +1,6 @@
from django.contrib import admin from django.contrib import admin
from .models import WorkSell, WorkSellPhoto from .models import WorkSell, WorkSellPhoto, Picture
admin.site.register(WorkSell) admin.site.register(WorkSell)
admin.site.register(Picture)
admin.site.register(WorkSellPhoto) admin.site.register(WorkSellPhoto)

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-11 08:33
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('work_sell', '0010_auto_20160707_1401'),
]
operations = [
migrations.CreateModel(
name='Picture',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('file', models.ImageField(upload_to='worksell/pictures')),
('slug', models.SlugField(blank=True)),
],
),
]

@ -46,3 +46,19 @@ class WorkSellPhoto(models.Model):
class Meta: class Meta:
verbose_name = 'Изображение Готовая работа' verbose_name = 'Изображение Готовая работа'
verbose_name_plural = 'Изображения Готовые работы' verbose_name_plural = 'Изображения Готовые работы'
class Picture(models.Model):
file = models.ImageField(upload_to='worksell/pictures')
slug = models.SlugField(max_length=50, blank=True)
def __str__(self):
return self.file.name
def save(self, *args, **kwargs):
self.slug = self.file.name
super().save(*args, **kwargs)
def delete(self, *args, **kwargs):
self.file.delete(False)
super().delete(*args, **kwargs)

@ -0,0 +1,19 @@
import json
from django.http import HttpResponse
MIMEANY = '*/*'
MIMEJSON = 'application/json'
MIMETEXT = 'text/plain'
def response_mimetype(request):
can_json = MIMEJSON in request.META['HTTP_ACCEPT']
can_json |= MIMEANY in request.META['HTTP_ACCEPT']
return MIMEJSON if can_json else MIMETEXT
class JSONResponse(HttpResponse):
def __init__(self, obj='', json_opts=None, mimetype=MIMEJSON, *args, **kwargs):
json_opts = json_opts if isinstance(json_opts, dict) else {}
content = json.dumps(obj, **json_opts)
super().__init__(content, mimetype, *args, **kwargs)

@ -0,0 +1,14 @@
import mimetypes
from django.core.urlresolvers import reverse
def serialize(instance, file_attr='file'):
obj = getattr(instance, file_attr)
return {
'url': obj.url,
'name': obj.name,
'type': mimetypes.guess_type(obj.path)[0] or 'image/png',
'size': obj.size,
'deleteUrl': '/delete',
'deleteType': 'DELETE',
}

@ -0,0 +1,117 @@
{% load staticfiles %}
<!DOCTYPE HTML>
<html lang="en">
<head>
<!-- Force latest IE rendering engine or ChromeFrame if installed -->
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><![endif]-->
<meta charset="utf-8">
<title>Django jQuery File Upload Demo - Basic version</title>
<meta name="description" content="File Upload widget with multiple file selection, drag&amp;drop support and progress bar for jQuery. Supports cross-domain, chunked and resumable file uploads. Works with any server-side platform (PHP, Python, Ruby on Rails, Java, Node.js, Go etc.) that supports standard HTML form file uploads.">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- Bootstrap styles -->
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css">
<!-- Generic page styles -->
<link rel="stylesheet" href="/static/css/style.css">
<link rel='stylesheet' href='{% static "lib/jquery.fileupload/css/jquery.fileupload.css" %}'>
</head>
<body>
<div class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-fixed-top .navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="https://github.com/sigurdga/django-jquery-file-upload">Django jQuery File Upload</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li class="active"><a href="#">Demo</a></li>
</ul>
</div>
</div>
</div>
<div class="container">
<h1>Django jQuery File Upload Demo</h1>
<h2 class="lead">Basic version</h2>
<ul class="nav nav-tabs">
<li class="active"><a href="/upload/basic">Basic</a></li>
<li><a href="/upload/basic/plus">Basic Plus</a></li>
<li><a href="/upload/new">Basic Plus UI</a></li>
<li><a href="/upload/angular">AngularJS</a></li>
<li><a href="/upload/jquery-ui">jQuery UI</a></li>
</ul>
<br>
<blockquote>
<p>File Upload widget</p>
</blockquote>
<br>
<!-- The fileinput-button span is used to style the file input field as button -->
<span class="btn btn-success fileinput-button">
<i class="glyphicon glyphicon-plus"></i>
<span>Select files...</span>
<!-- The file input field used as target for the file upload widget -->
<input id="fileupload" type="file" name="file" multiple>
</span>
<br>
<br>
<!-- The global progress bar -->
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
</div>
<!-- The container for the uploaded files -->
<div id="files" class="files"></div>
<br>
</div>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<!-- The jQuery UI widget factory, can be omitted if jQuery UI is already included -->
<script src="{% static 'lib/jquery.fileupload/js/vendor/jquery.ui.widget.js'%}"></script>
<!-- The Iframe Transport is required for browsers without support for XHR file uploads -->
<script src='{% static "lib/jquery.fileupload/js/jquery.iframe-transport.js" %}'></script>
<!-- The basic File Upload plugin -->
<script src='{% static "lib/jquery.fileupload/js/jquery.fileupload.js" %}'></script>
<!-- Bootstrap JS is not required, but included for the responsive demo navigation -->
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.0/js/bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js"></script>
<script>
/*jslint unparam: true */
/*global window, $ */
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$(function () {
'use strict';
// Change this to the location of your server-side upload handler:
var url = '/work_sell/basic/';
var csrftoken = $.cookie('csrftoken');
$('#fileupload').fileupload({
url: url,
crossDomain: false,
beforeSend: function(xhr, settings) {
if (!csrfSafeMethod(settings.type)) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);
}
},
dataType: 'json',
done: function (e, data) {
console.log(data);
$.each(data.result.files, function (index, file) {
$('<p/>').text(file.name).appendTo('#files');
});
},
progressall: function (e, data) {
var progress = parseInt(data.loaded / data.total * 100, 10);
$('#progress .progress-bar').css(
'width',
progress + '%'
);
}
}).prop('disabled', !$.support.fileInput)
.parent().addClass($.support.fileInput ? undefined : 'disabled');
});
</script>
</body>
</html>

@ -8,6 +8,9 @@ from .views import (
WorkSellDeleteView, WorkSellDeleteView,
UploadView, UploadView,
work_sell_create, work_sell_create,
BasicCreateView,
PictureCreateView,
) )
app_name = 'work_sell' app_name = 'work_sell'
@ -19,5 +22,7 @@ urlpatterns = [
urls.url(r'^(?P<pk>\d+)/edit/$',WorkSellUpdateView.as_view(), name='edit'), urls.url(r'^(?P<pk>\d+)/edit/$',WorkSellUpdateView.as_view(), name='edit'),
urls.url(r'^(?P<pk>\d+)/delete/$',WorkSellDeleteView.as_view(), name='delete'), urls.url(r'^(?P<pk>\d+)/delete/$',WorkSellDeleteView.as_view(), name='delete'),
urls.url(r'^test/$', work_sell_create, name='test'), urls.url(r'^test/$', work_sell_create, name='test'),
urls.url(r'^basic/$', BasicCreateView.as_view(), name='upload-basic'),
urls.url(r'^new/$', PictureCreateView.as_view(), name='upload-new'),
urls.url(r'^(?P<pk>\d+)/$', WorkSellDetail.as_view(), name='detail'), urls.url(r'^(?P<pk>\d+)/$', WorkSellDetail.as_view(), name='detail'),
] ]

@ -6,8 +6,31 @@ from django.views.generic import ListView, DetailView, CreateView, View,\
UpdateView, DeleteView, TemplateView UpdateView, DeleteView, TemplateView
from projects.models import BuildingClassfication, ConstructionType from projects.models import BuildingClassfication, ConstructionType
from .models import WorkSell from .models import WorkSell, Picture
from .forms import WorkSellForm from .forms import WorkSellForm
from .serialize import serialize
from .response import JSONResponse, response_mimetype
class PictureCreateView(CreateView):
model = Picture
fields = '__all__'
def form_valid(self, form):
self.object = form.save()
files = [serialize(self.object)]
data = {'files': files}
response = JSONResponse(data, mimetype=response_mimetype(self.request))
response['Content-Disposition'] = 'inline; filename=files.json'
return response
def form_invalid(self, form):
data = json.dumps(form.errors)
return HttpResponse(content=data, status=400, content_type='application/json')
class BasicCreateView(PictureCreateView):
template_name = 'picture_basic_form.html'
class WorkSellsView(ListView): class WorkSellsView(ListView):
model = WorkSell model = WorkSell
@ -83,6 +106,8 @@ class UploadView(View):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
return render(request,self.template_name) return render(request,self.template_name)
class JSONResponseMixin(object): class JSONResponseMixin(object):
def render_to_json_response(self, context, **response_kwargs): def render_to_json_response(self, context, **response_kwargs):
return JsonResponse( return JsonResponse(

Loading…
Cancel
Save