def test_default_choice_of_none_should_be_none(self): self.assertIsNone(default_choice(None))
def test_default_choice_of_empty_list_should_be_none(self): self.assertIsNone(default_choice([]))
def test_default_choice_of_choices_with_at_least_one_item_should_be_first_item_label( self): self.assertEqual(default_choice(self.create_choices(['a', 'b', 'c'])), 'a')
class PageBase( DateTimeBase, EditableContentMixin, SEOMixin, LegacyUrlMixin, ExcerptMixin ): """ Base class for a default CMS page (with timestamps and with SEO data). Derive your own CMS entities from this base class. """ class Meta: abstract = True ordering = ['seq', 'title'] verbose_name = 'Page' verbose_name_plural = 'Pages' class Listing: columns = ['title', '_meta_description', 'disabled'] grid_view = True sortable = True filter_by = [ 'title', 'slug', 'template', 'disabled' ] data_export = True data_ignore = ['_data'] def save(self, *args, **kwargs): """ Automatically generate slug based on title if no slug has been provided. """ # slug changed? if not self.slug: self.slug = slugify(self.title) # actually save model super(PageBase, self).save(*args, **kwargs) title = models.CharField( verbose_name='Title', max_length=255, db_index=True, help_text='The title of the page that is displayed on the website.' ) slug = models.SlugField( verbose_name='Slug', db_index=True, max_length=120, help_text='The name of the html file for the page as part of the ' + 'page''s address.' ) template = models.CharField( verbose_name='Template', choices=settings.CMS_TEMPLATES, default=default_choice(settings.CMS_TEMPLATES), max_length=255, help_text='The name of the template that is used to render this page.' ) image = models.ForeignKey( Media, verbose_name='Primary Image', null=True, blank=True, on_delete=models.SET_NULL, help_text='Select an image that is used to represent this entity ' + 'within a list of entities.' ) gallery_images = GenericRelation( MediaGallery, content_type_field='content_type', object_id_field='target_id' ) disabled = models.BooleanField( verbose_name='Disabled', db_index=True, default=False, help_text='A disabled web page is not visible to visitors nor to ' + 'search engines. A disabled web page will also not show ' + 'up in the navigation section(s) of your website.' ) sitemap = models.BooleanField( verbose_name='Sitemap Listed', default=True, help_text='This page is listed within the sitemap.xml file for this website.' ) seq = models.IntegerField( verbose_name='Sequence', db_index=True, default=0, editable=False, help_text='The sequence number determines the order in which pages ' + 'are presented, for example within the navigation ' + 'section(s) of your website.' ) nav_updated_on = models.DateTimeField( verbose_name='Navigation-relevant data updated timestamp', db_index=True, null=True, blank=False, editable=False ) @classmethod def get_backend_section_group(cls): """ Return the group name for the section within the backend system or None. """ return get_listing_option(cls, 'group') @classmethod def get_form(cls): from cubane.cms.forms import PageForm return PageForm @classmethod def filter_visibility(cls, objects, visibility_filter_args={}): """ Filter given queryset by visibility. The system will use this method whenever content is loaded from the database to check if this content is suppose to be visible and will give derived class implementation an opportunity to implement custom logic here. """ return objects.filter(disabled=False) def is_visible(self): """ Return True, if this page is visible; otherwise return False. """ return not self.disabled @property def html_title(self): """ Return the page title, which is marked as a safe string, because it may contain markup, such as . """ if self.title == None: return '' else: return mark_safe(self.title.replace('_', ' ')) @property def text_title(self): """ Return the page title as plain text without any markup and underscore characters replaced with spaces. """ if self.title == None: return '' else: return self.title.replace('_', ' ') @property def url(self): return self._get_absolute_url() @property def url_path(self): return self._get_absolute_url(path_only=True) @property def gallery(self): """ Return a (cached) list of gallery images that are assigned to this page or child page. """ if not hasattr(self, '_cached_gallery'): media = self.gallery_images.select_related('media').order_by('seq') self._cached_gallery = list([m.media for m in media]) return self._cached_gallery @property def page_path(self): """ Returns a list of all pages with in a hierarchy starting with root element. """ items = [] p = self while p is not None: items.insert(0, p) p = p.parent return items def get_filepath(self): """ Return path to cache file for this page. """ return os.path.join(self.slug, 'index.html') def get_slug(self): """ Return the slug for this page, which might be empty for the homepage. """ return self.slug def get_fullslug(self): """ Return the full slug for this page. """ if self.slug: return '/%s/' % self.slug else: return '/' def get_absolute_url(self): """ Return absolute url. """ return self._get_absolute_url() def _get_absolute_url(self, path_only=False): """ Return absolute url or url path. """ slug = normalise_slug(self.slug) if settings.APPEND_SLASH: slug = slug + '/' return get_absolute_url('cubane.cms.page', [slug], path_only=path_only) def to_dict(self, extras=None): d = { 'id': self.pk, 'title': self.title, 'slug': self.slug, 'url': self.url, 'url_path': self.url_path } if extras != None: d.update(extras) return d def __unicode__(self): return u'%s' % self.title