Hide keyboard shortcuts

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 

11 

12 

13def db(request): 

14 # database connection 

15 maker = request.registry.dbmaker 

16 session = maker() 

17 

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) 

25 

26 return session 

27 

28 

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') 

38 

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) 

43 

44 # Add settings from YAML file 

45 

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() 

61 

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) 

69 

70 # WHEN ADDING RESOURCES HERE ORDER BY MOST GENERAL TO FINEST GRAINED 

71 # xpyr-add-route 

72 

73 # SUPER-CLASS RESOURCES 

74 config.add_route('base_view', '/base') # -- 

75 config.add_route('base_element_view', '/base/{elementId}') # -- 

76 

77 # ACTIONS 

78 config.add_route( 

79 'refresh_sidebar_list_counts', '/actions/refresh_sidebar_list_counts') # -- 

80 

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) 

85 

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"]) 

95 

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') # -- 

101 

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') # -- 

108 

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') # -- 

118 

119 # TOP-LEVEL RESOURCE ELEMENTS 

120 config.add_route('transients_element', '/transients/{elementId}') # -- 

121 config.add_route('stats_element', '/stats/{elementId}') # -- 

122 

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') 

136 

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}') # -- 

144 

145 # SCAN FOR CONFIGURATION DECORATION 

146 config.scan() 

147 config.scan("dryxPyramid") 

148 

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}) 

175 

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) 

183 

184 config.include('pyramid_debugtoolbar') 

185 config.set_debugtoolbar_request_authorization(admin_only_debugtoolbar) 

186 

187 return config.make_wsgi_app() 

188 

189 

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 = "" 

197 

198 try: 

199 if ("marshall/" in request.referrer) and "/_debug_toolbar/" in request.url: 

200 toolbar_enabled = True 

201 except: 

202 pass 

203 

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 

209 

210 return toolbar_enabled