refactor: 💬user settings are incorporated into the user model

This commit is contained in:
m5ka 2024-03-27 16:52:06 +00:00
parent 57138943b5
commit 2ac46c9618
6 changed files with 45 additions and 34 deletions

View file

@ -3,7 +3,7 @@ from django.contrib.auth.forms import UserCreationForm
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from django_recaptcha.fields import ReCaptchaField from django_recaptcha.fields import ReCaptchaField
from moku.models.user import User, UserSettings from moku.models.user import User
class UserForm(UserCreationForm): class UserForm(UserCreationForm):
@ -35,7 +35,7 @@ class UserSettingsForm(forms.ModelForm):
"""Form for creating or updating user settings.""" """Form for creating or updating user settings."""
class Meta: class Meta:
model = UserSettings model = User
fields = ("language",) fields = ("language",)
labels = {"language": _("language")} labels = {"language": _("language")}

View file

@ -8,6 +8,6 @@ class MokuLanguageMiddleware:
self.get_response = get_response self.get_response = get_response
def __call__(self, request): def __call__(self, request):
if request.user.is_authenticated and hasattr(request.user, "settings"): if request.user.is_authenticated:
translation.activate(request.user.settings.language) translation.activate(request.user.language)
return self.get_response(request) return self.get_response(request)

View file

@ -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',
),
]

View file

@ -1,6 +1,6 @@
from moku.models.blog import BlogPost from moku.models.blog import BlogPost
from moku.models.post import Post from moku.models.post import Post
from moku.models.recipe import Recipe, RecipeStep 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"]

View file

@ -60,6 +60,13 @@ class User(AbstractUser):
upload_to=user_avatar_filename, upload_to=user_avatar_filename,
help_text=_("a little picture to show up on your profile."), 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( last_seen_at = models.DateTimeField(
verbose_name=_("last seen at"), verbose_name=_("last seen at"),
blank=True, blank=True,
@ -85,18 +92,3 @@ class User(AbstractUser):
if not self.bio: if not self.bio:
return "" return ""
return full_markdown(self.bio) 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?"),
)

View file

@ -45,23 +45,12 @@ class EditSettingsView(LoginRequiredMixin, FormView):
page_title = _("settings") page_title = _("settings")
def form_valid(self, form): def form_valid(self, form):
form.instance.user = self.request.user form.save()
try:
form.save()
except IntegrityError:
messages.error(
self.request, _("uh oh. i think something went a little bit oopsie.")
)
return self.form_invalid(form)
messages.success(self.request, _("settings updated!")) messages.success(self.request, _("settings updated!"))
return redirect("settings") return redirect("settings")
def get_form(self): def get_form(self):
if hasattr(self.request.user, "settings"): return self.form_class(instance=self.request.user, **self.get_form_kwargs())
return self.form_class(
instance=self.request.user.settings, **self.get_form_kwargs()
)
return super().get_form()
class ProfileView(View): class ProfileView(View):