Skip to content

Commit 71a3467

Browse files
committed
fix: update .gitignore and enhance error handling in raster commands
1 parent 9b47503 commit 71a3467

4 files changed

Lines changed: 97 additions & 3 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ local_files/
186186
# Local settings - use env vars instead
187187
local_settings_dev.py
188188
local_settings_local.py
189+
local*settings.py
189190

190191
# IDE
191192
.vscode

glam_api/glam/management/commands/get_new_rasters.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
from django.core.management.base import BaseCommand, CommandError
22
from django.conf import settings
3+
from botocore.exceptions import ClientError
34

45
from glam.tasks import download_new, upload_files_from_directory
56
from glam.ingest import add_product_rasters_from_storage
7+
import logging
8+
9+
logger = logging.getLogger(__name__)
610

711

812
class Command(BaseCommand):
@@ -20,4 +24,19 @@ def handle(self, *args, **options):
2024
)
2125

2226
self.stdout.write(f"Adding new Rasters to DB")
23-
add_product_rasters_from_storage()
27+
try:
28+
add_product_rasters_from_storage()
29+
except ClientError as e:
30+
error_code = e.response.get("Error", {}).get("Code", "Unknown")
31+
self.stdout.write(
32+
self.style.ERROR(
33+
f"AWS Error ({error_code}): Failed to access S3 bucket. "
34+
f"Check your AWS credentials and permissions. Details: {str(e)}"
35+
)
36+
)
37+
logger.error(f"S3 access error: {str(e)}")
38+
except Exception as e:
39+
self.stdout.write(
40+
self.style.ERROR(f"Unexpected error while adding rasters: {str(e)}")
41+
)
42+
logger.error(f"Unexpected error: {str(e)}")

glam_api/glam/tasks.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ def upload_files_from_directory(directory, bucket, prefix=""):
3333
import os
3434
import tqdm
3535

36+
# Check if directory exists, if not create it
37+
if not os.path.exists(directory):
38+
os.makedirs(directory)
39+
return
40+
3641
# Create S3 client
3742
s3_client = boto3.client("s3")
3843

@@ -127,3 +132,66 @@ def download_new():
127132
logging.info(f"Total downloads: {len(downloads)}")
128133
logging.info(f"{downloads}")
129134
return downloads
135+
136+
137+
def download_new_by_product(product_id):
138+
139+
try:
140+
product = Product.objects.get(product_id=product_id)
141+
142+
downloads = []
143+
144+
vi = None
145+
146+
try:
147+
valid_product = Product.objects.get(product_id=product_id)
148+
latest = (
149+
ProductRaster.objects.filter(product=valid_product)
150+
.order_by("-date")
151+
.first()
152+
)
153+
logging.info(f"latest date for {product_id}: {latest.date.isoformat()}")
154+
155+
except Product.DoesNotExist:
156+
return
157+
158+
parts = product_id.split("-")
159+
if parts[-1] in ["ndvi", "ndwi"]:
160+
vi = parts[-1].upper()
161+
product = Downloader(parts[0].upper())
162+
elif parts[-1] == "swi":
163+
product = Downloader(parts[-1])
164+
elif parts[-1] == "precip":
165+
product = Downloader(parts[0])
166+
elif parts[-1] == "esi":
167+
product = Downloader(f"{parts[-1]}/{parts[-2].upper()}")
168+
169+
if valid_product.composite:
170+
start_date = latest.date + timedelta(days=valid_product.composite_period)
171+
else:
172+
start_date = latest.date + timedelta(days=1)
173+
174+
end_date = latest.date + timedelta(days=30)
175+
176+
if not os.path.exists(settings.PRODUCT_DATASET_LOCAL_PATH):
177+
os.makedirs(settings.PRODUCT_DATASET_LOCAL_PATH)
178+
179+
if vi:
180+
out = product.download_vi_composites(
181+
start_date.isoformat(),
182+
end_date.isoformat(),
183+
settings.PRODUCT_DATASET_LOCAL_PATH,
184+
vi=vi,
185+
)
186+
else:
187+
out = product.download_composites(
188+
start_date.isoformat(),
189+
end_date.isoformat(),
190+
settings.PRODUCT_DATASET_LOCAL_PATH,
191+
)
192+
downloads.append(out)
193+
logging.info(f"{product_id} files downloaded: {out}")
194+
except Exception as e:
195+
logging.error(f"Failed to download {product_id}: {e}")
196+
197+
return downloads

glam_api/glam/utils.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,15 @@ def get_product_id_from_filename(filename):
6969
return "chirps-precip"
7070
elif "swi" in filename:
7171
return "copernicus-swi"
72-
elif any(text in filename for text in ["dfppm_4wk", "dfppm-4wk"]):
72+
elif any(
73+
text in filename
74+
for text in ["dfppm_4wk", "dfppm-4wk", "dfppm_aqua_4wk", "dfppm-aqua-4wk"]
75+
):
7376
return "servir-4wk-esi"
74-
elif any(text in filename for text in ["dfppm_12wk", "dfppm-12wk"]):
77+
elif any(
78+
text in filename
79+
for text in ["dfppm_12wk", "dfppm-12wk", "dfppm_aqua_12wk", "dfppm-aqua-12wk"]
80+
):
7581
return "servir-12wk-esi"
7682
elif any(text in filename for text in ["vnp09h1.ndvi", "vnp09h1-ndvi"]):
7783
return "vnp09h1-ndvi"

0 commit comments

Comments
 (0)