diff options
author | luxagraf <sng@luxagraf.net> | 2018-11-14 13:17:42 -0600 |
---|---|---|
committer | luxagraf <sng@luxagraf.net> | 2018-11-14 13:17:42 -0600 |
commit | a0b95dc2dfb84c682bb8f677e5d471f84e5028fe (patch) | |
tree | 6dd1919856f736c5b644270d59b57e4bb20336c5 /apps/pages |
wrote out basic notes skeleton
Diffstat (limited to 'apps/pages')
-rw-r--r-- | apps/pages/__init__.py | 0 | ||||
-rw-r--r-- | apps/pages/admin.py | 32 | ||||
-rw-r--r-- | apps/pages/migrations/0001_initial.py | 26 | ||||
-rw-r--r-- | apps/pages/migrations/__init__.py | 0 | ||||
-rw-r--r-- | apps/pages/models.py | 41 | ||||
-rw-r--r-- | apps/pages/tests/__init__.py | 0 | ||||
-rw-r--r-- | apps/pages/tests/test_models.py | 20 | ||||
-rw-r--r-- | apps/pages/tests/test_views.py | 29 | ||||
-rw-r--r-- | apps/pages/views.py | 11 |
9 files changed, 159 insertions, 0 deletions
diff --git a/apps/pages/__init__.py b/apps/pages/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apps/pages/__init__.py diff --git a/apps/pages/admin.py b/apps/pages/admin.py new file mode 100644 index 0000000..706d690 --- /dev/null +++ b/apps/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/apps/pages/migrations/0001_initial.py b/apps/pages/migrations/0001_initial.py new file mode 100644 index 0000000..49e763f --- /dev/null +++ b/apps/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/apps/pages/migrations/__init__.py b/apps/pages/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apps/pages/migrations/__init__.py diff --git a/apps/pages/models.py b/apps/pages/models.py new file mode 100644 index 0000000..0c663cb --- /dev/null +++ b/apps/pages/models.py @@ -0,0 +1,41 @@ +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) + + 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/apps/pages/tests/__init__.py b/apps/pages/tests/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apps/pages/tests/__init__.py diff --git a/apps/pages/tests/test_models.py b/apps/pages/tests/test_models.py new file mode 100644 index 0000000..f8de5c7 --- /dev/null +++ b/apps/pages/tests/test_models.py @@ -0,0 +1,20 @@ +from django.test import TestCase + +from pages.models import Page + + +class PageModelTest(TestCase): + + def test_string_representation(self): + page = Page( + title="Test Page", + meta_description="The meta desc", + body_markdown="the body of the page", + ) + page.save() + self.assertEqual(str(page), "Test Page") + self.assertEqual(str(page.slug), "test-page") + self.assertEqual(str(page.body_markdown), "the body of the page") + self.assertEqual(str(page.body_html), "<p>the body of the page</p>") + self.assertEqual(str(page.meta_description), "The meta desc") + self.assertEqual(page.path, None) diff --git a/apps/pages/tests/test_views.py b/apps/pages/tests/test_views.py new file mode 100644 index 0000000..42a91e4 --- /dev/null +++ b/apps/pages/tests/test_views.py @@ -0,0 +1,29 @@ +from django.test import RequestFactory, TestCase +from mixer.backend.django import mixer + +from accounts.models import User +from pages.models import Page +from pages.views import PageDetailView + + +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) + self.assertEqual(response.status_code, 200) + print(response.content) diff --git a/apps/pages/views.py b/apps/pages/views.py new file mode 100644 index 0000000..617ce04 --- /dev/null +++ b/apps/pages/views.py @@ -0,0 +1,11 @@ +from django.views.generic.detail import DetailView +from pages.models import Page + + +class PageDetailView(DetailView): + model = Page + slug_field = "slug" + + def get_template_names(self): + obj = self.get_object() + return ["pages/%s.html" % obj.slug, 'pages/page.html'] |