diff --git a/core/migrations/0004_preferences.py b/core/migrations/0004_preferences.py new file mode 100644 index 00000000..14e3d2a3 --- /dev/null +++ b/core/migrations/0004_preferences.py @@ -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)), + ], + ), + ] diff --git a/core/models.py b/core/models.py index 88240a66..fba38ea1 100644 --- a/core/models.py +++ b/core/models.py @@ -280,6 +280,14 @@ class AnonymousUser(AuthAnonymousUser): def get_display_name(self): 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): """There was a lock error on the object""" pass diff --git a/core/templates/core/user_base.jinja b/core/templates/core/user_base.jinja new file mode 100644 index 00000000..1c4dad76 --- /dev/null +++ b/core/templates/core/user_base.jinja @@ -0,0 +1,29 @@ +{% extends "core/base.jinja" %} + +{% block content %} +
{{ profile.get_display_name() }}
+
+Infos +{% if can_edit(profile, request.user) or user.id == profile.id %} + Edit +{% endif %} +{% if can_edit_prop(profile, request.user) %} + Props +{% 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'])) %} + Account +{% endif %} +
+
+ +
+{% block infos %} +{% endblock %} +
+ +{% endblock %} + + + diff --git a/core/templates/core/user_detail.jinja b/core/templates/core/user_detail.jinja index 4e5febd0..f70b995c 100644 --- a/core/templates/core/user_detail.jinja +++ b/core/templates/core/user_detail.jinja @@ -1,22 +1,12 @@ -{% extends "core/base.jinja" %} +{% extends "core/user_base.jinja" %} {% block title %} {{ profile.get_display_name() }}'s profile {% endblock %} -{% block content %} -
-{% if can_edit(profile, request.user) or user.id == profile.id %} - Edit -{% endif %} -{% if can_edit_prop(profile, request.user) %} - Props -{% endif %} -
- +{% block infos %}

User Profile

-

{{ profile.get_full_name() }}

{{ profile.nick_name }}

@@ -24,6 +14,7 @@
{% if user.membership.filter(end_date=None).exists() %} +{# if the user is member of a club, he can view the subscription state #}

{% if get_subscriber(profile).is_subscribed() %} User is subscriber until {{ get_subscriber(profile).subscriptions.last().subscription_end }} diff --git a/core/urls.py b/core/urls.py index 5d1c8b89..647613a2 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,6 +1,7 @@ from django.conf.urls import url, include from core.views import * +from counter.views import UserAccountView urlpatterns = [ url(r'^$', index, name='index'), @@ -28,6 +29,7 @@ urlpatterns = [ url(r'^user/(?P[0-9]+)/edit$', UserUpdateProfileView.as_view(), name='user_edit'), url(r'^user/(?P[0-9]+)/prop$', UserUpdatePropView.as_view(), name='user_prop'), url(r'^user/tools/$', UserToolsView.as_view(), name='user_tools'), + url(r'^user/(?P[0-9]+)/account$', UserAccountView.as_view(), name='user_account'), # Page views url(r'^page/$', PageListView.as_view(), name='page_list'), diff --git a/core/views/user.py b/core/views/user.py index 5f65092b..5df7d101 100644 --- a/core/views/user.py +++ b/core/views/user.py @@ -2,6 +2,7 @@ from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth import logout as auth_logout, views from django.core.urlresolvers import reverse +from django.core.exceptions import PermissionDenied, ObjectDoesNotExist from django.views.generic.edit import UpdateView from django.views.generic import ListView, DetailView, TemplateView import logging diff --git a/counter/migrations/0005_auto_20160717_1029.py b/counter/migrations/0005_auto_20160717_1029.py new file mode 100644 index 00000000..346b1ea4 --- /dev/null +++ b/counter/migrations/0005_auto_20160717_1029.py @@ -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'), + ), + ] diff --git a/counter/migrations/0006_auto_20160717_1033.py b/counter/migrations/0006_auto_20160717_1033.py new file mode 100644 index 00000000..b5abf237 --- /dev/null +++ b/counter/migrations/0006_auto_20160717_1033.py @@ -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'), + ), + ] diff --git a/counter/models.py b/counter/models.py index 69337754..c18732d5 100644 --- a/counter/models.py +++ b/counter/models.py @@ -119,8 +119,8 @@ class Refilling(models.Model): """ counter = models.ForeignKey(Counter, related_name="refillings", blank=False) amount = CurrencyField(_('amount')) - operator = models.ForeignKey(User, related_name="refill_operators", blank=False) - customer = models.ForeignKey(Customer, related_name="refill_customers", blank=False) + operator = models.ForeignKey(User, related_name="refillings_as_operator", blank=False) + customer = models.ForeignKey(Customer, related_name="refillings", blank=False) date = models.DateTimeField(_('date'), auto_now=True) payment_method = models.CharField(_('payment method'), max_length=255, 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) unit_price = CurrencyField(_('unit price')) quantity = models.IntegerField(_('quantity')) - seller = models.ForeignKey(User, related_name="sellers", blank=False) - customer = models.ForeignKey(Customer, related_name="customers", blank=False) + seller = models.ForeignKey(User, related_name="sellings_as_operator", blank=False) + customer = models.ForeignKey(Customer, related_name="buyings", blank=False) date = models.DateTimeField(_('date'), auto_now=True) def __str__(self): diff --git a/counter/templates/counter/user_account.jinja b/counter/templates/counter/user_account.jinja new file mode 100644 index 00000000..edfaef2e --- /dev/null +++ b/counter/templates/counter/user_account.jinja @@ -0,0 +1,16 @@ +{% extends "core/user_base.jinja" %} + +{% block title %} + {{ profile.get_display_name() }}'s account +{% endblock %} + +{% block infos %} +

User account

+

{{ customer.refillings.all() }}

+

{{ customer.buyings.all() }}

+ + +{% endblock %} + + + diff --git a/counter/views.py b/counter/views.py index e778cfcf..aaebffe8 100644 --- a/counter/views.py +++ b/counter/views.py @@ -9,6 +9,7 @@ from django.http import HttpResponseRedirect from django.utils import timezone from django import forms from django.utils.translation import ugettext_lazy as _ +from django.conf import settings import re @@ -345,4 +346,28 @@ class CounterDeleteView(CanEditMixin, DeleteView): template_name = 'core/delete_confirm.jinja' 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 +