فهرست منبع

[FEAT] formular to write expenses

Adrien Carteron 3 سال پیش
والد
کامیت
9b26ea74b3
7فایلهای تغییر یافته به همراه89 افزوده شده و 41 حذف شده
  1. 4 3
      expenses/admin.py
  2. 25 11
      expenses/forms.py
  3. 10 14
      expenses/models.py
  4. 34 3
      expenses/templates/expense_create.html
  5. 1 1
      expenses/templates/expense_list.html
  6. 2 1
      expenses/urls.py
  7. 13 8
      expenses/views.py

+ 4 - 3
expenses/admin.py

@@ -45,6 +45,7 @@ class LoneExpenseAdmin(admin.ModelAdmin):
     readonly_fields = ["created_at", "modified_at"]
     date_hierarchy = "date"
 
+
 class RawExpenseAdmin(admin.ModelAdmin):
     list_display = [
         "name",
@@ -57,17 +58,17 @@ class RawExpenseAdmin(admin.ModelAdmin):
 class MultiplePaymentExepenseAdmin(admin.ModelAdmin):
     list_display = [
         "name",
-        "first_payment_date",
+        "date",
         "amount",
         "number_of_payment",
-        #"payments",
+        # "payments",
         "category",
         "source",
         "created_at",
         "modified_at",
     ]
     readonly_fields = ["created_at", "modified_at"]
-    date_hierarchy = "first_payment_date"
+    date_hierarchy = "date"
 
 
 class ExpenseAdmin(admin.ModelAdmin):

+ 25 - 11
expenses/forms.py

@@ -2,7 +2,13 @@ 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, RawExpense
+from expenses.models import (
+    Category,
+    Expense,
+    MultiplePaymentExepense,
+    LoneExpense,
+    RawExpense,
+)
 
 
 class CategoryForm(forms.ModelForm):
@@ -14,19 +20,21 @@ class CategoryForm(forms.ModelForm):
         super().__init__(*args, **kwargs)
 
 
-class ExpenseForm(forms.ModelForm):
-    class Meta:
-        model = Expense
-        fields = "__all__"
-
-    def __init__(self, *args, **kwargs):
-        super().__init__(*args, **kwargs)
+class ExpenseForm(forms.Form):
+    is_multiple_payment = forms.BooleanField(label="Is mulptiple payment")
 
 
 class MultiplePaymentExepenseForm(forms.ModelForm):
     class Meta:
         model = MultiplePaymentExepense
-        fields = ("name", "first_payment_date", "amount", "number_of_payment", "category", "source")
+        fields = (
+            "name",
+            "date",
+            "amount",
+            "number_of_payment",
+            "category",
+            "source",
+        )
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
@@ -36,15 +44,21 @@ 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
-        fields = "__all__"
+        fields = (
+            "name",
+            "date",
+            "amount",
+            "category",
+            "source",
+        )
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)

+ 10 - 14
expenses/models.py

@@ -3,6 +3,7 @@ from django.contrib.contenttypes.models import ContentType
 from django.contrib.contenttypes.fields import GenericForeignKey
 from dateutil.relativedelta import relativedelta
 
+
 class AuthoringDatesModel(models.Model):
     created_at = models.DateTimeField(auto_now_add=True, null=True)
     modified_at = models.DateTimeField(auto_now=True)
@@ -99,34 +100,29 @@ class Expense(models.Model):
         """ ordering = ("name", "date", "amount")  # Le tri par défaut dans les listes """
 
 
-class MultiplePaymentExepense(MetaExpense):
-    name = models.CharField(max_length=150)
-    first_payment_date = models.DateField()
-    amount = models.DecimalField(max_digits=10, decimal_places=2)
-    payments = models.ManyToManyField (
+class MultiplePaymentExepense(LoneExpense):
+    payments = models.ManyToManyField(
         RawExpense, related_name="multiple_payment_expense"
     )
     number_of_payment = models.PositiveIntegerField()
 
     def set_payments(self, payment):
-        payment.date = self.first_payment_date
+        payment.date = self.date
         payment.name = self.name + " 1st payment"
-        print(payment.name)
-
-        print(payment.amount)
 
         payment.save()
-        print(payment.name)
 
-        print(payment.amount)
         self.payments.add(payment)
         rest_to_pay = (self.amount - payment.amount) / (self.number_of_payment - 1)
         for i in range(1, self.number_of_payment):
-            date = self.first_payment_date + relativedelta(months=i)
-            payment = RawExpense(name=f"{self.name} {i} payment", date=date, amount=rest_to_pay)
+            date = self.date + relativedelta(months=i)
+            payment = RawExpense(
+                name=f"{self.name} {i} payment", date=date, amount=rest_to_pay
+            )
             payment.save()
             self.payments.add(payment)
         self.save()
+        print(self.payments.count())
 
     def __str__(self):
         return self.name
@@ -135,4 +131,4 @@ class MultiplePaymentExepense(MetaExpense):
         # 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") 
+        ordering = ("name", "date", "amount")

+ 34 - 3
expenses/templates/expense_create.html

@@ -5,11 +5,42 @@
 {% load django_bootstrap5 %}
 
 {% block page_title %}Create expense{% endblock %}
+<div class="form-check">
+    <input class="form-check-input" type="checkbox" value="" id="IsMultiple" onchange="handleChange(this)" >
+    <label class="form-check-label" for="flexCheckDefault">
+      Is multiple payment
+    </label>
+</div>
+<div id="display">
+    <form action="" method="post">
+    {% csrf_token %}
+    {% bootstrap_form lone_expense_form %}
+    {% bootstrap_button button_type="submit" content="Submit" %}
+</form>
+</div>
+
 
-<form action="" method="post">
+{% endblock content %}
+{% block extra_js %} 
+<script>
+
+function handleChange(checkbox) {
+    div = document.getElementById('display');
+    if(checkbox.checked == true){
+        div.innerHTML = `<form action="" method="post">
+    {% csrf_token %}
+    {% bootstrap_form mult_expense_form %}
+    {% bootstrap_button button_type="submit" content="Submit" %}
+</form>
+        `        
+    }else{
+        div.innerHTML = `<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 %}
+        `
+   }
+}
+</script>
+{% endblock extra_js %}

+ 1 - 1
expenses/templates/expense_list.html

@@ -11,6 +11,6 @@
     <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:expense_create' %}">Create category</a>
+<a class="btn btn-info" href="{% url 'expenses:lone_expense_create' %}">Create category</a>
 
 {% endblock content %}

+ 2 - 1
expenses/urls.py

@@ -10,6 +10,7 @@ from expenses.views import (
     lone_expense_create,
     multiple_expense_create,
     expense_detail,
+    create_expense,
 )
 
 app_name = "expenses"
@@ -34,6 +35,6 @@ urlpatterns = [
         multiple_expense_create,
         name="multiple_expense_create",
     ),
+    path("expenses/create", create_expense, name="expense_create"),
     path("expenses/detail/<int:pk>", expense_detail, name="expense_detail"),
-
 ]

+ 13 - 8
expenses/views.py

@@ -100,24 +100,29 @@ def multiple_expense_create(request):
         expense.save()
         return redirect("expenses:expense_list")
     context = {
-            'multiple_expense_form': multiple_expense_form,
-            'lone_expense_form': lone_expense_form,
-        }
+        "multiple_expense_form": multiple_expense_form,
+        "lone_expense_form": lone_expense_form,
+    }
     return render(request, "expense_create.html", context)
 
 
 def create_expense(request):
-    form = ExpenseForm(request.POST or None)
-    if form.is_valid():
-        instance = form.save()
+    # form = ExpenseForm(request.POST or None)
+    lone_expense_form = LoneExpenseForm(request.POST or None)
+    mult_expense_form = MultiplePaymentExepenseForm(request.POST or None)
+    if mult_expense_form.is_valid():
+        instance = mult_expense_form.save()
         expense = Expense(
             content_object=instance,
         )
         expense.save()
         #        return HttpResponseRedirect('/')
         return redirect("expenses:expense_list")
-
-    return render(request, "create_expense.html", {"form": form})
+    context = {
+        "mult_expense_form": mult_expense_form,
+        "lone_expense_form": lone_expense_form,
+    }
+    return render(request, "expense_create.html", context)
 
 
 class RawExpenseListView(ListView):