Skip to content

Add some sort of mechanism for resolving manager for a given model type #72

Description

@pederhan

This kind of speaks for itself. It more or less re-implements the path/id resolution implemented on the managers, but does it in a very brittle and brute-forcey manner:

@classmethod
def new(cls, obj: MregModel) -> Self:
"""Create a reference to an API object.
Uses the object's endpoint to determine the ID field to use.
Cannot fail. Logs and defaults to str(obj) for value on failure.
"""
from mreg_api.models.models import CNAME
from mreg_api.models.models import Atom
from mreg_api.models.models import ForwardZone
from mreg_api.models.models import ForwardZoneDelegation
from mreg_api.models.models import HInfo
from mreg_api.models.models import Host
from mreg_api.models.models import HostGroup
from mreg_api.models.models import Location
from mreg_api.models.models import NameServer
from mreg_api.models.models import Network
from mreg_api.models.models import ReverseZone
from mreg_api.models.models import ReverseZoneDelegation
from mreg_api.models.models import Role
# TODO: refactor when we have a better way to get the external ID
# field from an object without needing the endpoint.
MODEL_FIELDS = {
"name": (
Host,
HostGroup,
CNAME,
ForwardZone,
ReverseZone,
ForwardZoneDelegation,
ReverseZoneDelegation,
Role,
Atom,
NameServer,
),
"network": (Network,),
"host": (HInfo, Location),
}
for field_name, models in MODEL_FIELDS.items():
if isinstance(obj, models):
id_value = getattr(obj, field_name)
id_field = field_name
break
else:
try:
id_value = str(obj.id) # pyright: ignore[reportAttributeAccessIssue, reportUnknownMemberType, reportUnknownArgumentType]
id_field = "id"
except AttributeError:
id_value = str(obj)
id_field = "id"
try:
return cls(type=obj.__class__.__name__, value=str(id_value), field=id_field)
except Exception:
logger.exception("Failed to instantiate ObjectRef from %s", obj)
return cls(type=obj.__class__.__name__, value=str(obj))

It also mentions using the object's endpoint, which is outdated and no longer applies.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    refactorCode restructuring without functional changes

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions