|
|
|
|
@ -1,11 +1,20 @@ |
|
|
|
|
# -*- coding: utf-8 -*- |
|
|
|
|
import os |
|
|
|
|
import json |
|
|
|
|
|
|
|
|
|
import shutil |
|
|
|
|
import tempfile |
|
|
|
|
|
|
|
|
|
from PIL import Image |
|
|
|
|
import numpy as np |
|
|
|
|
|
|
|
|
|
from base64 import b64decode |
|
|
|
|
from email.header import Header |
|
|
|
|
|
|
|
|
|
from django.core.files.storage import FileSystemStorage |
|
|
|
|
from django.shortcuts import render, redirect |
|
|
|
|
from django.core.files import File |
|
|
|
|
from django.core.files.base import ContentFile |
|
|
|
|
from django.views.decorators.csrf import csrf_protect |
|
|
|
|
from django.contrib.auth.decorators import login_required |
|
|
|
|
from django.template.loader import render_to_string |
|
|
|
|
@ -82,11 +91,14 @@ def profile_view(request): |
|
|
|
|
@login_required |
|
|
|
|
@csrf_protect |
|
|
|
|
def profile_edit(request): |
|
|
|
|
"""Редактировать профиль пользователя.""" |
|
|
|
|
""" |
|
|
|
|
Редактировать профиль пользователя. |
|
|
|
|
""" |
|
|
|
|
raise_if_no_profile(request) |
|
|
|
|
|
|
|
|
|
template_name = 'customer/profile/edit.html' |
|
|
|
|
success_url = 'customer_profile_view' |
|
|
|
|
tmp_dir = '' |
|
|
|
|
|
|
|
|
|
if request.method == 'POST' and '_cancel' in request.POST: |
|
|
|
|
return redirect(success_url) |
|
|
|
|
@ -105,20 +117,21 @@ def profile_edit(request): |
|
|
|
|
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], mode='rb+') |
|
|
|
|
path = f'{settings.MEDIA_ROOT}/cache/images/{form.cleaned_data[img_url]}' |
|
|
|
|
tmp_dir = form.cleaned_data[img_url].split('/')[0] |
|
|
|
|
chg_file = open(path, 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() |
|
|
|
|
if tmp_dir: |
|
|
|
|
shutil.rmtree(f'{settings.MEDIA_ROOT}/cache/images/{tmp_dir}') |
|
|
|
|
return redirect(success_url) |
|
|
|
|
else: |
|
|
|
|
form = form_class(instance=profile) |
|
|
|
|
@ -161,6 +174,55 @@ def tmp_upload(request): |
|
|
|
|
return HttpResponse(json.dumps(data), content_type='application/json') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def save_file(path, file): |
|
|
|
|
fs = FileSystemStorage() |
|
|
|
|
file_path = fs.save(path, file) |
|
|
|
|
return file_path |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def clean_background(file): |
|
|
|
|
|
|
|
|
|
threshold = 100 |
|
|
|
|
dist = 5 |
|
|
|
|
img = Image.open(file).convert('RGBA') |
|
|
|
|
# np.asarray(img) is read only. Wrap it in np.array to make it modifiable. |
|
|
|
|
arr = np.array(np.asarray(img)) |
|
|
|
|
r, g, b, a = np.rollaxis(arr, axis=-1) |
|
|
|
|
mask = ((r > threshold) |
|
|
|
|
& (g > threshold) |
|
|
|
|
& (b > threshold) |
|
|
|
|
& (np.abs(r - g) < dist) |
|
|
|
|
& (np.abs(r - b) < dist) |
|
|
|
|
& (np.abs(g - b) < dist) |
|
|
|
|
) |
|
|
|
|
arr[mask, 3] = 0 |
|
|
|
|
img = Image.fromarray(arr, mode='RGBA') |
|
|
|
|
img.save(file) |
|
|
|
|
return file |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def upload_image(request): |
|
|
|
|
|
|
|
|
|
name = request.POST.get('name') |
|
|
|
|
if not os.path.exists(settings.MEDIA_ROOT + '/cache/images/'): |
|
|
|
|
os.makedirs(settings.MEDIA_ROOT + '/cache/images/') |
|
|
|
|
tmp_dir = tempfile.mkdtemp('img_tmp', settings.MEDIA_ROOT + '/cache/images/') |
|
|
|
|
b64_text = request.POST.get('image') |
|
|
|
|
format_file, img_str = b64_text.split(';base64,') |
|
|
|
|
ext = format_file.split('/')[-1] |
|
|
|
|
file_name = f'{name}.{ext}' |
|
|
|
|
full_path = f'{tmp_dir}/{file_name}' |
|
|
|
|
file = ContentFile(b64decode(img_str), name=file_name) |
|
|
|
|
file = save_file(full_path, file) |
|
|
|
|
if name != 'logo': |
|
|
|
|
file = clean_background(file) |
|
|
|
|
url = os.path.join(settings.MEDIA_URL, os.path.relpath(file, settings.MEDIA_ROOT)) |
|
|
|
|
short_url = os.path.basename(tmp_dir) + '/' + file_name |
|
|
|
|
data = {'msg': 'success', 'url': url, 'short_url': short_url} |
|
|
|
|
|
|
|
|
|
return HttpResponse(json.dumps(data), content_type='application/json') |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@login_required |
|
|
|
|
def _profile_get_pdf(request, profile=None, account=None, filters=None): |
|
|
|
|
""" |
|
|
|
|
|