Skip to content

Commit d7b559c

Browse files
author
Mariya
authored
feat(applications): add CUPS installation support (archlinux#4013)
* feat(applications): add CUPS installation support * fix: use translation for print service preview_action * fix: incorrect action for print service menu item * chore: refactor naming, printer -> print service * fix: commit untracked file * chore: fix formatting to make linter happy
1 parent cf31148 commit d7b559c

File tree

9 files changed

+113
-8
lines changed

9 files changed

+113
-8
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from typing import TYPE_CHECKING
2+
3+
from archinstall.lib.output import debug
4+
5+
if TYPE_CHECKING:
6+
from archinstall.lib.installer import Installer
7+
8+
9+
class PrintServiceApp:
10+
@property
11+
def packages(self) -> list[str]:
12+
return ['cups', 'system-config-printer', 'cups-pk-helper']
13+
14+
@property
15+
def services(self) -> list[str]:
16+
return [
17+
'cups.service',
18+
]
19+
20+
def install(self, install_session: 'Installer') -> None:
21+
debug('Installing print service')
22+
install_session.add_additional_packages(self.packages)
23+
install_session.enable_service(self.services)

archinstall/lib/applications/application_handler.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from archinstall.applications.audio import AudioApp
44
from archinstall.applications.bluetooth import BluetoothApp
5+
from archinstall.applications.print_service import PrintServiceApp
56
from archinstall.lib.models import Audio
67
from archinstall.lib.models.application import ApplicationConfiguration
78
from archinstall.lib.models.users import User
@@ -25,5 +26,8 @@ def install_applications(self, install_session: 'Installer', app_config: Applica
2526
users,
2627
)
2728

29+
if app_config.print_service_config and app_config.print_service_config.enabled:
30+
PrintServiceApp().install(install_session)
31+
2832

2933
application_handler = ApplicationHandler()

archinstall/lib/applications/application_menu.py

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import override
22

33
from archinstall.lib.menu.abstract_menu import AbstractSubMenu
4-
from archinstall.lib.models.application import ApplicationConfiguration, Audio, AudioConfiguration, BluetoothConfiguration
4+
from archinstall.lib.models.application import ApplicationConfiguration, Audio, AudioConfiguration, BluetoothConfiguration, PrintServiceConfiguration
55
from archinstall.lib.translationhandler import tr
66
from archinstall.tui.curses_menu import SelectMenu
77
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
@@ -48,6 +48,12 @@ def _define_menu_options(self) -> list[MenuItem]:
4848
preview_action=self._prev_audio,
4949
key='audio_config',
5050
),
51+
MenuItem(
52+
text=tr('Print service'),
53+
action=select_print_service,
54+
preview_action=self._prev_print_service,
55+
key='print_service_config',
56+
),
5157
]
5258

5359
def _prev_bluetooth(self, item: MenuItem) -> str | None:
@@ -65,6 +71,15 @@ def _prev_audio(self, item: MenuItem) -> str | None:
6571
return f'{tr("Audio")}: {config.audio.value}'
6672
return None
6773

74+
def _prev_print_service(self, item: MenuItem) -> str | None:
75+
if item.value is not None:
76+
print_service_config: PrintServiceConfiguration = item.value
77+
78+
output = f'{tr("Print service")}: '
79+
output += tr('Enabled') if print_service_config.enabled else tr('Disabled')
80+
return output
81+
return None
82+
6883

6984
def select_bluetooth(preset: BluetoothConfiguration | None) -> BluetoothConfiguration | None:
7085
group = MenuItemGroup.yes_no()
@@ -94,6 +109,34 @@ def select_bluetooth(preset: BluetoothConfiguration | None) -> BluetoothConfigur
94109
raise ValueError('Unhandled result type')
95110

96111

112+
def select_print_service(preset: PrintServiceConfiguration | None) -> PrintServiceConfiguration | None:
113+
group = MenuItemGroup.yes_no()
114+
group.focus_item = MenuItem.no()
115+
116+
if preset is not None:
117+
group.set_selected_by_value(preset.enabled)
118+
119+
header = tr('Would you like to configure the print service?') + '\n'
120+
121+
result = SelectMenu[bool](
122+
group,
123+
header=header,
124+
alignment=Alignment.CENTER,
125+
columns=2,
126+
orientation=Orientation.HORIZONTAL,
127+
allow_skip=True,
128+
).run()
129+
130+
match result.type_:
131+
case ResultType.Selection:
132+
enabled = result.item() == MenuItem.yes()
133+
return PrintServiceConfiguration(enabled)
134+
case ResultType.Skip:
135+
return preset
136+
case _:
137+
raise ValueError('Unhandled result type')
138+
139+
97140
def select_audio(preset: AudioConfiguration | None = None) -> AudioConfiguration | None:
98141
items = [MenuItem(a.value, value=a) for a in Audio]
99142
group = MenuItemGroup(items)

archinstall/lib/global_menu.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,11 @@ def _prev_applications(self, item: MenuItem) -> str | None:
324324
output += f'{tr("Audio")}: {audio_config.audio.value}'
325325
output += '\n'
326326

327+
if app_config.print_service_config:
328+
output += f'{tr("Print service")}: '
329+
output += tr('Enabled') if app_config.print_service_config.enabled else tr('Disabled')
330+
output += '\n'
331+
327332
return output
328333

329334
return None

archinstall/lib/models/__init__.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
from .application import (
2-
ApplicationConfiguration,
3-
Audio,
4-
AudioConfiguration,
5-
BluetoothConfiguration,
6-
)
1+
from .application import ApplicationConfiguration, Audio, AudioConfiguration, BluetoothConfiguration, PrintServiceConfiguration
72
from .bootloader import Bootloader
83
from .device import (
94
BDevice,
@@ -76,6 +71,7 @@
7671
'PartitionTable',
7772
'PartitionType',
7873
'PasswordStrength',
74+
'PrintServiceConfiguration',
7975
'ProfileConfiguration',
8076
'Repository',
8177
'SectorSize',

archinstall/lib/models/application.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,14 @@ class AudioConfigSerialization(TypedDict):
1717
audio: str
1818

1919

20+
class PrintServiceConfigSerialization(TypedDict):
21+
enabled: bool
22+
23+
2024
class ApplicationSerialization(TypedDict):
2125
bluetooth_config: NotRequired[BluetoothConfigSerialization]
2226
audio_config: NotRequired[AudioConfigSerialization]
27+
print_service_config: NotRequired[PrintServiceConfigSerialization]
2328

2429

2530
@dataclass
@@ -50,10 +55,23 @@ def parse_arg(arg: dict[str, Any]) -> 'BluetoothConfiguration':
5055
return BluetoothConfiguration(arg['enabled'])
5156

5257

58+
@dataclass
59+
class PrintServiceConfiguration:
60+
enabled: bool
61+
62+
def json(self) -> PrintServiceConfigSerialization:
63+
return {'enabled': self.enabled}
64+
65+
@staticmethod
66+
def parse_arg(arg: dict[str, Any]) -> 'PrintServiceConfiguration':
67+
return PrintServiceConfiguration(arg['enabled'])
68+
69+
5370
@dataclass
5471
class ApplicationConfiguration:
5572
bluetooth_config: BluetoothConfiguration | None = None
5673
audio_config: AudioConfiguration | None = None
74+
print_service_config: PrintServiceConfiguration | None = None
5775

5876
@staticmethod
5977
def parse_arg(
@@ -72,6 +90,9 @@ def parse_arg(
7290
if args and (audio_config := args.get('audio_config')) is not None:
7391
app_config.audio_config = AudioConfiguration.parse_arg(audio_config)
7492

93+
if args and (print_service_config := args.get('print_service_config')) is not None:
94+
app_config.print_service_config = PrintServiceConfiguration.parse_arg(print_service_config)
95+
7596
return app_config
7697

7798
def json(self) -> ApplicationSerialization:
@@ -83,4 +104,7 @@ def json(self) -> ApplicationSerialization:
83104
if self.audio_config:
84105
config['audio_config'] = self.audio_config.json()
85106

107+
if self.print_service_config:
108+
config['print_service_config'] = self.print_service_config.json()
109+
86110
return config

archinstall/locales/base.pot

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1779,6 +1779,12 @@ msgstr ""
17791779
msgid "Would you like to configure Bluetooth?"
17801780
msgstr ""
17811781

1782+
msgid "Print service"
1783+
msgstr ""
1784+
1785+
msgid "Would you like to configure the print service?"
1786+
msgstr ""
1787+
17821788
msgid "Authentication"
17831789
msgstr ""
17841790

tests/data/test_config.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
},
88
"audio_config": {
99
"audio": "pipewire"
10+
},
11+
"print_service_config": {
12+
"enabled": true
1013
}
1114
},
1215
"auth_config": {

tests/test_args.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from archinstall.default_profiles.profile import GreeterType
88
from archinstall.lib.args import ArchConfig, ArchConfigHandler, Arguments
99
from archinstall.lib.hardware import GfxDriver
10-
from archinstall.lib.models.application import ApplicationConfiguration, Audio, AudioConfiguration, BluetoothConfiguration
10+
from archinstall.lib.models.application import ApplicationConfiguration, Audio, AudioConfiguration, BluetoothConfiguration, PrintServiceConfiguration
1111
from archinstall.lib.models.authentication import AuthenticationConfiguration, U2FLoginConfiguration, U2FLoginMethod
1212
from archinstall.lib.models.bootloader import Bootloader, BootloaderConfiguration
1313
from archinstall.lib.models.device import DiskLayoutConfiguration, DiskLayoutType
@@ -132,6 +132,7 @@ def test_config_file_parsing(
132132
app_config=ApplicationConfiguration(
133133
bluetooth_config=BluetoothConfiguration(enabled=True),
134134
audio_config=AudioConfiguration(audio=Audio.PIPEWIRE),
135+
print_service_config=PrintServiceConfiguration(enabled=True),
135136
),
136137
auth_config=AuthenticationConfiguration(
137138
root_enc_password=Password(enc_password='password_hash'),

0 commit comments

Comments
 (0)