96 lines
3.0 KiB
Python
96 lines
3.0 KiB
Python
# -*- encoding: utf-8 -*-
|
|
|
|
import uuid
|
|
import bleach
|
|
from datetime import timedelta, datetime
|
|
|
|
from django.db import models
|
|
from django.conf import settings
|
|
from django.utils import timezone
|
|
|
|
|
|
class TicketPriority(models.Model):
|
|
title = models.CharField(max_length=32)
|
|
colour = models.CharField(max_length=7)
|
|
|
|
|
|
class TicketTag(models.Model):
|
|
title = models.CharField(max_length=32)
|
|
colour = models.CharField(max_length=7)
|
|
|
|
|
|
class Ticket(models.Model):
|
|
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
|
title = models.CharField(max_length=60)
|
|
description = models.TextField(max_length=650)
|
|
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
|
|
create_timestamp = models.DateTimeField(editable=True, default=timezone.now)
|
|
edit_timestamp = models.DateTimeField(editable=True, default=timezone.now)
|
|
|
|
def __str__(self):
|
|
return f"#{self.id} • {self.title} • {self.author}"
|
|
|
|
def clean_description(self):
|
|
cleaned_description = bleach.clean(
|
|
self.description,
|
|
tags=['b', 'i', 'u', 'p', 'br', 'a', 'h3', 'h4', 'h5', 'h6'],
|
|
attributes={'a': ['href', 'title']}
|
|
)
|
|
return cleaned_description
|
|
|
|
def save(self, *args, **kwargs):
|
|
self.description = self.clean_description()
|
|
super().save(*args, **kwargs)
|
|
|
|
@property
|
|
def is_edited(self) -> bool:
|
|
"""Returns boolean if the ticket is believed to have been edited.
|
|
We assume a ticket is edited if the edit_timestamp doesn't match the create_timestamp.
|
|
|
|
Returns
|
|
-------
|
|
bool
|
|
True if `self.edit_timestamp` doesn't match `self.create_timestamp`, False otherwise.
|
|
"""
|
|
|
|
return self.create_timestamp != self.edit_timestamp
|
|
|
|
@property
|
|
def is_older_than_day(self) -> bool:
|
|
"""Returns boolean dependent on if `self.timestamp` is older than 24 hours.
|
|
|
|
Returns
|
|
-------
|
|
bool
|
|
True if `self.timestamp` is older than 24 hours, False otherwise.
|
|
"""
|
|
|
|
dayago = timezone.now() - timedelta(hours=24)
|
|
return self.timestamp <= dayago
|
|
|
|
@property
|
|
def timestamp(self) -> datetime:
|
|
"""Returns `self.edit_timestamp` if `self.is_edited` is True, otherwise
|
|
returns `self.create_timestamp`.
|
|
|
|
Returns
|
|
-------
|
|
datetime
|
|
Either `self.edit_timestamp` or `self.create_timestamp`.
|
|
"""
|
|
|
|
return self.edit_timestamp if self.is_edited else self.create_timestamp
|
|
|
|
def serialize(self) -> dict:
|
|
return {
|
|
"id": self.id,
|
|
"title": self.title,
|
|
"description": self.description,
|
|
"author": self.author.serialize(),
|
|
"create_timestamp": self.create_timestamp,
|
|
"edit_timestamp": self.edit_timestamp,
|
|
"is_edited": self.is_edited,
|
|
"is_older_than_day": self.is_older_than_day,
|
|
"timestamp": self.timestamp
|
|
}
|