Browse Source

Page titles refactoring.

master
Erik Stein 3 years ago
parent
commit
ae4be0e58c
  1. 99
      shared/utils/models/pages.py

99
shared/utils/models/pages.py

@ -1,7 +1,7 @@
from django.conf import settings from django.conf import settings
from django.db import models from django.db import models
from django.utils.html import strip_tags from django.utils.html import strip_tags
from django.utils.text import normalize_newlines from django.utils.text import normalize_newlines, Truncator
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from shared.multilingual.utils import i18n_fields_list from shared.multilingual.utils import i18n_fields_list
@ -18,98 +18,99 @@ if USE_TRANSLATABLE_FIELDS:
TranslatableCharField, TranslatableCharField,
TranslatableTextField TranslatableTextField
) )
# TODO populate_from might use settings.LANGUAGE_CODE # TODO populate_from should use settings.LANGUAGE_CODE
SLUG_POPULATE_FORM = getattr(settings, 'SLUG_POPULATE_FORM', 'name_en') # FIXME Wrong spelling!
SLUG_POPULATE_FROM = getattr(settings, 'SLUG_POPULATE_FROM', 'name_en')
else: else:
TranslatableCharField = models.CharField TranslatableCharField = models.CharField
TranslatableTextField = models.TextField TranslatableTextField = models.TextField
SLUG_POPULATE_FORM = 'name' SLUG_POPULATE_FROM = 'name'
# TODO Make slimdown optional through settings # TODO Make slimdown optional through settings
# TODO Leave window_title alone, do not slimdown # TODO Leave window_title alone, do not slimdown
class PageTitlesFunctionMixin(object): class PageTitlesBehaviour:
"""
Implements fallback behaviour.
"""
def __str__(self): def __str__(self):
return strip_tags(self.get_short_title()) return strip_tags(slimdown(self.get_short_name()))
def get_title(self): def get_title(self):
return slimdown(firstof( return self.get_first_title_line() or \
self.title, self.name
self.get_short_title(),
''
))
def get_short_name(self): def get_short_name(self):
return slimdown(self.short_name or self.name) return getattr(self, 'short_name', '') or \
Truncator(self.name).words(5, truncate="...")
# TODO Deprecated
get_short_title = get_short_name
def get_window_title(self):
return strip_tags(slimdown(
firstof(
getattr(self, 'window_title', None),
self.get_short_title(),
self.get_first_title_line(),
''
)
))
def get_first_title_line(self): def get_first_title_line(self):
""" """
First line of title field. First line of title field or self.name..
""" """
return slimdown( return normalize_newlines(getattr(self, 'long_title', '') or '').partition("\n")[0]
normalize_newlines(self.get_title()).partition("\n")[0]
)
def get_subtitle_lines(self): def get_subtitle_lines(self):
""" """
All but first line of the long title field. All but first line of the long title field.
""" """
return slimdown( return normalize_newlines(getattr(self, 'long_title', '') or '').partition("\n")[2]
normalize_newlines(self.title).partition("\n")[2]
def get_window_title(self):
return firstof(
getattr(self, 'window_title', None),
strip_tags(slimdown(self.get_short_name())),
strip_tags(slimdown(self.get_first_title_line())),
) )
class PageTitlesMixin(PageTitlesFunctionMixin, models.Model): PageTitlesFunctionMixin = PageTitlesBehaviour
class PageTitlesMixin(PageTitlesBehaviour, models.Model):
""" """
A model mixin containg title and slug field for models serving as website A model mixin containg title and slug fields for models serving
pages with an URL. as web pages with an URL.
name: Main naming field, all other fields besides `slug`
are optional.
short_name: For menus etc.
long_title: Long title, composed of title line (first line) and
subtitle (all other lines)
window_title: Browser window title, also for search engine's results
slug: URL name
""" """
name = TranslatableCharField(_("Name"), name = TranslatableCharField(_("Name"),
max_length=250) max_length=250)
sort_name = TranslatableCharField(_("Short Name"),
max_length=250, null=True, blank=True,
help_text=_("Optional, used for sorting."))
short_name = TranslatableCharField(_("Short Name"), short_name = TranslatableCharField(_("Short Name"),
max_length=25, null=True, blank=True, max_length=25, null=True, blank=True,
help_text=_("Optional, used for menus etc.")) help_text=_("Optional, used for menus etc."))
title = TranslatableTextField(_("title/subtitle"), long_title = TranslatableTextField(_("title/subtitle"),
null=True, blank=True, max_length=500) null=True, blank=True, max_length=500,
help_text=_("Optional, long title for page content region. FIrst line is the title, other lines are the subtitle. Simplified Markdown."))
window_title = TranslatableCharField(_("window title"), window_title = TranslatableCharField(_("window title"),
null=True, blank=True, max_length=300) null=True, blank=True, max_length=300)
slug = DowngradingSlugField(_("URL-Name"), max_length=200, slug = DowngradingSlugField(_("URL-Name"), max_length=200,
populate_from=SLUG_POPULATE_FORM, unique_slug=True, blank=True) populate_from=SLUG_POPULATE_FROM, unique_slug=True, blank=True)
class Meta: class Meta:
abstract = True abstract = True
ordering = ['sort_name', 'name']
# FIXME short_title is deprecated
@property
def short_title(self):
return self.get_short_title()
@short_title.setter
def short_title(self, value):
self.name = value
class PageTitleAdminMixin(object): class PageTitlesAdminMixin:
list_display = ['name', 'slug'] list_display = ['name', 'slug']
search_fields = ['name', 'title', 'window_title'] search_fields = ['name', 'short_name', 'long_title', 'window_title']
if USE_TRANSLATABLE_FIELDS: if USE_TRANSLATABLE_FIELDS:
search_fields = i18n_fields_list(search_fields) search_fields = i18n_fields_list(search_fields)
prepopulated_fields = { prepopulated_fields = {
'slug': [SLUG_POPULATE_FORM] 'slug': [SLUG_POPULATE_FROM]
} }

Loading…
Cancel
Save