obscreen/src/controller/FleetNodePlayerController.py
2024-07-17 18:07:00 +02:00

263 lines
11 KiB
Python

import json
from flask import Flask, render_template, redirect, request, url_for, jsonify, abort
from src.service.ModelStore import ModelStore
from src.model.entity.NodePlayer import NodePlayer
from src.interface.ObController import ObController
from src.model.enum.OperatingSystem import OperatingSystem
from src.model.enum.FolderEntity import FolderEntity, FOLDER_ROOT_PATH
from src.util.utils import str_to_enum
class FleetNodePlayerController(ObController):
def guard_fleet(self, f):
def decorated_function(*args, **kwargs):
if not self._model_store.variable().map().get('fleet_player_enabled').as_bool():
return redirect(url_for('manage'))
return f(*args, **kwargs)
return decorated_function
def register(self):
self._app.add_url_rule('/fleet/node-player', 'fleet_node_player_list', self.guard_fleet(self._auth(self.fleet_node_player_list)), methods=['GET'])
self._app.add_url_rule('/fleet/node-player/add', 'fleet_node_player_add', self.guard_fleet(self._auth(self.fleet_node_player_add)), methods=['GET', 'POST'])
self._app.add_url_rule('/fleet/node-player/edit/<node_player_id>', 'fleet_node_player_edit', self._auth(self.fleet_node_player_edit), methods=['GET'])
self._app.add_url_rule('/fleet/node-player/save/<node_player_id>', 'fleet_node_player_save', self._auth(self.fleet_node_player_save), methods=['POST'])
self._app.add_url_rule('/fleet/node-player/delete', 'fleet_node_player_delete', self.guard_fleet(self._auth(self.fleet_node_player_delete)), methods=['GET'])
self._app.add_url_rule('/fleet/node-player/rename', 'fleet_node_player_rename', self.guard_fleet(self._auth(self.fleet_node_player_rename)), methods=['POST'])
self._app.add_url_rule('/fleet/node-player/cd', 'fleet_node_player_cd', self._auth(self.fleet_node_player_cd), methods=['GET'])
self._app.add_url_rule('/fleet/node-player/add-folder', 'fleet_node_player_folder_add', self._auth(self.fleet_node_player_folder_add), methods=['POST'])
self._app.add_url_rule('/fleet/node-player/move-folder', 'fleet_node_player_folder_move', self._auth(self.fleet_node_player_folder_move), methods=['POST'])
self._app.add_url_rule('/fleet/node-player/rename-folder', 'fleet_node_player_folder_rename', self._auth(self.fleet_node_player_folder_rename), methods=['POST'])
self._app.add_url_rule('/fleet/node-player/delete-folder', 'fleet_node_player_folder_delete', self._auth(self.fleet_node_player_folder_delete), methods=['GET'])
self._app.add_url_rule('/fleet/node-player/delete-bulk-explr', 'fleet_node_player_delete_bulk_explr', self._auth(self.fleet_node_player_delete_bulk_explr), methods=['GET'])
def get_working_folder(self):
working_folder_path = request.args.get('path', None)
working_folder = None
if working_folder_path:
working_folder = self._model_store.folder().get_one_by_path(path=working_folder_path, entity=FolderEntity.NODE_PLAYER)
if not working_folder:
working_folder_path = self._model_store.variable().get_one_by_name('last_folder_node_player').as_string()
working_folder = self._model_store.folder().get_one_by_path(path=working_folder_path, entity=FolderEntity.NODE_PLAYER)
return working_folder_path, working_folder
def fleet_node_player_list(self):
self._model_store.variable().update_by_name('last_pillmenu_fleet', 'fleet_node_player_list')
working_folder_path, working_folder = self.get_working_folder()
return render_template(
'fleet/node-players/list.jinja.html',
foldered_node_players=self._model_store.node_player().get_all_indexed('folder_id', multiple=True),
groups=self._model_store.node_player_group().get_all_labels_indexed(),
folders_tree=self._model_store.folder().get_folder_tree(FolderEntity.NODE_PLAYER),
working_folder_path=working_folder_path,
working_folder=working_folder,
working_folder_children=self._model_store.folder().get_children(folder=working_folder, entity=FolderEntity.NODE_PLAYER, sort='created_at', ascending=False),
enum_operating_system=OperatingSystem,
enum_folder_entity=FolderEntity,
)
def fleet_node_player_add(self):
working_folder_path, working_folder = self.get_working_folder()
self._model_store.node_player().add_form(
NodePlayer(
name=request.form['name'],
host=request.form['host'],
operating_system=str_to_enum(request.form['operating_system'], OperatingSystem),
folder_id=working_folder.id if working_folder else None,
)
)
return redirect(url_for('fleet_node_player_list', path=working_folder_path))
def fleet_node_player_edit(self, node_player_id: int = 0):
node_player = self._model_store.node_player().get(node_player_id)
if not node_player:
return abort(404)
working_folder_path, working_folder = self.get_working_folder()
return render_template(
'fleet/node-players/edit.jinja.html',
node_player=node_player,
working_folder_path=working_folder_path,
working_folder=working_folder,
enum_operating_system=OperatingSystem,
)
def fleet_node_player_save(self, node_player_id: int = 0):
node_player_id = request.form['id'] if 'id' in request.form else node_player_id
node_player = self._model_store.node_player().get(node_player_id)
working_folder_path, working_folder = self.get_working_folder()
if not node_player:
return redirect(url_for('fleet_node_player_list', path=working_folder_path))
self._model_store.node_player().update_form(
id=node_player.id,
name=request.form['name'],
operating_system=str_to_enum(request.form['operating_system'], OperatingSystem),
host=request.form['host'],
)
self._post_update()
# return redirect(url_for('fleet_node_player_edit', node_player_id=node_player_id, saved=1))
return redirect(url_for('fleet_node_player_list', path=working_folder_path))
def fleet_node_player_delete(self):
working_folder_path, working_folder = self.get_working_folder()
error_tuple = self.delete_node_player_by_id(request.args.get('id'))
route_args = {
"path": working_folder_path,
}
if error_tuple:
route_args[error_tuple[0]] = error_tuple[1]
return redirect(url_for('fleet_node_player_list', **route_args))
def fleet_node_player_rename(self):
working_folder_path, working_folder = self.get_working_folder()
self._model_store.node_player().update_form(
id=request.form['id'],
name=request.form['name'],
)
return redirect(url_for('fleet_node_player_list', path=working_folder_path))
def fleet_node_player_cd(self):
path = request.args.get('path')
if path == FOLDER_ROOT_PATH:
self._model_store.variable().update_by_name("last_folder_node_player", FOLDER_ROOT_PATH)
return redirect(url_for('fleet_node_player_list', path=FOLDER_ROOT_PATH))
if not path:
return abort(404)
cd_folder = self._model_store.folder().get_one_by_path(
path=path,
entity=FolderEntity.NODE_PLAYER
)
if not cd_folder:
return abort(404)
self._model_store.variable().update_by_name("last_folder_node_player", path)
return redirect(url_for('fleet_node_player_list', path=path))
def fleet_node_player_folder_add(self):
working_folder_path, working_folder = self.get_working_folder()
self._model_store.folder().add_folder(
entity=FolderEntity.NODE_PLAYER,
name=request.form['name'],
working_folder_path=working_folder_path
)
return redirect(url_for('fleet_node_player_list', path=working_folder_path))
def fleet_node_player_folder_rename(self):
working_folder_path, working_folder = self.get_working_folder()
self._model_store.folder().rename_folder(
folder_id=request.form['id'],
name=request.form['name'],
)
return redirect(url_for('fleet_node_player_list', path=working_folder_path))
def fleet_node_player_folder_move(self):
working_folder_path, working_folder = self.get_working_folder()
entity_ids = request.form['entity_ids'].split(',')
folder_ids = request.form['folder_ids'].split(',')
for id in entity_ids:
self._model_store.folder().move_to_folder(
entity_id=id,
folder_id=request.form['new_folder_id'],
entity_is_folder=False,
entity=FolderEntity.NODE_PLAYER
)
for id in folder_ids:
self._model_store.folder().move_to_folder(
entity_id=id,
folder_id=request.form['new_folder_id'],
entity_is_folder=True,
entity=FolderEntity.NODE_PLAYER
)
return redirect(url_for('fleet_node_player_list', path=working_folder_path))
def fleet_node_player_folder_delete(self):
working_folder_path, working_folder = self.get_working_folder()
error_tuple = self.delete_folder_by_id(request.args.get('id'))
route_args = {
"path": working_folder_path,
}
if error_tuple:
route_args[error_tuple[0]] = error_tuple[1]
return redirect(url_for('fleet_node_player_list', **route_args))
def fleet_node_player_delete_bulk_explr(self):
working_folder_path, working_folder = self.get_working_folder()
entity_ids = request.args.get('entity_ids', '').split(',')
folder_ids = request.args.get('folder_ids', '').split(',')
route_args_dict = {"path": working_folder_path}
for id in entity_ids:
if id:
error_tuple = self.delete_node_player_by_id(id)
if error_tuple:
route_args_dict[error_tuple[0]] = error_tuple[1]
for id in folder_ids:
if id:
error_tuple = self.delete_folder_by_id(id)
if error_tuple:
route_args_dict[error_tuple[0]] = error_tuple[1]
return redirect(url_for('fleet_node_player_list', **route_args_dict))
def delete_node_player_by_id(self, id):
node_player = self._model_store.node_player().get(id)
if not node_player:
return None
self._model_store.node_player().delete(node_player.id)
self._post_update()
return None
def delete_folder_by_id(self, id):
folder = self._model_store.folder().get(id)
if not folder:
return None
node_player_counter = self._model_store.node_player().count_node_players_for_folder(folder.id)
folder_counter = self._model_store.folder().count_subfolders_for_folder(folder.id)
if node_player_counter > 0 or folder_counter:
return 'folder_not_empty_error', folder.name
self._model_store.folder().delete(id=folder.id)
return None
def _post_update(self):
pass