Skip to content

Commit f52c30d

Browse files
authored
Fix 143 --refactor upload to ckan, check for package existence before… (#144)
* Fix 143 --refactor upload to ckan, check for package existence before create * Logging using stdout
1 parent 9056568 commit f52c30d

File tree

3 files changed

+37
-20
lines changed

3 files changed

+37
-20
lines changed

docker-compose.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ services:
3535
SENSORSAFRICA_FLOWER_ADMIN_USERNAME: ${SENSORSAFRICA_FLOWER_ADMIN_USERNAME:-admin}
3636
SENSORSAFRICA_FLOWER_ADMIN_PASSWORD: ${SENSORSAFRICA_FLOWER_ADMIN_PASSWORD:-password}
3737
DOKKU_APP_NAME: ${DOKKU_APP_NAME:-sensorsafrica}
38+
CKAN_ARCHIVE_API_KEY: ${CKAN_ARCHIVE_API_KEY}
39+
CKAN_ARCHIVE_OWNER_ID: ${CKAN_ARCHIVE_OWNER_ID}
40+
CKAN_ARCHIVE_URL: ${CKAN_ARCHIVE_URL}
3841
depends_on:
3942
- postgres
4043
- rabbitmq

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ timeago==1.0.10
66
flower==0.9.5
77
tornado<6
88
sentry-sdk==1.14.0
9-
celery==4.2.1
9+
celery==4.3.0
1010
gevent==1.2.2
1111
greenlet==0.4.12
1212
whitenoise==4.1.2

sensorsafrica/management/commands/upload_to_ckan.py

Lines changed: 33 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,28 @@ def handle(self, *args, **options):
4545
if not timestamp or not timestamp['timestamp__min'] or not timestamp['timestamp__max']:
4646
continue
4747

48+
package_name = f"sensorsafrica-airquality-archive-{slugify(city)}"
49+
package_title = f"sensors.AFRICA Air Quality Archive {city}"
50+
4851
try:
49-
package = ckan.action.package_create(
50-
owner_org=CKAN_ARCHIVE_OWNER_ID,
51-
name="sensorsafrica-airquality-archive-" + slugify(city),
52-
title="sensors.AFRICA Air Quality Archive " + city,
53-
groups=[{"name": "sensorsafrica-airquality-archive"}]
54-
)
55-
except ckanapi.ValidationError:
56-
package = ckan.action.package_show(
57-
id="sensorsafrica-airquality-archive-" + slugify(city)
58-
)
52+
package = ckan.action.package_show(id=package_name)
53+
#To Do:xavier Implement Logging
54+
self.stdout.write(f"Package '{package_name}' already exists. Skipping creation.")
55+
except ckanapi.NotFound:
56+
try:
57+
package = ckan.action.package_create(
58+
owner_org=CKAN_ARCHIVE_OWNER_ID,
59+
name=package_name,
60+
title=package_title,
61+
groups=[{"name": "sensorsafrica-airquality-archive"}]
62+
)
63+
self.stdout.write("Created new package '%s' for city." % city)
64+
except ckanapi.ValidationError as e:
65+
self.stdout.write(f"Validation error creating package for city %s: %s" %city %e)
66+
continue
67+
except Exception as e:
68+
self.stdout.write(f"Unexpected error fetching package for city '{city}': {e}")
69+
continue
5970

6071
resources = package["resources"]
6172

@@ -89,6 +100,7 @@ def handle(self, *args, **options):
89100
timestamp__year=date.year,
90101
sensordatavalues__value__isnull=False,
91102
)
103+
.select_related("sensor","location")
92104
.values(
93105
"sensor__id",
94106
"sensor__sensor_type__name",
@@ -107,16 +119,16 @@ def handle(self, *args, **options):
107119
month=calendar.month_name[date.month], year=date.year
108120
)
109121
fp = tempfile.NamedTemporaryFile(mode="w+b", suffix=".csv")
110-
self._write_file(fp, qs)
111-
filepath = fp.name
112-
113-
self._create_or_update_resource(
114-
resource_name, filepath, resources, ckan, package
115-
)
122+
try:
123+
self._write_file(fp, qs)
124+
filepath = fp.name
125+
self._create_or_update_resource(
126+
resource_name, filepath, resources, ckan, package
127+
)
128+
finally:
129+
# Cleanup temp file
130+
fp.close()
116131

117-
# Cleanup temp file
118-
fp.close()
119-
120132
# Don't DDOS openAFRICA
121133
time.sleep(5)
122134

@@ -128,6 +140,8 @@ def handle(self, *args, **options):
128140
tzinfo=pytz.UTC,
129141
)
130142

143+
self.stdout.write("Data upload completed successfully.")
144+
131145
@staticmethod
132146
def _write_file(fp, qs):
133147
fp.write(

0 commit comments

Comments
 (0)