summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Willemsen <tom.willemsen@archlinux.us>2011-04-28 13:19:42 -0500
committerDan McGee <dan@archlinux.org>2011-04-28 13:19:49 -0500
commitc292dcfc6bf96ebf5f34342beb1367aa5361f7c4 (patch)
treece49cd8c6bc90b37a6e4f61da53c17018fd865f2
parentdb137d4db607461dd32c46e40bee9084eb508da9 (diff)
isotests: various changes and updates
* isotests/fixtures/clockchoices.json: changed 'default' to 'unchanged' * isotests/fixtures/filesystems.json: removed 'check the installed system' line from one of the options * isotests/fixtures/modules.json: added 'ext2','ext3','ext4','swap','xfs','jfs','reiserFS' * isotests/models.py: * Added RollbackOption abstract class that adds the functions get_rollback_success_test and get_rollback_failed_test on top of the IsoOption abstract class for use with the Filesystem and Module classes since Test uses these both in 2 ways (regular and rollback). This keeps them seperated. * renamed the related names of these properties from rollback_test to rollback_test_set (seems more in-tune with the other relations) * isotests/views.py: * changed the order of the fields, the automatic order makes no sense. * Added help texts to the fields success, filesystem, rollback_filesystem and rollback_modules. * Removed help text from modules (made no sense) * Added a website field, should remain empty, a simplistic way to hopefully reduce spambot entries. * templates/isotests/results.html: * Removed the rollback yes/no section * The rollback labels should check get_rollback_success_test and get_rollback_failed_test. * Rollback checkbox removed. * Clearly tell users that success must only be selected if everything works right. * Clearly tell users to only fill in the rollback options if they did a rollback. * Added a thanks page that tells people thanks. * Added links between the pages. * Added links to lists with tests of either a specific iso or of any iso where a specific option was selected. Signed-off-by: Dan McGee <dan@archlinux.org> Conflicts: templates/isotests/results.html
-rw-r--r--isotests/fixtures/clockchoices.json2
-rw-r--r--isotests/fixtures/filesystems.json2
-rw-r--r--isotests/fixtures/modules.json49
-rw-r--r--isotests/models.py51
-rw-r--r--isotests/urls.py8
-rw-r--r--isotests/views.py64
-rw-r--r--templates/isotests/add.html2
-rw-r--r--templates/isotests/result_list.html34
-rw-r--r--templates/isotests/results.html595
-rw-r--r--templates/isotests/thanks.html14
-rw-r--r--templates/public/index.html2
11 files changed, 616 insertions, 207 deletions
diff --git a/isotests/fixtures/clockchoices.json b/isotests/fixtures/clockchoices.json
index 2c078128..6dfd06e1 100644
--- a/isotests/fixtures/clockchoices.json
+++ b/isotests/fixtures/clockchoices.json
@@ -3,7 +3,7 @@
"pk": 1,
"model": "isotests.clockchoice",
"fields": {
- "name": "default"
+ "name": "unchanged"
}
},
{
diff --git a/isotests/fixtures/filesystems.json b/isotests/fixtures/filesystems.json
index 4d3f1bc4..5386c391 100644
--- a/isotests/fixtures/filesystems.json
+++ b/isotests/fixtures/filesystems.json
@@ -3,7 +3,7 @@
"pk": 1,
"model": "isotests.filesystem",
"fields": {
- "name": "autoprepare (check the installed system, incl fstab)"
+ "name": "autoprepare"
}
},
{
diff --git a/isotests/fixtures/modules.json b/isotests/fixtures/modules.json
index 27d04c7a..ae8a1683 100644
--- a/isotests/fixtures/modules.json
+++ b/isotests/fixtures/modules.json
@@ -33,5 +33,54 @@
"fields": {
"name": "btrfs"
}
+ },
+ {
+ "pk": 6,
+ "model": "isotests.module",
+ "fields": {
+ "name": "ext2"
+ }
+ },
+ {
+ "pk": 7,
+ "model": "isotests.module",
+ "fields": {
+ "name": "ext3"
+ }
+ },
+ {
+ "pk": 8,
+ "model": "isotests.module",
+ "fields": {
+ "name": "ext4"
+ }
+ },
+ {
+ "pk": 9,
+ "model": "isotests.module",
+ "fields": {
+ "name": "swap"
+ }
+ },
+ {
+ "pk": 10,
+ "model": "isotests.module",
+ "fields": {
+ "name": "xfs"
+ }
+ },
+ {
+ "pk": 11,
+ "model": "isotests.module",
+ "fields": {
+ "name": "jfs"
+ }
+ },
+ {
+ "pk": 12,
+ "model": "isotests.module",
+ "fields": {
+ "name": "reiserFS"
+ }
}
]
diff --git a/isotests/models.py b/isotests/models.py
index bffb2d94..ae5bf96f 100644
--- a/isotests/models.py
+++ b/isotests/models.py
@@ -7,19 +7,49 @@ class IsoOption(models.Model):
name = models.CharField(max_length=200)
+ success_tests = None
+ failed_tests = None
+
def __unicode__(self):
return str(self.name)
def get_success_test(self):
- test = self.test_set.filter(success=True).annotate(Max('iso__id'))
- if test:
- return test[0].iso.name
+ if not self.success_tests:
+ self.success_tests = self.test_set.filter(success=True).annotate(Max('iso__id'))
+
+ if self.success_tests:
+ return self.success_tests[0].iso
return None
def get_failed_test(self):
- test = self.test_set.filter(success=False).annotate(Max('iso__id'))
- if test:
- return test[0].iso.name
+ if not self.failed_tests:
+ self.failed_tests = self.test_set.filter(success=False).annotate(Max('iso__id'))
+
+ if self.failed_tests:
+ return self.failed_tests[0].iso
+ return None
+
+class RollbackOption(IsoOption):
+ class Meta:
+ abstract = True
+
+ success_rollback_tests = None
+ failed_rollback_tests = None
+
+ def get_rollback_success_test(self):
+ if not self.success_rollback_tests:
+ self.success_rollback_tests = self.rollback_test_set.filter(success=True).annotate(Max('iso__id'))
+
+ if self.success_rollback_tests:
+ return self.success_rollback_tests[0].iso
+ return None
+
+ def get_rollback_failed_test(self):
+ if not self.failed_rollback_tests:
+ self.failed_rollback_tests = self.rollback_test_set.filter(success=False).annotate(Max('iso__id'))
+
+ if self.failed_rollback_tests:
+ return self.failed_rollback_tests[0].iso
return None
class Iso(models.Model):
@@ -50,10 +80,10 @@ class Source(IsoOption):
class ClockChoice(IsoOption):
pass
-class Filesystem(IsoOption):
+class Filesystem(RollbackOption):
pass
-class Module(IsoOption):
+class Module(RollbackOption):
pass
class Bootloader(IsoOption):
@@ -72,11 +102,10 @@ class Test(models.Model):
clock_choice = models.ForeignKey(ClockChoice)
filesystem = models.ForeignKey(Filesystem)
modules = models.ManyToManyField(Module, null=True, blank=True)
- rollback = models.BooleanField()
rollback_filesystem = models.ForeignKey(Filesystem,
- related_name="rollback_test", null=True, blank=True)
+ related_name="rollback_test_set", null=True, blank=True)
rollback_modules = models.ManyToManyField(Module,
- related_name="rollback_test", null=True, blank=True)
+ related_name="rollback_test_set", null=True, blank=True)
bootloader = models.ForeignKey(Bootloader)
success = models.BooleanField()
comments = models.TextField(null=True, blank=True)
diff --git a/isotests/urls.py b/isotests/urls.py
index f60f0bc9..7f438368 100644
--- a/isotests/urls.py
+++ b/isotests/urls.py
@@ -1,8 +1,12 @@
from django.conf.urls.defaults import patterns
urlpatterns = patterns('isotests.views',
- (r'^$', 'view_results'),
- (r'^add/$', 'add_result')
+ (r'^$', 'view_results'),
+ (r'^add/$', 'add_result'),
+ (r'^thanks/$', 'thanks'),
+ (r'^results/$', 'view_results'),
+ (r'^results/(?P<option>[a-z0-9_]+)/(?P<value>.+)/$', 'view_results_for'),
+ (r'^results/(?P<isoid>.+)/$', 'view_results_iso'),
)
# vim: set ts=4 sw=4 et:
diff --git a/isotests/views.py b/isotests/views.py
index cb7f23c5..61d95e54 100644
--- a/isotests/views.py
+++ b/isotests/views.py
@@ -1,15 +1,22 @@
-from django.http import HttpResponse, HttpResponseRedirect
+from django.forms import ModelChoiceField, CharField, TextInput
from django.forms import ModelForm, RadioSelect, CheckboxSelectMultiple
-from django.forms import ModelChoiceField
+from django.forms import ModelMultipleChoiceField, BooleanField
+from django.http import HttpResponse, HttpResponseRedirect
+from django.template import Context, loader
+from django.views.generic.simple import direct_to_template
+
from isotests.models import Iso, Architecture, IsoType, BootType
from isotests.models import HardwareType, InstallType, Source, Test
from isotests.models import ClockChoice, Filesystem, Module, Bootloader
-from django.template import Context, loader
-from django.views.generic.simple import direct_to_template
class TestForm(ModelForm):
class Meta:
model = Test
+ fields = ("user_name", "user_email", "iso", "architecture",
+ "iso_type", "boot_type", "hardware_type",
+ "install_type", "source", "clock_choice", "filesystem",
+ "modules", "rollback_filesystem", "rollback_modules",
+ "bootloader", "success", "comments")
widgets = {
"architecture": RadioSelect(),
"iso_type": RadioSelect(),
@@ -18,20 +25,35 @@ class TestForm(ModelForm):
"install_type": RadioSelect(),
"source": RadioSelect(),
"clock_choice": RadioSelect(),
- "filesystem": RadioSelect(),
- "rollback_filesystem": RadioSelect(),
"bootloader": RadioSelect(),
"modules": CheckboxSelectMultiple(),
- "rollback_modules": CheckboxSelectMultiple(),
}
+ success = BooleanField(help_text="Only check this if everything went fine. " \
+ "If you you ran into any errors please specify them in the " \
+ "comments.", required=False)
iso = ModelChoiceField(queryset=Iso.objects.filter(active=True))
+ filesystem = ModelChoiceField(queryset=Filesystem.objects.all(),
+ help_text="Check the installed system, including fstab.",
+ widget=RadioSelect())
+ modules = ModelMultipleChoiceField(queryset=Module.objects.all(),
+ help_text="", widget=CheckboxSelectMultiple(), required=False)
+ rollback_filesystem = ModelChoiceField(queryset=Filesystem.objects.all(),
+ help_text="If you did a rollback followed by a new attempt to setup " \
+ "your lockdevices/filesystems, select which option you took here.",
+ widget=RadioSelect(), required=False)
+ rollback_modules = ModelMultipleChoiceField(queryset=Module.objects.all(),
+ help_text="If you did a rollback followed b a new attempt to setup " \
+ "your lockdevices/filesystems, select which option you took here.",
+ widget=CheckboxSelectMultiple(), required=False)
+ website = CharField(label='',
+ widget=TextInput(attrs={'style': 'display:none;'}), required=False)
def add_result(request):
- if request.method == 'POST':
+ if request.POST:
form = TestForm(request.POST)
- if form.is_valid():
+ if form.is_valid() and request.POST['website'] == '':
form.save()
- return HttpResponseRedirect('/isotests')
+ return HttpResponseRedirect('/isotests/thanks/')
else:
form = TestForm()
@@ -64,3 +86,25 @@ def view_results(request):
'bootloader_list': bootloader_list,
})
return HttpResponse(t.render(c))
+
+def view_results_iso(request, isoid):
+ iso = Iso.objects.get(pk=isoid)
+ test_list = Test.objects.filter(iso__pk=isoid)
+ context = {
+ 'iso_name': iso.name,
+ 'test_list': test_list
+ }
+ return direct_to_template(request, 'isotests/result_list.html', context)
+
+def view_results_for(request, option, value):
+ kwargs = {option: value}
+ test_list = Test.objects.filter(**kwargs).order_by("iso__name", "pk")
+ context = {
+ 'option': option,
+ 'value': value,
+ 'test_list': test_list
+ }
+ return direct_to_template(request, 'isotests/result_list.html', context)
+
+def thanks(request):
+ return direct_to_template(request, "isotests/thanks.html", None)
diff --git a/templates/isotests/add.html b/templates/isotests/add.html
index 07d3ed81..466beb8c 100644
--- a/templates/isotests/add.html
+++ b/templates/isotests/add.html
@@ -3,6 +3,8 @@
{% block title %}Arch Linux - Test Result Entry{% endblock %}
{% block content %}
+<a href="/isotests/">Go back to results</a>
+
<div class="box">
<h2>Arch releng iso build test result entry</h2>
<form action="" method="post">{% csrf_token %}
diff --git a/templates/isotests/result_list.html b/templates/isotests/result_list.html
new file mode 100644
index 00000000..06042b1c
--- /dev/null
+++ b/templates/isotests/result_list.html
@@ -0,0 +1,34 @@
+{% extends "base.html" %}
+
+{% block content %}
+<a href="/isotests/">Go back to results</a>
+<a href="/isotests/add/">Give feedback</a>
+
+<div class="box">
+ <h2>
+ Results for :
+ {% if option %}
+ {{ option }}: {{ value }}
+ {% endif %}
+
+ {% if iso_name %}
+ {{ iso_name }}
+ {% endif %}
+ </h2>
+
+ <table>
+ <tr>
+ <th>iso</th>
+ <th>nickname</th>
+ <th>success?</th>
+ </tr>
+ {% for test in test_list %}
+ <tr>
+ <td>{{ test.iso.name }}</td>
+ <td>{{ test.user_name }}</td>
+ <td>{{ test.success|yesno }}</td>
+ </tr>
+ {% endfor %}
+ </table>
+</div>
+{% endblock %}
diff --git a/templates/isotests/results.html b/templates/isotests/results.html
index b773056a..5d605e87 100644
--- a/templates/isotests/results.html
+++ b/templates/isotests/results.html
@@ -3,188 +3,419 @@
{% block title %}Arch Linux - Testresults{% endblock %}
{% block content %}
+<a href="/isotests/add/">Give feedback</a>
+
<div class="box">
- <h2>Arch releng iso build test results</h2>
- <table>
- <tr>
- <td>
- <h3>image arch</h3>
- </td>
- </tr>
- {% if architecture_list %}
- {% for architecture in architecture_list %}
- <tr>
- <td>{{ architecture.name }}</td>
- <td>{{ architecture.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ architecture.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- <tr>
- <td>
- <h3>image type</h3>
- </td>
- </tr>
- {% if iso_type_list %}
- {% for iso_type in iso_type_list %}
- <tr>
- <td>{{ iso_type.name }}</td>
- <td>{{ iso_type.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ iso_type.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- <tr>
- <td>
- <h3>image boot</h3>
- </td>
- </tr>
- {% if boot_type_list %}
- {% for boot_type in boot_type_list %}
- <tr>
- <td>{{ boot_type.name }}</td>
- <td>{{ boot_type.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ boot_type.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- <tr>
- <td>
- <h3>hardware type</h3>
- </td>
- </tr>
- {% if hardware_type_list %}
- {% for hardware_type in hardware_type_list %}
- <tr>
- <td>{{ hardware_type.name }}</td>
- <td>{{ hardware_type.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ hardware_type.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- <tr>
- <td>
- <h3>install type</h3>
- </td>
- </tr>
- {% if install_type_list %}
- {% for install_type in install_type_list %}
- <tr>
- <td>{{ install_type.name }}</td>
- <td>{{ install_type.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ install_type.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- <tr>
- <td>
- <h3>source selection</h3>
- </td>
- </tr>
- {% if source_list %}
- {% for source in source_list %}
- <tr>
- <td>{{ source.name }}</td>
- <td>{{ source.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ source.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- <tr>
- <td>
- <h3>clock</h3>
- </td>
- </tr>
- {% if clock_choices_list %}
- {% for clock_choice in clock_choices_list %}
- <tr>
- <td>{{ clock_choice.name }}</td>
- <td>{{ clock_choice.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ clock_choice.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- <tr>
- <td>
- <h3>partitioning/filesystems</h3>
- </td>
- </tr>
- {% if filesystem_list %}
- {% for filesystem in filesystem_list %}
- <tr>
- <td>{{ filesystem.name }}</td>
- <td>{{ filesystem.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ filesystem.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- <tr>
- <td>
- <h3>fancy stuff</h3>
- </td>
- </tr>
- {% if module_list %}
- {% for module in module_list %}
- <tr>
- <td>{{ module.name }}</td>
- <td>{{ module.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ module.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- <tr>
- <td>
- <h3>rollback</h3>
- </td>
- </tr>
- <tr>
- <td>yes</td>
- </tr>
- <tr>
- <td>no</td>
- </tr>
- <tr>
- <td>
- <h4>rollback: partitioning/filesystems</h4>
- </td>
- </tr>
- {% if filesystem_list %}
- {% for filesystem in filesystem_list %}
- <tr>
- <td>{{ filesystem.name }}</td>
- <td>{{ filesystem.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ filesystem.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- <tr>
- <td>
- <h4>rollback: fancy stuff</h4>
- </td>
- </tr>
- {% if module_list %}
- {% for module in module_list %}
- <tr>
- <td>{{ module.name }}</td>
- <td>{{ module.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ module.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- <tr>
- <td>
- <h3>bootloader</h3>
- </td>
- </tr>
- {% if bootloader_list %}
- {% for bootloader in bootloader_list %}
- <tr>
- <td>{{ bootloader.name }}</td>
- <td>{{ bootloader.get_success_test|default_if_none:"Never succeeded" }}</td>
- <td>{{ bootloader.get_failed_test|default_if_none:"Never failed" }}</td>
- </tr>
- {% endfor %}
- {% endif %}
- </table>
+ <h2>Arch releng iso build test results</h2>
+ <table>
+ <tr>
+ <td>
+ <h3>image arch</h3>
+ </td>
+ </tr>
+ {% if architecture_list %}
+ {% for architecture in architecture_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/architecture/{{ architecture.pk }}/">
+ {{ architecture.name }}
+ </a>
+ </td>
+ <td>
+ {% if architecture.get_success_test %}
+ <a href="/isotests/results/{{ architecture.get_success_test.pk }}/">
+ {{ architecture.get_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if architecture.get_failed_test %}
+ <a href="/isotests/results/{{ architecture.get_failed_test.pk }}/">
+ {{ architecture.get_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ <tr>
+ <td>
+ <h3>image type</h3>
+ </td>
+ </tr>
+ {% if iso_type_list %}
+ {% for iso_type in iso_type_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/iso_type/{{ iso_type.pk }}/">
+ {{ iso_type.name }}
+ </a>
+ </td>
+ <td>
+ {% if iso_type.get_success_test %}
+ <a href="/isotests/results/{{ iso_type.get_success_test.pk }}/">
+ {{ iso_type.get_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if iso_type.get_failed_test %}
+ <a href="/isotests/results/{{ iso_type.get_failed_test.pk }}/">
+ {{ iso_type.get_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ <tr>
+ <td>
+ <h3>image boot</h3>
+ </td>
+ </tr>
+ {% if boot_type_list %}
+ {% for boot_type in boot_type_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/boot_type/{{ boot_type.pk }}/">
+ {{ boot_type.name }}
+ </a>
+ </td>
+ <td>
+ {% if boot_type.get_success_test %}
+ <a href="/isotests/results/{{ boot_type.get_success_test.pk }}/">
+ {{ boot_type.get_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if boot_type.get_failed_test %}
+ <a href="/isotests/results/{{ boot_type.get_failed_test.pk }}/">
+ {{ boot_type.get_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ <tr>
+ <td>
+ <h3>hardware type</h3>
+ </td>
+ </tr>
+ {% if hardware_type_list %}
+ {% for hardware_type in hardware_type_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/hardware_type/{{ hardware_type.pk }}/">
+ {{ hardware_type.name }}
+ </a>
+ </td>
+ <td>
+ {% if hardware_type.get_success_test %}
+ <a href="/isotests/results/{{ hardware_type.get_success_test.pk }}/">
+ {{ hardware_type.get_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if hardware_type.get_failed_test %}
+ <a href="/isotests/results/{{ hardware_type.get_failed_test.pk }}/">
+ {{ hardware_type.get_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ <tr>
+ <td>
+ <h3>install type</h3>
+ </td>
+ </tr>
+ {% if install_type_list %}
+ {% for install_type in install_type_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/install_type/{{ install_type.pk }}/">
+ {{ install_type.name }}
+ </a>
+ </td>
+ <td>
+ {% if install_type.get_success_test %}
+ <a href="/isotests/results/{{ install_type.get_success_test.pk }}/">
+ {{ install_type.get_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if install_type.get_failed_test %}
+ <a href="/isotests/results/{{ install_type.get_failed_test.pk }}/">
+ {{ install_type.get_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ <tr>
+ <td>
+ <h3>source selection</h3>
+ </td>
+ </tr>
+ {% if source_list %}
+ {% for source in source_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/source/{{ source.pk }}/">
+ {{ source.name }}
+ </a>
+ </td>
+ <td>
+ {% if source.get_success_test %}
+ <a href="/isotests/results/{{ source.get_success_test.pk }}/">
+ {{ source.get_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if source.get_failed_test %}
+ <a href="/isotests/results/{{ source.get_failed_test.pk }}/">
+ {{ source.get_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ <tr>
+ <td>
+ <h3>clock</h3>
+ </td>
+ </tr>
+ {% if clock_choices_list %}
+ {% for clock_choice in clock_choices_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/clock_choice/{{ clock_choice.pk }}/">
+ {{ clock_choice.name }}
+ </a>
+ </td>
+ <td>
+ {% if clock_choice.get_success_test %}
+ <a href="/isotests/results/{{ clock_choice.get_success_test.pk }}/">
+ {{ clock_choice.get_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if clock_choice.get_failed_test %}
+ <a href="/isotests/results/{{ clock_choice.get_failed_test.pk }}/">
+ {{ clock_choice.get_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ <tr>
+ <td>
+ <h3>partitioning/filesystems</h3>
+ </td>
+ </tr>
+ {% if filesystem_list %}
+ {% for filesystem in filesystem_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/filesystem/{{ filesystem.pk }}/">
+ {{ filesystem.name }}
+ </a>
+ </td>
+ <td>
+ {% if filesystem.get_success_test %}
+ <a href="/isotests/results/{{ filesystem.get_success_test.pk }}/">
+ {{ filesystem.get_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if filesystem.get_failed_test %}
+ <a href="/isotests/results/{{ filesystem.get_failed_test.pk }}/">
+ {{ filesystem.get_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ <tr>
+ <td>
+ <h3>fancy stuff</h3>
+ </td>
+ </tr>
+ {% if module_list %}
+ {% for module in module_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/modules/{{ module.pk }}/">
+ {{ module.name }}
+ </a>
+ </td>
+ <td>
+ {% if module.get_success_test %}
+ <a href="/isotests/results/{{ module.get_success_test.pk }}/">
+ {{ module.get_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if module.get_failed_test %}
+ <a href="/isotests/results/{{ module.get_failed_test.pk }}/">
+ {{ module.get_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ <tr>
+ <td>
+ <h4>rollback: partitioning/filesystems</h4>
+ </td>
+ </tr>
+ {% if filesystem_list %}
+ {% for filesystem in filesystem_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/rollback_filesystem/{{ filesystem.pk }}/">
+ {{ filesystem.name }}
+ </a>
+ </td>
+ <td>
+ {% if filesystem.get_rollback_success_test %}
+ <a href="/isotests/results/{{ filesystem.get_rollback_success_test.pk }}/">
+ {{ filesystem.get_rollback_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if filesystem.get_rollback_failed_test %}
+ <a href="/isotests/results/{{ filesystem.get_rollback_failed_test.pk }}/">
+ {{ filesystem.get_rollback_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ <tr>
+ <td>
+ <h4>rollback: fancy stuff</h4>
+ </td>
+ </tr>
+ {% if module_list %}
+ {% for module in module_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/rollback_modules/{{ module.pk }}/">
+ {{ module.name }}
+ </a>
+ </td>
+ <td>
+ {% if module.get_rollback_success_test %}
+ <a href="/isotests/results/{{ module.get_rollback_success_test.pk }}/">
+ {{ module.get_rollback_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if module.get_rollback_failed_test %}
+ <a href="/isotests/results/{{ module.get_rollback_failed_test.pk }}/">
+ {{ module.get_rollback_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ <tr>
+ <td>
+ <h3>bootloader</h3>
+ </td>
+ </tr>
+ {% if bootloader_list %}
+ {% for bootloader in bootloader_list %}
+ <tr>
+ <td>
+ <a href="/isotests/results/bootloader/{{ bootloader.pk }}/">
+ {{ bootloader.name }}
+ </a>
+ </td>
+ <td>
+ {% if bootloader.get_success_test %}
+ <a href="/isotests/results/{{ bootloader.get_success_test.pk }}/">
+ {{ bootloader.get_success_test.name }}
+ </a>
+ {% else %}
+ Never succeeded
+ {% endif %}
+ </td>
+ <td>
+ {% if bootloader.get_failed_test %}
+ <a href="/isotests/results/{{ bootloader.get_failed_test.pk }}/">
+ {{ bootloader.get_failed_test.name }}
+ </a>
+ {% else %}
+ Never failed
+ {% endif %}
+ </td>
+ </tr>
+ {% endfor %}
+ {% endif %}
+ </table>
</div>
{% endblock %}
diff --git a/templates/isotests/thanks.html b/templates/isotests/thanks.html
new file mode 100644
index 00000000..aa4fea24
--- /dev/null
+++ b/templates/isotests/thanks.html
@@ -0,0 +1,14 @@
+{% extends "base.html" %}
+
+{% block title %}Arch Linux - Feedback - Thanks!{% endblock %}
+
+{% block content %}
+<a href="/isotests/">Go back to results</a>
+<a href="/isotests/add">Give more feedback</a>
+
+<div class="box">
+ <h2>Thanks!</h2>
+ Thank you for taking the time to give us this information!
+ Your results have been succesfully added to our database.
+</div>
+{% endblock %}
diff --git a/templates/public/index.html b/templates/public/index.html
index 132412f6..aa651217 100644
--- a/templates/public/index.html
+++ b/templates/public/index.html
@@ -119,6 +119,8 @@
title="Arch communities in your native language">International Communities</a></li>
<li><a href="https://wiki.archlinux.org/index.php/Related_Projects"
title="Projects that are in some way related to Arch Linux">Related Projects</a></li>
+ <li><a href="/isotests/"
+ title="releng-testbuild-feedback">Releng-testbuild-feedback</a></li>
</ul>
<h4>Support</h4>