adding prototype cms app with pages and menu
This commit is contained in:
parent
0f6843b08d
commit
d0be075c89
9 changed files with 142 additions and 0 deletions
0
symposion_project/apps/cms/__init__.py
Normal file
0
symposion_project/apps/cms/__init__.py
Normal file
19
symposion_project/apps/cms/admin.py
Normal file
19
symposion_project/apps/cms/admin.py
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
|
||||||
|
from mptt.admin import MPTTModelAdmin
|
||||||
|
|
||||||
|
from cms.models import MenuItem, Page
|
||||||
|
|
||||||
|
|
||||||
|
class PageAdmin(MPTTModelAdmin):
|
||||||
|
prepopulated_fields = {"slug": ("title",)}
|
||||||
|
list_display = ("title", "published", "status")
|
||||||
|
|
||||||
|
admin.site.register(Page, PageAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
class MenuItemAdmin(MPTTModelAdmin):
|
||||||
|
prepopulated_fields = {"slug": ("name",)}
|
||||||
|
list_display = ("name", "login_required", "published",)
|
||||||
|
|
||||||
|
admin.site.register(MenuItem, MenuItemAdmin)
|
10
symposion_project/apps/cms/context_processors.py
Normal file
10
symposion_project/apps/cms/context_processors.py
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
from cms.models import MenuItem
|
||||||
|
|
||||||
|
|
||||||
|
def menuitems(request):
|
||||||
|
qs = MenuItem.objects.filter(published=True)
|
||||||
|
if not request.user.is_authenticated():
|
||||||
|
qs = qs.filter(login_required=False)
|
||||||
|
return {
|
||||||
|
"menuitems": qs,
|
||||||
|
}
|
81
symposion_project/apps/cms/models.py
Normal file
81
symposion_project/apps/cms/models.py
Normal file
|
@ -0,0 +1,81 @@
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
from django.db import models
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
from markitup.fields import MarkupField
|
||||||
|
|
||||||
|
from taggit.managers import TaggableManager
|
||||||
|
|
||||||
|
from mptt.models import MPTTModel, TreeForeignKey
|
||||||
|
from mptt.utils import drilldown_tree_for_node
|
||||||
|
|
||||||
|
|
||||||
|
class ContentBase(models.Model):
|
||||||
|
|
||||||
|
STATUS_CHOICES = (
|
||||||
|
(1, _("Draft")),
|
||||||
|
(2, _("Public")),
|
||||||
|
)
|
||||||
|
|
||||||
|
title = models.CharField(max_length=100)
|
||||||
|
slug = models.CharField(max_length=100, blank=True, null=True)
|
||||||
|
body = MarkupField()
|
||||||
|
|
||||||
|
tags = TaggableManager(blank=True)
|
||||||
|
|
||||||
|
status = models.IntegerField(choices=STATUS_CHOICES, default=2)
|
||||||
|
published = models.DateTimeField(default=datetime.now)
|
||||||
|
created = models.DateTimeField(editable=False, default=datetime.now)
|
||||||
|
updated = models.DateTimeField(editable=False, default=datetime.now)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
abstract = True
|
||||||
|
|
||||||
|
|
||||||
|
class Page(MPTTModel, ContentBase):
|
||||||
|
|
||||||
|
parent = TreeForeignKey("self", null=True, blank=True, related_name="children")
|
||||||
|
ordering = models.PositiveIntegerField(default=1)
|
||||||
|
path = models.TextField(blank=True, editable=False)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.title
|
||||||
|
|
||||||
|
def save(self, calculate_path=True, *args, **kwargs):
|
||||||
|
super(Page, self).save(*args, **kwargs)
|
||||||
|
if calculate_path:
|
||||||
|
self.calculate_path()
|
||||||
|
|
||||||
|
def calculate_path(self):
|
||||||
|
self.path = ""
|
||||||
|
for page in drilldown_tree_for_node(self):
|
||||||
|
if page == self:
|
||||||
|
self.path += page.slug
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
self.path += "%s/" % page.slug
|
||||||
|
self.save(calculate_path=False)
|
||||||
|
|
||||||
|
class MPTTMeta:
|
||||||
|
order_insertion_by = ["title"]
|
||||||
|
|
||||||
|
|
||||||
|
class MenuItem(MPTTModel):
|
||||||
|
|
||||||
|
name = models.CharField(max_length=50, unique=True)
|
||||||
|
slug = models.SlugField()
|
||||||
|
parent = TreeForeignKey("self", null=True, blank=True, related_name="children")
|
||||||
|
|
||||||
|
url = models.CharField(max_length=200)
|
||||||
|
#FIELDNAME = models.ForeignKey()
|
||||||
|
|
||||||
|
published = models.BooleanField(default=True)
|
||||||
|
login_required = models.BooleanField(default=False)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.name
|
||||||
|
|
||||||
|
|
||||||
|
class MPTTMeta:
|
||||||
|
order_insertion_by = ["name"]
|
13
symposion_project/apps/cms/views.py
Normal file
13
symposion_project/apps/cms/views.py
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
from django.shortcuts import render_to_response
|
||||||
|
from django.template import RequestContext
|
||||||
|
|
||||||
|
from cms.models import Page
|
||||||
|
|
||||||
|
|
||||||
|
def page(request, slug):
|
||||||
|
|
||||||
|
page = Page.objects.get(path=slug)
|
||||||
|
|
||||||
|
return render_to_response("cms/page_detail.html", {
|
||||||
|
"page": page,
|
||||||
|
}, context_instance=RequestContext(request))
|
|
@ -23,3 +23,7 @@ python-openid==2.2.5
|
||||||
metron==0.1
|
metron==0.1
|
||||||
|
|
||||||
pinax-theme-bootstrap==0.1.5
|
pinax-theme-bootstrap==0.1.5
|
||||||
|
django-taggit==0.9.3
|
||||||
|
django-reversion==1.5.1
|
||||||
|
django-markitup==1.0.0
|
||||||
|
markdown==2.1.1
|
||||||
|
|
|
@ -157,6 +157,10 @@ INSTALLED_APPS = [
|
||||||
"timezones",
|
"timezones",
|
||||||
"emailconfirmation",
|
"emailconfirmation",
|
||||||
"metron",
|
"metron",
|
||||||
|
"markitup",
|
||||||
|
"taggit",
|
||||||
|
"cms",
|
||||||
|
"mptt",
|
||||||
|
|
||||||
# Pinax
|
# Pinax
|
||||||
"pinax.apps.account",
|
"pinax.apps.account",
|
||||||
|
@ -196,6 +200,8 @@ DEBUG_TOOLBAR_CONFIG = {
|
||||||
"INTERCEPT_REDIRECTS": False,
|
"INTERCEPT_REDIRECTS": False,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MARKITUP_FILTER = ("markdown.markdown", {"safe_mode": True})
|
||||||
|
|
||||||
# local_settings.py can be used to override environment-specific settings
|
# local_settings.py can be used to override environment-specific settings
|
||||||
# like database and email that differ between development and production.
|
# like database and email that differ between development and production.
|
||||||
try:
|
try:
|
||||||
|
|
6
symposion_project/templates/cms/page_detail.html
Normal file
6
symposion_project/templates/cms/page_detail.html
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
{% extends "site_base.html" %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<h1>{{ page.title }}</h1>
|
||||||
|
{{ page.body }}
|
||||||
|
{% endblock %}
|
|
@ -10,6 +10,7 @@ from pinax.apps.account.openid_consumer import PinaxConsumer
|
||||||
|
|
||||||
handler500 = "pinax.views.server_error"
|
handler500 = "pinax.views.server_error"
|
||||||
|
|
||||||
|
WIKI_SLUG = r"(([\w-]{2,})(/[\w-]{2,})*)"
|
||||||
|
|
||||||
urlpatterns = patterns("",
|
urlpatterns = patterns("",
|
||||||
url(r"^$", direct_to_template, {
|
url(r"^$", direct_to_template, {
|
||||||
|
@ -20,6 +21,8 @@ urlpatterns = patterns("",
|
||||||
url(r"^about/", include("about.urls")),
|
url(r"^about/", include("about.urls")),
|
||||||
url(r"^account/", include("pinax.apps.account.urls")),
|
url(r"^account/", include("pinax.apps.account.urls")),
|
||||||
url(r"^openid/", include(PinaxConsumer().urls)),
|
url(r"^openid/", include(PinaxConsumer().urls)),
|
||||||
|
url(r"^markitup/", include("markitup.urls")),
|
||||||
|
url(r"^pages/(?P<slug>%s)/$" % WIKI_SLUG, "cms.views.page", name="cms_page"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue