forked from rc/aircox
102 lines
3.2 KiB
Python
102 lines
3.2 KiB
Python
import aircox_cms.routes as routes
|
|
import aircox_cms.views as views
|
|
|
|
class Website:
|
|
name = ''
|
|
domain = ''
|
|
description = 'An aircox website' # public description (used in meta info)
|
|
tags = 'aircox,radio,music' # public keywords (used in meta info)
|
|
|
|
styles = '' # relative url to stylesheet file
|
|
menus = None # list of menus
|
|
menu_layouts = ['top', 'left', # available positions
|
|
'right', 'bottom',
|
|
'header', 'footer']
|
|
router = None
|
|
urls = []
|
|
registry = {}
|
|
|
|
def __init__ (self, **kwargs):
|
|
self.registry = {}
|
|
self.urls = []
|
|
self.__dict__.update(kwargs)
|
|
|
|
def name_of_model (self, model):
|
|
for name, _model in self.registry.items():
|
|
if model is _model:
|
|
return name
|
|
|
|
def register_model (self, name, model):
|
|
"""
|
|
Register a model and return the name under which it is registered.
|
|
Raise a ValueError if another model is yet associated under this name.
|
|
"""
|
|
if name in self.registry and self.registry[name] is not model:
|
|
raise ValueError('A model has yet been registered under "{}"'
|
|
.format(name))
|
|
self.registry[name] = model
|
|
return name
|
|
|
|
def register_detail (self, name, model, view = views.PostDetailView,
|
|
**view_kwargs):
|
|
"""
|
|
Register a model and the detail view
|
|
"""
|
|
name = self.register_model(name, model)
|
|
view = view.as_view(
|
|
website = self,
|
|
model = model,
|
|
**view_kwargs,
|
|
)
|
|
self.urls.append(routes.DetailRoute.as_url(name, model, view))
|
|
self.registry[name] = model
|
|
|
|
def register_list (self, name, model, view = views.PostListView,
|
|
routes = [], **view_kwargs):
|
|
"""
|
|
Register a model and the given list view using the given routes
|
|
"""
|
|
name = self.register_model(name, model)
|
|
view = view.as_view(
|
|
website = self,
|
|
model = model,
|
|
**view_kwargs
|
|
)
|
|
self.urls += [ route.as_url(name, model, view) for route in routes ]
|
|
self.registry[name] = model
|
|
|
|
def register (self, name, model, sections = None, routes = None,
|
|
list_kwargs = {}, detail_kwargs = {}):
|
|
if sections:
|
|
self.register_detail(
|
|
name, model,
|
|
sections = sections,
|
|
**detail_kwargs
|
|
)
|
|
if routes:
|
|
self.register_list(
|
|
name, model,
|
|
routes = routes,
|
|
**list_kwargs
|
|
)
|
|
|
|
def get_menu (self, position):
|
|
"""
|
|
Get an enabled menu by its position
|
|
"""
|
|
for menu in self.menus:
|
|
if menu.enabled and menu.position == position:
|
|
self.check_menu_tag(menu)
|
|
return menu
|
|
|
|
def check_menu_tag (self, menu):
|
|
"""
|
|
Update menu tag if it is a footer or a header
|
|
"""
|
|
if menu.position in ('footer','header'):
|
|
menu.tag = menu.position
|
|
if menu.position in ('left', 'right'):
|
|
menu.tag = 'side'
|
|
|
|
|