''' progress in a book ''' from django.db import models from django.utils import timezone from django.core import validators from .base_model import BookWyrmModel class ProgressMode(models.TextChoices): PAGE = 'PG', 'page' PERCENT = 'PCT', 'percent' class ReadThrough(BookWyrmModel): ''' Store a read through a book in the database. ''' user = models.ForeignKey('User', on_delete=models.PROTECT) book = models.ForeignKey('Edition', on_delete=models.PROTECT) progress = models.IntegerField( validators=[validators.MinValueValidator(0)], null=True, blank=True) progress_mode = models.CharField( max_length=3, choices=ProgressMode.choices, default=ProgressMode.PAGE) start_date = models.DateTimeField( blank=True, null=True) finish_date = models.DateTimeField( blank=True, null=True) def save(self, *args, **kwargs): ''' update user active time ''' self.user.last_active_date = timezone.now() self.user.save() super().save(*args, **kwargs) def create_update(self): if self.progress: return self.progressupdate_set.create( user=self.user, progress=self.progress, mode=self.progress_mode) class ProgressUpdate(BookWyrmModel): ''' Store progress through a book in the database. ''' user = models.ForeignKey('User', on_delete=models.PROTECT) readthrough = models.ForeignKey('ReadThrough', on_delete=models.CASCADE) progress = models.IntegerField(validators=[validators.MinValueValidator(0)]) mode = models.CharField( max_length=3, choices=ProgressMode.choices, default=ProgressMode.PAGE) def save(self, *args, **kwargs): ''' update user active time ''' self.user.last_active_date = timezone.now() self.user.save() super().save(*args, **kwargs)