aboutsummaryrefslogtreecommitdiff
path: root/src/hydrilla/proxy/web_ui/items.py
diff options
context:
space:
mode:
authorWojtek Kosior <koszko@koszko.org>2022-10-08 19:07:12 +0200
committerWojtek Kosior <koszko@koszko.org>2022-10-08 19:08:39 +0200
commitb2055032cb914fd160270971dd1da46f8c7c838d (patch)
treebd1a67b9a708af1eae704e208bd50849e4b7f1f7 /src/hydrilla/proxy/web_ui/items.py
parent4f016d740e3c15e72b944aa0d6f82ca863d1ae67 (diff)
downloadhaketilo-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.py78
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)