From 0d3452971de9fb726506053c8377291097616baf Mon Sep 17 00:00:00 2001 From: tarokkk <tarokkk@cloud.ik.bme.hu> Date: Sun, 10 Feb 2013 13:59:21 +0100 Subject: [PATCH] webui: Added template delete support --- cloud/urls.py | 1 + one/models.py | 12 ++++++++++++ one/static/cloud.js | 34 ++++++++++++++++++++++++++++++++++ one/templates/box-templatelist.html | 4 ++-- one/views.py | 15 +++++++++++++++ store/views.py | 18 +++++++++--------- 6 files changed, 73 insertions(+), 11 deletions(-) diff --git a/cloud/urls.py b/cloud/urls.py index fd1528f..6cb93ec 100644 --- a/cloud/urls.py +++ b/cloud/urls.py @@ -33,6 +33,7 @@ urlpatterns = patterns('', url(r'^store/gui/$', 'store.views.gui', name='store_gui'), url(r'^store/top/$', 'store.views.toplist', name='store_top'), url(r'^ajax/templateWizard$', 'one.views.ajax_template_wizard', name='ajax_template_wizard'), + url(r'^ajax/template/delete/$', 'one.views.ajax_template_delete', name='ajax_template_delete'), url(r'^ajax/template_name_unique/(?P<name>.*)$', 'one.views.ajax_template_name_unique', name='ajax_template_name_unique'), url(r'^ajax/store/list$', 'store.views.ajax_listfolder', name='store_ajax_listfolder'), url(r'^ajax/store/download$', 'store.views.ajax_download', name='store_ajax_download'), diff --git a/one/models.py b/one/models.py index 8901c9a..dd15155 100644 --- a/one/models.py +++ b/one/models.py @@ -14,9 +14,12 @@ from school.models import Person, Group from datetime import timedelta as td from django.db.models.signals import post_delete, pre_delete from store.api import StoreApi +from django.db import transaction +import logging import subprocess, tempfile, os, stat, re, base64, struct +logger = logging.getLogger(__name__) pwgen = User.objects.make_random_password """ @@ -289,6 +292,15 @@ class Template(models.Model): def __unicode__(self): return self.name + @transaction.commit_on_success + def safe_delete(self): + if not self.instance_set.exists(): + self.delete() + return True + else: + logger.info("Could not delete template. Instances still running!") + return False + class Meta: verbose_name = _('template') verbose_name_plural = _('templates') diff --git a/one/static/cloud.js b/one/static/cloud.js index 0d9f62b..73b881d 100644 --- a/one/static/cloud.js +++ b/one/static/cloud.js @@ -36,6 +36,9 @@ $(function() { $(this).next('.details').slideDown(700); } } + $('.delete-template-button').click(function() { + delete_template_confirm($(this).data('id'), $(this).data('name')); + }); $('.wm .summary').unbind('click').click(toggleDetails); $('.stop-vm-button').click(function() { stop_vm($(this).data('id'), $(this).data('name')); @@ -172,6 +175,37 @@ $(function() { } }) } + + /** + * Template delete + */ + function delete_template_confirm(id, name) { + confirm_message = interpolate(gettext("Are you sure deleting this %s template?"), [name]) + vm_confirm_popup(confirm_message, gettext("Delete"), function() { + delete_template(id) + }) + } + /** + * Template delete + */ + function delete_template(id) { + $.ajax({ + type: 'POST', + url: '/ajax/template/delete/', + data: 'id=' + id, + dataType: 'json', + statusCode: { + 404: function(data) { + alert(data['responseText']); + }, + 200: function(data) { + $("#t"+id).remove() + }, + + } + }) + } + $('#new-member').click(function() { $('#new-member-form').toggle(); }); diff --git a/one/templates/box-templatelist.html b/one/templates/box-templatelist.html index 2b31732..90f8129 100644 --- a/one/templates/box-templatelist.html +++ b/one/templates/box-templatelist.html @@ -4,13 +4,13 @@ <h2>{% trans "My templates" %}</h2> <ul class="wm-list"> {% for t in mytemplates %} - <li class="wm"> + <li class="wm" id="t{{t.id }}"> <div class="summary"> <div class="name">{{t.name}}</div> <div class="status">{{t.state}}</div> <div class="actions"> <a href="#" title="{% trans "Edit" %}"><img src="/static/icons/pencil.png" alt="{% trans "Edit" %}" /></a> - <a href="#" title="{% trans "Remove" %}"><img src="/static/icons/minus-circle.png" alt="{% trans "Remove" %}" /></a> + <a href="#" class="delete-template-button" data-id="{{ t.id }}" data-name="{{ t.name }}" title="{% trans "Remove" %}"><img src="/static/icons/minus-circle.png" alt="{% trans "Remove" %}" /></a> <a href="#" title="{% trans "Share" %}"><img src="static/icons/user-share.png" alt="{% trans "Share" %}" /></a> </div> <div class="clear"></div> diff --git a/one/views.py b/one/views.py index 3bb3b6f..19b43b9 100644 --- a/one/views.py +++ b/one/views.py @@ -81,6 +81,21 @@ def home(request): 'userdetails': UserCloudDetails.objects.get(user=request.user), })) +@login_required +def ajax_template_delete(request): + try: + template_id = request.POST['id'] + except: + return HttpResponse(unicode(_("Invalid template ID.")), status=404) + template = get_object_or_404(Template, id=template_id) + if template.instance_set.exists(): + return HttpResponse(unicode(_("There are running instances of this template.")), status=404) + elif template.share_set.exists(): + return HttpResponse(unicode(_("Template is still shared.")), status=404) + else: + template.safe_delete() + return HttpResponse(unicode(_("Template succesfully deleted."))) + def ajax_template_name_unique(request, name): s = "True" if Template.objects.filter(name=name).exists(): diff --git a/store/views.py b/store/views.py index e0d7c92..b4e49a2 100644 --- a/store/views.py +++ b/store/views.py @@ -20,7 +20,7 @@ def estabilish_store_user(request, user): for key in request.user.sshkey_set.all(): key_list.append(key.key) except: - return HttpResponse('Can not acces to django database!', status_code=404) + return HttpResponse('Can not acces to django database!', status=404) #Create user if not StoreApi.createuser(user, password, key_list, str(quota)): return HttpResponse('User does not exist on store! And could not create!') @@ -40,7 +40,7 @@ def index(request): for key in request.user.sshkey_set.all(): key_list.append(key.key) except: - return HttpResponse('Can not acces to django database!', status_code=404) + return HttpResponse('Can not acces to django database!', status=404) if not StoreApi.updateauthorizationinfo(user, password, key_list): return HttpResponse('Can not update authorization information!') except: @@ -114,7 +114,7 @@ def ajax_download(request): return HttpResponse(json.dumps({'url':StoreApi.requestdownload(user,dl)})) except: pass - return HttpResponse('File not found!', status_code=404) + return HttpResponse('File not found!', status=404) @login_required def ajax_upload(request): @@ -125,7 +125,7 @@ def ajax_upload(request): return HttpResponse(json.dumps({'url':url})) except: pass - return HttpResponse('Error!', status_code=404) + return HttpResponse('Error!', status=404) @login_required def ajax_delete(request): @@ -135,7 +135,7 @@ def ajax_delete(request): return HttpResponse(json.dumps({'success':StoreApi.requestremove(user,rm)})) except: pass - return HttpResponse('File not found!', status_code=404) + return HttpResponse('File not found!', status=404) @login_required def ajax_new_folder(request): @@ -147,7 +147,7 @@ def ajax_new_folder(request): return HttpResponse(json.dumps({'success':success})) except: pass - return HttpResponse('Error!', status_code=404) + return HttpResponse('Error!', status=404) @login_required def ajax_rename(request): @@ -159,7 +159,7 @@ def ajax_rename(request): return HttpResponse(json.dumps({'success':success})) except: pass - return HttpResponse('Error!', status_code=404) + return HttpResponse('Error!', status=404) @login_required def toplist(request): @@ -181,7 +181,7 @@ def gui(request): for key in request.user.sshkey_set.all(): key_list.append(key.key) except: - return HttpResponse('Can not acces to django database!', status_code=404) + return HttpResponse('Can not acces to django database!', status=404) try: lab_key_decoded = base64.b64decode(request.POST['KEY']) key_list.append(lab_key_decoded) @@ -195,7 +195,7 @@ def gui(request): else: return HttpResponse('Can not update authorization information!') else: - return HttpResponse('Method not found!', status_code=404) + return HttpResponse('Method not found!', status=404) def logout(request): auth.logout(request) -- libgit2 0.26.0