diff --git a/layerindex/urls.py b/layerindex/urls.py index cee3d2a..1fcd11d 100644 --- a/layerindex/urls.py +++ b/layerindex/urls.py @@ -16,7 +16,7 @@ from layerindex.views import LayerListView, LayerReviewListView, LayerReviewDeta ClassicRecipeSearchView, ClassicRecipeDetailView, ClassicRecipeStatsView, LayerUpdateDetailView, UpdateListView, \ UpdateDetailView, StatsView, publish_view, LayerCheckListView, BBClassCheckListView, TaskStatusView, \ ComparisonRecipeSelectView, ComparisonRecipeSelectDetailView, task_log_view, task_stop_view, email_test_view, \ - BranchCompareView, RecipeDependenciesView + BranchCompareView, RecipeDependenciesView, update_layer_view from layerindex.models import LayerItem, Recipe, RecipeChangeset from rest_framework import routers from . import restviews diff --git a/layerindex/urls_branch.py b/layerindex/urls_branch.py index 6736f32..40cd915 100644 --- a/layerindex/urls_branch.py +++ b/layerindex/urls_branch.py @@ -8,7 +8,7 @@ from django.views.defaults import page_not_found from django.urls import include, re_path, reverse_lazy -from layerindex.views import LayerListView, RecipeSearchView, MachineSearchView, DistroSearchView, ClassSearchView, LayerDetailView, edit_layer_view, delete_layer_view, edit_layernote_view, delete_layernote_view, RedirectParamsView, DuplicatesView, LayerUpdateDetailView, layer_export_recipes_csv_view, comparison_update_view +from layerindex.views import LayerListView, RecipeSearchView, MachineSearchView, DistroSearchView, ClassSearchView, LayerDetailView, edit_layer_view, delete_layer_view, edit_layernote_view, delete_layernote_view, RedirectParamsView, DuplicatesView, LayerUpdateDetailView, layer_export_recipes_csv_view, comparison_update_view, update_layer_view urlpatterns = [ re_path(r'^$', @@ -41,6 +41,7 @@ urlpatterns = [ template_name='layerindex/classes.html'), name='class_search'), re_path(r'^edit/(?P[-\w]+)/$', edit_layer_view, {'template_name': 'layerindex/editlayer.html'}, name="edit_layer"), + re_path(r'^update/(?P[-\w]+)/$', update_layer_view, {'template_name': 'layerindex/updatelayer.html'}, name="update_layer"), re_path(r'^duplicates/$', DuplicatesView.as_view( template_name='layerindex/duplicates.html'), diff --git a/layerindex/views.py b/layerindex/views.py index 1a29dde..25c045e 100644 --- a/layerindex/views.py +++ b/layerindex/views.py @@ -121,6 +121,41 @@ def delete_layer_view(request, template_name, slug): 'cancel_url': layeritem.get_absolute_url() }) +def update_layer_view(request, template_name, branch='master', slug=None): + if not (request.user.is_authenticated and request.user.is_staff): + raise PermissionDenied + return_url = None + branchobj = Branch.objects.filter(name=branch)[:1].get() + if slug: + # Existing Layer Update + layeritem = get_object_or_404(LayerItem, name=slug) + layerbranch = get_object_or_404(LayerBranch, layer=layeritem, branch=branchobj) + returnto = request.GET.get('returnto', 'layer_item') + if returnto: + if returnto == 'layer_review': + return_url = reverse_lazy(returnto, args=(layeritem.name,)) + else: + return_url = reverse_lazy(returnto, args=(branch, layeritem.name)) + else: + # Pre-Publish Layer Update attempt + layeritem = LayerItem() + layerbranch = LayerBranch(layer=layeritem, branch=branchobj) + + from celery import uuid + + cmd = 'layerindex/update.py --layer %s --branch %s;' % (layeritem.name, branch) + + task_id = uuid() + # Create this here first, because inside the task we don't have all of the required info + update = Update(task_id=task_id) + update.started = datetime.now() + update.triggered_by = request.user + update.save() + + res = tasks.run_update_command.apply_async((branch, cmd), task_id=task_id) + + return HttpResponseRedirect(reverse_lazy('task_status', kwargs={'task_id': task_id})) + def edit_layer_view(request, template_name, branch='master', slug=None): return_url = None branchobj = Branch.objects.filter(name=branch)[:1].get() diff --git a/templates/layerindex/detail.html b/templates/layerindex/detail.html index 12ce156..0fa8caf 100644 --- a/templates/layerindex/detail.html +++ b/templates/layerindex/detail.html @@ -38,6 +38,9 @@ {% endif %} {% if user.is_authenticated %} + {% if user.is_staff %} + Update layer + {% endif %} {% if perms.layerindex.publish_layer or useredit %} Edit layer {% if layeritem.layernote_set.count == 0 %} diff --git a/templates/layerindex/reviewdetail.html b/templates/layerindex/reviewdetail.html index 8baab7c..39501be 100644 --- a/templates/layerindex/reviewdetail.html +++ b/templates/layerindex/reviewdetail.html @@ -47,6 +47,9 @@ Delete layer Publish layer {% endif %} + {% if user.is_staff %} + Update layer + {% endif %} {% endif %} diff --git a/templates/layerindex/updatelayer.html b/templates/layerindex/updatelayer.html new file mode 100644 index 0000000..799fb51 --- /dev/null +++ b/templates/layerindex/updatelayer.html @@ -0,0 +1,119 @@ +{% extends "base.html" %} +{% load i18n %} +{% load extrafilters %} + +{% comment %} + + layerindex-web - update page + + Copyright (C) 2016, 2018 Intel Corporation + Licensed under the MIT license, see COPYING.MIT for details + +{% endcomment %} + + + +{% block content %} +{% autoescape on %} + + + + +

{{ update.started }} {% if update.reload %}(reload){% endif %} +{% if update.finished %}{% if update.retcode < 0 %}TERMINATED ({{ update.retcode }}){% elif update.retcode %}FAILED{% endif %}{% endif %} +

+ +{% if update.log %} +
{{ update.log }}
+{% endif %} + +{% for layerupdate in layerupdates %} + + + {% with layerbranch_exists=layerupdate.layerbranch_exists %} + 0 or layerupdate.retcode != 0 %} class="error"{% elif layerupdate.warnings %} class="warning"{% endif %}> + {% if layerbranch_exists %}{% endif %}{{ layerupdate.layer.name }} {{ layerupdate.branch.name }}{% if layerbranch_exists %}{% endif %} + {% if layerupdate.vcs_before_rev != layerupdate.vcs_after_rev %} + + {% if layerbranch_exists %} + {% with before_url=layerupdate.vcs_before_commit_url after_url=layerupdate.vcs_after_commit_url %} + {% if before_url %}{% endif %}{{ layerupdate.vcs_before_rev|truncatesimple:10 }}{% if before_url %}{% endif %} → {% if after_url %}{% endif %}{{ layerupdate.vcs_after_rev|truncatesimple:10 }}{% if after_url %}{% endif %} + {% endwith %} + {% else %} + {{ layerupdate.vcs_before_rev|truncatesimple:10 }} → {{ layerupdate.vcs_after_rev|truncatesimple:10 }} + {% endif %} + + {% endif %} + + {% endwith %} + + + {% if layerupdate.log %} + + {% endif %} + +
+
{{ layerupdate.log }}
+
+{% endfor %} + +{% if not update.log and not layerupdates %} +

No messages or layer updates

+{% endif %} + +{% if update.comparisonrecipeupdate_set.exists %} +

Updated comparison recipes

+ +{% endif %} + +{% endautoescape %} + +{% endblock %} +{% if updates.count > 0 %} +
+ + + + + + + + + + + + {% for update in updates %} + + + + + + {% endfor %} + +
Date/timeErrorsWarnings
+ {% if update.log %} + {{ update.started }}{% if update.update.reload %} (reload){% endif%} + {% else %} + {{ update.started }}{% if update.update.reload %} (reload){% endif%} + {% endif %} + {% if update.errors %}{{ update.errors }}{% endif %}{% if update.warnings %}{{ update.warnings }}{% endif %}
+
+{% endif %} + +{% block scripts %} +{% endblock %}