Alter 5 files
Update `circuit_scraper.py` Update `selectMachine.js` Update `selectSite.js` Update `index.html` Update `web.py`
This commit is contained in:
parent
f2f1f9b5e6
commit
b3946f752c
5 changed files with 52 additions and 30 deletions
|
@ -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)
|
||||
|
|
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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",
|
||||
},
|
||||
|
|
Reference in a new issue