-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmodels.py
56 lines (49 loc) · 2.21 KB
/
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_migrate
from django.dispatch import receiver
from datetime import timedelta, date
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Transaction(models.Model):
FREQUENCY_CHOICES = [
('daily', 'Daily'),
('monthly', 'Monthly'),
('quarterly', 'Quarterly'),
('yearly', 'Yearly'),
]
user = models.ForeignKey(User, on_delete=models.CASCADE)
amount = models.DecimalField(max_digits=10, decimal_places=2)
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
transaction_type = models.CharField(max_length=10, choices=[('income', 'Income'), ('expense', 'Expense')])
date = models.DateField(default=date.today)
description = models.CharField(max_length=255)
frequency = models.CharField(max_length=10, choices=FREQUENCY_CHOICES, blank=True, null=True)
is_income = models.BooleanField(default=False)
next_due_date = models.DateField(blank=True, null=True)
is_automated = models.BooleanField(default=False)
def save(self, *args, **kwargs):
if self.frequency and not self.next_due_date:
self.next_due_date = self.calculate_next_due_date()
super().save(*args, **kwargs)
def calculate_next_due_date(self):
if not self.date:
return None # Safeguard if date is somehow unset
# Calculate the next due date based on frequency
if self.frequency == 'daily':
return self.date + timedelta(days=1)
elif self.frequency == 'monthly':
return self.date + timedelta(days=30)
elif self.frequency == 'quarterly':
return self.date + timedelta(days=90)
elif self.frequency == 'yearly':
return self.date + timedelta(days=365)
return None
# Django Signal to create default categories after migrations
@receiver(post_migrate)
def create_default_categories(sender, **kwargs):
categories = ['Groceries', 'Rent', 'Utilities', 'Income', 'Savings']
for category in categories:
Category.objects.get_or_create(name=category)