Skip to content

Commit

Permalink
resources: implement resources using new Container model
Browse files Browse the repository at this point in the history
The first cut will not find the next closes matching Resource for object class yet, it just falls back to Resource for now:

   RESOURCES.get(model.get_object_class(), Resource)

The next version can fix this properly. It needs to go through the list of object classes until it finds one that matches.
  • Loading branch information
robvdl committed Mar 13, 2024
1 parent 484b42b commit 6eb0a4f
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 13 deletions.
1 change: 1 addition & 0 deletions src/sambal/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,5 +18,6 @@
config.add_request_method(get_samdb, "samdb", property=True, reify=True)
config.add_request_method(login, "login")
config.add_request_method(logout, "logout")
config.scan("sambal.resources")
config.scan("sambal.views")
app = config.make_wsgi_app()
14 changes: 13 additions & 1 deletion src/sambal/resources/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,17 @@
from .computer import ComputerResource
from .container import ContainerResource
from .gmsa import GroupManagedServiceAccountResource
from .group import GroupResource
from .resource import Resource
from .root import RootFactory
from .user import UserResource

__all__ = ("Resource", "RootFactory", "UserResource")
__all__ = (
"ComputerResource",
"ContainerResource",
"GroupResource",
"GroupManagedServiceAccountResource",
"Resource",
"RootFactory",
"UserResource",
)
7 changes: 7 additions & 0 deletions src/sambal/resources/computer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from samba.domain.models import Computer

from .resource import Resource


class ComputerResource(Resource):
model = Computer
24 changes: 24 additions & 0 deletions src/sambal/resources/container.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from ldb import SCOPE_ONELEVEL
from samba.domain.models import Container

from .resource import Resource


class ContainerResource(Resource):
model = Container

def __init__(self, request, container):
super().__init__(request, container)

if request.samdb:
queryset = self.model.query(
request.samdb,
base_dn=container.dn,
scope=SCOPE_ONELEVEL,
polymorphic=True,
)

for obj in queryset:
if obj:
resource_class = self.resource_for_model(obj)
self[obj.name] = resource_class(request, obj)
7 changes: 7 additions & 0 deletions src/sambal/resources/gmsa.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from samba.domain.models import GroupManagedServiceAccount

from .resource import Resource


class GroupManagedServiceAccountResource(Resource):
model = GroupManagedServiceAccount
7 changes: 7 additions & 0 deletions src/sambal/resources/group.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
from samba.domain.models import Group

from .resource import Resource


class GroupResource(Resource):
model = Group
23 changes: 16 additions & 7 deletions src/sambal/resources/resource.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,23 @@
from samba.domain.models import Model

# A lookup table object_class to Resource.
RESOURCES = {}

class Resource(dict):

class ResourceMeta(type):
def __new__(mcls, name, bases, namespace, **kwargs):
cls = super().__new__(mcls, name, bases, namespace, **kwargs)
RESOURCES[cls.model.get_object_class()] = cls
return cls


class Resource(dict, metaclass=ResourceMeta):
model = Model

def __init__(self, request, obj):
if request.samdb:
qs = self.model.query(request.samdb, base_dn=obj.dn, scope=SCOPE_ONELEVEL)
data = {model.name: model.as_dict() for model in qs if model}
else:
data = {}
super().__init__()
self.update(obj.as_dict())

super().__init__(**data)
@staticmethod
def resource_for_model(model):
return RESOURCES.get(model.get_object_class(), Resource)
13 changes: 8 additions & 5 deletions src/sambal/resources/root.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,17 @@ class RootFactory(dict):
model = Model

def __init__(self, request):
super().__init__()

if request.samdb:
qs = self.model.query(
queryset = self.model.query(
request.samdb,
base_dn=request.samdb.get_root_basedn(),
scope=SCOPE_ONELEVEL,
polymorphic=True,
)
data = {obj.name: Resource(request, obj) for obj in qs if obj}
else:
data = {}

super().__init__(**data)
for obj in queryset:
if obj:
resource_class = Resource.resource_for_model(obj)
self[obj.name] = resource_class(request, obj)

0 comments on commit 6eb0a4f

Please sign in to comment.