diff options
Diffstat (limited to 'users')
| -rw-r--r-- | users/models/identity.py | 2 | ||||
| -rw-r--r-- | users/views/settings/__init__.py (renamed from users/views/settings.py) | 55 | ||||
| -rw-r--r-- | users/views/settings/profile.py | 63 | 
3 files changed, 66 insertions, 54 deletions
diff --git a/users/models/identity.py b/users/models/identity.py index 21912ac..53b6f80 100644 --- a/users/models/identity.py +++ b/users/models/identity.py @@ -162,6 +162,8 @@ class Identity(StatorModel):                  actor_uri, handle = async_to_sync(cls.fetch_webfinger)(                      f"{username}@{domain}"                  ) +                if handle is None: +                    return None                  username, domain = handle.split("@")                  domain = Domain.get_remote_domain(domain)                  return cls.objects.create( diff --git a/users/views/settings.py b/users/views/settings/__init__.py index 1403821..65be1c5 100644 --- a/users/views/settings.py +++ b/users/views/settings/__init__.py @@ -6,10 +6,10 @@ from django.core.files import File  from django.shortcuts import redirect  from django.utils.decorators import method_decorator  from django.views.generic import FormView, RedirectView -from PIL import Image, ImageOps  from core.models.config import Config, UploadedImage  from users.decorators import identity_required +from users.views.settings.profile import ProfilePage  # noqa  @method_decorator(identity_required, name="dispatch") @@ -120,59 +120,6 @@ class InterfacePage(SettingsPage):  @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)) -            icon.open() -            resized_image.save(icon) -            self.request.identity.icon = icon -        if isinstance(image, File): -            resized_image = ImageOps.fit(Image.open(image), (1500, 500)) -            image.open() -            resized_image.save(image) -            self.request.identity.image = image -        self.request.identity.save() -        return redirect(".") - - -@method_decorator(identity_required, name="dispatch")  class SecurityPage(FormView):      """      Lets the identity's profile be edited diff --git a/users/views/settings/profile.py b/users/views/settings/profile.py new file mode 100644 index 0000000..3b16d69 --- /dev/null +++ b/users/views/settings/profile.py @@ -0,0 +1,63 @@ +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(".")  | 
