docs/Developers/model-concerns.md
# ShinyCMS Developer Documentation
## Supporting code: model concerns
### In the core plugin
* CanHide - check or change visible/hidden status of content
* HasEmail - sets/searches/validates canonical_email as well as email
* HasPublicName - `.name` method - returns public_name if set, internal_name otherwise
* HasReadableName - get a human-readable (and optionally, localised) version of model's class name
* HasTags - pulls in ActsAsTaggableOn and adds helper methods to hide tags on hidden content
* HasTeaser - generate a 'teaser' from first N paragraphs of a longer post
* HasToken - common behaviour for models with UUID token attributes
* HasVotes - pulls in ActsAsVotable, plus method to get URL-safe class name
* SoftDelete - adds soft delete (from acts_as_paranoid gem)
* HasSlug - for models with a slug attribute (usually for URLs)
* HasSlugUniqueInMonth - slug is only unique within a month (includes HasSlug)
* HasSlugUniqueInSection - slug is only unique within a section (includes HasSlug)
* ProvidesDemoSiteData - for models that may provide data for the demo site
* ProvidesSitemapData - for models that may provide data for the sitemap
* Post - common behaviour for 'posts' (e.g. ShinyBlog::Post, ShinyNews::Post) (includes CanHide, HasReadableName, HasSlugUniqueInMonth, HasTags, HasTeaser, HasVotes, and SoftDelete)
#### Templates and templated content
* Template - common attributes and behaviour for any kind of layout template
* HTMLTemplate - HTML-based layout templates (e.g. ShinyPages::Template) (includes Template)
* MJMLTemplate - MJML-based layout templates (e.g. ShinyNewsletters::Template) (includes Template)
* HasTemplate - content that has its layout defined by a template (e.g. ShinyPages::Page, ShinyNewsletters::Edition)
* Element - common behaviour for elements of templates and templated content
* TemplateElement - elements of a layout template (e.g. ShinyPages::TemplateElement, ShinyNewsletters::TemplateElement) (includes Element)
### In feature plugins
* ShinySearch::Searchable - for models that want to be discoverable by the search feature