1 from __future__ import with_statement
2
3 import os
4 import flask
5
6 from flask_sqlalchemy import SQLAlchemy
7 from contextlib import contextmanager
8 from flask_cache import Cache
9 from flask_openid import OpenID
10 from flask_whooshee import Whooshee
11 from openid_teams.teams import TeamsResponse
12
13 from coprs.redis_session import RedisSessionInterface
14
15 app = flask.Flask(__name__)
16 if "COPRS_ENVIRON_PRODUCTION" in os.environ:
17 app.config.from_object("coprs.config.ProductionConfig")
18 elif "COPRS_ENVIRON_UNITTEST" in os.environ:
19 app.config.from_object("coprs.config.UnitTestConfig")
20 else:
21 app.config.from_object("coprs.config.DevelopmentConfig")
22 if os.environ.get("COPR_CONFIG"):
23 app.config.from_envvar("COPR_CONFIG")
24 else:
25 app.config.from_pyfile("/etc/copr/copr.conf", silent=True)
26
27 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
28
29 oid = OpenID(
30 app, app.config["OPENID_STORE"],
31 safe_roots=[],
32 extension_responses=[TeamsResponse]
33 )
34
35 db = SQLAlchemy(app)
39 """Provide a transactional scope around a series of operations."""
40 session = db.session
41 try:
42 yield session
43 session.commit()
44 except Exception as err:
45 session.rollback()
46 raise
47
48 whooshee = Whooshee(app)
49
50
51 import coprs.filters
52 import coprs.log
53 from coprs.log import setup_log
54 import coprs.models
55 import coprs.whoosheers
56
57 from coprs.helpers import RedisConnectionProvider
58 rcp = RedisConnectionProvider(config=app.config)
59 app.session_interface = RedisSessionInterface(rcp.get_connection())
60
61 cache_rcp = RedisConnectionProvider(config=app.config, db=1)
62 cache = Cache(app, config={
63 'CACHE_TYPE': 'redis',
64 'CACHE_REDIS_DB': 1,
65 'CACHE_KEY_PREFIX': 'copr_cache_',
66 'CACHE_REDIS_HOST': cache_rcp.host,
67 'CACHE_REDIS_PORT': cache_rcp.port,
68 })
69
70 from coprs.views import admin_ns
71 from coprs.views.admin_ns import admin_general
72 from coprs.views import api_ns
73 from coprs.views.api_ns import api_general
74 from coprs.views import apiv3_ns
75 from coprs.views.apiv3_ns import (apiv3_general, apiv3_builds, apiv3_packages, apiv3_projects, apiv3_project_chroots,
76 apiv3_modules, apiv3_build_chroots, apiv3_mock_chroots,
77 apiv3_permissions)
78 from coprs.views import coprs_ns
79 from coprs.views.coprs_ns import coprs_builds
80 from coprs.views.coprs_ns import coprs_general
81 from coprs.views.coprs_ns import coprs_chroots
82 from coprs.views.coprs_ns import coprs_packages
83 from coprs.views import backend_ns
84 from coprs.views.backend_ns import backend_general
85 from coprs.views import misc
86 from coprs.views import status_ns
87 from coprs.views.status_ns import status_general
88 from coprs.views import recent_ns
89 from coprs.views.recent_ns import recent_general
90 from coprs.views.stats_ns import stats_receiver
91 from coprs.views import tmp_ns
92 from coprs.views.tmp_ns import tmp_general
93 from coprs.views.groups_ns import groups_ns
94 from coprs.views.groups_ns import groups_general
95 from coprs.views.user_ns import user_ns
96 from coprs.views.user_ns import user_general
97 from coprs.views.webhooks_ns import webhooks_ns
98 from coprs.views.webhooks_ns import webhooks_general
99 from coprs.views.rss_ns import rss_ns
100 from coprs.views.rss_ns import rss_general
101
102 from coprs.exceptions import ObjectNotFound, AccessRestricted, BadRequest, CoprHttpException, MalformedArgumentException
103 from .context_processors import include_banner, inject_fedmenu, counter_processor
104
105 setup_log()
106
107 app.register_blueprint(api_ns.api_ns)
108 app.register_blueprint(apiv3_ns.apiv3_ns)
109 app.register_blueprint(admin_ns.admin_ns)
110 app.register_blueprint(coprs_ns.coprs_ns)
111 app.register_blueprint(misc.misc)
112 app.register_blueprint(backend_ns.backend_ns)
113 app.register_blueprint(status_ns.status_ns)
114 app.register_blueprint(recent_ns.recent_ns)
115 app.register_blueprint(stats_receiver.stats_rcv_ns)
116 app.register_blueprint(tmp_ns.tmp_ns)
117 app.register_blueprint(groups_ns)
118 app.register_blueprint(user_ns)
119 app.register_blueprint(webhooks_ns)
120 app.register_blueprint(rss_ns)
121
122 app.add_url_rule("/", "coprs_ns.coprs_show", coprs_general.coprs_show)
130
137
144
152
160
161
162 @app.errorhandler(504)
163 -def handle_504(error):
166
167
168 app.jinja_env.trim_blocks = True
169 app.jinja_env.lstrip_blocks = True
170
171 from coprs.rest_api import rest_api_bp, register_api_error_handler, URL_PREFIX
172 register_api_error_handler(app)
173 app.register_blueprint(rest_api_bp, url_prefix=URL_PREFIX)
174
175
176 from flask_sqlalchemy import models_committed
177 models_committed.connect(coprs.whoosheers.CoprWhoosheer.on_commit, sender=app)
178
179
180 @app.route('/system_static/<component>/<path:filename>')
181 @app.route('/system_static/<path:filename>')
182 -def system_static(filename, component=""):
183 """
184 :param component: name of the javascript component provided by a RPM package
185 do not confuse with a name of the RPM package itself
186 (e.g. 'jquery' component is provided by 'js-jquery1' package)
187 :param filename: path to a file relative to the component root directory
188 :return: content of a static file
189 """
190 path = os.path.join("/usr/share/javascript", component)
191 return flask.send_from_directory(path, filename)
192