diff --git a/circle/dashboard/templates/dashboard/_disk-list-element.html b/circle/dashboard/templates/dashboard/_disk-list-element.html new file mode 100644 index 0000000..de5b0e2 --- /dev/null +++ b/circle/dashboard/templates/dashboard/_disk-list-element.html @@ -0,0 +1,14 @@ +{% load i18n %} +{% load sizefieldtags %} + +<i class="{% if d.is_downloading %}icon-refresh icon-spin{% else %}icon-file{% endif %}"></i> +{{ d.name }} (#{{ d.id }}) - +{% if not d.is_downloading %} + {% if d.ready %} + {{ d.size|filesize }} + {% else %} + <div class="label label-danger">failed</div> + {% endif %} +{% else %}<span class="disk-list-disk-percentage" data-disk-pk="{{ d.pk }}">{{ d.get_download_percentage }}</span>%{% endif %} + +<div class="btn btn-xs btn-danger pull-right"><i class="icon-remove"></i> Remove</div> diff --git a/circle/dashboard/templates/dashboard/template-edit.html b/circle/dashboard/templates/dashboard/template-edit.html index 3bf75bc..b595d3a 100644 --- a/circle/dashboard/templates/dashboard/template-edit.html +++ b/circle/dashboard/templates/dashboard/template-edit.html @@ -1,5 +1,6 @@ {% extends "dashboard/base.html" %} {% load i18n %} +{% load sizefieldtags %} {% load crispy_forms_tags %} {% block content %} @@ -22,7 +23,7 @@ <div class="col-md-4"> <div class="panel panel-default"> <div class="panel-heading"> - <h3 class="no-margin"><i class="icon-group"></i> {% trans "Manage access" %}</h3> + <h4 class="no-margin"><i class="icon-group"></i> {% trans "Manage access" %}</h4> </div> <div class="panel-body"> <form action="{% url "dashboard.views.template-acl" pk=object.pk %}" method="post">{% csrf_token %} @@ -65,9 +66,25 @@ </div> </div> + <div class="panel panel-default"> <div class="panel-heading"> - <h3 class="no-margin"><i class="icon-file"></i> {% trans "Create new disk" %}</h3> + <h4 class="no-margin"><i class="icon-file"></i> {% trans "Disk list" %}</h4> + </div> + <div class="panel-body"> + <ul style="list-style: none; padding-left: 0;"> + {% for d in disks %} + <li> + {% include "dashboard/_disk-list-element.html" %} + </li> + {% endfor %} + </ul> + </div> + </div> + + <div class="panel panel-default"> + <div class="panel-heading"> + <h4 class="no-margin"><i class="icon-folder-open"></i> {% trans "Create new disk" %}</h4> </div> <div class="panel-body"> <form action="{% url "dashboard.views.disk-add" %}" method="POST"> diff --git a/circle/dashboard/templates/dashboard/vm-detail/resources.html b/circle/dashboard/templates/dashboard/vm-detail/resources.html index d6c7c0c..c564fb9 100644 --- a/circle/dashboard/templates/dashboard/vm-detail/resources.html +++ b/circle/dashboard/templates/dashboard/vm-detail/resources.html @@ -60,7 +60,7 @@ {% endif %} {% for d in instance.disks.all %} <h4 class="list-group-item-heading dashboard-vm-details-network-h3"> - <i class="icon-file"></i> {{ d.name }} (#{{ d.id }}) - {{ d.size|filesize }} + {% include "dashboard/_disk-list-element.html" %} </h4> {% endfor %} </div> diff --git a/circle/storage/models.py b/circle/storage/models.py index 4210ff5..3ac8b49 100644 --- a/circle/storage/models.py +++ b/circle/storage/models.py @@ -16,6 +16,7 @@ from datetime import timedelta from acl.models import AclBase from .tasks import local_tasks, remote_tasks from celery.exceptions import TimeoutError +from manager.mancelery import celery from common.models import ActivityModel, activitycontextimpl, WorkerNotFound logger = logging.getLogger(__name__) @@ -133,6 +134,19 @@ class Disk(AclBase, TimeStampedModel): 'raw-rw': 'vd', }[self.type] + def is_downloading(self): + da = DiskActivity.objects.filter(disk=self).latest("created") + return (da.activity_code == "storage.Disk.download" + and da.succeeded is None) + + def get_download_percentage(self): + if not self.is_downloading(): + return None + + task = DiskActivity.objects.latest("created").task_uuid + result = celery.AsyncResult(id=task) + return result.info.get("percent") + def is_deletable(self): """Returns whether the file can be deleted.