blob: efc97f8543d3310df91cbc2d5541d769a72c3d24 [file] [log] [blame]
showarda5288b42009-07-28 20:06:08 +00001"""Django 1.0 admin interface declarations."""
2
showard3370e752009-08-31 18:32:30 +00003from django import forms
showarda5288b42009-07-28 20:06:08 +00004from django.contrib import admin
showard65974e12009-08-20 23:34:38 +00005from django.db import models as dbmodels
showarda5288b42009-07-28 20:06:08 +00006
7from autotest_lib.frontend import settings
8from autotest_lib.frontend.afe import model_logic, models
9
10
showard65974e12009-08-20 23:34:38 +000011class SiteAdmin(admin.ModelAdmin):
12 def formfield_for_dbfield(self, db_field, **kwargs):
13 field = super(SiteAdmin, self).formfield_for_dbfield(db_field, **kwargs)
14 if (db_field.rel and
15 issubclass(db_field.rel.to, model_logic.ModelWithInvalid)):
16 model = db_field.rel.to
17 field.choices = model.valid_objects.all().values_list(
18 'id', model.name_field)
19 return field
20
21
showard3370e752009-08-31 18:32:30 +000022class ModelWithInvalidForm(forms.ModelForm):
23 def validate_unique(self):
24 # Don't validate name uniqueness if the duplicate model is invalid
25 model = self.Meta.model
26 filter_data = {
27 model.name_field : self.cleaned_data[model.name_field],
28 'invalid' : True
29 }
30 needs_remove = bool(self.Meta.model.objects.filter(**filter_data))
31 if needs_remove:
32 name_field = self.fields.pop(model.name_field)
33 super(ModelWithInvalidForm, self).validate_unique()
34 if needs_remove:
35 self.fields[model.name_field] = name_field
36
37
38class AtomicGroupForm(ModelWithInvalidForm):
39 class Meta:
40 model = models.AtomicGroup
41
42
showard65974e12009-08-20 23:34:38 +000043class AtomicGroupAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +000044 list_display = ('name', 'description', 'max_number_of_machines')
45
showard3370e752009-08-31 18:32:30 +000046 form = AtomicGroupForm
47
showarda5288b42009-07-28 20:06:08 +000048 def queryset(self, request):
49 return models.AtomicGroup.valid_objects
50
51admin.site.register(models.AtomicGroup, AtomicGroupAdmin)
52
53
showard3370e752009-08-31 18:32:30 +000054class LabelForm(ModelWithInvalidForm):
55 class Meta:
56 model = models.Label
57
58
showard65974e12009-08-20 23:34:38 +000059class LabelAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +000060 list_display = ('name', 'kernel_config')
61
showard3370e752009-08-31 18:32:30 +000062 form = LabelForm
63
showarda5288b42009-07-28 20:06:08 +000064 def queryset(self, request):
65 return models.Label.valid_objects
66
67admin.site.register(models.Label, LabelAdmin)
68
69
showard65974e12009-08-20 23:34:38 +000070class UserAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +000071 list_display = ('login', 'access_level')
72 search_fields = ('login',)
73
74admin.site.register(models.User, UserAdmin)
75
76
showard3370e752009-08-31 18:32:30 +000077class HostForm(ModelWithInvalidForm):
78 class Meta:
79 model = models.Host
80
81
showard65974e12009-08-20 23:34:38 +000082class HostAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +000083 # TODO(showard) - showing platform requires a SQL query for
84 # each row (since labels are many-to-many) - should we remove
85 # it?
86 list_display = ('hostname', 'platform', 'locked', 'status')
87 list_filter = ('labels', 'locked', 'protection')
88 search_fields = ('hostname', 'status')
89 filter_horizontal = ('labels',)
90
showard3370e752009-08-31 18:32:30 +000091 form = HostForm
92
showarda5288b42009-07-28 20:06:08 +000093 def queryset(self, request):
94 return models.Host.valid_objects
95
96admin.site.register(models.Host, HostAdmin)
97
98
showard65974e12009-08-20 23:34:38 +000099class TestAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000100 fields = ('name', 'author', 'test_category', 'test_class',
101 'test_time', 'sync_count', 'test_type', 'path',
102 'dependencies', 'experimental', 'run_verify',
103 'description')
104 list_display = ('name', 'test_type', 'description', 'sync_count')
105 search_fields = ('name',)
106 filter_horizontal = ('dependency_labels',)
107
108admin.site.register(models.Test, TestAdmin)
109
110
showard65974e12009-08-20 23:34:38 +0000111class ProfilerAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000112 list_display = ('name', 'description')
113 search_fields = ('name',)
114
115admin.site.register(models.Profiler, ProfilerAdmin)
116
117
showard65974e12009-08-20 23:34:38 +0000118class AclGroupAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000119 list_display = ('name', 'description')
120 search_fields = ('name',)
121 filter_horizontal = ('users', 'hosts')
122
123admin.site.register(models.AclGroup, AclGroupAdmin)
124
125
126if settings.FULL_ADMIN:
showard65974e12009-08-20 23:34:38 +0000127 class JobAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000128 list_display = ('id', 'owner', 'name', 'control_type')
129 filter_horizontal = ('dependency_labels',)
130
131 admin.site.register(models.Job, JobAdmin)
132
showard3370e752009-08-31 18:32:30 +0000133
showard65974e12009-08-20 23:34:38 +0000134 class IneligibleHostQueueAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000135 list_display = ('id', 'job', 'host')
136
137 admin.site.register(models.IneligibleHostQueue, IneligibleHostQueueAdmin)
138
showard3370e752009-08-31 18:32:30 +0000139
showard65974e12009-08-20 23:34:38 +0000140 class HostQueueEntryAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000141 list_display = ('id', 'job', 'host', 'status',
142 'meta_host')
143
144 admin.site.register(models.HostQueueEntry, HostQueueEntryAdmin)
145
146 admin.site.register(models.AbortedHostQueueEntry)