Hi Bill, thank you so much for your interest. The CMS is roughly based on ExponentCMS however with a lot of modifications based on my experience of it and trying to design to eliminate its weaknesses. You are right about documentation being key and I would love to welcome you to the project. I am giving you immediate access to the Google Code project on account of your enthusiasm, feel free to fill out the wiki in terms of documentation. I will briefly give you an outline of the code and feel free to ask for information where it is not clear.
Firstly have you managed to successfully deploy the system? I have received some comments that people were not able to, but nobody followed up with any information regarding their environment so I want to iron that out in case I am the only one able to actually run it even though I have it up and running on
http://www.gae-cms.com (via an AppSpot account) without problem so I'm not sure. Someone alluded to the existence of .svn directories being the problem but I have that in my local environment with no problem.
The place to start as with any App Engine project is the app.yaml file. Simply put, it defines that compressor.py handle requests to CSS and JS files while router.py handles all other requests.
Next let's look at router.py. The main idea is that it passes on whatever request it gets in the path on to the section.py module. The section module will handle the request made and return a string (actually unicode) of whatever content was requested within a section which is then returned to the client.
Before we examine the section.py module, which is quite critical, let's look at the two directories at the root of the project i.e. framework and themes. The themes directory is where any expert on ExponentCMS will recognise the influence. Any subfolder within it is taken as a theme and can be applied to a Section. Each theme can have multiple templates which are defined in the themes/_/templates directory. A template is a Django template which should define all of the content within the
<body></body> tags. It has access to special variables that are defined in the section object that it has access to, and also can call certain functions defined in /framework/templatetags/filters.py. The only actual requirement for a template is that it *must* call
{{ main|safe }} which will define just the main content of the current section. However it can define HTML tags and put Container modules within them which then can house other modules, or it can also directly define a module without a Container such as a Text module for the footer. I use the term module here but actually the term we should use is Content as module is a Python reserved word. It can define multiple types of Content that sit within the template. An example of the footer content could be:
<div class="ft"> {{ section|view:"GLOBAL, footer, Text, default"|safe }}</div>Here we are passing the view filter function the section object as well as saying that we want content of type GLOBAL with the identifier "footer" of type Text and view type default. In short, it means that the footer Text Content will be global in scope meaning it is the same content across multiple sections, as opposed to LOCAL to a section. This Text Content has default view (there can be multiple views and we can even define the same Content having different views applied to it).
Also another key is that a template can include CSS and JS files included in its theme directory. For example:
{{ section|yuicss:"cssfonts/cssfonts.css,cssreset/cssreset.css,cssbase/cssbase.css" }}
{{ section|themecss:"base.css" }}
{% if section.mobile_ua %}
{{ section|themecss:"mobile.css" }}
{{ section|viewport_content:"width=240, initial-scale=1.0" }}
{% else %}
{{ section|themecss:"layout.css" }}
{{ section|yuicss:"cssgrids/cssgrids.css" }}
{% endif %}Here we are stating that we want to include CSS files from the YUI framework cssfonts.css, cssreset.css and cssbase.css. YUI is the CSS framework I have gone with although it is in early stages of this project but I just found that it was full featured enough and written in a way that complements this CMS (we could always additionally define and include jquery for example as a local css file). YUI however is used by most Content views and is the default CSS framwork. Going back to our snippet, we can also notice from our local theme directories CSS files, we are including base.css. Additionally we are saying if it is a mobile client, to include the local mobile.css file, otherwise the layout.css and cssgrids.css from YUI (essentially used to have multiple columns).
I think I will end my topic of themes here however I will mention that in addition to having themes stored locally, a user can actually create and manage dynamic themes (meaning those not stored on the local file system) following the same syntax I've described via the administration.
The next topic is to discuss Sections, "modules" (Content) and everything stored within the framework directory. I will continue that topic in my next post as this is a lot to type without any feedback so please feel free.
Regards,
Imran