Commit e92a73df authored by Skia's avatar Skia
Browse files

Add basic account view for user and refactor user tool bar

parent c099cc48
# -*- 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)),
],
),
]
...@@ -280,6 +280,14 @@ class AnonymousUser(AuthAnonymousUser): ...@@ -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
......
{% 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 %}
{% 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 @@ ...@@ -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 }}
......
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 = [ ...@@ -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'),
......
...@@ -2,6 +2,7 @@ ...@@ -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
......
# -*- 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'),
),
]
# -*- 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'),
),
]
...@@ -119,8 +119,8 @@ class Refilling(models.Model): ...@@ -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): ...@@ -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):
......
{% 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 %}
...@@ -9,6 +9,7 @@ from django.http import HttpResponseRedirect ...@@ -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): ...@@ -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
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment