diff options
author | Javier Hernandez <jhernandez@soleta.eu> | 2024-01-29 10:38:53 +0100 |
---|---|---|
committer | OpenGnSys Support Team <soporte-og@soleta.eu> | 2024-01-29 11:26:08 +0100 |
commit | db63b6bc60c0c3c75662136e8524e274746c355b (patch) | |
tree | 1aa9a7784a0be8b804ff745fe78fed65bf0ab456 /ogcp | |
parent | a45f664905a6bb0d6e6e1510507ef62402f4d21e (diff) |
views: Preselect most used oglive
When setting up oglive, preselect oglive that is most used by selected
clients. If only one client is selected, preselect that of the client.
In the unusual scenario where a client is set with an oglive that is not
in the ogserver's list of available oglives, preselect default.
Diffstat (limited to 'ogcp')
-rw-r--r-- | ogcp/templates/actions/oglive.html | 25 | ||||
-rw-r--r-- | ogcp/views.py | 36 |
2 files changed, 58 insertions, 3 deletions
diff --git a/ogcp/templates/actions/oglive.html b/ogcp/templates/actions/oglive.html index 6b8e8b3..81b70dd 100644 --- a/ogcp/templates/actions/oglive.html +++ b/ogcp/templates/actions/oglive.html @@ -17,6 +17,31 @@ {{ macros.cmd_selected_clients(selected_clients) }} +{% if oglives_set|length > 1 %} + <p>Selected clients have different ogLive</p> + + <table class="table table-hover"> + <thead class="thead-light"> + <tr> + <th>ogLive</th> + <th>Clients</th> + </tr> + </thead> + <tbody class="text-left"> + {% for oglive, clients in oglives_set.items() %} + <tr> + <th>{{oglive}}</th> + <td> + {% for client in clients %} + {{client}} + {% endfor %} + </td> + </tr> + {% endfor %} + </tbody> + </table> +{% endif %} + {{ wtf.quick_form(form, action=url_for('action_oglive'), method='post', diff --git a/ogcp/views.py b/ogcp/views.py index 24df2e3..f6f1fb7 100644 --- a/ogcp/views.py +++ b/ogcp/views.py @@ -1577,6 +1577,22 @@ def action_mode(): selected_clients=selected_clients, clients=clients, modes_set=modes_set) +def get_clients_oglive(ips, server): + oglives = {} + for ip in ips: + r = server.get('/client/info', payload={"client": [ip]}) + if not r: + raise ServerError + if r.status_code != requests.codes.ok: + raise ServerErrorCode + resp = r.json() + oglive = resp['livedir'] + client_name = resp['name'] + if oglive not in oglives: + oglives[oglive] = [client_name] + else: + oglives[oglive].append(client_name) + return oglives @app.route('/action/oglive', methods=['GET', 'POST']) @login_required @@ -1602,21 +1618,35 @@ def action_oglive(): return redirect(url_for('commands')) server = get_server_from_clients(list(ips)) + + try: + oglives_set = get_clients_oglive(ips, server) + except ServerError: + return ogserver_down('commands') + except ServerErrorCode: + return ogserver_error('commands') + r = server.get('/oglive/list') if not r: return ogserver_down('commands') if r.status_code != requests.codes.ok: return ogserver_error('commands') + most_used_oglive = max(oglives_set, key=lambda l: len(oglives_set[l])) available_oglives = [(oglive.get('directory'), oglive.get('directory')) - for oglive in r.json()['oglive']] - available_oglives.insert(0, ('default', 'default')) + for oglive in r.json()['oglive'] + if oglive.get('directory') == most_used_oglive] + if not available_oglives: + available_oglives.append(('default', 'default')) + available_oglives.extend([(oglive.get('directory'), oglive.get('directory')) + for oglive in r.json()['oglive'] + if oglive.get('directory') != most_used_oglive]) form.oglive.choices = list(available_oglives) form.ok.render_kw = {'formaction': url_for('action_oglive')} scopes, clients = get_scopes(set(ips)) selected_clients = list(get_selected_clients(scopes['scope']).items()) - return render_template('actions/oglive.html', form=form, scopes=scopes, + return render_template('actions/oglive.html', oglives_set=oglives_set, form=form, scopes=scopes, selected_clients=selected_clients) |