Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1from __future__ import absolute_import
2from . import cl_utils
3from pyramid.config import Configurator
4from sqlalchemy import engine_from_config
5from sqlalchemy.orm import sessionmaker
6from pyramid.path import AssetResolver
7from pyramid.authentication import AuthTktAuthenticationPolicy
8from pyramid.authorization import ACLAuthorizationPolicy
9from pyramid.settings import aslist
10from os.path import expanduser
13def db(request):
14 # database connection
15 maker = request.registry.dbmaker
16 session = maker()
18 def cleanup(request):
19 if request.exception is not None:
20 session.rollback()
21 else:
22 session.commit()
23 session.close()
24 request.add_finished_callback(cleanup)
26 return session
29def main(global_config, **settings):
30 """ This function returns a Pyramid WSGI application.
31 """
32 import dryxPyramid
33 from dryxPyramid.security import groupfinder
34 import yaml
35 # the main configurator
36 config = Configurator(
37 settings=settings, root_factory='dryxPyramid.models.models_login_post.RootFactory')
39 # add database connection
40 engine = engine_from_config(settings, prefix='sqlalchemy.')
41 config.registry.dbmaker = sessionmaker(bind=engine)
42 config.add_request_method(db, reify=True)
44 # Add settings from YAML file
46 myWebapp = AssetResolver("marshall_webapp")
47 theseSettings = config.get_settings()
48 settingsPath = theseSettings["settingsFile"]
49 if settingsPath[0] == "~":
50 from os.path import expanduser
51 home = expanduser("~")
52 settingsPath = settingsPath.replace("~/", home + "/")
53 if settingsPath[0] != "/":
54 settingsPath = myWebapp.resolve(
55 theseSettings["settingsFile"]).abspath()
56 stream = open(settingsPath, 'r')
57 settings = yaml.load(stream)
58 config.add_settings(settings)
59 config.add_settings({"yaml settings": settings})
60 stream.close()
62 # add authorisation
63 secret = settings["secrets"]["authn policy"]
64 authn_policy = AuthTktAuthenticationPolicy(
65 secret, callback=groupfinder, hashalg='sha512')
66 authz_policy = ACLAuthorizationPolicy()
67 config.set_authentication_policy(authn_policy)
68 config.set_authorization_policy(authz_policy)
70 # WHEN ADDING RESOURCES HERE ORDER BY MOST GENERAL TO FINEST GRAINED
71 # xpyr-add-route
73 # SUPER-CLASS RESOURCES
74 config.add_route('base_view', '/base') # --
75 config.add_route('base_element_view', '/base/{elementId}') # --
77 # ACTIONS
78 config.add_route(
79 'refresh_sidebar_list_counts', '/actions/refresh_sidebar_list_counts') # --
81 # STATIC VIEWS/RESOURCES
82 config.add_static_view('static', 'static', cache_max_age=3600)
83 config.add_static_view(
84 '.codekit-cache', '.codekit-cache', cache_max_age=3600)
86 home = expanduser("~")
87 settings[
88 "cache-directory"] = settings["cache-directory"].replace("~", home)
89 print(settings[
90 "cache-directory"])
91 config.add_static_view(
92 'caches', 'marshall_webapp:caches', cache_max_age=3600)
93 config.override_asset(to_override='marshall_webapp:caches/',
94 override_with=settings["cache-directory"])
96 # TOP-LEVEL SERVICES
97 config.add_route('index', '/') # --
98 config.add_route('download', '/download') # --
99 config.add_route('login', '/login') # --
100 config.add_route('logout', '/logout') # --
102 # TOP-LEVEL RESOURCES
103 config.add_route('calendars', '/calendars')
104 config.add_route('members', '/members')
105 config.add_route('transients', '/transients') # --
106 config.add_route('xmatches', '/xmatches') # --
107 config.add_route('stats', '/stats') # --
109 # TOP-LEVEL SUBRESOURCES
110 config.add_route('transients_comments', '/transients/comments') # --
111 config.add_route('transients_akas', '/transients/akas') # --
112 config.add_route('transients_context', '/transients/context') # --
113 config.add_route(
114 'transients_search', '/transients/search') # --
115 config.add_route('xmatches_catalogues', '/xmatches/catalogues') # --
116 config.add_route('xmatches_searches', '/xmatches/searches') # --
117 config.add_route('xmatches_views', '/xmatches/views') # --
119 # TOP-LEVEL RESOURCE ELEMENTS
120 config.add_route('transients_element', '/transients/{elementId}') # --
121 config.add_route('stats_element', '/stats/{elementId}') # --
123 # TOP-LEVEL RESOURCE-ELEMENTS-SUBRESOURCES
124 config.add_route(
125 'transients_element_comments', '/transients/{elementId}/comments') # --
126 config.add_route(
127 'transients_element_context', '/transients/{elementId}/context') # --
128 config.add_route(
129 'transients_element_lightcurves', '/transients/{elementId}/lightcurves') # --
130 config.add_route('transients_element_obs',
131 '/transients/{elementId}/obs') # --
132 config.add_route('transients_history',
133 '/transients/{elementId}/history') # --
134 config.add_route(
135 'transients_element_akas', '/transients/{elementId}/akas')
137 # TOP-LEVEL SUBRESOURCES-ELEMENTS
138 config.add_route('xmatches_element_catalogues',
139 '/xmatches/catalogues/{elementId}') # --
140 config.add_route('xmatches_element_searches',
141 '/xmatches/searches/{elementId}') # --
142 config.add_route('xmatches_element_views',
143 '/xmatches/views/{elementId}') # --
145 # SCAN FOR CONFIGURATION DECORATION
146 config.scan()
147 config.scan("dryxPyramid")
149 # add database connection as a setting (incase we want to use pymysql over
150 # sqlachemy)
151 import pymysql as ms
152 # SETUP A DATABASE CONNECTION BASED ON WHAT ARGUMENTS HAVE BEEN PASSED
153 if "database settings" in settings:
154 host = settings["database settings"]["host"]
155 user = settings["database settings"]["user"]
156 passwd = settings["database settings"]["password"]
157 dbName = settings["database settings"]["db"]
158 port = False
159 if "port" in settings["database settings"]:
160 port = settings["database settings"]["port"]
161 dbConn = ms.connect(
162 host=host,
163 user=user,
164 passwd=passwd,
165 db=dbName,
166 port=port,
167 use_unicode=True,
168 charset='utf8',
169 local_infile=1,
170 client_flag=ms.constants.CLIENT.MULTI_STATEMENTS,
171 connect_timeout=3600,
172 autocommit=True
173 )
174 config.add_settings({"dbConn": dbConn})
176 # add some deafult renderers
177 config.add_renderer('json', dryxPyramid.renderers.renderer_json)
178 config.add_renderer('csv', dryxPyramid.renderers.renderer_csv)
179 config.add_renderer(
180 'plain_table', dryxPyramid.renderers.renderer_plain_table)
181 config.add_renderer(
182 'plain_text', dryxPyramid.renderers.renderer_plain_text)
184 config.include('pyramid_debugtoolbar')
185 config.set_debugtoolbar_request_authorization(admin_only_debugtoolbar)
187 return config.make_wsgi_app()
190def admin_only_debugtoolbar(request):
191 """
192 Enable toolbar for administrators only.
193 Returns True when it should be enabled.
194 """
195 toolbar_enabled = False
196 group = ""
198 try:
199 if ("marshall/" in request.referrer) and "/_debug_toolbar/" in request.url:
200 toolbar_enabled = True
201 except:
202 pass
204 for item in request.effective_principals:
205 if "group:" in item:
206 group = item.replace("group:", "")
207 if group == "superadmin":
208 toolbar_enabled = True
210 return toolbar_enabled