work on views and templates

This commit is contained in:
bkfox 2015-10-03 14:18:32 +02:00
parent 91b1c64024
commit f9d2d47ee6
10 changed files with 171 additions and 56 deletions

View File

@ -1,5 +1,6 @@
from django.conf.urls import url from django.conf.urls import url
from django.utils import timezone from django.utils import timezone
from django.utils.translation import ugettext as _, ugettext_lazy
from website.models import * from website.models import *
from website.views import * from website.views import *
@ -50,12 +51,10 @@ class Route:
""" """
pass pass
@classmethod @classmethod
def get_title (cl, model, request, **kwargs): def get_title (cl, model, request, **kwargs):
return '' return ''
@classmethod @classmethod
def as_url (cl, model, view, view_kwargs = None): def as_url (cl, model, view, view_kwargs = None):
base_name = model._meta.verbose_name_plural.lower() base_name = model._meta.verbose_name_plural.lower()
@ -89,7 +88,6 @@ class DetailRoute (Route):
('slug', '(\w|-|_)+', True), ('slug', '(\w|-|_)+', True),
] ]
@classmethod @classmethod
def get_object (cl, model, request, pk, **kwargs): def get_object (cl, model, request, pk, **kwargs):
return model.objects.get(pk = int(pk)) return model.objects.get(pk = int(pk))
@ -102,6 +100,12 @@ class AllRoute (Route):
def get_queryset (cl, model, request, **kwargs): def get_queryset (cl, model, request, **kwargs):
return model.objects.all() return model.objects.all()
@classmethod
def get_title (cl, model, request, **kwargs):
return _('All %(model)s') % {
'model': model._meta.verbose_name_plural
}
class ThreadRoute (Route): class ThreadRoute (Route):
name = 'thread' name = 'thread'

View File

@ -0,0 +1,8 @@
{% block pre_title %}
{% endblock %}
{% block title %}
{% endblock %}
{% block content %}
{% endblock %}

View File

@ -0,0 +1,49 @@
<html>
<head>
<title>{{ website.name }} {% if title %}- {{ title }} {% endif %}</title>
</head>
<body>
{% if menus.top %}
{{ menus.top|safe }}
{% endif %}
{% block header %}
{% if menus.header %}
<header>
{{ menus.header|safe }}
</header>
{% endif %}
{% endblock %}
<div class="page">
{% if menus.left %}
{{ menus.left|safe }}
{% endif %}
<main>
{% block pre_title %}
{% endblock %}
<h1>
{% block title %}
{{ title }}
{% endblock %}
</h1>
{% block post_title %}
{% endblock %}
<div class="content">
{% block content %}
{% endblock %}
</div>
</main>
</div>
{% block footer %}
{% if menus.footer %}
<footer>
{{ menus.footer|safe }}
</footer>
{% endif %}
{% endblock %}
</body>
</html>

View File

@ -1,4 +1,4 @@
{# {% extends "website/base.html" %} #} {% extends embed|yesno:"cms/base_content.html,cms/base_site.html" %}
{% block title %} {% block title %}
{{ object.title }} {{ object.title }}

View File

@ -1,23 +1,21 @@
{# {% extends embed|yesno:"website/single.html,website/base.html" %} #} {% extends embed|yesno:"cms/base_content.html,cms/base_site.html" %}
{% load i18n %} {% load i18n %}
{% load thumbnail %} {% load thumbnail %}
{# {% load website_views %} #}
{% block content %} {% block content %}
<div class="post_list {{ classes }}"> <div class="post_list {{ classes }}">
{% for post in object_list %} {% for post in object_list %}
<a class="post_item" <a class="post_item"
href="{{ post.detail_url }}"> href="{{ post.detail_url }}">
{% if 'date' in list.fields or 'time' in list.fields %} {% if 'date' in view.fields or 'time' in list.fields %}
<time datetime="{{ post.date }}" class="post_datetime"> <time datetime="{{ post.date }}" class="post_datetime">
{% if 'date' in list.fields %} {% if 'date' in view.fields %}
<span class="post_date"> <span class="post_date">
{{ post.date|date:'D. d F' }}, {{ post.date|date:'D. d F' }},
</span> </span>
{% endif %} {% endif %}
{% if 'time' in list.fields %} {% if 'time' in view.fields %}
<span class="post_time"> <span class="post_time">
{{ post.date|date:'H:i' }}, {{ post.date|date:'H:i' }},
</span> </span>
@ -25,15 +23,15 @@
</time> </time>
{% endif %} {% endif %}
{% if 'image' in list.fields %} {% if 'image' in view.fields %}
<img src="{% thumbnail post.image "64x64" crop %}" class="post_image"> <img src="{% thumbnail post.image "64x64" crop %}" class="post_image">
{% endif %} {% endif %}
{% if 'title' in list.fields %} {% if 'title' in view.fields %}
<h4 class="post_title">{{ post.title }}</h4> <h4 class="post_title">{{ post.title }}</h4>
{% endif %} {% endif %}
{% if 'content' in list.fields %} {% if 'content' in view.fields %}
<div class="post_content"> <div class="post_content">
{{ post.content|safe|striptags|truncatechars:"64" }} {{ post.content|safe|striptags|truncatechars:"64" }}
</div> </div>

View File

@ -1,11 +1,10 @@
<div class="menu menu_{{ position }} {{ classes }}" <nav class="menu menu_{{ position }} {{ classes }}" {% if name %}
{% if name %}
name="menu_{{ name }}" name="menu_{{ name }}"
id="menu_{{ name }}" id="menu_{{ name }}"
{% endif %}> {% endif %}>
{% for section in sections %} {% for section in sections %}
{{ section|safe }} {{ section|safe }}
{% endfor %} {% endfor %}
</div> </nav>

View File

@ -1 +0,0 @@
{# #}

View File

@ -1,14 +1,48 @@
from django.shortcuts import render from django.shortcuts import render
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.views.generic import ListView from django.views.generic import ListView, DetailView
from django.views.generic import DetailView from django.views.generic.base import View, TemplateResponseMixin
from django.core import serializers from django.core import serializers
from django.utils.translation import ugettext as _, ugettext_lazy from django.utils.translation import ugettext as _, ugettext_lazy
import cms.routes as routes import cms.routes as routes
class PostListView (ListView): class PostBaseView:
website = None # corresponding website
title = '' # title of the page
embed = False # page is embed (if True, only post content is printed
classes = '' # extra classes for the content
def get_base_context (self):
"""
Return a context with all attributes of this classe plus 'view' set
to self.
"""
context = {
k: getattr(self, k)
for k, v in PostBaseView.__dict__.items()
if not k.startswith('__')
}
if not self.embed:
context['menus'] = {
k: v.get(self.request)
for k, v in {
'top': self.website.get_menu('top'),
'left': self.website.get_menu('left'),
'bottom': self.website.get_menu('bottom'),
'right': self.website.get_menu('right'),
'header': self.website.get_menu('header'),
'footer': self.website.get_menu('footer'),
}.items() if v
}
context['view'] = self
return context
class PostListView (PostBaseView, ListView):
""" """
List view for posts and children List view for posts and children
""" """
@ -20,34 +54,29 @@ class PostListView (ListView):
exclude = None exclude = None
order = 'desc' order = 'desc'
reverse = False reverse = False
fields = None
def __init__ (self, query): def __init__ (self, query):
if query:
self.update(query)
def update (self, query):
my_class = self.__class__ my_class = self.__class__
if type(query) is my_class: if type(query) is my_class:
self.__dict__.update(query.__dict__) self.__dict__.update(query.__dict__)
return return
self.__dict__.update(query)
if type(query) is not dict:
query = query.__dict__
self.__dict__ = { k: v for k,v in query.items() }
template_name = 'cms/list.html' template_name = 'cms/list.html'
allow_empty = True allow_empty = True
website = None
title = ''
classes = ''
route = None route = None
query = None query = None
embed = False
fields = [ 'date', 'time', 'image', 'title', 'content' ] fields = [ 'date', 'time', 'image', 'title', 'content' ]
def __init__ (self, *args, **kwargs): def __init__ (self, *args, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
if self.query: self.query = PostListView.Query(self.query)
self.query = Query(self.query)
def dispatch (self, request, *args, **kwargs): def dispatch (self, request, *args, **kwargs):
self.route = self.kwargs.get('route') or self.route self.route = self.kwargs.get('route') or self.route
@ -55,8 +84,9 @@ class PostListView (ListView):
def get_queryset (self): def get_queryset (self):
qs = self.route.get_queryset(self.model, self.request, **self.kwargs) qs = self.route.get_queryset(self.model, self.request, **self.kwargs)
query = self.query
query = self.query or PostListView.Query(self.request.GET) query.update(self.request.GET)
if query.exclude: if query.exclude:
qs = qs.exclude(id = int(exclude)) qs = qs.exclude(id = int(exclude))
@ -67,16 +97,21 @@ class PostListView (ListView):
qs.order_by('date', 'id') qs.order_by('date', 'id')
else: else:
qs.order_by('-date', '-id') qs.order_by('-date', '-id')
if query.fields:
self.fields = [
field for field in query.fields
if field in self.__class__.fields
]
return qs return qs
def get_context_data (self, **kwargs): def get_context_data (self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context.update(self.get_base_context())
context.update({ context.update({
'list': self,
'title': self.get_title(), 'title': self.get_title(),
'classes': self.classes,
}) })
return context return context
def get_title (self): def get_title (self):
@ -88,14 +123,12 @@ class PostListView (ListView):
return title return title
class PostDetailView (DetailView): class PostDetailView (DetailView, PostBaseView):
""" """
Detail view for posts and children Detail view for posts and children
""" """
template_name = 'cms/detail.html' template_name = 'cms/detail.html'
website = None
embed = False
sections = [] sections = []
def __init__ (self, sections = None, *args, **kwargs): def __init__ (self, sections = None, *args, **kwargs):
@ -116,6 +149,7 @@ class PostDetailView (DetailView):
def get_context_data (self, **kwargs): def get_context_data (self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context.update(self.get_base_context())
context.update({ context.update({
'sections': [ 'sections': [
section.get(self.request, object = self.object) section.get(self.request, object = self.object)
@ -158,39 +192,44 @@ class ViewSet:
[ routes.DetailRoute.as_url(self.model, self.detail_view ) ] [ routes.DetailRoute.as_url(self.model, self.detail_view ) ]
class Menu (DetailView): class Menu (View):
template_name = 'cms/menu.html' template_name = 'cms/menu.html'
name = '' name = ''
enabled = True enabled = True
classes = '' classes = ''
position = '' # top, left, bottom, right position = '' # top, left, bottom, right, header, footer
sections = None sections = None
def __init__ (self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.name = self.name or ('menu_' + self.position)
def get_context_data (self, **kwargs): def get_context_data (self, **kwargs):
context = super().get_context_data(**kwargs) return {
context.update({
'name': self.name, 'name': self.name,
'classes': self.classes, 'classes': self.classes,
'position': self.position, 'position': self.position,
'sections': [ 'sections': [
section.get(self.request, object = self.object) section.get(self.request, object = None)
for section in self.sections for section in self.sections
] ]
}) }
def get (self, **kwargs): def get (self, request, **kwargs):
self.request = request
context = self.get_context_data(**kwargs) context = self.get_context_data(**kwargs)
return render_to_string(self.template_name, context) return render_to_string(self.template_name, context)
class Section (DetailView): class Section (View):
""" """
Base class for sections. Sections are view that can be used in detail view Base class for sections. Sections are view that can be used in detail view
in order to have extra content about a post. in order to have extra content about a post.
""" """
template_name = 'cms/section.html' template_name = 'cms/section.html'
require_object = False require_object = False
object = None
classes = '' classes = ''
title = '' title = ''
content = '' content = ''
@ -198,18 +237,18 @@ class Section (DetailView):
bottom = '' bottom = ''
def get_context_data (self, **kwargs): def get_context_data (self, **kwargs):
context = super().get_context_data(**kwargs) context = {
context.update({
'title': self.title, 'title': self.title,
'header': self.header, 'header': self.header,
'content': self.content, 'content': self.content,
'bottom': self.bottom, 'bottom': self.bottom,
'classes': self.classes, 'classes': self.classes,
}) }
return context return context
def get (self, request, **kwargs): def get (self, request, **kwargs):
self.object = kwargs.get('object') or self.object self.object = kwargs.get('object') or self.object
self.request = request
context = self.get_context_data(**kwargs) context = self.get_context_data(**kwargs)
return render_to_string(self.template_name, context) return render_to_string(self.template_name, context)
@ -240,7 +279,7 @@ class ListSection (Section):
def get_context_data (self, **kwargs): def get_context_data (self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context.update({ context.update({
'classes': context.classes + ' section_list', 'classes': context.get('classes') + ' section_list',
'icon_size': self.icon_size, 'icon_size': self.icon_size,
'object_list': self.get_object_list(), 'object_list': self.get_object_list(),
}) })

View File

@ -2,6 +2,7 @@ import cms.routes as routes
class Website: class Website:
name = '' name = ''
domain = ''
logo = None logo = None
menus = None menus = None
router = None router = None
@ -10,13 +11,28 @@ class Website:
self.__dict__.update(kwargs) self.__dict__.update(kwargs)
if not self.router: if not self.router:
self.router = routes.Router() self.router = routes.Router()
if not self.sets:
self.sets = []
def register_set (self, view_set): def register_set (self, view_set):
view_set = view_set(website = self) view_set = view_set(website = self)
self.router.register_set(view_set) self.router.register_set(view_set)
def get_menu (self, position):
for menu in self.menus:
if menu.enabled and menu.position == position:
return menu
def get_top_menu (self):
return self.get_menu('top')
def get_left_menu (self):
return self.get_menu('left')
def get_bottom_menu (self):
return self.get_menu('bottom')
def get_right_menu (self):
return self.get_menu('right')
@property @property
def urls (self): def urls (self):
return self.router.get_urlpatterns() return self.router.get_urlpatterns()

View File

@ -4,8 +4,9 @@ from website.models import *
from website.views import * from website.views import *
from cms.models import Article from cms.models import Article
from cms.views import ViewSet, Menu from cms.views import ViewSet, Menu, Section
from cms.routes import * from cms.routes import *
from cms.website import Website
class ProgramSet (ViewSet): class ProgramSet (ViewSet):
model = Program model = Program
@ -44,10 +45,12 @@ website = Website(
menus = [ menus = [
Menu( Menu(
position = 'top', position = 'top',
sections = [] sections = [
Section(content = "Radio Campus le SITE")
]
) )
], ],
}) )
website.register_set(ProgramSet) website.register_set(ProgramSet)