64 lines
2.3 KiB
Python
64 lines
2.3 KiB
Python
|
import io
|
||
|
|
||
|
from django import forms
|
||
|
from django.core.files import File
|
||
|
from django.shortcuts import redirect
|
||
|
from django.utils.decorators import method_decorator
|
||
|
from django.views.generic import FormView
|
||
|
from PIL import Image, ImageOps
|
||
|
|
||
|
from users.decorators import identity_required
|
||
|
|
||
|
|
||
|
@method_decorator(identity_required, name="dispatch")
|
||
|
class ProfilePage(FormView):
|
||
|
"""
|
||
|
Lets the identity's profile be edited
|
||
|
"""
|
||
|
|
||
|
template_name = "settings/profile.html"
|
||
|
extra_context = {"section": "profile"}
|
||
|
|
||
|
class form_class(forms.Form):
|
||
|
name = forms.CharField(max_length=500)
|
||
|
summary = forms.CharField(
|
||
|
widget=forms.Textarea,
|
||
|
required=False,
|
||
|
help_text="Describe you and your interests",
|
||
|
label="Bio",
|
||
|
)
|
||
|
icon = forms.ImageField(
|
||
|
required=False, help_text="Shown next to all your posts and activities"
|
||
|
)
|
||
|
image = forms.ImageField(
|
||
|
required=False, help_text="Shown at the top of your profile"
|
||
|
)
|
||
|
|
||
|
def get_initial(self):
|
||
|
return {
|
||
|
"name": self.request.identity.name,
|
||
|
"summary": self.request.identity.summary,
|
||
|
"icon": self.request.identity.icon and self.request.identity.icon.url,
|
||
|
"image": self.request.identity.image and self.request.identity.image.url,
|
||
|
}
|
||
|
|
||
|
def form_valid(self, form):
|
||
|
# Update identity name and summary
|
||
|
self.request.identity.name = form.cleaned_data["name"]
|
||
|
self.request.identity.summary = form.cleaned_data["summary"]
|
||
|
# Resize images
|
||
|
icon = form.cleaned_data.get("icon")
|
||
|
image = form.cleaned_data.get("image")
|
||
|
if isinstance(icon, File):
|
||
|
resized_image = ImageOps.fit(Image.open(icon), (400, 400))
|
||
|
new_icon_bytes = io.BytesIO()
|
||
|
resized_image.save(new_icon_bytes, format=icon.format)
|
||
|
self.request.identity.icon.save(icon.name, File(new_icon_bytes))
|
||
|
if isinstance(image, File):
|
||
|
resized_image = ImageOps.fit(Image.open(image), (400, 400))
|
||
|
new_image_bytes = io.BytesIO()
|
||
|
resized_image.save(new_image_bytes, format=image.format)
|
||
|
self.request.identity.image.save(image.name, File(new_image_bytes))
|
||
|
self.request.identity.save()
|
||
|
return redirect(".")
|