set up for pool data creation

This commit is contained in:
Andrew Ridgway 2024-03-15 16:04:34 +10:00
parent a0c8b0eeab
commit 4238c47efc
10 changed files with 72 additions and 87 deletions

View File

@ -1,4 +1,4 @@
FROM python:3.10 as real_base_image FROM python:3.10 as pool_base_image
WORKDIR /pool_data WORKDIR /pool_data

View File

@ -2,6 +2,6 @@
docker-compose rm -f docker-compose rm -f
docker system prune -f docker system prune -f
docker volume prune -f docker volume prune -f
docker build -t real_base_image -f base.Dockerfile . docker build -t pool_base_image -f base.Dockerfile .
docker-compose up --remove-orphans --build -d docker-compose up --remove-orphans --build -d
docker logs -f realtracker_web docker logs -f pool_data_web

View File

@ -2,13 +2,13 @@
version: '3.1' version: '3.1'
services: services:
realtracker_web: pool_data_web:
container_name: realtracker_web container_name: pool_data_web
build: build:
context: . context: .
dockerfile: flask.Dockerfile dockerfile: flask.Dockerfile
volumes: volumes:
- ./src/flask:/realestate_tracker/src/flask - ./src/flask:/pool_data_web/src/flask
ports: ports:
- "80:80" - "80:80"
- "5000:5000" - "5000:5000"

View File

@ -1,8 +1,9 @@
FROM real_base_image as flask FROM pool_base_image as flask
COPY requirements.txt . COPY requirements.txt .
ENV FLASK_ENV development ENV FLASK_ENV development
ENV FLASK_DEBUG 1 ENV FLASK_DEBUG 1
#ENTRYPOINT ["python", "src/flask/realtracker_web.py"]
ENTRYPOINT ["flask", "--app", "/pool_data_web/src/flask/pool_data", "run", "--host=0.0.0.0"]

View File

@ -14,16 +14,15 @@ class pool_data:
#already created from here #already created from here
#we can get self.db.real_db etc #we can get self.db.real_db etc
self.db = db_conn() self.db = db_conn()
def record_exists(self, date, test_user):
def record_exists(self, address):
""" """
This function will accept an address This function will accept an address
if it find that address in the database it will return True if it find that address in the database it will return True
and set set the existing_record variable of the class to the and set set the existing_record variable of the class to the
queried record queried record
""" """
query = { "address" : f"{address}" } query = { "date" : f"{date}", "test_user": f"{test_user}"}
record = self.db.real_db.find_one(query) record = self.db.pool_db.find_one(query)
if record: if record:
self.existing_record = record self.existing_record = record
return True return True
@ -31,20 +30,18 @@ class pool_data:
return False return False
def create_re_record(self, address, rooms, pool_link, like_out_of_five, def create_re_record(self, ph, total_chlorine, free_chlorine, alkalinity,
pool = "", requested_price="", user_price="", date, test_user, salt=""):
suburb="", actual_price=""):
""" """
create_re_record creates a whole new record create_re_record creates a whole new record
takes the required 8 inputs takes the required 7 inputs
1. address 1. ph
2. rooms 2. total_chlorine
3. pool 3. free_chlorine
4. realeastate link 4. alkalinity
5. like out of 5 5. date
6. requested_price - THe price the current owner wants if known 6. test_user
7. user_price - what does the user think the price of hte house should be/what offer they've put down 7. salt (optional)
8. actual_price - after sold what price the house went for
It will autogenerate the id string It will autogenerate the id string
this string will be automatically selected this string will be automatically selected
on view in future on view in future
@ -52,17 +49,15 @@ class pool_data:
key = self.create_id() key = self.create_id()
insert_record = { insert_record = {
"_id" : f"{key}", "_id" : f"{key}",
"address": f"{address}", "ph": f"{ph}",
"rooms": f"{rooms}", "total_chlorine": f"{total_chlorine}",
"pool": f"{pool}", "free_chlorine": f"{free_chlorine}",
"pool_link": f"{pool_link}", "alkalinity": f"{alkalinity}",
"like_out_of_five": f"{like_out_of_five}", "salt": f"{salt}",
"requested_price": f"{requested_price}", "date": f"{date}",
"user_price": f"{user_price}", "test_user": f"{test_user}"
"actual_price": f"{actual_price}",
"suburb" : f"{suburb}"
} }
self.db.real_db.insert_one(insert_record) self.db.pool_db.insert_one(insert_record)
def update_re_record(self, id, field, value): def update_re_record(self, id, field, value):
""" """
@ -74,7 +69,7 @@ class pool_data:
query = { "_id": f"{id}"} query = { "_id": f"{id}"}
update_val = {"$set": {f"{field}": f"{value}" }} update_val = {"$set": {f"{field}": f"{value}" }}
self.db.real_db.update_one(query, update_val) self.db.pool_db.update_one(query, update_val)
def create_id(self): def create_id(self):
alphabet = string.ascii_letters + string.digits alphabet = string.ascii_letters + string.digits

View File

@ -7,13 +7,13 @@ class db_conn:
self.db_pass = os.getenv('MONGO_PASS') self.db_pass = os.getenv('MONGO_PASS')
self.db_host = os.getenv('MONGO_HOST') self.db_host = os.getenv('MONGO_HOST')
self.client = self.get_client() self.client = self.get_client()
self.db = self.client['realestate_db'] self.db = self.client['pool_db']
self.real_db = self.db['realestate_data'] self.pool_db = self.db['pool_data']
self.users = self.db['users'] self.users = self.db['users']
self.inspections = self.db['inspections_db'] self.inspections = self.db['inspections_db']
def get_client(self): def get_client(self):
CONNECTION_STRING = f"mongodb://{self.db_user}:{self.db_pass}@{self.db_host}/realestate_db?authSource=admin" CONNECTION_STRING = f"mongodb://{self.db_user}:{self.db_pass}@{self.db_host}/pool_db?authSource=admin"
return MongoClient(CONNECTION_STRING) return MongoClient(CONNECTION_STRING)

View File

@ -3,7 +3,7 @@ import secrets
from mongo.get_conn import db_conn from mongo.get_conn import db_conn
class realestate_query: class pool_query:
""" """
This class will allow us to This class will allow us to
interact with our data to interact interact with our data to interact
@ -15,14 +15,14 @@ class realestate_query:
#we can get self.db.real_db etc #we can get self.db.real_db etc
self.db = db_conn() self.db = db_conn()
def record_exists(self, address): def record_exists(self, test_user, date):
""" """
This function will accept an address This function will accept an address
if it find that address in the database it will return True if it find that address in the database it will return True
and set set the existing_record variable of the class to the and set set the existing_record variable of the class to the
queried record queried record
""" """
query = { "address" : f"{address}" } query = { "test_user" : f"{test_user}", "date" : f"{date}"}
record = self.db.real_db.find_one(query) record = self.db.real_db.find_one(query)
if record: if record:
self.existing_record = record self.existing_record = record
@ -30,14 +30,14 @@ class realestate_query:
else: else:
return False return False
def get_top(self, num_limit): def get_top(self, num_limit, value_field):
""" """
This function will return the This function will return the
top n records based on like_out_of_five last n records of the chosen value field
It will take the number of records you want to It will take the number of records you want to
return as a parameter return as a parameter
""" """
records = self.db.real_db.find({}, {"address": 1, "_id": 0, "realestate_link": 1, "user_price": 1}).sort("like_out_of_five", -1).limit(num_limit) records = self.db.pool_db.find({}, {"test_user": 1, "_id": 0, "date": 1, f"{value_field}": 1}).sort("date", -1).limit(num_limit)
return records return records
def user_check(self, username, password): def user_check(self, username, password):

View File

@ -21,31 +21,28 @@ def index():
@app.route("/updater", methods=["GET", "POST"]) @app.route("/updater", methods=["GET", "POST"])
def updater(): def updater():
query_db = pool_database_query.pool_query() query_db = pool_database_query.pool_query()
query = query_db.get_top(10) query = query_db.get_top(10, "ph")
if request.method == "POST": if request.method == "POST":
database = pool_database.pool_data() database = pool_database.pool_data()
new_record = { new_record = {
"address": f'{request.form["address"]}', "ph": f'{request.form["ph"]}',
"rooms" : f'{request.form["rooms"]}', "total_chlorine" : f'{request.form["total_chlorine"]}',
"real_estate_link": f'{request.form["real_estate_link"]}', "free_chlorine": f'{request.form["free_chlorine"]}',
"like_out_of_five": f'{request.form["like_out_of_five"]}', "alkalinity": f'{request.form["alkalinity"]}',
"pool": f'{request.form["pool"]}', "salt": f'{request.form["salt"]}',
"requested_price": f'{request.form["requested_price"]}', "date": f'{request.form["date"]}',
"user_price": f'{request.form["user_price"]}', "test_user": f'{request.form["test_user"]}',
"actual_price": f'{request.form["actual_price"]}',
"suburb" : f'{request.form["suburb"]}'
} }
if database.record_exists(new_record["address"]): if database.record_exists(new_record["date"], new_record["test_user"]):
for field in database.existing_record: for field in database.existing_record:
for new_field in new_record: for new_field in new_record:
if field == new_field: if field == new_field:
if database.existing_record[field] != new_record[field]: if database.existing_record[field] != new_record[field]:
database.update_re_record(database.existing_record["_id"], field, new_record[field]) database.update_re_record(database.existing_record["_id"], field, new_record[field])
else: else:
database.create_re_record(new_record["address"], new_record["rooms"], new_record["real_estate_link"], database.create_re_record(new_record["ph"], new_record["total_chlorine"], new_record["free_chlorine"],
new_record["like_out_of_five"], new_record["pool"], new_record["requested_price"], new_record["alkalinity"], new_record["date"], new_record["test_user"], new_record["salt"])
new_record["user_price"], new_record["actual_price"], new_record["suburb"])
return render_template("updater.html", list=query) return render_template("updater.html", list=query)
@ -56,21 +53,21 @@ def updater():
def pool_data_update(): def pool_data_update():
database = pool_database.pool_data() database = pool_database.pool_data()
new_record = request.json new_record = request.json
if database.record_exists(new_record["address"]): if database.record_exists(new_record["date"], new_record["test_user"]):
for field in database.existing_record: for field in database.existing_record:
for new_field in new_record: for new_field in new_record:
if field == new_field: if field == new_field:
if database.existing_record[field] != new_record[field]: if database.existing_record[field] != new_record[field]:
database.update_re_record(database.existing_record["_id"], field, new_record[field]) database.update_re_record(database.existing_record["_id"], field, new_record[field])
else: else:
database.create_re_record(new_record["address"], new_record["rooms"], new_record["real_estate_link"], database.create_re_record(new_record["ph"], new_record["total_chlorine"], new_record["free_chlorine"],
new_record["like_out_of_five"], new_record["pool"], new_record["requested_price"], new_record["alkalinity"], new_record["date"], new_record["test_user"], new_record["salt"])
new_record["user_price"], new_record["actual_price"])
@app.route("/pool_top/<int:return_number>")
@app.route("/pool_top/<int:return_number>/<string:field>")
def user_detail(id): def user_detail(id):
query_db = pool_database_query.pool_query() query_db = pool_database_query.pool_query()
query = query_db.get_top(return_number) query = query_db.get_top(return_number, field)
return jsonify([row.to_json() for row in query]) return jsonify([row.to_json() for row in query])
if __name__ == '__main__': if __name__ == '__main__':

View File

@ -1,5 +1,5 @@
<div class="log-form"> <div class="log-form">
<h2>Login to Realestate Tracker</h2> <h2>Login to Pool Data Tracker</h2>
{% if try_again %} {% if try_again %}
<h4>Login Failed Please try Again</h4> <h4>Login Failed Please try Again</h4>
{% endif %} {% endif %}

View File

@ -7,40 +7,32 @@
<td> <td>
<form method="POST" action="/updater"> <form method="POST" action="/updater">
<div class="form-group"> <div class="form-group">
<label for="address">Address:</label> <label for="test_user">Tester:</label>
<input type="text" id="address" class="form-control" name="address" required><br><br> <input type="text" id="test_user" class="form-control" name="test_user" /><br><br>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="rooms">Rooms:</label> <label for="date">Date:</label>
<input type="text" id="rooms" class="form-control" name="rooms" required><br><br> <input type="date" id="date" class="form-control" name="date" /><br><br>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="pool">Pool(True, False):</label> <label for="ph">PH:</label>
<input type="text" class="form-control" id="pool" name="pool" /><br><br> <input type="number" id="ph" class="form-control" name="ph" required><br><br>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="real_estate_link">Realestate.com Link:</label> <label for="total_chlorine">Total Chlorine:</label>
<input type="text" id="real_estate_link" class="form-control" name="real_estate_link" required><br><br> <input type="number" id="total_chlorine" class="form-control" name="total_chlorine" required><br><br>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="like_out_of_five">Like Out of 5:</label> <label for="free_chlorine">Free Chlorine:</label>
<input type="text" id="like_out_of_five" class="form-control" name="like_out_of_five" pattern="[1-5]{1}" required><br><br> <input type="number" class="form-control" id="free_chlorine" name="free_chlorine" /><br><br>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="requested_price">Request Price:</label> <label for="alkalinity">Alkalinity:</label>
<input type="text" id="requested_price" class="form-control" name="requested_price" /><br><br> <input type="number" id="alkalinity" class="form-control" name="alkalinity" required><br><br>
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="user_price">What do you think its worth?:</label> <label for="salt">Salt:</label>
<input type="text" id="user_price" class="form-control" name="user_price" /><br><br> <input type="number" id="salt" class="form-control" name="salt" ><br><br>
</div>
<div class="form-group">
<label for="actual_price">What Price did it go for in the end?:</label>
<input type="text" id="actual_price" class="form-control" name="actual_price" /><br><br>
</div>
<div class="form-group">
<label for="suburb">What Suburb is it in?:</label>
<input type="text" id="suburb" class="form-control" name="suburb" /><br><br>
</div> </div>
<input type="submit" class="btn btn-primary" name="action"/> <input type="submit" class="btn btn-primary" name="action"/>
</form> </form>