Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions archinstall/applications/print_service.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from typing import TYPE_CHECKING

from archinstall.lib.output import debug

if TYPE_CHECKING:
from archinstall.lib.installer import Installer


class PrintServiceApp:
@property
def packages(self) -> list[str]:
return ['cups', 'system-config-printer', 'cups-pk-helper']

@property
def services(self) -> list[str]:
return [
'cups.service',
]

def install(self, install_session: 'Installer') -> None:
debug('Installing print service')
install_session.add_additional_packages(self.packages)
install_session.enable_service(self.services)
4 changes: 4 additions & 0 deletions archinstall/lib/applications/application_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from archinstall.applications.audio import AudioApp
from archinstall.applications.bluetooth import BluetoothApp
from archinstall.applications.print_service import PrintServiceApp
from archinstall.lib.models import Audio
from archinstall.lib.models.application import ApplicationConfiguration
from archinstall.lib.models.users import User
Expand All @@ -25,5 +26,8 @@ def install_applications(self, install_session: 'Installer', app_config: Applica
users,
)

if app_config.print_service_config and app_config.print_service_config.enabled:
PrintServiceApp().install(install_session)


application_handler = ApplicationHandler()
45 changes: 44 additions & 1 deletion archinstall/lib/applications/application_menu.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import override

from archinstall.lib.menu.abstract_menu import AbstractSubMenu
from archinstall.lib.models.application import ApplicationConfiguration, Audio, AudioConfiguration, BluetoothConfiguration
from archinstall.lib.models.application import ApplicationConfiguration, Audio, AudioConfiguration, BluetoothConfiguration, PrintServiceConfiguration
from archinstall.lib.translationhandler import tr
from archinstall.tui.curses_menu import SelectMenu
from archinstall.tui.menu_item import MenuItem, MenuItemGroup
Expand Down Expand Up @@ -48,6 +48,12 @@ def _define_menu_options(self) -> list[MenuItem]:
preview_action=self._prev_audio,
key='audio_config',
),
MenuItem(
text=tr('Print service'),
action=select_print_service,
preview_action=self._prev_print_service,
key='print_service_config',
),
]

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

def _prev_print_service(self, item: MenuItem) -> str | None:
if item.value is not None:
print_service_config: PrintServiceConfiguration = item.value

output = f'{tr("Print service")}: '
output += tr('Enabled') if print_service_config.enabled else tr('Disabled')
return output
return None


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


def select_print_service(preset: PrintServiceConfiguration | None) -> PrintServiceConfiguration | None:
group = MenuItemGroup.yes_no()
group.focus_item = MenuItem.no()

if preset is not None:
group.set_selected_by_value(preset.enabled)

header = tr('Would you like to configure the print service?') + '\n'

result = SelectMenu[bool](
group,
header=header,
alignment=Alignment.CENTER,
columns=2,
orientation=Orientation.HORIZONTAL,
allow_skip=True,
).run()

match result.type_:
case ResultType.Selection:
enabled = result.item() == MenuItem.yes()
return PrintServiceConfiguration(enabled)
case ResultType.Skip:
return preset
case _:
raise ValueError('Unhandled result type')


def select_audio(preset: AudioConfiguration | None = None) -> AudioConfiguration | None:
items = [MenuItem(a.value, value=a) for a in Audio]
group = MenuItemGroup(items)
Expand Down
5 changes: 5 additions & 0 deletions archinstall/lib/global_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,11 @@ def _prev_applications(self, item: MenuItem) -> str | None:
output += f'{tr("Audio")}: {audio_config.audio.value}'
output += '\n'

if app_config.print_service_config:
output += f'{tr("Print service")}: '
output += tr('Enabled') if app_config.print_service_config.enabled else tr('Disabled')
output += '\n'

return output

return None
Expand Down
8 changes: 2 additions & 6 deletions archinstall/lib/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,4 @@
from .application import (
ApplicationConfiguration,
Audio,
AudioConfiguration,
BluetoothConfiguration,
)
from .application import ApplicationConfiguration, Audio, AudioConfiguration, BluetoothConfiguration, PrintServiceConfiguration
from .bootloader import Bootloader
from .device import (
BDevice,
Expand Down Expand Up @@ -76,6 +71,7 @@
'PartitionTable',
'PartitionType',
'PasswordStrength',
'PrintServiceConfiguration',
'ProfileConfiguration',
'Repository',
'SectorSize',
Expand Down
24 changes: 24 additions & 0 deletions archinstall/lib/models/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,14 @@ class AudioConfigSerialization(TypedDict):
audio: str


class PrintServiceConfigSerialization(TypedDict):
enabled: bool


class ApplicationSerialization(TypedDict):
bluetooth_config: NotRequired[BluetoothConfigSerialization]
audio_config: NotRequired[AudioConfigSerialization]
print_service_config: NotRequired[PrintServiceConfigSerialization]


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


@dataclass
class PrintServiceConfiguration:
enabled: bool

def json(self) -> PrintServiceConfigSerialization:
return {'enabled': self.enabled}

@staticmethod
def parse_arg(arg: dict[str, Any]) -> 'PrintServiceConfiguration':
return PrintServiceConfiguration(arg['enabled'])


@dataclass
class ApplicationConfiguration:
bluetooth_config: BluetoothConfiguration | None = None
audio_config: AudioConfiguration | None = None
print_service_config: PrintServiceConfiguration | None = None

@staticmethod
def parse_arg(
Expand All @@ -72,6 +90,9 @@ def parse_arg(
if args and (audio_config := args.get('audio_config')) is not None:
app_config.audio_config = AudioConfiguration.parse_arg(audio_config)

if args and (print_service_config := args.get('print_service_config')) is not None:
app_config.print_service_config = PrintServiceConfiguration.parse_arg(print_service_config)

return app_config

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

if self.print_service_config:
config['print_service_config'] = self.print_service_config.json()

return config
6 changes: 6 additions & 0 deletions archinstall/locales/base.pot
Original file line number Diff line number Diff line change
Expand Up @@ -1779,6 +1779,12 @@ msgstr ""
msgid "Would you like to configure Bluetooth?"
msgstr ""

msgid "Print service"
msgstr ""

msgid "Would you like to configure the print service?"
msgstr ""

msgid "Authentication"
msgstr ""

Expand Down
3 changes: 3 additions & 0 deletions tests/data/test_config.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
},
"audio_config": {
"audio": "pipewire"
},
"print_service_config": {
"enabled": true
}
},
"auth_config": {
Expand Down
3 changes: 2 additions & 1 deletion tests/test_args.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
from archinstall.default_profiles.profile import GreeterType
from archinstall.lib.args import ArchConfig, ArchConfigHandler, Arguments
from archinstall.lib.hardware import GfxDriver
from archinstall.lib.models.application import ApplicationConfiguration, Audio, AudioConfiguration, BluetoothConfiguration
from archinstall.lib.models.application import ApplicationConfiguration, Audio, AudioConfiguration, BluetoothConfiguration, PrintServiceConfiguration
from archinstall.lib.models.authentication import AuthenticationConfiguration, U2FLoginConfiguration, U2FLoginMethod
from archinstall.lib.models.bootloader import Bootloader, BootloaderConfiguration
from archinstall.lib.models.device import DiskLayoutConfiguration, DiskLayoutType
Expand Down Expand Up @@ -132,6 +132,7 @@ def test_config_file_parsing(
app_config=ApplicationConfiguration(
bluetooth_config=BluetoothConfiguration(enabled=True),
audio_config=AudioConfiguration(audio=Audio.PIPEWIRE),
print_service_config=PrintServiceConfiguration(enabled=True),
),
auth_config=AuthenticationConfiguration(
root_enc_password=Password(enc_password='password_hash'),
Expand Down