Reworked DB structure
This commit is contained in:
+55
-52
@@ -1,79 +1,82 @@
|
||||
from django.db import models
|
||||
from django.core.validators import RegexValidator
|
||||
from django.core.validators import MinValueValidator
|
||||
from django.core.validators import MaxValueValidator
|
||||
|
||||
|
||||
class FaerunDate:
|
||||
LAST_MONTH = 18
|
||||
LEAP_MONTH = 11
|
||||
ONE_DAY_MONTHS = (2, 6, 10, 11, 14, 17)
|
||||
LAST_DAY = 30
|
||||
class YearData(models.Model):
|
||||
number = models.SmallIntegerField('Number', validators=[
|
||||
RegexValidator(r'^-?[1-9]\d{0,3}$', 'Year must be not zero and between -9999 and 9999')
|
||||
])
|
||||
|
||||
def __init__(self, year: int, month: int, day: int):
|
||||
self.year = year
|
||||
self.month = month
|
||||
self.day = day
|
||||
self.is_leap_year = self._is_leap_year()
|
||||
self.is_valid = self._is_valid()
|
||||
|
||||
def __repr__(self):
|
||||
return f'{type(self).__name__}({self.year}, {self.month}, {self.day})'
|
||||
|
||||
def _is_leap_year(self) -> bool:
|
||||
if self.year == 0:
|
||||
@property
|
||||
def is_leap(self):
|
||||
if self.number == 0:
|
||||
return False
|
||||
elif self.year % 400 == 0:
|
||||
elif self.number % 400 == 0:
|
||||
return True
|
||||
elif self.year % 100 == 0:
|
||||
elif self.number % 100 == 0:
|
||||
return False
|
||||
elif self.year % 4 == 0:
|
||||
elif self.number % 4 == 0:
|
||||
return True
|
||||
return False
|
||||
|
||||
def _is_valid(self) -> bool:
|
||||
if self.year == 0:
|
||||
return False
|
||||
|
||||
if not 0 < self.month <= FaerunDate.LAST_MONTH:
|
||||
return False
|
||||
|
||||
if not self.is_leap_year and self.month == self.__class__.LEAP_MONTH:
|
||||
return False
|
||||
|
||||
if not 0 < self.day <= FaerunDate.LAST_DAY:
|
||||
return False
|
||||
|
||||
if self.day > 1 and self.month in FaerunDate.ONE_DAY_MONTHS:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
class CalendarData(models.Model):
|
||||
current_year = models.SmallIntegerField('CurrentYear')
|
||||
current_month = models.SmallIntegerField('CurrentMonth')
|
||||
current_day = models.SmallIntegerField('CurrentDay')
|
||||
leap_month = models.SmallIntegerField('LeapMonth')
|
||||
|
||||
def __str__(self):
|
||||
return f'({self.current_year}, {self.current_month}, {self.current_day}, {self.leap_month})'
|
||||
return f'({self.number}, {self.is_leap})'
|
||||
|
||||
|
||||
class MonthData(models.Model):
|
||||
number = models.SmallIntegerField('Number', unique=True)
|
||||
number = models.SmallIntegerField('Number', unique=True, validators=[
|
||||
MinValueValidator(1),
|
||||
MaxValueValidator(18),
|
||||
])
|
||||
name = models.CharField('Name', max_length=64, unique=True)
|
||||
folkname = models.CharField('Folkname', max_length=64, blank=True)
|
||||
is_oneday = models.BooleanField('IsOneday')
|
||||
is_leap_month = models.BooleanField('IsLeapMonth')
|
||||
|
||||
def __str__(self):
|
||||
return f'({self.number}, {self.name}, {self.folkname}, {self.is_oneday})'
|
||||
return f'({self.number}, {self.name}, {self.folkname}, {self.is_oneday}, {self.is_leap_month})'
|
||||
|
||||
|
||||
class DayData(models.Model):
|
||||
number = models.SmallIntegerField('Number', unique=True, validators=[
|
||||
MinValueValidator(1),
|
||||
MaxValueValidator(30),
|
||||
])
|
||||
month = models.ForeignKey(MonthData, on_delete=models.CASCADE)
|
||||
year = models.ForeignKey(YearData, on_delete=models.CASCADE)
|
||||
|
||||
def __str__(self):
|
||||
return f'({self.number, self.month})'
|
||||
|
||||
|
||||
class CalendarData(models.Model):
|
||||
current_day = models.ForeignKey(DayData, on_delete=models.CASCADE)
|
||||
|
||||
def __str__(self):
|
||||
return f'({self.current_day})'
|
||||
|
||||
@property
|
||||
def current_month(self):
|
||||
try:
|
||||
return getattr(self.current_day, 'month')
|
||||
except AttributeError:
|
||||
return None
|
||||
|
||||
@property
|
||||
def current_year(self):
|
||||
try:
|
||||
return getattr(self.current_day, 'year')
|
||||
except AttributeError:
|
||||
return None
|
||||
|
||||
|
||||
class Event(models.Model):
|
||||
year = models.SmallIntegerField('Year')
|
||||
month = models.SmallIntegerField('Month')
|
||||
day = models.SmallIntegerField('Day')
|
||||
day = models.ForeignKey(DayData, on_delete=models.CASCADE)
|
||||
time = models.TimeField('Time')
|
||||
title = models.CharField('Title', max_length=250)
|
||||
description = models.TextField('Description', max_length=2500)
|
||||
|
||||
def __str__(self):
|
||||
return f'({self.year}, {self.month}, {self.day}, {self.time}, {self.title})'
|
||||
return f'({self.day}, {self.time}, {self.title})'
|
||||
|
||||
Reference in New Issue
Block a user