From 5ace997ade9ac5c6d91a0c131da110247e5a7779 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Fri, 28 Jun 2024 11:50:55 +0200 Subject: [PATCH 1/6] [ADD] web_notify_upgrade --- web_notify_upgrade/README.rst | 80 ++++ web_notify_upgrade/__init__.py | 1 + web_notify_upgrade/__manifest__.py | 14 + web_notify_upgrade/models/__init__.py | 1 + web_notify_upgrade/models/ir_model.py | 60 +++ web_notify_upgrade/readme/CONTRIBUTORS.rst | 3 + web_notify_upgrade/readme/DESCRIPTION.rst | 3 + .../static/description/index.html | 424 ++++++++++++++++++ 8 files changed, 586 insertions(+) create mode 100644 web_notify_upgrade/README.rst create mode 100644 web_notify_upgrade/__init__.py create mode 100644 web_notify_upgrade/__manifest__.py create mode 100644 web_notify_upgrade/models/__init__.py create mode 100644 web_notify_upgrade/models/ir_model.py create mode 100644 web_notify_upgrade/readme/CONTRIBUTORS.rst create mode 100644 web_notify_upgrade/readme/DESCRIPTION.rst create mode 100644 web_notify_upgrade/static/description/index.html diff --git a/web_notify_upgrade/README.rst b/web_notify_upgrade/README.rst new file mode 100644 index 000000000..f71b7b8e8 --- /dev/null +++ b/web_notify_upgrade/README.rst @@ -0,0 +1,80 @@ +================== +Web Notify Upgrade +================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:43d4c2b1f0259f640d095bcf8eb7e5afe9cba9ab249dad54c96068d2624bdec8 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fweb-lightgray.png?logo=github + :target: https://github.com/OCA/web/tree/14.0/web_notify_upgrade + :alt: OCA/web +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/web-14-0/web-14-0-web_notify_upgrade + :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/web&target_branch=14.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module uses web_notify send a notification to every active users whenever a module has been installed or upgraded. + +The notification will ask the user to refresh the page to get the latest changes. + +**Table of contents** + +.. contents:: + :local: + +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 +~~~~~~~ + +* Akretion + +Contributors +~~~~~~~~~~~~ + +* `Akretion `_: + + * Florian Mounier + +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/web `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_notify_upgrade/__init__.py b/web_notify_upgrade/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/web_notify_upgrade/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/web_notify_upgrade/__manifest__.py b/web_notify_upgrade/__manifest__.py new file mode 100644 index 000000000..2bfd025f2 --- /dev/null +++ b/web_notify_upgrade/__manifest__.py @@ -0,0 +1,14 @@ +# Copyright 2024 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +{ + "name": "Web Notify Upgrade", + "summary": "Notify active users when a module is installed or updated", + "version": "14.0.1.0.0", + "license": "AGPL-3", + "depends": ["web_notify"], + "author": "Akretion, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/web", + "installable": True, +} diff --git a/web_notify_upgrade/models/__init__.py b/web_notify_upgrade/models/__init__.py new file mode 100644 index 000000000..413bb2380 --- /dev/null +++ b/web_notify_upgrade/models/__init__.py @@ -0,0 +1 @@ +from . import ir_model diff --git a/web_notify_upgrade/models/ir_model.py b/web_notify_upgrade/models/ir_model.py new file mode 100644 index 000000000..684bf3623 --- /dev/null +++ b/web_notify_upgrade/models/ir_model.py @@ -0,0 +1,60 @@ +# Copyright 2024 Akretion (http://www.akretion.com). +# @author Florian Mounier +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +import logging + +from odoo import api, models + +from odoo.addons.bus.models.bus_presence import AWAY_TIMER, DISCONNECTION_TIMER + +_logger = logging.getLogger(__name__) + + +class IrModelData(models.Model): + _inherit = "ir.model.data" + + @api.model + def _process_end(self, modules): + # This function is called at the end of the module installation + # only if at least a module has been installed or updated. + rv = super()._process_end(modules) + self._notify_active_users_of_upgrade() + return rv + + def _notify_active_users_of_upgrade(self): + # Look for active users + active_users = self._get_active_users_to_notify_of_upgrade() + if active_users: + _logger.info( + "Installation detected. Notifying %s active users", len(active_users) + ) + # Notify them + active_users.notify_info(**self._get_upgrade_notification_params()) + + def _get_active_users_to_notify_of_upgrade(self): + """Return the active users that should be notified of the upgrade.""" + self.env.cr.execute( + """ + SELECT user_id + FROM bus_presence + WHERE last_poll is not null + AND ( + age(now() AT TIME ZONE 'UTC', last_poll) < interval %s + OR age(now() AT TIME ZONE 'UTC', last_presence) < interval %s + ) + """, + ("%s seconds" % DISCONNECTION_TIMER, "%s seconds" % AWAY_TIMER), + ) + return self.env["res.users"].browse([res[0] for res in self.env.cr.fetchall()]) + + def _get_upgrade_notification_params(self): + """Return the parameters to pass to the notify_info method.""" + return dict( + message="Your odoo instance has been upgraded, " + "please reload the web page.
" + '", + title="Upgrade Notification", + sticky=True, + ) diff --git a/web_notify_upgrade/readme/CONTRIBUTORS.rst b/web_notify_upgrade/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..a4d0ad922 --- /dev/null +++ b/web_notify_upgrade/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Akretion `_: + + * Florian Mounier diff --git a/web_notify_upgrade/readme/DESCRIPTION.rst b/web_notify_upgrade/readme/DESCRIPTION.rst new file mode 100644 index 000000000..854e257a6 --- /dev/null +++ b/web_notify_upgrade/readme/DESCRIPTION.rst @@ -0,0 +1,3 @@ +This module uses web_notify send a notification to every active users whenever a module has been installed or upgraded. + +The notification will ask the user to refresh the page to get the latest changes. diff --git a/web_notify_upgrade/static/description/index.html b/web_notify_upgrade/static/description/index.html new file mode 100644 index 000000000..aab5720bf --- /dev/null +++ b/web_notify_upgrade/static/description/index.html @@ -0,0 +1,424 @@ + + + + + +Web Notify Upgrade + + + +
+

Web Notify Upgrade

+ + +

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

+

This module uses web_notify send a notification to every active users whenever a module has been installed or upgraded.

+

The notification will ask the user to refresh the page to get the latest changes.

+

Table of contents

+ +
+

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

+
    +
  • Akretion
  • +
+
+
+

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/web project on GitHub.

+

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

+
+
+
+ + From 77d3d8ef58b9363e3ad31b3cffb638a5e648d3af Mon Sep 17 00:00:00 2001 From: oca-ci Date: Thu, 4 Jul 2024 09:22:40 +0000 Subject: [PATCH 2/6] [UPD] Update web_notify_upgrade.pot --- .../i18n/web_notify_upgrade.pot | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 web_notify_upgrade/i18n/web_notify_upgrade.pot diff --git a/web_notify_upgrade/i18n/web_notify_upgrade.pot b/web_notify_upgrade/i18n/web_notify_upgrade.pot new file mode 100644 index 000000000..fc0b462ba --- /dev/null +++ b/web_notify_upgrade/i18n/web_notify_upgrade.pot @@ -0,0 +1,34 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_notify_upgrade +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.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: web_notify_upgrade +#: model:ir.model.fields,field_description:web_notify_upgrade.field_ir_model_data__display_name +msgid "Display Name" +msgstr "" + +#. module: web_notify_upgrade +#: model:ir.model.fields,field_description:web_notify_upgrade.field_ir_model_data__id +msgid "ID" +msgstr "" + +#. module: web_notify_upgrade +#: model:ir.model.fields,field_description:web_notify_upgrade.field_ir_model_data____last_update +msgid "Last Modified on" +msgstr "" + +#. module: web_notify_upgrade +#: model:ir.model,name:web_notify_upgrade.model_ir_model_data +msgid "Model Data" +msgstr "" From 65892026fc8b7e255ad0acc8136fd0044def1449 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Thu, 4 Jul 2024 09:27:51 +0000 Subject: [PATCH 3/6] [BOT] post-merge updates --- web_notify_upgrade/README.rst | 2 +- web_notify_upgrade/__manifest__.py | 2 +- web_notify_upgrade/static/description/icon.png | Bin 0 -> 9455 bytes web_notify_upgrade/static/description/index.html | 2 +- 4 files changed, 3 insertions(+), 3 deletions(-) create mode 100644 web_notify_upgrade/static/description/icon.png diff --git a/web_notify_upgrade/README.rst b/web_notify_upgrade/README.rst index f71b7b8e8..b03fd17ec 100644 --- a/web_notify_upgrade/README.rst +++ b/web_notify_upgrade/README.rst @@ -7,7 +7,7 @@ Web Notify Upgrade !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:43d4c2b1f0259f640d095bcf8eb7e5afe9cba9ab249dad54c96068d2624bdec8 + !! source digest: sha256:73f36f681a3bdab0c199d3f256b69f03aba5a56d03e9a35545d14d1992c865bd !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/web_notify_upgrade/__manifest__.py b/web_notify_upgrade/__manifest__.py index 2bfd025f2..2c4a2396c 100644 --- a/web_notify_upgrade/__manifest__.py +++ b/web_notify_upgrade/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Web Notify Upgrade", "summary": "Notify active users when a module is installed or updated", - "version": "14.0.1.0.0", + "version": "14.0.1.0.1", "license": "AGPL-3", "depends": ["web_notify"], "author": "Akretion, Odoo Community Association (OCA)", diff --git a/web_notify_upgrade/static/description/icon.png b/web_notify_upgrade/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/web_notify_upgrade/static/description/index.html b/web_notify_upgrade/static/description/index.html index aab5720bf..0c307119c 100644 --- a/web_notify_upgrade/static/description/index.html +++ b/web_notify_upgrade/static/description/index.html @@ -366,7 +366,7 @@ ul.auto-toc { !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:43d4c2b1f0259f640d095bcf8eb7e5afe9cba9ab249dad54c96068d2624bdec8 +!! source digest: sha256:73f36f681a3bdab0c199d3f256b69f03aba5a56d03e9a35545d14d1992c865bd !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

This module uses web_notify send a notification to every active users whenever a module has been installed or upgraded.

From ce662b90a571f89dee448e8e7592636d067a079d Mon Sep 17 00:00:00 2001 From: David Beal Date: Mon, 5 Aug 2024 20:06:25 +0200 Subject: [PATCH 4/6] [IMP] web_notify_upgrade: apply pre-commit auto fixes --- setup/web_notify_upgrade/odoo/addons/web_notify_upgrade | 1 + setup/web_notify_upgrade/setup.py | 6 ++++++ 2 files changed, 7 insertions(+) create mode 120000 setup/web_notify_upgrade/odoo/addons/web_notify_upgrade create mode 100644 setup/web_notify_upgrade/setup.py diff --git a/setup/web_notify_upgrade/odoo/addons/web_notify_upgrade b/setup/web_notify_upgrade/odoo/addons/web_notify_upgrade new file mode 120000 index 000000000..276bb5108 --- /dev/null +++ b/setup/web_notify_upgrade/odoo/addons/web_notify_upgrade @@ -0,0 +1 @@ +../../../../web_notify_upgrade \ No newline at end of file diff --git a/setup/web_notify_upgrade/setup.py b/setup/web_notify_upgrade/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/web_notify_upgrade/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 45686a2eb2e518929359112fa9134f4fb9ded616 Mon Sep 17 00:00:00 2001 From: David Beal Date: Mon, 5 Aug 2024 20:12:16 +0200 Subject: [PATCH 5/6] [16.0][MIG] web_notify_upgrade --- web_notify_upgrade/README.rst | 10 +++++----- web_notify_upgrade/__manifest__.py | 2 +- web_notify_upgrade/static/description/index.html | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/web_notify_upgrade/README.rst b/web_notify_upgrade/README.rst index b03fd17ec..9346623b2 100644 --- a/web_notify_upgrade/README.rst +++ b/web_notify_upgrade/README.rst @@ -17,13 +17,13 @@ Web Notify Upgrade :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html :alt: License: AGPL-3 .. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fweb-lightgray.png?logo=github - :target: https://github.com/OCA/web/tree/14.0/web_notify_upgrade + :target: https://github.com/OCA/web/tree/16.0/web_notify_upgrade :alt: OCA/web .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/web-14-0/web-14-0-web_notify_upgrade + :target: https://translation.odoo-community.org/projects/web-16-0/web-16-0-web_notify_upgrade :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/web&target_branch=14.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/web&target_branch=16.0 :alt: Try me on Runboat |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 to smash it by providing a detailed and welcomed -`feedback `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -75,6 +75,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/web `_ project on GitHub. +This module is part of the `OCA/web `_ project on GitHub. You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/web_notify_upgrade/__manifest__.py b/web_notify_upgrade/__manifest__.py index 2c4a2396c..24ae27e06 100644 --- a/web_notify_upgrade/__manifest__.py +++ b/web_notify_upgrade/__manifest__.py @@ -5,7 +5,7 @@ { "name": "Web Notify Upgrade", "summary": "Notify active users when a module is installed or updated", - "version": "14.0.1.0.1", + "version": "16.0.1.0.0", "license": "AGPL-3", "depends": ["web_notify"], "author": "Akretion, Odoo Community Association (OCA)", diff --git a/web_notify_upgrade/static/description/index.html b/web_notify_upgrade/static/description/index.html index 0c307119c..35f304af5 100644 --- a/web_notify_upgrade/static/description/index.html +++ b/web_notify_upgrade/static/description/index.html @@ -368,7 +368,7 @@ ul.auto-toc { !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! source digest: sha256:73f36f681a3bdab0c199d3f256b69f03aba5a56d03e9a35545d14d1992c865bd !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

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

+

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

This module uses web_notify send a notification to every active users whenever a module has been installed or upgraded.

The notification will ask the user to refresh the page to get the latest changes.

Table of contents

@@ -388,7 +388,7 @@ ul.auto-toc {

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.

@@ -415,7 +415,7 @@ If you spotted it first, help us to smash it by providing a detailed and welcome

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/web project on GitHub.

+

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

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

From 5bdbc563f2d92a18a798d0e355df1cf290fe7d7a Mon Sep 17 00:00:00 2001 From: David Beal Date: Mon, 5 Aug 2024 21:31:58 +0200 Subject: [PATCH 6/6] [16.0] web_notify_upgrade: fr translation --- web_notify_upgrade/README.rst | 4 ++ web_notify_upgrade/i18n/fr.po | 37 ++++++++++++++++ .../i18n/web_notify_upgrade.pot | 40 ++++++++++-------- web_notify_upgrade/models/ir_model.py | 13 +++--- web_notify_upgrade/readme/DESCRIPTION.rst | 4 ++ .../static/description/icon.png | Bin 9455 -> 0 bytes .../static/description/index.html | 3 ++ .../static/description/notify.png | Bin 0 -> 27309 bytes 8 files changed, 78 insertions(+), 23 deletions(-) create mode 100644 web_notify_upgrade/i18n/fr.po delete mode 100644 web_notify_upgrade/static/description/icon.png create mode 100644 web_notify_upgrade/static/description/notify.png diff --git a/web_notify_upgrade/README.rst b/web_notify_upgrade/README.rst index 9346623b2..ac632893c 100644 --- a/web_notify_upgrade/README.rst +++ b/web_notify_upgrade/README.rst @@ -32,6 +32,10 @@ This module uses web_notify send a notification to every active users whenever a The notification will ask the user to refresh the page to get the latest changes. + +.. figure:: https://raw.githubusercontent.com/OCA/web/16.0/web_notify_upgrade/static/description/notify.png + :alt: Refresh page + **Table of contents** .. contents:: diff --git a/web_notify_upgrade/i18n/fr.po b/web_notify_upgrade/i18n/fr.po new file mode 100644 index 000000000..f7cc2012b --- /dev/null +++ b/web_notify_upgrade/i18n/fr.po @@ -0,0 +1,37 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * web_notify_upgrade +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: \n" +"PO-Revision-Date: \n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" +"X-Generator: Poedit 3.0.1\n" + +#. module: web_notify_upgrade +#: model:ir.model,name:web_notify_upgrade.model_ir_model_data +msgid "Model Data" +msgstr "Model Data" + +#. module: web_notify_upgrade +#. odoo-python +#: code:addons/web_notify_upgrade/models/ir_model.py:0 +#, python-format +msgid "Reload" +msgstr "Recharger" + +#. module: web_notify_upgrade +#. odoo-python +#: code:addons/web_notify_upgrade/models/ir_model.py:0 +#, python-format +msgid "Your odoo instance has been upgraded, please reload the web page." +msgstr "Votre instance odoo a été mise à jour, merci de recharger la page web." diff --git a/web_notify_upgrade/i18n/web_notify_upgrade.pot b/web_notify_upgrade/i18n/web_notify_upgrade.pot index fc0b462ba..eafc4e86c 100644 --- a/web_notify_upgrade/i18n/web_notify_upgrade.pot +++ b/web_notify_upgrade/i18n/web_notify_upgrade.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 14.0\n" +"Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,22 +13,28 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" -#. module: web_notify_upgrade -#: model:ir.model.fields,field_description:web_notify_upgrade.field_ir_model_data__display_name -msgid "Display Name" -msgstr "" - -#. module: web_notify_upgrade -#: model:ir.model.fields,field_description:web_notify_upgrade.field_ir_model_data__id -msgid "ID" -msgstr "" - -#. module: web_notify_upgrade -#: model:ir.model.fields,field_description:web_notify_upgrade.field_ir_model_data____last_update -msgid "Last Modified on" -msgstr "" - #. module: web_notify_upgrade #: model:ir.model,name:web_notify_upgrade.model_ir_model_data msgid "Model Data" -msgstr "" +msgstr "Model Data" + +#. module: web_notify_upgrade +#. odoo-python +#: code:addons/web_notify_upgrade/models/ir_model.py:0 +#, python-format +msgid "Reload" +msgstr "Recharger" + +#. module: web_notify_upgrade +#. odoo-python +#: code:addons/web_notify_upgrade/models/ir_model.py:0 +#, python-format +msgid "Upgrade Notification" +msgstr "Notification de mise à jour" + +#. module: web_notify_upgrade +#. odoo-python +#: code:addons/web_notify_upgrade/models/ir_model.py:0 +#, python-format +msgid "Your odoo instance has been upgraded, please reload the web page." +msgstr "Votre instance odoo a été mise à jour, merci de recharger la page web." diff --git a/web_notify_upgrade/models/ir_model.py b/web_notify_upgrade/models/ir_model.py index 684bf3623..d973e4e36 100644 --- a/web_notify_upgrade/models/ir_model.py +++ b/web_notify_upgrade/models/ir_model.py @@ -3,7 +3,7 @@ # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). import logging -from odoo import api, models +from odoo import _, api, models from odoo.addons.bus.models.bus_presence import AWAY_TIMER, DISCONNECTION_TIMER @@ -50,11 +50,12 @@ class IrModelData(models.Model): def _get_upgrade_notification_params(self): """Return the parameters to pass to the notify_info method.""" return dict( - message="Your odoo instance has been upgraded, " - "please reload the web page.
" + message=_( + "Your odoo instance has been upgraded, " "please reload the web page." + ) + + "
" '", - title="Upgrade Notification", + '' + _("Reload") + "", + title=_("Upgrade Notification"), sticky=True, ) diff --git a/web_notify_upgrade/readme/DESCRIPTION.rst b/web_notify_upgrade/readme/DESCRIPTION.rst index 854e257a6..49656f4d6 100644 --- a/web_notify_upgrade/readme/DESCRIPTION.rst +++ b/web_notify_upgrade/readme/DESCRIPTION.rst @@ -1,3 +1,7 @@ This module uses web_notify send a notification to every active users whenever a module has been installed or upgraded. The notification will ask the user to refresh the page to get the latest changes. + + +.. figure:: ../static/description/notify.png + :alt: Refresh page diff --git a/web_notify_upgrade/static/description/icon.png b/web_notify_upgrade/static/description/icon.png deleted file mode 100644 index 3a0328b516c4980e8e44cdb63fd945757ddd132d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I diff --git a/web_notify_upgrade/static/description/index.html b/web_notify_upgrade/static/description/index.html index 35f304af5..61d39b54d 100644 --- a/web_notify_upgrade/static/description/index.html +++ b/web_notify_upgrade/static/description/index.html @@ -371,6 +371,9 @@ ul.auto-toc {

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

This module uses web_notify send a notification to every active users whenever a module has been installed or upgraded.

The notification will ask the user to refresh the page to get the latest changes.

+
+Refresh page +

Table of contents

    diff --git a/web_notify_upgrade/static/description/notify.png b/web_notify_upgrade/static/description/notify.png new file mode 100644 index 0000000000000000000000000000000000000000..d605e3ff894eab41624e6efd61b0b73d56f9c668 GIT binary patch literal 27309 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

    ?CIV0-*+-SExRL?j5c$lLiim7VtM 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