Alter 5 files

Update `circuit_scraper.py`
Update `selectMachine.js`
Update `selectSite.js`
Update `index.html`
Update `web.py`
This commit is contained in:
akp 2022-11-08 23:42:26 +00:00
parent f2f1f9b5e6
commit b3946f752c
No known key found for this signature in database
GPG key ID: AA5726202C8879B7
5 changed files with 52 additions and 30 deletions

View file

@ -39,6 +39,21 @@ class Machine:
}
@dataclass
class Site:
id: str
name: Optional[str]
machines: List[Machine]
def get_machine(self, machine_number: str) -> Optional[Machine]:
res: Optional[Machine] = None
for machine in self.machines:
if machine.number == machine_number:
res = machine
break
return res
class CircuitScraper:
_base_url: str = "https://www.circuit.co.uk/circuit-view/laundry-site"
@ -54,7 +69,7 @@ class CircuitScraper:
@staticmethod
@cached(cache=TTLCache(maxsize=64, ttl=30))
def get_site_machine_states(site_id: str) -> List[Machine]:
def get_site_machine_states(site_id: str) -> Site:
site_url = CircuitScraper._get_site_url(site_id)
r = requests.get(site_url)
@ -66,6 +81,11 @@ class CircuitScraper:
soup = BeautifulSoup(r.content, "html.parser")
site_name: Optional[str] = None
titles = soup.select(".circuit-view-container h3")
if len(titles) != 0:
site_name = titles[0].get_text(strip=True)
machine_elements = []
for item in soup.select("section.accordions--circuit-view.js-machine-type"):
@ -121,14 +141,4 @@ class CircuitScraper:
machines.append(machine)
return machines
@staticmethod
def get_machine(site_id: str, machine_number: str) -> Optional[Machine]:
all_machines = CircuitScraper.get_site_machine_states(site_id)
res: Optional[Machine] = None
for machine in all_machines:
if machine.number == machine_number:
res = machine
break
return res
return Site(site_id, site_name, machines)

View file

@ -1,5 +1,10 @@
const selectMachineBlock = document.getElementById("select_machine")
const selectMachineSelection = document.getElementById("select_machine__selection")
const selectMachineSiteName = document.getElementById("select_machine__site_name")
function setSiteName(siteName) {
selectMachineSiteName.innerText = siteName
}
function addMachineToSelection(machineObject) {
const elem = document.createElement("option")

View file

@ -29,16 +29,18 @@ const selectSiteBlock = document.getElementById("select_site");
}
let numberInUse = 0
for (let i = 0; i < responseBody.length; i += 1) {
const machineObject = responseBody[i]
for (let i = 0; i < responseBody.machines.length; i += 1) {
const machineObject = responseBody.machines[i]
if (machineObject["state"] === "IN_USE") {
addMachineToSelection(machineObject)
numberInUse += 1
}
}
setSiteName(responseBody.name)
if (numberInUse === 0) {
showError("No machines in use.")
showError(`No machines in use at ${responseBody.name}. To select a different site, refresh the page.`)
return
}

View file

@ -30,6 +30,7 @@
</div>
<div id="select_machine" style="display:none;">
<p>Selecting a machine at <span id="select_machine__site_name"></span>. <a onclick="window.location.reload()" href="#">Wrong site?</a></p>
<div class="mb-3">
<label for="select_machine__selection" class="form-label">Select a machine</label>
<select class="form-select" id="select_machine__selection"></select>

View file

@ -46,7 +46,7 @@ def _web_get_index() -> Union[any, Tuple[any, int]]:
def _api_get_machines(site_id: str) -> Union[any, Tuple[any, int]]:
try:
machines = CircuitScraper.get_site_machine_states(site_id)
site = CircuitScraper.get_site_machine_states(site_id)
except ScraperError:
return (
flask.jsonify(
@ -58,8 +58,11 @@ def _api_get_machines(site_id: str) -> Union[any, Tuple[any, int]]:
400,
)
return flask.jsonify(
[
machines = site.machines
return flask.jsonify({
"name": site.name,
"machines": [
machine.to_dict()
for machine in sorted(
machines,
@ -67,8 +70,8 @@ def _api_get_machines(site_id: str) -> Union[any, Tuple[any, int]]:
# taking into account the fact that some machine numbers include letters, which are quietly ignored.
key=lambda x: int("".join(filter(lambda y: y.isdigit(), x.number))),
)
]
)
],
})
@dataclass
@ -89,7 +92,8 @@ def _api_register_watcher(site_id: str) -> Union[any, Tuple[any, int]]:
if machine_number is None:
return flask.jsonify({"ok": False, "message": "missing machine_number"}), 400
machine = CircuitScraper.get_machine(site_id, machine_number)
site = CircuitScraper.get_site_machine_states(site_id)
machine = site.get_machine(machine_number)
if machine is None:
return (
flask.jsonify(
@ -129,10 +133,10 @@ def _api_register_watcher(site_id: str) -> Union[any, Tuple[any, int]]:
requests.post(
f"https://ntfy.sh/{ws.ntfy_topic}",
data=f"Topic registered to {machine.type.value.lower()} {ws.machine_number} at site {site_id}. "
+ time_remaining_text,
data=f"Registered to {machine.type.value.lower()} {ws.machine_number} at {site.name if site.name is not None else site_id} ({site_id}). "
+ time_remaining_text,
headers={
"Title": "Machine registered",
"Title": "Watching machine",
"Tags": "white_check_mark",
},
)
@ -175,7 +179,7 @@ def _api_run_watcher() -> Union[any, Tuple[any, int]]:
site_machines = seen_sites.get(ws.site_id)
if site_machines is None:
try:
site_machines = CircuitScraper.get_site_machine_states(ws.site_id)
site_machines = CircuitScraper.get_site_machine_states(ws.site_id).machines
seen_sites[ws.site_id] = site_machines
except ScraperError:
completed_items.append(i)
@ -197,11 +201,11 @@ def _api_run_watcher() -> Union[any, Tuple[any, int]]:
data=f"{target_machine.type} {target_machine.number} is finished!",
headers={
"Title": (
"Washing"
if target_machine.type == MachineType.Washer
else "Drying"
)
+ " completed!",
"Washing"
if target_machine.type == MachineType.Washer
else "Drying"
)
+ " completed!",
"Priority": "urgent",
"Tags": "tada",
},