Skip to content

Commit

Permalink
Merge pull request #38 from waggle-sensor/add-lorawan
Browse files Browse the repository at this point in the history
Add lorawan sensors to sensor endpoint
  • Loading branch information
FranciscoLozCoding authored Dec 12, 2023
2 parents fc2a8f2 + 9d62a1d commit 15f41e9
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 12 deletions.
4 changes: 2 additions & 2 deletions manifests/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -401,8 +401,8 @@ def get_sensors(self, obj):

@admin.register(LorawanDevice)
class LorawanDeviceAdmin(admin.ModelAdmin):
list_display = ["device_name", "deveui", "battery_level"]
search_fields = ["device_name", "deveui"]
list_display = ["name", "deveui", "battery_level"]
search_fields = ["name", "deveui"]


@admin.register(LorawanConnection)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# Generated by Django 4.2.5 on 2023-12-11 21:09

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):
dependencies = [
("manifests", "0036_nodedata_project"),
]

operations = [
migrations.RenameField(
model_name="lorawandevice",
old_name="device_name",
new_name="name",
),
migrations.AddField(
model_name="lorawandevice",
name="hardware",
field=models.ForeignKey(
blank=True,
default=1,
on_delete=django.db.models.deletion.CASCADE,
to="manifests.sensorhardware",
),
preserve_default=False,
),
migrations.AddField(
model_name="lorawandevice",
name="labels",
field=models.ManyToManyField(blank=True, to="manifests.label"),
),
migrations.AddField(
model_name="lorawandevice",
name="serial_no",
field=models.CharField(blank=True, default="", max_length=30),
),
migrations.AddField(
model_name="lorawandevice",
name="uri",
field=models.CharField(blank=True, default="", max_length=256),
),
]
6 changes: 3 additions & 3 deletions manifests/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,11 +327,11 @@ def clean(self):
)


class LorawanDevice(models.Model):
class LorawanDevice(AbstractSensor):
deveui = models.CharField(
max_length=16, primary_key=True, unique=True, null=False, blank=False
)
device_name = models.CharField(max_length=100, null=True, blank=True)
name = models.CharField(max_length=100, null=True, blank=True)
battery_level = models.DecimalField(
max_digits=5, decimal_places=2, null=True, blank=True
)
Expand All @@ -342,7 +342,7 @@ class Meta:
verbose_name_plural = "Lorawan Devices"

def __str__(self):
return str(self.device_name) + "-" + str(self.deveui)
return str(self.name) + "-" + str(self.deveui)

def natural_key(self):
return self.deveui
Expand Down
6 changes: 4 additions & 2 deletions manifests/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ class SensorViewSerializer(serializers.ModelSerializer):
def get_vsns(self, obj):
compute_sensors = obj.computesensor_set.all()
node_sensors = obj.nodesensor_set.all()
nodes = [s.scope.node for s in compute_sensors] + [s.node for s in node_sensors]
lorawan_sensors = obj.lorawandevice_set.all()
lorawan_connections = [ld.lorawanconnections.all() for ld in lorawan_sensors]
nodes = [s.scope.node for s in compute_sensors] + [s.node for s in node_sensors] + [lc[0].node for lc in lorawan_connections]

project = self.context['request'].query_params.get("project")
if project:
Expand Down Expand Up @@ -179,7 +181,7 @@ def serialize_compute_hardware(h):
def serialize_lorawan_devices(l):
return {
"deveui": l.deveui,
"device_name": l.device_name,
"name": l.name,
"battery_level": l.battery_level,
}

Expand Down
17 changes: 13 additions & 4 deletions manifests/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -207,9 +207,12 @@ def test_list_view(self):
node_b = NodeData.objects.create(vsn="B123", name="B_name", project=project_b, phase='Awaiting Shipment')
sensor_a = SensorHardware.objects.create(hardware="top_camera", hw_model="fe-8010")
sensor_b = SensorHardware.objects.create(hardware="bottom_camera", hw_model="ptz-8081")
sensor_c = SensorHardware.objects.create(hardware="lorawan_temp", hw_model="temp")
ld = LorawanDevice.objects.create(deveui="234",hardware=sensor_c,name="test")
NodeSensor.objects.create(node=node_a, hardware=sensor_a)
NodeSensor.objects.create(node=node_b, hardware=sensor_a)
NodeSensor.objects.create(node=node_b, hardware=sensor_b)
LorawanConnection.objects.create(node=node_a,connection_type="OTAA",lorawan_device=ld)

# request without filters
r = self.client.get("/sensors/")
Expand All @@ -228,15 +231,21 @@ def test_list_view(self):
vsns = sensors[0]["vsns"]
self.assertCountEqual(vsns, ['B123'])

# check for lorawan temp sensor
sensors = list(filter(lambda o: o["hardware"] == "lorawan_temp", items))
self.assertEqual(len(sensors), 1)
vsns = sensors[0]["vsns"]
self.assertCountEqual(vsns, ['A123'])

#
# test requests with filters
#
r = self.client.get("/sensors/?project=projA")
self.assertEqual(r.status_code, 200)
items = r.json()

# check only 1 sensor is listed (for ProjA)
self.assertEqual(len(items), 1)
# check 2 sensor is listed (for ProjA)
self.assertEqual(len(items), 2)
self.assertCountEqual(items[0]["vsns"], ["A123"])

# 0 queries
Expand All @@ -259,7 +268,7 @@ def test_list_view(self):
# multi filtering
r = self.client.get("/sensors/?phase=deployed,awaiting shipment")
items = r.json()
self.assertEqual(len(items), 2)
self.assertEqual(len(items), 3)

sensors = list(filter(lambda o: o["hardware"] == "bottom_camera", items))
self.assertEqual(len(sensors), 1)
Expand All @@ -271,7 +280,7 @@ def test_list_view(self):

r = self.client.get("/sensors/?project=proja&phase=deployed,awaiting shipment")
items = r.json()
self.assertEqual(len(items), 1)
self.assertEqual(len(items), 2)
self.assertCountEqual(items[0]["vsns"], ["A123"])

r = self.client.get("/sensors/?project=proja&phase=awaiting shipment")
Expand Down
4 changes: 3 additions & 1 deletion manifests/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,9 @@ class SensorHardwareViewSet(ReadOnlyModelViewSet):
"nodesensor_set__node",
"computesensor_set",
"computesensor_set__scope",
"computesensor_set__scope__node"
"computesensor_set__scope__node",
"lorawandevice_set",
"lorawandevice_set__lorawanconnections"
)
.order_by("hardware")
)
Expand Down

0 comments on commit 15f41e9

Please sign in to comment.