Server pairs, campaign types, wave notes, in_progress fixes
- Table server_pairs: 682 paires prod/hprod auto-détectées via app_group - Campaign types: standard, quickwin, safe_patching - Patch waves: note explicative dans spécifiques - Opérateur peut planifier en in_progress - Limites intervenants visibles en in_progress - Formulaires inline actifs en in_progress - Backup DB uploadé sur Drive Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
032e91a90c
commit
977733343a
@ -224,16 +224,19 @@ function showForm(id, type) {
|
|||||||
|
|
||||||
{% elif s.status == 'pending' %}
|
{% elif s.status == 'pending' %}
|
||||||
{% if c.status in ('planned', 'in_progress') %}
|
{% if c.status in ('planned', 'in_progress') %}
|
||||||
{# Operateur: prendre/liberer #}
|
{# Operateur: prendre/liberer/planifier #}
|
||||||
{% if not s.intervenant_id %}
|
{% if not s.intervenant_id %}
|
||||||
<form method="POST" action="/campaigns/session/{{ s.id }}/take" style="display:inline"><button class="btn-sm bg-cyber-accent text-black">Prendre</button></form>
|
<form method="POST" action="/campaigns/session/{{ s.id }}/take" style="display:inline"><button class="btn-sm bg-cyber-accent text-black">Prendre</button></form>
|
||||||
{% elif s.intervenant_id == user.uid and not s.forced_assignment %}
|
{% elif s.intervenant_id == user.uid %}
|
||||||
|
{% if not s.forced_assignment %}
|
||||||
<form method="POST" action="/campaigns/session/{{ s.id }}/release" style="display:inline"><button class="btn-sm bg-cyber-border text-gray-400">Libérer</button></form>
|
<form method="POST" action="/campaigns/session/{{ s.id }}/release" style="display:inline"><button class="btn-sm bg-cyber-border text-gray-400">Libérer</button></form>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<button onclick="showForm({{ s.id }}, 'schedule')" class="btn-sm bg-cyber-border text-gray-400">Planifier</button>
|
||||||
|
{% endif %}
|
||||||
{# Coordinateur: assigner + planifier + exclure #}
|
{# Coordinateur: assigner + planifier + exclure #}
|
||||||
{% if can_edit_campaigns %}
|
{% if can_edit_campaigns %}
|
||||||
<button onclick="showForm({{ s.id }}, 'assign')" class="btn-sm bg-cyber-border text-cyber-accent">Assigner</button>
|
<button onclick="showForm({{ s.id }}, 'assign')" class="btn-sm bg-cyber-border text-cyber-accent">Assigner</button>
|
||||||
<button onclick="showForm({{ s.id }}, 'schedule')" class="btn-sm bg-cyber-border text-gray-400">Planifier</button>
|
{% if s.intervenant_id != user.uid %}<button onclick="showForm({{ s.id }}, 'schedule')" class="btn-sm bg-cyber-border text-gray-400">Planifier</button>{% endif %}
|
||||||
<button onclick="showForm({{ s.id }}, 'exclude')" class="btn-sm bg-cyber-border text-gray-400">Exclure</button>
|
<button onclick="showForm({{ s.id }}, 'exclude')" class="btn-sm bg-cyber-border text-gray-400">Exclure</button>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
@ -250,7 +253,7 @@ function showForm(id, type) {
|
|||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
{# Formulaires inline #}
|
{# Formulaires inline #}
|
||||||
{% if s.status == 'pending' and c.status in ('draft', 'pending_validation', 'planned') %}
|
{% if s.status == 'pending' and c.status in ('draft', 'pending_validation', 'planned', 'in_progress') %}
|
||||||
<tr id="form-exclude-{{ s.id }}" class="bg-cyber-bg inline-form" style="display:none">
|
<tr id="form-exclude-{{ s.id }}" class="bg-cyber-bg inline-form" style="display:none">
|
||||||
<td colspan="12" class="p-2">
|
<td colspan="12" class="p-2">
|
||||||
<form method="POST" action="/campaigns/session/{{ s.id }}/exclude" class="flex gap-2 items-center flex-wrap">
|
<form method="POST" action="/campaigns/session/{{ s.id }}/exclude" class="flex gap-2 items-center flex-wrap">
|
||||||
@ -291,7 +294,7 @@ function showForm(id, type) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Limites intervenants (coordinateur, planned) -->
|
<!-- Limites intervenants (coordinateur, planned) -->
|
||||||
{% if can_edit_campaigns and c.status in ('planned', 'pending_validation') %}
|
{% if can_edit_campaigns and c.status in ('planned', 'pending_validation', 'in_progress') %}
|
||||||
<div class="card p-4 mt-4" style="max-width:400px">
|
<div class="card p-4 mt-4" style="max-width:400px">
|
||||||
<h3 class="text-sm font-bold text-cyber-accent mb-3">Limites intervenants</h3>
|
<h3 class="text-sm font-bold text-cyber-accent mb-3">Limites intervenants</h3>
|
||||||
{% if op_limits %}
|
{% if op_limits %}
|
||||||
|
|||||||
@ -82,6 +82,10 @@
|
|||||||
<!-- Panel edition -->
|
<!-- Panel edition -->
|
||||||
|
|
||||||
<!-- Ajouter -->
|
<!-- Ajouter -->
|
||||||
|
<!-- Note Wave -->
|
||||||
|
<div class="card p-3 mt-4 text-xs text-gray-500">
|
||||||
|
<strong class="text-cyber-accent">Waves :</strong> Les serveurs d'un même groupe (DNS, SMTP, HAProxy...) ne doivent pas être patchés le même jour. V1 = première vague (jour J), V2 = deuxième vague (J + délai). Le délai entre vagues est configurable (défaut : 1 jour). Exemple : DNS V1 (dns1+dns3 lundi) → DNS V2 (dns2+dns4 mardi).
|
||||||
|
</div>
|
||||||
<div class="card p-4 mt-4">
|
<div class="card p-4 mt-4">
|
||||||
<h4 class="text-sm font-bold text-cyber-accent mb-3">Ajouter un serveur specifique</h4>
|
<h4 class="text-sm font-bold text-cyber-accent mb-3">Ajouter un serveur specifique</h4>
|
||||||
<form method="POST" action="/specifics/add" class="flex gap-3 items-end">
|
<form method="POST" action="/specifics/add" class="flex gap-3 items-end">
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user