Remove invalidated records from the select lists in the admin interface.
Ex: Hosts edit page no longer shows invalidated labels in the "Labels"
    selection boxes.

Risk: low
Visibility: medium (bug fix)

Signed-off-by: James Ren <jamesren@google.com>


git-svn-id: http://test.kernel.org/svn/autotest/trunk@3577 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/frontend/afe/admin.py b/frontend/afe/admin.py
index 0f89f5b..2123f38 100644
--- a/frontend/afe/admin.py
+++ b/frontend/afe/admin.py
@@ -1,12 +1,24 @@
 """Django 1.0 admin interface declarations."""
 
 from django.contrib import admin
+from django.db import models as dbmodels
 
 from autotest_lib.frontend import settings
 from autotest_lib.frontend.afe import model_logic, models
 
 
-class AtomicGroupAdmin(admin.ModelAdmin):
+class SiteAdmin(admin.ModelAdmin):
+    def formfield_for_dbfield(self, db_field, **kwargs):
+        field = super(SiteAdmin, self).formfield_for_dbfield(db_field, **kwargs)
+        if (db_field.rel and
+                issubclass(db_field.rel.to, model_logic.ModelWithInvalid)):
+            model = db_field.rel.to
+            field.choices = model.valid_objects.all().values_list(
+                    'id', model.name_field)
+        return field
+
+
+class AtomicGroupAdmin(SiteAdmin):
     list_display = ('name', 'description', 'max_number_of_machines')
 
     def queryset(self, request):
@@ -15,7 +27,7 @@
 admin.site.register(models.AtomicGroup, AtomicGroupAdmin)
 
 
-class LabelAdmin(admin.ModelAdmin):
+class LabelAdmin(SiteAdmin):
     list_display = ('name', 'kernel_config')
 
     def queryset(self, request):
@@ -24,14 +36,14 @@
 admin.site.register(models.Label, LabelAdmin)
 
 
-class UserAdmin(admin.ModelAdmin):
+class UserAdmin(SiteAdmin):
     list_display = ('login', 'access_level')
     search_fields = ('login',)
 
 admin.site.register(models.User, UserAdmin)
 
 
-class HostAdmin(admin.ModelAdmin):
+class HostAdmin(SiteAdmin):
     # TODO(showard) - showing platform requires a SQL query for
     # each row (since labels are many-to-many) - should we remove
     # it?
@@ -46,7 +58,7 @@
 admin.site.register(models.Host, HostAdmin)
 
 
-class TestAdmin(admin.ModelAdmin):
+class TestAdmin(SiteAdmin):
     fields = ('name', 'author', 'test_category', 'test_class',
               'test_time', 'sync_count', 'test_type', 'path',
               'dependencies', 'experimental', 'run_verify',
@@ -58,14 +70,14 @@
 admin.site.register(models.Test, TestAdmin)
 
 
-class ProfilerAdmin(admin.ModelAdmin):
+class ProfilerAdmin(SiteAdmin):
     list_display = ('name', 'description')
     search_fields = ('name',)
 
 admin.site.register(models.Profiler, ProfilerAdmin)
 
 
-class AclGroupAdmin(admin.ModelAdmin):
+class AclGroupAdmin(SiteAdmin):
     list_display = ('name', 'description')
     search_fields = ('name',)
     filter_horizontal = ('users', 'hosts')
@@ -74,18 +86,18 @@
 
 
 if settings.FULL_ADMIN:
-    class JobAdmin(admin.ModelAdmin):
+    class JobAdmin(SiteAdmin):
         list_display = ('id', 'owner', 'name', 'control_type')
         filter_horizontal = ('dependency_labels',)
 
     admin.site.register(models.Job, JobAdmin)
 
-    class IneligibleHostQueueAdmin(admin.ModelAdmin):
+    class IneligibleHostQueueAdmin(SiteAdmin):
         list_display = ('id', 'job', 'host')
 
     admin.site.register(models.IneligibleHostQueue, IneligibleHostQueueAdmin)
 
-    class HostQueueEntryAdmin(admin.ModelAdmin):
+    class HostQueueEntryAdmin(SiteAdmin):
         list_display = ('id', 'job', 'host', 'status',
                         'meta_host')