Пример #1
0
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)
Пример #2
0
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
Пример #3
0
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})
Пример #4
0
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)
Пример #5
0
 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)
Пример #6
0
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()
Пример #7
0
 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()))
Пример #8
0
    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)
Пример #9
0
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()
Пример #10
0
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')
Пример #11
0
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
Пример #12
0
    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))
Пример #13
0
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()
Пример #14
0
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
Пример #15
0
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()
Пример #16
0
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()
Пример #17
0
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
Пример #18
0
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
Пример #19
0
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)
Пример #20
0
    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()
Пример #21
0
def settings():
    return Settings(API_KEY="secret-api-key")
Пример #22
0
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")
Пример #23
0
def main() -> None:
    input_path = sys.argv[1]
    Settings(base_path=os.path.dirname(__file__))
    Book(input_path).dump()
Пример #24
0
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
Пример #25
0
class ApplicationFractal(Fractal):
    settings = Settings()
    context = ApplicationContext()
Пример #26
0
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
Пример #27
0
def create_new_setting(db, key, value):
    setting = Settings(key=key, value=value)
    db.session.add(setting)
    db.session.commit()
    return setting
Пример #28
0
 def test_can_save_state_globally(self) -> None:
     actual = Settings(path='foo/bar/baz')
     expected = Settings()
     self.assertEqual(actual.path, expected.path)
Пример #29
0
 def test_cannot_change_initiated_value(self) -> None:
     settings = Settings(path='foo/bar/baz')
     with self.assertRaises(TypeError):
         settings.path = 'bar/baz/foo'
Пример #30
0
    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()