From 20885a53dbf44bde9b1ccb3468d71b906c13d7c9 Mon Sep 17 00:00:00 2001 From: Reto Aebersold Date: Wed, 10 Jan 2024 09:28:46 +0100 Subject: [PATCH] feat: add avatar migration --- .../migrations/0004_auto_20240108_0943.py | 13 ++++--- server/vbv_lernwelt/core/model_utils.py | 38 +++++++++++++++++++ .../media_files/tests/test_user_images.py | 6 +++ 3 files changed, 51 insertions(+), 6 deletions(-) diff --git a/server/vbv_lernwelt/core/migrations/0004_auto_20240108_0943.py b/server/vbv_lernwelt/core/migrations/0004_auto_20240108_0943.py index f56c3a82..fa170a01 100644 --- a/server/vbv_lernwelt/core/migrations/0004_auto_20240108_0943.py +++ b/server/vbv_lernwelt/core/migrations/0004_auto_20240108_0943.py @@ -1,8 +1,8 @@ -# Generated by Django 3.2.20 on 2024-01-08 08:43 - import django.db.models.deletion from django.db import migrations, models +from vbv_lernwelt.core.model_utils import migrate_avatars + class Migration(migrations.Migration): dependencies = [ @@ -11,10 +11,6 @@ class Migration(migrations.Migration): ] operations = [ - migrations.RemoveField( - model_name="user", - name="avatar_url", - ), migrations.AddField( model_name="user", name="avatar", @@ -26,4 +22,9 @@ class Migration(migrations.Migration): to="media_files.userimage", ), ), + migrations.RunPython(migrate_avatars), + migrations.RemoveField( + model_name="user", + name="avatar_url", + ), ] diff --git a/server/vbv_lernwelt/core/model_utils.py b/server/vbv_lernwelt/core/model_utils.py index ad9a1fde..a8b3a0c1 100644 --- a/server/vbv_lernwelt/core/model_utils.py +++ b/server/vbv_lernwelt/core/model_utils.py @@ -1,3 +1,5 @@ +from django.conf import settings +from django.core.files import File from wagtail.models import Page @@ -144,3 +146,39 @@ def remove_organisations(apps=None, schema_editor=None): Organisation.objects.filter( organisation_id=org_id, ).delete() + + +def migrate_avatars(apps=None, schema_editor=None): + # pylint: disable=import-outside-toplevel + if apps is None: + from vbv_lernwelt.core.models import User + from vbv_lernwelt.media_files.models import UserImage + else: + User = apps.get_model("core", "User") + UserImage = apps.get_model("media_files", "UserImage") + + # Models created by Django migration don't contain methods of the original models. + # We need to add them manually. + from wagtail.images.models import AbstractImage + + UserImage.get_upload_to = AbstractImage.get_upload_to + + avatar_dir = settings.APPS_DIR / "static" / "avatars" + + for user in User.objects.all().exclude( + avatar_url="/static/avatars/myvbv-default-avatar.png" + ): + if not user.avatar_url: + continue + + avatar_file = user.avatar_url.split("/")[-1] + + try: + with open(avatar_dir / avatar_file, "rb") as f: + image = UserImage.objects.create( + file=File(f), + ) + user.avatar = image + user.save() + except FileNotFoundError: + pass diff --git a/server/vbv_lernwelt/media_files/tests/test_user_images.py b/server/vbv_lernwelt/media_files/tests/test_user_images.py index adb796b6..238d1bf0 100644 --- a/server/vbv_lernwelt/media_files/tests/test_user_images.py +++ b/server/vbv_lernwelt/media_files/tests/test_user_images.py @@ -1,4 +1,6 @@ +import os from pathlib import Path +from unittest import skipIf from django.core.files import File from django.test import RequestFactory, TestCase @@ -10,6 +12,10 @@ from vbv_lernwelt.media_files.models import UserImage TEST_IMAGE = Path(__file__).parent / "test_images" / "user1_profile.jpg" +@skipIf( + os.environ.get("ENABLE_S3_STORAGE_UNIT_TESTS") is None, + "Only enable tests by setting ENABLE_S3_STORAGE_UNIT_TESTS=1", +) class UserImageViewTest(TestCase): def setUp(self): self.factory = RequestFactory()