docs: def save(self, *args, **kwargs):
          """
          Custom save does the following:
              * determine link type if not specified
              * automatically fill 'node_a' and 'node_b' fields if necessary
              * draw line between two nodes
              * fill shortcut properties node_a_name and node_b_name
          """
          if not self.type:
              if self.interface_a.type == INTERFACE_TYPES.get('wireless'):
                  self.type = LINK_TYPES.get('radio')
              elif self.interface_a.type == INTERFACE_TYPES.get('ethernet'):
                  self.type = LINK_TYPES.get('ethernet')
              else:
                  self.type = LINK_TYPES.get('virtual')
  
          if self.interface_a_id:
              self.interface_a = Interface.objects.get(pk=self.interface_a_id)
          if self.interface_b_id:
              self.interface_b = Interface.objects.get(pk=self.interface_b_id)
  
          # fill in node_a and node_b
          if self.node_a is None and self.interface_a is not None:
              self.node_a = self.interface_a.node
          if self.node_b is None and self.interface_b is not None:
              self.node_b = self.interface_b.node
  
          # fill layer from node_a
          if self.layer is None:
              self.layer = self.node_a.layer
  
          # draw linestring
          if not self.line:
              self.line = LineString(self.node_a.point, self.node_b.point)
  
          # fill properties
          if self.data.get('node_a_name', None) is None:
              self.data['node_a_name'] = self.node_a.name
              self.data['node_b_name'] = self.node_b.name
  
          if self.data.get('node_a_slug', None) is None or self.data.get('node_b_slug', None) is None:
              self.data['node_a_slug'] = self.node_a.slug
              self.data['node_b_slug'] = self.node_b.slug
  
          if self.interface_a and self.data.get('interface_a_mac', None) is None:
              self.data['interface_a_mac'] = self.interface_a.mac
  
          if self.interface_b and self.data.get('interface_b_mac', None) is None:
              self.data['interface_b_mac'] = self.interface_b.mac
  
          if self.data.get('layer_slug') != self.layer.slug:
              self.data['layer_slug'] = self.layer.slug
  
          super(Link, self).save(*args, **kwargs)