From ee1983b6566df176a1af3f598a7c39bd18b6f87c Mon Sep 17 00:00:00 2001
From: Retspen <anatoliy.guskov@gmail.com>
Date: Fri, 13 Mar 2015 14:06:51 +0200
Subject: [PATCH] Added XML edit

---
 instances/views.py             | 23 ++++++++++++++++++++---
 templates/create_instance.html |  2 +-
 templates/instance.html        | 28 +++++++++++++++++++++++++++-
 3 files changed, 48 insertions(+), 5 deletions(-)

diff --git a/instances/views.py b/instances/views.py
index 1c8a650..13175bd 100644
--- a/instances/views.py
+++ b/instances/views.py
@@ -178,22 +178,28 @@ def instance(request, compute_id, vname):
 
     try:
         if request.method == 'POST':
+
             if 'poweron' in request.POST:
                 conn.start()
                 return HttpResponseRedirect(request.get_full_path() + '#poweron')
+
             if 'powercycle' in request.POST:
                 conn.force_shutdown()
                 conn.start()
                 return HttpResponseRedirect(request.get_full_path() + '#powercycle')
+
             if 'poweroff' == request.POST.get('power', ''):
                 conn.shutdown()
                 return HttpResponseRedirect(request.get_full_path() + '#poweroff')
+
             if 'suspend' in request.POST:
                 conn.suspend()
                 return HttpResponseRedirect(request.get_full_path() + '#resume')
+
             if 'resume' in request.POST:
                 conn.resume()
                 return HttpResponseRedirect(request.get_full_path() + '#suspend')
+
             if 'delete' in request.POST:
                 if conn.get_status() == 1:
                     conn.force_shutdown()
@@ -205,26 +211,32 @@ def instance(request, compute_id, vname):
                 finally:
                     conn.delete()
                 return HttpResponseRedirect(reverse('instances', args=[compute_id]))
+
             if 'snapshot' in request.POST:
                 name = request.POST.get('name', '')
                 conn.create_snapshot(name)
                 return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts')
+
             if 'umount_iso' in request.POST:
                 image = request.POST.get('path', '')
                 dev = request.POST.get('umount_iso', '')
                 conn.umount_iso(dev, image)
                 return HttpResponseRedirect(request.get_full_path() + '#instancemedia')
+
             if 'mount_iso' in request.POST:
                 image = request.POST.get('media', '')
                 dev = request.POST.get('mount_iso', '')
                 conn.mount_iso(dev, image)
                 return HttpResponseRedirect(request.get_full_path() + '#instancemedia')
+
             if 'set_autostart' in request.POST:
                 conn.set_autostart(1)
                 return HttpResponseRedirect(request.get_full_path() + '#instancesettings')
+
             if 'unset_autostart' in request.POST:
                 conn.set_autostart(0)
                 return HttpResponseRedirect(request.get_full_path() + '#instancesettings')
+
             if 'resize' in request.POST:
                 description = request.POST.get('description', '')
                 vcpu = request.POST.get('vcpu', '')
@@ -239,11 +251,13 @@ def instance(request, compute_id, vname):
                     cur_memory = cur_memory_custom
                 conn.resize(cur_memory, memory, cur_vcpu, vcpu)
                 return HttpResponseRedirect(request.get_full_path() + '#instancesettings')
+
             if 'change_xml' in request.POST:
-                xml = request.POST.get('inst_xml', '')
-                if xml:
-                    conn._defineXML(xml)
+                exit_xml = request.POST.get('inst_xml', '')
+                if exit_xml:
+                    conn._defineXML(exit_xml)
                     return HttpResponseRedirect(request.get_full_path() + '#instancexml')
+
             if 'set_console_passwd' in request.POST:
                 if request.POST.get('auto_pass', ''):
                     passwd = ''.join([choice(letters + digits) for i in xrange(12)])
@@ -290,16 +304,19 @@ def instance(request, compute_id, vname):
                 conn_migrate.define_move(vname)
                 conn_migrate.close()
                 return HttpResponseRedirect(reverse('instance', args=[compute_id, vname]))
+
             if 'delete_snapshot' in request.POST:
                 snap_name = request.POST.get('name', '')
                 conn.snapshot_delete(snap_name)
                 return HttpResponseRedirect(request.get_full_path() + '#istaceshapshosts')
+
             if 'revert_snapshot' in request.POST:
                 snap_name = request.POST.get('name', '')
                 conn.snapshot_revert(snap_name)
                 msg = _("Successful revert snapshot: ")
                 msg += snap_name
                 messages.append(msg)
+
             if 'clone' in request.POST:
                 clone_data = {}
                 clone_data['name'] = request.POST.get('name', '')
diff --git a/templates/create_instance.html b/templates/create_instance.html
index 472360d..9447418 100644
--- a/templates/create_instance.html
+++ b/templates/create_instance.html
@@ -191,7 +191,7 @@
                         <div class="well">
                             <form class="form-horizontal" method="post" role="form">{% csrf_token %}
                                 <div class="col-sm-12" id="xmlheight">
-                                    <textarea id="editor" name="from_xml""></textarea>
+                                    <textarea id="editor" name="from_xml"></textarea>
                                 </div>
                                 <button type="submit" class="btn btn-primary" name="create_xml">
                                     {% trans "Create" %}
diff --git a/templates/instance.html b/templates/instance.html
index bce8855..5ffbdb0 100644
--- a/templates/instance.html
+++ b/templates/instance.html
@@ -635,7 +635,23 @@
                                                 <div class="clearfix"></div></p>
                                             </div>
                                             <div role="tabpanel" class="tab-pane tab-pane-bordered" id="xmledit">
-                                                <p>XML</p>
+                                                <p>{% trans "If you need to edit xml please Power Off the instance" %}</p>
+                                                <form class="form-horizontal" method="post" role="form">{% csrf_token %}
+                                                    <div class="col-sm-12" id="xmlheight">
+                                                        <textarea id="editor">{{ inst_xml }}</textarea>
+                                                    </div>
+                                                    {% ifequal status 5 %}
+                                                        <input type="hidden" name="inst_xml">
+                                                        <button type="submit" class="btn btn-lg btn-success pull-right" name="change_xml">
+                                                            {% trans "Change" %}
+                                                        </button>
+                                                    {% else %}
+                                                        <button class="btn btn-lg btn-success pull-right disabled">
+                                                            {% trans "Change" %}
+                                                        </button>
+                                                    {% endifequal %}
+                                                </form>
+                                                <div class="clearfix"></div>
                                             </div>
                                         </div>
                                     </div>
@@ -692,6 +708,16 @@
                 </div>
 {% endblock %}
 {% block script %}
+<script src="{{ STATIC_URL }}/js/ace.js" type="text/javascript" charset="utf-8"></script>
+<script>
+    var editor = ace.edit("editor");
+    editor.getSession().setMode("ace/mode/xml");
+
+    var input = $('input[name="inst_xml"]');
+        editor.getSession().on("change", function () {
+        input.val(editor.getSession().getValue());
+    });
+</script>
 <script>
     function open_console() {
         window.open('{% url 'console' %}?token={{ compute_id }}-{{ uuid }}', '', 'width=850,height=485')