def run_game(): # Initialize game and create a screen object pygame.init() ai_settings = Settings() screen = pygame.display.set_mode( (ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption("Alien Invasion") play_button = Button(ai_settings, screen, "Play") stats = GameStats(ai_settings) sb = Scoreboard(ai_settings, screen, stats) # Draw the game elements ship = Ship(ai_settings, screen) bullets = Group() aliens = Group() # alien = Alien(ai_settings, screen) gi.create_fleet(ai_settings, screen, ship, aliens) # Start the main loop for the game while True: gc.check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets) if stats.game_active: ship.update() gr.update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets) gr.update_aliens(ai_settings, stats, screen, sb, ship, aliens, bullets) gr.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button)
def create_app(loop): app = web.Application(middlewares=[check_auth_middleware]) settings = Settings() app.update(name='memebattle_back', settings=settings) cors = aiohttp_cors.setup(app, defaults={ "*": aiohttp_cors.ResourceOptions( allow_credentials=True, expose_headers="*", allow_headers="*", ) }) app['websockets'] = [] app['choosed'] = [] app['perms_handlers'] = [check_user_handler, start_game] print('1===================================1') app.on_startup.append(startup) print('2===================================2') app.on_cleanup.append(cleanup) print('3===================================3') app.on_shutdown.append(on_shutdown) print('4===================================4') setup_routes(app, cors) print('5===================================5') return app
def worker(): """ Run the worker """ logger.info('waiting for redis to come up...') settings = Settings() run_worker(WorkerSettings, redis_settings=settings.redis_settings, ctx={'settings': settings})
async def periodic_unhold_all() -> None: """Обнулять холд и обновлять баланс клиентов каждые `unhold_all_interval` секунд.""" logging.info("Starting...") settings = Settings() connection = await asyncpg.connect(dsn=settings.pg_dsn) while True: await asyncio.sleep(settings.unhold_all_interval) logging.info("Subtracting holds from balances...") await query_unhold_all(connection)
def setUp(self): self.settings_patcher = patch( 'app.main.Settings', return_value=Settings(path=r'./resources/specimen.tif'), ) self.app_mock = Mock() compose_patcher = patch('app.main.compose', return_value=self.app_mock) compose_patcher.start() self.addCleanup(Settings.clear) self.addCleanup(compose_patcher.stop)
def elasticsearch_patch(patch): settings = Settings(sender_cls='app.worker.Sender') setup_logging(settings) loop = asyncio.get_event_loop() es = ElasticSearch(settings=settings) try: patch_func = getattr(es, '_patch_' + patch) logger.info('running patch %s...', patch_func.__name__) loop.run_until_complete(patch_func()) finally: es.close()
def dump_to_file(self) -> None: template_path = path.join( Settings().base_path, '../resources/template.xhtml', ) with open(template_path, 'r', encoding='utf-8') as f: template = Template(f.read()) with open(f'{self.number}.xhtml', 'w', encoding='utf-8') as f: f.write( template.substitute(page_number=self.number, content=self.dump()))
def on_download(self, item=None, files_filter=None, path=None): path = path or self.check_dest_path() if not path: return settings = Settings(self._settings.settings) settings.picons_local_path = path + "/" self.run_func( lambda: download_data(settings=settings, download_type=DownloadType.PICONS, callback=self.append_output, files_filter=files_filter), True)
def main(): parsed = CLI().parse(sys.argv[1:]) settings = Settings( debug_mode=parsed.debug, path=parsed.path, output=parsed.output, ) app = compose( preparer=ImagePreparer(), processor=ImageProcessor(), settings=settings, ) app.run()
def worker(wait): """ Run the worker """ settings = Settings(sender_cls='app.worker.Sender') setup_logging(settings) logger.info('waiting for elasticsearch and redis to come up...') wait and sleep(4) _check_services_ready(settings) # redis/the network occasionally hangs and gets itself in a mess if we try to connect too early, # even once it's "up", hence 2 second wait wait and sleep(2) RunWorkerProcess('app/worker.py', 'Worker')
async def create_app(settings: Settings = Settings()) -> web.Application: """Создать и настроить приложение aiohttp.""" app = web.Application(middlewares=[error_middleware, json_middleware]) app.update(settings=settings) app.on_startup.append(startup) app.on_cleanup.append(cleanup) # маршрутизация app.router.add_get("/api/ping", ping, name="ping") app.router.add_get("/api/kill", kill, name="kill") app.router.add_post("/api/add", add, name="add") # type: ignore app.router.add_post("/api/subtract", subtract, name="subtract") # type: ignore app.router.add_post("/api/status", status, name="status") # type: ignore return app
def on_send(self, item=None, files_filter=None, path=None): dest_path = path or self.check_dest_path() if not dest_path: return settings = Settings(self._settings.settings) settings.picons_local_path = "{}/".format(dest_path) self.show_info_message(get_message("Please, wait..."), Gtk.MessageType.INFO) self.run_func(lambda: upload_data( settings=settings, download_type=DownloadType.PICONS, callback=self.append_output, done_callback=lambda: self.show_info_message( get_message("Done!"), Gtk.MessageType.INFO), files_filter=files_filter))
def run_migrations_offline(): """Run migrations in 'offline' mode. This configures the context with just a URL and not an Engine, though an Engine is acceptable here as well. By skipping the Engine creation we don't even need a DBAPI to be available. Calls to context.execute() here emit the given string to the script output. """ context.configure(url=pg_dsn(Settings()), target_metadata=target_metadata, literal_binds=True) with context.begin_transaction(): context.run_migrations()
async def create_app(settings=None): settings = settings or Settings() routes = [ web.get('/map.jpg', get_map, name='get-map'), web.get('/', index, name='index'), web.get('/robots.txt', robots, name='robots'), ] middleware = (error_middleware, ) app = await create_default_app(settings=settings, routes=routes, middleware=middleware) app['index_path'] = build_index() app.update( index_page=build_index(), osm_semaphore=Semaphore(value=32), thread_pool=ThreadPoolExecutor(), ) app.on_cleanup.append(pool_shutdown) return app
def elasticsearch_snapshot(action, snapshot_name): """ create an elastic search snapshot """ settings = Settings(sender_cls='app.worker.Sender') setup_logging(settings) loop = asyncio.get_event_loop() es = ElasticSearch(settings=settings) try: if action == 'create': f = es.create_snapshot() elif action == 'list': f = es.restore_list() else: assert snapshot_name, 'snapshot-name may not be None' f = es.restore_snapshot(snapshot_name) loop.run_until_complete(f) finally: es.close()
def run_migrations_online(): """Run migrations in 'online' mode. In this scenario we need to create an Engine and associate a connection with the context. """ config.set_section_option(config.config_ini_section, 'sqlalchemy.url', pg_dsn(Settings())) connectable = engine_from_config(config.get_section( config.config_ini_section), prefix='sqlalchemy.', poolclass=pool.NullPool) with connectable.connect() as connection: context.configure(connection=connection, target_metadata=target_metadata) with context.begin_transaction(): context.run_migrations()
async def test_cache(test_client): """ tests for cache data """ client = await test_client(create_app) settings = Settings() data = { 'urls': ['https://google.com'] } resp = await client.post('/', json=data) assert resp.status == 200 resp_json = await resp.json() redis_conn = await aioredis.create_connection( settings.REDIS_URL, encoding='utf-8' ) pickled_object = json.loads( await redis_conn.execute('get', 'url::https://google.com') ) assert resp_json[0] == pickled_object
def create_app(loop): # Create base web application app = web.Application() # Settings settings = Settings() # Setup web application paths app.update( name='amiller.im', settings=settings, # path_to_app_root=APP_DIR, path_to_templates=TEMPLATE_DIR, path_to_static=STATIC_DIR, # # blogs=setup_blogs(STATIC_DIR), galleries=setup_galleries(STATIC_DIR), # deployment_time='{:%b, %d %Y %H:%M:%S}'.format(datetime.date.today())) # Template Engine aiohttp_jinja2.setup(app, context_processors=[aiohttp_jinja2.request_processor], loader=jinja2.FileSystemLoader(TEMPLATE_DIR)) # Pre and Post Application Hooks app.on_startup.append(on_startup) app.on_cleanup.append(on_cleanup) # Sessions secret_key = base64.urlsafe_b64decode(settings.COOKIE_SECRET) aiohttp_session.setup(app, EncryptedCookieStorage(secret_key)) # Routes setup_routes(app=app, handler=Handlers) return app
def web(wait): """ Serve the application If the database doesn't already exist it will be created. """ settings = Settings(sender_cls='app.worker.Sender') print(settings.to_string(True), flush=True) setup_logging(settings) logger.info('waiting for elasticsearch and redis to come up...') # give es a chance to come up fully, this just prevents lots of es errors, create_indices is itself lenient # skip wait as es and redis are generally already up and delay is causing missed requests # wait and sleep(4) _check_services_ready(settings) _elasticsearch_setup(settings) logger.info('starting server...') asyncio.get_event_loop().close() asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) loop = asyncio.get_event_loop() app = create_app(loop, settings) run_app(app, port=8000, loop=loop, print=lambda v: None, access_log=None)
def __init__(self, transient, settings: Settings): handlers = { "on_field_icon_press": self.on_field_icon_press, "on_settings_type_changed": self.on_settings_type_changed, "on_reset": self.on_reset, "on_response": self.on_response, "on_connection_test": self.on_connection_test, "on_info_bar_close": self.on_info_bar_close, "on_set_color_switch": self.on_set_color_switch, "on_force_bq_name": self.on_force_bq_name, "on_http_mode_switch": self.on_http_mode_switch, "on_experimental_switch": self.on_experimental_switch, "on_yt_dl_switch": self.on_yt_dl_switch, "on_default_path_mode_switch": self.on_default_path_mode_switch, "on_profile_add": self.on_profile_add, "on_profile_edit": self.on_profile_edit, "on_profile_remove": self.on_profile_remove, "on_profile_deleted": self.on_profile_deleted, "on_profile_inserted": self.on_profile_inserted, "on_profile_edited": self.on_profile_edited, "on_profile_selected": self.on_profile_selected, "on_profile_set_default": self.on_profile_set_default, "on_add_picon_path": self.on_add_picon_path, "on_remove_picon_path": self.on_remove_picon_path, "on_lang_changed": self.on_lang_changed, "on_main_settings_visible": self.on_main_settings_visible, "on_http_use_ssl_toggled": self.on_http_use_ssl_toggled, "on_click_mode_togged": self.on_click_mode_togged, "on_play_mode_changed": self.on_play_mode_changed, "on_transcoding_preset_changed": self.on_transcoding_preset_changed, "on_apply_presets": self.on_apply_presets, "on_digit_entry_changed": self.on_digit_entry_changed, "on_view_popup_menu": self.on_view_popup_menu, "on_list_font_reset": self.on_list_font_reset, "on_theme_changed": self.on_theme_changed, "on_theme_add": self.on_theme_add, "on_theme_remove": self.on_theme_remove, "on_appearance_changed": self.on_appearance_changed, "on_icon_theme_add": self.on_icon_theme_add, "on_icon_theme_remove": self.on_icon_theme_remove } # Settings. self._ext_settings = settings self._settings = Settings(settings.settings) self._profiles = self._settings.profiles self._s_type = self._settings.setting_type self._updated = False builder = get_builder(UI_RESOURCES_PATH + "settings_dialog.glade", handlers) self._dialog = builder.get_object("settings_dialog") self._dialog.set_transient_for(transient) self._dialog.set_border_width(0) self._dialog.set_margin_left(0) self._main_stack = builder.get_object("main_stack") # Network. self._host_field = builder.get_object("host_field") self._port_field = builder.get_object("port_field") self._login_field = builder.get_object("login_field") self._password_field = builder.get_object("password_field") self._http_port_field = builder.get_object("http_port_field") self._http_use_ssl_check_button = builder.get_object( "http_use_ssl_check_button") self._telnet_port_field = builder.get_object("telnet_port_field") self._telnet_timeout_spin_button = builder.get_object( "telnet_timeout_spin_button") self._reset_button = builder.get_object("reset_button") # Test. self._ftp_radio_button = builder.get_object("ftp_radio_button") self._http_radio_button = builder.get_object("http_radio_button") # Network paths. self._services_field = builder.get_object("services_field") self._user_bouquet_field = builder.get_object("user_bouquet_field") self._satellites_xml_field = builder.get_object("satellites_xml_field") self._picons_paths_box = builder.get_object("picons_paths_box") self._remove_picon_path_button = builder.get_object( "remove_picon_path_button") # Paths. self._picons_path_field = builder.get_object("picons_path_field") self._data_path_field = builder.get_object("data_path_field") self._backup_path_field = builder.get_object("backup_path_field") self._record_data_path_field = builder.get_object( "record_data_path_field") self._default_data_paths_switch = builder.get_object( "default_data_paths_switch") self._default_data_paths_switch.bind_property("active", self._backup_path_field, "sensitive", 4) self._default_data_paths_switch.bind_property("active", self._picons_path_field, "sensitive", 4) # Info bar. self._info_bar = builder.get_object("info_bar") self._message_label = builder.get_object("info_bar_message_label") self._test_spinner = builder.get_object("test_spinner") # Settings type. self._enigma_radio_button = builder.get_object("enigma_radio_button") self._neutrino_radio_button = builder.get_object( "neutrino_radio_button") self._support_ver5_switch = builder.get_object("support_ver5_switch") self._force_bq_name_switch = builder.get_object("force_bq_name_switch") # Streaming. self._apply_presets_button = builder.get_object("apply_presets_button") self._transcoding_switch = builder.get_object("transcoding_switch") self._edit_preset_switch = builder.get_object("edit_preset_switch") self._presets_combo_box = builder.get_object("presets_combo_box") self._video_bitrate_field = builder.get_object("video_bitrate_field") self._video_width_field = builder.get_object("video_width_field") self._video_height_field = builder.get_object("video_height_field") self._audio_bitrate_field = builder.get_object("audio_bitrate_field") self._audio_channels_combo_box = builder.get_object( "audio_channels_combo_box") self._audio_sample_rate_combo_box = builder.get_object( "audio_sample_rate_combo_box") self._audio_codec_combo_box = builder.get_object( "audio_codec_combo_box") self._transcoding_switch.bind_property( "active", builder.get_object("record_box"), "sensitive") self._edit_preset_switch.bind_property("active", self._apply_presets_button, "sensitive") self._edit_preset_switch.bind_property( "active", builder.get_object("video_options_grid"), "sensitive") self._edit_preset_switch.bind_property( "active", builder.get_object("audio_options_grid"), "sensitive") self._play_streams_combo_box = builder.get_object( "play_streams_combo_box") self._stream_lib_combo_box = builder.get_object("stream_lib_combo_box") self._double_click_combo_box = builder.get_object( "double_click_combo_box") self._allow_main_list_playback_switch = builder.get_object( "allow_main_list_playback_switch") # Program. self._before_save_switch = builder.get_object("before_save_switch") self._before_downloading_switch = builder.get_object( "before_downloading_switch") self._load_on_startup_switch = builder.get_object( "load_on_startup_switch") self._bouquet_hints_switch = builder.get_object("bouquet_hints_switch") self._services_hints_switch = builder.get_object( "services_hints_switch") self._lang_combo_box = builder.get_object("lang_combo_box") # Appearance. self._list_font_button = builder.get_object("list_font_button") self._picons_size_button = builder.get_object("picons_size_button") self._tooltip_logo_size_button = builder.get_object( "tooltip_logo_size_button") self._colors_grid = builder.get_object("colors_grid") self._set_color_switch = builder.get_object("set_color_switch") self._new_color_button = builder.get_object("new_color_button") self._extra_color_button = builder.get_object("extra_color_button") # Extra. self._support_http_api_switch = builder.get_object( "support_http_api_switch") self._enable_yt_dl_switch = builder.get_object("enable_yt_dl_switch") self._enable_update_yt_dl_switch = builder.get_object( "enable_update_yt_dl_switch") self._enable_send_to_switch = builder.get_object( "enable_send_to_switch") # EXPERIMENTAL. self._enable_exp_switch = builder.get_object( "enable_experimental_switch") self._enable_exp_switch.bind_property("active", builder.get_object("yt_dl_box"), "sensitive") self._enable_yt_dl_switch.bind_property( "active", builder.get_object("yt_dl_update_box"), "sensitive") self._enable_exp_switch.bind_property( "active", builder.get_object("v5_support_box"), "sensitive") self._enable_exp_switch.bind_property( "active", builder.get_object("enable_direct_playback_box"), "sensitive") # Enigma2 only. self._enigma_radio_button.bind_property( "active", builder.get_object("bq_naming_grid"), "sensitive") self._enigma_radio_button.bind_property( "active", builder.get_object("program_frame"), "sensitive") self._enigma_radio_button.bind_property( "active", builder.get_object("experimental_box"), "sensitive") self._enigma_radio_button.bind_property( "active", builder.get_object("allow_double_click_box"), "sensitive") # Profiles. self._profile_view = builder.get_object("profile_tree_view") self._profile_add_button = builder.get_object("profile_add_button") self._profile_remove_button = builder.get_object( "profile_remove_button") # Network. # Separated due to a bug with response (presumably in the builder) in ubuntu 18.04 and derivatives. builder.get_object("network_settings_frame").add( builder.get_object("network_box")) # Style. self._style_provider = Gtk.CssProvider() self._style_provider.load_from_path(UI_RESOURCES_PATH + "style.css") self._digit_elems = (self._port_field, self._http_port_field, self._telnet_port_field, self._video_width_field, self._video_bitrate_field, self._video_height_field, self._audio_bitrate_field) for el in self._digit_elems: el.get_style_context().add_provider_for_screen( Gdk.Screen.get_default(), self._style_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) if IS_GNOME_SESSION: switcher = builder.get_object("main_stack_switcher") switcher.set_margin_top(0) switcher.set_margin_bottom(0) builder.get_object("main_box").remove(switcher) header_bar = Gtk.HeaderBar(visible=True, show_close_button=True) header_bar.set_custom_title(switcher) self._dialog.set_titlebar(header_bar) self.init_ui_elements() self.init_profiles() if not IS_LINUX: # Themes. builder.get_object("style_frame").set_visible(IS_WIN) builder.get_object("themes_support_frame").set_visible(True) self._layout_switch = builder.get_object("layout_switch") self._layout_switch.set_active(self._ext_settings.alternate_layout) self._force_ext_themes_switch = builder.get_object( "force_ext_themes_switch") self._force_ext_themes_switch.set_active( self._settings.force_external_themes) self._theme_frame = builder.get_object("theme_frame") self._theme_frame.set_visible(True) self._theme_thumbnail_image = builder.get_object( "theme_thumbnail_image") self._theme_combo_box = builder.get_object("theme_combo_box") self._icon_theme_combo_box = builder.get_object( "icon_theme_combo_box") self._dark_mode_switch = builder.get_object("dark_mode_switch") self._dark_mode_switch.set_active(self._ext_settings.dark_mode) self._themes_support_switch = builder.get_object( "themes_support_switch") self._themes_support_switch.bind_property("active", self._theme_frame, "sensitive") self.init_themes()
def settings(): return Settings(API_KEY="secret-api-key")
from unittest.mock import patch from pytest import raises from sendgrid import SendGridAPIClient from sendgrid.helpers.mail import Mail, Email, To, Content from app.core.adapters import SendgridAdapter from app.core.schemas import EmailSchema from app.settings import Settings settings = Settings( DEFAULT_EMAIL_ADDRESS="*****@*****.**", SENDGRID_API_KEY="some_api_key", ) message = EmailSchema( **{ "from": "*****@*****.**", "to": "*****@*****.**", "content": "content", "subject": "subject", } ) @patch("sendgrid.SendGridAPIClient.__init__", return_value=None) def test_sendgrid_client_gets_initialized_with_api_key(mock_client_init): SendgridAdapter(settings=settings) mock_client_init.assert_called_once_with(api_key=settings.SENDGRID_API_KEY) @patch("sendgrid.SendGridAPIClient.send")
def main() -> None: input_path = sys.argv[1] Settings(base_path=os.path.dirname(__file__)) Book(input_path).dump()
def create_app(oidc_blueprint=None): app = Flask(__name__) app.wsgi_app = ProxyFix(app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_port=1, x_prefix=1) app.secret_key = "8210f566-4981-11ea-92d1-f079596e599b" app.config.from_json('config.json') settings = Settings(app.config) cred = Credentials(settings.db_url) infra = Infrastructures(settings.db_url) toscaTemplates = utils.loadToscaTemplates(settings.toscaDir) toscaInfo = utils.extractToscaInfo(settings.toscaDir, settings.toscaParamsDir, toscaTemplates) app.jinja_env.filters['tojson_pretty'] = utils.to_pretty_json app.logger.debug("TOSCA INFO: " + json.dumps(toscaInfo)) loglevel = app.config.get("LOG_LEVEL") if app.config.get( "LOG_LEVEL") else "INFO" numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level) oidc_base_url = app.config['OIDC_BASE_URL'] oidc_token_url = oidc_base_url + '/token' oidc_refresh_url = oidc_base_url + '/token' oidc_authorization_url = oidc_base_url + '/authorize' if not oidc_blueprint: oidc_blueprint = OAuth2ConsumerBlueprint( "oidc", __name__, client_id=app.config['OIDC_CLIENT_ID'], client_secret=app.config['OIDC_CLIENT_SECRET'], scope=app.config['OIDC_SCOPES'], base_url=oidc_base_url, token_url=oidc_token_url, auto_refresh_url=oidc_refresh_url, authorization_url=oidc_authorization_url, redirect_to='home') app.register_blueprint(oidc_blueprint, url_prefix="/login") @app.before_request def before_request_checks(): if 'external_links' not in session: session['external_links'] = settings.external_links g.analytics_tag = settings.analytics_tag g.settings = settings def authorized_with_valid_token(f): @wraps(f) def decorated_function(*args, **kwargs): try: if not oidc_blueprint.session.authorized or 'username' not in session: return redirect(url_for('login')) if oidc_blueprint.session.token['expires_in'] < 20: app.logger.debug("Force refresh token") oidc_blueprint.session.get('/userinfo') except (InvalidTokenError, TokenExpiredError): flash("Token expired.", 'warning') return redirect(url_for('login')) return f(*args, **kwargs) return decorated_function @app.route('/settings') @authorized_with_valid_token def show_settings(): return render_template('settings.html', oidc_url=settings.oidcUrl, im_url=settings.imUrl) @app.route('/login') def login(): session.clear() return render_template('home.html', oidc_name=settings.oidcName) @app.route('/') def home(): if not oidc_blueprint.session.authorized: return redirect(url_for('login')) try: account_info = oidc_blueprint.session.get( urlparse(settings.oidcUrl)[2] + "/userinfo") except (InvalidTokenError, TokenExpiredError): flash("Token expired.", 'warning') return redirect(url_for('login')) if account_info.ok: account_info_json = account_info.json() session["vos"] = None if 'eduperson_entitlement' in account_info_json: session["vos"] = utils.getUserVOs( account_info_json['eduperson_entitlement']) if settings.oidcGroups: user_groups = [] if 'groups' in account_info_json: user_groups = account_info_json['groups'] elif 'eduperson_entitlement' in account_info_json: user_groups = account_info_json['eduperson_entitlement'] if not set(settings.oidcGroups).issubset(user_groups): app.logger.debug( "No match on group membership. User group membership: " + json.dumps(user_groups)) message = Markup( 'You need to be a member of the following groups: {0}. <br>' ' Please, visit <a href="{1}">{1}</a> and apply for the requested ' 'membership.'.format(json.dumps(settings.oidcGroups), settings.oidcUrl)) raise Forbidden(description=message) session['userid'] = account_info_json['sub'] if 'name' in account_info_json: session['username'] = account_info_json['name'] else: session['username'] = "" if 'given_name' in account_info_json: session['username'] = account_info_json['given_name'] if 'family_name' in account_info_json: session[ 'username'] += " " + account_info_json['family_name'] if session['username'] == "": session['username'] = account_info_json['sub'] if 'email' in account_info_json: session['gravatar'] = utils.avatar(account_info_json['email'], 26) else: session['gravatar'] = utils.avatar(account_info_json['sub'], 26) return render_template('portfolio.html', templates=toscaInfo) else: flash("Error getting User info: \n" + account_info.text, 'error') return render_template('home.html', oidc_name=settings.oidcName) @app.route('/vminfo/<infid>/<vmid>') @authorized_with_valid_token def showvminfo(infid=None, vmid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data, "Accept": "application/json"} url = "%s/infrastructures/%s/vms/%s" % (settings.imUrl, infid, vmid) response = requests.get(url, headers=headers) vminfo = {} state = "" nets = "" deployment = "" if not response.ok: flash("Error retrieving VM info: \n" + response.text, 'error') else: app.logger.debug("VM Info: %s" % response.text) vminfo = utils.format_json_radl(response.json()["radl"]) if "cpu.arch" in vminfo: del vminfo["cpu.arch"] if "state" in vminfo: state = vminfo["state"] del vminfo["state"] if "provider.type" in vminfo: deployment = vminfo["provider.type"] del vminfo["provider.type"] if "provider.host" in vminfo: if "provider.port" in vminfo: deployment += ": %s:%s" % (vminfo["provider.host"], vminfo["provider.port"]) del vminfo["provider.port"] else: deployment += ": " + vminfo["provider.host"] del vminfo["provider.host"] cont = 0 while "net_interface.%s.ip" % cont in vminfo: if cont > 0: nets += Markup('<br/>') nets += Markup('<i class="fa fa-network-wired"></i>') nets += " %s: %s" % (cont, vminfo["net_interface.%s.ip" % cont]) del vminfo["net_interface.%s.ip" % cont] cont += 1 cont = 0 while "net_interface.%s.connection" % cont in vminfo: del vminfo["net_interface.%s.connection" % cont] cont += 1 for elem in vminfo: if elem.endswith("size") and isinstance(vminfo[elem], int): vminfo[elem] = "%d GB" % (vminfo[elem] / 1073741824) return render_template('vminfo.html', infid=infid, vmid=vmid, vminfo=vminfo, state=state, nets=nets, deployment=deployment) @app.route('/managevm/<op>/<infid>/<vmid>') @authorized_with_valid_token def managevm(op=None, infid=None, vmid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data, "Accept": "application/json"} op = op.lower() if op in ["stop", "start", "reboot"]: url = "%s/infrastructures/%s/vms/%s/%s" % (settings.imUrl, infid, vmid, op) response = requests.put(url, headers=headers) elif op == "terminate": url = "%s/infrastructures/%s/vms/%s" % (settings.imUrl, infid, vmid) response = requests.delete(url, headers=headers) else: flash("Error: invalid operation: %s." % op, 'error') return redirect(url_for('showinfrastructures')) if response.ok: flash("Operation '%s' successfully made on VM ID: %s" % (op, vmid), 'info') else: flash( "Error making %s op on VM %s: \n%s" % (op, vmid, response.text), 'error') if op == "terminate": return redirect(url_for('showinfrastructures')) else: return redirect(url_for('showvminfo', infid=infid, vmid=vmid)) @app.route('/infrastructures') @authorized_with_valid_token def showinfrastructures(): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data, "Accept": "application/json"} url = "%s/infrastructures" % settings.imUrl response = requests.get(url, headers=headers) infrastructures = {} if not response.ok: flash("Error retrieving infrastructure list: \n" + response.text, 'error') else: app.logger.debug("Infrastructures: %s" % response.text) state_res = response.json() if "uri-list" in state_res: inf_id_list = [elem["uri"] for elem in state_res["uri-list"]] else: inf_id_list = [] for inf_id in inf_id_list: url = "%s/state" % inf_id response = requests.get(url, headers=headers) if not response.ok: flash( "Error retrieving infrastructure %s state: \n%s" % (inf_id, response.text), 'warning') else: inf_state = response.json() infrastructures[os.path.basename( inf_id)] = inf_state['state'] try: infra_name = infra.get_infra( os.path.basename(inf_id))["name"] except Exception: infra_name = "" infrastructures[os.path.basename( inf_id)]['name'] = infra_name return render_template('infrastructures.html', infrastructures=infrastructures) @app.route('/reconfigure/<infid>') @authorized_with_valid_token def infreconfigure(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data} url = "%s/infrastructures/%s/reconfigure" % (settings.imUrl, infid) response = requests.put(url, headers=headers) if response.ok: flash("Infrastructure successfuly reconfigured.", "info") else: flash("Error reconfiguring Infrastructure: \n" + response.text, "error") return redirect(url_for('showinfrastructures')) @app.route('/template/<infid>') @authorized_with_valid_token def template(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data} url = "%s/infrastructures/%s/tosca" % (settings.imUrl, infid) response = requests.get(url, headers=headers) if not response.ok: flash("Error getting template: \n" + response.text, "error") template = "" else: template = response.text return render_template('deptemplate.html', template=template) @app.route('/log/<infid>') @authorized_with_valid_token def inflog(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data} url = "%s/infrastructures/%s/contmsg" % (settings.imUrl, infid) response = requests.get(url, headers=headers, verify=False) if not response.ok: log = "Not found" else: log = response.text return render_template('inflog.html', log=log) @app.route('/vmlog/<infid>/<vmid>') @authorized_with_valid_token def vmlog(infid=None, vmid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data} url = "%s/infrastructures/%s/vms/%s/contmsg" % (settings.imUrl, infid, vmid) response = requests.get(url, headers=headers, verify=False) if not response.ok: log = "Not found" else: log = response.text return render_template('inflog.html', log=log, vmid=vmid) @app.route('/outputs/<infid>') @authorized_with_valid_token def infoutputs(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data} url = "%s/infrastructures/%s/outputs" % (settings.imUrl, infid) response = requests.get(url, headers=headers, verify=False) if not response.ok: outputs = {} else: outputs = response.json()["outputs"] for elem in outputs: if isinstance(outputs[elem], str) and (outputs[elem].startswith('http://') or outputs[elem].startswith('https://')): outputs[elem] = Markup( "<a href='%s' target='_blank'>%s</a>" % (outputs[elem], outputs[elem])) return render_template('outputs.html', infid=infid, outputs=outputs) @app.route('/delete/<infid>/<force>') @authorized_with_valid_token def infdel(infid=None, force=0): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data} url = "%s/infrastructures/%s?async=1" % (settings.imUrl, infid) if force: url += "&force=1" response = requests.delete(url, headers=headers) if not response.ok: flash("Error deleting infrastructure: " + response.text, "error") else: flash("Infrastructure '%s' successfuly deleted." % infid, "info") try: infra.delete_infra(infid) except Exception as ex: flash("Error deleting infrastructure name: %s" + str(ex), "warning") return redirect(url_for('showinfrastructures')) @app.route('/configure') @authorized_with_valid_token def configure(): selected_tosca = request.args['selected_tosca'] app.logger.debug("Template: " + json.dumps(toscaInfo[selected_tosca])) vos = utils.getStaticVOs() vos.extend(appdb.get_vo_list()) vos = list(set(vos)) if "vos" in session and session["vos"]: vos = [vo for vo in vos if vo in session["vos"]] return render_template('createdep.html', template=toscaInfo[selected_tosca], selectedTemplate=selected_tosca, vos=vos) @app.route('/sites/<vo>') def getsites(vo=None): res = "" appdb_sites = appdb.get_sites(vo) for site_name, site in appdb_sites.items(): if site["state"]: site["state"] = " (WARNING: %s state!)" % site["state"] res += '<option name="selectedSite" value=%s>%s%s</option>' % ( site_name, site_name, site["state"]) for site_name, _ in utils.getStaticSites(vo).items(): # avoid site duplication if site_name not in appdb_sites: res += '<option name="selectedSite" value=%s>%s</option>' % ( site_name, site_name) return res @app.route('/images/<site>/<vo>') @authorized_with_valid_token def getimages(site=None, vo=None): res = "" local = request.args.get('local', None) if local: access_token = oidc_blueprint.session.token['access_token'] for image_name, image_id in utils.get_site_images( site, vo, access_token, cred, session["userid"]): res += '<option name="selectedSiteImage" value=%s>%s</option>' % ( image_id, image_name) else: site_id = utils.getCachedSiteList()[site]['id'] for image in appdb.get_images(site_id, vo): res += '<option name="selectedImage" value=%s>%s</option>' % ( image, image) return res @app.route('/usage/<site>/<vo>') @authorized_with_valid_token def getusage(site=None, vo=None): try: access_token = oidc_blueprint.session.token['access_token'] quotas_dict = utils.get_site_usage(site, vo, access_token, cred, session["userid"]) return json.dumps(quotas_dict) except Exception as ex: return "Error loading site quotas: %s!" % str(ex), 400 def add_image_to_template(template, image): # Add the image to all compute nodes for node in list( template['topology_template']['node_templates'].values()): if node["type"] == "tosca.nodes.indigo.Compute": node["capabilities"]["os"]["properties"]["image"] = image app.logger.debug(yaml.dump(template, default_flow_style=False)) return template def add_auth_to_template(template, auth_data): # Add the auth_data ElasticCluster node for node in list( template['topology_template']['node_templates'].values()): if node["type"] == "tosca.nodes.ec3.ElasticCluster": if "properties" not in node: node["properties"] = {} node["properties"]["im_auth"] = auth_data app.logger.debug(yaml.dump(template, default_flow_style=False)) return template def set_inputs_to_template(template, inputs): # Add the image to all compute nodes for name, value in template['topology_template']['inputs'].items(): if name in inputs: if value["type"] == "integer": value["default"] = int(inputs[name]) elif value["type"] == "float": value["default"] = float(inputs[name]) elif value["type"] == "boolean": if inputs[name].lower() in ['yes', 'true', '1']: value["default"] = True else: value["default"] = False # Special case for ports, convert a comma separated list of ints # to a PortSpec map elif value["type"] == "map" and name == "ports": ports = inputs[name].split(",") ports_value = {} for port in ports: # Should we also open UDP? ports_value["port_%s" % port] = { "protocol": "tcp", "source": int(port) } value["default"] = ports_value else: value["default"] = inputs[name] app.logger.debug(yaml.dump(template, default_flow_style=False)) return template @app.route('/submit', methods=['POST']) @authorized_with_valid_token def createdep(): form_data = request.form.to_dict() vo = form_data['extra_opts.selectedVO'] site = form_data['extra_opts.selectedSite'] access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"], vo, site) app.logger.debug("Form data: " + json.dumps(request.form.to_dict())) with io.open(settings.toscaDir + request.args.get('template')) as stream: template = yaml.full_load(stream) if form_data['extra_opts.selectedImage'] != "": image = "appdb://%s/%s?%s" % ( form_data['extra_opts.selectedSite'], form_data['extra_opts.selectedImage'], form_data['extra_opts.selectedVO']) elif form_data['extra_opts.selectedSiteImage'] != "": site_url = utils.get_ost_image_url( form_data['extra_opts.selectedSite']) image = "ost://%s/%s" % ( site_url, form_data['extra_opts.selectedSiteImage']) else: flash("No correct image selected.", "error") return redirect(url_for('showinfrastructures')) template = add_image_to_template(template, image) template = add_auth_to_template(template, auth_data) inputs = { k: v for (k, v) in form_data.items() if not k.startswith("extra_opts.") } app.logger.debug("Parameters: " + json.dumps(inputs)) template = set_inputs_to_template(template, inputs) payload = yaml.dump(template, default_flow_style=False, sort_keys=False) headers = {"Authorization": auth_data, "Content-Type": "text/yaml"} url = "%s/infrastructures?async=1" % settings.imUrl response = requests.post(url, headers=headers, data=payload) if not response.ok: flash("Error creating infrastrucrure: \n" + response.text, "error") else: try: inf_id = os.path.basename(response.text) infra.write_infra(inf_id, {"name": form_data['infra_name']}) except Exception as ex: flash("Error storing Infrastructure name: %s" % str(ex), "warning") return redirect(url_for('showinfrastructures')) @app.route('/manage_creds') @authorized_with_valid_token def manage_creds(): sites = {} try: sites = utils.getCachedSiteList() except Exception as e: flash("Error retrieving sites list: \n" + str(e), 'warning') return render_template('service_creds.html', sites=sites) @app.route('/write_creds', methods=['GET', 'POST']) @authorized_with_valid_token def write_creds(): serviceid = request.args.get('service_id', "") servicename = request.args.get('service_name', "") app.logger.debug("service_id={}".format(serviceid)) if request.method == 'GET': res = {} projects = {} try: res = cred.get_cred(servicename, session["userid"]) projects = utils.getCachedProjectIDs(serviceid) app.logger.debug("projects={}".format(projects)) if session["vos"]: filter_projects = {} for vo, project in projects.items(): if vo in session["vos"]: filter_projects[vo] = project projects = filter_projects except Exception as ex: flash("Error reading credentials %s!" % ex, 'error') return render_template('modal_creds.html', service_creds=res, service_id=serviceid, service_name=servicename, projects=projects) else: app.logger.debug("Form data: " + json.dumps(request.form.to_dict())) creds = request.form.to_dict() try: cred.write_creds(servicename, session["userid"], creds) flash("Credentials successfully written!", 'info') except Exception as ex: flash("Error writing credentials %s!" % ex, 'error') return redirect(url_for('manage_creds')) @app.route('/delete_creds') @authorized_with_valid_token def delete_creds(): serviceid = request.args.get('service_id', "") try: cred.delete_cred(serviceid, session["userid"]) flash("Credentials successfully deleted!", 'info') except Exception as ex: flash("Error deleting credentials %s!" % ex, 'error') return redirect(url_for('manage_creds')) @app.route('/addresourcesform/<infid>') @authorized_with_valid_token def addresourcesform(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data, "Accept": "text/plain"} url = "%s/infrastructures/%s/radl" % (settings.imUrl, infid) response = requests.get(url, headers=headers) if response.ok: systems = [] try: radl = radl_parse.parse_radl(response.text) systems = radl.systems except Exception as ex: flash("Error parsing RADL: \n%s" % str(ex), 'error') return render_template('addresource.html', infid=infid, systems=systems) else: flash("Error getting RADL: \n%s" % (response.text), 'error') return redirect(url_for('showinfrastructures')) @app.route('/addresources/<infid>', methods=['POST']) @authorized_with_valid_token def addresources(infid=None): access_token = oidc_blueprint.session.token['access_token'] auth_data = utils.getUserAuthData(access_token, cred, session["userid"]) headers = {"Authorization": auth_data, "Accept": "text/plain"} form_data = request.form.to_dict() url = "%s/infrastructures/%s/radl" % (settings.imUrl, infid) response = requests.get(url, headers=headers) if response.ok: radl = None try: radl = radl_parse.parse_radl(response.text) radl.deploys = [] for system in radl.systems: if "%s_num" % system.name in form_data: vm_num = int(form_data["%s_num" % system.name]) if vm_num > 0: radl.deploys.append(deploy(system.name, vm_num)) except Exception as ex: flash( "Error parsing RADL: \n%s\n%s" % (str(ex), response.text), 'error') if radl: headers = { "Authorization": auth_data, "Accept": "application/json" } url = "%s/infrastructures/%s" % (settings.imUrl, infid) response = requests.post(url, headers=headers, data=str(radl)) if response.ok: num = len(response.json()["uri-list"]) flash("%d nodes added successfully" % num, 'info') else: flash("Error adding nodesL: \n%s" % (response.text), 'error') return redirect(url_for('showinfrastructures')) else: flash("Error getting RADL: \n%s" % (response.text), 'error') return redirect(url_for('showinfrastructures')) @app.route('/logout') def logout(): session.clear() oidc_blueprint.session.get("/logout") return redirect(url_for('login')) @app.errorhandler(403) def forbidden(error): return render_template('error_pages/403.html', message=error.description) @app.errorhandler(404) def page_not_found(error): app.logger.error('Page not found: %s', (request.path)) return render_template('error_pages/404.html'), 404 @app.errorhandler(500) def internal_server_error(error): app.logger.error('Server Error: %s', (error)) return render_template( 'error_pages/500.html', support_email=app.config.get('SUPPORT_EMAIL')), 500 return app
class ApplicationFractal(Fractal): settings = Settings() context = ApplicationContext()
from app.settings import Settings def unix_time_millis(dt: datetime.datetime) -> int: """ Конвертируем в милиссек :param d: datetime.date дата :return: int """ return int(dt.timestamp() * 1000) current_date_gt = datetime.datetime.now(tzutc()) current_date_10 = unix_time_millis(current_date_gt + relativedelta(days=-10)) current_date_gt = unix_time_millis(current_date_gt) settings = Settings() async def update_db(symbols): conn = await asyncpg.connect(settings.dsn) try: async with aiohttp.ClientSession() as session: for symbol in tqdm(symbols): async with conn.transaction(): insert = sa.insert(CurrencyOrm).values(name=symbol).returning(CurrencyOrm.id) query_string, params = asyncpgsa.compile_query(insert) async with session.get(settings.load_url.format(symbol, current_date_10, current_date_gt)) as resp: result = await resp.json() if resp.status != 200: # pragma: no cover print(f'error {symbol}, {result}') # pragma: no cover continue # pragma: no cover
def create_new_setting(db, key, value): setting = Settings(key=key, value=value) db.session.add(setting) db.session.commit() return setting
def test_can_save_state_globally(self) -> None: actual = Settings(path='foo/bar/baz') expected = Settings() self.assertEqual(actual.path, expected.path)
def test_cannot_change_initiated_value(self) -> None: settings = Settings(path='foo/bar/baz') with self.assertRaises(TypeError): settings.path = 'bar/baz/foo'
def __init__(self, transient, settings: Settings): handlers = { "on_field_icon_press": self.on_field_icon_press, "on_settings_type_changed": self.on_settings_type_changed, "on_reset": self.on_reset, "on_response": self.on_response, "apply_settings": self.apply_settings, "on_apply_profile_settings": self.on_apply_profile_settings, "on_connection_test": self.on_connection_test, "on_info_bar_close": self.on_info_bar_close, "on_set_color_switch": self.on_set_color_switch, "on_force_bq_name": self.on_force_bq_name, "on_http_mode_switch": self.on_http_mode_switch, "on_experimental_switch": self.on_experimental_switch, "on_yt_dl_switch": self.on_yt_dl_switch, "on_default_path_mode_switch": self.on_default_path_mode_switch, "on_default_data_path_changed": self.on_default_data_path_changed, "on_profile_add": self.on_profile_add, "on_profile_edit": self.on_profile_edit, "on_profile_remove": self.on_profile_remove, "on_profile_deleted": self.on_profile_deleted, "on_profile_inserted": self.on_profile_inserted, "on_profile_edited": self.on_profile_edited, "on_profile_selected": self.on_profile_selected, "on_profile_set_default": self.on_profile_set_default, "on_lang_changed": self.on_lang_changed, "on_main_settings_visible": self.on_main_settings_visible, "on_http_use_ssl_toggled": self.on_http_use_ssl_toggled, "on_click_mode_togged": self.on_click_mode_togged, "on_play_mode_changed": self.on_play_mode_changed, "on_transcoding_preset_changed": self.on_transcoding_preset_changed, "on_apply_presets": self.on_apply_presets, "on_digit_entry_changed": self.on_digit_entry_changed, "on_view_popup_menu": self.on_view_popup_menu, "on_list_font_reset": self.on_list_font_reset, "on_theme_changed": self.on_theme_changed, "on_theme_add": self.on_theme_add, "on_theme_remove": self.on_theme_remove, "on_appearance_changed": self.on_appearance_changed, "on_icon_theme_add": self.on_icon_theme_add, "on_icon_theme_remove": self.on_icon_theme_remove } # Settings self._ext_settings = settings self._settings = Settings(settings.settings) self._profiles = self._settings.profiles self._s_type = self._settings.setting_type builder = Gtk.Builder() builder.add_from_file(UI_RESOURCES_PATH + "settings_dialog.glade") builder.connect_signals(handlers) self._dialog = builder.get_object("settings_dialog") self._dialog.set_transient_for(transient) self._header_bar = builder.get_object("header_bar") self._main_stack = builder.get_object("main_stack") # Network self._host_field = builder.get_object("host_field") self._port_field = builder.get_object("port_field") self._login_field = builder.get_object("login_field") self._password_field = builder.get_object("password_field") self._http_port_field = builder.get_object("http_port_field") self._http_use_ssl_check_button = builder.get_object( "http_use_ssl_check_button") self._telnet_port_field = builder.get_object("telnet_port_field") self._telnet_timeout_spin_button = builder.get_object( "telnet_timeout_spin_button") # Test self._ftp_radio_button = builder.get_object("ftp_radio_button") self._http_radio_button = builder.get_object("http_radio_button") # Paths self._services_field = builder.get_object("services_field") self._user_bouquet_field = builder.get_object("user_bouquet_field") self._satellites_xml_field = builder.get_object("satellites_xml_field") self._data_dir_field = builder.get_object("data_dir_field") self._picons_field = builder.get_object("picons_field") self._picons_dir_field = builder.get_object("picons_dir_field") self._backup_dir_field = builder.get_object("backup_dir_field") self._default_data_dir_field = builder.get_object( "default_data_dir_field") self._record_data_dir_field = builder.get_object( "record_data_dir_field") self._default_data_paths_switch = builder.get_object( "default_data_paths_switch") # Info bar self._info_bar = builder.get_object("info_bar") self._message_label = builder.get_object("info_bar_message_label") self._test_spinner = builder.get_object("test_spinner") # Settings type self._enigma_radio_button = builder.get_object("enigma_radio_button") self._neutrino_radio_button = builder.get_object( "neutrino_radio_button") self._support_ver5_switch = builder.get_object("support_ver5_switch") self._force_bq_name_switch = builder.get_object("force_bq_name_switch") # Streaming header_separator = builder.get_object("header_separator") self._apply_presets_button = builder.get_object("apply_presets_button") self._transcoding_switch = builder.get_object("transcoding_switch") self._edit_preset_switch = builder.get_object("edit_preset_switch") self._presets_combo_box = builder.get_object("presets_combo_box") self._video_bitrate_field = builder.get_object("video_bitrate_field") self._video_width_field = builder.get_object("video_width_field") self._video_height_field = builder.get_object("video_height_field") self._audio_bitrate_field = builder.get_object("audio_bitrate_field") self._audio_channels_combo_box = builder.get_object( "audio_channels_combo_box") self._audio_sample_rate_combo_box = builder.get_object( "audio_sample_rate_combo_box") self._audio_codec_combo_box = builder.get_object( "audio_codec_combo_box") self._apply_presets_button.bind_property("visible", header_separator, "visible") self._transcoding_switch.bind_property( "active", builder.get_object("record_box"), "sensitive") self._edit_preset_switch.bind_property("active", self._apply_presets_button, "sensitive") self._edit_preset_switch.bind_property( "active", builder.get_object("video_options_frame"), "sensitive") self._edit_preset_switch.bind_property( "active", builder.get_object("audio_options_frame"), "sensitive") self._play_in_built_radio_button = builder.get_object( "play_in_built_radio_button") self._play_in_window_radio_button = builder.get_object( "play_in_window_radio_button") self._get_m3u_radio_button = builder.get_object("get_m3u_radio_button") self._gst_lib_button = builder.get_object("gst_lib_button") self._vlc_lib_button = builder.get_object("vlc_lib_button") self._mpv_lib_button = builder.get_object("mpv_lib_button") # Program self._before_save_switch = builder.get_object("before_save_switch") self._before_downloading_switch = builder.get_object( "before_downloading_switch") self._load_on_startup_switch = builder.get_object( "load_on_startup_switch") self._bouquet_hints_switch = builder.get_object("bouquet_hints_switch") self._services_hints_switch = builder.get_object( "services_hints_switch") self._lang_combo_box = builder.get_object("lang_combo_box") # Appearance self._list_font_button = builder.get_object("list_font_button") self._picons_size_button = builder.get_object("picons_size_button") self._tooltip_logo_size_button = builder.get_object( "tooltip_logo_size_button") self._colors_grid = builder.get_object("colors_grid") self._set_color_switch = builder.get_object("set_color_switch") self._new_color_button = builder.get_object("new_color_button") self._extra_color_button = builder.get_object("extra_color_button") # Extra self._support_http_api_switch = builder.get_object( "support_http_api_switch") self._enable_yt_dl_switch = builder.get_object("enable_yt_dl_switch") self._enable_update_yt_dl_switch = builder.get_object( "enable_update_yt_dl_switch") self._enable_send_to_switch = builder.get_object( "enable_send_to_switch") self._click_mode_disabled_button = builder.get_object( "click_mode_disabled_button") self._click_mode_stream_button = builder.get_object( "click_mode_stream_button") self._click_mode_play_button = builder.get_object( "click_mode_play_button") self._click_mode_zap_button = builder.get_object( "click_mode_zap_button") self._click_mode_zap_and_play_button = builder.get_object( "click_mode_zap_and_play_button") self._click_mode_zap_button.bind_property("sensitive", self._click_mode_play_button, "sensitive") self._click_mode_zap_button.bind_property( "sensitive", self._click_mode_zap_and_play_button, "sensitive") # EXPERIMENTAL self._enable_exp_switch = builder.get_object( "enable_experimental_switch") self._enable_exp_switch.bind_property("active", builder.get_object("yt_dl_box"), "sensitive") self._enable_yt_dl_switch.bind_property( "active", builder.get_object("yt_dl_update_box"), "sensitive") self._enable_exp_switch.bind_property( "active", builder.get_object("v5_support_box"), "sensitive") self._enable_exp_switch.bind_property( "active", builder.get_object("enable_direct_playback_box"), "sensitive") # Enigma2 only self._enigma_radio_button.bind_property( "active", builder.get_object("bq_naming_grid"), "sensitive") self._enigma_radio_button.bind_property( "active", builder.get_object("enable_http_box"), "sensitive") self._enigma_radio_button.bind_property( "active", builder.get_object("enable_experimental_box"), "sensitive") self._enigma_radio_button.bind_property( "active", builder.get_object("program_frame"), "sensitive") self._enigma_radio_button.bind_property( "active", builder.get_object("experimental_box"), "sensitive") # Profiles self._profile_view = builder.get_object("profile_tree_view") self._profile_add_button = builder.get_object("profile_add_button") self._profile_remove_button = builder.get_object( "profile_remove_button") self._apply_profile_button = builder.get_object("apply_profile_button") self._apply_profile_button.bind_property("visible", header_separator, "visible") # Style self._style_provider = Gtk.CssProvider() self._style_provider.load_from_path(UI_RESOURCES_PATH + "style.css") self._digit_elems = (self._port_field, self._http_port_field, self._telnet_port_field, self._video_width_field, self._video_bitrate_field, self._video_height_field, self._audio_bitrate_field) for el in self._digit_elems: el.get_style_context().add_provider_for_screen( Gdk.Screen.get_default(), self._style_provider, Gtk.STYLE_PROVIDER_PRIORITY_USER) self.init_ui_elements(self._s_type) self.init_profiles() if self._settings.is_darwin: # Themes self._layout_switch = builder.get_object("layout_switch") self._layout_switch.bind_property( "active", builder.get_object("bouquet_box"), "sensitive") self._layout_switch.set_active(self._ext_settings.alternate_layout) self._theme_frame = builder.get_object("theme_frame") self._theme_frame.set_visible(True) self._theme_thumbnail_image = builder.get_object( "theme_thumbnail_image") self._theme_combo_box = builder.get_object("theme_combo_box") self._icon_theme_combo_box = builder.get_object( "icon_theme_combo_box") self._dark_mode_switch = builder.get_object("dark_mode_switch") self._themes_support_switch = builder.get_object( "themes_support_switch") self._themes_support_switch.bind_property("active", self._theme_frame, "sensitive") self.init_themes()