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

1# Copyright © Michal Čihař <michal@weblate.org> 

2# 

3# SPDX-License-Identifier: GPL-3.0-or-later 

4from __future__ import annotations 

5 

6import json 

7from typing import TYPE_CHECKING 

8 

9from django.core.management.base import CommandError 

10 

11from weblate.addons.models import ADDONS, Addon 

12from weblate.auth.models import User, get_anonymous 

13from weblate.trans.management.commands import WeblateComponentCommand 

14 

15if TYPE_CHECKING: 

16 from django.core.management.base import CommandParser 

17 

18 

19class Command(WeblateComponentCommand): 

20 help = "installs add-on to all listed components" 

21 

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 ) 

33 

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) 

43 

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 

72 

73 if not addon.can_install(component, user): 

74 self.stderr.write(f"Can not install on {component}") 

75 continue 

76 

77 addon.create(component=component, configuration=configuration) 

78 self.stdout.write(f"Successfully installed on {component}")