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
