second commit

This commit is contained in:
2024-11-19 11:33:05 -05:00
parent b012a68882
commit c054b893f9
6 changed files with 271 additions and 0 deletions

14
README.md Normal file
View File

@@ -0,0 +1,14 @@
From the windows command line, execute the following two commands to install the libraries:
```
pip install pysondb
pip install fastapi
```
To run this app, from wnidows command line, execute:
```
fastapi dev --host 0.0.0.0 --port 8100 main.py
```

60
care_status.json Normal file
View File

@@ -0,0 +1,60 @@
{
"data": [
{
"name": "Gordie",
"got_prepped": false,
"was_fed": false,
"has_cleaned": false,
"has_leftovers": false,
"id": 642860791847515770
},
{
"name": "Ozzy",
"got_prepped": false,
"was_fed": false,
"has_cleaned": false,
"has_leftovers": false,
"id": 520275854060945539
},
{
"name": "Cuddles",
"got_prepped": false,
"was_fed": false,
"has_cleaned": false,
"has_leftovers": false,
"id": 910984427821348550
},
{
"name": "Kya",
"got_prepped": false,
"was_fed": false,
"has_cleaned": false,
"has_leftovers": false,
"id": 142082488335022425
},
{
"name": "Scooter",
"got_prepped": false,
"was_fed": false,
"has_cleaned": false,
"has_leftovers": false,
"id": 276233041724878775
},
{
"name": "Juju",
"got_prepped": false,
"was_fed": false,
"has_cleaned": false,
"has_leftovers": false,
"id": 812769644527389690
},
{
"name": "Wanda",
"got_prepped": false,
"was_fed": false,
"has_cleaned": false,
"has_leftovers": false,
"id": 128015503582002645
}
]
}

1
care_transactions.json Normal file
View File

@@ -0,0 +1 @@
{"data": []}

62
main.py Normal file
View File

@@ -0,0 +1,62 @@
#Just some generic imports
from fastapi import FastAPI
from starlette.responses import FileResponse
from pysondb import db
from pydantic import BaseModel
from datetime import datetime
app = FastAPI()
# Get handles to database
care_db_file_name = "care_status.json"
care_transactions_file_name = "care_transactions.json"
status_db = db.getDb(care_db_file_name)
transactions_db = db.getDb(care_transactions_file_name)
# Return a html located within the pages folder
@app.get("/")
def root():
return FileResponse('pages/checkboxes_demo.html')
# Return data by just dumping the database content
@app.get('/data.json')
def get_data():
all_rows = status_db.getAll()
print("hello!")
for x in all_rows:
del x['id']
return {'result': all_rows}
# This is the "schema" of web request made back and forth between the frontend and backend
class UpdateRecordFeedSheet(BaseModel):
animal_name: str
column_name: str
value_set: bool
# This updates a record
@app.post('/update')
def update_data(item: UpdateRecordFeedSheet):
# Extract the needed values
animal_name = item.animal_name
column_name = item.column_name
value_set = item.value_set
#Find the row to update, and update the new value
row_to_update = status_db.reSearch('name',animal_name)[0] #Pick the first row of results. This isn't a proper database
status_db.updateById(row_to_update['id'], {column_name:value_set})
# Add what was done to the transactions database
transactions_db.add( {'name': animal_name, 'column_updated': column_name, 'value_set': value_set, 'timestamp':datetime.now().isoformat()})

View File

@@ -0,0 +1,95 @@
<link href="https://unpkg.com/tabulator-tables@6.3.0/dist/css/tabulator.min.css" rel="stylesheet">
<script type="text/javascript" src="https://unpkg.com/tabulator-tables@6.3.0/dist/js/tabulator.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<html>
<div id="example-table"></div>
</html>
<script>
/* Function to execute when someone clicks on a cell */
function cell_click_event(event, cell_clicked) {
/* get all the values */
column_name = cell_clicked.getColumn()
.getField()
column_value = cell_clicked.getValue()
animal_name = cell_clicked.getRow()
.getCells()[0].getValue()
new_value = !column_value
/* format the data to send. Note how this resembles the UpdateRecordFeedSheet class in main.py */
let data_to_send = {
'animal_name': animal_name,
'column_name': column_name,
'value_set': new_value
}
/* Send the data as a post request. If the request is done well, then update the cell value */
$.post({
url: 'update',
data: JSON.stringify(data_to_send),
dataType: 'json',
contentType: "application/json",
success: function(data) {
cell_clicked.setValue(new_value)
}
})
}
/* Get data from the data.json endpoint in main.py, and then create a table */
$.getJSON("data.json", function(data) {
var table_data = data["result"]
console.log(table_data)
/* Create the table */
var table = new Tabulator("#example-table", {
columns: [{
title: "Name",
field: "name"
},
{
title: "Prepped?",
formatter: 'tickCross',
field: 'got_prepped',
sorter: "boolean",
cellClick: cell_click_event
},
{
title: "Fed?",
formatter: 'tickCross',
field: "was_fed",
sorter: "boolean",
cellClick: cell_click_event
},
{
title: "Cleaned?",
formatter: 'tickCross',
field: "has_cleaned",
sorter: "boolean",
cellClick: cell_click_event
},
{
title: "Leftovers?",
formatter: 'tickCross',
field: "has_leftovers",
sorter: "boolean",
cellClick: cell_click_event
},
],
data: table_data
});
})
</script>

39
prep_database.py Normal file
View File

@@ -0,0 +1,39 @@
# This generates database file
from pysondb import db
import os
care_db_file_name = "care_status.json"
care_transactions_file_name = "care_transactions.json"
# Clear out database files
def remove_file(file_name):
if os.path.exists(file_name):
os.remove(file_name)
remove_file(care_db_file_name)
remove_file(care_transactions_file_name)
# Recreate database files
status_db = db.getDb(care_db_file_name)
transactions_db = db.getDb(care_transactions_file_name)
#We need to create a database where the first column is the animal name, and the subsequent columns are whether the food was prepped, they were fed, house was cleaned, and whether they had leftovers
columns_to_add = ["got_prepped", "was_fed", "has_cleaned", "has_leftovers"]
animal_names = ["Gordie", "Ozzy", "Cuddles", "Kya", "Scooter", "Juju", "Wanda"]
# Go row by row, and add information
for animal in animal_names:
row_to_add = {'name': animal}
for column in columns_to_add:
row_to_add[column] = False #Set the "prepped/fed/cleaned/leftovers to false
status_db.add(row_to_add)