diff --git a/apps/common/__init__.py b/apps/common/__init__.py index f37bb1dbb0..9d177e93ed 100644 --- a/apps/common/__init__.py +++ b/apps/common/__init__.py @@ -1,6 +1,19 @@ import tempfile +from django.utils.translation import ugettext_lazy as _ + from common.conf import settings as common_settings +from navigation.api import register_links TEMPORARY_DIRECTORY = common_settings.TEMPORARY_DIRECTORY \ if common_settings.TEMPORARY_DIRECTORY else tempfile.mkdtemp() + + +def has_usable_password(context): + return context['request'].user.has_usable_password + +password_change_view = {'text': _(u'change password'), 'view': 'password_change_view', 'famfam': 'computer_key', 'condition': has_usable_password} +current_user_details = {'text': _(u'user details'), 'view': 'current_user_details', 'famfam': 'vcard'} +current_user_edit = {'text': _(u'edit details'), 'view': 'current_user_edit', 'famfam': 'vcard_edit'} + +register_links(['current_user_details', 'current_user_edit', 'password_change_view'], [current_user_details, current_user_edit, password_change_view], menu_name='secondary_menu') diff --git a/apps/common/forms.py b/apps/common/forms.py index c0d410b210..e821ca60b1 100644 --- a/apps/common/forms.py +++ b/apps/common/forms.py @@ -1,6 +1,7 @@ from django import forms from django.utils.translation import ugettext_lazy as _ from django.db import models +from django.contrib.auth.models import User from common.utils import return_attrib from common.widgets import DetailSelectMultiple, PlainWidget @@ -92,3 +93,22 @@ class ChoiceForm(forms.Form): self.fields['selection'].widget.attrs.update({'size': 14, 'class': 'choice_form'}) selection = forms.MultipleChoiceField() + + +class UserForm_view(DetailForm): + """ + Form used to display an user's public details + """ + class Meta: + model = User + fields = ('username', 'first_name', 'last_name', 'email', 'is_staff', 'is_superuser', 'last_login', 'date_joined', 'groups') + + +class UserForm(forms.ModelForm): + """ + Form used to edit an user's mininal fields by the user himself + """ + class Meta: + model = User + fields = ('first_name', 'last_name') + diff --git a/apps/common/urls.py b/apps/common/urls.py index e7fe27401b..82aee3d29d 100644 --- a/apps/common/urls.py +++ b/apps/common/urls.py @@ -7,6 +7,9 @@ urlpatterns = patterns('common.views', url(r'^about/$', direct_to_template, {'template': 'about.html'}, 'about'), url(r'^password/change/done/$', 'password_change_done', (), name='password_change_done'), url(r'^object/multiple/action/$', 'multi_object_action_view', (), name='multi_object_action_view'), + + url(r'^user/$', 'current_user_details', (), 'current_user_details'), + url(r'^user/edit/$', 'current_user_edit', (), 'current_user_edit'), ) urlpatterns += patterns('', diff --git a/apps/common/views.py b/apps/common/views.py index 6e6940bf6e..7118eb8686 100644 --- a/apps/common/views.py +++ b/apps/common/views.py @@ -5,8 +5,9 @@ from django.shortcuts import render_to_response from django.template import RequestContext from django.contrib import messages from django.contrib.contenttypes.models import ContentType +from django.core.urlresolvers import reverse -from common.forms import ChoiceForm +from common.forms import ChoiceForm, UserForm, UserForm_view def password_change_done(request): @@ -131,3 +132,43 @@ def assign_remove(request, left_list, right_list, add_method, remove_method, lef return render_to_response('generic_form.html', context, context_instance=RequestContext(request)) + + +def current_user_details(request): + """ + Display the current user's details + """ + form = UserForm_view(instance=request.user) + + return render_to_response( + 'generic_form.html', { + 'form': form, + 'title': _(u'current user details'), + 'read_only': True, + }, + context_instance=RequestContext(request)) + + +def current_user_edit(request): + """ + Allow an user to edit his own details + """ + + next = request.POST.get('next', request.GET.get('next', request.META.get('HTTP_REFERER', reverse('current_user_details')))) + + if request.method == 'POST': + form = UserForm(instance=request.user, data=request.POST) + if form.is_valid(): + form.save() + messages.success(request, _(u'Current user\'s details updated.')) + return HttpResponseRedirect(next) + else: + form = UserForm(instance=request.user) + + return render_to_response( + 'generic_form.html', { + 'form': form, + 'next': next, + 'title': _(u'edit current user details'), + }, + context_instance=RequestContext(request)) diff --git a/apps/main/templates/base.html b/apps/main/templates/base.html index db358c325c..a8f7512d17 100644 --- a/apps/main/templates/base.html +++ b/apps/main/templates/base.html @@ -115,9 +115,7 @@ {% trans "Anonymous" %} {% else %} {{ user.get_full_name|default:user }} - {% if user.has_usable_password %} - ({% trans "New password" %}) - {% endif %} + {% endif %} @@ -179,11 +177,13 @@ {% if side_bar_search and not web_theme_hide_menus %} {% with "true" as side_bar %} {% with "true" as form_hide_required_text %} + {% with "" as read_only %} {% with "" as object %} {% search_form %} {% endwith %} {% endwith %} {% endwith %} + {% endwith %} {% endif %} {% get_object_navigation_links "secondary_menu" as object_navigation_links %}