hackspace/mhackspace/blog/models.py

63 lines
1.9 KiB
Python

from django.db import models
from django.utils import timezone
from django.urls import reverse
from martor.models import MartorField
from stdimage.validators import MinSizeValidator
from stdimage.models import StdImageField
from dynamic_filenames import FilePattern
from mhackspace.users.models import User
upload_to_pattern = FilePattern(
filename_pattern="{model_name}/{instance.title:slug}{ext}"
)
class Category(models.Model):
name = models.CharField(max_length=100)
slug = models.SlugField(max_length=100)
description = models.TextField()
def __str__(self):
return self.name
def get_absolute_url(self):
return reverse("blog-category", kwargs={"category": self.slug})
class Post(models.Model):
title = models.CharField(max_length=100, unique=True)
slug = models.SlugField(max_length=100, unique=True)
categories = models.ManyToManyField(Category)
author = models.ForeignKey(User, on_delete=models.CASCADE)
image = StdImageField(
upload_to=upload_to_pattern,
blank=True,
null=True,
variations={
"home": {"width": 530, "height": 220, "crop": True},
"mobilethumb": {"width": 580, "height": 150, "crop": True},
"thumbnail": {"width": 250, "height": 150, "crop": True},
"full": {"width": 825, "height": 450, "crop": True},
},
validators=[MinSizeValidator(730, 410)],
)
description = MartorField()
excerpt = models.TextField(blank=True, null=True)
published_date = models.DateTimeField(default=timezone.now)
updated_date = models.DateTimeField(default=timezone.now)
active = models.BooleanField(default=True)
members_only = models.BooleanField(default=False)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse("blog-item", kwargs={"slug": self.slug})
class Meta:
ordering = ("-published_date",)