diff --git a/one/static/script/cloud.js b/one/static/script/cloud.js index 0dd75fc..932501c 100644 --- a/one/static/script/cloud.js +++ b/one/static/script/cloud.js @@ -152,7 +152,7 @@ $(function() { $('#modal-container').html(data); } }); - }) + }); $('#shadow').click(function() { $('#modal').hide(); $('#modal-container').html(''); diff --git a/one/templates/box/template/summary.html b/one/templates/box/template/summary.html index 2964dbc..7e78970 100644 --- a/one/templates/box/template/summary.html +++ b/one/templates/box/template/summary.html @@ -47,6 +47,9 @@ {% endblock status %} {% block actions %} + <a href="#" class="edit-template" data-id="{{ t.id }}" title="{% trans "Edit" %}"> + <img src="{% static "icons/pencil.png" %}" alt="{% trans "Edit" %}" /> + </a> {% if t.state == 'READY' %} <a href="#" class="try-template" data-id="{{t.id}}" title="{% trans "Try" %}"> <img src="{% static "icons/control.png" %}" alt="{% trans "Start" %}"/> @@ -61,7 +64,4 @@ <a href="#" class="delete-template" data-id="{{ t.id }}" data-name="{{ t.name }}" title="{% trans "Remove" %}"> <img src="{% static "icons/minus-circle.png" %}" alt="{% trans "Remove" %}" /> </a> - <!--<a href="#" class="edit-template" data-id="{{ t.id }}" title="{% trans "Edit" %}"> - <img src="{% static "icons/pencil.png" %}" alt="{% trans "Edit" %}" /> - </a>--> {% endblock actions %} diff --git a/one/templates/edit-template-flow.html b/one/templates/edit-template-flow.html new file mode 100644 index 0000000..7d9897c --- /dev/null +++ b/one/templates/edit-template-flow.html @@ -0,0 +1,112 @@ +{% load i18n %} +{% load staticfiles %} +{% get_current_language as LANGUAGE_CODE %} +<form action="{% url one.views.ajax_template_edit_wizard template.id %}" method="post" id="template-wizard"> + {% csrf_token %} + <div id="new-template-step-2" class="wizard"> + <h2>{% blocktrans with step=2 %}Step {{step}}{% endblocktrans %}</h2> + <p>{% trans "Change the parameters as needed." %}</p> + <ul> + <li> + <label for="new-template-name">{% trans "Name" %}</label> + <input type="text" name="name" id="new-template-name" value="{{template.name}}" + class="validated" /> + <div class="clear"></div> + </li> + <li class="new-tpl-size"> + <label for="new-template-size">{% trans "Size" %}</label> + <ul class="radio"> + {% for s in sizes %} + <li> + <label> + <input type="radio" name="size" value="{{s.id}}" id="new-template-size-{{s.id}}" + {% if s == template.instance_type %}checked="checked"{% endif %} /> + {{s.name}} + </label> + </li> + {% endfor %} + </ul> + {% for s in sizes %} + <p id="new-template-size-summary-{{s.id}}" class="size-summary clear" + {% if s != template.instance_type %}style="display:none"{% endif %}> + <span class="cpu"> + {% blocktrans count n=s.CPU %}{{n}} core{% plural %}{{n}} cores{% endblocktrans %} + </span> + <span class="memory">{{s.RAM}} MiB</span> + <span class="credit">{{s.credit}}</span> + </p> + {% endfor %} + <div class="clear"></div> + </li> + <li style="border: none"> + <label for="new-template-description">{% trans "Description" %}</label> + <textarea name="description" id="new-template-description" style="text-align: left">{{template.description}}</textarea> + <div class="clear"></div> + </li> + </ul> + <nav> + <input type="reset" class="prev" value="{% trans "Cancel" %}" /> + <input type="submit" class="next" value="{% trans "Save" %}" /> + <div class="clear"></div> + </nav> + <script type="text/javascript"> + $(function(){ + var original = '{{template.name}}'; + $('#new-template-step-2 nav .prev').click(function(){ + $('#modal').hide(); + }) + $(".new-tpl-size input[name='size']").click(function(e){ + var v = $(".new-tpl-size input[name='size']:checked").val(); + $("p.size-summary").hide(); + $("#new-template-size-summary-" + v).show(); + }); + $("#new-template-name").keyup(function(){ + var timer; + return function(e){ + var self = this; + clearTimeout(timer); + timer=setTimeout(function(){ + var s = $(self).val(); + $.ajax({ + 'type': 'GET', + 'url': '{% url one.views.ajax_template_name_unique %}?name=' + s, + 'success': function(data, b, c) { + if (s != $("#new-template-name").val()) { + return true; + } + if (data == "True" || s == original) { + $('#new-template-name').removeClass("error"); + $('#new-template-step-2 nav .next').removeAttr("disabled"); + $('#new-template-name').removeProp("title"); + } + else { + $('#new-template-name').addClass("error"); + $('#new-template-step-2 nav .next').attr("disabled", "disabled"); + $('#new-template-name').prop("title", gettext('Please choose a different name.')); + } + } + }); + }, 1000) + } + }()); + $("#template-wizard").submit(function(e){ + e.preventDefault(); + $.ajax({ + 'type': 'GET', + 'url': '{% url one.views.ajax_template_name_unique %}?name=' + $("#new-template-name").val(), + 'success': function(data, b, c) { + if (data == "True" || s == original) { + $("#template-wizard").unbind('submit').submit() + } + else { + $('#new-template-name').addClass("error"); + $('#new-template-step-2 nav .next').attr("disabled", "disabled"); + $('#new-template-name').prop("title", gettext('Please choose a different name.')); + } + } + }); + }); + }) + </script> + </div> +</form> diff --git a/one/views.py b/one/views.py index 9cd6703..9396d4f 100644 --- a/one/views.py +++ b/one/views.py @@ -135,6 +135,27 @@ class AjaxTemplateWizard(View): })) ajax_template_wizard = login_required(AjaxTemplateWizard.as_view()) +class AjaxTemplateEditWizard(View): + def get(self, request, id, *args, **kwargs): + template = get_object_or_404(Template, id=id) + if template.owner != request.user and not template.public and not request.user.is_superuser: + raise PermissionDenied() + return render_to_response('edit-template-flow.html', RequestContext(request, { + 'sizes': InstanceType.objects.all(), + 'template': template, + })) + def post(self, request, id, *args, **kwargs): + template = get_object_or_404(Template, id=id) + if template.owner != request.user and not template.public and not request.user.is_superuser: + raise PermissionDenied() + template.instance_type_id = request.POST['size'] + template.description = request.POST['description'] + template.name = request.POST['name'] + template.save() + return redirect(home) + +ajax_template_edit_wizard = login_required(AjaxTemplateEditWizard.as_view()) + class AjaxShareWizard(View): def get(self, request, id, gid=None, *args, **kwargs):