summaryrefslogtreecommitdiff
path: root/app/pages
diff options
context:
space:
mode:
authorluxagraf <sng@luxagraf.net>2019-04-11 19:46:12 -0500
committerluxagraf <sng@luxagraf.net>2019-04-11 19:46:12 -0500
commit86fcf7ed710f41fc5324b638d092af54f4bb756f (patch)
tree28634fddbddb5ac162cd142c8e3a668d2296e414 /app/pages
initial commit
Diffstat (limited to 'app/pages')
-rw-r--r--app/pages/__init__.py0
-rw-r--r--app/pages/admin.py32
-rw-r--r--app/pages/build.py39
-rw-r--r--app/pages/migrations/0001_initial.py26
-rw-r--r--app/pages/migrations/0002_page_build.py18
-rw-r--r--app/pages/migrations/__init__.py0
-rw-r--r--app/pages/models.py42
-rw-r--r--app/pages/tests/__init__.py0
-rw-r--r--app/pages/tests/test_models.py36
-rw-r--r--app/pages/tests/test_views.py27
-rw-r--r--app/pages/views.py18
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')