from io import BytesIO from PIL import Image from os.path import splitext from django.contrib.auth import login from django.shortcuts import render, reverse from django.views.generic import DetailView, UpdateView from django.contrib import messages from django.contrib.auth import get_user_model from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.hashers import check_password, make_password from django.http import Http404 from django.utils.decorators import method_decorator from apps.course.models import Course from .forms import UserEditForm User = get_user_model() class UserView(DetailView): model = User template_name = 'user/profile.html' def get_context_data(self, object): context = super().get_context_data() context['published'] = Course.objects.filter( author=self.object, status=Course.PUBLISHED ) context['paid'] = Course.objects.none() return context class UserEditView(UpdateView): model = User template_name = 'user/profile-settings.html' form_class = UserEditForm @method_decorator(login_required) def dispatch(self, request, *args, **kwargs): self.object = self.get_object() if request.user != self.object: raise Http404() return super().dispatch(request, *args, **kwargs) def post(self, request, *args, **kwargs): # it's magic *-*-*-*-* if 'photo' in request.FILES: photo_fp = request.FILES.pop('photo')[0] fname = photo_fp.name photo = Image.open(photo_fp) lowest_side = min(photo.size) horizontal_padding = (lowest_side - photo.size[0]) / 2 vertical_padding = (lowest_side - photo.size[1]) / 2 photo = photo.crop( ( -horizontal_padding, -vertical_padding, photo.size[0] + horizontal_padding, photo.size[1] + vertical_padding ) ) if photo.size[0] > 512: photo = photo.resize((512, 512,)) buffer = BytesIO() ext = splitext(fname)[1][1:].upper() if ext == 'JPG': ext = 'JPEG' photo.save(buffer, ext) self.object.photo.save(fname, buffer) buffer.close() if not request.POST._mutable: request.POST._mutable = True old_password = request.POST.pop('old_password')[0] new_password1 = request.POST.pop('new_password1')[0] new_password2 = request.POST.pop('new_password2')[0] if old_password: if request.user.check_password(old_password) and new_password1 == new_password2: request.user.set_password(new_password1) request.user.save() login(request, request.user) else: messages.error(request, 'Неверный пароль.') messages.info(request, 'Данные сохранены.') return super().post(request, *args, **kwargs) def get_success_url(self): return reverse('user-edit', args=[self.object.id])