Source code for shoop.simple_cms.models
# -*- coding: utf-8 -*-
# This file is part of Shoop.
#
# Copyright (c) 2012-2016, Shoop Ltd. All rights reserved.
#
# This source code is licensed under the AGPLv3 license found in the
# LICENSE file in the root directory of this source tree.
import markdown
from django.conf import settings
from django.db import models
from django.db.models import Q
from django.utils.encoding import force_text, python_2_unicode_compatible
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from mptt.managers import TreeManager
from mptt.models import MPTTModel, TreeForeignKey
from parler.managers import TranslatableQuerySet
from parler.models import TranslatableModel, TranslatedFields
from shoop.core.fields import InternalIdentifierField
[docs]class PageQuerySet(TranslatableQuerySet):
[docs] def visible(self, dt=None):
"""
Get pages that should be publicly visible.
This does not do permission checking.
:param dt: Datetime for visibility check
:type dt: datetime.datetime
:return: QuerySet of pages.
:rtype: QuerySet[Page]
"""
if not dt:
dt = now()
q = Q(available_from__lte=dt) & (Q(available_to__gte=dt) | Q(available_to__isnull=True))
qs = self.filter(q)
return qs
@python_2_unicode_compatible
[docs]class Page(MPTTModel, TranslatableModel):
available_from = models.DateTimeField(null=True, blank=True, verbose_name=_('available from'))
available_to = models.DateTimeField(null=True, blank=True, verbose_name=_('available to'))
created_by = models.ForeignKey(
settings.AUTH_USER_MODEL, blank=True, null=True, related_name="+", on_delete=models.SET_NULL,
verbose_name=_('created by')
)
modified_by = models.ForeignKey(
settings.AUTH_USER_MODEL, blank=True, null=True, related_name="+", on_delete=models.SET_NULL,
verbose_name=_('modified by')
)
created_on = models.DateTimeField(auto_now_add=True, editable=False, verbose_name=_('created on'))
modified_on = models.DateTimeField(auto_now=True, editable=False, verbose_name=_('modified on'))
identifier = InternalIdentifierField(
unique=True,
help_text=_('This identifier can be used in templates to create URLs'),
editable=True
)
visible_in_menu = models.BooleanField(verbose_name=_("visible in menu"), default=False)
parent = TreeForeignKey(
"self", blank=True, null=True, related_name="children", verbose_name=_("parent"))
list_children_on_page = models.BooleanField(verbose_name=_("list children on page"), default=False)
translations = TranslatedFields(
title=models.CharField(max_length=256, verbose_name=_('title')),
url=models.CharField(
max_length=100, verbose_name=_('URL'),
unique=True,
default=None,
blank=True,
null=True
),
content=models.TextField(verbose_name=_('content')),
)
objects = TreeManager.from_queryset(PageQuerySet)()
class Meta:
ordering = ('-id',)
verbose_name = _('page')
verbose_name_plural = _('pages')
[docs] def is_visible(self, dt=None):
if not dt:
dt = now()
return (
(self.available_from and self.available_from <= dt) and
(self.available_to is None or self.available_to >= dt)
)
[docs] def get_html(self):
return markdown.markdown(self.content)
def __str__(self):
return force_text(self.safe_translation_getter("title", any_language=True, default=_("Untitled")))