blob: b6ba64a323a317596844a7b0a1deb8c12ef675b6 [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
jamesren543d9fb2010-06-07 20:45:31 +0000139class DroneSetForm(forms.ModelForm):
140 def __init__(self, *args, **kwargs):
141 super(DroneSetForm, self).__init__(*args, **kwargs)
142 drone_ids_used = set()
143 for drone_set in models.DroneSet.objects.exclude(id=self.instance.id):
144 drone_ids_used.update(drone_set.drones.values_list('id', flat=True))
145 available_drones = models.Drone.objects.exclude(id__in=drone_ids_used)
146
147 self.fields['drones'].widget.choices = [(drone.id, drone.hostname)
148 for drone in available_drones]
149
150
jamesren76fcf192010-04-21 20:39:50 +0000151class DroneSetAdmin(SiteAdmin):
152 filter_horizontal = ('drones',)
jamesren543d9fb2010-06-07 20:45:31 +0000153 form = DroneSetForm
jamesren76fcf192010-04-21 20:39:50 +0000154
155admin.site.register(models.DroneSet, DroneSetAdmin)
156
157admin.site.register(models.Drone)
158
159
showarda5288b42009-07-28 20:06:08 +0000160if settings.FULL_ADMIN:
showard65974e12009-08-20 23:34:38 +0000161 class JobAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000162 list_display = ('id', 'owner', 'name', 'control_type')
163 filter_horizontal = ('dependency_labels',)
164
165 admin.site.register(models.Job, JobAdmin)
166
showard3370e752009-08-31 18:32:30 +0000167
showard65974e12009-08-20 23:34:38 +0000168 class IneligibleHostQueueAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000169 list_display = ('id', 'job', 'host')
170
171 admin.site.register(models.IneligibleHostQueue, IneligibleHostQueueAdmin)
172
showard3370e752009-08-31 18:32:30 +0000173
showard65974e12009-08-20 23:34:38 +0000174 class HostQueueEntryAdmin(SiteAdmin):
showarda5288b42009-07-28 20:06:08 +0000175 list_display = ('id', 'job', 'host', 'status',
176 'meta_host')
177
178 admin.site.register(models.HostQueueEntry, HostQueueEntryAdmin)
179
180 admin.site.register(models.AbortedHostQueueEntry)