fix save image if png

feature/docker
Dmitriy Shesterkin 9 years ago
parent d3a9482024
commit 892749a7a6
  1. 3
      requirements/local.txt
  2. 7
      src/commons/pdf_tools.py
  3. 29
      src/customer/models.py
  4. 31
      src/customer/urls.py
  5. 34
      src/customer/views/profile.py
  6. 4
      src/docs/views/base_views.py
  7. 2
      src/dokumentor/static/js/commons.js
  8. 29
      src/dokumentor/templates/customer/profile/edit.html

@ -2,3 +2,6 @@
ipython==2.1.0
django-debug-toolbar==1.4
django-eml-email-backend==0.1
ipdb==0.10.3
ptpython==0.39
ipython==2.1.0

@ -8,13 +8,11 @@ from django.template import RequestContext
from django.http import HttpResponse
def pdf_to_response(content, filename=None, filename_encode='windows-1251'):
def pdf_to_response(content, filename=None):
"""Выводит content в django.http.HttpResponse, который и возвращает."""
response = HttpResponse(content, content_type='application/pdf')
if filename:
if filename_encode:
filename = filename.encode(filename_encode)
response['Content-Disposition'] = ('attachment; filename="%s"' % filename.replace('"', "''"))
response['Content-Disposition'] = ('attachment; filename="{}"'.format(filename))
return response
@ -22,7 +20,6 @@ def render_pdf_to_string(request, template_name, dictionary=None):
"""Рендерит html шаблон в pdf. Возвращает строку, в которой содержится сгенерированный pdf."""
context_instance = RequestContext(request)
html = render_to_string(template_name, dictionary, context_instance)
#return HttpResponse(html) # для отладки
result = BytesIO()
pdf = pisa.pisaDocument(BytesIO(html.encode('utf-8')), result, encoding='utf-8')
pdf_content = result.getvalue()

@ -46,20 +46,6 @@ class UploadAndRename(object):
return os.path.join(self.path, profile_dir, filename)
# def upload_to(path, new_filename=None):
# """Куда и под каким именем сохранить загруженный файл."""
#
# def get_upload_path(instance, filename):
# filename = new_filename or filename
# try:
# profile_dir = instance.get_first_user().username
# except:
# profile_dir = 'NoUser'
# return os.path.join(path, profile_dir, filename)
#
# return get_upload_path
class UserProfile(models.Model):
"""Профиль пользователя."""
profile_type = models.PositiveSmallIntegerField(u'Тип профиля', choices=consts.PROFILE_TYPES)
@ -116,13 +102,13 @@ class UserProfile(models.Model):
# подписи, печать и логотип
boss_sign = models.ImageField(u'Подпись руководителя', blank=True, default='',
upload_to=UploadAndRename(PROFILE_IMAGES_UPLOAD_DIR, 'boss_sign.bmp'))
upload_to=UploadAndRename(PROFILE_IMAGES_UPLOAD_DIR, 'boss_sign.png'))
glavbuh_sign = models.ImageField(u'Подпись бухгалтера', blank=True, default='',
upload_to=UploadAndRename(PROFILE_IMAGES_UPLOAD_DIR, 'glavbuh_sign.bmp'))
upload_to=UploadAndRename(PROFILE_IMAGES_UPLOAD_DIR, 'glavbuh_sign.png'))
stamp = models.ImageField(u'Печать', blank=True, default='',
upload_to=UploadAndRename(PROFILE_IMAGES_UPLOAD_DIR, 'stamp.bmp'))
upload_to=UploadAndRename(PROFILE_IMAGES_UPLOAD_DIR, 'stamp.png'))
logo = models.ImageField(u'Логотип', blank=True, default='',
upload_to=UploadAndRename(PROFILE_IMAGES_UPLOAD_DIR, 'logo.bmp'))
upload_to=UploadAndRename(PROFILE_IMAGES_UPLOAD_DIR, 'logo.png'))
created_at = models.DateTimeField(u'Создан', auto_now_add=True)
updated_at = models.DateTimeField(u'Изменен', auto_now=True)
@ -130,7 +116,7 @@ class UserProfile(models.Model):
confirmed = models.BooleanField(u'Подтверждён', default=False)
user_session_key = models.CharField(u'Ключ сессии (служебная информация)', max_length=256, blank=True, default='',
help_text=u'Руками не тро...')
help_text=u'Руками не трогать...')
objects = managers.UserProfileManager()
@ -151,13 +137,14 @@ class UserProfile(models.Model):
self.kpp = only_numerics(self.kpp)
def process_img(orig_img, size):
# TODO http://stackoverflow.com/questions/9166400/convert-rgba-png-to-rgb-with-pil
w = orig_img.width
h = orig_img.height
if w > size[0] or h > size[1]:
filename = str(orig_img.path)
img = Image.open(filename).convert("RGB")
img = Image.open(filename)
img.thumbnail(size, Image.ANTIALIAS)
img.save(filename, 'BMP')
img.save(filename, 'PNG')
super(UserProfile, self).save(*args, **kwargs)

@ -6,7 +6,6 @@ from customer.views import profile, profile_ajax, license, documents
from customer.views import bank_accounts, bank_accounts_ajax
from customer.views import clients, clients_ajax
urlpatterns = patterns('',
# личный кабинет
url(r'^$', views.customer_index, name='customer_index'),
@ -26,21 +25,28 @@ urlpatterns = patterns('',
url(r'^paid_list/$', license.paid_list, name='customer_paid_list'),
# --- профиль AJAX
url(r'^profile/filters/edit/ajax/$', profile_ajax.profile_filters_edit_ajax, name='customer_profile_filters_edit_ajax'),
url(r'^profile/email/ajax/$', profile_ajax.profile_email_ajax, name='customer_profile_email_ajax'),
url(r'^profile/filters/edit/ajax/$', profile_ajax.profile_filters_edit_ajax,
name='customer_profile_filters_edit_ajax'),
url(r'^profile/email/ajax/$', profile_ajax.profile_email_ajax,
name='customer_profile_email_ajax'),
# --- расчетные счета
url(r'^bank-accounts/$', bank_accounts.bank_accounts_list, name='customer_bank_accounts_list'),
url(r'^bank-accounts/page/(?P<page_num>[0-9]+)/$', bank_accounts.bank_accounts_list, name='customer_bank_accounts_list'),
url(r'^bank-accounts/page/(?P<page_num>[0-9]+)/$', bank_accounts.bank_accounts_list,
name='customer_bank_accounts_list'),
url(r'^bank-accounts/add/$', bank_accounts.bank_accounts_add, name='customer_bank_accounts_add'),
url(r'^bank-accounts/(?P<id>\d+)/edit/$', bank_accounts.bank_accounts_edit, name='customer_bank_accounts_edit'),
url(r'^bank-accounts/(?P<id>\d+)/delete/$', bank_accounts.bank_accounts_delete, name='customer_bank_accounts_delete'),
url(r'^bank-accounts/(?P<id>\d+)/edit/$', bank_accounts.bank_accounts_edit,
name='customer_bank_accounts_edit'),
url(r'^bank-accounts/(?P<id>\d+)/delete/$', bank_accounts.bank_accounts_delete,
name='customer_bank_accounts_delete'),
# --- расчетные счета AJAX
url(r'^bank-accounts/ajax/$', bank_accounts_ajax.bank_accounts_list_ajax, name='customer_bank_accounts_list_ajax'),
url(r'^bank-accounts/ajax/$', bank_accounts_ajax.bank_accounts_list_ajax,
name='customer_bank_accounts_list_ajax'),
url(r'^bank-accounts/(?P<id>\d+)/get/ajax/$', bank_accounts_ajax.bank_accounts_get_ajax,
name='customer_bank_accounts_get_ajax'),
url(r'^bank-accounts/add/ajax/$', bank_accounts_ajax.bank_accounts_add_ajax, name='customer_bank_accounts_add_ajax'),
url(r'^bank-accounts/add/ajax/$', bank_accounts_ajax.bank_accounts_add_ajax,
name='customer_bank_accounts_add_ajax'),
url(r'^bank-accounts/(?P<id>\d+)/edit/ajax/$', bank_accounts_ajax.bank_accounts_edit_ajax,
name='customer_bank_accounts_edit_ajax'),
url(r'^bank-accounts/(?P<id>\d+)/delete/ajax/$', bank_accounts_ajax.bank_accounts_delete_ajax,
@ -54,10 +60,13 @@ urlpatterns = patterns('',
url(r'^clients/(?P<id>\d+)/delete/$', clients.clients_delete, name='customer_clients_delete'),
# --- контрагенты AJAX
url(r'^clients/(?P<id>\d+)/get/ajax/$', clients_ajax.clients_get_ajax, name='customer_clients_get_ajax'),
url(r'^clients/(?P<id>\d+)/get/ajax/$', clients_ajax.clients_get_ajax,
name='customer_clients_get_ajax'),
url(r'^clients/add/ajax/$', clients_ajax.clients_add_ajax, name='customer_clients_add_ajax'),
url(r'^clients/(?P<id>\d+)/edit/ajax/$', clients_ajax.clients_edit_ajax, name='customer_clients_edit_ajax'),
url(r'^clients/(?P<id>\d+)/delete/ajax/$', clients_ajax.clients_delete_ajax, name='customer_clients_delete_ajax'),
url(r'^clients/(?P<id>\d+)/edit/ajax/$', clients_ajax.clients_edit_ajax,
name='customer_clients_edit_ajax'),
url(r'^clients/(?P<id>\d+)/delete/ajax/$', clients_ajax.clients_delete_ajax,
name='customer_clients_delete_ajax'),
url(r'^tmp_upload/ajax/$', profile.tmp_upload, name='upload_tmp_file'),
)

@ -23,7 +23,6 @@ from customer import models, forms
from customer.decorators import license_required
from customer.utils import raise_if_no_profile
PDF_PROFILE_NAME = u'Реквизиты.pdf'
SUPPORT_EMAIL = getattr(settings, 'SUPPORT_EMAIL', '')
@ -91,17 +90,22 @@ def profile_edit(request):
if request.method == 'POST':
form = form_class(data=request.POST, files=request.FILES, instance=profile)
if form.is_valid():
item = form.save(commit=False)
for img_url in ('tmb_logo', 'tmb_boss_sign', 'tmb_glavbuh_sign', 'tmb_stamp'):
if form.cleaned_data[img_url]:
# TODO ?
chg_file = open(settings.MEDIA_ROOT + '/cache/imgs/' + \
form.cleaned_data[img_url])
form.cleaned_data[img_url], mode='rb+')
item_attr = img_url[4:]
getattr(item, item_attr).save('%s.%s' % \
(item_attr, form.cleaned_data[img_url].split('.')[-1]),
File(chg_file))
chg_file.close()
#
elif form.cleaned_data:
pass
item.save()
@ -120,21 +124,22 @@ def profile_edit(request):
def tmp_upload(request):
SIZES = {'id_boss_sign': (170, 65), 'id_glavbuh_sign': (170, 65), 'id_stamp': (170, 170), 'id_logo': (170, 170)}
key = ''
SIZES = {'id_boss_sign': (170, 65),
'id_glavbuh_sign': (170, 65),
'id_stamp': (170, 170),
'id_logo': (170, 170)}
elm_id = request.REQUEST['elm_id']
file_ = request.FILES.values()[0]
for k in request.FILES.keys():
key = k
file_ = request.FILES.get(key)
if not file_.content_type.startswith('image'):
return {'res': 'bad'}
if not os.path.exists(settings.MEDIA_ROOT +
'/cache/imgs/'):
os.makedirs(settings.MEDIA_ROOT +
'/cache/imgs/')
tmp_dir = tempfile.mkdtemp('img_tmp', settings.MEDIA_ROOT +
'/cache/imgs/')
if not os.path.exists(settings.MEDIA_ROOT + '/cache/imgs/'):
os.makedirs(settings.MEDIA_ROOT + '/cache/imgs/')
tmp_dir = tempfile.mkdtemp('img_tmp', settings.MEDIA_ROOT + '/cache/imgs/')
os.chmod(tmp_dir, 755)
open(tmp_dir + '/' + file_.name, "w").write(file_.read())
open(tmp_dir + '/' + file_.name, "wb+").write(file_.read())
tmp_url_partial = os.path.basename(tmp_dir) + '/' + file_.name
thumbnailer = get_thumbnailer(tmp_dir + '/' + file_.name)
# im = get_thumbnail(tmp_dir + '/' + file_.name, SIZES[elm_id], quality=75)
@ -146,6 +151,7 @@ def tmp_upload(request):
return HttpResponse(json.dumps(data), content_type='application/json')
# TODO ?
def del_tmp_photo(request, article_pk):
# wedding, wedding_guests = get_wedding_n_guests(request)
try:
@ -156,6 +162,7 @@ def del_tmp_photo(request, article_pk):
return {'res': 'bad'}
return {'res': 'ok'}
#
@login_required
@ -225,7 +232,6 @@ def profile_email(request):
return render(request, template_name, {'form': form, 'profile': profile, })
# @login_required
# @csrf_protect
# def profile_settings(request):

@ -404,7 +404,10 @@ class BaseViews(object):
os.makedirs(tmp_media_dir)
tmp_dir = tempfile.mkdtemp(dir=tmp_media_dir)
if not settings.DEBUG:
os.chmod(tmp_dir, 755)
tmp_dirname = os.path.split(tmp_dir)[1]
f = open(filename, 'wb')
@ -419,7 +422,6 @@ class BaseViews(object):
"-sOutputFile=%s" % os.path.join(tmp_dir, "page-%03d.png"),
"-f", filename
]
# ghostscript.Ghostscript(*args) # TODO: check on ubuntu
try:
p = s.Popen(args=args, stdout=s.PIPE, stderr=s.PIPE)
p.wait()

@ -1,6 +1,6 @@
$(document).ready(function() {
var show_cabinet = false;
$('.has-datepicker').datepicker({dateFormat: 'dd.mm.yy', showOn:"button", buttonImageOnly:true, buttonImage:"/s/img/icon-calendar.png"});
$('.has-datepicker').datepicker({dateFormat: 'dd.mm.yy', showOn:"button", buttonImageOnly:true, buttonImage:"/static/img/icon-calendar.png"});
$('#reasons').mouseout(function(e){
$('.extended-block').removeClass('active');
$('.extended-block-more').hide();

@ -1,4 +1,5 @@
{% extends "base.html" %}
{% load static %}
{% block title %}Редактирование реквизитов{% endblock %}
@ -230,14 +231,14 @@
{% endif %}
</td>
<td class="account-info" class="profile_field">
<td class="account-info profile_field">
<a id="account_edit_link_{{ account.pk }}" href="{% url 'customer_bank_accounts_edit' id=account.pk %}" title="Редактировать расчётный счёт">{{ account.account }}</a>
в <span id="account_bank_name_{{ account.pk }}">{{ account.name }}</span>
</td>
<td class="account-delete" style="padding: 0 0 0 5px;">
<a id="account_delete_link_{{ account.pk }}" href="{% url 'customer_bank_accounts_delete' id=account.pk %}" title="Удалить расчётный счёт">
<img src="{{ STATIC_URL }}img/icon-delete.png" alt="[X]" title="Удалить расчётный счёт" />
<img src="{% static 'img/icon-delete.png' %}" alt="[X]" title="Удалить расчётный счёт" />
</a>
</td>
</tr>
@ -259,7 +260,7 @@
<td class="account-delete" style="padding: 0 0 0 5px;">
<a id="account_delete_link_0" href="{% url 'customer_bank_accounts_delete' id=0 %}" title="Удалить расчётный счёт">
<img src="{{ STATIC_URL }}img/icon-delete.gif" alt="[X]" title="Удалить расчётный счёт" />
<img src="{% static 'img/icon-delete.gif' %}" alt="[X]" title="Удалить расчётный счёт" />
</a>
</td>
</tr>
@ -376,7 +377,7 @@
{% if form.boss_sign.value %}
<img src="{{ form.boss_sign.value.url }}" /> {# если уже есть картинка, показать ее #}
{% else %}
<img src="{{ STATIC_URL }}img/upload-boss_sign.png" />
<img src="{% static 'img/upload-boss_sign.png' %}" />
{% endif %}
<a href="#" class='del_image{% if not form.boss_sign.value %} hidden{% endif %}'></a>
@ -390,7 +391,7 @@
{% if form.glavbuh_sign.value %}
<img src="{{ form.glavbuh_sign.value.url }}" /> {# если уже есть картинка, показать ее #}
{% else %}
<img src="{{ STATIC_URL }}img/upload-glavbuh_sign.png" />
<img src="{% static 'img/upload-glavbuh_sign.png' %}" />
{% endif %}
@ -414,7 +415,7 @@
{% if form.stamp.value %}
<img src="{{ form.stamp.value.url }}" /> {# если уже есть картинка, показать ее #}
{% else %}
<img src="{{ STATIC_URL }}img/upload-stamp.png" />
<img src="{% static 'img/upload-stamp.png' %}" />
{% endif %}
<a href="#" class='del_image{% if not form.stamp.value %} hidden{% endif %}'></a>
</div>
@ -430,7 +431,7 @@
{% if form.logo.value %}
<img src="{{ form.logo.value.url }}" /> {# если уже есть картинка, показать ее #}
{% else %}
<img src="{{ STATIC_URL }}img/upload-logo.png" />
<img src="{% static 'img/upload-logo.png' %}" />
{% endif %}
<a href="#" class='del_image{% if not form.logo.value %} hidden{% endif %}'></a>
</div>
@ -486,7 +487,7 @@
'edit_id_prefix': "account_edit_link_",
'delete_id_prefix': "account_delete_link_",
'bank_id_prefix': "account_bank_name_"
}
};
$(function(){
$('.img_load img').on('click', function(e) {
var this_id = $(this).closest('.img_load').attr('id');
@ -494,7 +495,7 @@
$('#' + tmb_id).val('');
$('#id_' + this_id).click();
})
});
$('.img_load .del_image').on('click', function(e) {
e.preventDefault();
var this_id = $(this).closest('.img_load').attr('id');
@ -520,7 +521,7 @@
var getPic = function(data){
var elm_id = '#' + data['elm_id'].substring(3);
var tmb_id = '#id_tmb_' + data['elm_id'].substring(3);
$(elm_id + ' img').attr('src', data['pic'])
$(elm_id + ' img').attr('src', data['pic']);
$(tmb_id).val(data['full_pic']);
$(elm_id + ' .del_image').show();
};
@ -547,8 +548,8 @@
})
</script>
<script src="{{ STATIC_URL }}js/customer/profile.edit.js"></script>
<script src="{{ STATIC_URL }}js/lib/jquery.suggestions.min.js"></script>
<script src="{% static 'js/customer/profile.edit.js' %}"></script>
<script src="{% static 'js/lib/jquery.suggestions.min.js' %}"></script>
<script>
$(document).ready(function() {
@ -557,8 +558,8 @@
window.isOrg = {{ profile.is_org }};
});
</script>
<script src="{{ STATIC_URL }}js/profile/search-main-external-api.js"></script>
<script src="{{ STATIC_URL }}js/profile/search-bank-external-api.js"></script>
<script src="{% static 'js/profile/search-main-external-api.js' %}"></script>
<script src="{% static 'js/profile/search-bank-external-api.js' %}"></script>
{% include 'hbs/bank-tpl.html' %}

Loading…
Cancel
Save