import uuid from django.utils.translation import gettext_lazy as _ from django.contrib.auth.models import User from django.db import models from user.enums import UserNotificationEnum class UserNotification(models.Model): """ Notifications for users """ id = models.CharField( max_length=500, null=False, blank=False, choices=UserNotificationEnum.as_choices(drop_empty_choice=True), primary_key=True, ) name = models.CharField( max_length=500, null=False, blank=False, unique=True, help_text="Human readable name" ) is_active = models.BooleanField(default=True, help_text="Can be toggle to enable/disable this notification for all users") def __str__(self): return self.name class KonovaUserExtension(models.Model): """ Extension model for additional ksp features Extends the default user model for some extras """ user = models.OneToOneField(User, on_delete=models.CASCADE) notifications = models.ManyToManyField(UserNotification, related_name="+") class UserAction(models.TextChoices): """ Defines different possible user actions for UserActionLogEntry """ CHECKED = "checked", _("Checked") RECORDED = "recorded", _("Recorded") UNRECORDED = "unrecorded", _("Unrecorded") CREATED = "created", _("Created") EDITED = "edited", _("Edited") DELETED = "deleted", _("Deleted") class UserActionLogEntry(models.Model): """ Wraps a user action log entry Can be used for workflow related attributes like checking or recording. """ id = models.UUIDField( primary_key=True, default=uuid.uuid4, ) user = models.ForeignKey(User, related_name='+', on_delete=models.CASCADE, help_text="Performing user") timestamp = models.DateTimeField(auto_now_add=True, help_text="Timestamp of performed action") action = models.CharField( max_length=255, null=True, blank=True, help_text="Short name for performed action - optional", choices=UserAction.choices, ) comment = models.CharField(max_length=255, null=True, blank=True, help_text="Additional comment on this entry") class Meta: ordering = ( "-timestamp", ) def __str__(self): return "{} | {} | {}".format(self.user.username, self.timestamp, self.action) @property def action_humanize(self): """ Returns humanized version of enum Used for template rendering Returns: """ choices = UserAction.choices for choice in choices: if choice[0] == self.action: return choice[1] return None