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