blob: 381b5501a672f24dbf577f4d5903b1e5b63d3818 [file] [log] [blame]
import logging
from tg.decorators import Decoration
from tg.render import render
from pylons import c, request
from ming import schema
from ming.orm import Mapper
from ming.orm import FieldProperty, ForeignIdProperty
from allura.lib.helpers import push_config
from allura.model import Artifact
log = logging.getLogger(__name__)
class PortalConfig(Artifact):
class __mongometa__:
name='portal_config'
type_s = 'Project Portal Configuration'
_id = FieldProperty(schema.ObjectId)
user_id = ForeignIdProperty('User')
layout_class = FieldProperty(str)
layout = FieldProperty([
{'name':str,
'content':[
{'mount_point':str,
'widget_name':str }
]
}])
@classmethod
def current(cls):
result = cls.query.get(user_id=c.user._id)
if result is None:
result = cls(user_id=c.user._id,
layout_class='onecol',
layout=[dict(name='content',
content=[dict(mount_point='home',
widget_name='welcome')
])])
return result
def rendered_layout(self):
return [
dict(name=div.name,
content=[ render_widget(**w)
for w in div.content]
)
for div in self.layout ]
def url(self):
return self.app_config.script_name()
def index(self):
return None
def render_widget(mount_point, widget_name):
app = c.project.app_instance(mount_point)
method = getattr(app.widget(app), widget_name)
with push_config(c, app=app):
result = method()
if isinstance(result, dict):
deco = Decoration.get_decoration(method)
content_type, engine, template, exclude_names = \
deco.lookup_template_engine(request)
template_vars = dict((k,v) for k,v in result.iteritems()
if k not in exclude_names)
return render(template_vars, engine, template)
return result
Mapper.compile_all()