Skip to content

Commit 734dd17

Browse files
Merge branch 'staging' into update-fix/Analytics-data-export-cleanup
Updates from airqo staging
2 parents c1cf659 + 9cab881 commit 734dd17

File tree

15 files changed

+430
-121
lines changed

15 files changed

+430
-121
lines changed

k8s/auth-service/values-prod.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ app:
66
replicaCount: 3
77
image:
88
repository: eu.gcr.io/airqo-250220/airqo-auth-api
9-
tag: prod-d862897c-1733743392
9+
tag: prod-ee15b958-1733833086
1010
nameOverride: ''
1111
fullnameOverride: ''
1212
podAnnotations: {}

k8s/device-registry/values-prod.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ app:
66
replicaCount: 3
77
image:
88
repository: eu.gcr.io/airqo-250220/airqo-device-registry-api
9-
tag: prod-03a25cf1-1733249950
9+
tag: prod-ee15b958-1733833086
1010
nameOverride: ''
1111
fullnameOverride: ''
1212
podAnnotations: {}

k8s/device-registry/values-stage.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ app:
66
replicaCount: 2
77
image:
88
repository: eu.gcr.io/airqo-250220/airqo-stage-device-registry-api
9-
tag: stage-1838aa7a-1733249623
9+
tag: stage-dfe6eb16-1733832983
1010
nameOverride: ''
1111
fullnameOverride: ''
1212
podAnnotations: {}

k8s/exceedance/values-prod-airqo.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ app:
44
configmap: env-exceedance-production
55
image:
66
repository: eu.gcr.io/airqo-250220/airqo-exceedance-job
7-
tag: prod-d862897c-1733743392
7+
tag: prod-ee15b958-1733833086
88
nameOverride: ''
99
fullnameOverride: ''

k8s/exceedance/values-prod-kcca.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ app:
44
configmap: env-exceedance-production
55
image:
66
repository: eu.gcr.io/airqo-250220/kcca-exceedance-job
7-
tag: prod-d862897c-1733743392
7+
tag: prod-ee15b958-1733833086
88
nameOverride: ''
99
fullnameOverride: ''

k8s/predict/values-prod.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ images:
77
predictJob: eu.gcr.io/airqo-250220/airqo-predict-job
88
trainJob: eu.gcr.io/airqo-250220/airqo-train-job
99
predictPlaces: eu.gcr.io/airqo-250220/airqo-predict-places-air-quality
10-
tag: prod-d862897c-1733743392
10+
tag: prod-ee15b958-1733833086
1111
api:
1212
name: airqo-prediction-api
1313
label: prediction-api

k8s/spatial/values-prod.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ app:
66
replicaCount: 3
77
image:
88
repository: eu.gcr.io/airqo-250220/airqo-spatial-api
9-
tag: prod-d862897c-1733743392
9+
tag: prod-ee15b958-1733833086
1010
nameOverride: ''
1111
fullnameOverride: ''
1212
podAnnotations: {}

k8s/website/values-prod.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ app:
66
replicaCount: 3
77
image:
88
repository: eu.gcr.io/airqo-250220/airqo-website-api
9-
tag: prod-d862897c-1733743392
9+
tag: prod-ee15b958-1733833086
1010
nameOverride: ''
1111
fullnameOverride: ''
1212
podAnnotations: {}

k8s/website/values-stage.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ app:
66
replicaCount: 2
77
image:
88
repository: eu.gcr.io/airqo-250220/airqo-stage-website-api
9-
tag: stage-100bea2d-1733743125
9+
tag: stage-7a1d5dd3-1733836788
1010
nameOverride: ''
1111
fullnameOverride: ''
1212
podAnnotations: {}

k8s/workflows/values-prod.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ images:
1010
initContainer: eu.gcr.io/airqo-250220/airqo-workflows-xcom
1111
redisContainer: eu.gcr.io/airqo-250220/airqo-redis
1212
containers: eu.gcr.io/airqo-250220/airqo-workflows
13-
tag: prod-d862897c-1733743392
13+
tag: prod-ee15b958-1733833086
1414
nameOverride: ''
1515
fullnameOverride: ''
1616
podAnnotations: {}

src/device-registry/models/Cohort.js

+41-30
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,6 @@ cohortSchema.statics.register = async function(args, next) {
160160
response.errors = { message: error.message };
161161
}
162162

163-
return response;
164-
165163
logger.error(`🐛🐛 Internal Server Error ${error.message}`);
166164
next(new HttpError(response.message, response.status, response.errors));
167165
}
@@ -196,12 +194,22 @@ cohortSchema.statics.list = async function(
196194
foreignField: "cohorts",
197195
as: "devices",
198196
})
199-
.unwind("$devices")
200-
.lookup({
201-
from: "sites",
202-
localField: "devices.site_id",
203-
foreignField: "_id",
204-
as: "devices.site",
197+
.project({
198+
_id: 1,
199+
visibility: 1,
200+
cohort_tags: 1,
201+
cohort_codes: 1,
202+
name: 1,
203+
createdAt: 1,
204+
network: 1,
205+
group: 1,
206+
devices: {
207+
$cond: {
208+
if: { $eq: [{ $size: "$devices" }, 0] },
209+
then: [],
210+
else: "$devices",
211+
},
212+
},
205213
})
206214
.sort({ createdAt: -1 })
207215
.project(inclusionProjection)
@@ -215,11 +223,10 @@ cohortSchema.statics.list = async function(
215223
createdAt: { $first: "$createdAt" },
216224
network: { $first: "$network" },
217225
group: { $first: "$group" },
218-
numberOfDevices: { $sum: 1 },
219-
devices: { $push: "$devices" },
226+
devices: { $first: "$devices" },
220227
})
221-
.skip(skip ? skip : 0)
222-
.limit(limit ? limit : 1000)
228+
.skip(skip ? parseInt(skip) : 0)
229+
.limit(limit ? parseInt(limit) : 1000)
223230
.allowDiskUse(true);
224231

225232
const cohorts = await pipeline.exec();
@@ -234,24 +241,28 @@ cohortSchema.statics.list = async function(
234241
network: cohort.network,
235242
createdAt: cohort.createdAt,
236243
group: cohort.group,
237-
numberOfDevices: cohort.numberOfDevices,
238-
devices: cohort.devices.map((device) => ({
239-
_id: device._id,
240-
status: device.status,
241-
name: device.name,
242-
network: device.network,
243-
group: device.group,
244-
device_number: device.device_number,
245-
description: device.description,
246-
long_name: device.long_name,
247-
createdAt: device.createdAt,
248-
host_id: device.host_id,
249-
site: device.site &&
250-
device.site[0] && {
251-
_id: device.site[0]._id,
252-
name: device.site[0].name,
253-
},
254-
})),
244+
numberOfDevices: cohort.devices ? cohort.devices.length : 0,
245+
devices: cohort.devices
246+
? cohort.devices
247+
.filter((device) => Object.keys(device).length > 0)
248+
.map((device) => ({
249+
_id: device._id,
250+
status: device.status,
251+
name: device.name,
252+
network: device.network,
253+
group: device.group,
254+
device_number: device.device_number,
255+
description: device.description,
256+
long_name: device.long_name,
257+
createdAt: device.createdAt,
258+
host_id: device.host_id,
259+
site: device.site &&
260+
device.site[0] && {
261+
_id: device.site[0]._id,
262+
name: device.site[0].name,
263+
},
264+
}))
265+
: [],
255266
}))
256267
.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt));
257268

src/website/apps/event/models.py

+86-8
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
1-
1+
import logging
22
from django.db import models
33
from django.contrib.auth import get_user_model
44
from django_quill.fields import QuillField
55
from utils.models import BaseModel
66
from cloudinary.models import CloudinaryField
77
from cloudinary.uploader import destroy
8-
import logging
98

109
User = get_user_model()
11-
12-
# Configure logger
1310
logger = logging.getLogger(__name__)
1411

1512

@@ -65,7 +62,6 @@ class EventCategory(models.TextChoices):
6562
blank=True,
6663
)
6764

68-
# Image fields using CloudinaryField
6965
event_image = CloudinaryField(
7066
'image',
7167
folder='website/uploads/events/images',
@@ -94,8 +90,18 @@ class Meta:
9490
def __str__(self):
9591
return self.title
9692

93+
def save(self, *args, **kwargs):
94+
is_new = self.pk is None
95+
super().save(*args, **kwargs)
96+
if is_new:
97+
logger.info(f"Created new Event: ID={self.pk}, Title={self.title}")
98+
else:
99+
logger.info(f"Updated Event: ID={self.pk}, Title={self.title}")
100+
97101
def delete(self, *args, **kwargs):
98-
# Delete files from Cloudinary
102+
logger.debug(
103+
f"Attempting to delete Event: ID={self.pk}, Title={self.title}")
104+
# Attempt to delete images from Cloudinary
99105
if self.event_image:
100106
try:
101107
destroy(self.event_image.public_id)
@@ -112,7 +118,9 @@ def delete(self, *args, **kwargs):
112118
except Exception as e:
113119
logger.error(
114120
f"Error deleting background_image from Cloudinary: {e}")
121+
115122
super().delete(*args, **kwargs)
123+
logger.info(f"Deleted Event: ID={self.pk}, Title={self.title}")
116124

117125

118126
class Inquiry(BaseModel):
@@ -134,6 +142,22 @@ class Meta:
134142
def __str__(self):
135143
return f"Inquiry - {self.inquiry}"
136144

145+
def save(self, *args, **kwargs):
146+
is_new = self.pk is None
147+
super().save(*args, **kwargs)
148+
if is_new:
149+
logger.info(
150+
f"Created new Inquiry: ID={self.pk}, Inquiry={self.inquiry}")
151+
else:
152+
logger.info(
153+
f"Updated Inquiry: ID={self.pk}, Inquiry={self.inquiry}")
154+
155+
def delete(self, *args, **kwargs):
156+
logger.debug(
157+
f"Attempting to delete Inquiry: ID={self.pk}, Inquiry={self.inquiry}")
158+
super().delete(*args, **kwargs)
159+
logger.info(f"Deleted Inquiry: ID={self.pk}, Inquiry={self.inquiry}")
160+
137161

138162
class Program(BaseModel):
139163
date = models.DateField()
@@ -153,6 +177,20 @@ class Meta:
153177
def __str__(self):
154178
return f"Program - {self.date}"
155179

180+
def save(self, *args, **kwargs):
181+
is_new = self.pk is None
182+
super().save(*args, **kwargs)
183+
if is_new:
184+
logger.info(f"Created new Program: ID={self.pk}, Date={self.date}")
185+
else:
186+
logger.info(f"Updated Program: ID={self.pk}, Date={self.date}")
187+
188+
def delete(self, *args, **kwargs):
189+
logger.debug(
190+
f"Attempting to delete Program: ID={self.pk}, Date={self.date}")
191+
super().delete(*args, **kwargs)
192+
logger.info(f"Deleted Program: ID={self.pk}, Date={self.date}")
193+
156194

157195
class Session(BaseModel):
158196
start_time = models.TimeField()
@@ -175,6 +213,23 @@ class Meta:
175213
def __str__(self):
176214
return f"Session - {self.session_title}"
177215

216+
def save(self, *args, **kwargs):
217+
is_new = self.pk is None
218+
super().save(*args, **kwargs)
219+
if is_new:
220+
logger.info(
221+
f"Created new Session: ID={self.pk}, Title={self.session_title}")
222+
else:
223+
logger.info(
224+
f"Updated Session: ID={self.pk}, Title={self.session_title}")
225+
226+
def delete(self, *args, **kwargs):
227+
logger.debug(
228+
f"Attempting to delete Session: ID={self.pk}, Title={self.session_title}")
229+
super().delete(*args, **kwargs)
230+
logger.info(
231+
f"Deleted Session: ID={self.pk}, Title={self.session_title}")
232+
178233

179234
class PartnerLogo(BaseModel):
180235
partner_logo = CloudinaryField(
@@ -201,7 +256,18 @@ class Meta:
201256
def __str__(self):
202257
return f"Partner - {self.name}"
203258

259+
def save(self, *args, **kwargs):
260+
is_new = self.pk is None
261+
super().save(*args, **kwargs)
262+
if is_new:
263+
logger.info(
264+
f"Created new PartnerLogo: ID={self.pk}, Name={self.name}")
265+
else:
266+
logger.info(f"Updated PartnerLogo: ID={self.pk}, Name={self.name}")
267+
204268
def delete(self, *args, **kwargs):
269+
logger.debug(
270+
f"Attempting to delete PartnerLogo: ID={self.pk}, Name={self.name}")
205271
if self.partner_logo:
206272
try:
207273
destroy(self.partner_logo.public_id)
@@ -211,6 +277,7 @@ def delete(self, *args, **kwargs):
211277
logger.error(
212278
f"Error deleting partner_logo from Cloudinary: {e}")
213279
super().delete(*args, **kwargs)
280+
logger.info(f"Deleted PartnerLogo: ID={self.pk}, Name={self.name}")
214281

215282

216283
class Resource(BaseModel):
@@ -239,13 +306,24 @@ class Meta:
239306
def __str__(self):
240307
return f"Resource - {self.title}"
241308

309+
def save(self, *args, **kwargs):
310+
is_new = self.pk is None
311+
super().save(*args, **kwargs)
312+
if is_new:
313+
logger.info(
314+
f"Created new Resource: ID={self.pk}, Title={self.title}")
315+
else:
316+
logger.info(f"Updated Resource: ID={self.pk}, Title={self.title}")
317+
242318
def delete(self, *args, **kwargs):
319+
logger.debug(
320+
f"Attempting to delete Resource: ID={self.pk}, Title={self.title}")
243321
if self.resource:
244322
try:
245323
destroy(self.resource.public_id)
246324
logger.info(
247325
f"Deleted resource from Cloudinary: {self.resource.public_id}")
248326
except Exception as e:
249-
logger.error(
250-
f"Error deleting resource from Cloudinary: {e}")
327+
logger.error(f"Error deleting resource from Cloudinary: {e}")
251328
super().delete(*args, **kwargs)
329+
logger.info(f"Deleted Resource: ID={self.pk}, Title={self.title}")

0 commit comments

Comments
 (0)