gault-millau/apps/recipe/models.py
2019-12-16 17:02:20 +03:00

67 lines
2.7 KiB
Python

"""Recipe app models."""
from django.db import models
from django.utils.translation import ugettext_lazy as _
from utils.models import (TranslatedFieldsMixin, ImageMixin, BaseAttributes,
TJSONField)
class RecipeQuerySet(models.QuerySet):
"""Extended queryset for Recipe model."""
# todo: what records are considered published?
def published(self):
return self.filter(state__in=[self.model.PUBLISHED,
self.model.PUBLISHED_EXCLUSIVE])
def annotate_in_favorites(self, user):
"""Annotate flag in_favorites"""
favorite_recipe_ids = []
if user.is_authenticated:
favorite_recipe_ids = user.favorite_recipe_ids
return self.annotate(in_favorites=models.Case(
models.When(
id__in=favorite_recipe_ids,
then=True),
default=False,
output_field=models.BooleanField(default=False)))
class Recipe(TranslatedFieldsMixin, ImageMixin, BaseAttributes):
"""Recipe model."""
WAITING = 0
HIDDEN = 1
PUBLISHED = 2
PUBLISHED_EXCLUSIVE = 3
STATE_CHOICES = (
(WAITING, _('Waiting')),
(HIDDEN, _('Hidden')),
(PUBLISHED, _('Published')),
(PUBLISHED_EXCLUSIVE, _('Published exclusive')),
)
STR_FIELD_NAME = 'title'
title = TJSONField(blank=True, null=True, default=None, verbose_name=_('Title'), help_text='{"en-GB": "some text"}')
subtitle = TJSONField(blank=True, null=True, default=None, verbose_name=_('Subtitle'),
help_text='{"en-GB": "some text"}')
description = TJSONField(blank=True, null=True, default=None, verbose_name=_('Description'),
help_text='{"en-GB": "some text"}')
state = models.PositiveSmallIntegerField(default=WAITING, choices=STATE_CHOICES, verbose_name=_('State'))
author = models.CharField(max_length=255, blank=True, null=True, default=None, verbose_name=_('Author'))
published_at = models.DateTimeField(verbose_name=_('Published at'), blank=True, default=None, null=True,
help_text=_('Published at'))
published_scheduled_at = models.DateTimeField(verbose_name=_('Published scheduled at'), blank=True, default=None,
null=True, help_text=_('Published scheduled at'))
old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None)
slug = models.SlugField(unique=True, max_length=255, null=True, verbose_name=_('Slug'))
objects = RecipeQuerySet.as_manager()
class Meta:
"""Meta class."""
verbose_name = _('Recipe')
verbose_name_plural = _('Recipes')