You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

209 lines
8.0 KiB

# -*- coding: utf-8 -*-
from email.header import Header
from django.shortcuts import render, redirect, get_object_or_404
from django.views.decorators.csrf import csrf_protect
from django.contrib.auth.decorators import login_required
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
from django.utils.encoding import smart_str
from django.conf import settings
from project.commons.pdf_tools import render_pdf_to_string, pdf_to_response
from .. import models, forms
PDF_PROFILE_NAME = u'Реквизиты.pdf'
SUPPORT_EMAIL = getattr(settings, 'SUPPORT_EMAIL', '')
# -----------------------------------------------------------------------------
@login_required
@csrf_protect
def profile_view(request):
"""Просмотр профиля пользователя, фильтрация реквизитов, скачать/отправить реквизиты по почте."""
template_name = 'customer/profile/view.html'
profile = get_object_or_404(models.UserProfile, user=request.user)
accounts = models.BankAccount.objects.get_all(request.user)
filters_form_class = forms.get_profile_filters_form_class(profile.profile_type)
filters = models.UserProfileFilters.objects.get_or_create_filters(user=request.user)
if request.method == 'POST':
filters_form = filters_form_class(data=request.POST, instance=filters, profile=profile, accounts=accounts)
if filters_form.is_valid():
filters = filters_form.save()
if 'download-pdf' in request.POST:
#return _profile_get_pdf(request, profile, filters.bank_account, filters) # для отладки
return profile_as_pdf(request, profile, filters.bank_account, filters)
elif 'email-pdf' in request.POST:
return redirect('customer_profile_email')
return redirect('customer_profile_view') # редирект на себя, чтобы не сабмитили форму по F5
else:
filters_form = filters_form_class(instance=filters, label_suffix='', profile=profile, accounts=accounts)
dictionary = {
'profile': profile,
'accounts': accounts,
'filters_form': filters_form,
'email_profile_form': forms.EmailProfileForm(),
}
return render(request, template_name, dictionary)
@login_required
@csrf_protect
def profile_edit(request):
"""Редактировать профиль пользователя."""
template_name = 'customer/profile/edit.html'
success_url = 'customer_profile_view'
if request.method == 'POST' and '_cancel' in request.POST:
return redirect(success_url)
profile = get_object_or_404(models.UserProfile, user=request.user)
form_class = forms.get_profile_form_class(profile.profile_type)
accounts = models.BankAccount.objects.get_all(request.user)
bank_account_form = forms.BankAccountForm()
if request.method == 'POST':
form = form_class(data=request.POST, instance=profile)
if form.is_valid():
form.save()
return redirect(success_url)
else:
form = form_class(instance=profile)
dictionary = {
'form': form,
'profile': profile,
'accounts': accounts,
'bank_account_form': bank_account_form,
}
return render(request, template_name, dictionary)
@login_required
def _profile_get_pdf(request, profile=None, account=None, filters=None):
"""Создать профиль пользователя в PDF и вернуть как строку."""
template_name = 'customer/profile/as_pdf.html'
dictionary = {
'profile': profile,
'account': account,
'filters': filters,
}
return render_pdf_to_string(request, template_name, dictionary)
@login_required
def profile_as_pdf(request, profile=None, account=None, filters=None):
"""Вывести профиль пользователя в формате PDF в HttpResponse."""
pdf = _profile_get_pdf(request, profile, account, filters)
return pdf_to_response(pdf, PDF_PROFILE_NAME)
def _send_profile_email(subject, to, body, pdf_content):
"""Отправка письма."""
template_name = 'customer/profile/profile_email.txt'
dict_context = {'body': body, 'support_email': SUPPORT_EMAIL,}
email_body = render_to_string(template_name, dict_context)
email = EmailMessage(
subject=subject,
to=(to,),
body=email_body,
attachments = [(smart_str(Header(PDF_PROFILE_NAME, 'cp1251')), pdf_content, 'application/pdf'),]
)
return email.send()
@login_required
@csrf_protect
def profile_email(request):
"""Форма отправки профиля пользователя на email аттачем в PDF."""
template_name = 'customer/profile/email.html'
success_url = 'customer_profile_view'
form_class = forms.EmailProfileForm
if request.method == 'POST' and '_cancel' in request.POST:
return redirect('customer_profile_view')
profile = get_object_or_404(models.UserProfile, user=request.user)
filters = models.UserProfileFilters.objects.get_or_create_filters(user=request.user)
if request.method == 'POST':
form = form_class(data=request.POST)
if form.is_valid():
_send_profile_email(
subject = u'Реквизиты %s' % profile.get_company_name(),
to = form.cleaned_data['to'],
body = form.cleaned_data['body'],
pdf_content = _profile_get_pdf(request, profile, filters.bank_account, filters)
)
return redirect(success_url)
else:
form = form_class()
return render(request, template_name, {'form': form, 'profile': profile,})
#@login_required
#@csrf_protect
#def profile_settings(request):
# """Редактировать настройки пользователя."""
# template_name='customer/profile/settings.html'
#
# profile = get_object_or_404(models.UserProfile, user=request.user)
# form_class = forms.UserProfileSettingsForm #TODO remove this view
#
# # пути к уже загруженным подписям/штампу
# curr_files = {'boss_sign': None, 'glavbuh_sign': None, 'stamp': None,}
# if profile.boss_sign:
# curr_files['boss_sign'] = profile.boss_sign.path
# if profile.glavbuh_sign:
# curr_files['glavbuh_sign'] = profile.glavbuh_sign.path
# if profile.stamp:
# curr_files['stamp'] = profile.stamp.path
#
# if request.method == "POST" and '_cancel' not in request.POST:
# post = request.POST
# files = request.FILES
# form = form_class(user=request.user, data=post, files=files, instance=profile)
#
# if form.is_valid():
# def delete_file(path):
# """Удалить файл. Если ошибка - сообщить в консоль."""
# try:
# os.remove(path)
# except:
# print "Can't delete file:", path
# # --- удалить старые файлы
# for field, path in curr_files.iteritems():
# if not path:
# continue
# # если стоит галочка 'очистить'
# if '%s-clear' % field in post:
# delete_file(path)
# continue
# # если загружен новый файл
# if field in files:
# delete_file(path)
# continue
# # --- изменить пароль
# if 'new_password1' in post:
# request.user.set_password(post.get('new_password1'))
# request.user.save()
# messages.add_message(request, messages.INFO, u'Пароль успешно изменен.')
#
# form.save()
# return redirect('customer_profile_settings')
# else:
# form = form_class(user=request.user, instance=profile)
#
# return render(request, template_name, {'profile': profile, 'form': form,})