diff --git a/app/api/resources/device.py b/app/api/resources/device.py index 8ab9b69..c15b299 100644 --- a/app/api/resources/device.py +++ b/app/api/resources/device.py @@ -14,9 +14,11 @@ class DeviceSchema(Schema): class DeviceWrapperSchema(Schema): device = fields.Nested(DeviceSchema, required=True, location='json') + class DevicesWrapperSchema(Schema): devices = fields.Nested(DeviceSchema, required=True, - location='json', many=True) + location='json', many=True) + class RecordingsSchema(Schema): recorded_at = fields.DateTime() @@ -35,6 +37,11 @@ class DeviceResource(ProtectedResource): return DeviceWrapperSchema().dump( {'device': devices.get_device(device_id)}), 200 + @swag_from('swagger/delete_device_spec.yaml') + def delete(self, device_id): + devices.delete_device(device_id) + return '', 204 + class DeviceRecordingResource(ProtectedResource): @swag_from('swagger/get_device_recordings_spec.yaml') diff --git a/app/api/resources/swagger/delete_device_spec.yaml b/app/api/resources/swagger/delete_device_spec.yaml new file mode 100644 index 0000000..41d3cb1 --- /dev/null +++ b/app/api/resources/swagger/delete_device_spec.yaml @@ -0,0 +1,13 @@ +Deletes a device +--- +tags: + - Device +parameters: + - in: path + name: device_id + required: true + type: integer + description: Id of the device +responses: + 204: + description: Success diff --git a/app/devices/__init__.py b/app/devices/__init__.py index 04fa75f..c7fedfb 100644 --- a/app/devices/__init__.py +++ b/app/devices/__init__.py @@ -58,6 +58,17 @@ def get_device(device_id): return Device.get(id=device_id) +def delete_device(device_id): + """ + Tries to delete device with given parameters. Does not raise errors + + """ + if not Device.exists(id=device_id): + return + + Device.get(id=device_id).delete() + + def get_devices(account_id): """ Tries to get all devices associated to account. Raises error on @@ -68,6 +79,7 @@ def get_devices(account_id): """ return Device.get_many_for_user(account_id) + def create_recording(device_id, raw_json): """ Tries to create recording with given parameters. Raises error on failure @@ -78,7 +90,7 @@ def create_recording(device_id, raw_json): :type raw_json: json :raises: ValueError if parsing fails or device does not exist """ - def parse_raw_json_recording(device_id, json_msg) -> Recording: + def parse_raw_json_recording(device_id, json_msg): try: return Recording(device_id=device_id, record_type=json_msg["record_type"], diff --git a/app/devices/models.py b/app/devices/models.py index b92d220..af59940 100644 --- a/app/devices/models.py +++ b/app/devices/models.py @@ -33,6 +33,13 @@ class Recording(db.Model): db.session.add(self) db.session.commit() + def delete(self): + """ + Deletes this recording from database + """ + db.session.delete(self) + db.session.commit() + @staticmethod def get_all(): return Recording.query.all() @@ -92,7 +99,10 @@ class Device(db.Model): device_type = db.relationship("DeviceType", foreign_keys=[device_type_id]) configuration = db.Column(JSON, nullable=True) - users = db.relationship("DeviceAssociation") + users = db.relationship("DeviceAssociation", + cascade="save-update, merge, delete") + recordings = db.relationship("Recording", + cascade="save-update, merge, delete") def __init__(self, name, configuration=None, device_type=1): self.name = name @@ -107,6 +117,13 @@ class Device(db.Model): db.session.add(self) db.session.commit() + def delete(self): + """ + Deletes this recording from database + """ + db.session.delete(self) + db.session.commit() + @staticmethod def get_many(**kwargs): """ @@ -128,7 +145,9 @@ class Device(db.Model): """ Get many devices which are associated to account """ - return Device.query.filter(Device.users.any(account_id=account_id)).all() + return Device.query.filter( + Device.users.any(account_id=account_id) + ).all() @staticmethod def get(**kwargs): @@ -159,14 +178,16 @@ class Device(db.Model): return '' % ( self.name, self.device_type_id) - + class DeviceAssociation(db.Model): __tablename__ = 'device_associations' - device_id = db.Column(db.Integer, db.ForeignKey('devices.id'), primary_key=True) - account_id = db.Column(db.Integer, db.ForeignKey('accounts.id'), primary_key=True) + device_id = db.Column(db.Integer, db.ForeignKey('devices.id'), + primary_key=True) + account_id = db.Column(db.Integer, db.ForeignKey('accounts.id'), + primary_key=True) access_level = db.Column(db.Integer, db.ForeignKey('access_levels.id'), - nullable=False) + nullable=False) def __init__(self, device_id, account_id, access_level=1): self.device_id = device_id @@ -198,7 +219,7 @@ class DeviceAssociation(db.Model): Get many device associations for user with account id passed in parameter """ - return get_many(account_id=account_id) + return DeviceAssociation.get_many(account_id=account_id) @staticmethod def get_for_device(device_id): @@ -206,10 +227,11 @@ class DeviceAssociation(db.Model): Get many device associations for device with account id passed in parameter """ - return get_many(device_id=device_id) + return DeviceAssociation.get_many(device_id=device_id) def __repr__(self): - return '' % (self.device_id, self.account_id) + return '' % ( + self.device_id, self.account_id) class DeviceType(db.Model):