Proposal implementation for handling model attachments #119
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
The idea is that we sometimes want to attach files to models, such as
HTML reports or the like, and in the backend, these files should be
stored separately, to allow easy access.
Here we're implemeting this idea for the 'FileLike' model persister
and testing it for the 'File' subclass. This should work for 'Rest'
and 'S3' as well, but I thought it's best to add tests when we all
agreed on the idea.
Usage is demonstrated in 'TestFileAttachments'. The contract is as
follows: Use 'palladium.util.annotate' to add an arbitrary number of
attachments to the model, like so:
Note that the keys of such attachments must start with 'attachments/',
with the rest indicating a filename. The values must be base64
encoded but converted from bytes to strings. This is arguably a bit
awkward, but we do this because the attachments dictionary must in
general be JSON serializable, and using bytes would violate this.
When 'model1' is persisted, 'FileLike' will create one file for each
attachment and call them 'model-1-myatt.txt' and
'model-1-my2ndatt.txt'. The implementation chooses to use flat files
rather than a folder to hold all attachments for a given model. This
is done so that we do not need to add extra methods to
'FileLikeIO' (such as mkdir), which means we should get support for
other 'FileLike' implementations such as 'Rest' and 'S3' for free.
Moreover, the attachments will be removed from the model's pickle and
from the metadata files, in order not to blow up the size of those.
When the model is loaded back through the model persister, the
attachments are loaded and put back into the model's metadata
dictionary.
What's a good time to add the attachments to the model? Use the
'write_model_decorators' pluggable decorator hook to add a decorator
that adds your attachment just before it's persisted. A toy example:
Let me know what you think. Once we've settled on the right way to do
this, we'll put this into proper docs and examples.