Merge pull request #784 from tonioo/user_lang_766

User lang
This commit is contained in:
Antoine Nguyen
2015-11-14 15:06:17 +01:00
12 changed files with 118 additions and 58 deletions
+1 -2
View File
@@ -54,10 +54,9 @@ def load_core_settings():
This function must be manually called (see :file:`urls.py`) in
order to load base settings.
"""
from modoboa.core.app_settings import GeneralParametersForm, UserSettings
from modoboa.core.app_settings import GeneralParametersForm
parameters.register(GeneralParametersForm, ugettext_lazy("General"))
parameters.register(UserSettings, ugettext_lazy("General"))
events.declare(BASE_EVENTS)
-30
View File
@@ -357,33 +357,3 @@ class GeneralParametersForm(parameters.AdminParametersForm):
})
else:
settings.AUTH_LDAP_GLOBAL_OPTIONS[ldap.OPT_REFERRALS] = False
def translate_language_code(value):
if "-" in value:
return value.split("-")[0]
return value
class UserSettings(parameters.UserParametersForm):
app = "core"
sep = SeparatorField(label=ugettext_lazy("Display"))
lang = forms.ChoiceField(
initial=translate_language_code(settings.LANGUAGE_CODE),
label=ugettext_lazy("Prefered language"),
choices=[("cs", "čeština"),
("de", "deutsch"),
("en", "english"),
("es", "español"),
("fr", "français"),
("it", "italiano"),
("nl", "nederlands"),
("pt_PT", "português"),
("pt_BR", "português (BR)"),
("ru", "русский"),
("sv", "svenska")],
help_text=ugettext_lazy("Prefered language to display pages"),
widget=forms.Select(attrs={"class": "form-control"})
)
+18
View File
@@ -0,0 +1,18 @@
# coding: utf-8
"""Core application constants."""
LANGUAGES = (
("cs", u"čeština"),
("de", u"deutsch"),
("en", u"english"),
("es", u"español"),
("fr", u"français"),
("it", u"italiano"),
("nl", u"nederlands"),
("pt_PT", u"português"),
("pt_BR", u"português (BR)"),
("ru", u"русский"),
("sv", u"svenska"),
)
+4 -1
View File
@@ -27,6 +27,9 @@ class LoginForm(forms.Form):
class ProfileForm(forms.ModelForm):
"""Form to update User profile."""
oldpassword = forms.CharField(
label=ugettext_lazy("Old password"), required=False,
widget=forms.PasswordInput(attrs={"class": "form-control"})
@@ -42,7 +45,7 @@ class ProfileForm(forms.ModelForm):
class Meta:
model = User
fields = ("first_name", "last_name")
fields = ("first_name", "last_name", "language")
widgets = {
'first_name': forms.TextInput(attrs={'class': 'form-control'}),
'last_name': forms.TextInput(attrs={'class': 'form-control'})
@@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('core', '0004_auto_20150728_1228'),
]
operations = [
migrations.AddField(
model_name='user',
name='language',
field=models.CharField(default=b'en', help_text='Prefered language to display pages.', max_length=10, choices=[(b'cs', '\u010de\u0161tina'), (b'de', 'deutsch'), (b'en', 'english'), (b'es', 'espa\xf1ol'), (b'fr', 'fran\xe7ais'), (b'it', 'italiano'), (b'nl', 'nederlands'), (b'pt_PT', 'portugu\xeas'), (b'pt_BR', 'portugu\xeas (BR)'), (b'ru', '\u0440\u0443\u0441\u0441\u043a\u0438\u0439'), (b'sv', 'svenska')]),
preserve_default=True,
),
]
+9
View File
@@ -23,6 +23,8 @@ from modoboa.lib.exceptions import (
PermDeniedException, InternalError, BadRequest, Conflict
)
from . import constants
try:
from modoboa.lib.ldap_utils import LDAPAuthBackend
@@ -60,6 +62,13 @@ class User(PermissionsMixin):
ugettext_lazy('last login'), default=timezone.now
)
language = models.CharField(
max_length=10, default="en", choices=constants.LANGUAGES,
help_text=ugettext_lazy(
"Prefered language to display pages."
)
)
objects = UserManager()
USERNAME_FIELD = 'username'
@@ -1,9 +1,16 @@
{% load i18n %}{% load url from future %}
<h2>{% trans "Preferences" %} <small>{% trans "Customize Modoboa" %}</small></h2>
<hr>
<form class="form-horizontal" method="POST" action="{% url 'core:user_preferences' %}"
id="uprefs_form">{% csrf_token %}
{% include "common/parameters.html" %}
<hr>
<button type="submit" class="btn btn-primary col-xs-offset-4 col-xs-4" id="update" name="update">{% trans 'Save' %}</button>
</form>
{% if forms %}
<form class="form-horizontal" method="POST" action="{% url 'core:user_preferences' %}"
id="uprefs_form">
{% csrf_token %}
{% include "common/parameters.html" %}
<hr>
<button type="submit" class="btn btn-primary col-xs-offset-4 col-xs-4" id="update" name="update">{% trans 'Save' %}</button>
</form>
{% else %}
<div class="alert alert-info">
{% trans "No preferences available." %}
</div>
{% endif %}
+2 -2
View File
@@ -22,7 +22,7 @@ class ProfileTestCase(ModoTestCase):
* A normal user changes his password
"""
self.ajax_post(reverse("core:user_profile"),
{"oldpassword": "password",
{"language": "en", "oldpassword": "password",
"newpassword": "12345Toi", "confirmation": "12345Toi"})
self.clt.logout()
@@ -42,7 +42,7 @@ class ProfileTestCase(ModoTestCase):
self.ajax_post(
reverse("core:user_profile"),
{"oldpassword": "toto",
{"language": "en", "oldpassword": "toto",
"newpassword": "Toto1234", "confirmation": "Toto1234"}
)
self.clt.logout()
+5 -3
View File
@@ -4,11 +4,12 @@ import logging
from django.contrib.auth import authenticate, login, logout
from django.core.urlresolvers import reverse
from django.http import HttpResponse, HttpResponseRedirect
from django.utils import translation
from django.utils.translation import ugettext as _
from django.views.decorators.cache import never_cache
from modoboa.core.forms import LoginForm
from modoboa.lib import events, parameters
from modoboa.lib import events
from modoboa.lib.web_utils import _render_to_string
@@ -26,8 +27,9 @@ def dologin(request):
if not form.cleaned_data["rememberme"]:
request.session.set_expiry(0)
request.session["django_language"] = \
parameters.get_user(request.user, "LANG")
translation.activate(request.user.language)
request.session[translation.LANGUAGE_SESSION_KEY] = (
request.user.language)
logger.info(
_("User '%s' successfully logged in" % user.username)
+11 -4
View File
@@ -1,15 +1,17 @@
"""Simple user views."""
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
from django.utils import translation
from django.utils.translation import ugettext as _
from modoboa.core.forms import ProfileForm
from django.contrib.auth.decorators import login_required
from modoboa.lib import events, parameters
from modoboa.lib.cryptutils import encrypt
from modoboa.lib.web_utils import (
_render_to_string, render_to_json_response
)
from ..forms import ProfileForm
@login_required
@@ -23,6 +25,7 @@ def index(request, tplname="core/user_index.html"):
@login_required
def profile(request, tplname='core/user_profile.html'):
"""Profile detail/update view."""
update_password = True
if True in events.raiseQueryEvent("PasswordChange", request.user):
update_password = False
@@ -36,8 +39,12 @@ def profile(request, tplname='core/user_profile.html'):
if update_password and form.cleaned_data["confirmation"] != "":
request.session["password"] = encrypt(
form.cleaned_data["confirmation"])
translation.activate(request.user.language)
request.session[translation.LANGUAGE_SESSION_KEY] = (
request.user.language)
return render_to_json_response(_("Profile updated"))
return render_to_json_response({'form_errors': form.errors}, status=400)
return render_to_json_response(
{'form_errors': form.errors}, status=400)
form = ProfileForm(update_password, instance=request.user)
return render_to_json_response({
@@ -50,7 +57,7 @@ def profile(request, tplname='core/user_profile.html'):
@login_required
def preferences(request):
if request.method == "POST":
for formdef in parameters.get_user_forms(request.user, request.POST)():
for formdef in parameters.get_user_forms(request.user, request.POST):
form = formdef["form"]
if form.is_valid():
form.save()
@@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
def move_language_preference(apps, schema_editor):
"""Move language from parameters to User model."""
UserParameter = apps.get_model("lib", "UserParameter")
for uparam in UserParameter.objects.filter(name="core.LANG"):
uparam.user.language = uparam.value
uparam.user.save()
uparam.delete()
class Migration(migrations.Migration):
dependencies = [
('lib', '0003_rename_parameters'),
('core', '0005_user_language'),
]
operations = [
migrations.RunPython(move_language_preference),
]
+10 -10
View File
@@ -332,18 +332,18 @@ def get_admin_forms(*args, **kwargs):
def get_user_forms(user, *args, **kwargs):
"""Return an instance of each user-level forms."""
kwargs["user"] = user
sorted_apps = get_sorted_apps('U', first="general")
def realfunc():
for app in sorted_apps:
formdef = _params['U'][app]
if not formdef["form"].has_access(user):
continue
yield {"label": formdef["label"],
"form": formdef["form"](*args, **kwargs)}
return realfunc
result = []
for app in sorted_apps:
formdef = _params["U"][app]
if not formdef["form"].has_access(user):
continue
result.append({
"label": formdef["label"],
"form": formdef["form"](*args, **kwargs)})
return result
def get_parameter_form(level, name, app=None):