From 817145768039c565e7ec07adb20141939eeb4fd4 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Tue, 6 Aug 2019 11:15:28 +0200 Subject: [PATCH 01/23] [12.0][ADD] attachment_category --- attachment_category/README.rst | 78 ++++ attachment_category/__init__.py | 1 + attachment_category/__manifest__.py | 19 + attachment_category/models/__init__.py | 2 + attachment_category/models/ir_attachment.py | 18 + .../models/ir_attachment_category.py | 62 +++ attachment_category/readme/CONTRIBUTORS.rst | 1 + attachment_category/readme/DESCRIPTION.rst | 1 + attachment_category/readme/USAGE.rst | 1 + .../security/ir_attachment_category.xml | 17 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 426 ++++++++++++++++++ attachment_category/views/ir_attachment.xml | 40 ++ .../views/ir_attachment_category.xml | 71 +++ 14 files changed, 737 insertions(+) create mode 100644 attachment_category/README.rst create mode 100644 attachment_category/__init__.py create mode 100644 attachment_category/__manifest__.py create mode 100644 attachment_category/models/__init__.py create mode 100644 attachment_category/models/ir_attachment.py create mode 100644 attachment_category/models/ir_attachment_category.py create mode 100644 attachment_category/readme/CONTRIBUTORS.rst create mode 100644 attachment_category/readme/DESCRIPTION.rst create mode 100644 attachment_category/readme/USAGE.rst create mode 100644 attachment_category/security/ir_attachment_category.xml create mode 100644 attachment_category/static/description/icon.png create mode 100644 attachment_category/static/description/index.html create mode 100644 attachment_category/views/ir_attachment.xml create mode 100644 attachment_category/views/ir_attachment_category.xml diff --git a/attachment_category/README.rst b/attachment_category/README.rst new file mode 100644 index 00000000000..257d8e1f946 --- /dev/null +++ b/attachment_category/README.rst @@ -0,0 +1,78 @@ +================== +Atachment Category +================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |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%2Fknowledge-lightgray.png?logo=github + :target: https://github.com/OCA/knowledge/tree/12.0/attachment_category + :alt: OCA/knowledge +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/knowledge-12-0/knowledge-12-0-attachment_category + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/118/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module adds a document category to help classification. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +* Go to Attachments, and set categories as tags. + +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 smashing 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 +~~~~~~~~~~~~ + +* Denis Roussel + +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. + +This module is part of the `OCA/knowledge `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/attachment_category/__init__.py b/attachment_category/__init__.py new file mode 100644 index 00000000000..0650744f6bc --- /dev/null +++ b/attachment_category/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/attachment_category/__manifest__.py b/attachment_category/__manifest__.py new file mode 100644 index 00000000000..36976887e89 --- /dev/null +++ b/attachment_category/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + 'name': 'Atachment Category', + 'summary': """ + Adds a document category to help classification""", + 'version': '12.0.1.0.0', + 'license': 'AGPL-3', + 'author': 'ACSONE SA/NV,Odoo Community Association (OCA)', + 'depends': [ + "base", + ], + 'data': [ + 'views/ir_attachment.xml', + 'security/ir_attachment_category.xml', + 'views/ir_attachment_category.xml', + ], +} diff --git a/attachment_category/models/__init__.py b/attachment_category/models/__init__.py new file mode 100644 index 00000000000..6858a37c7f8 --- /dev/null +++ b/attachment_category/models/__init__.py @@ -0,0 +1,2 @@ +from . import ir_attachment_category +from . import ir_attachment diff --git a/attachment_category/models/ir_attachment.py b/attachment_category/models/ir_attachment.py new file mode 100644 index 00000000000..0251d80c09d --- /dev/null +++ b/attachment_category/models/ir_attachment.py @@ -0,0 +1,18 @@ +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class IrAttachment(models.Model): + + _inherit = 'ir.attachment' + + category_ids = fields.Many2many( + comodel_name="ir.attachment.category", + relation="ir_attachment_category_rel", + column1="attachment_id", + column2="category_id", + ondelete="restrict", + index=True, + ) diff --git a/attachment_category/models/ir_attachment_category.py b/attachment_category/models/ir_attachment_category.py new file mode 100644 index 00000000000..da1c392d437 --- /dev/null +++ b/attachment_category/models/ir_attachment_category.py @@ -0,0 +1,62 @@ +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class IrAttachmentCategory(models.Model): + + _name = 'ir.attachment.category' + _description = 'Attachment Category' + _parent_store = True + + name = fields.Char() + display_name = fields.Char( + compute="_compute_display_name", + store=True, + ) + parent_id = fields.Many2one( + "ir.attachment.category", + ) + parent_path = fields.Char(index=True) + attachment_ids = fields.Many2many( + compute="_compute_attachment_count", + comodel_name="ir.attachment" + ) + attachment_count = fields.Integer( + compute="_compute_attachment_count", + ) + + @api.depends('name', 'parent_id.display_name') + def _compute_display_name(self): + """ + + :return: + """ + for category in self: + if category.parent_id.display_name: + category.display_name = '%s/%s' % ( + category.parent_id.display_name, category.name) + else: + category.display_name = category.name + + @api.depends() + def _compute_attachment_count(self): + category_obj = self.env["ir.attachment.category"] + attachment_obj = self.env["ir.attachment"] + for category in self: + child_categories = category_obj.search([ + ("id", "child_of", category.id)]) + attachment_ids = attachment_obj.search([ + ("category_ids", "in", child_categories.ids)]) + category.attachment_ids = attachment_ids + category.attachment_count = len(attachment_ids) + + def action_attachment_view(self): + self.ensure_one() + action = self.env.ref('base.action_attachment').read()[0] + action["domain"] = [("category_ids", "child_of", self.id)] + context = self.env.context.copy() + context.update({"default_category_ids": [self.id]}) + action["context"] = context + return action diff --git a/attachment_category/readme/CONTRIBUTORS.rst b/attachment_category/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000000..9179ee4b8fa --- /dev/null +++ b/attachment_category/readme/CONTRIBUTORS.rst @@ -0,0 +1 @@ +* Denis Roussel diff --git a/attachment_category/readme/DESCRIPTION.rst b/attachment_category/readme/DESCRIPTION.rst new file mode 100644 index 00000000000..60554088563 --- /dev/null +++ b/attachment_category/readme/DESCRIPTION.rst @@ -0,0 +1 @@ +This module adds a document category to help classification. diff --git a/attachment_category/readme/USAGE.rst b/attachment_category/readme/USAGE.rst new file mode 100644 index 00000000000..2ca9eb6c3b1 --- /dev/null +++ b/attachment_category/readme/USAGE.rst @@ -0,0 +1 @@ +* Go to Attachments, and set categories as tags. diff --git a/attachment_category/security/ir_attachment_category.xml b/attachment_category/security/ir_attachment_category.xml new file mode 100644 index 00000000000..ba18907c327 --- /dev/null +++ b/attachment_category/security/ir_attachment_category.xml @@ -0,0 +1,17 @@ + + + + + + + Attachment Category User + + + + + + + + + diff --git a/attachment_category/static/description/icon.png b/attachment_category/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 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/attachment_category/static/description/index.html b/attachment_category/static/description/index.html new file mode 100644 index 00000000000..e8bb87d07f8 --- /dev/null +++ b/attachment_category/static/description/index.html @@ -0,0 +1,426 @@ + + + + + + +Atachment Category + + + +
+

Atachment Category

+ + +

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runbot

+

This module adds a document category to help classification.

+

Table of contents

+ +
+

Usage

+
    +
  • Go to Attachments, and set categories as tags.
  • +
+
+
+

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 smashing 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.

+

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

+

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

+
+
+
+ + diff --git a/attachment_category/views/ir_attachment.xml b/attachment_category/views/ir_attachment.xml new file mode 100644 index 00000000000..43b78b0a4d2 --- /dev/null +++ b/attachment_category/views/ir_attachment.xml @@ -0,0 +1,40 @@ + + + + + + + ir.attachment.form (in attachment_category) + ir.attachment + + + + + + + + + + ir.attachment.search (in attachment_category) + ir.attachment + + + + + + + + + + ir.attachment.tree (in attachment_category) + ir.attachment + + + + + + + + + diff --git a/attachment_category/views/ir_attachment_category.xml b/attachment_category/views/ir_attachment_category.xml new file mode 100644 index 00000000000..3392a33030d --- /dev/null +++ b/attachment_category/views/ir_attachment_category.xml @@ -0,0 +1,71 @@ + + + + + + + ir.attachment.category.form (in document_category) + ir.attachment.category + +
+
+ +
+ +
+ +
+ + + + +
+
+
+
+ + + ir.attachment.category.search (in document_category) + ir.attachment.category + + + + + + + + + ir.attachment.category.tree (in document_category) + ir.attachment.category + + + + + + + + + Attachment Categories + ir.attachment.category + tree,form + +

+ Create a new document +

+

+ Also you will find here all the related document categories. +

+
+
+ + + Attachment Categories + + + + + +
From a133da614ad7c93c10c51cb0361ea740d259d155 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Sun, 18 Oct 2020 14:59:51 +0200 Subject: [PATCH 02/23] [IMP] : black, isort, prettier --- attachment_category/__manifest__.py | 22 +++++----- attachment_category/models/ir_attachment.py | 2 +- .../models/ir_attachment_category.py | 38 ++++++++---------- .../security/ir_attachment_category.xml | 17 ++++---- attachment_category/views/ir_attachment.xml | 19 ++++----- .../views/ir_attachment_category.xml | 40 +++++++++---------- 6 files changed, 60 insertions(+), 78 deletions(-) diff --git a/attachment_category/__manifest__.py b/attachment_category/__manifest__.py index 36976887e89..54b7f3760e3 100644 --- a/attachment_category/__manifest__.py +++ b/attachment_category/__manifest__.py @@ -2,18 +2,16 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). { - 'name': 'Atachment Category', - 'summary': """ + "name": "Atachment Category", + "summary": """ Adds a document category to help classification""", - 'version': '12.0.1.0.0', - 'license': 'AGPL-3', - 'author': 'ACSONE SA/NV,Odoo Community Association (OCA)', - 'depends': [ - "base", - ], - 'data': [ - 'views/ir_attachment.xml', - 'security/ir_attachment_category.xml', - 'views/ir_attachment_category.xml', + "version": "12.0.1.0.0", + "license": "AGPL-3", + "author": "ACSONE SA/NV,Odoo Community Association (OCA)", + "depends": ["base",], + "data": [ + "views/ir_attachment.xml", + "security/ir_attachment_category.xml", + "views/ir_attachment_category.xml", ], } diff --git a/attachment_category/models/ir_attachment.py b/attachment_category/models/ir_attachment.py index 0251d80c09d..5c6f144f196 100644 --- a/attachment_category/models/ir_attachment.py +++ b/attachment_category/models/ir_attachment.py @@ -6,7 +6,7 @@ class IrAttachment(models.Model): - _inherit = 'ir.attachment' + _inherit = "ir.attachment" category_ids = fields.Many2many( comodel_name="ir.attachment.category", diff --git a/attachment_category/models/ir_attachment_category.py b/attachment_category/models/ir_attachment_category.py index da1c392d437..dea599987b8 100644 --- a/attachment_category/models/ir_attachment_category.py +++ b/attachment_category/models/ir_attachment_category.py @@ -6,28 +6,20 @@ class IrAttachmentCategory(models.Model): - _name = 'ir.attachment.category' - _description = 'Attachment Category' + _name = "ir.attachment.category" + _description = "Attachment Category" _parent_store = True name = fields.Char() - display_name = fields.Char( - compute="_compute_display_name", - store=True, - ) - parent_id = fields.Many2one( - "ir.attachment.category", - ) + display_name = fields.Char(compute="_compute_display_name", store=True,) + parent_id = fields.Many2one("ir.attachment.category",) parent_path = fields.Char(index=True) attachment_ids = fields.Many2many( - compute="_compute_attachment_count", - comodel_name="ir.attachment" - ) - attachment_count = fields.Integer( - compute="_compute_attachment_count", + compute="_compute_attachment_count", comodel_name="ir.attachment" ) + attachment_count = fields.Integer(compute="_compute_attachment_count",) - @api.depends('name', 'parent_id.display_name') + @api.depends("name", "parent_id.display_name") def _compute_display_name(self): """ @@ -35,8 +27,10 @@ def _compute_display_name(self): """ for category in self: if category.parent_id.display_name: - category.display_name = '%s/%s' % ( - category.parent_id.display_name, category.name) + category.display_name = "{}/{}".format( + category.parent_id.display_name, + category.name, + ) else: category.display_name = category.name @@ -45,16 +39,16 @@ def _compute_attachment_count(self): category_obj = self.env["ir.attachment.category"] attachment_obj = self.env["ir.attachment"] for category in self: - child_categories = category_obj.search([ - ("id", "child_of", category.id)]) - attachment_ids = attachment_obj.search([ - ("category_ids", "in", child_categories.ids)]) + child_categories = category_obj.search([("id", "child_of", category.id)]) + attachment_ids = attachment_obj.search( + [("category_ids", "in", child_categories.ids)] + ) category.attachment_ids = attachment_ids category.attachment_count = len(attachment_ids) def action_attachment_view(self): self.ensure_one() - action = self.env.ref('base.action_attachment').read()[0] + action = self.env.ref("base.action_attachment").read()[0] action["domain"] = [("category_ids", "child_of", self.id)] context = self.env.context.copy() context.update({"default_category_ids": [self.id]}) diff --git a/attachment_category/security/ir_attachment_category.xml b/attachment_category/security/ir_attachment_category.xml index ba18907c327..354d0f546c9 100644 --- a/attachment_category/security/ir_attachment_category.xml +++ b/attachment_category/security/ir_attachment_category.xml @@ -1,17 +1,14 @@ - + - - Attachment Category User - - - - - - + + + + + + - diff --git a/attachment_category/views/ir_attachment.xml b/attachment_category/views/ir_attachment.xml index 43b78b0a4d2..c61f047a562 100644 --- a/attachment_category/views/ir_attachment.xml +++ b/attachment_category/views/ir_attachment.xml @@ -1,40 +1,35 @@ - + - - ir.attachment.form (in attachment_category) ir.attachment - + - + - ir.attachment.search (in attachment_category) ir.attachment - + - + - ir.attachment.tree (in attachment_category) ir.attachment - + - + - diff --git a/attachment_category/views/ir_attachment_category.xml b/attachment_category/views/ir_attachment_category.xml index 3392a33030d..371355295af 100644 --- a/attachment_category/views/ir_attachment_category.xml +++ b/attachment_category/views/ir_attachment_category.xml @@ -1,9 +1,7 @@ - + - - ir.attachment.category.form (in document_category) ir.attachment.category @@ -13,59 +11,59 @@ -
-
- - + +
- ir.attachment.category.search (in document_category) ir.attachment.category - + - ir.attachment.category.tree (in document_category) ir.attachment.category - + - Attachment Categories ir.attachment.category tree,form -

+

Create a new document

-

+

Also you will find here all the related document categories.

-
+
- Attachment Categories - - - + + + -
From 7259bb1aa1688bcef9c98b9e45e4aae527130fb5 Mon Sep 17 00:00:00 2001 From: Denis Roussel Date: Thu, 27 Feb 2020 16:16:20 +0100 Subject: [PATCH 03/23] [13.0][MIG] attachment_category" --- attachment_category/README.rst | 10 +++++----- attachment_category/__manifest__.py | 4 ++-- attachment_category/models/ir_attachment_category.py | 3 +-- attachment_category/static/description/index.html | 8 ++++---- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/attachment_category/README.rst b/attachment_category/README.rst index 257d8e1f946..14af0a2f9bd 100644 --- a/attachment_category/README.rst +++ b/attachment_category/README.rst @@ -14,13 +14,13 @@ Atachment Category :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fknowledge-lightgray.png?logo=github - :target: https://github.com/OCA/knowledge/tree/12.0/attachment_category + :target: https://github.com/OCA/knowledge/tree/13.0/attachment_category :alt: OCA/knowledge .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/knowledge-12-0/knowledge-12-0-attachment_category + :target: https://translation.odoo-community.org/projects/knowledge-13-0/knowledge-13-0-attachment_category :alt: Translate me on Weblate .. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/118/12.0 + :target: https://runbot.odoo-community.org/runbot/118/13.0 :alt: Try me on Runbot |badge1| |badge2| |badge3| |badge4| |badge5| @@ -43,7 +43,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 smashing it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -73,6 +73,6 @@ 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. -This module is part of the `OCA/knowledge `_ project on GitHub. +This module is part of the `OCA/knowledge `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/attachment_category/__manifest__.py b/attachment_category/__manifest__.py index 54b7f3760e3..5a09a1171bc 100644 --- a/attachment_category/__manifest__.py +++ b/attachment_category/__manifest__.py @@ -5,10 +5,10 @@ "name": "Atachment Category", "summary": """ Adds a document category to help classification""", - "version": "12.0.1.0.0", + "version": "13.0.1.0.0", "license": "AGPL-3", "author": "ACSONE SA/NV,Odoo Community Association (OCA)", - "depends": ["base",], + "depends": ["base"], "data": [ "views/ir_attachment.xml", "security/ir_attachment_category.xml", diff --git a/attachment_category/models/ir_attachment_category.py b/attachment_category/models/ir_attachment_category.py index dea599987b8..e2671fe0c0b 100644 --- a/attachment_category/models/ir_attachment_category.py +++ b/attachment_category/models/ir_attachment_category.py @@ -28,8 +28,7 @@ def _compute_display_name(self): for category in self: if category.parent_id.display_name: category.display_name = "{}/{}".format( - category.parent_id.display_name, - category.name, + category.parent_id.display_name, category.name, ) else: category.display_name = category.name diff --git a/attachment_category/static/description/index.html b/attachment_category/static/description/index.html index e8bb87d07f8..f6e343da714 100644 --- a/attachment_category/static/description/index.html +++ b/attachment_category/static/description/index.html @@ -3,7 +3,7 @@ - + Atachment Category -
-

Atachment Category

+
+ + +Odoo Community Association + +
+

Atachment Category

-

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/knowledge Translate me on Weblate Try me on Runboat

This module adds a document category to help classification.

Table of contents

@@ -385,35 +390,35 @@

Atachment Category

-

Usage

+

Usage

  • Go to Attachments, and set categories as tags.
-

Bug Tracker

+

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.

-

Credits

+

Credits

-

Authors

+

Authors

  • ACSONE SA/NV
-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -421,10 +426,11 @@

Maintainers

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.

-

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

+

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

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

+
diff --git a/attachment_category/tests/__init__.py b/attachment_category/tests/__init__.py new file mode 100644 index 00000000000..8bcdd522175 --- /dev/null +++ b/attachment_category/tests/__init__.py @@ -0,0 +1 @@ +from . import test_attachment_category diff --git a/attachment_category/tests/test_attachment_category.py b/attachment_category/tests/test_attachment_category.py new file mode 100644 index 00000000000..bb52724afa3 --- /dev/null +++ b/attachment_category/tests/test_attachment_category.py @@ -0,0 +1,85 @@ +# Copyright 2020 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo.tests.common import TransactionCase + + +class TestAttachmentCategory(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.category_model = cls.env["ir.attachment.category"] + cls.attachment_model = cls.env["ir.attachment"] + + # Create Categories + cls.parent_category = cls.category_model.create({"name": "Parent Category"}) + cls.child_category = cls.category_model.create( + { + "name": "Child Category", + "parent_id": cls.parent_category.id, + } + ) + + # Create Attachments + cls.attachment_1 = cls.attachment_model.create( + { + "name": "Attachment 1", + "datas": b"R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=", + "category_ids": [(4, cls.parent_category.id)], + } + ) + cls.attachment_2 = cls.attachment_model.create( + { + "name": "Attachment 2", + "datas": b"R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=", + "category_ids": [(4, cls.child_category.id)], + } + ) + + def test_01_compute_complete_name(self): + """Test the complete_name and display_name computation""" + self.assertEqual(self.parent_category.complete_name, "Parent Category") + self.assertEqual(self.parent_category.display_name, "Parent Category") + + self.assertEqual( + self.child_category.complete_name, "Parent Category/Child Category" + ) + self.assertEqual( + self.child_category.display_name, "Parent Category/Child Category" + ) + + def test_02_compute_attachment_count(self): + """Test attachment_count computation including child categories""" + # Parent should count its own and its children's attachments + self.assertEqual(self.parent_category.attachment_count, 2) + self.assertIn(self.attachment_1, self.parent_category.attachment_ids) + self.assertIn(self.attachment_2, self.parent_category.attachment_ids) + + # Child should count only its own + self.assertEqual(self.child_category.attachment_count, 1) + self.assertIn(self.attachment_2, self.child_category.attachment_ids) + self.assertNotIn(self.attachment_1, self.child_category.attachment_ids) + + def test_03_new_record(self): + """Test attachment_count on a new record in memory""" + new_category = self.env["ir.attachment.category"].new({"name": "New Category"}) + # It should not crash and should return 0 attachments + self.assertEqual(new_category.attachment_count, 0) + + def test_04_action_attachment_view(self): + """Test the action_attachment_view method""" + action = self.parent_category.action_attachment_view() + self.assertIsInstance(action, dict) + + # Verify the domain + domain = action.get("domain") + self.assertTrue(domain) + # In Odoo 19 domains are objects, so we check their string representation + domain_str = str(domain) + self.assertIn("category_ids", domain_str) + self.assertIn("child_of", domain_str) + self.assertIn(str(self.parent_category.id), domain_str) + + # Verify the context + context = action.get("context", {}) + self.assertEqual(context.get("default_category_ids"), [self.parent_category.id]) diff --git a/attachment_category/views/ir_attachment.xml b/attachment_category/views/ir_attachment.xml index c61f047a562..d55c2f231ad 100644 --- a/attachment_category/views/ir_attachment.xml +++ b/attachment_category/views/ir_attachment.xml @@ -22,8 +22,8 @@ - - ir.attachment.tree (in attachment_category) + + ir.attachment.list (in attachment_category) ir.attachment diff --git a/attachment_category/views/ir_attachment_category.xml b/attachment_category/views/ir_attachment_category.xml index 51c358d0772..a073bc7286a 100644 --- a/attachment_category/views/ir_attachment_category.xml +++ b/attachment_category/views/ir_attachment_category.xml @@ -34,23 +34,23 @@ ir.attachment.category - + - - ir.attachment.category.tree (in document_category) + + ir.attachment.category.list (in document_category) ir.attachment.category - - - + + + Attachment Categories ir.attachment.category - tree,form + list,form

Create a new document

Also you will find here all the related document categories.