blob: df5d9a7cff90fc3617d0f34069e001a8f215171f [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')
jamesren35a70222010-02-16 19:30:46 +0000104 list_display = ('name', 'test_type', 'admin_description', 'sync_count')
showarda5288b42009-07-28 20:06:08 +0000105 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
showard8cbaf1e2009-09-08 16:27:04 +0000123 def queryset(self, request):
124 return models.AclGroup.objects.exclude(name='Everyone')
125
126 def save_model(self, request, obj, form, change):
127 super(AclGroupAdmin, self).save_model(request, obj, form, change)
128 _orig_save_m2m = form.save_m2m
129
130 def save_m2m():
131 _orig_save_m2m()
132 obj.perform_after_save(change)
133
134 form.save_m2m = save_m2m
135
showarda5288b42009-07-28 20:06:08 +0000136admin.site.register(models.AclGroup, AclGroupAdmin)
137
138
139if settings.FULL_ADMIN:
showard65974e12009-08-20 23:34:38 +0000140 class JobAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000141 list_display = ('id', 'owner', 'name', 'control_type')
142 filter_horizontal = ('dependency_labels',)
143
144 admin.site.register(models.Job, JobAdmin)
145
showard3370e752009-08-31 18:32:30 +0000146
showard65974e12009-08-20 23:34:38 +0000147 class IneligibleHostQueueAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000148 list_display = ('id', 'job', 'host')
149
150 admin.site.register(models.IneligibleHostQueue, IneligibleHostQueueAdmin)
151
showard3370e752009-08-31 18:32:30 +0000152
showard65974e12009-08-20 23:34:38 +0000153 class HostQueueEntryAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000154 list_display = ('id', 'job', 'host', 'status',
155 'meta_host')
156
157 admin.site.register(models.HostQueueEntry, HostQueueEntryAdmin)
158
159 admin.site.register(models.AbortedHostQueueEntry)