diff --git a/cms/routes.py b/cms/routes.py index b09a2b8..e41af0c 100644 --- a/cms/routes.py +++ b/cms/routes.py @@ -1,5 +1,6 @@ from django.conf.urls import url from django.utils import timezone +from django.utils.translation import ugettext as _, ugettext_lazy from website.models import * from website.views import * @@ -50,12 +51,10 @@ class Route: """ pass - @classmethod def get_title (cl, model, request, **kwargs): return '' - @classmethod def as_url (cl, model, view, view_kwargs = None): base_name = model._meta.verbose_name_plural.lower() @@ -89,7 +88,6 @@ class DetailRoute (Route): ('slug', '(\w|-|_)+', True), ] - @classmethod def get_object (cl, model, request, pk, **kwargs): return model.objects.get(pk = int(pk)) @@ -102,6 +100,12 @@ class AllRoute (Route): def get_queryset (cl, model, request, **kwargs): 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): name = 'thread' diff --git a/cms/templates/cms/base_content.html b/cms/templates/cms/base_content.html new file mode 100644 index 0000000..93b8ff5 --- /dev/null +++ b/cms/templates/cms/base_content.html @@ -0,0 +1,8 @@ +{% block pre_title %} +{% endblock %} +{% block title %} +{% endblock %} +{% block content %} +{% endblock %} + + diff --git a/cms/templates/cms/base_site.html b/cms/templates/cms/base_site.html new file mode 100644 index 0000000..31d738d --- /dev/null +++ b/cms/templates/cms/base_site.html @@ -0,0 +1,49 @@ + + + {{ website.name }} {% if title %}- {{ title }} {% endif %} + + + {% if menus.top %} + {{ menus.top|safe }} + {% endif %} + + {% block header %} + {% if menus.header %} +
+ {{ menus.header|safe }} +
+ {% endif %} + {% endblock %} + +
+ {% if menus.left %} + {{ menus.left|safe }} + {% endif %} + +
+ {% block pre_title %} + {% endblock %} +

+ {% block title %} + {{ title }} + {% endblock %} +

+ {% block post_title %} + {% endblock %} +
+ {% block content %} + {% endblock %} +
+
+
+ + {% block footer %} + {% if menus.footer %} + + {% endif %} + {% endblock %} + + + diff --git a/cms/templates/cms/detail.html b/cms/templates/cms/detail.html index 676d6e9..2653b86 100644 --- a/cms/templates/cms/detail.html +++ b/cms/templates/cms/detail.html @@ -1,4 +1,4 @@ -{# {% extends "website/base.html" %} #} +{% extends embed|yesno:"cms/base_content.html,cms/base_site.html" %} {% block title %} {{ object.title }} diff --git a/cms/templates/cms/list.html b/cms/templates/cms/list.html index 51204f6..bb4731a 100644 --- a/cms/templates/cms/list.html +++ b/cms/templates/cms/list.html @@ -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 thumbnail %} -{# {% load website_views %} #} - {% block content %}
{% for post in object_list %} - {% if 'date' in list.fields or 'time' in list.fields %} + {% if 'date' in view.fields or 'time' in list.fields %} {% endif %} - {% if 'image' in list.fields %} + {% if 'image' in view.fields %} {% endif %} - {% if 'title' in list.fields %} + {% if 'title' in view.fields %}

{{ post.title }}

{% endif %} - {% if 'content' in list.fields %} + {% if 'content' in view.fields %}
{{ post.content|safe|striptags|truncatechars:"64" }}
diff --git a/cms/templates/cms/menu.html b/cms/templates/cms/menu.html index adb7946..917406b 100644 --- a/cms/templates/cms/menu.html +++ b/cms/templates/cms/menu.html @@ -1,11 +1,10 @@ - + diff --git a/cms/templates/cms/raw.html b/cms/templates/cms/raw.html deleted file mode 100644 index 238b31d..0000000 --- a/cms/templates/cms/raw.html +++ /dev/null @@ -1 +0,0 @@ -{# #} diff --git a/cms/views.py b/cms/views.py index c6494b1..8eefe68 100644 --- a/cms/views.py +++ b/cms/views.py @@ -1,14 +1,48 @@ from django.shortcuts import render from django.template.loader import render_to_string -from django.views.generic import ListView -from django.views.generic import DetailView +from django.views.generic import ListView, DetailView +from django.views.generic.base import View, TemplateResponseMixin from django.core import serializers from django.utils.translation import ugettext as _, ugettext_lazy 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 """ @@ -20,34 +54,29 @@ class PostListView (ListView): exclude = None order = 'desc' reverse = False + fields = None def __init__ (self, query): + if query: + self.update(query) + + def update (self, query): my_class = self.__class__ if type(query) is my_class: self.__dict__.update(query.__dict__) return - - if type(query) is not dict: - query = query.__dict__ - - self.__dict__ = { k: v for k,v in query.items() } + self.__dict__.update(query) template_name = 'cms/list.html' allow_empty = True - website = None - title = '' - classes = '' - route = None query = None - embed = False fields = [ 'date', 'time', 'image', 'title', 'content' ] def __init__ (self, *args, **kwargs): super().__init__(*args, **kwargs) - if self.query: - self.query = Query(self.query) + self.query = PostListView.Query(self.query) def dispatch (self, request, *args, **kwargs): self.route = self.kwargs.get('route') or self.route @@ -55,8 +84,9 @@ class PostListView (ListView): def get_queryset (self): 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: qs = qs.exclude(id = int(exclude)) @@ -67,16 +97,21 @@ class PostListView (ListView): qs.order_by('date', 'id') else: qs.order_by('-date', '-id') + + if query.fields: + self.fields = [ + field for field in query.fields + if field in self.__class__.fields + ] + return qs def get_context_data (self, **kwargs): context = super().get_context_data(**kwargs) + context.update(self.get_base_context()) context.update({ - 'list': self, 'title': self.get_title(), - 'classes': self.classes, }) - return context def get_title (self): @@ -88,14 +123,12 @@ class PostListView (ListView): return title -class PostDetailView (DetailView): +class PostDetailView (DetailView, PostBaseView): """ Detail view for posts and children """ template_name = 'cms/detail.html' - website = None - embed = False sections = [] def __init__ (self, sections = None, *args, **kwargs): @@ -116,6 +149,7 @@ class PostDetailView (DetailView): def get_context_data (self, **kwargs): context = super().get_context_data(**kwargs) + context.update(self.get_base_context()) context.update({ 'sections': [ section.get(self.request, object = self.object) @@ -158,39 +192,44 @@ class ViewSet: [ routes.DetailRoute.as_url(self.model, self.detail_view ) ] -class Menu (DetailView): +class Menu (View): template_name = 'cms/menu.html' name = '' enabled = True classes = '' - position = '' # top, left, bottom, right + position = '' # top, left, bottom, right, header, footer 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): - context = super().get_context_data(**kwargs) - context.update({ + return { 'name': self.name, 'classes': self.classes, 'position': self.position, 'sections': [ - section.get(self.request, object = self.object) + section.get(self.request, object = None) for section in self.sections ] - }) + } - def get (self, **kwargs): + def get (self, request, **kwargs): + self.request = request context = self.get_context_data(**kwargs) 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 in order to have extra content about a post. """ template_name = 'cms/section.html' require_object = False + object = None classes = '' title = '' content = '' @@ -198,18 +237,18 @@ class Section (DetailView): bottom = '' def get_context_data (self, **kwargs): - context = super().get_context_data(**kwargs) - context.update({ + context = { 'title': self.title, 'header': self.header, 'content': self.content, 'bottom': self.bottom, 'classes': self.classes, - }) + } return context def get (self, request, **kwargs): self.object = kwargs.get('object') or self.object + self.request = request context = self.get_context_data(**kwargs) return render_to_string(self.template_name, context) @@ -240,7 +279,7 @@ class ListSection (Section): def get_context_data (self, **kwargs): context = super().get_context_data(**kwargs) context.update({ - 'classes': context.classes + ' section_list', + 'classes': context.get('classes') + ' section_list', 'icon_size': self.icon_size, 'object_list': self.get_object_list(), }) diff --git a/cms/website.py b/cms/website.py index 6b6bc5a..c87f566 100644 --- a/cms/website.py +++ b/cms/website.py @@ -2,6 +2,7 @@ import cms.routes as routes class Website: name = '' + domain = '' logo = None menus = None router = None @@ -10,13 +11,28 @@ class Website: self.__dict__.update(kwargs) if not self.router: self.router = routes.Router() - if not self.sets: - self.sets = [] def register_set (self, view_set): view_set = view_set(website = self) 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 def urls (self): return self.router.get_urlpatterns() diff --git a/website/urls.py b/website/urls.py index 2f5a2b1..94f4e38 100644 --- a/website/urls.py +++ b/website/urls.py @@ -4,8 +4,9 @@ from website.models import * from website.views import * from cms.models import Article -from cms.views import ViewSet, Menu +from cms.views import ViewSet, Menu, Section from cms.routes import * +from cms.website import Website class ProgramSet (ViewSet): model = Program @@ -44,10 +45,12 @@ website = Website( menus = [ Menu( position = 'top', - sections = [] + sections = [ + Section(content = "Radio Campus le SITE") + ] ) ], -}) +) website.register_set(ProgramSet)