Преглед на файлове

[FEAT] multiple expemse create forms

Adrien Carteron преди 3 години
родител
ревизия
1e4bb56556
променени са 10 файла, в които са добавени 98 реда и са изтрити 39 реда
  1. BIN
      db.sqlite3
  2. 13 3
      expenses/admin.py
  3. 11 2
      expenses/forms.py
  4. 9 3
      expenses/models.py
  5. 15 0
      expenses/templates/expense_create.html
  6. 21 0
      expenses/templates/expense_detail.html
  7. 1 1
      expenses/templates/expense_list.html
  8. 3 0
      expenses/urls.py
  9. 24 6
      expenses/views.py
  10. 1 24
      requirements.txt

BIN
db.sqlite3


+ 13 - 3
expenses/admin.py

@@ -6,6 +6,7 @@ from expenses.models import (
     Expense,
     MultiplePaymentExepense,
     LoneExpense,
+    RawExpense,
 )
 
 
@@ -44,21 +45,29 @@ class LoneExpenseAdmin(admin.ModelAdmin):
     readonly_fields = ["created_at", "modified_at"]
     date_hierarchy = "date"
 
+class RawExpenseAdmin(admin.ModelAdmin):
+    list_display = [
+        "name",
+        "date",
+        "amount",
+    ]
+    date_hierarchy = "date"
+
 
 class MultiplePaymentExepenseAdmin(admin.ModelAdmin):
     list_display = [
         "name",
-        "date",
+        "first_payment_date",
         "amount",
         "number_of_payment",
-        "payments",
+        #"payments",
         "category",
         "source",
         "created_at",
         "modified_at",
     ]
     readonly_fields = ["created_at", "modified_at"]
-    date_hierarchy = "date"
+    date_hierarchy = "first_payment_date"
 
 
 class ExpenseAdmin(admin.ModelAdmin):
@@ -76,3 +85,4 @@ admin.site.register(PhysicalSource, PhysicalSourceAdmin)
 admin.site.register(Category, CategoryAdmin)
 admin.site.register(LoneExpense, LoneExpenseAdmin)
 admin.site.register(MultiplePaymentExepense, MultiplePaymentExepenseAdmin)
+admin.site.register(RawExpense, RawExpenseAdmin)

+ 11 - 2
expenses/forms.py

@@ -2,7 +2,7 @@ from django import forms
 from django.contrib.auth.models import User
 from django.core.exceptions import ValidationError
 
-from expenses.models import Category, Expense, MultiplePaymentExepense, LoneExpense
+from expenses.models import Category, Expense, MultiplePaymentExepense, LoneExpense, RawExpense
 
 
 class CategoryForm(forms.ModelForm):
@@ -26,12 +26,21 @@ class ExpenseForm(forms.ModelForm):
 class MultiplePaymentExepenseForm(forms.ModelForm):
     class Meta:
         model = MultiplePaymentExepense
-        fields = "__all__"
+        fields = ("name", "first_payment_date", "amount", "number_of_payment", "category", "source")
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
 
 
+class SubExpenseForm(forms.ModelForm):
+    class Meta:
+        model = RawExpense
+        fields = ("amount",)
+    def __init__(self, *args, **kwargs):
+        super().__init__(*args, **kwargs)
+
+
+
 class LoneExpenseForm(forms.ModelForm):
     class Meta:
         model = LoneExpense

+ 9 - 3
expenses/models.py

@@ -101,12 +101,18 @@ class Expense(models.Model):
 
 class MultiplePaymentExepense(MetaExpense):
     name = models.CharField(max_length=150)
-    date = models.DateField()
+    first_payment_date = models.DateField()
     amount = models.DecimalField(max_digits=10, decimal_places=2)
-    payments = models.ForeignKey(
-        RawExpense, related_name="multiple_payment_expense", on_delete=models.PROTECT
+    payments = models.ManyToManyField (
+        RawExpense, related_name="multiple_payment_expense"
     )
     number_of_payment = models.PositiveIntegerField()
 
     def __str__(self):
         return self.name
+
+    class Meta:
+        # db_table = 'book' # Permet de personnaliser le nom de la table en BDD
+        verbose_name = "MultiplePaymentExpense"  # Le nom lisbile du modèle
+        verbose_name_plural = "MultiplePaymentExpenses"  # Le nom au pluriel du modèle
+        ordering = ("name", "first_payment_date", "amount") 

+ 15 - 0
expenses/templates/expense_create.html

@@ -0,0 +1,15 @@
+{% extends "base.html" %}
+
+
+{% block content %}
+{% load django_bootstrap5 %}
+
+{% block page_title %}Create expense{% endblock %}
+
+<form action="" method="post">
+    {% csrf_token %}
+    {% bootstrap_form multiple_expense_form %}
+    {% bootstrap_form lone_expense_form %}
+    {% bootstrap_button button_type="submit" content="Submit" %}
+</form>
+{% endblock content %}

+ 21 - 0
expenses/templates/expense_detail.html

@@ -0,0 +1,21 @@
+{% extends "base.html" %}
+
+{% block page_title %}Expense : {{ expense.content_object.name }} {%endblock %}
+
+{% block content %}
+<dl>
+    <dt>Name</dt>
+    <dd>{{ expense.content_object.name }}</dd>
+    <dt>Type</dt>
+    <dd>{{ expense.content_type }}</dd>
+    <dt>Creation date</dt>
+    <dd>{{ category.created_at }}</dd>
+    <dt>Modification date</dt>
+    <dd>{{ category.modified_at }}</dd>
+</dl>
+
+
+
+<a href="{% url 'expenses:expense_list' %}">Revenir à la liste</a>
+
+{% endblock content %}

+ 1 - 1
expenses/templates/expense_list.html

@@ -8,7 +8,7 @@
 
 <ul>
     {% for expense in expenses %}
-    <li><a href="">{{ expense.content_object.name }}</a></li>
+    <li><a href="{% url 'expenses:expense_detail' pk=expense.pk %}"">{{ expense.content_object.name }}</a></li>
     {% endfor %}
 </ul>
 <a class="btn btn-info" href="{% url 'expenses:lone_expense_create' %}">Create category</a>

+ 3 - 0
expenses/urls.py

@@ -9,6 +9,7 @@ from expenses.views import (
     expenses_list,
     lone_expense_create,
     multiple_expense_create,
+    expense_detail,
 )
 
 app_name = "expenses"
@@ -33,4 +34,6 @@ urlpatterns = [
         multiple_expense_create,
         name="multiple_expense_create",
     ),
+    path("expenses/detail/<int:pk>", expense_detail, name="expense_detail"),
+
 ]

+ 24 - 6
expenses/views.py

@@ -15,6 +15,7 @@ from expenses.forms import (
     CategoryForm,
     ExpenseForm,
     LoneExpenseForm,
+    SubExpenseForm,
     MultiplePaymentExepenseForm,
 )
 
@@ -86,15 +87,27 @@ def lone_expense_create(request):
 
 
 def multiple_expense_create(request):
-    form = MultiplePaymentExepenseForm(request.POST or None)
-    if form.is_valid():
-        instance = form.save()
+    multiple_expense_form = MultiplePaymentExepenseForm(request.POST or None)
+    lone_expense_form = SubExpenseForm(request.POST or None)
+    if multiple_expense_form.is_valid() and lone_expense_form.is_valid():
+        multiple_expense = multiple_expense_form.save()
+        lone_expense = lone_expense_form.save(commit=False)
+        lone_expense.date = multiple_expense.first_payment_date
+        lone_expense.name = multiple_expense.name + " 1st payment"
+        lone_expense = lone_expense.save()
+        print(lone_expense)
+        multiple_expense.payments.add(lone_expense)
+        multiple_expense.save()
         expense = Expense(
-            content_object=instance,
+            content_object=multiple_expense,
         )
         expense.save()
         return redirect("expenses:expense_list")
-    return render(request, "lone_expense_create.html", {"form": form})
+    context = {
+            'multiple_expense_form': multiple_expense_form,
+            'lone_expense_form': lone_expense_form,
+        }
+    return render(request, "expense_create.html", context)
 
 
 def create_expense(request):
@@ -106,7 +119,7 @@ def create_expense(request):
         )
         expense.save()
         #        return HttpResponseRedirect('/')
-        return redirect("expenses:expense_create")
+        return redirect("expenses:expense_list")
 
     return render(request, "create_expense.html", {"form": form})
 
@@ -115,3 +128,8 @@ class RawExpenseListView(ListView):
     model = RawExpense
     fields = "__all__"
     template_name = "raw_expenses_list.html"
+
+
+def expense_detail(request, pk):
+    expense = Expense.objects.get(pk=pk)
+    return render(request, "expense_detail.html", {"expense": expense})

+ 1 - 24
requirements.txt

@@ -1,33 +1,10 @@
-asgiref==3.5.2
-asttokens==2.1.0
-backcall==0.2.0
-backports.zoneinfo==0.2.1
+
 black==22.10.0
-click==8.1.3
-decorator==5.1.1
 Django==4.1.3
 django-bootstrap5==22.1
 django-extensions==3.2.1
 django-hijack==3.2.1
 django-shell-plus==1.1.7
-executing==1.2.0
 ipython==8.6.0
 jedi==0.18.1
-matplotlib-inline==0.1.6
 mypy-extensions==0.4.3
-parso==0.8.3
-pathspec==0.10.1
-pexpect==4.8.0
-pickleshare==0.7.5
-platformdirs==2.5.2
-prompt-toolkit==3.0.31
-ptyprocess==0.7.0
-pure-eval==0.2.2
-Pygments==2.13.0
-six==1.16.0
-sqlparse==0.4.3
-stack-data==0.6.0
-tomli==2.0.1
-traitlets==5.5.0
-typing_extensions==4.4.0
-wcwidth==0.2.5