@transaction.atomic
def update_job(job, proxy):
- if job.terminated:
+ if job.terminated and job.purged:
return
ts = time.time()
elapsed = time.time() - ts
elapsed_py = elapsed - elapsed_cancel
logger.info('(%.3f) OBJ = %s (%.3f), TIME = %.3f', elapsed, obj, elapsed_cancel, elapsed_py)
+
+
+def clean(obj, proxy):
+ ts = time.time()
+ QCG.start()
+
+ qcg_obj = obj.qcg_job if isinstance(obj, Job) else obj.qcg_task
+ qcg_obj.credential = Credential(proxy)
+
+ jts = time.time()
+ qcg_obj.clean()
+ elapsed_clean = time.time() - jts
+
+ elapsed = time.time() - ts
+ elapsed_py = elapsed - elapsed_clean
+ logger.info('(%.3f) OBJ = %s (%.3f), TIME = %.3f', elapsed, obj, elapsed_clean, elapsed_py)
{% csrf_token %}
<button type="submit" class="btn btn-default">Anuluj zadanie</button>
</form>
+ {% elif not job.purged %}
+ <form action="{% url 'job_clean' job.job_id %}" method="post">
+ {% csrf_token %}
+ <button type="submit" class="btn btn-default">Usuń katalog roboczy</button>
+ </form>
{% endif %}
</div>
{% csrf_token %}
<button type="submit" class="btn btn-default">Anuluj zadanie</button>
</form>
+ {% elif not task.purged %}
+ <form action="{% url 'task_clean' task.job.job_id task.task_id %}" method="post">
+ {% csrf_token %}
+ <button type="submit" class="btn btn-default">Usuń katalog roboczy</button>
+ </form>
{% endif %}
</div>
{% display_attribute 'Katalog roboczy' alloc.working_directory %}
{% display_attribute 'Usunięty katalog roboczy?' task.purged %}
- {% if alloc.working_directory %}
+ {% if alloc.working_directory and not task.purged %}
<button class="btn btn-default working-dir"
data-toggle="modal" data-target="#gridftp" data-url="{{ alloc.working_directory|cut:'gsiftp://' }}">
Przeglądaj katalog roboczy
url(r'^$', views.index, name='index'),
url(r'^jobs/$', views.jobs_list, name='jobs'),
+
url(r'^job/submit/$', views.job_submit, name='job_submit'),
url(r'^job/cancel/(?P<job_id>[\w]+)/$', views.job_cancel, name='job_cancel'),
- url(r'^task/cancel(?P<job_id>[\w]+)/(?P<task_id>[\w]+)/$', views.task_cancel, name='task_cancel'),
+ url(r'^job/clean/(?P<job_id>[\w]+)/$', views.job_clean, name='job_clean'),
+ url(r'^task/cancel/(?P<job_id>[\w]+)/(?P<task_id>[\w]+)/$', views.task_cancel, name='task_cancel'),
+ url(r'^task/clean/(?P<job_id>[\w]+)/(?P<task_id>[\w]+)/$', views.task_clean, name='task_clean'),
url(r'^job/(?P<job_id>[\w]+)/?$', views.job_details, name='job'),
url(r'^job/(?P<job_id>[\w]+)/(?P<task_id>[\w]+)/?$', views.task_details, name='task'),
from filex.views import make_url
from qcg.forms import FiltersForm, ColumnsForm, JobDescriptionForm, EnvFormSet
from qcg.utils import paginator_context
-from qcg.service import update_user_data, submit_job, update_job, cancel
+from qcg.service import update_user_data, submit_job, update_job, cancel, clean
def index(request):
return redirect(obj)
+@require_POST
+@login_required
+def job_clean(request, job_id):
+ return obj_clean(request, get_object_or_404(request.user.jobs, job_id=job_id))
+
+
+@require_POST
+@login_required
+def task_clean(request, job_id, task_id):
+ return obj_clean(request, get_object_or_404(request.user.tasks, job__job_id=job_id, task_id=task_id))
+
+
+def obj_clean(request, obj):
+ try:
+ clean(obj, request.session['proxy'])
+ except PyqcgException as e:
+ messages.error(request, format_html('<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> {}',
+ e.message))
+ else:
+ messages.success(request, format_html('<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> '
+ 'Usunięto katalog roboczy.'))
+
+ return redirect(obj)
+
+
@login_required
def gridftp(request):
return render(request, 'qcg/gridftp.html',