From b13d27717b1f3ec5bbf5fa5d97fae525902d9bfb Mon Sep 17 00:00:00 2001 From: Jannis Portmann Date: Fri, 8 Sep 2023 11:40:44 +0200 Subject: [PATCH] Save language preference to database --- pflaenzli/pflaenzli/admin.py | 2 +- ...user_language_code_alter_offer_category.py | 34 ++++++++++++++ pflaenzli/pflaenzli/models.py | 1 + pflaenzli/pflaenzli/templates/base.html | 4 +- pflaenzli/pflaenzli/urls.py | 4 +- pflaenzli/pflaenzli/views.py | 46 +++++++++++++++---- pflaenzli/pflaenzli_django/settings.py | 5 +- 7 files changed, 81 insertions(+), 15 deletions(-) create mode 100644 pflaenzli/pflaenzli/migrations/0005_pflaenzliuser_language_code_alter_offer_category.py diff --git a/pflaenzli/pflaenzli/admin.py b/pflaenzli/pflaenzli/admin.py index 0d10758..1de3f16 100644 --- a/pflaenzli/pflaenzli/admin.py +++ b/pflaenzli/pflaenzli/admin.py @@ -14,4 +14,4 @@ class WishAdmin(admin.ModelAdmin): @admin.register(PflaenzliUser) class UserAdmin(admin.ModelAdmin): - list_display = ['id', 'username', 'email', 'zipcode', 'date_joined'] + list_display = ['id', 'username', 'email', 'zipcode', 'language_code', 'date_joined'] diff --git a/pflaenzli/pflaenzli/migrations/0005_pflaenzliuser_language_code_alter_offer_category.py b/pflaenzli/pflaenzli/migrations/0005_pflaenzliuser_language_code_alter_offer_category.py new file mode 100644 index 0000000..e0276f0 --- /dev/null +++ b/pflaenzli/pflaenzli/migrations/0005_pflaenzliuser_language_code_alter_offer_category.py @@ -0,0 +1,34 @@ +# Generated by Django 4.1.10 on 2023-07-22 16:52 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("pflaenzli", "0004_offer_category"), + ] + + operations = [ + migrations.AddField( + model_name="pflaenzliuser", + name="language_code", + field=models.CharField(default="de", max_length=2), + ), + migrations.AlterField( + model_name="offer", + name="category", + field=models.CharField( + choices=[ + ("PLNT", "Plant"), + ("SEED", "Seedling"), + ("POT", "Pots"), + ("TOOL", "Tools"), + ("OTHR", "Other"), + ], + default="PLNT", + max_length=4, + verbose_name="Category", + ), + ), + ] diff --git a/pflaenzli/pflaenzli/models.py b/pflaenzli/pflaenzli/models.py index b9ba3df..b1e2b48 100644 --- a/pflaenzli/pflaenzli/models.py +++ b/pflaenzli/pflaenzli/models.py @@ -11,6 +11,7 @@ from django.utils.translation import gettext_lazy as _ class PflaenzliUser(AbstractUser): email = models.EmailField(max_length=254) zipcode = models.PositiveIntegerField(blank=True, null=True, verbose_name=_('ZIP code')) + language_code = models.CharField(max_length=2, default='de') class Offer(models.Model): diff --git a/pflaenzli/pflaenzli/templates/base.html b/pflaenzli/pflaenzli/templates/base.html index ac0d3a2..ec1bebd 100644 --- a/pflaenzli/pflaenzli/templates/base.html +++ b/pflaenzli/pflaenzli/templates/base.html @@ -92,10 +92,10 @@ {% get_language_info_list for LANGUAGES as languages %} {% for language in languages %}
  • -
    + {% csrf_token %} - diff --git a/pflaenzli/pflaenzli/urls.py b/pflaenzli/pflaenzli/urls.py index ce5e57b..371d8cc 100644 --- a/pflaenzli/pflaenzli/urls.py +++ b/pflaenzli/pflaenzli/urls.py @@ -24,7 +24,7 @@ urlpatterns = [ path("accounts/", views.user_detail, name="user_detail"), path("accounts//wishlist/", views.wishlist, name="wishlist"), path('accounts/login/', auth_views.LoginView.as_view(template_name='registration/login.html')), - path('accounts/profile/', auth_views.LoginView.as_view(template_name='user/detail.html'), name='user_profile'), + path('accounts/profile/', TemplateView.as_view(template_name='user/detail.html'), name='user_profile'), path('accounts/profile/edit', views.user_edit, name='user_edit'), path('accounts/register/', views.register_user, name='register_user'), path('accounts/password_reset/', auth_views.PasswordResetView.as_view(template_name='registration/verify_email.html', @@ -39,6 +39,8 @@ urlpatterns = [ path("faq/", TemplateView.as_view(template_name='app/faq.html'), name="faq"), path("imprint/", TemplateView.as_view(template_name='app/imprint.html'), name="imprint"), path("wish/delete/", views.delete_wish, name='delete_wish'), + path("save_language/", views.save_language, name="save_language"), + path("load_language/", views.load_language, name="load_language"), path("i18n/", include("django.conf.urls.i18n")), path('sitemap.xml', sitemap, {'sitemaps': sitemaps}, name='django.contrib.sitemaps.views.sitemap'), diff --git a/pflaenzli/pflaenzli/views.py b/pflaenzli/pflaenzli/views.py index 83d5ab5..028df6b 100644 --- a/pflaenzli/pflaenzli/views.py +++ b/pflaenzli/pflaenzli/views.py @@ -1,21 +1,20 @@ -from django.shortcuts import render, get_object_or_404, redirect, reverse -from django.utils import timezone +from django.conf import settings from django.contrib import messages from django.contrib.auth import login from django.contrib.auth.decorators import login_required +from django.http import HttpResponseForbidden +from django.shortcuts import get_object_or_404, redirect, render +from django.utils.translation import gettext_lazy as _ +from django.utils.translation import activate, get_language from django.views.decorators.csrf import csrf_protect from django.views.decorators.http import require_POST -from django.http import HttpResponseForbidden -from django.utils.translation import gettext_lazy as _ - -from .forms import CreateOfferForm, RegistrationForm, FilterForm, WishForm - -from .models import PflaenzliUser, Offer, Wish +from .forms import CreateOfferForm, FilterForm, RegistrationForm, WishForm from .mail import send_offer_email +from .models import Offer, PflaenzliUser, Wish from .upload import generate_unique_filename -from .utils.distance import calculate_distance, filter_by_distance from .utils.compress_image import compress_image +from .utils.distance import calculate_distance, filter_by_distance def list_offers(request, filters=None): @@ -184,6 +183,7 @@ def register_user(request): form = RegistrationForm(request.POST) if form.is_valid(): user = form.save() + user.language_code = get_language() login(request, user) return redirect("index") else: @@ -192,6 +192,34 @@ def register_user(request): return render(request, "basic_form.html", {"form": form, "button_label": _("Register"), "title": _("Registeration"), "umami_event": "User registration"}) +def save_language(request): + referer_url = request.META.get('HTTP_REFERER') + response = redirect(referer_url) + + if request.method == 'POST': + if language_code := request.POST.get('language'): + if request.user.is_authenticated: + user = request.user + user.language_code = language_code + user.save() + + activate(language_code) + response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language_code) + + return response + + +@login_required +def load_language(request): + response = redirect('user_profile') + language_code = request.user.language_code + + activate(language_code) + response.set_cookie(settings.LANGUAGE_COOKIE_NAME, language_code) + + return response + + def error_404(request, exception): return render(request, '404.html') diff --git a/pflaenzli/pflaenzli_django/settings.py b/pflaenzli/pflaenzli_django/settings.py index c7efcf5..ea9fc1e 100644 --- a/pflaenzli/pflaenzli_django/settings.py +++ b/pflaenzli/pflaenzli_django/settings.py @@ -56,12 +56,12 @@ INSTALLED_APPS = [ MIDDLEWARE = [ "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", - "django.middleware.common.CommonMiddleware", + 'django.middleware.locale.LocaleMiddleware', "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", - 'django.middleware.locale.LocaleMiddleware', + "django.middleware.common.CommonMiddleware", ] ROOT_URLCONF = "pflaenzli_django.urls" @@ -126,6 +126,7 @@ AUTH_PASSWORD_VALIDATORS = [ ] AUTH_USER_MODEL = 'pflaenzli.PflaenzliUser' +LOGIN_REDIRECT_URL = "/load_language" LOGOUT_REDIRECT_URL = "/" # Internationalization