Skip to content

Commit 21cc0c6

Browse files
authored
Merge pull request #6 from openagri-eu/48-bug-report
bug: Update usage of data streams
2 parents 4ec0e8d + 5e0d015 commit 21cc0c6

6 files changed

Lines changed: 59 additions & 21 deletions

File tree

app/api/api_v1/endpoints/report.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,8 @@ async def generate_irrigation_report(
8080
status_code=400,
8181
detail=f"Data file must be provided if gatekeeper is not used.",
8282
)
83-
83+
if data:
84+
data = data.file.read()
8485
background_tasks.add_task(
8586
process_irrigation_data,
8687
data=data,
@@ -119,7 +120,8 @@ async def generate_generic_observation_report(
119120
else token.id
120121
)
121122
uuid_of_pdf = f"{user_id}/{uuid_v4}"
122-
123+
if data:
124+
data = data.file.read()
123125
background_tasks.add_task(
124126
process_farm_calendar_data,
125127
calendar_activity_type=calendar_activity_type,
@@ -178,7 +180,8 @@ async def generate_animal_report(
178180
params["status"] = status
179181
if parcel_id:
180182
params['parcel'] = parcel_id
181-
183+
if data:
184+
data = data.file.read()
182185
background_tasks.add_task(
183186
process_animal_data,
184187
data=data,

app/schemas/compost.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ class CropObservation(BaseModel):
3535

3636
type: str = Field(alias="@type")
3737
id: str = Field(alias="@id")
38-
activityType: dict
38+
activityType: Optional[dict] = None
3939
title: Optional[str] = ""
4040
details: Optional[str] = ""
4141
hasStartDatetime: Optional[datetime] = None

app/schemas/irrigation.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from datetime import datetime
2-
from typing import List, Optional
2+
from typing import List, Optional, Union
33

44
from pydantic import BaseModel, Field
55

@@ -16,13 +16,13 @@ class IrrigationOperation(BaseModel):
1616

1717
type: str = Field(alias="@type")
1818
id: str = Field(alias="@id")
19-
activityType: dict
19+
activityType: Optional[dict] = None
2020
title: Optional[str] = ""
2121
details: Optional[str] = ""
2222
hasStartDatetime: Optional[datetime] = None
2323
hasEndDatetime: Optional[datetime] = None
2424
responsibleAgent: Optional[str] = None
2525
usesAgriculturalMachinery: List[dict] = []
2626
hasAppliedAmount: QuantityValue
27-
usesIrrigationSystem: str
27+
usesIrrigationSystem: Optional[Union[str, dict]] = None
2828
operatedOn: Optional[dict] = None

app/utils/animals_report.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,8 @@ def process_animal_data(
240240

241241
else:
242242
if not settings.REPORTING_USING_GATEKEEPER:
243-
json_data = json.load(data.file)
243+
data = json.loads(data)
244+
json_data = data.get("@graph")
244245
else:
245246
json_data = make_get_request(
246247
url=f'{settings.REPORTING_FARMCALENDAR_BASE_URL}{settings.REPORTING_FARMCALENDAR_URLS["animals"]}',

app/utils/farm_calendar_report.py

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import datetime
2+
import itertools
23
import json
34
import logging
45
import os
@@ -496,13 +497,37 @@ def process_farm_calendar_data(
496497
materials=materials,
497498
)
498499
else:
499-
dt = json.load(data.file)
500-
calendar_data = FarmCalendarData(
501-
activity_type_info=calendar_activity_type,
502-
observations=dt["observations"],
503-
farm_activities=dt["operations"],
504-
materials=dt["materials"],
505-
)
500+
dt = json.loads(data)
501+
if dt:
502+
farm_act = dt.get("@graph", [])
503+
obs = [x.get("hasMeasurement") for x in farm_act]
504+
materials = [x.get("hasNestedOperation") for x in farm_act]
505+
506+
obs = list(itertools.chain.from_iterable(obs)) if obs else []
507+
materials = list(itertools.chain.from_iterable(materials)) if obs else []
508+
509+
try:
510+
obs = [o['hasMember'] for o in obs]
511+
obs = list(itertools.chain.from_iterable(obs)) if obs else []
512+
except Exception:
513+
# If this occurs it means we use new data type (not old)
514+
# if Except is not enter data used is using old format (old JSONLD example)
515+
# This way it is backward compatible (logger.info should stay, because it is not error)
516+
logger.info("Data is new format type, proceed as normal.")
517+
518+
calendar_data = FarmCalendarData(
519+
activity_type_info=calendar_activity_type,
520+
observations=obs,
521+
farm_activities=farm_act,
522+
materials=materials
523+
)
524+
else:
525+
calendar_data = FarmCalendarData(
526+
activity_type_info=calendar_activity_type,
527+
observations=[],
528+
farm_activities=[],
529+
materials=[],
530+
)
506531

507532
pdf = create_farm_calendar_pdf(calendar_data, token)
508533
pdf_dir = f"{settings.PDF_DIRECTORY}{pdf_file_name}"

app/utils/irrigation_report.py

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ def parse_irrigation_operations(data: dict) -> Optional[List[IrrigationOperation
3030

3131

3232
def create_pdf_from_operations(
33-
operations: List[IrrigationOperation], token: dict[str, str] = None
33+
operations: List[IrrigationOperation], token: dict[str, str] = None,
34+
data_used: bool = False,
3435
):
3536
"""
3637
Create PDF report from irrigation operations
@@ -118,7 +119,8 @@ def create_pdf_from_operations(
118119
)
119120

120121
if len(operations) > 1:
121-
operations.sort(key=lambda x: x.hasStartDatetime)
122+
if not data_used:
123+
operations.sort(key=lambda x: x.hasStartDatetime)
122124
pdf.set_fill_color(0, 255, 255)
123125
with pdf.table(text_align="CENTER", padding=0.5) as table:
124126
row = table.row()
@@ -164,7 +166,11 @@ def create_pdf_from_operations(
164166
f"{op.hasAppliedAmount.numericValue} ({op.hasAppliedAmount.unit})",
165167
)
166168

167-
row.cell(op.usesIrrigationSystem)
169+
if isinstance(op.usesIrrigationSystem, dict):
170+
local_sys = op.usesIrrigationSystem.get("name")
171+
else:
172+
local_sys = op.usesIrrigationSystem
173+
row.cell(local_sys)
168174
pdf.ln(10)
169175

170176
return pdf
@@ -182,7 +188,7 @@ def process_irrigation_data(
182188
"""
183189
Process irrigation data and generate PDF report
184190
"""
185-
191+
data_used = False
186192
if irrigation_id:
187193
json_data = make_get_request(
188194
url=f'{settings.REPORTING_FARMCALENDAR_BASE_URL}{settings.REPORTING_FARMCALENDAR_URLS["irrigations"]}{irrigation_id}/',
@@ -206,15 +212,18 @@ def process_irrigation_data(
206212
)
207213

208214
else:
209-
json_data = json.load(data.file)
215+
data_used = True
216+
json_data = json.loads(data)
217+
if json_data:
218+
json_data = json_data['@graph']
210219

211220
if json_data:
212221
operations = parse_irrigation_operations(json_data)
213222
else:
214223
operations = []
215224

216225
try:
217-
pdf = create_pdf_from_operations(operations, token)
226+
pdf = create_pdf_from_operations(operations, token, data_used)
218227
except Exception:
219228
raise HTTPException(
220229
status_code=400, detail="PDF generation of irrigation report failed."

0 commit comments

Comments
 (0)