diff options
author | luxagraf <sng@luxagraf.net> | 2019-04-11 19:46:12 -0500 |
---|---|---|
committer | luxagraf <sng@luxagraf.net> | 2019-04-11 19:46:12 -0500 |
commit | 86fcf7ed710f41fc5324b638d092af54f4bb756f (patch) | |
tree | 28634fddbddb5ac162cd142c8e3a668d2296e414 /app/pages |
initial commit
Diffstat (limited to 'app/pages')
-rw-r--r-- | app/pages/__init__.py | 0 | ||||
-rw-r--r-- | app/pages/admin.py | 32 | ||||
-rw-r--r-- | app/pages/build.py | 39 | ||||
-rw-r--r-- | app/pages/migrations/0001_initial.py | 26 | ||||
-rw-r--r-- | app/pages/migrations/0002_page_build.py | 18 | ||||
-rw-r--r-- | app/pages/migrations/__init__.py | 0 | ||||
-rw-r--r-- | app/pages/models.py | 42 | ||||
-rw-r--r-- | app/pages/tests/__init__.py | 0 | ||||
-rw-r--r-- | app/pages/tests/test_models.py | 36 | ||||
-rw-r--r-- | app/pages/tests/test_views.py | 27 | ||||
-rw-r--r-- | app/pages/views.py | 18 |
11 files changed, 238 insertions, 0 deletions
diff --git a/app/pages/__init__.py b/app/pages/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/app/pages/__init__.py diff --git a/app/pages/admin.py b/app/pages/admin.py new file mode 100644 index 0000000..706d690 --- /dev/null +++ b/app/pages/admin.py @@ -0,0 +1,32 @@ +from django.contrib import admin + +from django import forms + +from pages.models import Page + + +class PageEntryForm(forms.ModelForm): + class Meta: + model = Page + fields = '__all__' + widgets = { + 'body_markdown': forms.Textarea(attrs={'rows': 50, 'cols': 100}), + } + + +@admin.register(Page) +class PageAdmin(admin.ModelAdmin): + form = PageEntryForm + list_display = ('title', 'slug', 'path') + search_fields = ['title', 'body_markdown'] + prepopulated_fields = {"slug": ('title',)} + fieldsets = ( + ('Page', { + 'fields': ('title', 'body_markdown', ('slug', 'path', )), + 'classes': ('show', 'extrapretty', 'wide') + }), + ('Metadata', { + 'classes': ('collapse closed',), + 'fields': ('meta_description',), + }) + ) diff --git a/app/pages/build.py b/app/pages/build.py new file mode 100644 index 0000000..75dbd0d --- /dev/null +++ b/app/pages/build.py @@ -0,0 +1,39 @@ +import os +from django.template.loader import render_to_string +from django.template import Context +from django.urls import reverse +from django.conf import settings + +from builder.base import BuildNew + + +class BuildPages(BuildNew): + def build(self): + self.build_detail_view() + print("building pages") + + def build_detail_view(self): + ''' + Grab all the blog posts, render them to a template + string and write that out to the filesystem + ''' + for entry in self.get_model_queryset(): + url = entry.get_absolute_url() + path, slug = os.path.split(entry.get_absolute_url()) + path = '%s/' % path + # write html + response = self.client.get(url) + if slug == 'homepage': + slug = 'index' + self.write_file(path, response.content, filename=slug) + # write txt + response = self.client.get('%s.txt' % url) + self.write_file(path, response.content, ext='txt', filename=slug) + + def get_model_queryset(self): + return self.model.objects.filter(build=True) + + +def builder(): + j = BuildPages("pages", "Page") + j.build() diff --git a/app/pages/migrations/0001_initial.py b/app/pages/migrations/0001_initial.py new file mode 100644 index 0000000..49e763f --- /dev/null +++ b/app/pages/migrations/0001_initial.py @@ -0,0 +1,26 @@ +# Generated by Django 2.1.2 on 2018-11-11 21:19 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Page', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('title', models.CharField(max_length=200)), + ('slug', models.SlugField()), + ('body_html', models.TextField(blank=True)), + ('body_markdown', models.TextField()), + ('meta_description', models.CharField(blank=True, max_length=256, null=True)), + ('path', models.CharField(blank=True, max_length=200, null=True)), + ], + ), + ] diff --git a/app/pages/migrations/0002_page_build.py b/app/pages/migrations/0002_page_build.py new file mode 100644 index 0000000..6dd9fc0 --- /dev/null +++ b/app/pages/migrations/0002_page_build.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.7 on 2019-04-11 23:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('pages', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='page', + name='build', + field=models.BooleanField(default=True), + ), + ] diff --git a/app/pages/migrations/__init__.py b/app/pages/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/app/pages/migrations/__init__.py diff --git a/app/pages/models.py b/app/pages/models.py new file mode 100644 index 0000000..1c9ab23 --- /dev/null +++ b/app/pages/models.py @@ -0,0 +1,42 @@ +from django.db import models +from django.template.defaultfilters import slugify +from django.contrib.sitemaps import Sitemap + +from utils.util import markdown_to_html, render_images + + +class Page(models.Model): + title = models.CharField(max_length=200) + slug = models.SlugField() + body_html = models.TextField(blank=True) + body_markdown = models.TextField() + meta_description = models.CharField(max_length=256, null=True, blank=True) + path = models.CharField(max_length=200, null=True, blank=True) + build = models.BooleanField(default=True) + + def __str__(self): + return self.title + + def get_absolute_url(self): + if self.path: + return "/%s/%s" % (self.path, self.slug) + else: + return "/%s" % (self.slug) + + def save(self): + # run markdown + md = render_images(self.body_markdown) + self.body_html = markdown_to_html(md) + if not self.id: + # self.date_created = timezone.now() + self.slug = slugify(self.title)[:50] + super(Page, self).save() + + +class PageSitemap(Sitemap): + changefreq = "never" + priority = 1.0 + protocol = "https" + + def items(self): + return Page.objects.all() diff --git a/app/pages/tests/__init__.py b/app/pages/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/app/pages/tests/__init__.py diff --git a/app/pages/tests/test_models.py b/app/pages/tests/test_models.py new file mode 100644 index 0000000..2722430 --- /dev/null +++ b/app/pages/tests/test_models.py @@ -0,0 +1,36 @@ +from django.test import TestCase + +from pages.models import Page + + +class PageModelTest(TestCase): + def setUp(self): + self.page = Page( + title="Test Page", + meta_description="The meta desc", + body_markdown="the body of the page", + ) + self.page.save() + self.pathpage = Page( + title="Test Page", + meta_description="The meta desc", + body_markdown="the body of the page", + path="test-path", + ) + self.pathpage.save() + + def test_string_representation(self): + self.assertEqual(str(self.page), "Test Page") + self.assertEqual(str(self.page.slug), "test-page") + self.assertEqual(str(self.page.body_markdown), "the body of the page") + self.assertEqual(str(self.page.body_html), "<p>the body of the page</p>") + self.assertEqual(str(self.page.meta_description), "The meta desc") + self.assertEqual(self.page.path, None) + + def test_get_absolute_url(self): + """Absolute URL should return /page """ + self.assertEqual(str(self.page.get_absolute_url()), "/test-page") + + def test_path_get_absolute_url(self): + """Absolute URL with a path should return /path/page """ + self.assertEqual(str(self.pathpage.get_absolute_url()), "/test-path/test-page") diff --git a/app/pages/tests/test_views.py b/app/pages/tests/test_views.py new file mode 100644 index 0000000..c771a29 --- /dev/null +++ b/app/pages/tests/test_views.py @@ -0,0 +1,27 @@ +from django.test import RequestFactory, TestCase +from django.contrib import auth + +from pages.models import Page + +User = auth.get_user_model() + + +class PageViewTest(TestCase): + def setUp(self): + # Every test needs access to the request factory. + self.factory = RequestFactory() + self.page = Page( + title="Test Page", + meta_description="The meta desc", + body_markdown="the body of the page", + ) + self.page.save() + + def test_non_existent_page(self): + """A non-existent staticflatpage raises a 404.""" + response = self.client.get('/no_such_page/') + self.assertEqual(response.status_code, 404) + + def test_detail_view(self): + response = self.client.get(self.page.get_absolute_url()) + self.assertEqual(response.status_code, 200) diff --git a/app/pages/views.py b/app/pages/views.py new file mode 100644 index 0000000..41288dd --- /dev/null +++ b/app/pages/views.py @@ -0,0 +1,18 @@ +from django.views.generic.detail import DetailView +from django.contrib.auth.forms import AuthenticationForm +from pages.models import Page + + +class PageDetailView(DetailView): + model = Page + slug_field = "slug" + + def get_template_names(self): + obj = self.get_object() + return ["%s.html" % obj.slug, "pages/%s.html" % obj.slug, 'pages/page.html'] + + +class HomePageDetailView(PageDetailView): + + def get_object(self): + return Page.objects.get(slug='homepage') |