Skip to content

Commit 4011a35

Browse files
committed
Fix default scanner autoselect
1 parent 2bb0d10 commit 4011a35

File tree

7 files changed

+87
-68
lines changed

7 files changed

+87
-68
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Kind of like CUPS but it's for scanning, not printing.
44
[![Tests](https://github.com/CoolCat467/Scanner-Server/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/CoolCat467/Scanner-Server/actions/workflows/ci.yml)
55
<!-- BADGIE TIME -->
66

7+
[![pre-commit.ci status](https://results.pre-commit.ci/badge/github/CoolCat467/Scanner-Server/main.svg)](https://results.pre-commit.ci/latest/github/CoolCat467/Scanner-Server/main)
78
[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit)
89
[![code style: black](https://img.shields.io/badge/code_style-black-000000.svg)](https://github.com/psf/black)
910

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ dependencies = [
3737
"python-sane~=2.9.1",
3838
"quart~=0.20.0",
3939
"quart-trio~=0.12.0",
40-
"trio~=0.30.0",
40+
"trio~=0.31.0",
4141
"Werkzeug~=3.1.3",
4242
'exceptiongroup >= 1.2.0; python_version < "3.11"',
4343
'tomli >= 2.0.1; python_version < "3.11"',

src/sanescansrv/generate_pages.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -299,17 +299,13 @@ def generate_scanners() -> str:
299299
"name": "scanner",
300300
"value": htmlgen.jinja_expression("scanner.device_name"),
301301
}
302-
jinja_properties: tuple[str, ...] = ()
303-
default_tag = " ".join(
304-
htmlgen._generate_html_attributes({"checked": "checked"}),
305-
)
306-
jinja_properties = (
302+
jinja_properties: tuple[str, ...] = (
307303
htmlgen.jinja_if_block(
308-
{f"scanner.device_name == {default}": default_tag},
304+
{f"scanner.device_name == {default}": 'checked="checked" '},
309305
block=False,
310306
),
311307
htmlgen.jinja_if_block(
312-
{"not scanner.active": "disabled"},
308+
{"not scanner.active": 'disabled="disabled" '},
313309
block=False,
314310
),
315311
)
@@ -360,7 +356,7 @@ def generate_root_get() -> str:
360356
image_format = htmlgen.select_box(
361357
"img_format",
362358
{v.upper(): v for v in ("png", "jpeg", "pnm", "tiff")},
363-
"png",
359+
"jpeg",
364360
"Select Image format:",
365361
)
366362

@@ -409,11 +405,11 @@ def generate_scanners_get() -> str:
409405
)
410406

411407
scanner = " ".join(
412-
[
408+
(
413409
htmlgen.jinja_expression("scanner.vendor"),
414410
htmlgen.jinja_expression("scanner.model"),
415411
f"({scanner_type_italics})",
416-
],
412+
),
417413
)
418414

419415
scanners = htmlgen.jinja_bullet_list(

src/sanescansrv/htmlgen.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
__author__ = "CoolCat467"
2323
__license__ = "GNU General Public License Version 3"
2424

25-
from typing import TYPE_CHECKING, Union
25+
from typing import TYPE_CHECKING, TypeAlias, Union
2626

2727
if TYPE_CHECKING: # pragma: nocover
2828
from collections.abc import Generator, Iterable, Mapping
@@ -40,7 +40,7 @@ def deindent(level: int, text: str) -> str:
4040
return "\n".join(line.removeprefix(prefix) for line in text.splitlines())
4141

4242

43-
TagArg = Union[str, int, float, bool]
43+
TagArg: TypeAlias = Union[str, int, float, bool]
4444

4545

4646
def _quote_strings(values: Iterable[TagArg]) -> Generator[str, None, None]:
@@ -464,12 +464,16 @@ def jinja_arg_tag(
464464
/,
465465
**kwargs: TagArg,
466466
) -> str:
467-
"""Return HTML tag. Removes trailing underscore from argument names."""
467+
"""Return HTML tag. Removes trailing underscore from argument names.
468+
469+
For properties, make sure jinja expression value ends with a space
470+
if tag arguments are to follow.
471+
"""
468472
args = "".join(jinja_properties)
469473
if args:
470474
args = f" {args}"
471475
if kwargs:
472-
args = f"{args} " + " ".join(_generate_html_attributes(kwargs))
476+
args += " ".join(_generate_html_attributes(kwargs))
473477
return f"<{type_}{args}>"
474478

475479

src/sanescansrv/server.py

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ def value(
378378
return self.default
379379
return self._value
380380

381-
@value.setter
381+
@value.setter # type: ignore[override]
382382
def value(self, value: str | int | float | bool) -> None:
383383
if not self.settable:
384384
raise ValueError(f"Attribute {self.name} is not settable")
@@ -646,7 +646,7 @@ async def scan_status_get() -> (
646646

647647
progress: ScanProgress | None = None
648648
time_deltas_ns: list[int] | None = None
649-
delay = 5
649+
delay = 2
650650
estimated_wait: int = 120
651651

652652
if status == ScanStatus.STARTED:
@@ -658,6 +658,10 @@ async def scan_status_get() -> (
658658
assert isinstance(progress, ScanProgress)
659659
assert isinstance(time_deltas_ns, list)
660660

661+
# Remove first couple of values (takes time to start)
662+
if len(time_deltas_ns) > 1:
663+
time_deltas_ns = time_deltas_ns[1:]
664+
661665
# Estimate when the scan will be done
662666
# Nanoseconds
663667
average_wait_ns = statistics.mean(time_deltas_ns)
@@ -678,11 +682,13 @@ async def scan_status_get() -> (
678682

679683
def get_default_device() -> str:
680684
"""Retrieve the default scan device."""
681-
device = get_scanner(APP_STORAGE["default_device"])
685+
device = get_scanner_by_vendor_model(APP_STORAGE["default_device"])
682686
if device is not None:
683687
return device.device_name
684688
try:
685689
device = APP_STORAGE["scanners"][0]
690+
if not isinstance(device, Device):
691+
return "None"
686692
return device.device_name
687693
except IndexError:
688694
return "None"
@@ -896,6 +902,18 @@ def get_scanner(scanner: str) -> Device | None:
896902
return item
897903

898904

905+
def get_scanner_by_vendor_model(vendor_model: str) -> Device | None:
906+
"""Get scanner device from globally stored devices."""
907+
devices: list[Device] = APP_STORAGE.get("scanners", [])
908+
models = [f"{device.vendor} {device.model}" for device in devices]
909+
if vendor_model not in models:
910+
return None
911+
idx = models.index(vendor_model)
912+
item = devices[idx]
913+
assert isinstance(item, Device)
914+
return item
915+
916+
899917
@app.get("/settings")
900918
async def settings_get() -> AsyncIterator[str] | WerkzeugResponse:
901919
"""Handle settings page GET."""

src/sanescansrv/templates/root_get.html.jinja

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
<span>Select Image format:</span>
1616
<br>
1717
<br>
18-
<input type="radio" id="img_format_0" name="img_format" value="png" checked="checked">
18+
<input type="radio" id="img_format_0" name="img_format" value="png">
1919
<label for="img_format_0">PNG</label>
2020
<br>
21-
<input type="radio" id="img_format_1" name="img_format" value="jpeg">
21+
<input type="radio" id="img_format_1" name="img_format" value="jpeg" checked="checked">
2222
<label for="img_format_1">JPEG</label>
2323
<br>
2424
<input type="radio" id="img_format_2" name="img_format" value="pnm">
@@ -32,7 +32,7 @@
3232
<span>Select a Scanner:</span>
3333
<br>
3434
{% for scanner in scanners %}
35-
<input {% if scanner.device_name == default %}checked="checked"{% endif %}{% if not scanner.active %}disabled{% endif %} type="radio" id="scanner_{{ loop.index0 }}" name="scanner" value="{{ scanner.device_name }}">
35+
<input {% if scanner.device_name == default %}checked="checked" {% endif %}{% if not scanner.active %}disabled="disabled" {% endif %}type="radio" id="scanner_{{ loop.index0 }}" name="scanner" value="{{ scanner.device_name }}">
3636
<label for="scanner_{{ loop.index0 }}">{{ scanner.vendor }} {{ scanner.model }} (<i>{{ scanner.type_ }}</i>)</label>
3737
<br>
3838
{% else %}

0 commit comments

Comments
 (0)