Skip to content

Commit 71c3044

Browse files
authored
Merge pull request #57 from utmgdsc/feature/recommendation-messages
Recommendation Messages
2 parents eff7ac2 + efcb8e7 commit 71c3044

File tree

3 files changed

+122
-56
lines changed

3 files changed

+122
-56
lines changed

backend/models/energy.py

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"""
44

55
from __future__ import annotations
6+
import random
67
from typing import Union
78
import json
89
from datetime import datetime
@@ -22,7 +23,6 @@ class EnergyEntry(CARBON_MODEL):
2223
electricity: int # measured in kWh
2324
province: str
2425
household: int
25-
metric_threshold = 200/3
2626

2727
def __init__(self, oid: ObjectId, user_id: ObjectId, carbon_emissions: int, date: Union[str, datetime],
2828
heating_oil: int, natural_gas: int, province: str, household: int, electricity: int) -> None:
@@ -127,10 +127,10 @@ def from_json(doc: json) -> EnergyEntryRecommendation:
127127

128128
@staticmethod
129129
def from_energy_entry(energy_entry: EnergyEntry) -> EnergyEntryRecommendation:
130-
submetric_threshold = EnergyEntry.metric_threshold/3
131-
heating_oil_recommendation = "Heating oil emissions look good!"
132-
natural_gas_recommendation = "Natural gas emissions look good!"
133-
electricity_recommendation = "Electricity emissions look good!"
130+
submetric_threshold = 11
131+
heating_oil_recommendation = "Looking good!"
132+
natural_gas_recommendation = "Looking good!"
133+
electricity_recommendation = "Looking good!"
134134

135135
heating_oil_carbon_emissions = energy_entry.heating_oil * 2.753
136136
natural_gas_carbon_emissions = energy_entry.natural_gas * 1.96
@@ -166,13 +166,25 @@ def from_energy_entry(energy_entry: EnergyEntry) -> EnergyEntryRecommendation:
166166
electricity_carbon_emissions = (energy_entry.electricity * 0.84) / energy_entry.household
167167

168168
if heating_oil_carbon_emissions > submetric_threshold:
169-
heating_oil_recommendation = "Heating oil emissions too high"
169+
recommendation1 = "Be conservative by opting to dress up/down instead of turning on the AC/heater."
170+
recommendation2 = "Consider investing in ENERGY STAR certified products"
171+
recommendation3 = "Consider improving your home insulation, if applicable"
172+
recommendations = [recommendation1, recommendation2, recommendation3]
173+
heating_oil_recommendation = random.choice(recommendations)
170174

171175
if natural_gas_carbon_emissions > submetric_threshold:
172-
natural_gas_recommendation = "Natural gas emissions too high"
176+
recommendation1 = "Consider replacing natural gas heating systems with electric alternatives"
177+
recommendation2 = "Consider investing in ENERGY STAR certified products"
178+
recommendation3 = "Consider improving your home insulation, if applicable"
179+
recommendations = [recommendation1, recommendation2, recommendation3]
180+
natural_gas_recommendation = random.choice(recommendations)
173181

174182
if electricity_carbon_emissions > submetric_threshold:
175-
electricity_recommendation = "Electricity emissions too high"
183+
recommendation1 = "Avoid phantom power by unplugging devices you are not actually using (ex.chargers, toasters, etc.)"
184+
recommendation2 = "Consider investing in ENERGY STAR certified products"
185+
recommendation3 = "Be conservative by opting to dress up/down instead of turning on the AC/heater"
186+
recommendations = [recommendation1, recommendation2, recommendation3]
187+
electricity_recommendation = random.choice(recommendations)
176188

177189
return EnergyEntryRecommendation(heating_oil_recommendation, natural_gas_recommendation, electricity_recommendation)
178190

backend/models/food.py

Lines changed: 69 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"""
44

55
from __future__ import annotations
6+
import random
67
from typing import Union
78
import json
89
from datetime import datetime
@@ -25,7 +26,7 @@ class FoodEntry(CARBON_MODEL):
2526
cheese: int
2627
milk: int
2728
food_waste: int
28-
metric_threshold = 200 / 3
29+
2930

3031
# food measurements in # of 100g servings
3132
def __init__(self, oid: ObjectId, user_id: ObjectId, carbon_emissions: int, date: Union[str, datetime],
@@ -75,14 +76,14 @@ def from_json(doc: json) -> FoodEntry:
7576
)
7677

7778
def calculate_carbon_emissions(self) -> float:
78-
beef_carbon_emissions = self.beef * 15.5
79-
lamb_carbon_emissions = self.lamb * 5.84
80-
pork_carbon_emissions = self.pork * 2.4
81-
chicken_carbon_emissions = self.chicken * 1.8
82-
fish_carbon_emissions = self.fish * 1.8
83-
cheese_carbon_emissions = self.cheese * 2.79
79+
beef_carbon_emissions = self.beef * 9.9
80+
lamb_carbon_emissions = self.lamb * 3.9
81+
pork_carbon_emissions = self.pork * 1.2
82+
chicken_carbon_emissions = self.chicken * 0.98
83+
fish_carbon_emissions = self.fish * 1.3
84+
cheese_carbon_emissions = self.cheese * 2.3
8485
milk_carbon_emissions = self.milk * 0.8
85-
food_waste_carbon_emissions = self.food_waste * 0.25
86+
food_waste_carbon_emissions = self.food_waste * 0.0025
8687
return sum([beef_carbon_emissions, lamb_carbon_emissions, pork_carbon_emissions,
8788
chicken_carbon_emissions, fish_carbon_emissions, cheese_carbon_emissions,
8889
milk_carbon_emissions, food_waste_carbon_emissions])
@@ -91,6 +92,7 @@ def __repr__(self) -> str:
9192
return f'Food ID: {self.oid.__str__()}'
9293

9394

95+
9496
class FoodEntryRecommendation(DB_MODEL):
9597
beef_recommendation: str
9698
lamb_recommendation: str
@@ -142,48 +144,81 @@ def from_json(doc: json) -> FoodEntryRecommendation:
142144

143145
@staticmethod
144146
def from_food_entry(food_entry: FoodEntry) -> FoodEntryRecommendation:
145-
submetric_threshold = FoodEntry.metric_threshold / 8
146-
beef_recommendation = "Beef emissions look good!"
147-
lamb_recommendation = "Lamb emissions look good!"
148-
pork_recommendation = "Pork emissions look good!"
149-
chicken_recommendation = "Chicken emissions look good!"
150-
fish_recommendation = "Fish emissions look good!"
151-
cheese_recommendation = "Cheese emissions look good!"
152-
milk_recommendation = "Milk emissions look good!"
153-
food_waste_recommendation = "Food waste emissions look good!"
154-
155-
beef_carbon_emissions = food_entry.beef * 15.5
156-
lamb_carbon_emissions = food_entry.lamb * 5.84
157-
pork_carbon_emissions = food_entry.pork * 2.4
158-
chicken_carbon_emissions = food_entry.chicken * 1.8
159-
fish_carbon_emissions = food_entry.fish * 1.8
160-
cheese_carbon_emissions = food_entry.cheese * 2.79
147+
submetric_threshold = 11
148+
beef_recommendation = "Looking good!"
149+
lamb_recommendation = "Looking good!"
150+
pork_recommendation = "Looking good!"
151+
chicken_recommendation = "Looking good!"
152+
fish_recommendation = "Looking good!"
153+
cheese_recommendation = "Looking good!"
154+
milk_recommendation = "Looking good!"
155+
food_waste_recommendation = "Looking good!"
156+
157+
beef_carbon_emissions = food_entry.beef * 9.9
158+
lamb_carbon_emissions = food_entry.lamb * 3.9
159+
pork_carbon_emissions = food_entry.pork * 1.2
160+
chicken_carbon_emissions = food_entry.chicken * 0.98
161+
fish_carbon_emissions = food_entry.fish * 1.3
162+
cheese_carbon_emissions = food_entry.cheese * 2.3
163+
161164
milk_carbon_emissions = food_entry.milk * 0.8
162-
food_waste_carbon_emissions = food_entry.food_waste * 0.25
165+
food_waste_carbon_emissions = food_entry.food_waste * 0.0025
163166

164167
if beef_carbon_emissions > submetric_threshold:
165-
beef_recommendation = "Beef emissions too high"
168+
recommendation1 = "Try opting for white meat (fish, chicken, etc.)"
169+
recommendation2 = "Consider alternate forms of protein (chicken, fish, eggs, etc.)"
170+
recommendation3 = "Try opting for low-impact plant protein sources like peas, legumes and tofu"
171+
recommendations = [recommendation1, recommendation2, recommendation3]
172+
beef_recommendation = random.choice(recommendations)
166173

167174
if lamb_carbon_emissions > submetric_threshold:
168-
lamb_recommendation = "Lamb emissions too high"
169-
175+
recommendation1 = "Try opting for white meat (fish, chicken, etc.)"
176+
recommendation2 = "Consider alternate forms of protein (chicken, fish, eggs, etc.)"
177+
recommendation3 = "Try opting for low-impact plant protein sources like peas, legumes and tofu"
178+
recommendations = [recommendation1, recommendation2, recommendation3]
179+
lamb_recommendation = random.choice(recommendations)
180+
170181
if pork_carbon_emissions > submetric_threshold:
171-
pork_recommendation = "Pork emissions too high"
182+
recommendation1 = "Try opting for white meat (fish, chicken, etc.)"
183+
recommendation2 = "Consider alternate forms of protein (chicken, fish, eggs, etc.)"
184+
recommendation3 = "Try opting for low-impact plant protein sources like peas, legumes and tofu"
185+
recommendations = [recommendation1, recommendation2, recommendation3]
186+
pork_recommendation = random.choice(recommendations)
172187

173188
if chicken_carbon_emissions > submetric_threshold:
174-
chicken_recommendation = "Chicken emissions too high"
189+
recommendation1 = "Try opting for low-impact plant protein sources (peas, legumes and tofu)"
190+
recommendation2 = "Consider alternate forms of protein (eggs, whey, etc.)"
191+
recommendation3 = "Consider opting for seitan"
192+
recommendations = [recommendation1, recommendation2, recommendation3]
193+
chicken_recommendation = random.choice(recommendations)
175194

176195
if fish_carbon_emissions > submetric_threshold:
177-
fish_recommendation = "Fish emissions too high"
196+
recommendation1 = "Consider alternate forms of protein (chicken, eggs, whey, etc.)"
197+
recommendation2 = "Try opting for low-impact plant protein sources (peas, legumes and tofu)"
198+
recommendation3 = ""
199+
recommendations = [recommendation1, recommendation2, recommendation3]
200+
fish_recommendation = random.choice(recommendations)
178201

179202
if cheese_carbon_emissions > submetric_threshold:
180-
cheese_recommendation = "Cheese emissions too high"
203+
recommendation1 = "Consider alternatives to cheese spreads (hummus, guacamole, etc.)"
204+
recommendation2 = "Consider plant-based cheeses (made from nuts, soy, or tapioca)"
205+
recommendation3 = "Consider alternatives to cheese (tofu, tempeh, etc.)"
206+
recommendations = [recommendation1, recommendation2, recommendation3]
207+
cheese_recommendation = random.choice(recommendations)
181208

182209
if milk_carbon_emissions > submetric_threshold:
183-
milk_recommendation = "Milk emissions too high"
210+
recommendation1 = "Consider opting for almond milk"
211+
recommendation2 = "Consider opting for soy milk"
212+
recommendation3 = "Consider opting for oat milk"
213+
recommendations = [recommendation1, recommendation2, recommendation3]
214+
milk_recommendation = random.choice(recommendations)
184215

185216
if food_waste_carbon_emissions > submetric_threshold:
186-
food_waste_recommendation = "Food waste emissions too high"
217+
recommendation1 = "Meal planning! Create a realistic shopping list so you only buy what you need"
218+
recommendation2 = "Carefully assess the expiry date of all food items that you purchase"
219+
recommendation3 = "First in First out (FIFO)! Use older ingredients first before they expire."
220+
recommendations = [recommendation1, recommendation2, recommendation3]
221+
food_waste_recommendation = random.choice(recommendations)
187222

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

backend/models/transportation.py

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from __future__ import annotations
66
from typing import Union
77
import json
8+
import random
89
from datetime import datetime
910
from models.abstract_carbon_model import CARBON_MODEL
1011
from models.abstract_db_model import DB_MODEL
@@ -21,8 +22,7 @@ class TransportationEntry(CARBON_MODEL):
2122
motorbike: int
2223
electric_car: int
2324
gasoline_car: int
24-
fuel_efficiency: float
25-
metric_threshold = 200 / 3
25+
fuel_efficieny: float
2626

2727
def __init__(self, oid: ObjectId, user_id: ObjectId, carbon_emissions: int, date: Union[str, datetime],
2828
bus: int, train: int, motorbike: int, electric_car: int, gasoline_car: int, fuel_efficiency: float) -> None:
@@ -82,7 +82,6 @@ class TransportationEntryRecommendation(DB_MODEL):
8282
motorbike_recommendation: str
8383
electric_car_recommendation: str
8484
gasoline_car_recommendation: str
85-
metric_threshold: int
8685

8786
def __init__(self, bus_recommendation: str, train_recommendation: str, motorbike_recommendation: str,
8887
electric_car_recommendation: str, gasoline_car_recommendation: str) -> None:
@@ -114,12 +113,12 @@ def from_json(doc: json) -> TransportationEntryRecommendation:
114113

115114
@staticmethod
116115
def from_transportation_entry(transportation_entry: TransportationEntry) -> TransportationEntryRecommendation:
117-
submetric_threshold = TransportationEntry.metric_threshold / 5
118-
bus_recommendation = "Bus emissions look good!"
119-
train_recommendation = "Train emissions look good!"
120-
motorbike_recommendation = "Motorbike emissions look good!"
121-
electric_car_recommendation = "Electric car emissions look good!"
122-
gasoline_car_recommendation = "Gasoline emissions look good!"
116+
submetric_threshold = 11
117+
bus_recommendation = "Looking good!"
118+
train_recommendation = "Looking good!"
119+
motorbike_recommendation = "Looking good!"
120+
electric_car_recommendation = "Looking good!"
121+
gasoline_car_recommendation = "Looking good!"
123122

124123
bus_carbon_emissions = transportation_entry.bus * 0.103
125124
train_carbon_emissions = transportation_entry.train * 0.037
@@ -128,19 +127,39 @@ def from_transportation_entry(transportation_entry: TransportationEntry) -> Tran
128127
gasoline_car_carbon_emissions = ((transportation_entry.fuel_efficiency * 2.3) / 100) * transportation_entry.gasoline_car
129128

130129
if bus_carbon_emissions > submetric_threshold:
131-
bus_recommendation = "Bus emissions too high"
130+
recommendation1 = "Consider walking short distances"
131+
recommendation2 = "Consider riding an E-Bike or E-scooter when possible"
132+
recommendation3 = "Consider riding a bicycle when travelling short distances"
133+
recommendations = [recommendation1, recommendation2, recommendation3]
134+
bus_recommendation = random.choice(recommendations)
132135

133136
if train_carbon_emissions > submetric_threshold:
134-
train_recommendation = "Train emissions too high"
137+
recommendation1 = "Consider walking short distances"
138+
recommendation2 = "Consider local public transport when possible (buses, trams)"
139+
recommendation3 = "Consider riding a bicycle, E-Bike or E-scooter when travelling short distances"
140+
recommendations = [recommendation1, recommendation2, recommendation3]
141+
train_recommendation = random.choice(recommendations)
135142

136143
if motorbike_carbon_emissions > submetric_threshold:
137-
motorbike_recommendation = "Motorbike emissions too high"
144+
recommendation1 = "Consider walking or biking short distances"
145+
recommendation2 = "Consider taking public transportation more often"
146+
recommendation3 = "Consider carpooling when possible"
147+
recommendations = [recommendation1, recommendation2, recommendation3]
148+
motorbike_recommendation = random.choice(recommendations)
138149

139150
if electric_car_carbon_emissions > submetric_threshold:
140-
electric_car_recommendation = "Electric car emissions too high"
151+
recommendation1 = "Consider taking public transportation more often"
152+
recommendation2 = "Consider carpooling when possible"
153+
recommendation3 = "Consider walking or biking short distances"
154+
recommendations = [recommendation1, recommendation2, recommendation3]
155+
electric_car_recommendation = random.choice(recommendations)
141156

142157
if gasoline_car_carbon_emissions > submetric_threshold:
143-
gasoline_car_recommendation = "Gasoline car emissions too high"
158+
recommendation1 = "Consider taking public transportation more often"
159+
recommendation2 = "Consider carpooling when possible"
160+
recommendation3 = "Consider walking or biking short distances"
161+
recommendations = [recommendation1, recommendation2, recommendation3]
162+
gasoline_car_recommendation = random.choice(recommendations)
144163

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

0 commit comments

Comments
 (0)