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
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,})
|
|
|