1
|
from cStringIO import StringIO
|
2
|
import os
|
3
|
|
4
|
from quixote import get_session, get_request, get_response, get_publisher
|
5
|
import ezt
|
6
|
|
7
|
import misc
|
8
|
from users import User
|
9
|
|
10
|
|
11
|
DEFAULT_TEMPLATE_EZT = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
12
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
13
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
14
|
<head>
|
15
|
<title>[page_title]</title>
|
16
|
<link rel="stylesheet" type="text/css" href="[css]"/>
|
17
|
[script]
|
18
|
</head>
|
19
|
<body[if-any onload] onload="[onload]"[end]>
|
20
|
<div id="page">
|
21
|
<div id="top"> <h1>[if-any title][title][else][org_name][end]</h1> </div>
|
22
|
<div id="main-content">
|
23
|
[prelude]
|
24
|
[if-any breadcrumb]<p id="breadcrumb">[breadcrumb]</p>[end]
|
25
|
[body]
|
26
|
</div>
|
27
|
<div id="footer"><p id="lasso">Powered by Lasso</p></div>
|
28
|
</div>
|
29
|
</body>
|
30
|
</html>"""
|
31
|
|
32
|
ADMIN_TEMPLATE_EZT = """<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
|
33
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
34
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
35
|
<head>
|
36
|
<title>[page_title]</title>
|
37
|
<link rel="stylesheet" type="text/css" href="[css]"/>
|
38
|
[script]
|
39
|
</head>
|
40
|
<body>
|
41
|
<div id="header">[header_menu]</div>
|
42
|
<div id="main-content">
|
43
|
[user_info]
|
44
|
[if-any breadcrumb]
|
45
|
<p id="breadcrumb">[breadcrumb]</p>
|
46
|
[end]
|
47
|
<h1>[subtitle]</h1>
|
48
|
|
49
|
[body]
|
50
|
|
51
|
</div>
|
52
|
<div id="footer">
|
53
|
<p id="lasso">Powered by Lasso</p>
|
54
|
</div>
|
55
|
</body>
|
56
|
</html>"""
|
57
|
|
58
|
|
59
|
default_template = ezt.Template()
|
60
|
default_template.parse(DEFAULT_TEMPLATE_EZT)
|
61
|
|
62
|
admin_template = ezt.Template()
|
63
|
admin_template.parse(ADMIN_TEMPLATE_EZT)
|
64
|
|
65
|
|
66
|
def html_top(title = None, onload = None, script = None, default_org = 'WCS',
|
67
|
force_ignore_user = False):
|
68
|
get_response().filter.update(locals())
|
69
|
|
70
|
|
71
|
def error_page [html] (error_message, error_title = None, exception = None):
|
72
|
if not error_title:
|
73
|
error_title = _('Error')
|
74
|
script = None
|
75
|
if exception:
|
76
|
scripts = ['/js/prototype.js', '/js/scriptaculous/scriptaculous.js']
|
77
|
script = '\n'.join(
|
78
|
['<script src="%s" type="text/javascript"></script>' % x for x in scripts])
|
79
|
|
80
|
html_top(error_title, script = script)
|
81
|
'<div class="error-page">'
|
82
|
'<p>%s</p>' % error_message
|
83
|
if exception and get_publisher().logger.error_email:
|
84
|
'<p>%s</p>' % _('It has been sent to the site administrator for analyse.')
|
85
|
if exception:
|
86
|
'''<p><a href="#" onclick="new Effect.SlideDown('exception'); '''
|
87
|
'''this.style.display = 'none'; return false;">%s</a></p>''' % _('View Error Details')
|
88
|
'<pre id="exception" style="display: none;"><code>%s</code></pre>' % exception
|
89
|
'</div>'
|
90
|
|
91
|
|
92
|
def decorate(body, response):
|
93
|
body = str(body)
|
94
|
kwargs = {}
|
95
|
for k, v in response.filter.items():
|
96
|
if v:
|
97
|
kwargs[k] = str(v)
|
98
|
onload = kwargs.get('onload')
|
99
|
org_name = misc.cfg.get('sp', {}).get('organization_name', kwargs.get('default_org'))
|
100
|
current_theme = misc.cfg.get('branding', {}).get('theme', 'default')
|
101
|
include_user = misc.cfg.get('misc', {}).get('include-user-details', False)
|
102
|
if kwargs.get('title'):
|
103
|
title = kwargs.get('title')
|
104
|
page_title = '%s - %s' % (org_name, title)
|
105
|
title_or_orgname = title
|
106
|
else:
|
107
|
page_title = org_name
|
108
|
title = None
|
109
|
title_or_orgname = org_name
|
110
|
script = kwargs.get('script') or ''
|
111
|
|
112
|
if response.filter.get('admin_ezt'):
|
113
|
header_menu = kwargs.get('header_menu')
|
114
|
user_info = kwargs.get('user_info')
|
115
|
page_title = kwargs.get('sitetitle') + kwargs.get('title', '')
|
116
|
subtitle = kwargs.get('subtitle')
|
117
|
css = get_request().environ['SCRIPT_NAME'] + '/css/dc2/larpe-admin.css'
|
118
|
script = kwargs.get('scripts')
|
119
|
generate_breadcrumb = True
|
120
|
template = admin_template
|
121
|
else:
|
122
|
if current_theme == 'default':
|
123
|
css = '/css/larpe.css'
|
124
|
else:
|
125
|
css = '/themes/%s/larpe.css' % current_theme
|
126
|
|
127
|
prelude = ''
|
128
|
if include_user and not kwargs.get('force_ignore_user'):
|
129
|
session = get_session()
|
130
|
if session and session.user and not str(session.user).startswith(str('anonymous-')):
|
131
|
try:
|
132
|
user = User.get(session.user)
|
133
|
except (KeyError, ValueError):
|
134
|
pass
|
135
|
else:
|
136
|
prelude = '<p id="prelude">%s</p>' % (_('Logged in as %s.') % user.name)
|
137
|
|
138
|
|
139
|
|
140
|
template_ezt = misc.cfg.get('branding', {}).get('template')
|
141
|
if not template_ezt:
|
142
|
# the theme can provider a default template
|
143
|
filename = os.path.join(get_publisher().data_dir, 'themes', current_theme, 'template.ezt')
|
144
|
if os.path.exists(filename):
|
145
|
template_ezt = file(filename).read()
|
146
|
if template_ezt:
|
147
|
generate_breadcrumb = ('[breadcrumb]' in template_ezt)
|
148
|
template = ezt.Template()
|
149
|
template.parse(template_ezt)
|
150
|
else:
|
151
|
generate_breadcrumb = True
|
152
|
template = default_template
|
153
|
|
154
|
if generate_breadcrumb:
|
155
|
breadcrumb = ''
|
156
|
if hasattr(response, 'breadcrumb') and response.breadcrumb:
|
157
|
s = []
|
158
|
path = get_request().environ['SCRIPT_NAME'] + '/'
|
159
|
for component, label in response.breadcrumb:
|
160
|
if component.startswith('http'):
|
161
|
s.append('<a href="%s">%s</a>' % (component, label))
|
162
|
continue
|
163
|
s.append('<a href="%s%s">%s</a>' % (path, component, label))
|
164
|
path += component
|
165
|
breadcrumb = ' > '.join(s)
|
166
|
|
167
|
fd = StringIO()
|
168
|
template.generate(fd, locals())
|
169
|
return fd.getvalue()
|