diff --git a/moku/forms/user.py b/moku/forms/user.py index 8ac4eda..b3e1037 100644 --- a/moku/forms/user.py +++ b/moku/forms/user.py @@ -3,7 +3,7 @@ from django.contrib.auth.forms import UserCreationForm from django.utils.translation import gettext_lazy as _ from django_recaptcha.fields import ReCaptchaField -from moku.models.user import User, UserSettings +from moku.models.user import User class UserForm(UserCreationForm): @@ -35,7 +35,7 @@ class UserSettingsForm(forms.ModelForm): """Form for creating or updating user settings.""" class Meta: - model = UserSettings + model = User fields = ("language",) labels = {"language": _("language")} diff --git a/moku/middleware.py b/moku/middleware.py index b36b5eb..ebdb090 100644 --- a/moku/middleware.py +++ b/moku/middleware.py @@ -8,6 +8,6 @@ class MokuLanguageMiddleware: self.get_response = get_response def __call__(self, request): - if request.user.is_authenticated and hasattr(request.user, "settings"): - translation.activate(request.user.settings.language) + if request.user.is_authenticated: + translation.activate(request.user.language) return self.get_response(request) diff --git a/moku/migrations/0011_user_language_delete_usersettings.py b/moku/migrations/0011_user_language_delete_usersettings.py new file mode 100644 index 0000000..ef398b1 --- /dev/null +++ b/moku/migrations/0011_user_language_delete_usersettings.py @@ -0,0 +1,30 @@ +# Generated by Django 5.0.3 on 2024-03-27 16:23 + +from django.db import migrations, models + + +def migrate_language_setting(apps, schema_editor): + User = apps.get_model("moku", "User") + for user in User.objects.all(): + if hasattr(user, "settings"): + user.language = user.settings.language + user.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('moku', '0010_alter_recipe_title'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='language', + field=models.CharField(choices=[('en', 'english'), ('lio', 'lami lioa'), ('tok', 'toki pona')], default='en', help_text='what language do you want to use moku.blog in?', max_length=16, verbose_name='language'), + ), + migrations.RunPython(migrate_language_setting, reverse_code=migrations.RunPython.noop), + migrations.DeleteModel( + name='UserSettings', + ), + ] diff --git a/moku/models/__init__.py b/moku/models/__init__.py index 63c8160..49757a0 100644 --- a/moku/models/__init__.py +++ b/moku/models/__init__.py @@ -1,6 +1,6 @@ from moku.models.blog import BlogPost from moku.models.post import Post from moku.models.recipe import Recipe, RecipeStep -from moku.models.user import User, UserSettings +from moku.models.user import User -__all__ = ["BlogPost", "Post", "Recipe", "RecipeStep", "User", "UserSettings"] +__all__ = ["BlogPost", "Post", "Recipe", "RecipeStep", "User"] diff --git a/moku/models/user.py b/moku/models/user.py index 6ffaa10..d9a40f0 100644 --- a/moku/models/user.py +++ b/moku/models/user.py @@ -60,6 +60,13 @@ class User(AbstractUser): upload_to=user_avatar_filename, help_text=_("a little picture to show up on your profile."), ) + language = models.CharField( + verbose_name=_("language"), + max_length=16, + choices=settings.LANGUAGES, + default="en", + help_text=_("what language do you want to use moku.blog in?"), + ) last_seen_at = models.DateTimeField( verbose_name=_("last seen at"), blank=True, @@ -85,18 +92,3 @@ class User(AbstractUser): if not self.bio: return "" return full_markdown(self.bio) - - -class UserSettings(models.Model): - """Represents settings for a single user.""" - - user = models.OneToOneField( - "User", related_name="settings", on_delete=models.CASCADE - ) - language = models.CharField( - verbose_name=_("language"), - max_length=16, - choices=settings.LANGUAGES, - default="en", - help_text=_("what language do you want to use moku.blog in?"), - ) diff --git a/moku/views/user.py b/moku/views/user.py index 00ae139..6a16385 100644 --- a/moku/views/user.py +++ b/moku/views/user.py @@ -45,23 +45,12 @@ class EditSettingsView(LoginRequiredMixin, FormView): page_title = _("settings") def form_valid(self, form): - form.instance.user = self.request.user - try: - form.save() - except IntegrityError: - messages.error( - self.request, _("uh oh. i think something went a little bit oopsie.") - ) - return self.form_invalid(form) + form.save() messages.success(self.request, _("settings updated!")) return redirect("settings") def get_form(self): - if hasattr(self.request.user, "settings"): - return self.form_class( - instance=self.request.user.settings, **self.get_form_kwargs() - ) - return super().get_form() + return self.form_class(instance=self.request.user, **self.get_form_kwargs()) class ProfileView(View):