Coverage for app/venv/lib/python3.14/site-packages/weblate/addons/management/commands/install_addon.py: 0%
57 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
1# Copyright © Michal Čihař <michal@weblate.org>
2#
3# SPDX-License-Identifier: GPL-3.0-or-later
4from __future__ import annotations
6import json
7from typing import TYPE_CHECKING
9from django.core.management.base import CommandError
11from weblate.addons.models import ADDONS, Addon
12from weblate.auth.models import User, get_anonymous
13from weblate.trans.management.commands import WeblateComponentCommand
15if TYPE_CHECKING:
16 from django.core.management.base import CommandParser
19class Command(WeblateComponentCommand):
20 help = "installs add-on to all listed components"
22 def add_arguments(self, parser: CommandParser) -> None:
23 super().add_arguments(parser)
24 parser.add_argument("--addon", required=True, help="Add-on name")
25 parser.add_argument(
26 "--configuration", default="{}", help="Add-on configuration in JSON"
27 )
28 parser.add_argument(
29 "--update",
30 action="store_true",
31 help="Update existing add-ons configuration",
32 )
34 def validate_form(self, form) -> None:
35 if not form.is_valid():
36 for error in form.non_field_errors():
37 self.stderr.write(error)
38 for field in form:
39 for error in field.errors:
40 self.stderr.write(f"Error in {field.name}: {error}")
41 msg = "Invalid add-on configuration!"
42 raise CommandError(msg)
44 def handle(self, *args, **options) -> None:
45 try:
46 addon = ADDONS[options["addon"]]
47 except KeyError as error:
48 msg = "Add-on not found: {}".format(options["addon"])
49 raise CommandError(msg) from error
50 try:
51 configuration = json.loads(options["configuration"])
52 except json.JSONDecodeError as error:
53 msg = f"Invalid add-on configuration: {error}"
54 raise CommandError(msg) from error
55 try:
56 user = User.objects.filter(is_superuser=True)[0]
57 except IndexError:
58 user = get_anonymous()
59 for component in self.get_components(*args, **options):
60 if addon.has_settings():
61 form = addon.get_add_form(None, component=component, data=configuration)
62 self.validate_form(form)
63 addons = Addon.objects.filter_component(component).filter(name=addon.name)
64 if addons:
65 if options["update"]:
66 for addon_component in addons:
67 addon_component.addon.configure(configuration)
68 self.stdout.write(f"Successfully updated on {component}")
69 else:
70 self.stderr.write(f"Already installed on {component}")
71 continue
73 if not addon.can_install(component, user):
74 self.stderr.write(f"Can not install on {component}")
75 continue
77 addon.create(component=component, configuration=configuration)
78 self.stdout.write(f"Successfully installed on {component}")