Add basic account view for user and refactor user tool bar

This commit is contained in:
Skia 2016-07-17 12:38:02 +02:00
parent c099cc489b
commit e92a73dfb1
11 changed files with 165 additions and 16 deletions

View File

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
class Migration(migrations.Migration):
dependencies = [
('core', '0003_auto_20160705_2304'),
]
operations = [
migrations.CreateModel(
name='Preferences',
fields=[
('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)),
('show_my_stats', models.BooleanField(verbose_name='define if we show a users stats', default=False, help_text='Show your account statistics to others')),
('user', models.OneToOneField(related_name='preferences', to=settings.AUTH_USER_MODEL)),
],
),
]

View File

@ -280,6 +280,14 @@ class AnonymousUser(AuthAnonymousUser):
def get_display_name(self): def get_display_name(self):
return _("Visitor") return _("Visitor")
class Preferences(models.Model):
user = models.OneToOneField(User, related_name="preferences")
show_my_stats = models.BooleanField(
_('define if we show a users stats'),
default=False,
help_text=_('Show your account statistics to others'),
)
class LockError(Exception): class LockError(Exception):
"""There was a lock error on the object""" """There was a lock error on the object"""
pass pass

View File

@ -0,0 +1,29 @@
{% extends "core/base.jinja" %}
{% block content %}
<div>{{ profile.get_display_name() }}</div>
<div class="tool-bar">
<a href="{{ url('core:user_profile', user_id=profile.id) }}">Infos</a>
{% if can_edit(profile, request.user) or user.id == profile.id %}
<a href="{{ url('core:user_edit', user_id=profile.id) }}">Edit</a>
{% endif %}
{% if can_edit_prop(profile, request.user) %}
<a href="{{ url('core:user_prop', user_id=profile.id) }}">Props</a>
{% endif %}
{% if (profile == request.user
or request.user.is_in_group(settings.SITH_GROUPS['accounting-admin']['name'])
or request.user.is_in_group(settings.SITH_GROUPS['root']['name'])) %}
<a href="{{ url('core:user_account', user_id=profile.id) }}">Account</a>
{% endif %}
<hr>
</div>
<div>
{% block infos %}
{% endblock %}
</div>
{% endblock %}

View File

@ -1,22 +1,12 @@
{% extends "core/base.jinja" %} {% extends "core/user_base.jinja" %}
{% block title %} {% block title %}
{{ profile.get_display_name() }}'s profile {{ profile.get_display_name() }}'s profile
{% endblock %} {% endblock %}
{% block content %} {% block infos %}
<div class="edit-bar">
{% if can_edit(profile, request.user) or user.id == profile.id %}
<a href="{{ url('core:user_edit', user_id=profile.id) }}">Edit</a>
{% endif %}
{% if can_edit_prop(profile, request.user) %}
<a href="{{ url('core:user_prop', user_id=profile.id) }}">Props</a>
{% endif %}
</div>
<h3>User Profile</h3> <h3>User Profile</h3>
<hr>
<div class="user_profile"> <div class="user_profile">
<h4>{{ profile.get_full_name() }}</h4> <h4>{{ profile.get_full_name() }}</h4>
<p>{{ profile.nick_name }}</p> <p>{{ profile.nick_name }}</p>
@ -24,6 +14,7 @@
</div> </div>
{% if user.membership.filter(end_date=None).exists() %} {% if user.membership.filter(end_date=None).exists() %}
{# if the user is member of a club, he can view the subscription state #}
<p> <p>
{% if get_subscriber(profile).is_subscribed() %} {% if get_subscriber(profile).is_subscribed() %}
User is subscriber until {{ get_subscriber(profile).subscriptions.last().subscription_end }} User is subscriber until {{ get_subscriber(profile).subscriptions.last().subscription_end }}

View File

@ -1,6 +1,7 @@
from django.conf.urls import url, include from django.conf.urls import url, include
from core.views import * from core.views import *
from counter.views import UserAccountView
urlpatterns = [ urlpatterns = [
url(r'^$', index, name='index'), url(r'^$', index, name='index'),
@ -28,6 +29,7 @@ urlpatterns = [
url(r'^user/(?P<user_id>[0-9]+)/edit$', UserUpdateProfileView.as_view(), name='user_edit'), url(r'^user/(?P<user_id>[0-9]+)/edit$', UserUpdateProfileView.as_view(), name='user_edit'),
url(r'^user/(?P<user_id>[0-9]+)/prop$', UserUpdatePropView.as_view(), name='user_prop'), url(r'^user/(?P<user_id>[0-9]+)/prop$', UserUpdatePropView.as_view(), name='user_prop'),
url(r'^user/tools/$', UserToolsView.as_view(), name='user_tools'), url(r'^user/tools/$', UserToolsView.as_view(), name='user_tools'),
url(r'^user/(?P<user_id>[0-9]+)/account$', UserAccountView.as_view(), name='user_account'),
# Page views # Page views
url(r'^page/$', PageListView.as_view(), name='page_list'), url(r'^page/$', PageListView.as_view(), name='page_list'),

View File

@ -2,6 +2,7 @@
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth import logout as auth_logout, views from django.contrib.auth import logout as auth_logout, views
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.core.exceptions import PermissionDenied, ObjectDoesNotExist
from django.views.generic.edit import UpdateView from django.views.generic.edit import UpdateView
from django.views.generic import ListView, DetailView, TemplateView from django.views.generic import ListView, DetailView, TemplateView
import logging import logging

View File

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
from django.conf import settings
class Migration(migrations.Migration):
dependencies = [
('counter', '0004_auto_20160717_0933'),
]
operations = [
migrations.AlterField(
model_name='refilling',
name='customer',
field=models.ForeignKey(to='counter.Customer', related_name='refillings'),
),
migrations.AlterField(
model_name='refilling',
name='operator',
field=models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='refillings_as_operator'),
),
migrations.AlterField(
model_name='selling',
name='customer',
field=models.ForeignKey(to='counter.Customer', related_name='sellings'),
),
migrations.AlterField(
model_name='selling',
name='seller',
field=models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='sellings_as_operator'),
),
]

View File

@ -0,0 +1,19 @@
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('counter', '0005_auto_20160717_1029'),
]
operations = [
migrations.AlterField(
model_name='selling',
name='customer',
field=models.ForeignKey(to='counter.Customer', related_name='buyings'),
),
]

View File

@ -119,8 +119,8 @@ class Refilling(models.Model):
""" """
counter = models.ForeignKey(Counter, related_name="refillings", blank=False) counter = models.ForeignKey(Counter, related_name="refillings", blank=False)
amount = CurrencyField(_('amount')) amount = CurrencyField(_('amount'))
operator = models.ForeignKey(User, related_name="refill_operators", blank=False) operator = models.ForeignKey(User, related_name="refillings_as_operator", blank=False)
customer = models.ForeignKey(Customer, related_name="refill_customers", blank=False) customer = models.ForeignKey(Customer, related_name="refillings", blank=False)
date = models.DateTimeField(_('date'), auto_now=True) date = models.DateTimeField(_('date'), auto_now=True)
payment_method = models.CharField(_('payment method'), max_length=255, payment_method = models.CharField(_('payment method'), max_length=255,
choices=settings.SITH_COUNTER_PAYMENT_METHOD, default='cash') choices=settings.SITH_COUNTER_PAYMENT_METHOD, default='cash')
@ -147,8 +147,8 @@ class Selling(models.Model):
counter = models.ForeignKey(Counter, related_name="sellings", blank=False) counter = models.ForeignKey(Counter, related_name="sellings", blank=False)
unit_price = CurrencyField(_('unit price')) unit_price = CurrencyField(_('unit price'))
quantity = models.IntegerField(_('quantity')) quantity = models.IntegerField(_('quantity'))
seller = models.ForeignKey(User, related_name="sellers", blank=False) seller = models.ForeignKey(User, related_name="sellings_as_operator", blank=False)
customer = models.ForeignKey(Customer, related_name="customers", blank=False) customer = models.ForeignKey(Customer, related_name="buyings", blank=False)
date = models.DateTimeField(_('date'), auto_now=True) date = models.DateTimeField(_('date'), auto_now=True)
def __str__(self): def __str__(self):

View File

@ -0,0 +1,16 @@
{% extends "core/user_base.jinja" %}
{% block title %}
{{ profile.get_display_name() }}'s account
{% endblock %}
{% block infos %}
<h3>User account</h3>
<p>{{ customer.refillings.all() }}</p>
<p>{{ customer.buyings.all() }}</p>
{% endblock %}

View File

@ -9,6 +9,7 @@ from django.http import HttpResponseRedirect
from django.utils import timezone from django.utils import timezone
from django import forms from django import forms
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
from django.conf import settings
import re import re
@ -345,4 +346,28 @@ class CounterDeleteView(CanEditMixin, DeleteView):
template_name = 'core/delete_confirm.jinja' template_name = 'core/delete_confirm.jinja'
success_url = reverse_lazy('counter:admin_list') success_url = reverse_lazy('counter:admin_list')
# User accounting infos
class UserAccountView(DetailView):
"""
Display a user's account
"""
model = Customer
pk_url_kwarg = "user_id"
template_name = "counter/user_account.jinja"
def dispatch(self, request, *arg, **kwargs):
res = super(UserAccountView, self).dispatch(request, *arg, **kwargs)
if (self.object.user == request.user
or request.user.is_in_group(settings.SITH_GROUPS['accounting-admin']['name'])
or request.user.is_in_group(settings.SITH_GROUPS['root']['name'])):
return res
raise PermissionDenied
def get_context_data(self, **kwargs):
kwargs = super(UserAccountView, self).get_context_data(**kwargs)
kwargs['profile'] = self.object.user
# TODO: add list of month where account has activity
return kwargs