class RelationshipBaseTest(TestCase): def setUp(self): self.site_ct = ContentType.objects.get_for_model(Site) self.rack_ct = ContentType.objects.get_for_model(Rack) self.vlan_ct = ContentType.objects.get_for_model(VLAN) self.sites = [ Site.objects.create(name="Site A", slug="site-a"), Site.objects.create(name="Site B", slug="site-b"), Site.objects.create(name="Site C", slug="site-c"), Site.objects.create(name="Site D", slug="site-d"), Site.objects.create(name="Site E", slug="site-e"), ] self.racks = [ Rack.objects.create(name="Rack A", site=self.sites[0]), Rack.objects.create(name="Rack B", site=self.sites[1]), Rack.objects.create(name="Rack C", site=self.sites[2]), ] self.vlans = [ VLAN.objects.create(name="VLAN A", vid=100, site=self.sites[0]), VLAN.objects.create(name="VLAN B", vid=100, site=self.sites[1]), VLAN.objects.create(name="VLAN C", vid=100, site=self.sites[2]), ] self.m2m_1 = Relationship( name="Vlan to Rack", slug="vlan-rack", source_type=self.rack_ct, source_label="My Vlans", source_filter={"site": ["site-a"]}, destination_type=self.vlan_ct, destination_label="My Racks", type=RelationshipTypeChoices.TYPE_MANY_TO_MANY, ) self.m2m_1.validated_save() self.m2m_2 = Relationship( name="Another Vlan to Rack", slug="vlan-rack-2", source_type=self.rack_ct, destination_type=self.vlan_ct, type=RelationshipTypeChoices.TYPE_MANY_TO_MANY, ) self.m2m_2.validated_save() self.o2m_1 = Relationship( name="generic site to vlan", slug="site-vlan", source_type=self.site_ct, destination_type=self.vlan_ct, type=RelationshipTypeChoices.TYPE_ONE_TO_MANY, ) self.o2m_1.validated_save() self.o2o_1 = Relationship( name="Primary Rack per Site", slug="primary-rack-site", source_type=self.rack_ct, source_hidden=True, destination_type=self.site_ct, destination_label="Primary Rack", type=RelationshipTypeChoices.TYPE_ONE_TO_ONE, ) self.o2o_1.validated_save() # Relationships between objects of the same type self.o2o_2 = Relationship( name="Alphabetical Sites", slug="alphabetical-sites", source_type=self.site_ct, source_label="Alphabetically Prior", destination_type=self.site_ct, destination_label="Alphabetically Subsequent", type=RelationshipTypeChoices.TYPE_ONE_TO_ONE, ) self.o2o_2.validated_save() self.o2os_1 = Relationship( name="Redundant Rack", slug="redundant-rack", source_type=self.rack_ct, destination_type=self.rack_ct, type=RelationshipTypeChoices.TYPE_ONE_TO_ONE_SYMMETRIC, ) self.o2os_1.validated_save() self.m2ms_1 = Relationship( name="Related Sites", slug="related-sites", source_type=self.site_ct, destination_type=self.site_ct, type=RelationshipTypeChoices.TYPE_MANY_TO_MANY_SYMMETRIC, ) self.m2ms_1.validated_save()
class RelationshipBaseTest(TestCase): def setUp(self): self.site_ct = ContentType.objects.get_for_model(Site) self.rack_ct = ContentType.objects.get_for_model(Rack) self.vlan_ct = ContentType.objects.get_for_model(VLAN) self.sites = [ Site.objects.create(name="Site A", slug="site-a"), Site.objects.create(name="Site B", slug="site-b"), Site.objects.create(name="Site C", slug="site-c"), Site.objects.create(name="Site D", slug="site-d"), Site.objects.create(name="Site E", slug="site-e"), ] self.racks = [ Rack.objects.create(name="Rack A", site=self.sites[0]), Rack.objects.create(name="Rack B", site=self.sites[1]), Rack.objects.create(name="Rack C", site=self.sites[2]), ] self.vlans = [ VLAN.objects.create(name="VLAN A", vid=100, site=self.sites[0]), VLAN.objects.create(name="VLAN B", vid=100, site=self.sites[1]), VLAN.objects.create(name="VLAN C", vid=100, site=self.sites[2]), ] self.m2m_1 = Relationship( name="Vlan to Rack", slug="vlan-rack", source_type=self.rack_ct, source_label="My Vlans", source_filter={"site": ["site-a", "site-b", "site-c"]}, destination_type=self.vlan_ct, destination_label="My Racks", type=RelationshipTypeChoices.TYPE_MANY_TO_MANY, ) self.m2m_1.validated_save() self.m2m_2 = Relationship( name="Another Vlan to Rack", slug="vlan-rack-2", source_type=self.rack_ct, destination_type=self.vlan_ct, type=RelationshipTypeChoices.TYPE_MANY_TO_MANY, ) self.m2m_2.validated_save() self.o2m_1 = Relationship( name="generic site to vlan", slug="site-vlan", source_type=self.site_ct, destination_type=self.vlan_ct, type=RelationshipTypeChoices.TYPE_ONE_TO_MANY, ) self.o2m_1.validated_save() self.o2o_1 = Relationship( name="Primary Rack per Site", slug="primary-rack-site", source_type=self.rack_ct, source_hidden=True, destination_type=self.site_ct, destination_label="Primary Rack", type=RelationshipTypeChoices.TYPE_ONE_TO_ONE, ) self.o2o_1.validated_save() # Relationships between objects of the same type self.o2o_2 = Relationship( name="Alphabetical Sites", slug="alphabetical-sites", source_type=self.site_ct, source_label="Alphabetically Prior", destination_type=self.site_ct, destination_label="Alphabetically Subsequent", type=RelationshipTypeChoices.TYPE_ONE_TO_ONE, ) self.o2o_2.validated_save() self.o2os_1 = Relationship( name="Redundant Rack", slug="redundant-rack", source_type=self.rack_ct, destination_type=self.rack_ct, type=RelationshipTypeChoices.TYPE_ONE_TO_ONE_SYMMETRIC, ) self.o2os_1.validated_save() self.m2ms_1 = Relationship( name="Related Sites", slug="related-sites", source_type=self.site_ct, destination_type=self.site_ct, type=RelationshipTypeChoices.TYPE_MANY_TO_MANY_SYMMETRIC, ) self.m2ms_1.validated_save() # Relationships involving a content type that doesn't actually have a backing model. # This can occur in practice if, for example, a relationship is defined for a plugin-defined model, # then the plugin is subsequently uninstalled or deactivated. self.invalid_ct = ContentType.objects.create(app_label="nonexistent", model="nosuchmodel") # Don't use validated_save() on these as it will fail due to the invalid content-type self.invalid_relationships = [ Relationship.objects.create( name="Invalid Relationship 1", slug="invalid-relationship-1", source_type=self.site_ct, destination_type=self.invalid_ct, type=RelationshipTypeChoices.TYPE_ONE_TO_ONE, ), Relationship.objects.create( name="Invalid Relationship 2", slug="invalid-relationship-2", source_type=self.invalid_ct, destination_type=self.site_ct, type=RelationshipTypeChoices.TYPE_ONE_TO_MANY, ), Relationship.objects.create( name="Invalid Relationship 3", slug="invalid-relationship-3", source_type=self.invalid_ct, destination_type=self.invalid_ct, type=RelationshipTypeChoices.TYPE_MANY_TO_MANY_SYMMETRIC, ), ]