@@ -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