Commit 3023d6d7 authored by Skia's avatar Skia
Browse files

Add CanCreateMixin, and add amount in journals

parent 18db95cf
Pipeline #40 passed with stage
in 1 minute and 7 seconds
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import accounting.models
class Migration(migrations.Migration):
dependencies = [
('accounting', '0002_auto_20160530_1001'),
]
operations = [
migrations.RemoveField(
model_name='bankaccount',
name='rib',
),
migrations.AddField(
model_name='bankaccount',
name='iban',
field=models.CharField(blank=True, verbose_name='iban', max_length=255),
),
migrations.AddField(
model_name='generaljournal',
name='amount',
field=accounting.models.CurrencyField(default=0, max_digits=12, decimal_places=2, verbose_name='amount'),
preserve_default=False,
),
]
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import migrations, models
import accounting.models
class Migration(migrations.Migration):
dependencies = [
('accounting', '0003_auto_20160617_1520'),
]
operations = [
migrations.AlterField(
model_name='generaljournal',
name='amount',
field=accounting.models.CurrencyField(max_digits=12, verbose_name='amount', default=0, decimal_places=2),
),
]
......@@ -27,7 +27,7 @@ class CurrencyField(models.DecimalField):
class BankAccount(models.Model):
name = models.CharField(_('name'), max_length=30)
rib = models.CharField(_('rib'), max_length=255, blank=True)
iban = models.CharField(_('iban'), max_length=255, blank=True)
number = models.CharField(_('account number'), max_length=255, blank=True)
club = models.ForeignKey(Club, related_name="bank_accounts")
......@@ -85,6 +85,23 @@ class GeneralJournal(models.Model):
name = models.CharField(_('name'), max_length=30)
closed = models.BooleanField(_('is closed'), default=False)
club_account = models.ForeignKey(ClubAccount, related_name="journals", null=False)
amount = CurrencyField(_('amount'), default=0)
def __init__(self, *args, **kwargs):
super(GeneralJournal, self).__init__(*args, **kwargs)
def save(self, *args, **kwargs):
if self.id == None:
amount = 0
super(GeneralJournal, self).save(*args, **kwargs)
def can_be_created_by(user):
"""
Method to see if an object can be created by the given user
"""
if user.is_in_group(settings.SITH_GROUPS['accounting-admin']['name']): # TODO: add the treasurer of the club
return True
return False
def is_owned_by(self, user):
"""
......
......@@ -2,8 +2,10 @@ from django.views.generic import ListView, DetailView, RedirectView
from django.views.generic.edit import UpdateView, CreateView, DeleteView
from django.shortcuts import render
from django.core.urlresolvers import reverse_lazy
from django.forms.models import modelform_factory
from django.forms import HiddenInput
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin
from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin, CanCreateMixin
from accounting.models import BankAccount, ClubAccount, GeneralJournal, Operation, AccountingType
# Accounting types
......@@ -113,13 +115,13 @@ class ClubAccountDeleteView(CanEditPropMixin, DeleteView): # TODO change Delete
# Journal views
class JournalCreateView(CanEditMixin, CreateView):
class JournalCreateView(CanCreateMixin, CreateView): # FIXME: anonymous user has been able to create a journal
"""
Create a general journal
"""
model = GeneralJournal
fields = ['name', 'start_date', 'club_account']
template_name = 'accounting/account_edit.jinja'
fields = ['name', 'start_date', 'club_account']
class JournalDetailView(CanViewMixin, DetailView):
"""
......@@ -145,7 +147,7 @@ class OperationCreateView(CanEditMixin, CreateView):
Create an operation
"""
model = Operation
fields = ['journal', 'date', 'cheque_number', 'type']
fields = ['amount', 'journal', 'date', 'cheque_number', 'type']
template_name = 'accounting/account_edit.jinja'
class OperationEditView(CanViewMixin, UpdateView):
......
......@@ -4,7 +4,9 @@
<h3>Club tools</h3>
<p><a href="{{ url('club:club_view', club_id=object.id) }}">Back to club</a></p>
<ul>
<li><a href="{{ url('accounting:club_details', c_account_id=object.club_account.id) }}">{{ object }}</a></li>
{% if object.club_account %}
<li>Accouting: <a href="{{ url('accounting:club_details', c_account_id=object.club_account.id) }}">{{ object }}</a></li>
{% endif %}
</ul>
{% endblock %}
......
......@@ -130,7 +130,7 @@ class User(AbstractBaseUser, PermissionsMixin):
return True
if group_name == settings.SITH_MAIN_MEMBERS_GROUP: # We check the subscription if asked
if 'subscription' in settings.INSTALLED_APPS:
from subscription import Subscriber
from subscription.models import Subscriber
s = Subscriber.objects.filter(pk=self.pk).first()
if s is not None and s.is_subscribed():
return True
......@@ -256,6 +256,14 @@ class AnonymousUser(AuthAnonymousUser):
def __init__(self, request):
super(AnonymousUser, self).__init__()
def is_in_group(self, group_name):
"""
The anonymous user is only the public group
"""
if group_name == settings.SITH_GROUPS['public']['name']:
return True
return False
def is_owner(self, obj):
return False
......
......@@ -12,6 +12,11 @@ def forbidden(request):
def not_found(request):
return HttpResponseNotFound(render(request, "core/404.jinja"))
def can_create(mod, user):
if mod.can_be_created_by(user):
return True
return False
def can_edit_prop(obj, user):
if obj is None or user.is_owner(obj):
return True
......@@ -27,6 +32,19 @@ def can_view(obj, user):
return True
return can_edit(obj, user)
class CanCreateMixin(View):
"""
This view is made to protect any child view that would create an object, and thus, that can not be protected by any
of the following mixin
"""
def dispatch(self, request, *arg, **kwargs):
res = super(CanCreateMixin, self).dispatch(request, *arg, **kwargs)
if hasattr(self, 'model'):
mod = self.model
if can_create(mod, self.request.user):
return res
raise PermissionDenied
class CanEditPropMixin(View):
"""
This view is made to protect any child view that would be showing some properties of an object that are restricted
......
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