Enforce that a drone may appear in at most one drone set. Also hide drones that 
are already used from the drone set filter_horizontal widget.

Signed-off-by: James Ren <[email protected]>

--- autotest/frontend/afe/admin.py      2010-06-03 17:19:25.000000000 -0700
+++ autotest/frontend/afe/admin.py      2010-06-03 17:19:25.000000000 -0700
@@ -136,8 +136,21 @@
 admin.site.register(models.AclGroup, AclGroupAdmin)
 
 
+class DroneSetForm(forms.ModelForm):
+    def __init__(self, *args, **kwargs):
+        super(DroneSetForm, self).__init__(*args, **kwargs)
+        drone_ids_used = set()
+        for drone_set in models.DroneSet.objects.exclude(id=self.instance.id):
+            drone_ids_used.update(drone_set.drones.values_list('id', 
flat=True))
+        available_drones = models.Drone.objects.exclude(id__in=drone_ids_used)
+
+        self.fields['drones'].widget.choices = [(drone.id, drone.hostname)
+                                                for drone in available_drones]
+
+
 class DroneSetAdmin(SiteAdmin):
     filter_horizontal = ('drones',)
+    form = DroneSetForm
 
 admin.site.register(models.DroneSet, DroneSetAdmin)
 
--- /dev/null   2009-12-17 12:29:38.000000000 -0800
+++ autotest/frontend/migrations/062_drone_sets_unique.py       2010-06-03 
17:19:25.000000000 -0700
@@ -0,0 +1,40 @@
+UP_SQL = """
+CREATE INDEX afe_drone_sets_drones_droneset_ibfk
+ON afe_drone_sets_drones (droneset_id);
+
+ALTER TABLE afe_drone_sets_drones
+DROP KEY afe_drone_sets_drones_unique;
+
+ALTER TABLE afe_drone_sets_drones
+ADD CONSTRAINT afe_drone_sets_drones_unique
+UNIQUE KEY (drone_id);
+
+ALTER TABLE afe_drone_sets_drones
+DROP KEY afe_drone_sets_drones_drone_ibfk;
+"""
+
+DOWN_SQL = """
+CREATE INDEX afe_drone_sets_drones_drone_ibfk
+ON afe_drone_sets_drones (drone_id);
+
+ALTER TABLE afe_drone_sets_drones
+DROP KEY afe_drone_sets_drones_unique;
+
+ALTER TABLE afe_drone_sets_drones
+ADD CONSTRAINT afe_drone_sets_drones_unique
+UNIQUE KEY (droneset_id, drone_id);
+
+ALTER TABLE afe_drone_sets_drones
+DROP KEY afe_drone_sets_drones_droneset_ibfk;
+"""
+
+
+def migrate_up(manager):
+    query = ('SELECT * FROM afe_drone_sets_drones '
+             'GROUP BY drone_id HAVING COUNT(*) > 1')
+    rows = manager.execute(query)
+    if rows:
+      raise Exception('Some drones are associated with more than one drone '
+                      'set. Please remove all duplicates before running this '
+                      'migration.')
+    manager.execute_script(UP_SQL)
_______________________________________________
Autotest mailing list
[email protected]
http://test.kernel.org/cgi-bin/mailman/listinfo/autotest

Reply via email to