diff options
-rw-r--r-- | ishtar_common/forms_common.py | 34 | ||||
-rw-r--r-- | ishtar_common/models.py | 14 | ||||
-rw-r--r-- | ishtar_common/templates/navbar.html | 12 | ||||
-rw-r--r-- | ishtar_common/urls.py | 1 | ||||
-rw-r--r-- | ishtar_common/views.py | 19 |
5 files changed, 76 insertions, 4 deletions
diff --git a/ishtar_common/forms_common.py b/ishtar_common/forms_common.py index c7cea9bdc..06debe9ce 100644 --- a/ishtar_common/forms_common.py +++ b/ishtar_common/forms_common.py @@ -731,6 +731,39 @@ class FinalAccountForm(forms.Form): return super(FinalAccountForm, self).__init__(*args, **kwargs) +class ProfilePersonForm(forms.Form): + current_profile = forms.ChoiceField(label=_(u"Current profile"), + choices=[]) + + def __init__(self, *args, **kwargs): + self.user = kwargs.pop('user') + choices, initial = [], kwargs.get('initial', {}) + for profile in self.user.ishtaruser.person.profiles.all(): + if profile.current: + initial['current_profile'] = profile.pk + choices.append((profile.pk, unicode(profile))) + kwargs['initial'] = initial + super(ProfilePersonForm, self).__init__(*args, **kwargs) + self.fields['current_profile'].choices = choices + + def save(self, *args, **kwargs): + q = models.UserProfile.objects.filter( + person__ishtaruser=self.user.ishtaruser, current=True) + for profile in q.all(): + profile.current = False + profile.save() + + q = models.UserProfile.objects.filter( + person__ishtaruser=self.user.ishtaruser, + pk=int(self.cleaned_data['current_profile']) + ) + if not q.count(): + return + profile = q.all()[0] + profile.current = True + profile.save() + + class TownForm(forms.Form): form_label = _("Towns") base_model = 'town' @@ -1009,6 +1042,7 @@ class AuthorFormSet(FormSet): return self.check_duplicate(('author',), _("There are identical authors.")) + AuthorFormset = formset_factory(AuthorFormSelection, can_delete=True, formset=AuthorFormSet) AuthorFormset.form_label = _("Authors") diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 9aaf7bab1..a6fc8722d 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -2670,6 +2670,9 @@ class UserProfile(models.Model): verbose_name = _(u"User profile") verbose_name_plural = _(u"User profiles") + def __unicode__(self): + return unicode(self.profile_type) + class IshtarUser(FullSearch): TABLE_COLS = ('username', 'person__name', 'person__surname', @@ -2706,6 +2709,17 @@ class IshtarUser(FullSearch): def __unicode__(self): return unicode(self.person) + @property + def current_profile_name(self): + q = UserProfile.objects.filter(current=True, person__ishtaruser=self) + if q.count(): + return q.values('profile_type__label').all()[0][ + 'profile_type__label'] + profile = self.person.current_profile + if not profile: + return u"" + return unicode(profile) + @classmethod def set_superuser(cls, user): q = cls.objects.filter(user_ptr=user) diff --git a/ishtar_common/templates/navbar.html b/ishtar_common/templates/navbar.html index a5c135a59..0ea06bff8 100644 --- a/ishtar_common/templates/navbar.html +++ b/ishtar_common/templates/navbar.html @@ -22,14 +22,20 @@ {% if user.is_authenticated %} <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" data-toggle="dropdown" - href="#" role="button" aria-haspopup="true" aria-expanded="false">{{ user.username }}</a> + href="#" role="button" aria-haspopup="true" + aria-expanded="false"> + {{ user.username }} / {{user.ishtaruser.current_profile_name}} + </a> <div class="dropdown-menu dropdown-menu-right"> - <a class="dropdown-item" href="{% url 'auth_logout' %}"> - {% trans "Log out" %} + <a class="dropdown-item" href="{% url 'profile' %}"> + {% trans "Profile" %} </a> <a class="dropdown-item" href="{% url 'auth_password_change' %}"> {% trans "Change password" %} </a> + <a class="dropdown-item" href="{% url 'auth_logout' %}"> + {% trans "Log out" %} + </a> </div> </li> {% else %} diff --git a/ishtar_common/urls.py b/ishtar_common/urls.py index 538041b82..04d6acfb2 100644 --- a/ishtar_common/urls.py +++ b/ishtar_common/urls.py @@ -122,6 +122,7 @@ urlpatterns = [ kwargs={'all_pages': True}), url(r'^import-step-by-step/(?P<pk>[0-9]+)/(?P<line_number>[0-9]+)/$', views.ImportStepByStepView.as_view(), name='import_step_by_step'), + url(r'^profile/', views.ProfileEdit.as_view(), name='profile'), ] actions = [] diff --git a/ishtar_common/views.py b/ishtar_common/views.py index decbef589..0e53e7d1f 100644 --- a/ishtar_common/views.py +++ b/ishtar_common/views.py @@ -51,7 +51,7 @@ from django.shortcuts import redirect, render from django.template import loader from django.utils.decorators import method_decorator from django.utils.translation import ugettext, ugettext_lazy as _ -from django.views.generic import ListView, UpdateView, TemplateView +from django.views.generic import ListView, UpdateView, TemplateView, FormView from django.views.generic.edit import CreateView, DeleteView, FormView from xhtml2odt import xhtml2odt @@ -1743,6 +1743,23 @@ class AdminLoginRequiredMixin(LoginRequiredMixin): request, *args, **kwargs) +class ProfileEdit(LoginRequiredMixin, FormView): + template_name = 'ishtar/form.html' + form_class = forms.ProfilePersonForm + + def get_success_url(self): + return reverse('profile') + + def get_form_kwargs(self): + kwargs = super(ProfileEdit, self).get_form_kwargs() + kwargs['user'] = self.request.user + return kwargs + + def form_valid(self, form): + form.save() + return HttpResponseRedirect(self.get_success_url()) + + class DisplayItemView(IshtarMixin, LoginRequiredMixin, TemplateView): template_name = 'ishtar/display_item.html' |