From a18dc8e80360cd3331c7518d4e5cf7a16e3f7791 Mon Sep 17 00:00:00 2001 From: Enric Tobella Date: Thu, 23 Nov 2023 15:38:06 +0100 Subject: [PATCH] [ADD] oca-gen-addon-banner --- setup.py | 5 +++ tools/gen_addon_banner.png | Bin 0 -> 43583 bytes tools/gen_addon_banner.py | 85 +++++++++++++++++++++++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 tools/gen_addon_banner.png create mode 100644 tools/gen_addon_banner.py diff --git a/setup.py b/setup.py index 929a8ee5..3d291dd2 100644 --- a/setup.py +++ b/setup.py @@ -16,6 +16,9 @@ license="AGPL3", packages=["tools"], include_package_data=True, + package_data={ + "tools": ["*.png"], + }, zip_safe=False, use_scm_version=True, setup_requires=[ @@ -44,6 +47,7 @@ "pyproject_dependencies ; python_version>='3.7'", "setuptools-odoo", # for oca-gen-external-dependencies "whool", # for oca-gen-external-dependencies + "Pillow", # For oca-gen-addon-banner ], python_requires=">=3.6", classifiers=[ @@ -69,6 +73,7 @@ "oca-migrate-branch-empty = tools.migrate_branch_empty:main", "oca-publish-modules = tools.publish_modules:main", "oca-gen-addon-readme = tools.gen_addon_readme:gen_addon_readme", + "oca-gen-addon-banner = tools.gen_addon_banner:gen_addon_banner", "oca-gen-addon-icon = tools.gen_addon_icon:gen_addon_icon", "oca-gen-external-dependencies = tools.gen_external_dependencies:main", "oca-gen-metapackage = tools.gen_metapackage:main", diff --git a/tools/gen_addon_banner.png b/tools/gen_addon_banner.png new file mode 100644 index 0000000000000000000000000000000000000000..251ab9ddfae987df27777ac62149391cea19d8f5 GIT binary patch literal 43583 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

Y2s^XK7 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

  • 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Ը_?wSBCqdgku^L-W5{TE>vbLi6T8w3Ur??YMokj=KJ`=m8#f}uCO zSTMNOS?|tk3Pym>X#vIfGaXkX&&;NH=%JzY;e#sYI>X{ibZ zqqT4yW0O~#KvM&7P*Z!B^19=`%fKr)T2(Pj@Usn8sF>VlldN1a;;*|R zDj-m|U6%IJW3TIJGtK&>b&2=3eaShV1j&p+Pq{1vmu7tmzIsHE^9oY8Y-7%?W_6c4 z@p!EQOhT+oq!rO7j~!PS;6u~Xn>%0xdVvYa;5FXfeckEHKb66MW4KCv5$rzri4{>@ z_i@F>a9(0vhCJ+R*fM$ocG);6%$&#NZ+PvtC%0l&xlvBq1*I4wIm;M?O$BzPu556U z3*Z?z1;bP+{n!jdCacYHEu7ry-qPlFWBD2U5|qL^14q8-%H4T(vBo>Dc}vCJ&drF} zE}Fb3@u{;Wv*OS7SEuLKzSE!_|FMGQ#%O!|Hppdj+(dfkPw%y>%?yV8T2z*Y#3v=W zo#h>br7b~5Zv%vdPI6e3_1LO7G9X;q*Rdst`}ac}w^fK%zG%$eEZCLbIvts(2*zhQ zXA@G}#^Q?cH_Bd1@)!vxMNR1e^XNgf>K7Fxl&)@X>&m!T556~{IOOio-GQomcK1Cq ztvbmU6sfZuU%#);^=j3#5x(sAtQS{|54WL$E9{XESXDDiN=s&2dePjPI&uFUyk}xO zk(`!7_Yfz{yjm5nKAbSi!rybR5J8~m3L9XuVgKygu3K>?e!0+a&vPj&qHY9`gI|{) z68diIbfMf8^VF0dC=Q@`><_+v!{%!yBx%@gl0u+-lr+z4_i9K&cT#v;r8&fhTogKM z*G#BX5V&Fc@6^c;h+tA$Jptu_XP}oP+JaRy%U@+`%8gqac%zN>&^epAG&buh4ObN7Ah9X-wl85-9Os!KfPP1SSWw@ZlPkK j{5u-{FNfxY@)Td_r~<*D2!-5^fX@+AE0ZTi&Jq6tK;4g1 literal 0 HcmV?d00001 diff --git a/tools/gen_addon_banner.py b/tools/gen_addon_banner.py new file mode 100644 index 00000000..7d30c23d --- /dev/null +++ b/tools/gen_addon_banner.py @@ -0,0 +1,85 @@ +# License AGPLv3 (https://www.gnu.org/licenses/agpl-3.0-standalone.html) +# Copyright (c) 2018 ACSONE SA/NV +# Copyright (c) 2018 GRAP (http://www.grap.coop) + +import os +import click +from .manifest import read_manifest, find_addons, NoManifestFound +from .gitutils import commit_if_needed +from PIL import Image + + +def gen_one_addon_banner(addon_name, addon_dir, manifest, background, font): + # It would be cleaner to modify the readme, but it is easier + image = Image.open(background) + # TODO:Maybe we could add the title of the addon... + modified = [] + for path in manifest["images"]: + image.save("%s/%s" % (addon_dir, path)) + modified.append("%s/%s" % (addon_dir, path)) + return modified + + +@click.command() +@click.option( + "--background", + type=click.Path(dir_okay=False, file_okay=True, exists=True), + default=os.path.join( + os.path.dirname(__file__), + "gen_addon_banner.png", + ), + help="Path of the Background to use", +) +@click.option( + "--font", + type=click.Path(dir_okay=True, file_okay=False, exists=True), + help="Path of the Font to use", +) +@click.option( + "--addon-dir", + "addon_dirs", + type=click.Path(dir_okay=True, file_okay=False, exists=True), + multiple=True, + help="Directory where addon manifest is located. This option " "may be repeated.", +) +@click.option( + "--addons-dir", + type=click.Path(dir_okay=True, file_okay=False, exists=True), + help="Directory containing several addons, the README will be " + "generated for all installable addons found there.", +) +@click.option( + "--commit/--no-commit", + help="git commit changes to README.rst and index.html, if any.", +) +def gen_addon_banner( + background, + font, + addon_dirs, + addons_dir, + commit, +): + addons = [] + if addons_dir: + addons.extend(find_addons(addons_dir)) + for addon_dir in addon_dirs: + addon_name = os.path.basename(os.path.abspath(addon_dir)) + try: + manifest = read_manifest(addon_dir) + except NoManifestFound: + continue + addons.append((addon_name, os.path.abspath(addon_dir), manifest)) + modified = [] + for addon_name, addon_dir, manifest in addons: + print(addon_dir) + if "images" not in manifest: + continue + modified += gen_one_addon_banner( + addon_name, addon_dir, manifest, background, font + ) + if commit: + commit_if_needed(modified, "[UPD] banners") + + +if __name__ == "__main__": + gen_addon_banner()