euscanwww: Admin improved and simple task launcher added
Signed-off-by: volpino <fox91@anche.no>
This commit is contained in:
		@@ -13,7 +13,7 @@ from djeuscan.models import Package, Herd, Maintainer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ScanMetadata(object):
 | 
			
		||||
    def __init__(self, quiet):
 | 
			
		||||
    def __init__(self, quiet=False):
 | 
			
		||||
        self.quiet = quiet
 | 
			
		||||
        self.style = color_style()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -241,7 +241,7 @@ class ScanPortage(object):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@commit_on_success
 | 
			
		||||
def purge_versions(options):
 | 
			
		||||
def purge_versions(quiet=False, nolog=False):
 | 
			
		||||
    # For each dead versions
 | 
			
		||||
    for version in Version.objects.filter(packaged=True, alive=False):
 | 
			
		||||
        if version.overlay == 'gentoo':
 | 
			
		||||
@@ -251,10 +251,10 @@ def purge_versions(options):
 | 
			
		||||
        version.package.n_versions -= 1
 | 
			
		||||
        version.package.save()
 | 
			
		||||
 | 
			
		||||
        if not options['quiet']:
 | 
			
		||||
        if not quiet:
 | 
			
		||||
            sys.stdout.write('- [v] %s\n' % (version))
 | 
			
		||||
 | 
			
		||||
        if options['no-log']:
 | 
			
		||||
        if nolog:
 | 
			
		||||
            continue
 | 
			
		||||
 | 
			
		||||
        VersionLog.objects.create(
 | 
			
		||||
@@ -335,7 +335,7 @@ class Command(BaseCommand):
 | 
			
		||||
                scan_portage.scan(package[:-1])
 | 
			
		||||
 | 
			
		||||
        if options['purge-versions']:
 | 
			
		||||
            purge_versions(options)
 | 
			
		||||
            purge_versions(options["quiet"], options["no-log"])
 | 
			
		||||
 | 
			
		||||
        if not options['quiet']:
 | 
			
		||||
            self.stdout.write('Done.\n')
 | 
			
		||||
 
 | 
			
		||||
@@ -190,6 +190,11 @@ class EuscanResult(models.Model):
 | 
			
		||||
        self.full_clean()
 | 
			
		||||
        super(EuscanResult, self).save(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
    def __unicode__(self):
 | 
			
		||||
        return '[%s] %s/%s' % (
 | 
			
		||||
            self.datetime, self.package.category, self.package.name
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Log(models.Model):
 | 
			
		||||
    """
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ def scan_metadata_task(query, obj=None):
 | 
			
		||||
    logger.info("Starting metadata scanning for package %s ...", query)
 | 
			
		||||
 | 
			
		||||
    scan_metadata = ScanMetadata()
 | 
			
		||||
    scan_metadata.scan(query)
 | 
			
		||||
    scan_metadata.scan(query, obj)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@task
 | 
			
		||||
@@ -95,3 +95,17 @@ def scan_upstream_task(query):
 | 
			
		||||
@task
 | 
			
		||||
def scan_upstream_purge_task():
 | 
			
		||||
    scan_upstream_purge()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
launchable_tasks = [
 | 
			
		||||
    regen_rrds_task,
 | 
			
		||||
    update_counters_task,
 | 
			
		||||
    scan_metadata_task,
 | 
			
		||||
    scan_metadata_all_task,
 | 
			
		||||
    scan_portage_all_task,
 | 
			
		||||
    scan_portage_task,
 | 
			
		||||
    scan_portage_purge_task,
 | 
			
		||||
    scan_upstream_all_task,
 | 
			
		||||
    scan_upstream_task,
 | 
			
		||||
    scan_upstream_purge_task,
 | 
			
		||||
]
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,77 @@
 | 
			
		||||
{% extends "admin/change_list.html" %}
 | 
			
		||||
 | 
			
		||||
{% load url from future %}
 | 
			
		||||
 | 
			
		||||
{% block object-tools %}
 | 
			
		||||
  <div>
 | 
			
		||||
    <span id="task_selector"></span>
 | 
			
		||||
    <form id="task_data"></form>
 | 
			
		||||
    <a href="#" id="task_launch">Launch task</a>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
  <script type="text/javascript">
 | 
			
		||||
    (function($){
 | 
			
		||||
      $(document).ready(function() {
 | 
			
		||||
 | 
			
		||||
        $.get("{% url "registered_tasks" %}", function (data) {
 | 
			
		||||
          var selector = $("<select/>");
 | 
			
		||||
          selector.append(
 | 
			
		||||
            $("<option/>").text("-------------").attr("selected", "selected")
 | 
			
		||||
          );
 | 
			
		||||
          for (task in data["tasks"]) {
 | 
			
		||||
            var t = data["tasks"][task];
 | 
			
		||||
            selector.append(
 | 
			
		||||
              $("<option/>").val(task).text(task)
 | 
			
		||||
            )
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          selector.change(function() {
 | 
			
		||||
            $("#task_data").empty();
 | 
			
		||||
            var task = data["tasks"][$(this).val()];
 | 
			
		||||
            if (task.args) {
 | 
			
		||||
              for (var i = 0; i < task.args.length; i++) {
 | 
			
		||||
                var arg = task.args[i];
 | 
			
		||||
                var arg_input = $("<input/>").attr("name", arg);
 | 
			
		||||
                var default_arg;
 | 
			
		||||
 | 
			
		||||
                if (task.defaults) {
 | 
			
		||||
                  var default_arg_i = task.args.length - 1 - i;
 | 
			
		||||
                  if (task.defaults[default_arg_i] !== undefined) {
 | 
			
		||||
                    default_arg = task.defaults[default_arg_i];
 | 
			
		||||
                    if (task.defaults_types && task.defaults_types[default_arg_i] === "bool") {
 | 
			
		||||
                      arg_input.attr("type", "checkbox");
 | 
			
		||||
                    }
 | 
			
		||||
                    else {
 | 
			
		||||
                      continue
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                arg_input.val(default_arg);
 | 
			
		||||
 | 
			
		||||
                $("#task_data").append(
 | 
			
		||||
                  $("<label/>").text(arg + ": ").attr("for", arg)
 | 
			
		||||
                ).append(
 | 
			
		||||
                  arg_input
 | 
			
		||||
                );
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          })
 | 
			
		||||
 | 
			
		||||
          $("#task_selector").append(selector);
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        $("#task_launch").click(function() {
 | 
			
		||||
            var task_name = $("#task_selector").find("select").val();
 | 
			
		||||
            var data = $("#task_data").serialize();
 | 
			
		||||
            var url = "{% url "apply_task" "task_name" %}";
 | 
			
		||||
 | 
			
		||||
            $.post(url.replace("task_name", task_name), data, function() {
 | 
			
		||||
              location.reload();
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
      });
 | 
			
		||||
    })(django.jQuery);
 | 
			
		||||
  </script>
 | 
			
		||||
{% endblock %}
 | 
			
		||||
@@ -1,7 +1,16 @@
 | 
			
		||||
from django.conf.urls.defaults import url, patterns, include
 | 
			
		||||
from django.contrib.auth.decorators import user_passes_test
 | 
			
		||||
 | 
			
		||||
from djcelery.views import apply
 | 
			
		||||
from djeuscan.views import registered_tasks
 | 
			
		||||
 | 
			
		||||
from djeuscan.feeds import PackageFeed, CategoryFeed, HerdFeed, \
 | 
			
		||||
    MaintainerFeed, GlobalFeed
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
admin_required = user_passes_test(lambda u: u.is_superuser)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
package_patterns = patterns('djeuscan.views',
 | 
			
		||||
    url(r'^(?P<category>[\w+][\w+.-]*)/(?P<package>[\w+][\w+.-]*)/feed/$',
 | 
			
		||||
        PackageFeed(), name='package_feed'),
 | 
			
		||||
@@ -41,6 +50,13 @@ overlays_patterns = patterns('djeuscan.views',
 | 
			
		||||
    url(r'^$', 'overlays', name="overlays"),
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
tasks_patterns = patterns('djcelery.views',
 | 
			
		||||
    url(r'^registered_tasks/$', admin_required(registered_tasks),
 | 
			
		||||
        name="registered_tasks"),
 | 
			
		||||
    url(r'^apply/(?P<task_name>.*)/$', admin_required(apply),
 | 
			
		||||
        name="apply_task"),
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
urlpatterns = patterns('djeuscan.views',
 | 
			
		||||
    # Global stuff
 | 
			
		||||
    url(r'^api/', include('djeuscan.api.urls')),
 | 
			
		||||
@@ -60,4 +76,5 @@ urlpatterns = patterns('djeuscan.views',
 | 
			
		||||
    url(r'^maintainers/', include(maintainers_patterns)),
 | 
			
		||||
    url(r'^overlays/', include(overlays_patterns)),
 | 
			
		||||
    url(r'^package/', include(package_patterns)),
 | 
			
		||||
    url(r'^tasks/', include(tasks_patterns)),
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,8 @@
 | 
			
		||||
""" Views """
 | 
			
		||||
 | 
			
		||||
from annoying.decorators import render_to
 | 
			
		||||
import inspect
 | 
			
		||||
from annoying.decorators import render_to, ajax_request
 | 
			
		||||
 | 
			
		||||
from django.http import Http404
 | 
			
		||||
from django.shortcuts import get_object_or_404
 | 
			
		||||
 | 
			
		||||
@@ -8,6 +10,7 @@ from djeuscan.helpers import version_key, packages_from_names
 | 
			
		||||
from djeuscan.models import Version, Package, Herd, Maintainer, EuscanResult, \
 | 
			
		||||
    VersionLog
 | 
			
		||||
from djeuscan.forms import WorldForm, PackagesForm
 | 
			
		||||
from djeuscan.tasks import launchable_tasks
 | 
			
		||||
from djeuscan import charts
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -254,3 +257,20 @@ def chart_herd(request, **kwargs):
 | 
			
		||||
 | 
			
		||||
def chart_category(request, **kwargs):
 | 
			
		||||
    return chart(request, **kwargs)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ajax_request
 | 
			
		||||
def registered_tasks(request):
 | 
			
		||||
    data = {}
 | 
			
		||||
    for task in launchable_tasks:
 | 
			
		||||
        argspec = inspect.getargspec(task.run)
 | 
			
		||||
        data[task.name] = {
 | 
			
		||||
            "args": argspec.args,
 | 
			
		||||
            "defaults": argspec.defaults,
 | 
			
		||||
            "default_types": None
 | 
			
		||||
        }
 | 
			
		||||
        if argspec.defaults is not None:
 | 
			
		||||
            data[task.name].update({
 | 
			
		||||
                "defaults_types": [type(x).__name__ for x in argspec.defaults]
 | 
			
		||||
            })
 | 
			
		||||
    return {"tasks": data}
 | 
			
		||||
 
 | 
			
		||||
@@ -157,6 +157,9 @@ TEMPLATE_CONTEXT_PROCESSORS = (
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
INSTALLED_APPS = (
 | 
			
		||||
    'euscanwww',
 | 
			
		||||
    'djeuscan',
 | 
			
		||||
 | 
			
		||||
    'django.contrib.auth',
 | 
			
		||||
    'django.contrib.contenttypes',
 | 
			
		||||
    'django.contrib.sessions',
 | 
			
		||||
@@ -167,8 +170,6 @@ INSTALLED_APPS = (
 | 
			
		||||
    # 'django.contrib.admindocs',
 | 
			
		||||
    'south',
 | 
			
		||||
    'djcelery',
 | 
			
		||||
    'euscanwww',
 | 
			
		||||
    'djeuscan',
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
# A sample logging configuration. The only tangible logging
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user