euscanwww: Admin improved and simple task launcher added

Signed-off-by: volpino <fox91@anche.no>
This commit is contained in:
volpino 2012-06-03 09:43:49 +02:00
parent 47ec539e1d
commit 5970b4df37
8 changed files with 143 additions and 9 deletions

View File

@ -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()

View File

@ -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')

View File

@ -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):
"""

View File

@ -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,
]

View File

@ -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 %}

View File

@ -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)),
)

View File

@ -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}

View File

@ -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