from django.db import models from django.core.validators import MaxLengthValidator from django.utils import timezone from datetime import datetime, timedelta from webtools import settings from django.utils.translation import gettext_lazy as _ EXPIRE_CHOICES = ( (0, _("Never expire")), (60, _("1 hour")), (60 * 24, _("1 day")), (60 * 24 * 7, _("1 week")), (60 * 24 * 7 * 30, _("1 month")), (60 * 24 * 7 * 365, _("1 year")), ) class Language(models.Model): """Language object.""" name = models.CharField(max_length=200, unique=True) slug = models.SlugField(max_length=200, unique=True) @classmethod def by_name(cls, name): language = cls.objects.filter(name__icontains=name).first() if not language: language = cls.objects.filter( name__iexact=settings.PASTE["default_language"] ).first() return language def __unicode__(self): """String representation.""" return _(self.name) def __str__(self): return str(_(self.name)) class Paste(models.Model): """Paste object.""" language = models.ForeignKey( Language, default=14, on_delete=models.SET_NULL, null=True ) slug = models.SlugField(unique=True, editable=False) title = models.CharField(max_length=200, blank=True) content = models.TextField( validators=[MaxLengthValidator(settings.PASTE["max_characters"])] ) size = models.IntegerField(default=0, editable=False) paste_time = models.DateTimeField(default=datetime.now, editable=False) lifetime = models.IntegerField( default=settings.PASTE["default_lifetime"], choices=EXPIRE_CHOICES ) lifecount = models.IntegerField(default=0, blank=True) viewcount = models.IntegerField(default=0, editable=False) expired = models.BooleanField(default=False, editable=False) def compute_size(self): """Computes size.""" self.size = len(self.content) def is_expired(self): """Return expiration status.""" if self.expired or self.time_expired() or self.view_expired(): return True return False def time_expired(self): """Check if paste lifetime is over.""" if not self.lifetime or self.lifetime - self.get_age() > 0: return False self.mark_expired() return True def get_age(self): """Return age in minutes""" delta = timezone.now() - self.paste_time return divmod(delta.days * 86400 + delta.seconds, 60)[0] def expiration_time(self): """Return expiration time""" if not self.lifetime: return None delta = timedelta(minutes=self.lifetime) return self.paste_time + delta def mark_expired(self): """Mark paste expired.""" self.expired = True self.save() def incr_viewcount(self): """Increment view counter.""" self.viewcount = self.viewcount + 1 self.save() def view_expired(self): """Check if paste view count is over.""" if not self.lifecount: return False if self.lifecount <= self.viewcount: self.mark_expired() return True return False def __unicode__(self): """String representation.""" return self.slug def __str__(self): excerpt = repr(self.content[:100]) + ("..." if len(self.content) > 100 else "") return "{} - {} - {}".format(self.slug, self.title, excerpt)