Created
October 24, 2017 07:48
-
-
Save amirrpp/0674b0ec35da441151b27e90e7d0e405 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.db import models | |
class AbstractSeoContent(models.Model): | |
h1 = models.CharField('H1', max_length=255, blank=True) | |
meta_title = models.CharField(_('Title for page'), max_length=255, blank=True) | |
meta_description = models.CharField(max_length=255, blank=True) | |
meta_canonical = models.CharField(max_length=255, blank=True) | |
meta_keywords = models.CharField(max_length=255, blank=True) | |
meta_robots = models.CharField(max_length=255, blank=True) | |
class Meta: | |
abstract = True | |
class StaticPage(AbstractSeoContent): | |
name = models.CharField(_('Name'), max_length=256, unique=True) | |
url = models.CharField(_('URL'), max_length=256) | |
first_text = RichTextField(_('Main text'), blank=True) | |
second_text = RichTextField(_('Additional text'), blank=True) | |
gallery = models.ForeignKey('Gallery', on_delete=models.SET_NULL, | |
verbose_name=_('Gallery'), null=True, blank=True) | |
creation_date = models.DateField(_('Date created'), auto_now_add=True, blank=True) | |
last_edit_date = models.DateField(_('Date updated'), auto_now=True, blank=True) | |
def __str__(self): | |
return self.name | |
def get_absolute_url(self): | |
return reverse('page', kwargs={'url': self.url}) | |
def generate_slug(self): | |
return slugify(self.name) | |
def ensure_slug_uniqueness(self): | |
unique_url = self.url | |
static_page = StaticPage.objects.exclude(pk=self.pk) | |
next_num = 2 | |
while static_page.filter(url=unique_url).exists(): | |
unique_url = '{url}_{end}'.format(url=self.url, end=next_num) | |
next_num += 1 | |
if unique_url != self.url: | |
self.url = unique_url | |
self.save() | |
def save(self, *args, **kwargs): | |
if self.url: | |
super().save(*args, **kwargs) | |
else: | |
self.url = self.generate_slug() | |
super().save(*args, **kwargs) | |
self.ensure_slug_uniqueness() | |
class Meta: | |
app_label = 'site' | |
verbose_name = _('Static Page') | |
verbose_name_plural = _('Static Pages') |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
urlpatterns += [ | |
""" | |
... other urls | |
""" | |
url(r'^(?P<url>[-_\w]+)/$', StaticPageView.as_view(), name='page'), | |
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from django.views.generic import TemplateView | |
from .models import StaticPage, GlobalSettings | |
class StaticPageView(TemplateView): | |
template_name = 'static/page.html' | |
def get(self, request, *args, **kwargs): | |
self.object = get_object_or_404(StaticPage, url=kwargs.get('url')) | |
self.global_settings = GlobalSettings.objects.first() | |
return super().get(request, *args, **kwargs) | |
def get_context_data(self, **kwargs): | |
ctx = super().get_context_data(**kwargs) | |
ctx['static_page'] = self.object | |
ctx['seo'] = self.get_seo() | |
return ctx | |
def get_meta_tag(self, tag): | |
tag = tag.replace('<page_name>', self.object.name) | |
tag = tag.replace('<company>', | |
self.global_settings.company_name if self.global_settings else '') | |
tag = tag.replace('<product>', '') | |
return tag.replace('<category>', '') | |
def get_seo(self): | |
if self.global_settings: | |
title = self.get_meta_tag(self.global_settings.static_page_title) | |
description = self.get_meta_tag(self.global_settings.static_page_description) | |
keywords = self.get_meta_tag(self.global_settings.static_page_keywords) | |
h1 = self.get_meta_tag(self.global_settings.static_page_h1) | |
else: | |
title = '' | |
description = '' | |
keywords = '' | |
h1 = '' | |
seo = { | |
'title': self.object.meta_title or title, | |
'h1': self.object.h1 or h1, | |
'meta_description': self.object.meta_description or description, | |
'meta_canonical': self.object.meta_canonical, | |
'meta_keywords': keywords, | |
'meta_robots': self.object.meta_robots, | |
} | |
return seo |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment