Skip to content

Commit 9fdf382

Browse files
authored
Merge pull request #53 from utmgdsc/feature/81/full-sys-integration
Feature/81/full sys integration
2 parents c2f2008 + ae46fe5 commit 9fdf382

21 files changed

Lines changed: 416 additions & 223 deletions

File tree

‎.idea/shelf/Uncommitted_changes_before_rebase_[Changes]/shelved.patch‎

Lines changed: 0 additions & 100 deletions
This file was deleted.

‎backend/app.py‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from routes.transportation import transportation_service
1212
from routes.food import food_service
1313
from routes.energy import energy_service
14-
14+
from workers.jobs import start_jobs
1515

1616
app = Flask(__name__)
1717
app.json = CustomJSONProvider(app)
@@ -26,6 +26,9 @@
2626
CORS(app)
2727

2828

29+
start_jobs()
30+
31+
2932
@app.route("/")
3033
def home() -> Response:
3134
return jsonify('Carbon Track APP BACKEND API :: If You Can See This Message You Can Reach This API')

‎backend/models/energy.py‎

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from models.abstract_carbon_model import CARBON_MODEL
1010
from bson import ObjectId
1111

12+
from models.abstract_db_model import DB_MODEL
13+
1214

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

99101

100-
class EnergyEntryRecommendation(CARBON_MODEL):
101-
heating_oil_recommendation: str
102-
natural_gas_recommendation: str
103-
electricity_recommendation: str
102+
class EnergyEntryRecommendation(DB_MODEL):
103+
heating_oil_recommendation: str
104+
natural_gas_recommendation: str
105+
electricity_recommendation: str
104106

105-
def __init__(self, heating_oil_recommendation: int, natural_gas_recommendation: int, electricity_recommendation: int) -> None:
107+
def __init__(self, heating_oil_recommendation: str, natural_gas_recommendation: str, electricity_recommendation: str) -> None:
108+
super().__init__(ObjectId())
106109
self.heating_oil_recommendation = heating_oil_recommendation
107110
self.natural_gas_recommendation = natural_gas_recommendation
108111
self.electricity_recommendation = electricity_recommendation
@@ -115,17 +118,18 @@ def to_json(self) -> json:
115118
}
116119

117120
@staticmethod
118-
def from_json(doc: json) -> EnergyEntry:
119-
return EnergyEntry(
121+
def from_json(doc: json) -> EnergyEntryRecommendation:
122+
return EnergyEntryRecommendation(
120123
heating_oil_recommendation=doc["heating_oil_recommendation"],
121124
natural_gas_recommendation=doc["natural_gas_recommendation"],
122125
electricity_recommendation=doc["electricity_recommendation"]
123126
)
124127

128+
@staticmethod
125129
def from_energy_entry(energy_entry: EnergyEntry) -> EnergyEntryRecommendation:
126130
submetric_threshold = EnergyEntry.metric_threshold/3
127131
heating_oil_recommendation = "Heating oil emissions look good!"
128-
natural_gas_recommendation = "Natural gas emissions look good!"
132+
natural_gas_recommendation = "Natural gas emissions look good!"
129133
electricity_recommendation = "Electricity emissions look good!"
130134

131135
heating_oil_carbon_emissions = energy_entry.heating_oil * 2.753
@@ -171,7 +175,6 @@ def from_energy_entry(energy_entry: EnergyEntry) -> EnergyEntryRecommendation:
171175
electricity_recommendation = "Electricity emissions too high"
172176

173177
return EnergyEntryRecommendation(heating_oil_recommendation, natural_gas_recommendation, electricity_recommendation)
174-
175178

176179
def __repr__(self) -> str:
177180
return f'Energy ID: {self.oid.__str__()}'

‎backend/models/food.py‎

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from models.abstract_carbon_model import CARBON_MODEL
1010
from bson import ObjectId
1111

12+
from models.abstract_db_model import DB_MODEL
13+
1214

1315
class FoodEntry(CARBON_MODEL):
1416
oid: ObjectId
@@ -23,7 +25,7 @@ class FoodEntry(CARBON_MODEL):
2325
cheese: int
2426
milk: int
2527
food_waste: int
26-
metric_threshold = 200/3
28+
metric_threshold = 200 / 3
2729

2830
# food measurements in # of 100g servings
2931
def __init__(self, oid: ObjectId, user_id: ObjectId, carbon_emissions: int, date: Union[str, datetime],
@@ -89,7 +91,7 @@ def __repr__(self) -> str:
8991
return f'Food ID: {self.oid.__str__()}'
9092

9193

92-
class FoodEntryRecomendation(CARBON_MODEL):
94+
class FoodEntryRecommendation(DB_MODEL):
9395
beef_recommendation: str
9496
lamb_recommendation: str
9597
pork_recommendation: str
@@ -100,9 +102,10 @@ class FoodEntryRecomendation(CARBON_MODEL):
100102
food_waste_recommendation: str
101103

102104
# food measurements in # of 100g servings
103-
def __init__(self, beef_recommendation: str, lamb_recommendation: str, pork_recommendation: str, chicken_recommendation: str,
105+
def __init__(self, beef_recommendation: str, lamb_recommendation: str, pork_recommendation: str, chicken_recommendation: str,
104106
fish_recommendation: str, cheese_recommendation: str, milk_recommendation: str,
105107
food_waste_recommendation: str) -> None:
108+
super().__init__(ObjectId())
106109
self.beef_recommendation = beef_recommendation
107110
self.lamb_recommendation = lamb_recommendation
108111
self.pork_recommendation = pork_recommendation
@@ -125,8 +128,8 @@ def to_json(self) -> json:
125128
}
126129

127130
@staticmethod
128-
def from_json(doc: json) -> FoodEntry:
129-
return FoodEntry(
131+
def from_json(doc: json) -> FoodEntryRecommendation:
132+
return FoodEntryRecommendation(
130133
beef_recommendation=doc['beef_recommendation'],
131134
lamb_recommendation=doc['lamb_recommendation'],
132135
pork_recommendation=doc['pork_recommendation'],
@@ -136,11 +139,10 @@ def from_json(doc: json) -> FoodEntry:
136139
milk_recommendation=doc['milk_recommendation'],
137140
food_waste_recommendation=doc['food_waste_recommendation']
138141
)
139-
140142

141143
@staticmethod
142-
def from_food_entry(food_entry: FoodEntry) -> FoodEntryRecomendation:
143-
submetric_threshold = FoodEntry.metric_threshold/8
144+
def from_food_entry(food_entry: FoodEntry) -> FoodEntryRecommendation:
145+
submetric_threshold = FoodEntry.metric_threshold / 8
144146
beef_recommendation = "Beef emissions look good!"
145147
lamb_recommendation = "Lamb emissions look good!"
146148
pork_recommendation = "Pork emissions look good!"
@@ -164,7 +166,7 @@ def from_food_entry(food_entry: FoodEntry) -> FoodEntryRecomendation:
164166

165167
if lamb_carbon_emissions > submetric_threshold:
166168
lamb_recommendation = "Lamb emissions too high"
167-
169+
168170
if pork_carbon_emissions > submetric_threshold:
169171
pork_recommendation = "Pork emissions too high"
170172

@@ -182,11 +184,9 @@ def from_food_entry(food_entry: FoodEntry) -> FoodEntryRecomendation:
182184

183185
if food_waste_carbon_emissions > submetric_threshold:
184186
food_waste_recommendation = "Food waste emissions too high"
185-
186-
return FoodEntryRecomendation(beef_recommendation, lamb_recommendation, pork_recommendation, chicken_recommendation,
187-
fish_recommendation, cheese_recommendation, milk_recommendation, food_waste_recommendation)
188-
189187

188+
return FoodEntryRecommendation(beef_recommendation, lamb_recommendation, pork_recommendation, chicken_recommendation,
189+
fish_recommendation, cheese_recommendation, milk_recommendation, food_waste_recommendation)
190190

191191
def __repr__(self) -> str:
192-
return f'Food ID: {self.oid.__str__()}'
192+
return f'Food ID: {self.oid.__str__()}'

‎backend/models/transportation.py‎

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ class TransportationEntry(CARBON_MODEL):
2121
motorbike: int
2222
electric_car: int
2323
gasoline_car: int
24-
fuel_efficieny: float
25-
metric_threshold = 200/3
24+
fuel_efficiency: float
25+
metric_threshold = 200 / 3
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:
@@ -67,14 +67,14 @@ def calculate_carbon_emissions(self) -> int:
6767
bus_carbon_emissions = self.bus * 0.103
6868
train_carbon_emissions = self.train * 0.037
6969
motorbike_carbon_emissions = self.motorbike * 0.113
70-
electric_car_carbon_emissions = ((self.fuel_efficiency * 8.9 * 0.4)/100) * self.electric_car
71-
gasoline_car_carbon_emissions = ((self.fuel_efficiency * 2.3)/100) * self.gasoline_car
70+
electric_car_carbon_emissions = ((self.fuel_efficiency * 8.9 * 0.4) / 100) * self.electric_car
71+
gasoline_car_carbon_emissions = ((self.fuel_efficiency * 2.3) / 100) * self.gasoline_car
7272
return int(sum([bus_carbon_emissions, train_carbon_emissions, motorbike_carbon_emissions,
7373
electric_car_carbon_emissions, gasoline_car_carbon_emissions]))
7474

7575
def __repr__(self) -> str:
7676
return f"Transportation ID: {self.oid.__str__()}"
77-
77+
7878

7979
class TransportationEntryRecommendation(DB_MODEL):
8080
bus_recommendation: str
@@ -84,14 +84,14 @@ class TransportationEntryRecommendation(DB_MODEL):
8484
gasoline_car_recommendation: str
8585
metric_threshold: int
8686

87-
def __init__(self, bus_recommendation: str, train_recommendation: str, motorbike_recommendation: str,
87+
def __init__(self, bus_recommendation: str, train_recommendation: str, motorbike_recommendation: str,
8888
electric_car_recommendation: str, gasoline_car_recommendation: str) -> None:
89+
super().__init__(ObjectId())
8990
self.bus_recommendation = bus_recommendation
9091
self.train_recommendation = train_recommendation
9192
self.motorbike_recommendation = motorbike_recommendation
9293
self.electric_car_recommendation = electric_car_recommendation
9394
self.gasoline_car_recommendation = gasoline_car_recommendation
94-
9595

9696
def to_json(self) -> json:
9797
return {
@@ -103,18 +103,18 @@ def to_json(self) -> json:
103103
}
104104

105105
@staticmethod
106-
def from_json(doc: json) -> TransportationEntry:
107-
return TransportationEntry(
106+
def from_json(doc: json) -> TransportationEntryRecommendation:
107+
return TransportationEntryRecommendation(
108108
bus_recommendation=doc["bus_recommendation"],
109109
train_recommendation=doc["train_recommendation"],
110110
motorbike_recommendation=doc["motorbike_recommendation"],
111111
electric_car_recommendation=doc["electric_car_recommendation"],
112112
gasoline_car_recommendation=doc["gasoline_car_recommendation"]
113113
)
114-
114+
115115
@staticmethod
116116
def from_transportation_entry(transportation_entry: TransportationEntry) -> TransportationEntryRecommendation:
117-
submetric_threshold = TransportationEntry.metric_threshold/5
117+
submetric_threshold = TransportationEntry.metric_threshold / 5
118118
bus_recommendation = "Bus emissions look good!"
119119
train_recommendation = "Train emissions look good!"
120120
motorbike_recommendation = "Motorbike emissions look good!"
@@ -124,15 +124,15 @@ def from_transportation_entry(transportation_entry: TransportationEntry) -> Tran
124124
bus_carbon_emissions = transportation_entry.bus * 0.103
125125
train_carbon_emissions = transportation_entry.train * 0.037
126126
motorbike_carbon_emissions = transportation_entry.motorbike * 0.113
127-
electric_car_carbon_emissions = ((transportation_entry.fuel_efficiency * 8.9 * 0.4)/100) * transportation_entry.electric_car
128-
gasoline_car_carbon_emissions = ((transportation_entry.fuel_efficiency * 2.3)/100) * transportation_entry.gasoline_car
127+
electric_car_carbon_emissions = ((transportation_entry.fuel_efficiency * 8.9 * 0.4) / 100) * transportation_entry.electric_car
128+
gasoline_car_carbon_emissions = ((transportation_entry.fuel_efficiency * 2.3) / 100) * transportation_entry.gasoline_car
129129

130130
if bus_carbon_emissions > submetric_threshold:
131131
bus_recommendation = "Bus emissions too high"
132132

133133
if train_carbon_emissions > submetric_threshold:
134134
train_recommendation = "Train emissions too high"
135-
135+
136136
if motorbike_carbon_emissions > submetric_threshold:
137137
motorbike_recommendation = "Motorbike emissions too high"
138138

@@ -142,11 +142,8 @@ def from_transportation_entry(transportation_entry: TransportationEntry) -> Tran
142142
if gasoline_car_carbon_emissions > submetric_threshold:
143143
gasoline_car_recommendation = "Gasoline car emissions too high"
144144

145-
146-
return TransportationEntryRecommendation(bus_recommendation, train_recommendation,
145+
return TransportationEntryRecommendation(bus_recommendation, train_recommendation,
147146
motorbike_recommendation, electric_car_recommendation, gasoline_car_recommendation)
148147

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

‎backend/models/user.py‎

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ class User(DB_MODEL):
2020
province: str
2121
household: int
2222
fuel_efficiency: float
23+
monthly_emissions: int
24+
yearly_emissions: int
25+
overall_emissions: int
2326

2427
def __init__(
2528
self,
@@ -30,11 +33,14 @@ def __init__(
3033
badges: list[str],
3134
friends: list[str],
3235
monthly_score:int,
33-
yearly_score:int,
36+
yearly_score:int,
3437
overall_score:int,
3538
province: str,
3639
household: int,
3740
fuel_efficiency: float,
41+
monthly_emissions: int,
42+
yearly_emissions: int,
43+
overall_emissions: int,
3844
) -> None:
3945
super().__init__(oid)
4046
self.full_name = str(full_name)
@@ -48,6 +54,9 @@ def __init__(
4854
self.province = province
4955
self.household = household
5056
self.fuel_efficiency = fuel_efficiency
57+
self.monthly_emissions = monthly_emissions
58+
self.yearly_emissions = yearly_emissions
59+
self.overall_emissions = overall_emissions
5160

5261
def to_json(self) -> json:
5362
return {
@@ -62,7 +71,10 @@ def to_json(self) -> json:
6271
'overall_score': self.overall_score,
6372
'province': self.province,
6473
'household': self.household,
65-
'fuel_efficiency': self.fuel_efficiency
74+
'fuel_efficiency': self.fuel_efficiency,
75+
'monthly_emissions': self.monthly_emissions,
76+
'yearly_emissions': self.yearly_emissions,
77+
'overall_emissions': self.overall_emissions,
6678
}
6779

6880
@staticmethod
@@ -80,6 +92,9 @@ def from_json(doc: json) -> User:
8092
province=doc["province"],
8193
household=doc["household"],
8294
fuel_efficiency=doc["fuel_efficiency"],
95+
monthly_emissions=doc["monthly_emissions"],
96+
yearly_emissions=doc["yearly_emissions"],
97+
overall_emissions=doc["overall_emissions"]
8398
)
8499

85100
def __repr__(self) -> str:

‎backend/requirements.txt‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
firebase_admin==6.2.0
1+
firebase_admin==6.3.0
22
Flask==3.0.0
33
Flask_Cors==4.0.0
44
Flask_HTTPAuth==4.8.0
5-
pymongo==4.6.0
5+
pymongo==4.6.1
66
ruff==0.1.4
77
typing~=3.7.4.3
88
werkzeug~=3.0.1
9+
APScheduler~=3.10.4

‎backend/routes/food.py‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from bson import ObjectId
66
from flask import Blueprint, Response, abort, jsonify, request
77

8-
from models.food import FoodEntry, FoodEntryRecomendation
8+
from models.food import FoodEntry, FoodEntryRecommendation
99
from mongodb_api.carbon_track_db import CarbonTrackDB
1010
from routes import carbon_auth
1111
from utils.FirebaseAPI import FirebaseAPI
@@ -111,7 +111,7 @@ def get_food_recommendation_for_today() -> Response:
111111
return get_food_metric_for_today()
112112
else:
113113
item = FoodEntry.from_json(item)
114-
food_recommendation = FoodEntryRecomendation.from_food_entry(item).to_json()
114+
food_recommendation = FoodEntryRecommendation.from_food_entry(item).to_json()
115115
return jsonify({'food_recommendation': food_recommendation})
116116
except CarbonTrackError as e:
117-
abort(code=400, description=f"{e}")
117+
abort(code=400, description=f"{e}")

‎backend/routes/users.py‎

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ def get_top_users() -> Response:
4040
user = {
4141
"rank": rank,
4242
"name": obj.full_name,
43-
"footprint": 0,
43+
"footprint": obj.monthly_emissions,
4444
"score": obj.overall_score,
4545
}
4646
rank += 1
@@ -57,7 +57,7 @@ def get_top_users() -> Response:
5757
user = {
5858
"rank": rank,
5959
"name": obj.full_name,
60-
"footprint": 0,
60+
"footprint": obj.yearly_emissions,
6161
"score": obj.overall_score,
6262
}
6363
rank += 1
@@ -74,7 +74,7 @@ def get_top_users() -> Response:
7474
user = {
7575
"rank": rank,
7676
"name": obj.full_name,
77-
"footprint": 0,
77+
"footprint": obj.overall_emissions,
7878
"score": obj.overall_score,
7979
}
8080
rank += 1
@@ -88,7 +88,6 @@ def get_top_users() -> Response:
8888
}
8989
)
9090

91-
9291
except CarbonTrackError as e:
9392
abort(code=400, description=f"{e}")
9493

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

232231
return jsonify({"user": item}), 200
233232
except CarbonTrackError as e:
234-
abort(code=400, description=f"{e}")
233+
abort(code=400, description=f"{e}")

0 commit comments

Comments
 (0)