Coverage for app/venv/lib/python3.14/site-packages/weblate/trans/management/commands/import_demo.py: 0%

34 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 

6from time import sleep 

7from typing import TYPE_CHECKING 

8 

9from django.test.utils import override_settings 

10 

11from weblate.addons.discovery import DiscoveryAddon 

12from weblate.trans.models import Component, Project 

13from weblate.trans.tasks import actual_project_removal 

14from weblate.utils.management.base import BaseCommand 

15 

16if TYPE_CHECKING: 

17 from django.core.management.base import CommandParser 

18 

19 

20class Command(BaseCommand): 

21 """Command for creating demo project.""" 

22 

23 help = "imports demo project and components" 

24 

25 def add_arguments(self, parser: CommandParser) -> None: 

26 super().add_arguments(parser) 

27 parser.add_argument( 

28 "--additional", type=int, default=0, help="number of additional components" 

29 ) 

30 parser.add_argument( 

31 "--delete", 

32 action="store_true", 

33 help="Update existing add-ons configuration", 

34 ) 

35 

36 def handle(self, *args, **options) -> None: 

37 with override_settings(CELERY_TASK_ALWAYS_EAGER=True): 

38 if options["delete"]: 

39 try: 

40 project = Project.objects.get(slug="demo") 

41 except Project.DoesNotExist: 

42 pass 

43 else: 

44 # Remove without creating a backup 

45 actual_project_removal(project.pk, None) 

46 # Create project 

47 project = Project.objects.create( 

48 name="Demo", slug="demo", web="https://demo.weblate.org/" 

49 ) 

50 

51 # Create main component 

52 component = Component.objects.create( 

53 name="Gettext", 

54 slug="gettext", 

55 project=project, 

56 vcs="git", 

57 repo="https://github.com/WeblateOrg/demo.git", 

58 repoweb=( 

59 "https://github.com/WeblateOrg/weblate/" 

60 "blob/{{branch}}/{{filename}}#L{{line}}" 

61 ), 

62 filemask="weblate/langdata/locale/*/LC_MESSAGES/django.po", 

63 new_base="weblate/langdata/locale/django.pot", 

64 file_format="po", 

65 license="GPL-3.0-or-later", 

66 ) 

67 while component.in_progress(): 

68 self.stdout.write( 

69 f"Importing base component: {component.get_progress()[0]}%" 

70 ) 

71 sleep(1) 

72 component.clean() 

73 

74 # Install discovery 

75 DiscoveryAddon.create( 

76 component=component, 

77 configuration={ 

78 "file_format": "po", 

79 "match": ( 

80 r"weblate/locale/(?P<language>[^/]*)/" 

81 r"LC_MESSAGES/(?P<component>[^/]*)\.po" 

82 ), 

83 "name_template": "Discovered: {{ component|title }}", 

84 "language_regex": "^[^.]+$", 

85 "base_file_template": "", 

86 "remove": True, 

87 }, 

88 ) 

89 

90 # Manually add Android 

91 Component.objects.create( 

92 name="Android", 

93 slug="android", 

94 project=project, 

95 vcs="git", 

96 repo=component.get_repo_link_url(), 

97 filemask="app/src/main/res/values-*/strings.xml", 

98 template="app/src/main/res/values/strings.xml", 

99 file_format="aresource", 

100 license="GPL-3.0-or-later", 

101 ) 

102 

103 for i in range(options["additional"]): 

104 Component.objects.create( 

105 name=f"Additional {i}", 

106 slug=f"additional-{i}", 

107 project=project, 

108 vcs="git", 

109 repo=component.get_repo_link_url(), 

110 filemask="weblate/langdata/locale/*/LC_MESSAGES/django.po", 

111 new_base="weblate/langdata/locale/django.pot", 

112 file_format="po", 

113 license="GPL-3.0-or-later", 

114 )