diff --git a/apps/family/forms.py b/apps/family/forms.py
new file mode 100644
index 00000000..63b47f48
--- /dev/null
+++ b/apps/family/forms.py
@@ -0,0 +1,21 @@
+# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay
+# SPDX-License-Identifier: GPL-3.0-or-later
+
+from django import forms
+from django.forms.widgets import NumberInput
+from django.utils.translation import gettext_lazy as _
+from note_kfet.inputs import Autocomplete
+
+from .models import Challenge, FamilyMembership, User
+
+
+class ChallengeUpdateForm(forms.ModelForm):
+ """
+ To update a challenge
+ """
+ class Meta:
+ model = Challenge
+ fields = ('name', 'description', 'points',)
+ widgets = {
+ "points": NumberInput()
+ }
diff --git a/apps/family/templates/family/challenge_detail.html b/apps/family/templates/family/challenge_detail.html
index 44addf57..23cb3f93 100644
--- a/apps/family/templates/family/challenge_detail.html
+++ b/apps/family/templates/family/challenge_detail.html
@@ -26,7 +26,11 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% trans "Return to the challenge list" %}
-
+ {% if update %}
+
+ {% trans "Update" %}
+
+ {% endif %}
{% endblock %}
diff --git a/apps/family/templates/family/challenge_update.html b/apps/family/templates/family/challenge_update.html
new file mode 100644
index 00000000..27c7bed2
--- /dev/null
+++ b/apps/family/templates/family/challenge_update.html
@@ -0,0 +1,21 @@
+{% extends "base.html" %}
+{% comment %}
+Copyright (C) 2018-2025 by BDE ENS Paris-Saclay
+SPDX-License-Identifier: GPL-3.0-or-later
+{% endcomment %}
+{% load i18n crispy_forms_tags %}
+
+{% block content %}
+
+{% endblock %}
diff --git a/apps/family/views.py b/apps/family/views.py
index d8072dbb..4b710681 100644
--- a/apps/family/views.py
+++ b/apps/family/views.py
@@ -1,15 +1,19 @@
# Copyright (C) 2018-2025 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later
+from datetime import date
+
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic import DetailView, UpdateView
from django.utils.translation import gettext_lazy as _
from django_tables2 import SingleTableView
from permission.backends import PermissionBackend
from permission.views import ProtectQuerysetMixin, ProtectedCreateView
+from django.urls import reverse_lazy
-from .models import Family, Challenge
-from .tables import FamilyTable, ChallengeTable
+from .models import Family, Challenge, FamilyMembership, User
+from .tables import FamilyTable, ChallengeTable, FamilyMembershipTable
+from .forms import ChallengeUpdateForm
class FamilyCreateView(ProtectQuerysetMixin, ProtectedCreateView):
@@ -68,6 +72,9 @@ class ChallengeCreateView(ProtectQuerysetMixin, ProtectedCreateView):
description="Sample challenge",
points=0,
)
+
+ def get_success_url(self):
+ return reverse_lazy('family:challenge_list')
class ChallengeListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView):
@@ -101,6 +108,7 @@ class ChallengeDetailView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
return context
+
class ChallengeUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
"""
Update the information of a challenge
@@ -109,3 +117,8 @@ class ChallengeUpdateView(ProtectQuerysetMixin, LoginRequiredMixin, UpdateView):
context_object_name = "challenge"
extra_context = {"title": _('Update challenge')}
template_name = 'family/challenge_update.html'
+ form_class = ChallengeUpdateForm
+
+ def get_success_url(self, **kwargs):
+ self.object.refresh_from_db()
+ return reverse_lazy('family:challenge_detail', kwargs={'pk': self.object.pk})
\ No newline at end of file