Add device documentation route
parent
57deb47f91
commit
5b35d17f59
|
@ -24,6 +24,7 @@ def add_resources():
|
||||||
DeviceTypeResource,
|
DeviceTypeResource,
|
||||||
DeviceTypeListResource,
|
DeviceTypeListResource,
|
||||||
DeviceConfigurationResource,
|
DeviceConfigurationResource,
|
||||||
|
DeviceDocumentationResource,
|
||||||
DeviceSecretResource,
|
DeviceSecretResource,
|
||||||
DeviceSecretResetResource,
|
DeviceSecretResetResource,
|
||||||
DeviceShareResource,
|
DeviceShareResource,
|
||||||
|
@ -56,6 +57,8 @@ def add_resources():
|
||||||
api.add_resource(DeviceTypeListResource, '/v1/devices/types')
|
api.add_resource(DeviceTypeListResource, '/v1/devices/types')
|
||||||
api.add_resource(DeviceConfigurationResource,
|
api.add_resource(DeviceConfigurationResource,
|
||||||
'/v1/devices/<int:device_id>/configuration')
|
'/v1/devices/<int:device_id>/configuration')
|
||||||
|
api.add_resource(DeviceDocumentationResource,
|
||||||
|
'/v1/devices/<int:device_id>/documentation')
|
||||||
api.add_resource(DeviceSecretResource,
|
api.add_resource(DeviceSecretResource,
|
||||||
'/v1/devices/<int:device_id>/secret')
|
'/v1/devices/<int:device_id>/secret')
|
||||||
api.add_resource(DeviceSecretResetResource,
|
api.add_resource(DeviceSecretResetResource,
|
||||||
|
|
|
@ -45,6 +45,11 @@ class RecordingsQuerySchema(Schema):
|
||||||
orders = fields.Raw()
|
orders = fields.Raw()
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceDocumentationSchema(BaseResourceSchema):
|
||||||
|
device_id = fields.Integer(dump_only=True)
|
||||||
|
text = fields.String(required=True)
|
||||||
|
|
||||||
|
|
||||||
class DeviceSecretSchema(BaseResourceSchema):
|
class DeviceSecretSchema(BaseResourceSchema):
|
||||||
device_secret = fields.String(dump_only=True)
|
device_secret = fields.String(dump_only=True)
|
||||||
secret_algorithm = fields.String(required=True)
|
secret_algorithm = fields.String(required=True)
|
||||||
|
@ -167,6 +172,23 @@ class DeviceConfigurationResource(ProtectedResource):
|
||||||
return devices.get_device_configuration(device_id), 200
|
return devices.get_device_configuration(device_id), 200
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceDocumentationResource(ProtectedResource):
|
||||||
|
@use_args(DeviceDocumentationSchema(), locations=('json',))
|
||||||
|
@swag_from('swagger/update_device_documentation_spec.yaml')
|
||||||
|
def put(self, args, device_id):
|
||||||
|
validate_device_ownership(device_id)
|
||||||
|
update_device_documentation = devices.update_device_documentation(
|
||||||
|
device_id, args['text'])
|
||||||
|
return DeviceDocumentationSchema().dump(
|
||||||
|
update_device_documentation), 200
|
||||||
|
|
||||||
|
@swag_from('swagger/get_device_documentation_spec.yaml')
|
||||||
|
def get(self, device_id):
|
||||||
|
validate_device_ownership(device_id)
|
||||||
|
return DeviceDocumentationSchema().dump(
|
||||||
|
devices.get_device_documentation(device_id)), 200
|
||||||
|
|
||||||
|
|
||||||
class DeviceSecretResource(ProtectedResource):
|
class DeviceSecretResource(ProtectedResource):
|
||||||
@swag_from('swagger/get_device_secret_spec.yaml')
|
@swag_from('swagger/get_device_secret_spec.yaml')
|
||||||
def get(self, device_id):
|
def get(self, device_id):
|
||||||
|
|
|
@ -8,7 +8,8 @@ from .models import (Device,
|
||||||
Recording,
|
Recording,
|
||||||
DeviceAssociation,
|
DeviceAssociation,
|
||||||
DeviceType,
|
DeviceType,
|
||||||
AccessLevel)
|
AccessLevel,
|
||||||
|
DeviceDocumentation)
|
||||||
from itsdangerous import URLSafeSerializer
|
from itsdangerous import URLSafeSerializer
|
||||||
from app.core import app
|
from app.core import app
|
||||||
from app.errors import NotPresentError
|
from app.errors import NotPresentError
|
||||||
|
@ -238,6 +239,29 @@ def get_devices(account_id):
|
||||||
return Device.get_many_for_user(account_id)
|
return Device.get_many_for_user(account_id)
|
||||||
|
|
||||||
|
|
||||||
|
def get_device_documentation(device_id):
|
||||||
|
"""
|
||||||
|
Tries to get device documentation associated to given device.
|
||||||
|
|
||||||
|
:returns: DeviceDocumentation
|
||||||
|
"""
|
||||||
|
if not Device.exists(id=device_id):
|
||||||
|
raise NotPresentError("Device with id %s does not exist" % device_id)
|
||||||
|
return DeviceDocumentation.get_for_device(device_id)
|
||||||
|
|
||||||
|
|
||||||
|
def update_device_documentation(device_id, new_text):
|
||||||
|
"""
|
||||||
|
Tries to update device documentation
|
||||||
|
"""
|
||||||
|
if not Device.exists(id=device_id):
|
||||||
|
raise NotPresentError("Device with id %s does not exist" % device_id)
|
||||||
|
device_documentation = DeviceDocumentation.get_for_device(device_id)
|
||||||
|
device_documentation.text = new_text
|
||||||
|
device_documentation.save()
|
||||||
|
return device_documentation
|
||||||
|
|
||||||
|
|
||||||
def get_device_types():
|
def get_device_types():
|
||||||
"""
|
"""
|
||||||
Tries to get all device types. Raises error on failure
|
Tries to get all device types. Raises error on failure
|
||||||
|
|
|
@ -137,6 +137,8 @@ class Device(db.Model):
|
||||||
cascade="save-update, merge, delete")
|
cascade="save-update, merge, delete")
|
||||||
widgets = db.relationship("DashboardWidget",
|
widgets = db.relationship("DashboardWidget",
|
||||||
cascade="save-update, merge, delete")
|
cascade="save-update, merge, delete")
|
||||||
|
documentations = db.relationship("DeviceDocumentation",
|
||||||
|
cascade="save-update, merge, delete")
|
||||||
|
|
||||||
def __init__(self, name, configuration=None, device_type=1):
|
def __init__(self, name, configuration=None, device_type=1):
|
||||||
self.name = name
|
self.name = name
|
||||||
|
@ -341,6 +343,54 @@ class DeviceType(db.Model):
|
||||||
return '<DeviceType (name %s)>' % self.name
|
return '<DeviceType (name %s)>' % self.name
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceDocumentation(db.Model):
|
||||||
|
__tablename__ = 'device_documentations'
|
||||||
|
|
||||||
|
device_id = db.Column(db.Integer, db.ForeignKey('devices.id'),
|
||||||
|
primary_key=True)
|
||||||
|
text = db.Column(db.Text, nullable=False)
|
||||||
|
created_at = db.Column(db.DateTime,
|
||||||
|
nullable=False,
|
||||||
|
default=db.func.current_timestamp())
|
||||||
|
modified_at = db.Column(db.DateTime,
|
||||||
|
nullable=False,
|
||||||
|
default=db.func.current_timestamp(),
|
||||||
|
onupdate=db.func.current_timestamp())
|
||||||
|
|
||||||
|
def __init__(self, device_id, text):
|
||||||
|
self.device_id = device_id
|
||||||
|
self.text = text
|
||||||
|
|
||||||
|
def save(self):
|
||||||
|
"""
|
||||||
|
Stores this device documentation to database
|
||||||
|
This may raise errors
|
||||||
|
"""
|
||||||
|
db.session.add(self)
|
||||||
|
db.session.commit()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get(**kwargs):
|
||||||
|
"""
|
||||||
|
Get device documentation with given filters
|
||||||
|
|
||||||
|
Available filters:
|
||||||
|
* device_id
|
||||||
|
"""
|
||||||
|
return DeviceDocumentation.query.filter_by(**kwargs).first()
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_for_device(device_id):
|
||||||
|
"""
|
||||||
|
Get documentation for device with device id passed in
|
||||||
|
parameter
|
||||||
|
"""
|
||||||
|
return (DeviceDocumentation.get(device_id=device_id) or
|
||||||
|
DeviceDocumentation(device_id, ""))
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return '<DeviceDocumentation (device_id %s)>' % self.device_id
|
||||||
|
|
||||||
class AccessLevel(db.Model):
|
class AccessLevel(db.Model):
|
||||||
__tablename__ = 'access_levels'
|
__tablename__ = 'access_levels'
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
"""empty message
|
||||||
|
|
||||||
|
Revision ID: 9f71f5a68c53
|
||||||
|
Revises: 3cf41808886b
|
||||||
|
Create Date: 2018-11-04 15:00:35.383875
|
||||||
|
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = '9f71f5a68c53'
|
||||||
|
down_revision = '3cf41808886b'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.create_table('device_documentations',
|
||||||
|
sa.Column('device_id', sa.Integer(), nullable=False),
|
||||||
|
sa.Column('text', sa.Text(), nullable=False),
|
||||||
|
sa.Column('created_at', sa.DateTime(), nullable=False),
|
||||||
|
sa.Column('modified_at', sa.DateTime(), nullable=False),
|
||||||
|
sa.ForeignKeyConstraint(['device_id'], ['devices.id'], ),
|
||||||
|
sa.PrimaryKeyConstraint('device_id')
|
||||||
|
)
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade():
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
op.drop_table('device_documentations')
|
||||||
|
# ### end Alembic commands ###
|
Loading…
Reference in New Issue