blob: 4c7383728164eeb90358784623bcbe4dceab16f1 [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):
Dale Curtis74a314b2011-06-23 14:55:46 -070060 list_display = ('name', 'atomic_group', 'kernel_config')
61 # Avoid a bug with the admin interface showing a select box pointed at an
62 # AtomicGroup when this field is intentionally NULL such that editing a
63 # label via the admin UI unintentionally sets an atomicgroup.
64 raw_id_fields = ('atomic_group',)
showarda5288b42009-07-28 20:06:08 +000065
showard3370e752009-08-31 18:32:30 +000066 form = LabelForm
67
showarda5288b42009-07-28 20:06:08 +000068 def queryset(self, request):
69 return models.Label.valid_objects
70
71admin.site.register(models.Label, LabelAdmin)
72
73
showard65974e12009-08-20 23:34:38 +000074class UserAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +000075 list_display = ('login', 'access_level')
76 search_fields = ('login',)
77
78admin.site.register(models.User, UserAdmin)
79
80
showard3370e752009-08-31 18:32:30 +000081class HostForm(ModelWithInvalidForm):
82 class Meta:
83 model = models.Host
84
85
showard65974e12009-08-20 23:34:38 +000086class HostAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +000087 # TODO(showard) - showing platform requires a SQL query for
88 # each row (since labels are many-to-many) - should we remove
89 # it?
90 list_display = ('hostname', 'platform', 'locked', 'status')
91 list_filter = ('labels', 'locked', 'protection')
92 search_fields = ('hostname', 'status')
93 filter_horizontal = ('labels',)
94
showard3370e752009-08-31 18:32:30 +000095 form = HostForm
96
showarda5288b42009-07-28 20:06:08 +000097 def queryset(self, request):
98 return models.Host.valid_objects
99
100admin.site.register(models.Host, HostAdmin)
101
102
showard65974e12009-08-20 23:34:38 +0000103class TestAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000104 fields = ('name', 'author', 'test_category', 'test_class',
105 'test_time', 'sync_count', 'test_type', 'path',
106 'dependencies', 'experimental', 'run_verify',
107 'description')
jamesren35a70222010-02-16 19:30:46 +0000108 list_display = ('name', 'test_type', 'admin_description', 'sync_count')
showarda5288b42009-07-28 20:06:08 +0000109 search_fields = ('name',)
110 filter_horizontal = ('dependency_labels',)
111
112admin.site.register(models.Test, TestAdmin)
113
114
showard65974e12009-08-20 23:34:38 +0000115class ProfilerAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000116 list_display = ('name', 'description')
117 search_fields = ('name',)
118
119admin.site.register(models.Profiler, ProfilerAdmin)
120
121
showard65974e12009-08-20 23:34:38 +0000122class AclGroupAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000123 list_display = ('name', 'description')
124 search_fields = ('name',)
125 filter_horizontal = ('users', 'hosts')
126
showard8cbaf1e2009-09-08 16:27:04 +0000127 def queryset(self, request):
128 return models.AclGroup.objects.exclude(name='Everyone')
129
130 def save_model(self, request, obj, form, change):
131 super(AclGroupAdmin, self).save_model(request, obj, form, change)
132 _orig_save_m2m = form.save_m2m
133
134 def save_m2m():
135 _orig_save_m2m()
136 obj.perform_after_save(change)
137
138 form.save_m2m = save_m2m
139
showarda5288b42009-07-28 20:06:08 +0000140admin.site.register(models.AclGroup, AclGroupAdmin)
141
142
jamesren543d9fb2010-06-07 20:45:31 +0000143class DroneSetForm(forms.ModelForm):
144 def __init__(self, *args, **kwargs):
145 super(DroneSetForm, self).__init__(*args, **kwargs)
146 drone_ids_used = set()
147 for drone_set in models.DroneSet.objects.exclude(id=self.instance.id):
148 drone_ids_used.update(drone_set.drones.values_list('id', flat=True))
149 available_drones = models.Drone.objects.exclude(id__in=drone_ids_used)
150
151 self.fields['drones'].widget.choices = [(drone.id, drone.hostname)
152 for drone in available_drones]
153
154
jamesren76fcf192010-04-21 20:39:50 +0000155class DroneSetAdmin(SiteAdmin):
156 filter_horizontal = ('drones',)
jamesren543d9fb2010-06-07 20:45:31 +0000157 form = DroneSetForm
jamesren76fcf192010-04-21 20:39:50 +0000158
159admin.site.register(models.DroneSet, DroneSetAdmin)
160
161admin.site.register(models.Drone)
162
163
showarda5288b42009-07-28 20:06:08 +0000164if settings.FULL_ADMIN:
showard65974e12009-08-20 23:34:38 +0000165 class JobAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000166 list_display = ('id', 'owner', 'name', 'control_type')
167 filter_horizontal = ('dependency_labels',)
168
169 admin.site.register(models.Job, JobAdmin)
170
showard3370e752009-08-31 18:32:30 +0000171
showard65974e12009-08-20 23:34:38 +0000172 class IneligibleHostQueueAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000173 list_display = ('id', 'job', 'host')
174
175 admin.site.register(models.IneligibleHostQueue, IneligibleHostQueueAdmin)
176
showard3370e752009-08-31 18:32:30 +0000177
showard65974e12009-08-20 23:34:38 +0000178 class HostQueueEntryAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000179 list_display = ('id', 'job', 'host', 'status',
180 'meta_host')
181
182 admin.site.register(models.HostQueueEntry, HostQueueEntryAdmin)
183
184 admin.site.register(models.AbortedHostQueueEntry)