diff --git a/entries/__init__.py b/entries/__init__.py new file mode 100644 index 0000000..0b65d99 --- /dev/null +++ b/entries/__init__.py @@ -0,0 +1 @@ +default_app_config = 'entries.apps.EntriesConfig' diff --git a/entries/admin.py b/entries/admin.py new file mode 100644 index 0000000..3a48189 --- /dev/null +++ b/entries/admin.py @@ -0,0 +1,5 @@ +from django.contrib import admin +from .models import Entry + + +admin.site.register(Entry) diff --git a/entries/apps.py b/entries/apps.py new file mode 100644 index 0000000..554d2a6 --- /dev/null +++ b/entries/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class EntriesConfig(AppConfig): + name = 'entries' diff --git a/entries/kinds.py b/entries/kinds.py new file mode 100644 index 0000000..fc61491 --- /dev/null +++ b/entries/kinds.py @@ -0,0 +1,15 @@ +class Note: + id = 'note' + icon = 'fa fa-paper-plane' + plural = 'notes' + + +class Article: + id = 'article' + icon = 'fa fa-file-text' + plural = 'articles' + + +all = (Note, Article) +from_id = {k.id: k for k in all} +from_plural = {k.plural: k for k in all} diff --git a/entries/migrations/0001_initial.py b/entries/migrations/0001_initial.py new file mode 100644 index 0000000..1228631 --- /dev/null +++ b/entries/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.6 on 2017-10-25 00:50 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Entry', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('kind', models.CharField(choices=[('note', 'Note'), ('article', 'Article')], default='note', max_length=30)), + ('name', models.CharField(blank=True, max_length=100)), + ('summary', models.TextField(blank=True)), + ('content', models.TextField()), + ('published', models.DateTimeField()), + ('updated', models.DateTimeField()), + ('author', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name_plural': 'entries', + 'ordering': ['-published'], + }, + ), + ] diff --git a/entries/migrations/__init__.py b/entries/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/entries/models.py b/entries/models.py new file mode 100644 index 0000000..c2f8562 --- /dev/null +++ b/entries/models.py @@ -0,0 +1,33 @@ +from django.contrib.auth import get_user_model +from django.db import models + +from . import kinds +ENTRY_KINDS = [(k.id, k.__name__) for k in kinds.all] + + +class Entry(models.Model): + kind = models.CharField( + max_length=30, + choices=ENTRY_KINDS, + default=ENTRY_KINDS[0][0] + ) + + name = models.CharField(max_length=100, blank=True) + summary = models.TextField(blank=True) + content = models.TextField() + + author = models.ForeignKey(get_user_model(), on_delete=models.CASCADE) + + published = models.DateTimeField() + updated = models.DateTimeField() + + def __str__(self): + return '{kind} {id}: {content}'.format( + kind=self.kind, + id=self.id, + content=self.content + ) + + class Meta: + verbose_name_plural = 'entries' + ordering = ['-published'] diff --git a/entries/templates/entries/entry.html b/entries/templates/entries/entry.html new file mode 100644 index 0000000..395a41e --- /dev/null +++ b/entries/templates/entries/entry.html @@ -0,0 +1,24 @@ +{% load humanize %}
+
+ {% if entry.name %}

{{ entry.name }}

{% endif %} +
{{ entry.content }}
+
+ +
diff --git a/entries/templates/entries/index.html b/entries/templates/entries/index.html new file mode 100644 index 0000000..6dad30b --- /dev/null +++ b/entries/templates/entries/index.html @@ -0,0 +1,11 @@ +{% extends 'lemoncurry/layout.html' %} +{% block html_class %}h-feed{% endblock %} +{% block main %} +
    + {% for entry in entries %} +
  1. + {% include 'entries/entry.html' %} +
  2. + {% endfor %} +
+{% endblock %} diff --git a/entries/urls.py b/entries/urls.py new file mode 100644 index 0000000..c9fda2a --- /dev/null +++ b/entries/urls.py @@ -0,0 +1,12 @@ +from django.conf.urls import url +from . import kinds, views +from lemoncurry import breadcrumbs + +app_name = 'entries' +urlpatterns = [] +for k in kinds.all: + index = k.plural + '_index' + urlpatterns.extend(( + url(k.plural, views.index, name=index, kwargs={'kind': k}), + )) + breadcrumbs.add(app_name + ':' + index, label=k.plural, parent='home:index') diff --git a/entries/views.py b/entries/views.py new file mode 100644 index 0000000..a9ca2e5 --- /dev/null +++ b/entries/views.py @@ -0,0 +1,10 @@ +from django.shortcuts import render +from .models import Entry + + +def index(request, kind): + entries = Entry.objects.filter(kind=kind.id) + return render(request, 'entries/index.html', { + 'entries': entries, + 'title': kind.plural + }) diff --git a/lemoncurry/settings/base.py b/lemoncurry/settings/base.py index 5053ed3..97e1276 100644 --- a/lemoncurry/settings/base.py +++ b/lemoncurry/settings/base.py @@ -59,6 +59,7 @@ INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', + 'django.contrib.humanize', 'django.contrib.sessions', 'django.contrib.sitemaps', 'django.contrib.messages', @@ -73,6 +74,7 @@ INSTALLED_APPS = [ 'meta', 'lemoncurry', + 'entries', 'home', 'lemonauth', 'users', diff --git a/lemoncurry/templatetags/lemoncurry_tags.py b/lemoncurry/templatetags/lemoncurry_tags.py index bc5731a..dbf63f7 100644 --- a/lemoncurry/templatetags/lemoncurry_tags.py +++ b/lemoncurry/templatetags/lemoncurry_tags.py @@ -1,5 +1,4 @@ import json -from collections import namedtuple from os.path import join from types import SimpleNamespace @@ -8,6 +7,7 @@ from django.conf import settings from django.urls import reverse from .. import breadcrumbs +from entries import kinds register = template.Library() cache = SimpleNamespace(package_json=None) @@ -45,7 +45,11 @@ def site_name(): @register.inclusion_tag('lemoncurry/tags/nav.html') def nav_left(request): - items = () + items = (MenuItem( + label=k.plural, + icon=k.icon, + url='entries:'+k.plural+'_index' + ) for k in kinds.all) return {'items': items, 'request': request} diff --git a/lemoncurry/urls.py b/lemoncurry/urls.py index 4439f75..41e07c8 100644 --- a/lemoncurry/urls.py +++ b/lemoncurry/urls.py @@ -32,6 +32,7 @@ maps = {'sitemaps': sections} urlpatterns = [ url('', include('home.urls')), + url('', include('entries.urls')), url('^.well-known/', include('wellknowns.urls')), url('^admin/', otp_admin_site.urls), url('^auth/', include('lemonauth.urls')),