From 444899c4025f632af2ea3b371248578118a6478c Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (ACSONE)" Date: Tue, 5 Sep 2023 15:32:11 +0200 Subject: [PATCH 01/38] [ADD] fs_product_multi_image: a drop-in replacement of storage_image_product --- fs_base_multi_image/README.rst | 35 ++++++ fs_base_multi_image/__init__.py | 1 + fs_base_multi_image/__manifest__.py | 24 +++++ fs_base_multi_image/models/__init__.py | 2 + fs_base_multi_image/models/fs_image.py | 29 +++++ .../models/fs_image_relation_mixin.py | 101 ++++++++++++++++++ fs_base_multi_image/readme/CONTRIBUTORS.rst | 1 + fs_base_multi_image/readme/DESCRIPTION.rst | 14 +++ fs_base_multi_image/readme/ROADMAP.rst | 2 + fs_base_multi_image/readme/USAGE.rst | 3 + fs_base_multi_image/security/fs_image.xml | 26 +++++ fs_base_multi_image/security/res_groups.xml | 10 ++ .../static/description/icon.png | Bin 0 -> 9455 bytes fs_base_multi_image/views/fs_image.xml | 77 +++++++++++++ .../views/fs_image_relation_mixin.xml | 42 ++++++++ 15 files changed, 367 insertions(+) create mode 100644 fs_base_multi_image/README.rst create mode 100644 fs_base_multi_image/__init__.py create mode 100644 fs_base_multi_image/__manifest__.py create mode 100644 fs_base_multi_image/models/__init__.py create mode 100644 fs_base_multi_image/models/fs_image.py create mode 100644 fs_base_multi_image/models/fs_image_relation_mixin.py create mode 100644 fs_base_multi_image/readme/CONTRIBUTORS.rst create mode 100644 fs_base_multi_image/readme/DESCRIPTION.rst create mode 100644 fs_base_multi_image/readme/ROADMAP.rst create mode 100644 fs_base_multi_image/readme/USAGE.rst create mode 100644 fs_base_multi_image/security/fs_image.xml create mode 100644 fs_base_multi_image/security/res_groups.xml create mode 100644 fs_base_multi_image/static/description/icon.png create mode 100644 fs_base_multi_image/views/fs_image.xml create mode 100644 fs_base_multi_image/views/fs_image_relation_mixin.xml diff --git a/fs_base_multi_image/README.rst b/fs_base_multi_image/README.rst new file mode 100644 index 0000000000..38929e8775 --- /dev/null +++ b/fs_base_multi_image/README.rst @@ -0,0 +1,35 @@ +**This file is going to be generated by oca-gen-addon-readme.** + +*Manual changes will be overwritten.* + +Please provide content in the ``readme`` directory: + +* **DESCRIPTION.rst** (required) +* INSTALL.rst (optional) +* CONFIGURE.rst (optional) +* **USAGE.rst** (optional, highly recommended) +* DEVELOP.rst (optional) +* ROADMAP.rst (optional) +* HISTORY.rst (optional, recommended) +* **CONTRIBUTORS.rst** (optional, highly recommended) +* CREDITS.rst (optional) + +Content of this README will also be drawn from the addon manifest, +from keys such as name, authors, maintainers, development_status, +and license. + +A good, one sentence summary in the manifest is also highly recommended. + + +Automatic changelog generation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +`HISTORY.rst` can be auto generated using `towncrier `_. + +Just put towncrier compatible changelog fragments into `readme/newsfragments` +and the changelog file will be automatically generated and updated when a new fragment is added. + +Please refer to `towncrier` documentation to know more. + +NOTE: the changelog will be automatically generated when using `/ocabot merge $option`. +If you need to run it manually, refer to `OCA/maintainer-tools README `_. diff --git a/fs_base_multi_image/__init__.py b/fs_base_multi_image/__init__.py new file mode 100644 index 0000000000..0650744f6b --- /dev/null +++ b/fs_base_multi_image/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/fs_base_multi_image/__manifest__.py b/fs_base_multi_image/__manifest__.py new file mode 100644 index 0000000000..14a8b2686e --- /dev/null +++ b/fs_base_multi_image/__manifest__.py @@ -0,0 +1,24 @@ +# Copyright 2023 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Fs Base Multi Image", + "summary": """ + Mulitple Images from External File System""", + "version": "16.0.1.0.0", + "license": "AGPL-3", + "author": "ACSONE SA/NV,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/storage", + "depends": [ + "fs_image", + ], + "data": [ + "security/res_groups.xml", + "security/fs_image.xml", + "views/fs_image.xml", + "views/fs_image_relation_mixin.xml", + ], + "demo": [], + "maintainers": ["lmignon"], + "development_status": "Alpha", +} diff --git a/fs_base_multi_image/models/__init__.py b/fs_base_multi_image/models/__init__.py new file mode 100644 index 0000000000..bada9ccdd2 --- /dev/null +++ b/fs_base_multi_image/models/__init__.py @@ -0,0 +1,2 @@ +from . import fs_image +from . import fs_image_relation_mixin diff --git a/fs_base_multi_image/models/fs_image.py b/fs_base_multi_image/models/fs_image.py new file mode 100644 index 0000000000..285995ae26 --- /dev/null +++ b/fs_base_multi_image/models/fs_image.py @@ -0,0 +1,29 @@ +# Copyright 2023 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + +from odoo.addons.fs_image import fields as fs_fields + + +class FsImage(models.Model): + + _name = "fs.image" + _inherit = "fs.image.mixin" + _description = "Image" + _order = "name, id" + _rec_name = "name" + + image = fs_fields.FSImage(required=True) # makes field required + name = fields.Char(compute="_compute_name", store=True, index=True) + mimetype = fields.Char(compute="_compute_mimetype", store=True) + + @api.depends("image") + def _compute_name(self): + for record in self: + record.name = record.image.name if record.image else None + + @api.depends("image") + def _compute_mimetypes(self): + for record in self: + record.mimetype = record.image.mimetype if record.image else None diff --git a/fs_base_multi_image/models/fs_image_relation_mixin.py b/fs_base_multi_image/models/fs_image_relation_mixin.py new file mode 100644 index 0000000000..93181752c9 --- /dev/null +++ b/fs_base_multi_image/models/fs_image_relation_mixin.py @@ -0,0 +1,101 @@ +# Copyright 2023 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + +from odoo.addons.fs_image import fields as fs_fields + + +class FsImageRelationMixin(models.AbstractModel): + + _name = "fs.image.relation.mixin" + _description = "Image Relation" + _order = "sequence, name" + _rec_name = "name" + + sequence = fields.Integer() + image_id = fields.Many2one( + comodel_name="fs.image", + string="Linked image", + ) + specific_image = fs_fields.FSImage("Specific Image") + # resized fields stored (as attachment) for performance + specific_image_medium = fs_fields.FSImage( + "Specific Image 128", + related="specific_image", + max_width=128, + max_height=128, + store=True, + ) + link_existing = fields.Boolean(default=False) + + image = fs_fields.FSImage( + "Image", compute="_compute_image", inverse="_inverse_image", store=False + ) + # resized fields stored (as attachment) for performance + image_medium = fs_fields.FSImage( + "Image 128", compute="_compute_image_medium", store=False + ) + + name = fields.Char(compute="_compute_name", store=True, index=True) + mimetype = fields.Char(compute="_compute_mimetype", store=True) + + @api.constrains("specific_image", "image_id") + def _check_image(self): + for record in self: + if not record.image_id and not record.specific_image: + raise ValidationError(_("You must set an image")) + + @api.depends("image") + def _compute_name(self): + for record in self: + record.name = record.image.name if record.image else None + + @api.depends("image") + def _compute_mimetypes(self): + for record in self: + record.mimetype = record.image.mimetype if record.image else None + + @api.depends("image_id", "specific_image", "link_existing") + def _compute_image(self): + for record in self: + if record.link_existing: + record.image = record.image_id.image + else: + record.image = record.specific_image + + @api.depends("image_id", "specific_image", "link_existing") + def _compute_image_medium(self): + for record in self: + if record.link_existing: + record.image_medium = record.image_id.image_medium + else: + record.image_medium = record.specific_image_medium + + def _inverse_image(self): + for record in self: + if record.link_existing: + raise ValueError(_("Cannot set image on a linked image")) + else: + record.specific_image = record.image + + @api.model + def _cleanup_vals(self, vals): + if ( + "link_existing" in vals + and vals["link_existing"] + and "specific_image" in vals + ): + vals["specific_image"] = False + return vals + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + self._cleanup_vals(vals) + return super().create(vals_list) + + def write(self, vals): + self._cleanup_vals(vals) + return super().write(vals) diff --git a/fs_base_multi_image/readme/CONTRIBUTORS.rst b/fs_base_multi_image/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..172b2d223c --- /dev/null +++ b/fs_base_multi_image/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Laurent Mignon diff --git a/fs_base_multi_image/readme/DESCRIPTION.rst b/fs_base_multi_image/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..3690804632 --- /dev/null +++ b/fs_base_multi_image/readme/DESCRIPTION.rst @@ -0,0 +1,14 @@ +This addon is a technical addon providing a set of models to ease the +creation of other models that need to be linked to multiple images stored +into external filesystems. + +The models provided by this addon are: + +* ``fs.image``: a model that stores a reference to an image stored into + an external filesystem. +* ``fs.image.relation.mixin``: an abstract model that can be used to + as base class for models created to store an image linked to a model. + This abstract model defines fields and methods to transparently handle + 2 cases: + * the image is specific to the model. + * the image is shared between multiple models and therefore is a ``fs.image`` instance linked to the mixin. diff --git a/fs_base_multi_image/readme/ROADMAP.rst b/fs_base_multi_image/readme/ROADMAP.rst new file mode 100644 index 0000000000..776f992b58 --- /dev/null +++ b/fs_base_multi_image/readme/ROADMAP.rst @@ -0,0 +1,2 @@ +* Add dedicated widget to ease the addition of new images to a model linked to + multiple images. (As it's the case in the *storage_image_product* addon) diff --git a/fs_base_multi_image/readme/USAGE.rst b/fs_base_multi_image/readme/USAGE.rst new file mode 100644 index 0000000000..7a4d226aa3 --- /dev/null +++ b/fs_base_multi_image/readme/USAGE.rst @@ -0,0 +1,3 @@ +To be able to create and or manages shared images, you must have the ``Image Manager`` +role. If you do not have this role, as an authenticated user, you can +only view the shared images. diff --git a/fs_base_multi_image/security/fs_image.xml b/fs_base_multi_image/security/fs_image.xml new file mode 100644 index 0000000000..b976e34f28 --- /dev/null +++ b/fs_base_multi_image/security/fs_image.xml @@ -0,0 +1,26 @@ + + + + + + fs.image access read + + + + + + + + + + fs.image access manage + + + + + + + + + diff --git a/fs_base_multi_image/security/res_groups.xml b/fs_base_multi_image/security/res_groups.xml new file mode 100644 index 0000000000..0986498120 --- /dev/null +++ b/fs_base_multi_image/security/res_groups.xml @@ -0,0 +1,10 @@ + + + + Image Manager + + + diff --git a/fs_base_multi_image/static/description/icon.png b/fs_base_multi_image/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/fs_base_multi_image/views/fs_image.xml b/fs_base_multi_image/views/fs_image.xml new file mode 100644 index 0000000000..26347cbab9 --- /dev/null +++ b/fs_base_multi_image/views/fs_image.xml @@ -0,0 +1,77 @@ + + + + + + fs.image.form (in fs_base_multi_image) + fs.image + +
+ + +
+
+
+ + + fs.image.search (in fs_base_multi_image) + fs.image + + + + + + + + + + + + + + + fs.image.tree (in fs_base_multi_image) + fs.image + + + + + + + + + + + Fs Image + fs.image + tree,form + [] + {} + + + + Fs Images + + + + +
diff --git a/fs_base_multi_image/views/fs_image_relation_mixin.xml b/fs_base_multi_image/views/fs_image_relation_mixin.xml new file mode 100644 index 0000000000..27bc8f3a3c --- /dev/null +++ b/fs_base_multi_image/views/fs_image_relation_mixin.xml @@ -0,0 +1,42 @@ + + + + + + fs.image.relation.mixin.form + fs.image.relation.mixin + +
+ + + + + + + + + + + + + +
+
+
+ +
From 79d4352d7cb1aead30bdd9fcd0849238a5193339 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Sun, 24 Sep 2023 07:58:36 +0000 Subject: [PATCH 02/38] [UPD] Update fs_base_multi_image.pot --- .../i18n/fs_base_multi_image.pot | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 fs_base_multi_image/i18n/fs_base_multi_image.pot diff --git a/fs_base_multi_image/i18n/fs_base_multi_image.pot b/fs_base_multi_image/i18n/fs_base_multi_image.pot new file mode 100644 index 0000000000..d06f36f828 --- /dev/null +++ b/fs_base_multi_image/i18n/fs_base_multi_image.pot @@ -0,0 +1,149 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fs_base_multi_image +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: fs_base_multi_image +#. odoo-python +#: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 +#, python-format +msgid "Cannot set image on a linked image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_uid +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Created by" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_date +msgid "Created on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__display_name +msgid "Display Name" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.actions.act_window,name:fs_base_multi_image.fs_image_act_window +msgid "Fs Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.ui.menu,name:fs_base_multi_image.fs_image_menu +msgid "Fs Images" +msgstr "" + +#. module: fs_base_multi_image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Group By" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__id +msgid "ID" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model,name:fs_base_multi_image.model_fs_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image +msgid "Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium +msgid "Image 128" +msgstr "" + +#. module: fs_base_multi_image +#: model:res.groups,name:fs_base_multi_image.group_image_manager +msgid "Image Manager" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model,name:fs_base_multi_image.model_fs_image_relation_mixin +msgid "Image Relation" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image_medium +msgid "Image medium" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image____last_update +msgid "Last Modified on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_date +msgid "Last Updated on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__link_existing +msgid "Link Existing" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_id +msgid "Linked image" +msgstr "" + +#. module: fs_base_multi_image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "MimeType" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__mimetype +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__mimetype +msgid "Mimetype" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__name +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__name +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Name" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence +msgid "Sequence" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image +msgid "Specific Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium +msgid "Specific Image 128" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-python +#: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 +#, python-format +msgid "You must set an image" +msgstr "" From e51ad39240f44a29e11c8195863b28113f17ac42 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Sun, 24 Sep 2023 08:01:25 +0000 Subject: [PATCH 03/38] [BOT] post-merge updates --- fs_base_multi_image/README.rst | 128 ++++- .../static/description/index.html | 457 ++++++++++++++++++ 2 files changed, 561 insertions(+), 24 deletions(-) create mode 100644 fs_base_multi_image/static/description/index.html diff --git a/fs_base_multi_image/README.rst b/fs_base_multi_image/README.rst index 38929e8775..57e77f4fd3 100644 --- a/fs_base_multi_image/README.rst +++ b/fs_base_multi_image/README.rst @@ -1,35 +1,115 @@ -**This file is going to be generated by oca-gen-addon-readme.** +=================== +Fs Base Multi Image +=================== -*Manual changes will be overwritten.* +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:80a77aa6ae71d6e160791b2da2f73d7cca6448d2280ed954e40897401e9f3a9e + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -Please provide content in the ``readme`` directory: +.. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png + :target: https://odoo-community.org/page/development-status + :alt: Alpha +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstorage-lightgray.png?logo=github + :target: https://github.com/OCA/storage/tree/16.0/fs_base_multi_image + :alt: OCA/storage +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-fs_base_multi_image + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/storage&target_branch=16.0 + :alt: Try me on Runboat -* **DESCRIPTION.rst** (required) -* INSTALL.rst (optional) -* CONFIGURE.rst (optional) -* **USAGE.rst** (optional, highly recommended) -* DEVELOP.rst (optional) -* ROADMAP.rst (optional) -* HISTORY.rst (optional, recommended) -* **CONTRIBUTORS.rst** (optional, highly recommended) -* CREDITS.rst (optional) +|badge1| |badge2| |badge3| |badge4| |badge5| -Content of this README will also be drawn from the addon manifest, -from keys such as name, authors, maintainers, development_status, -and license. +This addon is a technical addon providing a set of models to ease the +creation of other models that need to be linked to multiple images stored +into external filesystems. -A good, one sentence summary in the manifest is also highly recommended. +The models provided by this addon are: +* ``fs.image``: a model that stores a reference to an image stored into + an external filesystem. +* ``fs.image.relation.mixin``: an abstract model that can be used to + as base class for models created to store an image linked to a model. + This abstract model defines fields and methods to transparently handle + 2 cases: + * the image is specific to the model. + * the image is shared between multiple models and therefore is a ``fs.image`` instance linked to the mixin. -Automatic changelog generation -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. IMPORTANT:: + This is an alpha version, the data model and design can change at any time without warning. + Only for development or testing purpose, do not use in production. + `More details on development status `_ -`HISTORY.rst` can be auto generated using `towncrier `_. +**Table of contents** -Just put towncrier compatible changelog fragments into `readme/newsfragments` -and the changelog file will be automatically generated and updated when a new fragment is added. +.. contents:: + :local: -Please refer to `towncrier` documentation to know more. +Usage +===== -NOTE: the changelog will be automatically generated when using `/ocabot merge $option`. -If you need to run it manually, refer to `OCA/maintainer-tools README `_. +To be able to create and or manages shared images, you must have the ``Image Manager`` +role. If you do not have this role, as an authenticated user, you can +only view the shared images. + +Known issues / Roadmap +====================== + +* Add dedicated widget to ease the addition of new images to a model linked to + multiple images. (As it's the case in the *storage_image_product* addon) + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* ACSONE SA/NV + +Contributors +~~~~~~~~~~~~ + +* Laurent Mignon + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-lmignon| image:: https://github.com/lmignon.png?size=40px + :target: https://github.com/lmignon + :alt: lmignon + +Current `maintainer `__: + +|maintainer-lmignon| + +This module is part of the `OCA/storage `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fs_base_multi_image/static/description/index.html b/fs_base_multi_image/static/description/index.html new file mode 100644 index 0000000000..ef16a1800c --- /dev/null +++ b/fs_base_multi_image/static/description/index.html @@ -0,0 +1,457 @@ + + + + + + +Fs Base Multi Image + + + +
+

Fs Base Multi Image

+ + +

Alpha License: AGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

+

This addon is a technical addon providing a set of models to ease the +creation of other models that need to be linked to multiple images stored +into external filesystems.

+

The models provided by this addon are:

+
    +
  • fs.image: a model that stores a reference to an image stored into +an external filesystem.
  • +
  • fs.image.relation.mixin: an abstract model that can be used to +as base class for models created to store an image linked to a model. +This abstract model defines fields and methods to transparently handle +2 cases: +* the image is specific to the model. +* the image is shared between multiple models and therefore is a fs.image instance linked to the mixin.
  • +
+
+

Important

+

This is an alpha version, the data model and design can change at any time without warning. +Only for development or testing purpose, do not use in production. +More details on development status

+
+

Table of contents

+ +
+

Usage

+

To be able to create and or manages shared images, you must have the Image Manager +role. If you do not have this role, as an authenticated user, you can +only view the shared images.

+
+
+

Known issues / Roadmap

+
    +
  • Add dedicated widget to ease the addition of new images to a model linked to +multiple images. (As it’s the case in the storage_image_product addon)
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us to smash it by providing a detailed and welcomed +feedback.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

lmignon

+

This module is part of the OCA/storage project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + From b921ed498c64bed25a9988fdcff59db1faeb6424 Mon Sep 17 00:00:00 2001 From: Ivorra78 Date: Fri, 27 Oct 2023 12:54:39 +0000 Subject: [PATCH 04/38] Added translation using Weblate (Spanish) --- fs_base_multi_image/i18n/es.po | 150 +++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 fs_base_multi_image/i18n/es.po diff --git a/fs_base_multi_image/i18n/es.po b/fs_base_multi_image/i18n/es.po new file mode 100644 index 0000000000..f252c95b63 --- /dev/null +++ b/fs_base_multi_image/i18n/es.po @@ -0,0 +1,150 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fs_base_multi_image +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: fs_base_multi_image +#. odoo-python +#: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 +#, python-format +msgid "Cannot set image on a linked image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_uid +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Created by" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_date +msgid "Created on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__display_name +msgid "Display Name" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.actions.act_window,name:fs_base_multi_image.fs_image_act_window +msgid "Fs Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.ui.menu,name:fs_base_multi_image.fs_image_menu +msgid "Fs Images" +msgstr "" + +#. module: fs_base_multi_image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Group By" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__id +msgid "ID" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model,name:fs_base_multi_image.model_fs_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image +msgid "Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium +msgid "Image 128" +msgstr "" + +#. module: fs_base_multi_image +#: model:res.groups,name:fs_base_multi_image.group_image_manager +msgid "Image Manager" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model,name:fs_base_multi_image.model_fs_image_relation_mixin +msgid "Image Relation" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image_medium +msgid "Image medium" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image____last_update +msgid "Last Modified on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_date +msgid "Last Updated on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__link_existing +msgid "Link Existing" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_id +msgid "Linked image" +msgstr "" + +#. module: fs_base_multi_image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "MimeType" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__mimetype +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__mimetype +msgid "Mimetype" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__name +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__name +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Name" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence +msgid "Sequence" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image +msgid "Specific Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium +msgid "Specific Image 128" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-python +#: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 +#, python-format +msgid "You must set an image" +msgstr "" From 977e21209055df8aa1dfedb13b290a513a4b0f1a Mon Sep 17 00:00:00 2001 From: Ivorra78 Date: Fri, 27 Oct 2023 12:55:29 +0000 Subject: [PATCH 05/38] Translated using Weblate (Spanish) Currently translated at 100.0% (25 of 25 strings) Translation: storage-16.0/storage-16.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-fs_base_multi_image/es/ --- fs_base_multi_image/i18n/es.po | 54 ++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/fs_base_multi_image/i18n/es.po b/fs_base_multi_image/i18n/es.po index f252c95b63..a81719afb3 100644 --- a/fs_base_multi_image/i18n/es.po +++ b/fs_base_multi_image/i18n/es.po @@ -6,145 +6,147 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2023-10-29 00:15+0000\n" +"Last-Translator: Ivorra78 \n" "Language-Team: none\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" #. module: fs_base_multi_image #. odoo-python #: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 #, python-format msgid "Cannot set image on a linked image" -msgstr "" +msgstr "No se puede establecer la imagen en una imagen vinculada" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_uid #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view msgid "Created by" -msgstr "" +msgstr "Creado por" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_date msgid "Created on" -msgstr "" +msgstr "Creado el" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__display_name msgid "Display Name" -msgstr "" +msgstr "Mostrar Nombre" #. module: fs_base_multi_image #: model:ir.actions.act_window,name:fs_base_multi_image.fs_image_act_window msgid "Fs Image" -msgstr "" +msgstr "Imagen Fs" #. module: fs_base_multi_image #: model:ir.ui.menu,name:fs_base_multi_image.fs_image_menu msgid "Fs Images" -msgstr "" +msgstr "Imágenes Fs" #. module: fs_base_multi_image #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view msgid "Group By" -msgstr "" +msgstr "Agrupar por" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__id msgid "ID" -msgstr "" +msgstr "ID (identificación)" #. module: fs_base_multi_image #: model:ir.model,name:fs_base_multi_image.model_fs_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image msgid "Image" -msgstr "" +msgstr "Imagen" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium msgid "Image 128" -msgstr "" +msgstr "Imagen 128" #. module: fs_base_multi_image #: model:res.groups,name:fs_base_multi_image.group_image_manager msgid "Image Manager" -msgstr "" +msgstr "Administrador de Imágenes" #. module: fs_base_multi_image #: model:ir.model,name:fs_base_multi_image.model_fs_image_relation_mixin msgid "Image Relation" -msgstr "" +msgstr "Relación de Imágenes" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image_medium msgid "Image medium" -msgstr "" +msgstr "Imagen mediana" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image____last_update msgid "Last Modified on" -msgstr "" +msgstr "Última Modificación el" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_uid msgid "Last Updated by" -msgstr "" +msgstr "Última Actualización por" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_date msgid "Last Updated on" -msgstr "" +msgstr "Última Actualización el" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__link_existing msgid "Link Existing" -msgstr "" +msgstr "Enlace Existente" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_id msgid "Linked image" -msgstr "" +msgstr "Imagen vinculada" #. module: fs_base_multi_image #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view msgid "MimeType" -msgstr "" +msgstr "Tipo Mimo" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__mimetype #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__mimetype msgid "Mimetype" -msgstr "" +msgstr "Tipo Mimo" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__name #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__name #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view msgid "Name" -msgstr "" +msgstr "Nombre" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence msgid "Sequence" -msgstr "" +msgstr "Secuencia" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image msgid "Specific Image" -msgstr "" +msgstr "Imagen Específica" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium msgid "Specific Image 128" -msgstr "" +msgstr "Imagen Específica 128" #. module: fs_base_multi_image #. odoo-python #: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 #, python-format msgid "You must set an image" -msgstr "" +msgstr "Usted debe establecer una imagen" From d5f050e14f739c93803e13ce611a0ca386f55cc2 Mon Sep 17 00:00:00 2001 From: mymage Date: Mon, 27 Nov 2023 16:46:59 +0000 Subject: [PATCH 06/38] Added translation using Weblate (Italian) --- fs_base_multi_image/i18n/it.po | 150 +++++++++++++++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 fs_base_multi_image/i18n/it.po diff --git a/fs_base_multi_image/i18n/it.po b/fs_base_multi_image/i18n/it.po new file mode 100644 index 0000000000..12e28abd74 --- /dev/null +++ b/fs_base_multi_image/i18n/it.po @@ -0,0 +1,150 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fs_base_multi_image +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#. module: fs_base_multi_image +#. odoo-python +#: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 +#, python-format +msgid "Cannot set image on a linked image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_uid +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Created by" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_date +msgid "Created on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__display_name +msgid "Display Name" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.actions.act_window,name:fs_base_multi_image.fs_image_act_window +msgid "Fs Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.ui.menu,name:fs_base_multi_image.fs_image_menu +msgid "Fs Images" +msgstr "" + +#. module: fs_base_multi_image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Group By" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__id +msgid "ID" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model,name:fs_base_multi_image.model_fs_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image +msgid "Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium +msgid "Image 128" +msgstr "" + +#. module: fs_base_multi_image +#: model:res.groups,name:fs_base_multi_image.group_image_manager +msgid "Image Manager" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model,name:fs_base_multi_image.model_fs_image_relation_mixin +msgid "Image Relation" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image_medium +msgid "Image medium" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image____last_update +msgid "Last Modified on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_date +msgid "Last Updated on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__link_existing +msgid "Link Existing" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_id +msgid "Linked image" +msgstr "" + +#. module: fs_base_multi_image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "MimeType" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__mimetype +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__mimetype +msgid "Mimetype" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__name +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__name +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Name" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence +msgid "Sequence" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image +msgid "Specific Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium +msgid "Specific Image 128" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-python +#: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 +#, python-format +msgid "You must set an image" +msgstr "" From 610f2fa5f9ab1dc9d7de019250579f0c0fe4a7a4 Mon Sep 17 00:00:00 2001 From: mymage Date: Tue, 28 Nov 2023 12:15:07 +0000 Subject: [PATCH 07/38] Translated using Weblate (Italian) Currently translated at 100.0% (25 of 25 strings) Translation: storage-16.0/storage-16.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-fs_base_multi_image/it/ --- fs_base_multi_image/i18n/it.po | 54 ++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 26 deletions(-) diff --git a/fs_base_multi_image/i18n/it.po b/fs_base_multi_image/i18n/it.po index 12e28abd74..9cbebf8df0 100644 --- a/fs_base_multi_image/i18n/it.po +++ b/fs_base_multi_image/i18n/it.po @@ -6,145 +6,147 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2023-11-28 14:33+0000\n" +"Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.17\n" #. module: fs_base_multi_image #. odoo-python #: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 #, python-format msgid "Cannot set image on a linked image" -msgstr "" +msgstr "Non si può impostare una immagin in una immagine collegata" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_uid #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view msgid "Created by" -msgstr "" +msgstr "Creato da" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_date msgid "Created on" -msgstr "" +msgstr "Creato il" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__display_name msgid "Display Name" -msgstr "" +msgstr "Nome visualizzato" #. module: fs_base_multi_image #: model:ir.actions.act_window,name:fs_base_multi_image.fs_image_act_window msgid "Fs Image" -msgstr "" +msgstr "Immagine FS" #. module: fs_base_multi_image #: model:ir.ui.menu,name:fs_base_multi_image.fs_image_menu msgid "Fs Images" -msgstr "" +msgstr "Immagini FS" #. module: fs_base_multi_image #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view msgid "Group By" -msgstr "" +msgstr "Raggruppa per" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__id msgid "ID" -msgstr "" +msgstr "ID" #. module: fs_base_multi_image #: model:ir.model,name:fs_base_multi_image.model_fs_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image msgid "Image" -msgstr "" +msgstr "Immagine" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium msgid "Image 128" -msgstr "" +msgstr "Immagine 128" #. module: fs_base_multi_image #: model:res.groups,name:fs_base_multi_image.group_image_manager msgid "Image Manager" -msgstr "" +msgstr "Gestore immagine" #. module: fs_base_multi_image #: model:ir.model,name:fs_base_multi_image.model_fs_image_relation_mixin msgid "Image Relation" -msgstr "" +msgstr "Relazione immagine" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image_medium msgid "Image medium" -msgstr "" +msgstr "Immagine media" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image____last_update msgid "Last Modified on" -msgstr "" +msgstr "Ultima modifica il" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_uid msgid "Last Updated by" -msgstr "" +msgstr "Ultimo aggiornamento di" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_date msgid "Last Updated on" -msgstr "" +msgstr "Ultimo aggiornamento il" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__link_existing msgid "Link Existing" -msgstr "" +msgstr "Collegamento esistente" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_id msgid "Linked image" -msgstr "" +msgstr "Immagine collegata" #. module: fs_base_multi_image #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view msgid "MimeType" -msgstr "" +msgstr "Tipo MIME" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__mimetype #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__mimetype msgid "Mimetype" -msgstr "" +msgstr "Tipo MIME" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__name #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__name #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view msgid "Name" -msgstr "" +msgstr "Nome" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence msgid "Sequence" -msgstr "" +msgstr "Sequenza" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image msgid "Specific Image" -msgstr "" +msgstr "Immagine specifica" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium msgid "Specific Image 128" -msgstr "" +msgstr "Immagine specifica 128" #. module: fs_base_multi_image #. odoo-python #: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 #, python-format msgid "You must set an image" -msgstr "" +msgstr "Bisogna impostare una immagine" From dd28eb7ddda8b3c14c1ffc695189327a81925cd1 Mon Sep 17 00:00:00 2001 From: Benjamin Willig Date: Wed, 17 Jan 2024 09:19:56 +0100 Subject: [PATCH 08/38] [FIX] updated image and image_medium label to prevent odoo warning with same label for image/image_1920 and image_medium/image_128 for product.template and product.product --- fs_base_multi_image/models/fs_image_relation_mixin.py | 9 ++++++--- fs_base_multi_image/views/fs_image.xml | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/fs_base_multi_image/models/fs_image_relation_mixin.py b/fs_base_multi_image/models/fs_image_relation_mixin.py index 93181752c9..5dfde027c6 100644 --- a/fs_base_multi_image/models/fs_image_relation_mixin.py +++ b/fs_base_multi_image/models/fs_image_relation_mixin.py @@ -22,7 +22,7 @@ class FsImageRelationMixin(models.AbstractModel): specific_image = fs_fields.FSImage("Specific Image") # resized fields stored (as attachment) for performance specific_image_medium = fs_fields.FSImage( - "Specific Image 128", + "Specific Image (128)", related="specific_image", max_width=128, max_height=128, @@ -31,11 +31,14 @@ class FsImageRelationMixin(models.AbstractModel): link_existing = fields.Boolean(default=False) image = fs_fields.FSImage( - "Image", compute="_compute_image", inverse="_inverse_image", store=False + "Image (original)", + compute="_compute_image", + inverse="_inverse_image", + store=False, ) # resized fields stored (as attachment) for performance image_medium = fs_fields.FSImage( - "Image 128", compute="_compute_image_medium", store=False + "Image (128)", compute="_compute_image_medium", store=False ) name = fields.Char(compute="_compute_name", store=True, index=True) diff --git a/fs_base_multi_image/views/fs_image.xml b/fs_base_multi_image/views/fs_image.xml index 26347cbab9..0ecddb289d 100644 --- a/fs_base_multi_image/views/fs_image.xml +++ b/fs_base_multi_image/views/fs_image.xml @@ -15,7 +15,7 @@ - + From 013090c9f81fb2f85184b65fdbae92eb362a9028 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Wed, 17 Jan 2024 11:00:22 +0000 Subject: [PATCH 09/38] [UPD] Update fs_base_multi_image.pot --- fs_base_multi_image/i18n/fs_base_multi_image.pot | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/fs_base_multi_image/i18n/fs_base_multi_image.pot b/fs_base_multi_image/i18n/fs_base_multi_image.pot index d06f36f828..830715b440 100644 --- a/fs_base_multi_image/i18n/fs_base_multi_image.pot +++ b/fs_base_multi_image/i18n/fs_base_multi_image.pot @@ -59,13 +59,18 @@ msgstr "" #. module: fs_base_multi_image #: model:ir.model,name:fs_base_multi_image.model_fs_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image -#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_form_view msgid "Image" msgstr "" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium -msgid "Image 128" +msgid "Image (128)" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image +msgid "Image (original)" msgstr "" #. module: fs_base_multi_image @@ -138,7 +143,7 @@ msgstr "" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium -msgid "Specific Image 128" +msgid "Specific Image (128)" msgstr "" #. module: fs_base_multi_image From c33efa42a3bf0b30a5942dab8c4413b779970a69 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Wed, 17 Jan 2024 11:03:00 +0000 Subject: [PATCH 10/38] [BOT] post-merge updates --- fs_base_multi_image/README.rst | 2 +- fs_base_multi_image/__manifest__.py | 2 +- fs_base_multi_image/static/description/index.html | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/fs_base_multi_image/README.rst b/fs_base_multi_image/README.rst index 57e77f4fd3..df26cd1a29 100644 --- a/fs_base_multi_image/README.rst +++ b/fs_base_multi_image/README.rst @@ -7,7 +7,7 @@ Fs Base Multi Image !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:80a77aa6ae71d6e160791b2da2f73d7cca6448d2280ed954e40897401e9f3a9e + !! source digest: sha256:68693183f8459f8bb348d05183419c922969399742a1e77c878d8fb4f82d3629 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png diff --git a/fs_base_multi_image/__manifest__.py b/fs_base_multi_image/__manifest__.py index 14a8b2686e..8421649ca0 100644 --- a/fs_base_multi_image/__manifest__.py +++ b/fs_base_multi_image/__manifest__.py @@ -5,7 +5,7 @@ "name": "Fs Base Multi Image", "summary": """ Mulitple Images from External File System""", - "version": "16.0.1.0.0", + "version": "16.0.1.0.1", "license": "AGPL-3", "author": "ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/storage", diff --git a/fs_base_multi_image/static/description/index.html b/fs_base_multi_image/static/description/index.html index ef16a1800c..7f7bdda8b0 100644 --- a/fs_base_multi_image/static/description/index.html +++ b/fs_base_multi_image/static/description/index.html @@ -1,4 +1,3 @@ - @@ -367,7 +366,7 @@

Fs Base Multi Image

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:80a77aa6ae71d6e160791b2da2f73d7cca6448d2280ed954e40897401e9f3a9e +!! source digest: sha256:68693183f8459f8bb348d05183419c922969399742a1e77c878d8fb4f82d3629 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Alpha License: AGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

This addon is a technical addon providing a set of models to ease the From 5e560be975e4f38ac5542482f14307132035ecae Mon Sep 17 00:00:00 2001 From: Weblate Date: Wed, 17 Jan 2024 11:03:13 +0000 Subject: [PATCH 11/38] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: storage-16.0/storage-16.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-fs_base_multi_image/ --- fs_base_multi_image/i18n/es.po | 21 ++++++++++++++++----- fs_base_multi_image/i18n/it.po | 21 ++++++++++++++++----- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/fs_base_multi_image/i18n/es.po b/fs_base_multi_image/i18n/es.po index a81719afb3..4bae1f3316 100644 --- a/fs_base_multi_image/i18n/es.po +++ b/fs_base_multi_image/i18n/es.po @@ -62,14 +62,19 @@ msgstr "ID (identificación)" #. module: fs_base_multi_image #: model:ir.model,name:fs_base_multi_image.model_fs_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image -#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_form_view msgid "Image" msgstr "Imagen" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium -msgid "Image 128" -msgstr "Imagen 128" +msgid "Image (128)" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image +msgid "Image (original)" +msgstr "" #. module: fs_base_multi_image #: model:res.groups,name:fs_base_multi_image.group_image_manager @@ -141,8 +146,8 @@ msgstr "Imagen Específica" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium -msgid "Specific Image 128" -msgstr "Imagen Específica 128" +msgid "Specific Image (128)" +msgstr "" #. module: fs_base_multi_image #. odoo-python @@ -150,3 +155,9 @@ msgstr "Imagen Específica 128" #, python-format msgid "You must set an image" msgstr "Usted debe establecer una imagen" + +#~ msgid "Image 128" +#~ msgstr "Imagen 128" + +#~ msgid "Specific Image 128" +#~ msgstr "Imagen Específica 128" diff --git a/fs_base_multi_image/i18n/it.po b/fs_base_multi_image/i18n/it.po index 9cbebf8df0..7462af97fc 100644 --- a/fs_base_multi_image/i18n/it.po +++ b/fs_base_multi_image/i18n/it.po @@ -62,14 +62,19 @@ msgstr "ID" #. module: fs_base_multi_image #: model:ir.model,name:fs_base_multi_image.model_fs_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image -#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_form_view msgid "Image" msgstr "Immagine" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium -msgid "Image 128" -msgstr "Immagine 128" +msgid "Image (128)" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image +msgid "Image (original)" +msgstr "" #. module: fs_base_multi_image #: model:res.groups,name:fs_base_multi_image.group_image_manager @@ -141,8 +146,8 @@ msgstr "Immagine specifica" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium -msgid "Specific Image 128" -msgstr "Immagine specifica 128" +msgid "Specific Image (128)" +msgstr "" #. module: fs_base_multi_image #. odoo-python @@ -150,3 +155,9 @@ msgstr "Immagine specifica 128" #, python-format msgid "You must set an image" msgstr "Bisogna impostare una immagine" + +#~ msgid "Image 128" +#~ msgstr "Immagine 128" + +#~ msgid "Specific Image 128" +#~ msgstr "Immagine specifica 128" From 40df7bf0b8c471fcd125c1cd25a45436d19a5085 Mon Sep 17 00:00:00 2001 From: mymage Date: Thu, 18 Jan 2024 08:50:44 +0000 Subject: [PATCH 12/38] Translated using Weblate (Italian) Currently translated at 100.0% (26 of 26 strings) Translation: storage-16.0/storage-16.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-fs_base_multi_image/it/ --- fs_base_multi_image/i18n/it.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fs_base_multi_image/i18n/it.po b/fs_base_multi_image/i18n/it.po index 7462af97fc..56a6b5dae8 100644 --- a/fs_base_multi_image/i18n/it.po +++ b/fs_base_multi_image/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-11-28 14:33+0000\n" +"PO-Revision-Date: 2024-01-18 11:33+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -69,12 +69,12 @@ msgstr "Immagine" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium msgid "Image (128)" -msgstr "" +msgstr "Immagine 128" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image msgid "Image (original)" -msgstr "" +msgstr "Immagine (originale)" #. module: fs_base_multi_image #: model:res.groups,name:fs_base_multi_image.group_image_manager @@ -147,7 +147,7 @@ msgstr "Immagine specifica" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium msgid "Specific Image (128)" -msgstr "" +msgstr "Immagine specifica (128)" #. module: fs_base_multi_image #. odoo-python From 88e39a228aff370b28a8323f1601ef199d268e4e Mon Sep 17 00:00:00 2001 From: Benjamin Willig Date: Tue, 23 Jan 2024 11:05:35 +0100 Subject: [PATCH 13/38] [FIX] Creating new relation records in the UI with link_existing trigger the inverse method, which results in a ValueError --- fs_base_multi_image/models/fs_image_relation_mixin.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/fs_base_multi_image/models/fs_image_relation_mixin.py b/fs_base_multi_image/models/fs_image_relation_mixin.py index 5dfde027c6..ec2c536364 100644 --- a/fs_base_multi_image/models/fs_image_relation_mixin.py +++ b/fs_base_multi_image/models/fs_image_relation_mixin.py @@ -78,9 +78,7 @@ def _compute_image_medium(self): def _inverse_image(self): for record in self: - if record.link_existing: - raise ValueError(_("Cannot set image on a linked image")) - else: + if not record.link_existing: record.specific_image = record.image @api.model From 679be26dc36c09ee9c2869f8796ba867a7761588 Mon Sep 17 00:00:00 2001 From: Benjamin Willig Date: Tue, 23 Jan 2024 11:13:38 +0100 Subject: [PATCH 14/38] [ADD] new widget to allow image upload through drag and drop or file selection --- fs_base_multi_image/README.rst | 2 +- fs_base_multi_image/__manifest__.py | 10 + .../static/description/index.html | 3 +- .../fs_image_relation_dnd_upload.esm.js | 179 ++++++++++++++++++ .../fs_image_relation_dnd_upload.scss | 28 +++ .../fs_image_relation_dnd_upload.xml | 37 ++++ .../views/fs_image_relation_mixin.xml | 33 ++++ 7 files changed, 290 insertions(+), 2 deletions(-) create mode 100644 fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js create mode 100644 fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss create mode 100644 fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml diff --git a/fs_base_multi_image/README.rst b/fs_base_multi_image/README.rst index df26cd1a29..688be36651 100644 --- a/fs_base_multi_image/README.rst +++ b/fs_base_multi_image/README.rst @@ -7,7 +7,7 @@ Fs Base Multi Image !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:68693183f8459f8bb348d05183419c922969399742a1e77c878d8fb4f82d3629 + !! source digest: sha256:2b1f8d6cdde6996404efb81205e6d40189f3bab7136ff5b1938602bb7b8e3a3d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png diff --git a/fs_base_multi_image/__manifest__.py b/fs_base_multi_image/__manifest__.py index 8421649ca0..f7f32a7676 100644 --- a/fs_base_multi_image/__manifest__.py +++ b/fs_base_multi_image/__manifest__.py @@ -18,6 +18,16 @@ "views/fs_image.xml", "views/fs_image_relation_mixin.xml", ], + "assets": { + "web.assets_backend": [ + "fs_base_multi_image/static/src/fields/" + "fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js", + "fs_base_multi_image/static/src/fields/" + "fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss", + "fs_base_multi_image/static/src/fields/" + "fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml", + ], + }, "demo": [], "maintainers": ["lmignon"], "development_status": "Alpha", diff --git a/fs_base_multi_image/static/description/index.html b/fs_base_multi_image/static/description/index.html index 7f7bdda8b0..80ceb26e67 100644 --- a/fs_base_multi_image/static/description/index.html +++ b/fs_base_multi_image/static/description/index.html @@ -1,3 +1,4 @@ + @@ -366,7 +367,7 @@

Fs Base Multi Image

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:68693183f8459f8bb348d05183419c922969399742a1e77c878d8fb4f82d3629 +!! source digest: sha256:2b1f8d6cdde6996404efb81205e6d40189f3bab7136ff5b1938602bb7b8e3a3d !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Alpha License: AGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

This addon is a technical addon providing a set of models to ease the diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js new file mode 100644 index 0000000000..1814800d4f --- /dev/null +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js @@ -0,0 +1,179 @@ +/** @odoo-module **/ + +import {onWillRender, useRef, useState} from "@odoo/owl"; + +import {X2ManyField} from "@web/views/fields/x2many/x2many_field"; +import {registry} from "@web/core/registry"; + +export class FsImageRelationDndUploadField extends X2ManyField { + setup() { + super.setup(); + this.options = this.activeField.options; + this.target = this.options.target || "fs_image"; + this.relationField = this.field.relation_field; + this.state = useState({ + dragging: false, + }); + this.fileInput = useRef("fileInput"); + this.defaultSequence = 0; + + onWillRender(() => { + this.initDefaultSequence(); + }); + } + + initDefaultSequence() { + let sequence = 0; + _.each(this.props.value.records, (record) => { + sequence = record.data.sequence; + if (sequence >= this.defaultSequence) { + this.defaultSequence = sequence + 1; + } + }); + } + + getNewSequence() { + const sequence = this.defaultSequence; + this.defaultSequence += 1; + return sequence; + } + + setDragging() { + this.state.dragging = true; + } + + setNotDragging() { + this.state.dragging = false; + } + + onDragEnter(ev) { + ev.preventDefault(); + this.setDragging(); + } + + onDragLeave(ev) { + ev.preventDefault(); + this.setNotDragging(); + } + + onClickSelectDocuments(ev) { + ev.preventDefault(); + this.fileInput.el.click(); + } + + onDrop(ev) { + ev.preventDefault(); + this.setNotDragging(); + this.uploadImages(ev.dataTransfer.files); + } + + onFilesSelected(ev) { + ev.preventDefault(); + this.uploadImages(ev.target.files); + } + + async uploadFsImage(imagesDesc) { + const self = this; + const createValues = []; + self.env.model.orm + .call("fs.image", "create", [imagesDesc]) + .then((fsImageIds) => { + let values = {}; + _.each(fsImageIds, (fsImageId) => { + values = self.getFsImageRelationValues(fsImageId); + createValues.push(values); + }); + }) + .then(() => { + self.createFieldRelationRecords(createValues); + }); + } + + getFsImageRelationValues(fsImageId) { + let values = { + image_id: fsImageId, + link_existing: true, + }; + values = {...values, ...this.getRelationCommonValues()}; + return values; + } + + async uploadSpecificImage(imagesDesc) { + const self = this; + const createValues = []; + _.each(imagesDesc, (imageDesc) => { + createValues.push(self.getSpecificImageRelationValues(imageDesc)); + }); + self.createFieldRelationRecords(createValues); + } + + getSpecificImageRelationValues(imageDesc) { + return {...imageDesc, ...this.getRelationCommonValues()}; + } + + getRelationCommonValues() { + const values = { + sequence: this.getNewSequence(), + }; + values[this.relationField] = this.props.record.data.id; + return values; + } + + async createFieldRelationRecords(createValues) { + const self = this; + const model = self.env.model; + model.orm.call(self.activeField.relation, "create", [createValues]).then(() => { + model.root.load(); + model.root.save(); + }); + } + + async uploadImages(files) { + const self = this; + const promises = []; + _.each(files, function (file) { + if (!file.type.includes("image")) { + return; + } + const filePromise = new Promise(function (resolve) { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.onload = function (upload) { + let data = upload.target.result; + data = data.split(",")[1]; + resolve([file.name, data]); + }; + }); + promises.push(filePromise); + }); + return Promise.all(promises).then(function (fileContents) { + const imagesDesc = []; + _.each(fileContents, function (fileContent) { + imagesDesc.push(self.getFileImageDesc(fileContent)); + }); + switch (self.target) { + case "fs_image": + self.uploadFsImage(imagesDesc); + break; + case "specific": + self.uploadSpecificImage(imagesDesc); + break; + } + }); + } + + getFileImageDesc(fileContent) { + return { + image: { + filename: fileContent[0], + content: fileContent[1], + }, + }; + } +} + +FsImageRelationDndUploadField.template = "web.FsImageRelationDndUploadField"; + +registry + .category("fields") + .add("fs_image_relation_dnd_upload", FsImageRelationDndUploadField); diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss new file mode 100644 index 0000000000..5130511a75 --- /dev/null +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss @@ -0,0 +1,28 @@ +.o_field_x2many { + .dnd-zone { + display: table; + padding: 10px; + width: 90%; + margin: auto; + margin-top: 5px; + min-height: 100px; + border: 1px solid transparent; + border-color: var(--notebook-link-border-color, transparent); + text-align: center; + + &.dragging-inside { + outline: 2px dashed #a096be; + outline-offset: -10px; + } + + span { + vertical-align: middle; + display: table-cell; + text-align: center; + } + + input[name="files"] { + display: none; + } + } +} diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml new file mode 100644 index 0000000000..17c31dbcc4 --- /dev/null +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml @@ -0,0 +1,37 @@ + + + + + +

+ + You can drag and drop images to create new records or click here to select image files. + + + +
+ + + + diff --git a/fs_base_multi_image/views/fs_image_relation_mixin.xml b/fs_base_multi_image/views/fs_image_relation_mixin.xml index 27bc8f3a3c..802d82ab0c 100644 --- a/fs_base_multi_image/views/fs_image_relation_mixin.xml +++ b/fs_base_multi_image/views/fs_image_relation_mixin.xml @@ -39,4 +39,37 @@ + + fs.image.relation.mixin.kanban + fs.image.relation.mixin + + + + + + + +
+ X +
+
+
+
+ + + +
+
+
+
+
+ + + + + + From b6fefb205a24e01120de3edd4e900a1f0159e6ca Mon Sep 17 00:00:00 2001 From: Benjamin Willig Date: Tue, 23 Jan 2024 15:16:44 +0100 Subject: [PATCH 15/38] [ADD] allow user to select where he want to store the image --- .../fs_image_relation_dnd_upload.esm.js | 21 +++++- .../fs_image_relation_dnd_upload.scss | 18 +++-- .../fs_image_relation_dnd_upload.xml | 67 +++++++++++++------ 3 files changed, 78 insertions(+), 28 deletions(-) diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js index 1814800d4f..b1da2f1bae 100644 --- a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js @@ -9,10 +9,11 @@ export class FsImageRelationDndUploadField extends X2ManyField { setup() { super.setup(); this.options = this.activeField.options; - this.target = this.options.target || "fs_image"; this.relationField = this.field.relation_field; + this.defaultTarget = this.options.target || "specific"; this.state = useState({ dragging: false, + target: this.defaultTarget, }); this.fileInput = useRef("fileInput"); this.defaultSequence = 0; @@ -22,6 +23,18 @@ export class FsImageRelationDndUploadField extends X2ManyField { }); } + get targetImage() { + return this.state.target; + } + + get displayDndZone() { + const activeActions = this.activeActions; + return ( + ("link" in activeActions ? activeActions.link : activeActions.create) && + !this.props.readonly + ); + } + initDefaultSequence() { let sequence = 0; _.each(this.props.value.records, (record) => { @@ -72,6 +85,10 @@ export class FsImageRelationDndUploadField extends X2ManyField { this.uploadImages(ev.target.files); } + onChangeImageTarget(ev) { + this.state.target = ev.target.value; + } + async uploadFsImage(imagesDesc) { const self = this; const createValues = []; @@ -151,7 +168,7 @@ export class FsImageRelationDndUploadField extends X2ManyField { _.each(fileContents, function (fileContent) { imagesDesc.push(self.getFileImageDesc(fileContent)); }); - switch (self.target) { + switch (self.targetImage) { case "fs_image": self.uploadFsImage(imagesDesc); break; diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss index 5130511a75..4848b7db70 100644 --- a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss @@ -15,10 +15,20 @@ outline-offset: -10px; } - span { - vertical-align: middle; - display: table-cell; - text-align: center; + .row { + display: table-row; + + div { + vertical-align: middle; + display: table-cell; + text-align: center; + + select[name="fs_image_target"] { + display: inline-block; + width: fit-content; + color: #01666b; + } + } } input[name="files"] { diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml index 17c31dbcc4..6522721bae 100644 --- a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml @@ -8,29 +8,52 @@ owl="1" > -
- - You can drag and drop images to create new records or click here to select image files. - + +
+
+
+ You can drag and drop images to create new records or click here to select image files. +
+
- -
+
+
+ Choose how you want to store the new images: + +
+
+ +
+
From 4b41f1655a11dd491dc0604e19c11f8381d7116b Mon Sep 17 00:00:00 2001 From: Benjamin Willig Date: Tue, 23 Jan 2024 16:09:58 +0100 Subject: [PATCH 16/38] [IMP] block the UI during the upload --- .../fs_image_relation_dnd_upload.esm.js | 52 +++++++++++++++---- 1 file changed, 41 insertions(+), 11 deletions(-) diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js index b1da2f1bae..3d455c65af 100644 --- a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js @@ -1,5 +1,6 @@ /** @odoo-module **/ +import {blockUI, unblockUI} from "web.framework"; import {onWillRender, useRef, useState} from "@odoo/owl"; import {X2ManyField} from "@web/views/fields/x2many/x2many_field"; @@ -103,9 +104,23 @@ export class FsImageRelationDndUploadField extends X2ManyField { }) .then(() => { self.createFieldRelationRecords(createValues); + }) + .catch(() => { + self.displayUploadError(); }); } + displayUploadError() { + unblockUI(); + this.env.services.notification.add( + this.env._t("An error occurred during the images upload."), + { + type: "danger", + sticky: true, + } + ); + } + getFsImageRelationValues(fsImageId) { let values = { image_id: fsImageId, @@ -139,15 +154,24 @@ export class FsImageRelationDndUploadField extends X2ManyField { async createFieldRelationRecords(createValues) { const self = this; const model = self.env.model; - model.orm.call(self.activeField.relation, "create", [createValues]).then(() => { - model.root.load(); - model.root.save(); - }); + model.orm + .call(self.activeField.relation, "create", [createValues]) + .then(() => { + model.root.load(); + model.root.save(); + }) + .then(() => { + unblockUI(); + }) + .catch(() => { + self.displayUploadError(); + }); } async uploadImages(files) { const self = this; const promises = []; + blockUI(); _.each(files, function (file) { if (!file.type.includes("image")) { return; @@ -168,13 +192,19 @@ export class FsImageRelationDndUploadField extends X2ManyField { _.each(fileContents, function (fileContent) { imagesDesc.push(self.getFileImageDesc(fileContent)); }); - switch (self.targetImage) { - case "fs_image": - self.uploadFsImage(imagesDesc); - break; - case "specific": - self.uploadSpecificImage(imagesDesc); - break; + if (imagesDesc.length > 0) { + switch (self.targetImage) { + case "fs_image": + self.uploadFsImage(imagesDesc); + break; + case "specific": + self.uploadSpecificImage(imagesDesc); + break; + default: + unblockUI(); + } + } else { + unblockUI(); } }); } From 353f8f46c03b395163d5264837f61a72339843b6 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Thu, 25 Jan 2024 17:20:39 +0000 Subject: [PATCH 17/38] [UPD] Update fs_base_multi_image.pot --- .../i18n/fs_base_multi_image.pot | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/fs_base_multi_image/i18n/fs_base_multi_image.pot b/fs_base_multi_image/i18n/fs_base_multi_image.pot index 830715b440..d19608beef 100644 --- a/fs_base_multi_image/i18n/fs_base_multi_image.pot +++ b/fs_base_multi_image/i18n/fs_base_multi_image.pot @@ -14,10 +14,17 @@ msgstr "" "Plural-Forms: \n" #. module: fs_base_multi_image -#. odoo-python -#: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js:0 #, python-format -msgid "Cannot set image on a linked image" +msgid "An error occurred during the images upload." +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "Choose how you want to store the new images:" msgstr "" #. module: fs_base_multi_image @@ -131,11 +138,25 @@ msgstr "" msgid "Name" msgstr "" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "Reusable images" +msgstr "" + #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence msgid "Sequence" msgstr "" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "Specific" +msgstr "" + #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image msgid "Specific Image" @@ -146,9 +167,30 @@ msgstr "" msgid "Specific Image (128)" msgstr "" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "You can drag and drop images to create new records or" +msgstr "" + #. module: fs_base_multi_image #. odoo-python #: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 #, python-format msgid "You must set an image" msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "click here" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "to select image files." +msgstr "" From c38df6f3b29a75b65c97b7463af376affe66361e Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 25 Jan 2024 17:23:12 +0000 Subject: [PATCH 18/38] [BOT] post-merge updates --- fs_base_multi_image/README.rst | 2 +- fs_base_multi_image/__manifest__.py | 2 +- fs_base_multi_image/static/description/index.html | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/fs_base_multi_image/README.rst b/fs_base_multi_image/README.rst index 688be36651..58fad59bba 100644 --- a/fs_base_multi_image/README.rst +++ b/fs_base_multi_image/README.rst @@ -7,7 +7,7 @@ Fs Base Multi Image !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:2b1f8d6cdde6996404efb81205e6d40189f3bab7136ff5b1938602bb7b8e3a3d + !! source digest: sha256:ad3bbeac958b6632a99fed3772704d6ac955048fc5657b64fdb3dd63e12e73f8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png diff --git a/fs_base_multi_image/__manifest__.py b/fs_base_multi_image/__manifest__.py index f7f32a7676..f0e2537042 100644 --- a/fs_base_multi_image/__manifest__.py +++ b/fs_base_multi_image/__manifest__.py @@ -5,7 +5,7 @@ "name": "Fs Base Multi Image", "summary": """ Mulitple Images from External File System""", - "version": "16.0.1.0.1", + "version": "16.0.1.1.0", "license": "AGPL-3", "author": "ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/storage", diff --git a/fs_base_multi_image/static/description/index.html b/fs_base_multi_image/static/description/index.html index 80ceb26e67..b919d0d77c 100644 --- a/fs_base_multi_image/static/description/index.html +++ b/fs_base_multi_image/static/description/index.html @@ -1,4 +1,3 @@ - @@ -367,7 +366,7 @@

Fs Base Multi Image

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:2b1f8d6cdde6996404efb81205e6d40189f3bab7136ff5b1938602bb7b8e3a3d +!! source digest: sha256:ad3bbeac958b6632a99fed3772704d6ac955048fc5657b64fdb3dd63e12e73f8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Alpha License: AGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

This addon is a technical addon providing a set of models to ease the From a5f2b65a7ed5dc9d73320c2e450e27af3278fdd1 Mon Sep 17 00:00:00 2001 From: Weblate Date: Thu, 25 Jan 2024 17:23:23 +0000 Subject: [PATCH 19/38] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: storage-16.0/storage-16.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-fs_base_multi_image/ --- fs_base_multi_image/i18n/es.po | 54 +++++++++++++++++++++++++++++++--- fs_base_multi_image/i18n/it.po | 54 +++++++++++++++++++++++++++++++--- 2 files changed, 100 insertions(+), 8 deletions(-) diff --git a/fs_base_multi_image/i18n/es.po b/fs_base_multi_image/i18n/es.po index 4bae1f3316..f712d2e5d7 100644 --- a/fs_base_multi_image/i18n/es.po +++ b/fs_base_multi_image/i18n/es.po @@ -17,11 +17,18 @@ msgstr "" "X-Generator: Weblate 4.17\n" #. module: fs_base_multi_image -#. odoo-python -#: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js:0 +#, python-format +msgid "An error occurred during the images upload." +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format -msgid "Cannot set image on a linked image" -msgstr "No se puede establecer la imagen en una imagen vinculada" +msgid "Choose how you want to store the new images:" +msgstr "" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_uid @@ -134,11 +141,25 @@ msgstr "Tipo Mimo" msgid "Name" msgstr "Nombre" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "Reusable images" +msgstr "" + #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence msgid "Sequence" msgstr "Secuencia" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "Specific" +msgstr "" + #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image msgid "Specific Image" @@ -149,6 +170,13 @@ msgstr "Imagen Específica" msgid "Specific Image (128)" msgstr "" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "You can drag and drop images to create new records or" +msgstr "" + #. module: fs_base_multi_image #. odoo-python #: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 @@ -156,6 +184,24 @@ msgstr "" msgid "You must set an image" msgstr "Usted debe establecer una imagen" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "click here" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "to select image files." +msgstr "" + +#, python-format +#~ msgid "Cannot set image on a linked image" +#~ msgstr "No se puede establecer la imagen en una imagen vinculada" + #~ msgid "Image 128" #~ msgstr "Imagen 128" diff --git a/fs_base_multi_image/i18n/it.po b/fs_base_multi_image/i18n/it.po index 56a6b5dae8..3f9274debc 100644 --- a/fs_base_multi_image/i18n/it.po +++ b/fs_base_multi_image/i18n/it.po @@ -17,11 +17,18 @@ msgstr "" "X-Generator: Weblate 4.17\n" #. module: fs_base_multi_image -#. odoo-python -#: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js:0 +#, python-format +msgid "An error occurred during the images upload." +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format -msgid "Cannot set image on a linked image" -msgstr "Non si può impostare una immagin in una immagine collegata" +msgid "Choose how you want to store the new images:" +msgstr "" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_uid @@ -134,11 +141,25 @@ msgstr "Tipo MIME" msgid "Name" msgstr "Nome" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "Reusable images" +msgstr "" + #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence msgid "Sequence" msgstr "Sequenza" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "Specific" +msgstr "" + #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image msgid "Specific Image" @@ -149,6 +170,13 @@ msgstr "Immagine specifica" msgid "Specific Image (128)" msgstr "Immagine specifica (128)" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "You can drag and drop images to create new records or" +msgstr "" + #. module: fs_base_multi_image #. odoo-python #: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 @@ -156,6 +184,24 @@ msgstr "Immagine specifica (128)" msgid "You must set an image" msgstr "Bisogna impostare una immagine" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "click here" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "to select image files." +msgstr "" + +#, python-format +#~ msgid "Cannot set image on a linked image" +#~ msgstr "Non si può impostare una immagin in una immagine collegata" + #~ msgid "Image 128" #~ msgstr "Immagine 128" From 21d60288f1931a4c5dd7d77620a1462b3893dda6 Mon Sep 17 00:00:00 2001 From: Ivorra78 Date: Sat, 27 Jan 2024 11:46:01 +0000 Subject: [PATCH 20/38] Translated using Weblate (Spanish) Currently translated at 100.0% (32 of 32 strings) Translation: storage-16.0/storage-16.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-fs_base_multi_image/es/ --- fs_base_multi_image/i18n/es.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/fs_base_multi_image/i18n/es.po b/fs_base_multi_image/i18n/es.po index f712d2e5d7..8ec4742f52 100644 --- a/fs_base_multi_image/i18n/es.po +++ b/fs_base_multi_image/i18n/es.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-10-29 00:15+0000\n" +"PO-Revision-Date: 2024-01-27 14:36+0000\n" "Last-Translator: Ivorra78 \n" "Language-Team: none\n" "Language: es\n" @@ -21,14 +21,14 @@ msgstr "" #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js:0 #, python-format msgid "An error occurred during the images upload." -msgstr "" +msgstr "Se ha producido un error durante la carga de imágenes." #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "Choose how you want to store the new images:" -msgstr "" +msgstr "Elige cómo quieres almacenar las nuevas imágenes:" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_uid @@ -76,12 +76,12 @@ msgstr "Imagen" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium msgid "Image (128)" -msgstr "" +msgstr "Imagen (128)" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image msgid "Image (original)" -msgstr "" +msgstr "Imagen (original)" #. module: fs_base_multi_image #: model:res.groups,name:fs_base_multi_image.group_image_manager @@ -146,7 +146,7 @@ msgstr "Nombre" #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "Reusable images" -msgstr "" +msgstr "Imágenes reutilizables" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence @@ -158,7 +158,7 @@ msgstr "Secuencia" #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "Specific" -msgstr "" +msgstr "Específico" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image @@ -168,14 +168,14 @@ msgstr "Imagen Específica" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium msgid "Specific Image (128)" -msgstr "" +msgstr "Imagen Específica (128)" #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "You can drag and drop images to create new records or" -msgstr "" +msgstr "Puede arrastrar y soltar imágenes para crear nuevos registros o" #. module: fs_base_multi_image #. odoo-python @@ -189,14 +189,14 @@ msgstr "Usted debe establecer una imagen" #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "click here" -msgstr "" +msgstr "pulse aquí" #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "to select image files." -msgstr "" +msgstr "para seleccionar archivos de imagen." #, python-format #~ msgid "Cannot set image on a linked image" From e1fe2d9b6d2605cd0a00168a4400accb39a418ba Mon Sep 17 00:00:00 2001 From: mymage Date: Thu, 1 Feb 2024 07:05:20 +0000 Subject: [PATCH 21/38] Translated using Weblate (Italian) Currently translated at 100.0% (32 of 32 strings) Translation: storage-16.0/storage-16.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-fs_base_multi_image/it/ --- fs_base_multi_image/i18n/it.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/fs_base_multi_image/i18n/it.po b/fs_base_multi_image/i18n/it.po index 3f9274debc..b3c250495f 100644 --- a/fs_base_multi_image/i18n/it.po +++ b/fs_base_multi_image/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-01-18 11:33+0000\n" +"PO-Revision-Date: 2024-02-01 07:22+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -21,14 +21,14 @@ msgstr "" #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js:0 #, python-format msgid "An error occurred during the images upload." -msgstr "" +msgstr "Si è verificato un errore durante il caricamento dell'immagine." #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "Choose how you want to store the new images:" -msgstr "" +msgstr "Scegliere come archiviare le nuove immagini:" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_uid @@ -146,7 +146,7 @@ msgstr "Nome" #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "Reusable images" -msgstr "" +msgstr "Immagini riutilizzabili" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence @@ -158,7 +158,7 @@ msgstr "Sequenza" #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "Specific" -msgstr "" +msgstr "Specifica" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image @@ -175,7 +175,7 @@ msgstr "Immagine specifica (128)" #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "You can drag and drop images to create new records or" -msgstr "" +msgstr "Si possono trascinare e rilasciare immagini per creare nuovi record o" #. module: fs_base_multi_image #. odoo-python @@ -189,14 +189,14 @@ msgstr "Bisogna impostare una immagine" #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "click here" -msgstr "" +msgstr "fare clic qui" #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "to select image files." -msgstr "" +msgstr "per selezionare file immagine." #, python-format #~ msgid "Cannot set image on a linked image" From 13860852f170c8424c7cb2078170dab779fbe8b7 Mon Sep 17 00:00:00 2001 From: "Benjamin Willig (ACSONE)" Date: Thu, 15 Feb 2024 15:24:35 +0000 Subject: [PATCH 22/38] Added translation using Weblate (French) --- fs_base_multi_image/i18n/fr.po | 197 +++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 fs_base_multi_image/i18n/fr.po diff --git a/fs_base_multi_image/i18n/fr.po b/fs_base_multi_image/i18n/fr.po new file mode 100644 index 0000000000..b7ec46d6a7 --- /dev/null +++ b/fs_base_multi_image/i18n/fr.po @@ -0,0 +1,197 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fs_base_multi_image +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js:0 +#, python-format +msgid "An error occurred during the images upload." +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "Choose how you want to store the new images:" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_uid +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Created by" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_date +msgid "Created on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__display_name +msgid "Display Name" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.actions.act_window,name:fs_base_multi_image.fs_image_act_window +msgid "Fs Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.ui.menu,name:fs_base_multi_image.fs_image_menu +msgid "Fs Images" +msgstr "" + +#. module: fs_base_multi_image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Group By" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__id +msgid "ID" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model,name:fs_base_multi_image.model_fs_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_form_view +msgid "Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium +msgid "Image (128)" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image +msgid "Image (original)" +msgstr "" + +#. module: fs_base_multi_image +#: model:res.groups,name:fs_base_multi_image.group_image_manager +msgid "Image Manager" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model,name:fs_base_multi_image.model_fs_image_relation_mixin +msgid "Image Relation" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image_medium +msgid "Image medium" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image____last_update +msgid "Last Modified on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_date +msgid "Last Updated on" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__link_existing +msgid "Link Existing" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_id +msgid "Linked image" +msgstr "" + +#. module: fs_base_multi_image +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "MimeType" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__mimetype +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__mimetype +msgid "Mimetype" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__name +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__name +#: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view +msgid "Name" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "Reusable images" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence +msgid "Sequence" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "Specific" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image +msgid "Specific Image" +msgstr "" + +#. module: fs_base_multi_image +#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium +msgid "Specific Image (128)" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "You can drag and drop images to create new records or" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-python +#: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 +#, python-format +msgid "You must set an image" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "click here" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "to select image files." +msgstr "" From e69290bdc7330240f516fccd796b7bd09ba72188 Mon Sep 17 00:00:00 2001 From: "Benjamin Willig (ACSONE)" Date: Thu, 15 Feb 2024 15:25:45 +0000 Subject: [PATCH 23/38] Translated using Weblate (French) Currently translated at 62.5% (20 of 32 strings) Translation: storage-16.0/storage-16.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-fs_base_multi_image/fr/ --- fs_base_multi_image/i18n/fr.po | 44 ++++++++++++++++++---------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/fs_base_multi_image/i18n/fr.po b/fs_base_multi_image/i18n/fr.po index b7ec46d6a7..11b1613965 100644 --- a/fs_base_multi_image/i18n/fr.po +++ b/fs_base_multi_image/i18n/fr.po @@ -6,43 +6,45 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"Last-Translator: Automatically generated\n" +"PO-Revision-Date: 2024-02-15 17:37+0000\n" +"Last-Translator: \"Benjamin Willig (ACSONE)\" \n" "Language-Team: none\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.17\n" #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js:0 #, python-format msgid "An error occurred during the images upload." -msgstr "" +msgstr "Une erreur est apparue lors de l'upload des images." #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "Choose how you want to store the new images:" -msgstr "" +msgstr "Choisissez où les images seront stockées :" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_uid #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view msgid "Created by" -msgstr "" +msgstr "Créé par" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__create_date msgid "Created on" -msgstr "" +msgstr "Crée le" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__display_name msgid "Display Name" -msgstr "" +msgstr "Nom affiché" #. module: fs_base_multi_image #: model:ir.actions.act_window,name:fs_base_multi_image.fs_image_act_window @@ -79,12 +81,12 @@ msgstr "" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image msgid "Image (original)" -msgstr "" +msgstr "Image (originale)" #. module: fs_base_multi_image #: model:res.groups,name:fs_base_multi_image.group_image_manager msgid "Image Manager" -msgstr "" +msgstr "Gestionnaire des images" #. module: fs_base_multi_image #: model:ir.model,name:fs_base_multi_image.model_fs_image_relation_mixin @@ -94,7 +96,7 @@ msgstr "" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image_medium msgid "Image medium" -msgstr "" +msgstr "Image moyenne" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image____last_update @@ -114,12 +116,12 @@ msgstr "" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__link_existing msgid "Link Existing" -msgstr "" +msgstr "Lier une image existante" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_id msgid "Linked image" -msgstr "" +msgstr "Image liée" #. module: fs_base_multi_image #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view @@ -137,36 +139,36 @@ msgstr "" #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__name #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view msgid "Name" -msgstr "" +msgstr "Nom" #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "Reusable images" -msgstr "" +msgstr "Images réutilisables" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__sequence msgid "Sequence" -msgstr "" +msgstr "Séquence" #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "Specific" -msgstr "" +msgstr "Spécifique" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image msgid "Specific Image" -msgstr "" +msgstr "Image Spécifique" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__specific_image_medium msgid "Specific Image (128)" -msgstr "" +msgstr "Image spécifique (128)" #. module: fs_base_multi_image #. odoo-javascript @@ -174,24 +176,26 @@ msgstr "" #, python-format msgid "You can drag and drop images to create new records or" msgstr "" +"Vous pouvez glisser/déposer des images pour créer des nouveaux " +"enregistrements où" #. module: fs_base_multi_image #. odoo-python #: code:addons/fs_base_multi_image/models/fs_image_relation_mixin.py:0 #, python-format msgid "You must set an image" -msgstr "" +msgstr "Vous devez définir une image" #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "click here" -msgstr "" +msgstr "cliquez ici" #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "to select image files." -msgstr "" +msgstr "pour sélectionner des fichiers." From a3a56f14273e239560d73c78c5d8c5ce6293ca68 Mon Sep 17 00:00:00 2001 From: "Benjamin Willig (ACSONE)" Date: Mon, 19 Feb 2024 08:22:53 +0000 Subject: [PATCH 24/38] Translated using Weblate (French) Currently translated at 75.0% (24 of 32 strings) Translation: storage-16.0/storage-16.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-fs_base_multi_image/fr/ --- fs_base_multi_image/i18n/fr.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/fs_base_multi_image/i18n/fr.po b/fs_base_multi_image/i18n/fr.po index 11b1613965..acde25a4c6 100644 --- a/fs_base_multi_image/i18n/fr.po +++ b/fs_base_multi_image/i18n/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-02-15 17:37+0000\n" +"PO-Revision-Date: 2024-02-19 10:34+0000\n" "Last-Translator: \"Benjamin Willig (ACSONE)\" \n" "Language-Team: none\n" "Language: fr\n" @@ -49,12 +49,12 @@ msgstr "Nom affiché" #. module: fs_base_multi_image #: model:ir.actions.act_window,name:fs_base_multi_image.fs_image_act_window msgid "Fs Image" -msgstr "" +msgstr "Image FS" #. module: fs_base_multi_image #: model:ir.ui.menu,name:fs_base_multi_image.fs_image_menu msgid "Fs Images" -msgstr "" +msgstr "Images FS" #. module: fs_base_multi_image #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_search_view @@ -71,12 +71,12 @@ msgstr "" #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__image #: model_terms:ir.ui.view,arch_db:fs_base_multi_image.fs_image_form_view msgid "Image" -msgstr "" +msgstr "Image" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image_medium msgid "Image (128)" -msgstr "" +msgstr "Image (128)" #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image_relation_mixin__image From 3be17f27419956e3c7e719dfacfdebf2b3bc4b7d Mon Sep 17 00:00:00 2001 From: chien Date: Wed, 28 Feb 2024 17:45:45 +0700 Subject: [PATCH 25/38] [IMP] fs_base_multi_image: pre-commit auto fixes --- fs_base_multi_image/README.rst | 51 ++++++++++--------- fs_base_multi_image/models/fs_image.py | 1 - .../models/fs_image_relation_mixin.py | 1 - fs_base_multi_image/pyproject.toml | 3 ++ fs_base_multi_image/readme/CONTRIBUTORS.md | 1 + fs_base_multi_image/readme/CONTRIBUTORS.rst | 1 - fs_base_multi_image/readme/DESCRIPTION.md | 15 ++++++ fs_base_multi_image/readme/DESCRIPTION.rst | 14 ----- fs_base_multi_image/readme/ROADMAP.md | 3 ++ fs_base_multi_image/readme/ROADMAP.rst | 2 - fs_base_multi_image/readme/USAGE.md | 3 ++ fs_base_multi_image/readme/USAGE.rst | 3 -- .../static/description/index.html | 37 ++++++++------ 13 files changed, 73 insertions(+), 62 deletions(-) create mode 100644 fs_base_multi_image/pyproject.toml create mode 100644 fs_base_multi_image/readme/CONTRIBUTORS.md delete mode 100644 fs_base_multi_image/readme/CONTRIBUTORS.rst create mode 100644 fs_base_multi_image/readme/DESCRIPTION.md delete mode 100644 fs_base_multi_image/readme/DESCRIPTION.rst create mode 100644 fs_base_multi_image/readme/ROADMAP.md delete mode 100644 fs_base_multi_image/readme/ROADMAP.rst create mode 100644 fs_base_multi_image/readme/USAGE.md delete mode 100644 fs_base_multi_image/readme/USAGE.rst diff --git a/fs_base_multi_image/README.rst b/fs_base_multi_image/README.rst index 58fad59bba..c034fda2d4 100644 --- a/fs_base_multi_image/README.rst +++ b/fs_base_multi_image/README.rst @@ -17,31 +17,33 @@ Fs Base Multi Image :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstorage-lightgray.png?logo=github - :target: https://github.com/OCA/storage/tree/16.0/fs_base_multi_image + :target: https://github.com/OCA/storage/tree/17.0/fs_base_multi_image :alt: OCA/storage .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/storage-16-0/storage-16-0-fs_base_multi_image + :target: https://translation.odoo-community.org/projects/storage-17-0/storage-17-0-fs_base_multi_image :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/storage&target_branch=16.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/storage&target_branch=17.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| This addon is a technical addon providing a set of models to ease the -creation of other models that need to be linked to multiple images stored -into external filesystems. +creation of other models that need to be linked to multiple images +stored into external filesystems. The models provided by this addon are: -* ``fs.image``: a model that stores a reference to an image stored into - an external filesystem. -* ``fs.image.relation.mixin``: an abstract model that can be used to - as base class for models created to store an image linked to a model. - This abstract model defines fields and methods to transparently handle - 2 cases: - * the image is specific to the model. - * the image is shared between multiple models and therefore is a ``fs.image`` instance linked to the mixin. +- ``fs.image``: a model that stores a reference to an image stored into + an external filesystem. +- ``fs.image.relation.mixin``: an abstract model that can be used to as + base class for models created to store an image linked to a model. + This abstract model defines fields and methods to transparently + handle 2 cases: + + - the image is specific to the model. + - the image is shared between multiple models and therefore is a + ``fs.image`` instance linked to the mixin. .. IMPORTANT:: This is an alpha version, the data model and design can change at any time without warning. @@ -56,15 +58,16 @@ The models provided by this addon are: Usage ===== -To be able to create and or manages shared images, you must have the ``Image Manager`` -role. If you do not have this role, as an authenticated user, you can -only view the shared images. +To be able to create and or manages shared images, you must have the +``Image Manager`` role. If you do not have this role, as an +authenticated user, you can only view the shared images. Known issues / Roadmap ====================== -* Add dedicated widget to ease the addition of new images to a model linked to - multiple images. (As it's the case in the *storage_image_product* addon) +- Add dedicated widget to ease the addition of new images to a model + linked to multiple images. (As it's the case in the + *storage_image_product* addon) Bug Tracker =========== @@ -72,7 +75,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -80,17 +83,17 @@ Credits ======= Authors -~~~~~~~ +------- * ACSONE SA/NV Contributors -~~~~~~~~~~~~ +------------ -* Laurent Mignon +- Laurent Mignon Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -110,6 +113,6 @@ Current `maintainer `__: |maintainer-lmignon| -This module is part of the `OCA/storage `_ project on GitHub. +This module is part of the `OCA/storage `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fs_base_multi_image/models/fs_image.py b/fs_base_multi_image/models/fs_image.py index 285995ae26..e2881ee682 100644 --- a/fs_base_multi_image/models/fs_image.py +++ b/fs_base_multi_image/models/fs_image.py @@ -7,7 +7,6 @@ class FsImage(models.Model): - _name = "fs.image" _inherit = "fs.image.mixin" _description = "Image" diff --git a/fs_base_multi_image/models/fs_image_relation_mixin.py b/fs_base_multi_image/models/fs_image_relation_mixin.py index ec2c536364..bb6ebfeba4 100644 --- a/fs_base_multi_image/models/fs_image_relation_mixin.py +++ b/fs_base_multi_image/models/fs_image_relation_mixin.py @@ -8,7 +8,6 @@ class FsImageRelationMixin(models.AbstractModel): - _name = "fs.image.relation.mixin" _description = "Image Relation" _order = "sequence, name" diff --git a/fs_base_multi_image/pyproject.toml b/fs_base_multi_image/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/fs_base_multi_image/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/fs_base_multi_image/readme/CONTRIBUTORS.md b/fs_base_multi_image/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..f2af9193ce --- /dev/null +++ b/fs_base_multi_image/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Laurent Mignon \<\> diff --git a/fs_base_multi_image/readme/CONTRIBUTORS.rst b/fs_base_multi_image/readme/CONTRIBUTORS.rst deleted file mode 100644 index 172b2d223c..0000000000 --- a/fs_base_multi_image/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1 +0,0 @@ -* Laurent Mignon diff --git a/fs_base_multi_image/readme/DESCRIPTION.md b/fs_base_multi_image/readme/DESCRIPTION.md new file mode 100644 index 0000000000..a79b8da118 --- /dev/null +++ b/fs_base_multi_image/readme/DESCRIPTION.md @@ -0,0 +1,15 @@ +This addon is a technical addon providing a set of models to ease the +creation of other models that need to be linked to multiple images +stored into external filesystems. + +The models provided by this addon are: + +- `fs.image`: a model that stores a reference to an image stored into an + external filesystem. +- `fs.image.relation.mixin`: an abstract model that can be used to as + base class for models created to store an image linked to a model. + This abstract model defines fields and methods to transparently handle + 2 cases: + - the image is specific to the model. + - the image is shared between multiple models and therefore is a + `fs.image` instance linked to the mixin. diff --git a/fs_base_multi_image/readme/DESCRIPTION.rst b/fs_base_multi_image/readme/DESCRIPTION.rst deleted file mode 100644 index 3690804632..0000000000 --- a/fs_base_multi_image/readme/DESCRIPTION.rst +++ /dev/null @@ -1,14 +0,0 @@ -This addon is a technical addon providing a set of models to ease the -creation of other models that need to be linked to multiple images stored -into external filesystems. - -The models provided by this addon are: - -* ``fs.image``: a model that stores a reference to an image stored into - an external filesystem. -* ``fs.image.relation.mixin``: an abstract model that can be used to - as base class for models created to store an image linked to a model. - This abstract model defines fields and methods to transparently handle - 2 cases: - * the image is specific to the model. - * the image is shared between multiple models and therefore is a ``fs.image`` instance linked to the mixin. diff --git a/fs_base_multi_image/readme/ROADMAP.md b/fs_base_multi_image/readme/ROADMAP.md new file mode 100644 index 0000000000..c85ff99dc1 --- /dev/null +++ b/fs_base_multi_image/readme/ROADMAP.md @@ -0,0 +1,3 @@ +- Add dedicated widget to ease the addition of new images to a model + linked to multiple images. (As it's the case in the + *storage_image_product* addon) diff --git a/fs_base_multi_image/readme/ROADMAP.rst b/fs_base_multi_image/readme/ROADMAP.rst deleted file mode 100644 index 776f992b58..0000000000 --- a/fs_base_multi_image/readme/ROADMAP.rst +++ /dev/null @@ -1,2 +0,0 @@ -* Add dedicated widget to ease the addition of new images to a model linked to - multiple images. (As it's the case in the *storage_image_product* addon) diff --git a/fs_base_multi_image/readme/USAGE.md b/fs_base_multi_image/readme/USAGE.md new file mode 100644 index 0000000000..d49a937cdf --- /dev/null +++ b/fs_base_multi_image/readme/USAGE.md @@ -0,0 +1,3 @@ +To be able to create and or manages shared images, you must have the +`Image Manager` role. If you do not have this role, as an authenticated +user, you can only view the shared images. diff --git a/fs_base_multi_image/readme/USAGE.rst b/fs_base_multi_image/readme/USAGE.rst deleted file mode 100644 index 7a4d226aa3..0000000000 --- a/fs_base_multi_image/readme/USAGE.rst +++ /dev/null @@ -1,3 +0,0 @@ -To be able to create and or manages shared images, you must have the ``Image Manager`` -role. If you do not have this role, as an authenticated user, you can -only view the shared images. diff --git a/fs_base_multi_image/static/description/index.html b/fs_base_multi_image/static/description/index.html index b919d0d77c..02979d17cf 100644 --- a/fs_base_multi_image/static/description/index.html +++ b/fs_base_multi_image/static/description/index.html @@ -1,3 +1,4 @@ + @@ -368,20 +369,23 @@

Fs Base Multi Image

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:ad3bbeac958b6632a99fed3772704d6ac955048fc5657b64fdb3dd63e12e73f8 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Alpha License: AGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

+

Alpha License: AGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

This addon is a technical addon providing a set of models to ease the -creation of other models that need to be linked to multiple images stored -into external filesystems.

+creation of other models that need to be linked to multiple images +stored into external filesystems.

The models provided by this addon are:

  • fs.image: a model that stores a reference to an image stored into an external filesystem.
  • -
  • fs.image.relation.mixin: an abstract model that can be used to -as base class for models created to store an image linked to a model. -This abstract model defines fields and methods to transparently handle -2 cases: -* the image is specific to the model. -* the image is shared between multiple models and therefore is a fs.image instance linked to the mixin.
  • +
  • fs.image.relation.mixin: an abstract model that can be used to as +base class for models created to store an image linked to a model. +This abstract model defines fields and methods to transparently +handle 2 cases:
      +
    • the image is specific to the model.
    • +
    • the image is shared between multiple models and therefore is a +fs.image instance linked to the mixin.
    • +
    +

Important

@@ -405,15 +409,16 @@

Fs Base Multi Image

Usage

-

To be able to create and or manages shared images, you must have the Image Manager -role. If you do not have this role, as an authenticated user, you can -only view the shared images.

+

To be able to create and or manages shared images, you must have the +Image Manager role. If you do not have this role, as an +authenticated user, you can only view the shared images.

Known issues / Roadmap

    -
  • Add dedicated widget to ease the addition of new images to a model linked to -multiple images. (As it’s the case in the storage_image_product addon)
  • +
  • Add dedicated widget to ease the addition of new images to a model +linked to multiple images. (As it’s the case in the +storage_image_product addon)
@@ -421,7 +426,7 @@

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

+feedback.

Do not contact contributors directly about support or help with technical issues.

@@ -447,7 +452,7 @@

Maintainers

promote its widespread use.

Current maintainer:

lmignon

-

This module is part of the OCA/storage project on GitHub.

+

This module is part of the OCA/storage project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

From c161dff2e10d364d26b104a5d007a7b9537b22a1 Mon Sep 17 00:00:00 2001 From: chien Date: Thu, 29 Feb 2024 17:41:31 +0700 Subject: [PATCH 26/38] [MIG] fs_base_multi_image: Migration to 17.0 --- fs_base_multi_image/README.rst | 1 + fs_base_multi_image/__manifest__.py | 2 +- fs_base_multi_image/readme/CONTRIBUTORS.md | 1 + .../static/description/index.html | 2 +- .../fs_image_relation_dnd_upload.esm.js | 36 ++++++++++--------- .../fs_image_relation_dnd_upload.scss | 3 +- .../fs_image_relation_dnd_upload.xml | 1 - .../views/fs_image_relation_mixin.xml | 9 ++--- 8 files changed, 27 insertions(+), 28 deletions(-) diff --git a/fs_base_multi_image/README.rst b/fs_base_multi_image/README.rst index c034fda2d4..798d4636af 100644 --- a/fs_base_multi_image/README.rst +++ b/fs_base_multi_image/README.rst @@ -91,6 +91,7 @@ Contributors ------------ - Laurent Mignon +- Nguyen Minh Chien Maintainers ----------- diff --git a/fs_base_multi_image/__manifest__.py b/fs_base_multi_image/__manifest__.py index f0e2537042..8d663bfd95 100644 --- a/fs_base_multi_image/__manifest__.py +++ b/fs_base_multi_image/__manifest__.py @@ -5,7 +5,7 @@ "name": "Fs Base Multi Image", "summary": """ Mulitple Images from External File System""", - "version": "16.0.1.1.0", + "version": "17.0.1.0.0", "license": "AGPL-3", "author": "ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/storage", diff --git a/fs_base_multi_image/readme/CONTRIBUTORS.md b/fs_base_multi_image/readme/CONTRIBUTORS.md index f2af9193ce..da20decb6f 100644 --- a/fs_base_multi_image/readme/CONTRIBUTORS.md +++ b/fs_base_multi_image/readme/CONTRIBUTORS.md @@ -1 +1,2 @@ - Laurent Mignon \<\> +- Nguyen Minh Chien \<\> diff --git a/fs_base_multi_image/static/description/index.html b/fs_base_multi_image/static/description/index.html index 02979d17cf..381e3817cc 100644 --- a/fs_base_multi_image/static/description/index.html +++ b/fs_base_multi_image/static/description/index.html @@ -1,4 +1,3 @@ - @@ -441,6 +440,7 @@

Authors

Contributors

diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js index 3d455c65af..7d0aed7446 100644 --- a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js @@ -1,17 +1,14 @@ /** @odoo-module **/ -import {blockUI, unblockUI} from "web.framework"; +import {X2ManyField, x2ManyField} from "@web/views/fields/x2many/x2many_field"; import {onWillRender, useRef, useState} from "@odoo/owl"; - -import {X2ManyField} from "@web/views/fields/x2many/x2many_field"; import {registry} from "@web/core/registry"; export class FsImageRelationDndUploadField extends X2ManyField { setup() { super.setup(); - this.options = this.activeField.options; this.relationField = this.field.relation_field; - this.defaultTarget = this.options.target || "specific"; + this.defaultTarget = this.props.crudOptions.target || "specific"; this.state = useState({ dragging: false, target: this.defaultTarget, @@ -38,7 +35,7 @@ export class FsImageRelationDndUploadField extends X2ManyField { initDefaultSequence() { let sequence = 0; - _.each(this.props.value.records, (record) => { + $.each(this.props.record.data[this.props.name].records, (i, record) => { sequence = record.data.sequence; if (sequence >= this.defaultSequence) { this.defaultSequence = sequence + 1; @@ -97,7 +94,7 @@ export class FsImageRelationDndUploadField extends X2ManyField { .call("fs.image", "create", [imagesDesc]) .then((fsImageIds) => { let values = {}; - _.each(fsImageIds, (fsImageId) => { + $.each(fsImageIds, (i, fsImageId) => { values = self.getFsImageRelationValues(fsImageId); createValues.push(values); }); @@ -111,7 +108,7 @@ export class FsImageRelationDndUploadField extends X2ManyField { } displayUploadError() { - unblockUI(); + this.env.services.ui.unblock(); this.env.services.notification.add( this.env._t("An error occurred during the images upload."), { @@ -133,7 +130,7 @@ export class FsImageRelationDndUploadField extends X2ManyField { async uploadSpecificImage(imagesDesc) { const self = this; const createValues = []; - _.each(imagesDesc, (imageDesc) => { + $.each(imagesDesc, (i, imageDesc) => { createValues.push(self.getSpecificImageRelationValues(imageDesc)); }); self.createFieldRelationRecords(createValues); @@ -155,13 +152,13 @@ export class FsImageRelationDndUploadField extends X2ManyField { const self = this; const model = self.env.model; model.orm - .call(self.activeField.relation, "create", [createValues]) + .call(self.field.relation, "create", [createValues]) .then(() => { model.root.load(); model.root.save(); }) .then(() => { - unblockUI(); + self.env.services.ui.unblock(); }) .catch(() => { self.displayUploadError(); @@ -171,8 +168,8 @@ export class FsImageRelationDndUploadField extends X2ManyField { async uploadImages(files) { const self = this; const promises = []; - blockUI(); - _.each(files, function (file) { + this.env.services.ui.block(); + $.each(files, function (i, file) { if (!file.type.includes("image")) { return; } @@ -189,7 +186,7 @@ export class FsImageRelationDndUploadField extends X2ManyField { }); return Promise.all(promises).then(function (fileContents) { const imagesDesc = []; - _.each(fileContents, function (fileContent) { + $.each(fileContents, function (i, fileContent) { imagesDesc.push(self.getFileImageDesc(fileContent)); }); if (imagesDesc.length > 0) { @@ -201,10 +198,10 @@ export class FsImageRelationDndUploadField extends X2ManyField { self.uploadSpecificImage(imagesDesc); break; default: - unblockUI(); + self.env.services.ui.unblock(); } } else { - unblockUI(); + self.env.services.ui.unblock(); } }); } @@ -221,6 +218,11 @@ export class FsImageRelationDndUploadField extends X2ManyField { FsImageRelationDndUploadField.template = "web.FsImageRelationDndUploadField"; +export const fsImageRelationDndUploadField = { + ...x2ManyField, + component: FsImageRelationDndUploadField, +}; + registry .category("fields") - .add("fs_image_relation_dnd_upload", FsImageRelationDndUploadField); + .add("fs_image_relation_dnd_upload", fsImageRelationDndUploadField); diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss index 4848b7db70..508fbe7833 100644 --- a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.scss @@ -3,8 +3,7 @@ display: table; padding: 10px; width: 90%; - margin: auto; - margin-top: 5px; + margin: 5px auto 10px; min-height: 100px; border: 1px solid transparent; border-color: var(--notebook-link-border-color, transparent); diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml index 6522721bae..574579b410 100644 --- a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml @@ -5,7 +5,6 @@ t-name="web.FsImageRelationDndUploadField" t-inherit="web.X2ManyField" t-inherit-mode="primary" - owl="1" > diff --git a/fs_base_multi_image/views/fs_image_relation_mixin.xml b/fs_base_multi_image/views/fs_image_relation_mixin.xml index 802d82ab0c..d8b8e8f486 100644 --- a/fs_base_multi_image/views/fs_image_relation_mixin.xml +++ b/fs_base_multi_image/views/fs_image_relation_mixin.xml @@ -14,22 +14,19 @@ class="oe_avatar" options="{'preview_image': 'image_medium', 'zoom': true}" readonly="1" - attrs="{'invisible': [('link_existing', '=', False)]}" + invisible="not link_existing" /> - + From 5cc74836bb24d749143192ea8e192c66d15709b7 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Fri, 3 May 2024 07:55:42 +0000 Subject: [PATCH 27/38] [UPD] Update fs_base_multi_image.pot --- .../i18n/fs_base_multi_image.pot | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/fs_base_multi_image/i18n/fs_base_multi_image.pot b/fs_base_multi_image/i18n/fs_base_multi_image.pot index d19608beef..702619850c 100644 --- a/fs_base_multi_image/i18n/fs_base_multi_image.pot +++ b/fs_base_multi_image/i18n/fs_base_multi_image.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 17.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -95,11 +95,6 @@ msgstr "" msgid "Image medium" msgstr "" -#. module: fs_base_multi_image -#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image____last_update -msgid "Last Modified on" -msgstr "" - #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_uid msgid "Last Updated by" @@ -188,6 +183,20 @@ msgstr "" msgid "click here" msgstr "" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "fs_image" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "specific" +msgstr "" + #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 From cf1449e6eed69c97cb3368794de76a9e87541b67 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 3 May 2024 07:57:55 +0000 Subject: [PATCH 28/38] [BOT] post-merge updates --- fs_base_multi_image/README.rst | 2 +- fs_base_multi_image/static/description/index.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/fs_base_multi_image/README.rst b/fs_base_multi_image/README.rst index 798d4636af..559846877c 100644 --- a/fs_base_multi_image/README.rst +++ b/fs_base_multi_image/README.rst @@ -7,7 +7,7 @@ Fs Base Multi Image !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:ad3bbeac958b6632a99fed3772704d6ac955048fc5657b64fdb3dd63e12e73f8 + !! source digest: sha256:0c66d7a624a425811316a3e7f2456887b2d4893d87fb417a80fbe25102abc44f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png diff --git a/fs_base_multi_image/static/description/index.html b/fs_base_multi_image/static/description/index.html index 381e3817cc..de1195ee76 100644 --- a/fs_base_multi_image/static/description/index.html +++ b/fs_base_multi_image/static/description/index.html @@ -366,7 +366,7 @@

Fs Base Multi Image

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:ad3bbeac958b6632a99fed3772704d6ac955048fc5657b64fdb3dd63e12e73f8 +!! source digest: sha256:0c66d7a624a425811316a3e7f2456887b2d4893d87fb417a80fbe25102abc44f !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Alpha License: AGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

This addon is a technical addon providing a set of models to ease the From 81097d5620723c00371ee1941ef76b622df25a35 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 3 May 2024 11:10:52 +0000 Subject: [PATCH 29/38] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: storage-17.0/storage-17.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-17-0/storage-17-0-fs_base_multi_image/ --- fs_base_multi_image/i18n/es.po | 22 +++++++++++++++++----- fs_base_multi_image/i18n/fr.po | 19 ++++++++++++++----- fs_base_multi_image/i18n/it.po | 22 +++++++++++++++++----- 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/fs_base_multi_image/i18n/es.po b/fs_base_multi_image/i18n/es.po index 8ec4742f52..d629263c7a 100644 --- a/fs_base_multi_image/i18n/es.po +++ b/fs_base_multi_image/i18n/es.po @@ -98,11 +98,6 @@ msgstr "Relación de Imágenes" msgid "Image medium" msgstr "Imagen mediana" -#. module: fs_base_multi_image -#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image____last_update -msgid "Last Modified on" -msgstr "Última Modificación el" - #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_uid msgid "Last Updated by" @@ -191,6 +186,20 @@ msgstr "Usted debe establecer una imagen" msgid "click here" msgstr "pulse aquí" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "fs_image" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "specific" +msgstr "" + #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 @@ -198,6 +207,9 @@ msgstr "pulse aquí" msgid "to select image files." msgstr "para seleccionar archivos de imagen." +#~ msgid "Last Modified on" +#~ msgstr "Última Modificación el" + #, python-format #~ msgid "Cannot set image on a linked image" #~ msgstr "No se puede establecer la imagen en una imagen vinculada" diff --git a/fs_base_multi_image/i18n/fr.po b/fs_base_multi_image/i18n/fr.po index acde25a4c6..7339c625a9 100644 --- a/fs_base_multi_image/i18n/fr.po +++ b/fs_base_multi_image/i18n/fr.po @@ -98,11 +98,6 @@ msgstr "" msgid "Image medium" msgstr "Image moyenne" -#. module: fs_base_multi_image -#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image____last_update -msgid "Last Modified on" -msgstr "" - #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_uid msgid "Last Updated by" @@ -193,6 +188,20 @@ msgstr "Vous devez définir une image" msgid "click here" msgstr "cliquez ici" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "fs_image" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "specific" +msgstr "" + #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 diff --git a/fs_base_multi_image/i18n/it.po b/fs_base_multi_image/i18n/it.po index b3c250495f..44c460a86b 100644 --- a/fs_base_multi_image/i18n/it.po +++ b/fs_base_multi_image/i18n/it.po @@ -98,11 +98,6 @@ msgstr "Relazione immagine" msgid "Image medium" msgstr "Immagine media" -#. module: fs_base_multi_image -#: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image____last_update -msgid "Last Modified on" -msgstr "Ultima modifica il" - #. module: fs_base_multi_image #: model:ir.model.fields,field_description:fs_base_multi_image.field_fs_image__write_uid msgid "Last Updated by" @@ -191,6 +186,20 @@ msgstr "Bisogna impostare una immagine" msgid "click here" msgstr "fare clic qui" +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "fs_image" +msgstr "" + +#. module: fs_base_multi_image +#. odoo-javascript +#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 +#, python-format +msgid "specific" +msgstr "" + #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 @@ -198,6 +207,9 @@ msgstr "fare clic qui" msgid "to select image files." msgstr "per selezionare file immagine." +#~ msgid "Last Modified on" +#~ msgstr "Ultima modifica il" + #, python-format #~ msgid "Cannot set image on a linked image" #~ msgstr "Non si può impostare una immagin in una immagine collegata" From 00e9e4f5ad96841806d206aa0734caef415cf05f Mon Sep 17 00:00:00 2001 From: mymage Date: Fri, 3 May 2024 13:54:24 +0000 Subject: [PATCH 30/38] Translated using Weblate (Italian) Currently translated at 100.0% (33 of 33 strings) Translation: storage-17.0/storage-17.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-17-0/storage-17-0-fs_base_multi_image/it/ --- fs_base_multi_image/i18n/it.po | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/fs_base_multi_image/i18n/it.po b/fs_base_multi_image/i18n/it.po index 44c460a86b..2784e1995b 100644 --- a/fs_base_multi_image/i18n/it.po +++ b/fs_base_multi_image/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-02-01 07:22+0000\n" +"PO-Revision-Date: 2024-05-03 16:34+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -191,14 +191,14 @@ msgstr "fare clic qui" #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "fs_image" -msgstr "" +msgstr "fs_image" #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format msgid "specific" -msgstr "" +msgstr "specifica" #. module: fs_base_multi_image #. odoo-javascript From 5d6d903569d026fa0ceefa18808a04572dc22cfc Mon Sep 17 00:00:00 2001 From: Benjamin Willig Date: Mon, 29 Jan 2024 16:31:43 +0100 Subject: [PATCH 31/38] [CHG] use list.addNew to add relation records instead of calling the ORM explicitely --- .../models/fs_image_relation_mixin.py | 14 ++-- .../fs_image_relation_dnd_upload.esm.js | 67 ++++++++++--------- .../views/fs_image_relation_mixin.xml | 4 +- 3 files changed, 48 insertions(+), 37 deletions(-) diff --git a/fs_base_multi_image/models/fs_image_relation_mixin.py b/fs_base_multi_image/models/fs_image_relation_mixin.py index bb6ebfeba4..c934ca3281 100644 --- a/fs_base_multi_image/models/fs_image_relation_mixin.py +++ b/fs_base_multi_image/models/fs_image_relation_mixin.py @@ -82,12 +82,14 @@ def _inverse_image(self): @api.model def _cleanup_vals(self, vals): - if ( - "link_existing" in vals - and vals["link_existing"] - and "specific_image" in vals - ): - vals["specific_image"] = False + link_existing = vals.get("link_existing") + if link_existing: + if "specific_image" in vals: + vals.pop("specific_image") + if "image" in vals: + # image is set when using the kanban renderer so it + # prevents the name field to be computed well + vals.pop("image") return vals @api.model_create_multi diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js index 7d0aed7446..984f169d6f 100644 --- a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js @@ -4,10 +4,20 @@ import {X2ManyField, x2ManyField} from "@web/views/fields/x2many/x2many_field"; import {onWillRender, useRef, useState} from "@odoo/owl"; import {registry} from "@web/core/registry"; +import {useX2ManyCrud} from "@web/views/fields/relational_utils"; + export class FsImageRelationDndUploadField extends X2ManyField { + /** + * When using this widget, displayed image relation views must contains + * following fields: + * - sequence + * - image_id + * - specific_image + * - link_existing + */ setup() { super.setup(); - this.relationField = this.field.relation_field; + this.options = this.activeField.options; this.defaultTarget = this.props.crudOptions.target || "specific"; this.state = useState({ dragging: false, @@ -16,6 +26,8 @@ export class FsImageRelationDndUploadField extends X2ManyField { this.fileInput = useRef("fileInput"); this.defaultSequence = 0; + this.operations = useX2ManyCrud(() => this.list, this.isMany2Many); + onWillRender(() => { this.initDefaultSequence(); }); @@ -25,6 +37,10 @@ export class FsImageRelationDndUploadField extends X2ManyField { return this.state.target; } + get relationRecordId() { + return this.props.record.data.id; + } + get displayDndZone() { const activeActions = this.activeActions; return ( @@ -89,18 +105,15 @@ export class FsImageRelationDndUploadField extends X2ManyField { async uploadFsImage(imagesDesc) { const self = this; - const createValues = []; self.env.model.orm .call("fs.image", "create", [imagesDesc]) .then((fsImageIds) => { let values = {}; $.each(fsImageIds, (i, fsImageId) => { values = self.getFsImageRelationValues(fsImageId); - createValues.push(values); + self.createFieldRelationRecords(values); }); - }) - .then(() => { - self.createFieldRelationRecords(createValues); + self.env.services.ui.unblock(); }) .catch(() => { self.displayUploadError(); @@ -120,8 +133,8 @@ export class FsImageRelationDndUploadField extends X2ManyField { getFsImageRelationValues(fsImageId) { let values = { - image_id: fsImageId, - link_existing: true, + default_image_id: fsImageId, + default_link_existing: true, }; values = {...values, ...this.getRelationCommonValues()}; return values; @@ -129,40 +142,34 @@ export class FsImageRelationDndUploadField extends X2ManyField { async uploadSpecificImage(imagesDesc) { const self = this; - const createValues = []; $.each(imagesDesc, (i, imageDesc) => { - createValues.push(self.getSpecificImageRelationValues(imageDesc)); + self.createFieldRelationRecords( + self.getSpecificImageRelationValues(imageDesc) + ); }); - self.createFieldRelationRecords(createValues); + self.env.services.ui.unblock(); } getSpecificImageRelationValues(imageDesc) { - return {...imageDesc, ...this.getRelationCommonValues()}; + return { + ...this.getRelationCommonValues(), + default_specific_image: imageDesc.image, + }; } getRelationCommonValues() { - const values = { - sequence: this.getNewSequence(), + return { + default_sequence: this.getNewSequence(), }; - values[this.relationField] = this.props.record.data.id; - return values; } async createFieldRelationRecords(createValues) { - const self = this; - const model = self.env.model; - model.orm - .call(self.field.relation, "create", [createValues]) - .then(() => { - model.root.load(); - model.root.save(); - }) - .then(() => { - self.env.services.ui.unblock(); - }) - .catch(() => { - self.displayUploadError(); - }); + await this.list.addNewRecord({ + position: "bottom", + context: createValues, + mode: "readonly", + allowWarning: true, + }); } async uploadImages(files) { diff --git a/fs_base_multi_image/views/fs_image_relation_mixin.xml b/fs_base_multi_image/views/fs_image_relation_mixin.xml index d8b8e8f486..35ba648925 100644 --- a/fs_base_multi_image/views/fs_image_relation_mixin.xml +++ b/fs_base_multi_image/views/fs_image_relation_mixin.xml @@ -42,8 +42,10 @@ - + + +

From 7acafa0a000b01934b1a086d4b7a9f9558667ecb Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Mon, 28 Oct 2024 09:11:44 +0000 Subject: [PATCH 32/38] [BOT] post-merge updates --- fs_base_multi_image/README.rst | 2 +- fs_base_multi_image/__manifest__.py | 2 +- fs_base_multi_image/static/description/index.html | 13 ++++++++----- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/fs_base_multi_image/README.rst b/fs_base_multi_image/README.rst index 559846877c..3d65ab4bab 100644 --- a/fs_base_multi_image/README.rst +++ b/fs_base_multi_image/README.rst @@ -7,7 +7,7 @@ Fs Base Multi Image !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:0c66d7a624a425811316a3e7f2456887b2d4893d87fb417a80fbe25102abc44f + !! source digest: sha256:3dfa2fad49331a437e4446272f0ba7166b5e39ee12cc1cac27dc4ed70aff155e !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Alpha-red.png diff --git a/fs_base_multi_image/__manifest__.py b/fs_base_multi_image/__manifest__.py index 8d663bfd95..b40afd2200 100644 --- a/fs_base_multi_image/__manifest__.py +++ b/fs_base_multi_image/__manifest__.py @@ -5,7 +5,7 @@ "name": "Fs Base Multi Image", "summary": """ Mulitple Images from External File System""", - "version": "17.0.1.0.0", + "version": "17.0.1.0.1", "license": "AGPL-3", "author": "ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/storage", diff --git a/fs_base_multi_image/static/description/index.html b/fs_base_multi_image/static/description/index.html index de1195ee76..7ee10b07c0 100644 --- a/fs_base_multi_image/static/description/index.html +++ b/fs_base_multi_image/static/description/index.html @@ -8,10 +8,11 @@ /* :Author: David Goodger (goodger@python.org) -:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $ +:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $ :Copyright: This stylesheet has been placed in the public domain. Default cascading style sheet for the HTML output of Docutils. +Despite the name, some widely supported CSS2 features are used. See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to customize this style sheet. @@ -274,7 +275,7 @@ margin-left: 2em ; margin-right: 2em } -pre.code .ln { color: grey; } /* line numbers */ +pre.code .ln { color: gray; } /* line numbers */ pre.code, code { background-color: #eeeeee } pre.code .comment, code .comment { color: #5C6576 } pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold } @@ -300,7 +301,7 @@ span.pre { white-space: pre } -span.problematic { +span.problematic, pre.problematic { color: red } span.section-subtitle { @@ -366,7 +367,7 @@

Fs Base Multi Image

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:0c66d7a624a425811316a3e7f2456887b2d4893d87fb417a80fbe25102abc44f +!! source digest: sha256:3dfa2fad49331a437e4446272f0ba7166b5e39ee12cc1cac27dc4ed70aff155e !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Alpha License: AGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

This addon is a technical addon providing a set of models to ease the @@ -446,7 +447,9 @@

Contributors

Maintainers

This module is maintained by the OCA.

-Odoo Community Association + +Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

From 02627c575c43756b250b71c2d8c0810a0528b559 Mon Sep 17 00:00:00 2001 From: oca-ci Date: Fri, 16 May 2025 09:30:45 +0000 Subject: [PATCH 33/38] [UPD] Update fs_base_multi_image.pot --- fs_base_multi_image/i18n/fs_base_multi_image.pot | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/fs_base_multi_image/i18n/fs_base_multi_image.pot b/fs_base_multi_image/i18n/fs_base_multi_image.pot index 702619850c..927a4fdc75 100644 --- a/fs_base_multi_image/i18n/fs_base_multi_image.pot +++ b/fs_base_multi_image/i18n/fs_base_multi_image.pot @@ -183,20 +183,6 @@ msgstr "" msgid "click here" msgstr "" -#. module: fs_base_multi_image -#. odoo-javascript -#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 -#, python-format -msgid "fs_image" -msgstr "" - -#. module: fs_base_multi_image -#. odoo-javascript -#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 -#, python-format -msgid "specific" -msgstr "" - #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 From 5be2a429818071cede61253f9d1526f38adb2c01 Mon Sep 17 00:00:00 2001 From: Weblate Date: Fri, 16 May 2025 09:30:54 +0000 Subject: [PATCH 34/38] Update translation files Updated by "Update PO files to match POT (msgmerge)" hook in Weblate. Translation: storage-17.0/storage-17.0-fs_base_multi_image Translate-URL: https://translation.odoo-community.org/projects/storage-17-0/storage-17-0-fs_base_multi_image/ --- fs_base_multi_image/i18n/es.po | 14 -------------- fs_base_multi_image/i18n/fr.po | 14 -------------- fs_base_multi_image/i18n/it.po | 18 ++++++------------ 3 files changed, 6 insertions(+), 40 deletions(-) diff --git a/fs_base_multi_image/i18n/es.po b/fs_base_multi_image/i18n/es.po index d629263c7a..6a9cc6b743 100644 --- a/fs_base_multi_image/i18n/es.po +++ b/fs_base_multi_image/i18n/es.po @@ -186,20 +186,6 @@ msgstr "Usted debe establecer una imagen" msgid "click here" msgstr "pulse aquí" -#. module: fs_base_multi_image -#. odoo-javascript -#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 -#, python-format -msgid "fs_image" -msgstr "" - -#. module: fs_base_multi_image -#. odoo-javascript -#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 -#, python-format -msgid "specific" -msgstr "" - #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 diff --git a/fs_base_multi_image/i18n/fr.po b/fs_base_multi_image/i18n/fr.po index 7339c625a9..8978806755 100644 --- a/fs_base_multi_image/i18n/fr.po +++ b/fs_base_multi_image/i18n/fr.po @@ -188,20 +188,6 @@ msgstr "Vous devez définir une image" msgid "click here" msgstr "cliquez ici" -#. module: fs_base_multi_image -#. odoo-javascript -#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 -#, python-format -msgid "fs_image" -msgstr "" - -#. module: fs_base_multi_image -#. odoo-javascript -#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 -#, python-format -msgid "specific" -msgstr "" - #. module: fs_base_multi_image #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 diff --git a/fs_base_multi_image/i18n/it.po b/fs_base_multi_image/i18n/it.po index 2784e1995b..0b831d1314 100644 --- a/fs_base_multi_image/i18n/it.po +++ b/fs_base_multi_image/i18n/it.po @@ -190,22 +190,16 @@ msgstr "fare clic qui" #. odoo-javascript #: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format -msgid "fs_image" -msgstr "fs_image" +msgid "to select image files." +msgstr "per selezionare file immagine." -#. module: fs_base_multi_image -#. odoo-javascript -#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format -msgid "specific" -msgstr "specifica" +#~ msgid "fs_image" +#~ msgstr "fs_image" -#. module: fs_base_multi_image -#. odoo-javascript -#: code:addons/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml:0 #, python-format -msgid "to select image files." -msgstr "per selezionare file immagine." +#~ msgid "specific" +#~ msgstr "specifica" #~ msgid "Last Modified on" #~ msgstr "Ultima modifica il" From e0318993894a1f70c78021751fdaa6754ceacfad Mon Sep 17 00:00:00 2001 From: kobros-tech Date: Mon, 9 Mar 2026 16:16:42 +0300 Subject: [PATCH 35/38] [IMP] fs_base_multi_image: pre-commit auto fixes --- fs_base_multi_image/security/fs_image.xml | 2 -- .../fs_image_relation_dnd_upload.xml | 32 +++++++++---------- fs_base_multi_image/views/fs_image.xml | 2 -- .../views/fs_image_relation_mixin.xml | 6 ++-- 4 files changed, 18 insertions(+), 24 deletions(-) diff --git a/fs_base_multi_image/security/fs_image.xml b/fs_base_multi_image/security/fs_image.xml index b976e34f28..76277a4240 100644 --- a/fs_base_multi_image/security/fs_image.xml +++ b/fs_base_multi_image/security/fs_image.xml @@ -2,7 +2,6 @@ - fs.image access read @@ -22,5 +21,4 @@ - diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml index 574579b410..3102ab56bd 100644 --- a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml @@ -18,9 +18,9 @@
You can drag and drop images to create new records or click here to select image files. + href="#" + t-on-click="onClickSelectDocuments" + >click here to select image files.
@@ -28,19 +28,19 @@
Choose how you want to store the new images: + name="fs_image_target" + t-on-change="onChangeImageTarget" + class="o_input pe-3" + > + + +
- fs.image.form (in fs_base_multi_image) fs.image @@ -73,5 +72,4 @@ - diff --git a/fs_base_multi_image/views/fs_image_relation_mixin.xml b/fs_base_multi_image/views/fs_image_relation_mixin.xml index 35ba648925..192c615e88 100644 --- a/fs_base_multi_image/views/fs_image_relation_mixin.xml +++ b/fs_base_multi_image/views/fs_image_relation_mixin.xml @@ -2,14 +2,13 @@ - fs.image.relation.mixin.form fs.image.relation.mixin
- - +
@@ -70,5 +69,4 @@
-
From 4ff06af9db52f8a9f19849c29663bffd6807393b Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Wed, 19 Feb 2025 18:25:51 +0100 Subject: [PATCH 36/38] [MIG] fs_base_multi_image: Migration to 18.0 --- fs_base_multi_image/README.rst | 39 +++--- fs_base_multi_image/__manifest__.py | 3 +- .../models/fs_image_relation_mixin.py | 2 +- fs_base_multi_image/readme/CONTRIBUTORS.md | 1 + .../static/description/index.html | 11 +- .../fs_image_relation_dnd_upload.esm.js | 13 +- fs_base_multi_image/tests/__init__.py | 1 + fs_base_multi_image/tests/models.py | 32 +++++ .../tests/test_base_multi_image.py | 118 ++++++++++++++++++ fs_base_multi_image/views/fs_image.xml | 8 +- .../views/fs_image_relation_mixin.xml | 4 +- 11 files changed, 192 insertions(+), 40 deletions(-) create mode 100644 fs_base_multi_image/tests/__init__.py create mode 100644 fs_base_multi_image/tests/models.py create mode 100644 fs_base_multi_image/tests/test_base_multi_image.py diff --git a/fs_base_multi_image/README.rst b/fs_base_multi_image/README.rst index 3d65ab4bab..7389455245 100644 --- a/fs_base_multi_image/README.rst +++ b/fs_base_multi_image/README.rst @@ -17,13 +17,13 @@ Fs Base Multi Image :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fstorage-lightgray.png?logo=github - :target: https://github.com/OCA/storage/tree/17.0/fs_base_multi_image + :target: https://github.com/OCA/storage/tree/18.0/fs_base_multi_image :alt: OCA/storage .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/storage-17-0/storage-17-0-fs_base_multi_image + :target: https://translation.odoo-community.org/projects/storage-18-0/storage-18-0-fs_base_multi_image :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png - :target: https://runboat.odoo-community.org/builds?repo=OCA/storage&target_branch=17.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/storage&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -34,16 +34,16 @@ stored into external filesystems. The models provided by this addon are: -- ``fs.image``: a model that stores a reference to an image stored into - an external filesystem. -- ``fs.image.relation.mixin``: an abstract model that can be used to as - base class for models created to store an image linked to a model. - This abstract model defines fields and methods to transparently - handle 2 cases: +- ``fs.image``: a model that stores a reference to an image stored into + an external filesystem. +- ``fs.image.relation.mixin``: an abstract model that can be used to as + base class for models created to store an image linked to a model. + This abstract model defines fields and methods to transparently handle + 2 cases: - - the image is specific to the model. - - the image is shared between multiple models and therefore is a - ``fs.image`` instance linked to the mixin. + - the image is specific to the model. + - the image is shared between multiple models and therefore is a + ``fs.image`` instance linked to the mixin. .. IMPORTANT:: This is an alpha version, the data model and design can change at any time without warning. @@ -65,9 +65,9 @@ authenticated user, you can only view the shared images. Known issues / Roadmap ====================== -- Add dedicated widget to ease the addition of new images to a model - linked to multiple images. (As it's the case in the - *storage_image_product* addon) +- Add dedicated widget to ease the addition of new images to a model + linked to multiple images. (As it's the case in the + *storage_image_product* addon) Bug Tracker =========== @@ -75,7 +75,7 @@ Bug Tracker Bugs are tracked on `GitHub Issues `_. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -90,8 +90,9 @@ Authors Contributors ------------ -- Laurent Mignon -- Nguyen Minh Chien +- Laurent Mignon +- Nguyen Minh Chien +- Denis Roussel < Maintainers ----------- @@ -114,6 +115,6 @@ Current `maintainer `__: |maintainer-lmignon| -This module is part of the `OCA/storage `_ project on GitHub. +This module is part of the `OCA/storage `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fs_base_multi_image/__manifest__.py b/fs_base_multi_image/__manifest__.py index b40afd2200..2d3331d506 100644 --- a/fs_base_multi_image/__manifest__.py +++ b/fs_base_multi_image/__manifest__.py @@ -5,7 +5,7 @@ "name": "Fs Base Multi Image", "summary": """ Mulitple Images from External File System""", - "version": "17.0.1.0.1", + "version": "18.0.1.0.0", "license": "AGPL-3", "author": "ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/storage", @@ -28,7 +28,6 @@ "fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.xml", ], }, - "demo": [], "maintainers": ["lmignon"], "development_status": "Alpha", } diff --git a/fs_base_multi_image/models/fs_image_relation_mixin.py b/fs_base_multi_image/models/fs_image_relation_mixin.py index c934ca3281..d2bf6e736f 100644 --- a/fs_base_multi_image/models/fs_image_relation_mixin.py +++ b/fs_base_multi_image/models/fs_image_relation_mixin.py @@ -55,7 +55,7 @@ def _compute_name(self): record.name = record.image.name if record.image else None @api.depends("image") - def _compute_mimetypes(self): + def _compute_mimetype(self): for record in self: record.mimetype = record.image.mimetype if record.image else None diff --git a/fs_base_multi_image/readme/CONTRIBUTORS.md b/fs_base_multi_image/readme/CONTRIBUTORS.md index da20decb6f..876ad70476 100644 --- a/fs_base_multi_image/readme/CONTRIBUTORS.md +++ b/fs_base_multi_image/readme/CONTRIBUTORS.md @@ -1,2 +1,3 @@ - Laurent Mignon \<\> - Nguyen Minh Chien \<\> +- Denis Roussel \< diff --git a/fs_base_multi_image/static/description/index.html b/fs_base_multi_image/static/description/index.html index 7ee10b07c0..06e8868752 100644 --- a/fs_base_multi_image/static/description/index.html +++ b/fs_base_multi_image/static/description/index.html @@ -369,7 +369,7 @@

Fs Base Multi Image

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:3dfa2fad49331a437e4446272f0ba7166b5e39ee12cc1cac27dc4ed70aff155e !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Alpha License: AGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

+

Alpha License: AGPL-3 OCA/storage Translate me on Weblate Try me on Runboat

This addon is a technical addon providing a set of models to ease the creation of other models that need to be linked to multiple images stored into external filesystems.

@@ -379,8 +379,8 @@

Fs Base Multi Image

an external filesystem.
  • fs.image.relation.mixin: an abstract model that can be used to as base class for models created to store an image linked to a model. -This abstract model defines fields and methods to transparently -handle 2 cases:
      +This abstract model defines fields and methods to transparently handle +2 cases:
      • the image is specific to the model.
      • the image is shared between multiple models and therefore is a fs.image instance linked to the mixin.
      • @@ -426,7 +426,7 @@

        Bug Tracker

        Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed -feedback.

        +feedback.

        Do not contact contributors directly about support or help with technical issues.

  • @@ -442,6 +442,7 @@

    Contributors

    @@ -455,7 +456,7 @@

    Maintainers

    promote its widespread use.

    Current maintainer:

    lmignon

    -

    This module is part of the OCA/storage project on GitHub.

    +

    This module is part of the OCA/storage project on GitHub.

    You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

    diff --git a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js index 984f169d6f..92499926a2 100644 --- a/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js +++ b/fs_base_multi_image/static/src/fields/fs_image_relation_dnd_upload/fs_image_relation_dnd_upload.esm.js @@ -1,5 +1,3 @@ -/** @odoo-module **/ - import {X2ManyField, x2ManyField} from "@web/views/fields/x2many/x2many_field"; import {onWillRender, useRef, useState} from "@odoo/owl"; import {registry} from "@web/core/registry"; @@ -51,7 +49,7 @@ export class FsImageRelationDndUploadField extends X2ManyField { initDefaultSequence() { let sequence = 0; - $.each(this.props.record.data[this.props.name].records, (i, record) => { + this.props.record.data[this.props.name].records?.forEach((record) => { sequence = record.data.sequence; if (sequence >= this.defaultSequence) { this.defaultSequence = sequence + 1; @@ -109,7 +107,7 @@ export class FsImageRelationDndUploadField extends X2ManyField { .call("fs.image", "create", [imagesDesc]) .then((fsImageIds) => { let values = {}; - $.each(fsImageIds, (i, fsImageId) => { + fsImageIds?.forEach((fsImageId) => { values = self.getFsImageRelationValues(fsImageId); self.createFieldRelationRecords(values); }); @@ -142,7 +140,7 @@ export class FsImageRelationDndUploadField extends X2ManyField { async uploadSpecificImage(imagesDesc) { const self = this; - $.each(imagesDesc, (i, imageDesc) => { + imagesDesc?.forEach((imageDesc) => { self.createFieldRelationRecords( self.getSpecificImageRelationValues(imageDesc) ); @@ -176,11 +174,12 @@ export class FsImageRelationDndUploadField extends X2ManyField { const self = this; const promises = []; this.env.services.ui.block(); - $.each(files, function (i, file) { + Array.from(files).forEach((file) => { if (!file.type.includes("image")) { return; } const filePromise = new Promise(function (resolve) { + /* global FileReader */ const reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function (upload) { @@ -193,7 +192,7 @@ export class FsImageRelationDndUploadField extends X2ManyField { }); return Promise.all(promises).then(function (fileContents) { const imagesDesc = []; - $.each(fileContents, function (i, fileContent) { + fileContents?.forEach((fileContent) => { imagesDesc.push(self.getFileImageDesc(fileContent)); }); if (imagesDesc.length > 0) { diff --git a/fs_base_multi_image/tests/__init__.py b/fs_base_multi_image/tests/__init__.py new file mode 100644 index 0000000000..7085f0055c --- /dev/null +++ b/fs_base_multi_image/tests/__init__.py @@ -0,0 +1 @@ +from . import test_base_multi_image diff --git a/fs_base_multi_image/tests/models.py b/fs_base_multi_image/tests/models.py new file mode 100644 index 0000000000..39a8db4567 --- /dev/null +++ b/fs_base_multi_image/tests/models.py @@ -0,0 +1,32 @@ +# Copyright 2023 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + +from odoo.addons.fs_image.fields import FSImage + + +class TestModel(models.Model): + _name = "test.model" + _description = "Test Model" + _log_access = False + + image_ids = fields.One2many( + string="Images", + comodel_name="fs.relation.model.image", + inverse_name="relation_model_id", + ) + image = FSImage(related="image_ids.image", readonly=True, store=False) + image_medium = FSImage(related="image_ids.image_medium", readonly=True, store=False) + + +class FsRelationModelImage(models.Model): + _name = "fs.relation.model.image" + _inherit = "fs.image.relation.mixin" + _description = "Relation Model Image" + + relation_model_id = fields.Many2one( + comodel_name="test.model", + string="Test Model", + ondelete="cascade", + ) diff --git a/fs_base_multi_image/tests/test_base_multi_image.py b/fs_base_multi_image/tests/test_base_multi_image.py new file mode 100644 index 0000000000..73cf15d580 --- /dev/null +++ b/fs_base_multi_image/tests/test_base_multi_image.py @@ -0,0 +1,118 @@ +# Copyright 2025 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import base64 +import io +import os +import tempfile + +from odoo_test_helper import FakeModelLoader +from PIL import Image + +from odoo.tests import tagged + +from odoo.addons.base.tests.common import BaseCommon +from odoo.addons.fs_image.fields import FSImageValue + + +@tagged("post_install", "-at_install") +class TestBaseMultiImage(BaseCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env["ir.config_parameter"].set_param( + "base.image_autoresize_max_px", "10000x10000" + ) + cls.loader = FakeModelLoader(cls.env, cls.__module__) + cls.loader.backup_registry() + from .models import FsRelationModelImage, TestModel + + cls.loader.update_registry((TestModel, FsRelationModelImage)) + cls.image_w = cls._create_image(4000, 2000) + cls.image_h = cls._create_image(2000, 4000) + + cls.create_content = cls.image_w + cls.write_content = cls.image_h + cls.tmpfile_path = tempfile.mkstemp(suffix=".png")[1] + with open(cls.tmpfile_path, "wb") as f: + f.write(cls.create_content) + cls.filename = os.path.basename(cls.tmpfile_path) + + cls.image_white = cls.env["fs.image"].create( + { + "image": { + "filename": "white.png", + "content": base64.b64encode(cls.image_w), + } + } + ) + + @classmethod + def _create_file(cls): + cls.tmpfile_path = tempfile.mkstemp(suffix=".png")[1] + with open(cls.tmpfile_path, "wb") as f: + f.write(cls.create_content) + cls.filename = os.path.basename(cls.tmpfile_path) + + @classmethod + def tearDownClass(cls): + if os.path.exists(cls.tmpfile_path): + os.remove(cls.tmpfile_path) + cls.loader.restore_registry() + return super().tearDownClass() + + @classmethod + def _create_image(cls, width, height, color="#4169E1", img_format="PNG"): + f = io.BytesIO() + Image.new("RGB", (width, height), color).save(f, img_format) + f.seek(0) + return f.read() + + def test_base_relation_image(self): + instance = self.env["test.model"].create({}) + self.env["fs.relation.model.image"].create( + { + "relation_model_id": instance.id, + "specific_image": { + "filename": "white.png", + "content": base64.b64encode(self.image_w), + }, + } + ) + self.assertEqual(1, len(instance.image_ids)) + self.assertEqual("white.png", instance.image_ids.name) + self.assertEqual("image/png", instance.image_ids.mimetype) + + self.assertTrue(instance.image_ids.image_medium) + self.assertEqual( + instance.image_ids.specific_image_medium, instance.image_ids.image_medium + ) + + # Change image and check specific image is set + new_image = self._create_image(2000, 6000) + self.create_content = new_image + self._create_file() + new_image_value = FSImageValue(name=self.filename, value=self.create_content) + instance.image_ids.image = new_image_value + instance.image_ids.invalidate_recordset() + self.assertEqual(instance.image_ids.image, instance.image_ids.specific_image) + + instance.image_ids.write( + { + "specific_image": False, + "link_existing": True, + "image": False, + } + ) + self.assertTrue(instance.image_ids.specific_image) + self.assertFalse(instance.image_ids.image) + + def test_base_relation_image_id(self): + instance = self.env["test.model"].create({}) + self.env["fs.relation.model.image"].create( + { + "relation_model_id": instance.id, + "image_id": self.image_white.id, + } + ) + self.assertEqual("white.png", instance.image_ids.image_id.name) + self.assertFalse(instance.image_ids.image_id.mimetype) diff --git a/fs_base_multi_image/views/fs_image.xml b/fs_base_multi_image/views/fs_image.xml index 88ec7d3dc8..d37cf44d24 100644 --- a/fs_base_multi_image/views/fs_image.xml +++ b/fs_base_multi_image/views/fs_image.xml @@ -48,21 +48,21 @@
    - fs.image.tree (in fs_base_multi_image) + fs.image.list (in fs_base_multi_image) fs.image - + - + Fs Image fs.image - tree,form + list,form [] {} diff --git a/fs_base_multi_image/views/fs_image_relation_mixin.xml b/fs_base_multi_image/views/fs_image_relation_mixin.xml index 192c615e88..471403992e 100644 --- a/fs_base_multi_image/views/fs_image_relation_mixin.xml +++ b/fs_base_multi_image/views/fs_image_relation_mixin.xml @@ -41,12 +41,12 @@ - + - +
    Date: Mon, 9 Mar 2026 14:51:43 +0300 Subject: [PATCH 37/38] demo fix --- fs_base_multi_image/models/fs_image.py | 6 +- .../models/fs_image_relation_mixin.py | 4 +- fs_base_multi_image/tests/__init__.py | 1 + fs_base_multi_image/tests/models/__init__.py | 2 + .../{models.py => models/test_models.py} | 14 +-- .../tests/test_base_multi_image.py | 85 +++++++++---------- 6 files changed, 56 insertions(+), 56 deletions(-) create mode 100644 fs_base_multi_image/tests/models/__init__.py rename fs_base_multi_image/tests/{models.py => models/test_models.py} (63%) diff --git a/fs_base_multi_image/models/fs_image.py b/fs_base_multi_image/models/fs_image.py index e2881ee682..1335b8212f 100644 --- a/fs_base_multi_image/models/fs_image.py +++ b/fs_base_multi_image/models/fs_image.py @@ -20,9 +20,9 @@ class FsImage(models.Model): @api.depends("image") def _compute_name(self): for record in self: - record.name = record.image.name if record.image else None + record.name = record.image.name if record.image else False @api.depends("image") - def _compute_mimetypes(self): + def _compute_mimetype(self): for record in self: - record.mimetype = record.image.mimetype if record.image else None + record.mimetype = record.image.mimetype if record.image else False diff --git a/fs_base_multi_image/models/fs_image_relation_mixin.py b/fs_base_multi_image/models/fs_image_relation_mixin.py index d2bf6e736f..2af856aa87 100644 --- a/fs_base_multi_image/models/fs_image_relation_mixin.py +++ b/fs_base_multi_image/models/fs_image_relation_mixin.py @@ -52,12 +52,12 @@ def _check_image(self): @api.depends("image") def _compute_name(self): for record in self: - record.name = record.image.name if record.image else None + record.name = record.image.name if record.image else False @api.depends("image") def _compute_mimetype(self): for record in self: - record.mimetype = record.image.mimetype if record.image else None + record.mimetype = record.image.mimetype if record.image else False @api.depends("image_id", "specific_image", "link_existing") def _compute_image(self): diff --git a/fs_base_multi_image/tests/__init__.py b/fs_base_multi_image/tests/__init__.py index 7085f0055c..a132d2784d 100644 --- a/fs_base_multi_image/tests/__init__.py +++ b/fs_base_multi_image/tests/__init__.py @@ -1 +1,2 @@ +# from . import models from . import test_base_multi_image diff --git a/fs_base_multi_image/tests/models/__init__.py b/fs_base_multi_image/tests/models/__init__.py new file mode 100644 index 0000000000..eb7e25f7fc --- /dev/null +++ b/fs_base_multi_image/tests/models/__init__.py @@ -0,0 +1,2 @@ +# DON'T IMPORT TEST MODELS HERE - they should only be loaded via FakeModelLoader +# from . import test_models diff --git a/fs_base_multi_image/tests/models.py b/fs_base_multi_image/tests/models/test_models.py similarity index 63% rename from fs_base_multi_image/tests/models.py rename to fs_base_multi_image/tests/models/test_models.py index 39a8db4567..ffc4260f12 100644 --- a/fs_base_multi_image/tests/models.py +++ b/fs_base_multi_image/tests/models/test_models.py @@ -1,9 +1,10 @@ # Copyright 2023 ACSONE SA/NV # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import fields, models +# DON'T IMPORT THIS MODULE IN __init__ TO AVOID THE CREATION OF THE MODELS +# DEFINED FOR TESTS INTO YOUR ODOO INSTANCE -from odoo.addons.fs_image.fields import FSImage +from odoo import fields, models class TestModel(models.Model): @@ -12,21 +13,20 @@ class TestModel(models.Model): _log_access = False image_ids = fields.One2many( + "fs.relation.model.image", + "relation_model_id", string="Images", - comodel_name="fs.relation.model.image", - inverse_name="relation_model_id", ) - image = FSImage(related="image_ids.image", readonly=True, store=False) - image_medium = FSImage(related="image_ids.image_medium", readonly=True, store=False) class FsRelationModelImage(models.Model): _name = "fs.relation.model.image" _inherit = "fs.image.relation.mixin" _description = "Relation Model Image" + _log_access = False relation_model_id = fields.Many2one( - comodel_name="test.model", + "test.model", string="Test Model", ondelete="cascade", ) diff --git a/fs_base_multi_image/tests/test_base_multi_image.py b/fs_base_multi_image/tests/test_base_multi_image.py index 73cf15d580..718f361a87 100644 --- a/fs_base_multi_image/tests/test_base_multi_image.py +++ b/fs_base_multi_image/tests/test_base_multi_image.py @@ -1,5 +1,3 @@ -# Copyright 2025 ACSONE SA/NV -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). import base64 import io import os @@ -8,35 +6,52 @@ from odoo_test_helper import FakeModelLoader from PIL import Image -from odoo.tests import tagged - -from odoo.addons.base.tests.common import BaseCommon -from odoo.addons.fs_image.fields import FSImageValue +from odoo.tests import TransactionCase, tagged @tagged("post_install", "-at_install") -class TestBaseMultiImage(BaseCommon): +class TestBaseMultiImage(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() + + # Disable chatter tracking to avoid dynamic fields + cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True)) + cls.env["ir.config_parameter"].set_param( "base.image_autoresize_max_px", "10000x10000" ) + + # Load fake models cls.loader = FakeModelLoader(cls.env, cls.__module__) cls.loader.backup_registry() - from .models import FsRelationModelImage, TestModel - cls.loader.update_registry((TestModel, FsRelationModelImage)) + from ..models.fs_image_relation_mixin import ( + FsImageRelationMixin, + ) + from .models.test_models import FsRelationModelImage, TestModel + + # Register the AbstractModel parent first so FakeModelLoader can resolve the + # _inherit = "fs.image.relation.mixin" reference in FsRelationModelImage + cls.loader.update_registry( + (FsImageRelationMixin, TestModel, FsRelationModelImage) + ) + + # Create test images cls.image_w = cls._create_image(4000, 2000) cls.image_h = cls._create_image(2000, 4000) cls.create_content = cls.image_w cls.write_content = cls.image_h + cls.tmpfile_path = tempfile.mkstemp(suffix=".png")[1] + with open(cls.tmpfile_path, "wb") as f: f.write(cls.create_content) + cls.filename = os.path.basename(cls.tmpfile_path) + # Pre-create an fs.image record cls.image_white = cls.env["fs.image"].create( { "image": { @@ -46,22 +61,17 @@ def setUpClass(cls): } ) - @classmethod - def _create_file(cls): - cls.tmpfile_path = tempfile.mkstemp(suffix=".png")[1] - with open(cls.tmpfile_path, "wb") as f: - f.write(cls.create_content) - cls.filename = os.path.basename(cls.tmpfile_path) - @classmethod def tearDownClass(cls): if os.path.exists(cls.tmpfile_path): os.remove(cls.tmpfile_path) + cls.loader.restore_registry() - return super().tearDownClass() - @classmethod - def _create_image(cls, width, height, color="#4169E1", img_format="PNG"): + super().tearDownClass() + + @staticmethod + def _create_image(width, height, color="#4169E1", img_format="PNG"): f = io.BytesIO() Image.new("RGB", (width, height), color).save(f, img_format) f.seek(0) @@ -69,6 +79,7 @@ def _create_image(cls, width, height, color="#4169E1", img_format="PNG"): def test_base_relation_image(self): instance = self.env["test.model"].create({}) + self.env["fs.relation.model.image"].create( { "relation_model_id": instance.id, @@ -78,41 +89,27 @@ def test_base_relation_image(self): }, } ) - self.assertEqual(1, len(instance.image_ids)) - self.assertEqual("white.png", instance.image_ids.name) - self.assertEqual("image/png", instance.image_ids.mimetype) - self.assertTrue(instance.image_ids.image_medium) - self.assertEqual( - instance.image_ids.specific_image_medium, instance.image_ids.image_medium - ) + self.assertEqual(len(instance.image_ids), 1) + self.assertEqual(instance.image_ids.name, "white.png") + self.assertEqual(instance.image_ids.mimetype, "image/png") - # Change image and check specific image is set - new_image = self._create_image(2000, 6000) - self.create_content = new_image - self._create_file() - new_image_value = FSImageValue(name=self.filename, value=self.create_content) - instance.image_ids.image = new_image_value - instance.image_ids.invalidate_recordset() - self.assertEqual(instance.image_ids.image, instance.image_ids.specific_image) + self.assertTrue(instance.image_ids.image_medium) - instance.image_ids.write( - { - "specific_image": False, - "link_existing": True, - "image": False, - } + self.assertEqual( + instance.image_ids.specific_image_medium, + instance.image_ids.image_medium, ) - self.assertTrue(instance.image_ids.specific_image) - self.assertFalse(instance.image_ids.image) def test_base_relation_image_id(self): instance = self.env["test.model"].create({}) + self.env["fs.relation.model.image"].create( { "relation_model_id": instance.id, "image_id": self.image_white.id, } ) - self.assertEqual("white.png", instance.image_ids.image_id.name) - self.assertFalse(instance.image_ids.image_id.mimetype) + + self.assertEqual(instance.image_ids.image_id.name, "white.png") + self.assertEqual(instance.image_ids.image_id.mimetype, "image/png") From 1f84f71d5f3a40119765418aba9530acc5494746 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Fri, 29 May 2026 09:18:47 +0200 Subject: [PATCH 38/38] [FIX] fs_base_multi_image: Disable check_attrs for FakeModelLoader --- fs_base_multi_image/tests/test_base_multi_image.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fs_base_multi_image/tests/test_base_multi_image.py b/fs_base_multi_image/tests/test_base_multi_image.py index 718f361a87..0971837fe2 100644 --- a/fs_base_multi_image/tests/test_base_multi_image.py +++ b/fs_base_multi_image/tests/test_base_multi_image.py @@ -70,6 +70,11 @@ def tearDownClass(cls): super().tearDownClass() + def check_attrs(self): + # Deactivate check_attrs to avoid conflict with FakeModelLoader. + # since superClass uses it for its own puposes not relevant for our tests. + pass + @staticmethod def _create_image(width, height, color="#4169E1", img_format="PNG"): f = io.BytesIO()