-
Notifications
You must be signed in to change notification settings - Fork 25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
#18: Allow embed=[] in methods and embed resources in response #20
#18: Allow embed=[] in methods and embed resources in response #20
Conversation
(i should note, you can also just bypass the python obj and use the dict directly like bitstream.embedded['format']['mimetype'] -- it's hard to predict with the different ways and context we use libs like this, whether the "knowledge" of how the data looks should be in the client impl, or further up in the library |
@dpk interested in your thoughts on this PR / approaches like it |
dspace_rest_client/client.py
Outdated
@@ -16,6 +16,7 @@ | |||
""" | |||
import json | |||
import logging | |||
import pprint |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This import doesn’t seem to be used
dspace_rest_client/client.py
Outdated
@@ -595,6 +596,8 @@ def get_bitstreams(self, uuid=None, bundle=None, page=0, size=20, sort=None): | |||
@param size: Size of results per page (default: 20) | |||
@return: list of python Bitstream objects | |||
""" | |||
if embeds is None: | |||
embeds = [] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is there any reason not to request the format by default? It seems a very weird default of DSpace not to include this information to begin with, but there might be a reason for it. (E.g. if the format embed can be very large, but this doesn’t seem to be the case.)
We could leave the option to pass embeds=[]
explicitly if this is useful (for performance? I’m really struggling to understand why it is useful to know about the name of a file, the size of a file, the MD5 hash of a file, but not the format of a file 🤔)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fair question - it comes down to DSpace modelling.. a bitstream format is itself an addressable object in the database and might need to be accessed or inspected outside the context of a bitstream or file (e.g. managing supported formats and their descriptions, known extensions, etc). So it's a separate resource, and is linked from a bitstream (as well as other places). You're right that it's usually embedded in the UI requests since... why wouldn't you want it.
And the idea of linked resources (where you can either follow the HAL link or ask for the resource to be embedded in the original request in advance) does give either option.
All good questions! With regards to how the backend resources look and work, we can question and change those in the scope of those projects (DSpace/DSpace, DSpace/RestContract, dspace-angular), but for this library I've been simply trying to work with how the REST API does work in practice, and try to play nice with the HAL paradigm
This feature should also be added to |
…t in response _embedded in HALResource new BitstreamFormat model get_bitstreams takes e.g. (embeds=['format'])
optional list of resources to embed instead of just link
27b9444
to
88e0ec5
Compare
@alanorth @dpk now most get, create, update (any method that ultimately returns a DSpace Object or list of DSpace Objects) can take an for the search objects methods, the |
I wonder how plausible it would be to auto-detect object types and wrap them in the correct model object class (for embeds and possibly also dso search) |
@dpk yes, we could also cut down on a lot of duplicate code with better object/type detection in DSO methods (you can see where I am able to do some things with e.g. |
>>> c.search_objects('lily', embeds=['bundle'])[0].embedded
{}
>>> c.search_objects('lily', embeds=['bundles'])[0].embedded
{'bundles': {'_embedded': {'bundles': [...]}}} Would there be any way to raise an error if someone gives an embedding that doesn’t exist? Otherwise looks good |
A list of valid links/embeds could be included in our models... they're not actually super-clearly documented outside of code but the models in both the java and angular give a list of linked resources.. |
Eh, I think it’s fine as it is. I’ll make an issue to consider doing that as a future improvement. |
@alanorth This is one way of fixing #18 -- I am interested to hear if you think it's the right approach.
We can request linked HAL stuff to be embedded in the parent object using
?embed=...
in the REST API call. So this change allows a client to saybitstreams = d.get_bitstreams(bundle=my_bundle, embeds=['format'])
, and then in the resulting Bitstream objects you can get format out likeformat = BitstreamFormat(bitstream.embedded['format'])
without any additional API calls.The only thing I wasn't sure about is if we should handle that in the client lib instead of making the actual client do it... this way keeps things relatively simple in the library, we don't have to know anything in the bitstream model because it'll just copy all _embedded JSON into a dict. If we wanted to make that model more 'smart' we'd tell it what kind of embeds to expect, and we could parse and instantiate the BitstreamFormat objects before handing back in the get_bitstreams() return value.
Here is my example script to test it out: