From ba59c33b350a50f64b261e3dd8b7177b32705f29 Mon Sep 17 00:00:00 2001
From: Benjamin Bertrand <benjamin.bertrand@esss.se>
Date: Wed, 1 Aug 2018 15:19:51 +0200
Subject: [PATCH] Ansible group children in views

---
 app/network/forms.py                    |  4 ++++
 app/network/views.py                    |  8 ++++++++
 app/static/js/groups.js                 |  1 +
 app/templates/network/create_group.html |  1 +
 app/templates/network/edit_group.html   |  1 +
 app/templates/network/groups.html       |  1 +
 app/templates/network/view_group.html   | 10 +++++++++-
 7 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/app/network/forms.py b/app/network/forms.py
index d0fe5c2..aa66f23 100644
--- a/app/network/forms.py
+++ b/app/network/forms.py
@@ -250,8 +250,12 @@ class AnsibleGroupForm(CSEntryForm):
         default=models.AnsibleGroupType.STATIC,
         coerce=models.AnsibleGroupType.coerce,
     )
+    children = SelectMultipleField("Children", coerce=utils.coerce_to_str_or_none)
     hosts = SelectMultipleField("Hosts", coerce=utils.coerce_to_str_or_none)
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
+        self.children.choices = utils.get_model_choices(
+            models.AnsibleGroup, attr="name"
+        )
         self.hosts.choices = utils.get_model_choices(models.Host, attr="name")
diff --git a/app/network/views.py b/app/network/views.py
index 5932fa7..96c1f2e 100644
--- a/app/network/views.py
+++ b/app/network/views.py
@@ -346,11 +346,17 @@ def edit_ansible_group(name):
     # See https://stackoverflow.com/questions/5519729/wtforms-how-to-select-options-in-selectmultiplefield
     form.hosts.default = [host.id for host in group.hosts]
     form.hosts.process(request.form)
+    # Same for AnsibleGroup children
+    form.children.default = [child.id for child in group.children]
+    form.children.process(request.form)
     if form.validate_on_submit():
         group.name = form.name.data
         group.vars = form.vars.data or None
         group.type = form.type.data
         group.hosts = [models.Host.query.get(id_) for id_ in form.hosts.data]
+        group.children = [
+            models.AnsibleGroup.query.get(id_) for id_ in form.children.data
+        ]
         current_app.logger.debug(f"Trying to update: {group!r}")
         try:
             db.session.commit()
@@ -370,11 +376,13 @@ def create_ansible_group():
     form = AnsibleGroupForm()
     if form.validate_on_submit():
         hosts = [models.Host.query.get(id_) for id_ in form.hosts.data]
+        children = [models.AnsibleGroup.query.get(id_) for id_ in form.children.data]
         group = models.AnsibleGroup(
             name=form.name.data,
             vars=form.vars.data or None,
             type=form.type.data,
             hosts=hosts,
+            children=children,
         )
         current_app.logger.debug(f"Trying to create: {group!r}")
         db.session.add(group)
diff --git a/app/static/js/groups.js b/app/static/js/groups.js
index ec1bbf3..e660d72 100644
--- a/app/static/js/groups.js
+++ b/app/static/js/groups.js
@@ -58,6 +58,7 @@ $(document).ready(function() {
         }
       },
       { data: 'type' },
+      { data: 'children' },
       { data: 'hosts' }
     ]
   });
diff --git a/app/templates/network/create_group.html b/app/templates/network/create_group.html
index 8916190..cd1504d 100644
--- a/app/templates/network/create_group.html
+++ b/app/templates/network/create_group.html
@@ -9,6 +9,7 @@
     {{ render_field(form.name, class_="text-lowercase") }}
     {{ render_field(form.vars) }}
     {{ render_field(form.type) }}
+    {{ render_field(form.children, class_="selectpicker") }}
     {{ render_field(form.hosts, class_="selectpicker") }}
     <div class="form-group row">
       <div class="col-sm-10">
diff --git a/app/templates/network/edit_group.html b/app/templates/network/edit_group.html
index f19aaca..2b1ddd2 100644
--- a/app/templates/network/edit_group.html
+++ b/app/templates/network/edit_group.html
@@ -18,6 +18,7 @@
     {{ render_field(form.name, class_="text-lowercase") }}
     {{ render_field(form.vars) }}
     {{ render_field(form.type) }}
+    {{ render_field(form.children, class_="selectpicker") }}
     {{ render_field(form.hosts, class_="selectpicker") }}
     <div class="form-group row">
       <div class="col-sm-10">
diff --git a/app/templates/network/groups.html b/app/templates/network/groups.html
index af1f517..7d82d9d 100644
--- a/app/templates/network/groups.html
+++ b/app/templates/network/groups.html
@@ -24,6 +24,7 @@
         <th>Name</th>
         <th>Vars</th>
         <th>Type</th>
+        <th>Children</th>
         <th>Hosts</th>
       </tr>
     </thead>
diff --git a/app/templates/network/view_group.html b/app/templates/network/view_group.html
index 457879e..31e73e7 100644
--- a/app/templates/network/view_group.html
+++ b/app/templates/network/view_group.html
@@ -1,5 +1,5 @@
 {% extends "network/groups.html" %}
-{% from "_helpers.html" import link_to_hosts %}
+{% from "_helpers.html" import link_to_hosts, link_to_ansible_groups %}
 
 {% block title %}View Ansible group - CSEntry{% endblock %}
 
@@ -22,6 +22,14 @@
         <dd class="col-sm-9"><pre>{{ group.vars | toyaml }}</pre></dd>
         <dt class="col-sm-3">Type</dt>
         <dd class="col-sm-9">{{ group.type.name }}</dd>
+        {% if group.parents %}
+        <dt class="col-sm-3">Parents</dt>
+        <dd class="col-sm-9">{{ link_to_ansible_groups(group.parents) }}</dd>
+        {% endif %}
+        {% if group.children %}
+        <dt class="col-sm-3">Children</dt>
+        <dd class="col-sm-9">{{ link_to_ansible_groups(group.children) }}</dd>
+        {% endif %}
         <dt class="col-sm-3">hosts</dt>
         <dd class="col-sm-9">{{ link_to_hosts(group.hosts) }}</dd>
         <dt class="col-sm-3">Created by</dt>
-- 
GitLab