← Back to team overview

openerp-connector-community team mailing list archive

Re: Storing Images

 

Hi, after some discution with Raphael
I decide to remove the object "binary.binary"
So now the data model is simplier.

When you create the field "image_test" => 2 new fields will be added
automatically
"image_test_uid" : used for storing the uid of the image
"image_test_file_size" : used for storing the size of the image (this is
need for the compatibility with the original binary field)

Hope you will like this change


2014-05-01 11:55 GMT+02:00 Sebastien Beau <sebastien.beau@xxxxxxxxxxxx>:

> Hi all,
>
> If like me you want to store image and binary in you file system instead
> of the database this mail can interest you.
>
> Since version 6 we make some improvement in the product image module in
> order to be able to store image in the file system (
> http://bazaar.launchpad.net/~product-core-editors/openerp-product-attributes/7.0/files/head:/product_images/
> )
> But I am not satisfy by the work done (I did it) because this
> implementation only support the image of product. More over we use the
> product default code in the path for storing the image and this make
> mandatory the default code on product which do not fit with every customer.
>
> After thinking twice, I think the best solution is to introduce new type
> of field that will manage the storage for us. Indeed if we implement this
> with a field, we can use it everythere (product, category, user,
> company....)
>
> Here is my proposal:
> Adding 3 new fields:
> - BinaryField
> - ImageField
> - ImageResizeField
>
>
> An exemple of how using it will be this :
>
>
>     _columns = {
>         'binary_test': fields.BinaryField('Test Binary'),
>         'image_test': fields.ImageField('Test Image'),
>         'image_test_resize': fields.ImageResizeField(
>             related_field='image_test',
>             string='Test Image small',
>             height=64,
>              width=64,
>             ),
>     }
>
> Adding this kind of field will also create this field (on fly):
>
> - binary_test_info_id
> - image_test_info_id
> - image_test_resize_info_id
>
> Why adding this field?
> The aim is simple, I want to read the metadata of my image (path, size,
> extension...)
> For exemple, if you build an external application maybe you want to get
> the path of the image.
> In this case you just have to do "product.image_test_info_id.store_fname"
> and you get the path.
> Acceding to the image with you external application using the images
> served by nginx (or apache) is really easy.
>
> I know that "Explicit is better than implicit." but I think It will be a
> paint to add this field manually. I don't see any other solution that make
> easy (and compatible with the existing API) to access to the image content
> or to the image metadata (using the context is not a good idea because you
> may access to the content of a field and the information of an other field
> at the same time)
>
>
> I start a POC here :
> https://code.launchpad.net/~akretion-team/server-env-tools/server-env-tools
>
> How this work
>
> First the object "binary.binary"
> =================================
>
> It's just a table that store the metadata of my binary field (image, pdf,
> video...) and store the path of the binary.
>
> I try to reuse the function to create/write/delete of the "ir.attachment"
> class, because is kind of the same feature.
>
>
> Then the new fields :
> ========================
>
> BinaryField
> --------------
>
> BinaryField is a function field with a "fnct" and a "fnct_inv" already
> defined. Basically when I add a pdf in this kind of field, the "fnc_inv"
> will create (or update) the "binary.binary" and store the id of the
> "binary.binary" in the field "my_field_info_id"
>
>
> ImageField
> ---------------
> ImageField inherit of BinaryField. The only difference is that ImageField
> can have resized Image linked so this class will trigger a refresh of
> resized image
>
>
> ImageResizeField
> -----------------
> ImageResizeField inherit of ImageField. The best way to explain it is to
> give an exemple. Let's say that we have added the fields "image_test" and
> "image_test_resize" (like on the top of my email)
>
> First setting a image in "image_test"
> -------------------------------------
> If you set a image into the field "image_test" then the
> "image_test_resize" will be refresh.
> The ImageResizefield like the BinaryField create a "xxx_info_id" field.
> So in this case the resized image is stored in a "binary.binary" and the
> id of this binary is stored in "image_test_resize_info_id"
>
>
> First setting a image in "image_test_resize"
> ---------------------------------------------------
> Giving the posibility to set the image from the resize field is necessary
> (OpenERP already do that on product image).
> So if you set an image in this king of field, the image will be store in
> the ImageField related, this mean in the "image_test" and then the cache of
> the ImageResizeField will be refresh.
>
>
> If you need more details, ask me. I will push some change/fix in the
> branch so be carefull when you update the code when you test it. (creating
> a new db after pulling the code maybe the best idea)
>
>
> If you are ok with that I will propose a new version of product_image
> based on it.
>
> If you have better naming idea, share it !
>
> Thanks for your feedback.
>
>
>
>
>
>
>
>
>

References