Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.2.25 on 2025-10-28 20:00

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('members', '0016_person_unverified_picture'),
]

operations = [
migrations.AddField(
model_name='person',
name='cookie_corner_budget',
field=models.DecimalField(blank=True, decimal_places=2, max_digits=8, null=True),
),
migrations.AddField(
model_name='person',
name='cookie_corner_budget_action',
field=models.CharField(choices=[('warning', 'Warning'), ('block', 'Block')], default='warning', max_length=8, verbose_name='Cookie corner over budget action'),
),
]
13 changes: 13 additions & 0 deletions amelie/members/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -299,6 +299,10 @@ class ShellChoices(models.TextChoices):
BASH = 'bash', _l('Bash')
ZSH = 'zsh', _l('Z shell')

class CookieCornerBudgetAction(models.TextChoices):
WARNING = 'warning', _l('Warning')
BLOCK = 'block', _l('Block')

first_name = models.CharField(max_length=50, verbose_name=_l('First name'))
last_name_prefix = models.CharField(max_length=25, blank=True, verbose_name=_l('Last name pre-fix'))
last_name = models.CharField(max_length=50, verbose_name=_l('Last name'))
Expand Down Expand Up @@ -360,6 +364,15 @@ class ShellChoices(models.TextChoices):
password_reset_expiry = models.DateTimeField(verbose_name=_l('Password reset code expiry'),
null=True, blank=True, editable=False)

cookie_corner_budget = models.DecimalField(max_digits=8,
decimal_places=2,
blank=True,
null=True)
cookie_corner_budget_action = models.CharField(choices=CookieCornerBudgetAction.choices,
default=CookieCornerBudgetAction.WARNING,
max_length=8,
verbose_name=_l('Cookie corner over budget action'))

objects = PersonManager()

class Meta(object):
Expand Down
7 changes: 7 additions & 0 deletions amelie/personal_tab/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
from django.utils.translation import gettext_lazy as _l
from localflavor.generic.forms import BICFormField, IBANFormField

from amelie.members.models import Person
from amelie.style.forms import inject_style
from amelie.personal_tab import statistics
from amelie.personal_tab.models import CustomTransaction, CookieCornerTransaction, RFIDCard, Reversal, AuthorizationType, \
Expand Down Expand Up @@ -33,6 +34,12 @@ class ExamCookieCreditForm(forms.Form):
description = forms.CharField(max_length=200, label=_l('Description'))


class PersonSpendingLimitsForm(forms.ModelForm):
class Meta:
model = Person
fields = ('cookie_corner_budget', 'cookie_corner_budget_action')


class DebtCollectionForm(forms.Form):
description = forms.CharField(max_length=50, label=_l('Description for within Inter-Actief'))
execution_date = forms.DateField(label=_l('Date of execution'), widget=DateSelector)
Expand Down
3 changes: 3 additions & 0 deletions amelie/personal_tab/templates/cookie_corner_dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,9 @@ <h2>
<a href="{% url 'personal_tab:person_exam_cookie_credit_new' person_id=person.pk slug=person.slug %}" class="looks-like-a-button">
{% trans 'Add credit for exams' %}
</a>
<a href="{% url 'personal_tab:person_spending_limits' person_id=person.pk slug=person.slug %}" class="looks-like-a-button">
{% trans 'Manage spending limits' %}
</a>
</div>
{% endif %}
</div></div>
Expand Down
30 changes: 30 additions & 0 deletions amelie/personal_tab/templates/cookie_corner_spending_limits.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{% extends "basis.html" %}
{% load i18n fieldsets %}

{% block titel %}
{% trans 'Edit cookie corner spending limits' %}
{% endblock titel %}

{% block content %}
<form action="" method="post" class="big">
{% csrf_token %}

<div class="col-xs-12">
<div class="ia">
<h2>{% trans 'Cookie corner spending limits' %}</h2>

<div class="content">
{% fieldset cookie_corner_budget,cookie_corner_budget_action as form_basic from form %}
{{ form_basic }}

<p>{% trans 'The specified cookie corner budget is in euros (€)' %}</p>

<div class="buttons">
<input type="submit" value="{% trans 'Save' %}"/>
</div>
</div>
</div>
</div>
</form>
{% endblock content %}

4 changes: 3 additions & 1 deletion amelie/personal_tab/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
AlexiaTransactionDetail, CookieCornerTransactionDetail, \
ReversalTransactionDetail, TransactionDetail, AuthorizationTerminateView, \
AuthorizationAnonymizeView, CustomTransactionUpdate, CustomTransactionDelete, CookieCornerTransactionUpdate, \
CookieCornerTransactionDelete
CookieCornerTransactionDelete, PersonSpendingLimits

app_name = 'personal_tab'

Expand Down Expand Up @@ -59,6 +59,8 @@
path('person/<int:person_id>/<slug:slug>/exam_cookie_credit/new/', views.person_exam_cookie_credit_new,
name='person_exam_cookie_credit_new'),

path('person/<int:person_id>/<slug:slug>/spending_limits', PersonSpendingLimits.as_view(), name='person_spending_limits'),

path('rfid/<int:rfid_id>/edit/<str:status>/', views.rfid_change_status, name='rfid_change_status'),
path('rfid/<int:rfid_id>/remove/', views.rfid_remove, name='rfid_remove'),

Expand Down
14 changes: 12 additions & 2 deletions amelie/personal_tab/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,9 @@
from amelie.personal_tab.alexia import get_alexia, parse_datetime
from amelie.personal_tab.helpers import kcal_equivalent
from amelie.personal_tab.forms import CookieCornerTransactionForm, CustomTransactionForm, ExamCookieCreditForm, \
DebtCollectionForm, ReversalForm, SearchAuthorizationForm, AmendmentForm, DebtCollectionBatchForm, AuthorizationSelectForm, \
StatisticsForm
DebtCollectionForm, ReversalForm, SearchAuthorizationForm, AmendmentForm, DebtCollectionBatchForm, \
AuthorizationSelectForm, \
StatisticsForm, PersonSpendingLimitsForm
from amelie.personal_tab.debt_collection import generate_contribution_instructions, filter_contribution_instructions, \
save_contribution_instructions, generate_cookie_corner_instructions, filter_cookie_corner_instructions, save_cookie_corner_instructions, \
process_reversal, process_amendment
Expand Down Expand Up @@ -798,6 +799,15 @@ def person_exam_cookie_credit_new(request, person_id, slug):
})


class PersonSpendingLimits(RequirePersonMixin, UpdateView):
model = Person
form_class = PersonSpendingLimitsForm
template_name = 'cookie_corner_spending_limits.html'

def get_success_url(self):
return reverse('personal_tab:dashboard', kwargs={'pk': self.object.pk, 'slug': self.object.slug})


@require_board
def statistics_form(request):
if request.method == 'POST':
Expand Down