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 _ import shortuuid 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) 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) viewcount = models.IntegerField(default=0, editable=False) def compute_size(self): """Computes size.""" self.size = len(self.content) def get_age(self): """Return age in minutes""" delta = timezone.now() - self.paste_time return divmod(delta.days * 86400 + delta.seconds, 60)[0] def incr_viewcount(self): """Increment view counter.""" self.viewcount = self.viewcount + 1 self.save() def __str__(self): excerpt = repr(self.content[:100]) + ("..." if len(self.content) > 100 else "") return f"{self.slug} - {excerpt}" def choose_slug(self): while True: uuid = shortuuid.uuid() for i in range(4, len(uuid)): potential_uuid = uuid[:i] if not type(self).objects.filter(slug=potential_uuid): self.slug = potential_uuid return