Skip to content

Commit

Permalink
Merge branch 'main' into feature/recommendation-messages
Browse files Browse the repository at this point in the history
  • Loading branch information
IshavSohal authored Dec 18, 2023
2 parents 630c0da + 9fdf382 commit 641c787
Show file tree
Hide file tree
Showing 21 changed files with 410 additions and 211 deletions.
100 changes: 0 additions & 100 deletions .idea/shelf/Uncommitted_changes_before_rebase_[Changes]/shelved.patch

This file was deleted.

5 changes: 4 additions & 1 deletion backend/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from routes.transportation import transportation_service
from routes.food import food_service
from routes.energy import energy_service

from workers.jobs import start_jobs

app = Flask(__name__)
app.json = CustomJSONProvider(app)
Expand All @@ -26,6 +26,9 @@
CORS(app)


start_jobs()


@app.route("/")
def home() -> Response:
return jsonify('Carbon Track APP BACKEND API :: If You Can See This Message You Can Reach This API')
Expand Down
19 changes: 11 additions & 8 deletions backend/models/energy.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
from models.abstract_carbon_model import CARBON_MODEL
from bson import ObjectId

from models.abstract_db_model import DB_MODEL


class EnergyEntry(CARBON_MODEL):
oid: ObjectId
Expand Down Expand Up @@ -97,12 +99,13 @@ def __repr__(self) -> str:
return f'Energy ID: {self.oid.__str__()}'


class EnergyEntryRecommendation(CARBON_MODEL):
heating_oil_recommendation: str
natural_gas_recommendation: str
electricity_recommendation: str
class EnergyEntryRecommendation(DB_MODEL):
heating_oil_recommendation: str
natural_gas_recommendation: str
electricity_recommendation: str

def __init__(self, heating_oil_recommendation: int, natural_gas_recommendation: int, electricity_recommendation: int) -> None:
def __init__(self, heating_oil_recommendation: str, natural_gas_recommendation: str, electricity_recommendation: str) -> None:
super().__init__(ObjectId())
self.heating_oil_recommendation = heating_oil_recommendation
self.natural_gas_recommendation = natural_gas_recommendation
self.electricity_recommendation = electricity_recommendation
Expand All @@ -115,13 +118,14 @@ def to_json(self) -> json:
}

@staticmethod
def from_json(doc: json) -> EnergyEntry:
return EnergyEntry(
def from_json(doc: json) -> EnergyEntryRecommendation:
return EnergyEntryRecommendation(
heating_oil_recommendation=doc["heating_oil_recommendation"],
natural_gas_recommendation=doc["natural_gas_recommendation"],
electricity_recommendation=doc["electricity_recommendation"]
)

@staticmethod
def from_energy_entry(energy_entry: EnergyEntry) -> EnergyEntryRecommendation:
submetric_threshold = 11
heating_oil_recommendation = "Looking good!"
Expand Down Expand Up @@ -183,7 +187,6 @@ def from_energy_entry(energy_entry: EnergyEntry) -> EnergyEntryRecommendation:
electricity_recommendation = random.choice(recommendations)

return EnergyEntryRecommendation(heating_oil_recommendation, natural_gas_recommendation, electricity_recommendation)


def __repr__(self) -> str:
return f'Energy ID: {self.oid.__str__()}'
18 changes: 12 additions & 6 deletions backend/models/food.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
from models.abstract_carbon_model import CARBON_MODEL
from bson import ObjectId

from models.abstract_db_model import DB_MODEL


class FoodEntry(CARBON_MODEL):
oid: ObjectId
Expand All @@ -25,6 +27,7 @@ class FoodEntry(CARBON_MODEL):
milk: int
food_waste: int


# food measurements in # of 100g servings
def __init__(self, oid: ObjectId, user_id: ObjectId, carbon_emissions: int, date: Union[str, datetime],
beef: int, lamb: int, pork: int, chicken: int, fish: int, cheese: int, milk: int,
Expand Down Expand Up @@ -89,7 +92,7 @@ def __repr__(self) -> str:
return f'Food ID: {self.oid.__str__()}'


class FoodEntryRecomendation(CARBON_MODEL):
class FoodEntryRecommendation(DB_MODEL):
beef_recommendation: str
lamb_recommendation: str
pork_recommendation: str
Expand All @@ -100,9 +103,10 @@ class FoodEntryRecomendation(CARBON_MODEL):
food_waste_recommendation: str

# food measurements in # of 100g servings
def __init__(self, beef_recommendation: str, lamb_recommendation: str, pork_recommendation: str, chicken_recommendation: str,
def __init__(self, beef_recommendation: str, lamb_recommendation: str, pork_recommendation: str, chicken_recommendation: str,
fish_recommendation: str, cheese_recommendation: str, milk_recommendation: str,
food_waste_recommendation: str) -> None:
super().__init__(ObjectId())
self.beef_recommendation = beef_recommendation
self.lamb_recommendation = lamb_recommendation
self.pork_recommendation = pork_recommendation
Expand All @@ -125,8 +129,8 @@ def to_json(self) -> json:
}

@staticmethod
def from_json(doc: json) -> FoodEntry:
return FoodEntry(
def from_json(doc: json) -> FoodEntryRecommendation:
return FoodEntryRecommendation(
beef_recommendation=doc['beef_recommendation'],
lamb_recommendation=doc['lamb_recommendation'],
pork_recommendation=doc['pork_recommendation'],
Expand All @@ -136,7 +140,6 @@ def from_json(doc: json) -> FoodEntry:
milk_recommendation=doc['milk_recommendation'],
food_waste_recommendation=doc['food_waste_recommendation']
)


@staticmethod
def from_food_entry(food_entry: FoodEntry) -> FoodEntryRecomendation:
Expand All @@ -156,6 +159,7 @@ def from_food_entry(food_entry: FoodEntry) -> FoodEntryRecomendation:
chicken_carbon_emissions = food_entry.chicken * 0.98
fish_carbon_emissions = food_entry.fish * 1.3
cheese_carbon_emissions = food_entry.cheese * 2.3

milk_carbon_emissions = food_entry.milk * 0.8
food_waste_carbon_emissions = food_entry.food_waste * 0.0025

Expand Down Expand Up @@ -219,6 +223,8 @@ def from_food_entry(food_entry: FoodEntry) -> FoodEntryRecomendation:
fish_recommendation, cheese_recommendation, milk_recommendation, food_waste_recommendation)


return FoodEntryRecommendation(beef_recommendation, lamb_recommendation, pork_recommendation, chicken_recommendation,
fish_recommendation, cheese_recommendation, milk_recommendation, food_waste_recommendation)

def __repr__(self) -> str:
return f'Food ID: {self.oid.__str__()}'
return f'Food ID: {self.oid.__str__()}'
27 changes: 12 additions & 15 deletions backend/models/transportation.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,14 @@ def calculate_carbon_emissions(self) -> int:
bus_carbon_emissions = self.bus * 0.103
train_carbon_emissions = self.train * 0.037
motorbike_carbon_emissions = self.motorbike * 0.113
electric_car_carbon_emissions = ((self.fuel_efficiency * 8.9 * 0.4)/100) * self.electric_car
gasoline_car_carbon_emissions = ((self.fuel_efficiency * 2.3)/100) * self.gasoline_car
electric_car_carbon_emissions = ((self.fuel_efficiency * 8.9 * 0.4) / 100) * self.electric_car
gasoline_car_carbon_emissions = ((self.fuel_efficiency * 2.3) / 100) * self.gasoline_car
return int(sum([bus_carbon_emissions, train_carbon_emissions, motorbike_carbon_emissions,
electric_car_carbon_emissions, gasoline_car_carbon_emissions]))

def __repr__(self) -> str:
return f"Transportation ID: {self.oid.__str__()}"


class TransportationEntryRecommendation(DB_MODEL):
bus_recommendation: str
Expand All @@ -83,14 +83,14 @@ class TransportationEntryRecommendation(DB_MODEL):
electric_car_recommendation: str
gasoline_car_recommendation: str

def __init__(self, bus_recommendation: str, train_recommendation: str, motorbike_recommendation: str,
def __init__(self, bus_recommendation: str, train_recommendation: str, motorbike_recommendation: str,
electric_car_recommendation: str, gasoline_car_recommendation: str) -> None:
super().__init__(ObjectId())
self.bus_recommendation = bus_recommendation
self.train_recommendation = train_recommendation
self.motorbike_recommendation = motorbike_recommendation
self.electric_car_recommendation = electric_car_recommendation
self.gasoline_car_recommendation = gasoline_car_recommendation


def to_json(self) -> json:
return {
Expand All @@ -102,15 +102,15 @@ def to_json(self) -> json:
}

@staticmethod
def from_json(doc: json) -> TransportationEntry:
return TransportationEntry(
def from_json(doc: json) -> TransportationEntryRecommendation:
return TransportationEntryRecommendation(
bus_recommendation=doc["bus_recommendation"],
train_recommendation=doc["train_recommendation"],
motorbike_recommendation=doc["motorbike_recommendation"],
electric_car_recommendation=doc["electric_car_recommendation"],
gasoline_car_recommendation=doc["gasoline_car_recommendation"]
)

@staticmethod
def from_transportation_entry(transportation_entry: TransportationEntry) -> TransportationEntryRecommendation:
submetric_threshold = 11
Expand All @@ -123,8 +123,8 @@ def from_transportation_entry(transportation_entry: TransportationEntry) -> Tran
bus_carbon_emissions = transportation_entry.bus * 0.103
train_carbon_emissions = transportation_entry.train * 0.037
motorbike_carbon_emissions = transportation_entry.motorbike * 0.113
electric_car_carbon_emissions = ((transportation_entry.fuel_efficiency * 8.9 * 0.4)/100) * transportation_entry.electric_car
gasoline_car_carbon_emissions = ((transportation_entry.fuel_efficiency * 2.3)/100) * transportation_entry.gasoline_car
electric_car_carbon_emissions = ((transportation_entry.fuel_efficiency * 8.9 * 0.4) / 100) * transportation_entry.electric_car
gasoline_car_carbon_emissions = ((transportation_entry.fuel_efficiency * 2.3) / 100) * transportation_entry.gasoline_car

if bus_carbon_emissions > submetric_threshold:
recommendation1 = "Consider walking short distances"
Expand All @@ -139,7 +139,7 @@ def from_transportation_entry(transportation_entry: TransportationEntry) -> Tran
recommendation3 = "Consider riding a bicycle, E-Bike or E-scooter when travelling short distances"
recommendations = [recommendation1, recommendation2, recommendation3]
train_recommendation = random.choice(recommendations)

if motorbike_carbon_emissions > submetric_threshold:
recommendation1 = "Consider walking or biking short distances"
recommendation2 = "Consider taking public transportation more often"
Expand All @@ -161,11 +161,8 @@ def from_transportation_entry(transportation_entry: TransportationEntry) -> Tran
recommendations = [recommendation1, recommendation2, recommendation3]
gasoline_car_recommendation = random.choice(recommendations)


return TransportationEntryRecommendation(bus_recommendation, train_recommendation,
return TransportationEntryRecommendation(bus_recommendation, train_recommendation,
motorbike_recommendation, electric_car_recommendation, gasoline_car_recommendation)


def __repr__(self) -> str:
return f"Transportation ID: {self.oid.__str__()}"

19 changes: 17 additions & 2 deletions backend/models/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ class User(DB_MODEL):
province: str
household: int
fuel_efficiency: float
monthly_emissions: int
yearly_emissions: int
overall_emissions: int

def __init__(
self,
Expand All @@ -30,11 +33,14 @@ def __init__(
badges: list[str],
friends: list[str],
monthly_score:int,
yearly_score:int,
yearly_score:int,
overall_score:int,
province: str,
household: int,
fuel_efficiency: float,
monthly_emissions: int,
yearly_emissions: int,
overall_emissions: int,
) -> None:
super().__init__(oid)
self.full_name = str(full_name)
Expand All @@ -48,6 +54,9 @@ def __init__(
self.province = province
self.household = household
self.fuel_efficiency = fuel_efficiency
self.monthly_emissions = monthly_emissions
self.yearly_emissions = yearly_emissions
self.overall_emissions = overall_emissions

def to_json(self) -> json:
return {
Expand All @@ -62,7 +71,10 @@ def to_json(self) -> json:
'overall_score': self.overall_score,
'province': self.province,
'household': self.household,
'fuel_efficiency': self.fuel_efficiency
'fuel_efficiency': self.fuel_efficiency,
'monthly_emissions': self.monthly_emissions,
'yearly_emissions': self.yearly_emissions,
'overall_emissions': self.overall_emissions,
}

@staticmethod
Expand All @@ -80,6 +92,9 @@ def from_json(doc: json) -> User:
province=doc["province"],
household=doc["household"],
fuel_efficiency=doc["fuel_efficiency"],
monthly_emissions=doc["monthly_emissions"],
yearly_emissions=doc["yearly_emissions"],
overall_emissions=doc["overall_emissions"]
)

def __repr__(self) -> str:
Expand Down
5 changes: 3 additions & 2 deletions backend/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
firebase_admin==6.2.0
firebase_admin==6.3.0
Flask==3.0.0
Flask_Cors==4.0.0
Flask_HTTPAuth==4.8.0
pymongo==4.6.0
pymongo==4.6.1
ruff==0.1.4
typing~=3.7.4.3
werkzeug~=3.0.1
APScheduler~=3.10.4
6 changes: 3 additions & 3 deletions backend/routes/food.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from bson import ObjectId
from flask import Blueprint, Response, abort, jsonify, request

from models.food import FoodEntry, FoodEntryRecomendation
from models.food import FoodEntry, FoodEntryRecommendation
from mongodb_api.carbon_track_db import CarbonTrackDB
from routes import carbon_auth
from utils.FirebaseAPI import FirebaseAPI
Expand Down Expand Up @@ -111,7 +111,7 @@ def get_food_recommendation_for_today() -> Response:
return get_food_metric_for_today()
else:
item = FoodEntry.from_json(item)
food_recommendation = FoodEntryRecomendation.from_food_entry(item).to_json()
food_recommendation = FoodEntryRecommendation.from_food_entry(item).to_json()
return jsonify({'food_recommendation': food_recommendation})
except CarbonTrackError as e:
abort(code=400, description=f"{e}")
abort(code=400, description=f"{e}")
9 changes: 4 additions & 5 deletions backend/routes/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ def get_top_users() -> Response:
user = {
"rank": rank,
"name": obj.full_name,
"footprint": 0,
"footprint": obj.monthly_emissions,
"score": obj.overall_score,
}
rank += 1
Expand All @@ -57,7 +57,7 @@ def get_top_users() -> Response:
user = {
"rank": rank,
"name": obj.full_name,
"footprint": 0,
"footprint": obj.yearly_emissions,
"score": obj.overall_score,
}
rank += 1
Expand All @@ -74,7 +74,7 @@ def get_top_users() -> Response:
user = {
"rank": rank,
"name": obj.full_name,
"footprint": 0,
"footprint": obj.overall_emissions,
"score": obj.overall_score,
}
rank += 1
Expand All @@ -88,7 +88,6 @@ def get_top_users() -> Response:
}
)


except CarbonTrackError as e:
abort(code=400, description=f"{e}")

Expand Down Expand Up @@ -231,4 +230,4 @@ def update_user_name(user_id: str) -> Response:

return jsonify({"user": item}), 200
except CarbonTrackError as e:
abort(code=400, description=f"{e}")
abort(code=400, description=f"{e}")
Loading

0 comments on commit 641c787

Please sign in to comment.