diff options
author | Wojtek Kosior <koszko@koszko.org> | 2022-10-08 19:07:12 +0200 |
---|---|---|
committer | Wojtek Kosior <koszko@koszko.org> | 2022-10-08 19:08:39 +0200 |
commit | b2055032cb914fd160270971dd1da46f8c7c838d (patch) | |
tree | bd1a67b9a708af1eae704e208bd50849e4b7f1f7 /src/hydrilla/proxy/web_ui/items.py | |
parent | 4f016d740e3c15e72b944aa0d6f82ca863d1ae67 (diff) | |
download | haketilo-hydrilla-b2055032cb914fd160270971dd1da46f8c7c838d.tar.gz haketilo-hydrilla-b2055032cb914fd160270971dd1da46f8c7c838d.zip |
[proxy] remove TODOs from library and package pages and make package page display enable/disable/forget buttons
Diffstat (limited to 'src/hydrilla/proxy/web_ui/items.py')
-rw-r--r-- | src/hydrilla/proxy/web_ui/items.py | 78 |
1 files changed, 67 insertions, 11 deletions
diff --git a/src/hydrilla/proxy/web_ui/items.py b/src/hydrilla/proxy/web_ui/items.py index 467be2f..01b201d 100644 --- a/src/hydrilla/proxy/web_ui/items.py +++ b/src/hydrilla/proxy/web_ui/items.py @@ -73,15 +73,19 @@ def item_store(state: st.HaketiloState, item_type: item_infos.ItemType) \ else: return state.mapping_store() -def show_item(item_id: str, item_type: item_infos.ItemType) \ - -> werkzeug.Response: +def show_item( + item_id: str, + item_type: item_infos.ItemType, + errors: t.Mapping[str, bool] = {} +) -> werkzeug.Response: try: store = item_store(_app.get_haketilo_state(), item_type) display_info = store.get(str(item_id)).get_display_info() html = flask.render_template( f'items/{item_type.alt_name}_view.html.jinja', - display_info = display_info + display_info = display_info, + **errors ) return flask.make_response(html, 200) except st.MissingItemError: @@ -96,6 +100,64 @@ def show_library(item_id: str) -> werkzeug.Response: def show_package(item_id: str) -> werkzeug.Response: return show_item(item_id, item_infos.ItemType.MAPPING) +def alter_item(item_id: str, item_type: item_infos.ItemType) \ + -> werkzeug.Response: + form_data = flask.request.form + action = form_data['action'] + + try: + store = item_store(_app.get_haketilo_state(), item_type) + item_ref = store.get(item_id) + + if action == 'disable_item': + assert isinstance(item_ref, st.MappingRef) + item_ref.update_status(st.EnabledStatus.DISABLED) + elif action == 'unenable_item': + assert isinstance(item_ref, st.MappingRef) + item_ref.update_status(st.EnabledStatus.NO_MARK) + elif action in ('enable_item', 'unfreeze_item'): + assert isinstance(item_ref, st.MappingRef) + item_ref.update_status( + enabled = st.EnabledStatus.ENABLED, + frozen = st.FrozenStatus.NOT_FROZEN, + ) + elif action == 'freeze_to_repo': + assert isinstance(item_ref, st.MappingRef) + item_ref.update_status( + enabled = st.EnabledStatus.ENABLED, + frozen = st.FrozenStatus.REPOSITORY, + ) + elif action == 'freeze_to_version': + assert isinstance(item_ref, st.MappingRef) + item_ref.update_status( + enabled = st.EnabledStatus.ENABLED, + frozen = st.FrozenStatus.EXACT_VERSION, + ) + else: + raise ValueError() + except st.RepoCommunicationError: + return show_item(item_id, item_type, {'repo_communication_error': True}) + except st.FileInstallationError: + return show_item(item_id, item_type, {'file_installation_error': True}) + except st.ImpossibleSituation: + errors = {'impossible_situation_error': True} + return show_item(item_id, item_type, errors) + except st.MissingItemError: + flask.abort(404) + + return flask.redirect( + flask.url_for(f'.show_{item_type.alt_name}', item_id=item_id) + ) + +@bp.route('/libraries/view/<string:item_id>', methods=['POST']) +def alter_library(item_id: str) -> werkzeug.Response: + return alter_item(item_id, item_infos.ItemType.RESOURCE) + +@bp.route('/packages/view/<string:item_id>', methods=['POST']) +def alter_package(item_id: str) -> werkzeug.Response: + return alter_item(item_id, item_infos.ItemType.MAPPING) + + ItemVersionDisplayInfo = t.Union[ st.MappingVersionDisplayInfo, st.ResourceVersionDisplayInfo @@ -163,7 +225,7 @@ def alter_item_version(item_version_id: str, item_type: item_infos.ItemType) \ elif action == 'unenable_item': assert isinstance(item_version_ref, st.MappingVersionRef) item_version_ref.update_mapping_status(st.EnabledStatus.NO_MARK) - elif action == 'enable_item_version': + elif action in ('enable_item_version', 'freeze_to_version'): assert isinstance(item_version_ref, st.MappingVersionRef) item_version_ref.update_mapping_status( enabled = st.EnabledStatus.ENABLED, @@ -181,12 +243,6 @@ def alter_item_version(item_version_id: str, item_type: item_infos.ItemType) \ enabled = st.EnabledStatus.ENABLED, frozen = st.FrozenStatus.REPOSITORY, ) - elif action == 'freeze_to_version': - assert isinstance(item_version_ref, st.MappingVersionRef) - item_version_ref.update_mapping_status( - enabled = st.EnabledStatus.ENABLED, - frozen = st.FrozenStatus.EXACT_VERSION, - ) elif action == 'install_item_version': item_version_ref.install() elif action == 'uninstall_item_version': @@ -214,7 +270,7 @@ def alter_item_version(item_version_id: str, item_type: item_infos.ItemType) \ return show_item_version( item_version_id = item_version_id, item_type = item_type, - errors = {'uninstall_disallowed': True} + errors = {'impossible_situation_error': True} ) except st.MissingItemError: flask.abort(404) |