Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

View new sensor models #168

Merged
merged 5 commits into from Mar 25, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
35 changes: 14 additions & 21 deletions mercury/templates/sensor.html
Expand Up @@ -29,6 +29,10 @@ <h1> Add or Modify Sensors </h1>
</ul>
</nav>

{% for message in messages %}
<p class="error"> {{ message }} </p>
{% endfor %}

<div id="existing-sensors">
<h2>Existing Sensors</h2>
<br>
Expand Down Expand Up @@ -145,10 +149,6 @@ <h2>Add a New Sensor Type</h2>
</form>
<br>

{% for message in messages %}
<p class="error"> {{ message }} </p>
{% endfor %}

</div> <!-- end add new type -->

<div id="view-existing-types">
Expand Down Expand Up @@ -210,15 +210,8 @@ <h2>Edit Existing Sensors</h2>
<tr>
<th>{{ sensor.id }}</th>
<td><input type="text" name="edit-sensor-name" id="edit-sensor-name"
value={{ sensor.name }}></td>
<td><select id="edit-select-sensor-type" name="edit-select-sensor-type"/> <!-- add default value later-->
{% for sensor_type in sensor_types %}
{% if sensor_type == sensor.type_id %}
<option selected="selected">{{ sensor_type.name }}</option>
{% else %}
<option>{{ sensor_type.name }}</option>
{% endif %}
{% endfor %}
value="{{ sensor.name }}"></td>
<td><p>{{ sensor.type_id.name }}</p>
<td>
<input type="submit" value="Update">
</td>
Expand Down Expand Up @@ -246,7 +239,7 @@ <h5>Warning: deleting sensor types will delete all sensors of that type.</h5>
<div id = "type-container"> <!-- single div for configuring entire sensor type -->
<div class="inline-box">
<label for="type-name"> <b>Type Name:</b> </label>
<input type="text" id="edit-type-name" name="edit-type-name" value={{ sensor_type.name }} required/>
<input type="text" id="edit-type-name" name="edit-type-name" value="{{ sensor_type.name }}" required/>
</div> <br>

<table id="edit-type-table">
Expand All @@ -261,10 +254,10 @@ <h5>Warning: deleting sensor types will delete all sensors of that type.</h5>
<tbody>
{% for field_name, unit_and_format in sensor_type.format.items %}
<tr>
<td> <input type="text" id="edit-field-name" name="edit-field-names" value={{ field_name }} required/> </td>
<td> <input type="text" id="edit-field-names" name="edit-field-names" value="{{ field_name }}" required/> </td>

<td>
<select id="edit-data-type" name="edit-data-types"/>
<select id="edit-data-types" name="edit-data-types"/>
{% if unit_and_format.data_type == "Numeric" %}
<option selected="selected"> Numeric </option>
<option> Character </option>
Expand All @@ -283,17 +276,17 @@ <h5>Warning: deleting sensor types will delete all sensors of that type.</h5>
</select>
</td>

<td> <input type="text" id="edit-unit" name="edit-units" value={{ unit_and_format.unit }} /> </td>
<td> <input type="text" id="edit-units" name="edit-units" value="{{ unit_and_format.unit }}" /> </td>
</tr>
{% endfor %}
</tbody>
</table> <br>
<input class="grafana-btn grafana-btn-green" type="submit" value="Update">
<input type="submit" value="Update">
<a href="delete_type/{{ sensor_type.id }}">Delete</a>
<br> <hr> <br>
{% endfor %}
</div> <br>
</form>
</form>
{% endfor %}
</div> <br>
{% else %}
<h3 style="color:red;"><b> There are no sensor types to edit </b></h3>
<img class=center-image src="{% static 'mercury/technical_difficulties.jpg' %}">
Expand Down
94 changes: 51 additions & 43 deletions mercury/views/sensor.py
Expand Up @@ -18,42 +18,77 @@ def validate_add_sensor_inputs(sensor_name, request):

# no sensor name
if not sensor_name:
messages.error(request, "Sensor name is missing or invalid.")
messages.error(request, "FAILED: Sensor name is missing or invalid.")
form_valid = False

# duplicated sensor name
if AGSensor.objects.filter(name=sensor_name).count() > 0:
messages.error(request, "Sensor name is already taken.")
messages.error(request, "FAILED: Sensor name is already taken.")
form_valid = False

return form_valid, request


def validate_add_sensor_type_inputs(type_name, field_name_list, request):
"""This validates the form before a user submits a new sensor type to
prevent bad inputs"""
"""
This validates the form before a user submits a new sensor type to prevent bad inputs
"""

form_valid = True

# no type name
if not type_name:
messages.error(request, "Type name is missing or invalid.")
messages.error(request, "FAILED: Type name is missing or invalid.")
form_valid = False

# missing field names
for name in field_name_list:
if not name:
messages.error(request, "Type has missing field name(s).")
messages.error(request, "FAILED: Type has missing field name(s).")
form_valid = False

# duplicated type name
if AGSensorType.objects.filter(name=type_name).count() > 0:
messages.error(request, "Type name is already taken.")
messages.error(request, "FAILED: Type name is already taken.")
form_valid = False

# duplicated field names
if len(field_name_list) > len(set(field_name_list)):
messages.error(request, "Field names must be unique.")
messages.error(request, "FAILED: Field names must be unique.")
form_valid = False

return form_valid, request


def validate_update_sensor_type_inputs(
type_name, field_name_list, type_to_update, request
):
"""
This validates the form before a user submits a new sensor type to prevent bad inputs
"""

form_valid = True

# no type name
if not type_name:
messages.error(request, "FAILED: Type name is missing or invalid.")
form_valid = False

# missing field names
for name in field_name_list:
if not name:
messages.error(request, "FAILED: Type has missing field name(s).")
form_valid = False

# duplicated type name
for sensor_type in AGSensorType.objects.all():
if sensor_type.name == type_name and sensor_type != type_to_update:
messages.error(request, "FAILED: Type name is already taken.")
form_valid = False

# duplicated field names
if len(field_name_list) > len(set(field_name_list)):
messages.error(request, "FAILED: Field names must be unique.")
form_valid = False

return form_valid, request
Expand All @@ -69,6 +104,7 @@ def delete_sensor(request, sensor_id):

def delete_sensor_type(request, type_id):
"""This deletes a sensor type from the database based on user button click"""

for (
sensor
) in (
Expand All @@ -86,35 +122,19 @@ def update_sensor(request, sensor_id):
sensor_to_update = AGSensor.objects.get(id=sensor_id)

sensor_name = request.POST.get("edit-sensor-name")

# reformat then validate name to avoid duplicated names or bad inputs like " "
sensor_name = sensor_name.strip().lower() # remove excess whitespace and CAPS
valid, request = validate_add_sensor_inputs(sensor_name, request)

sensor_types = AGSensorType.objects.all() # for when we return context later
if valid:
sensor_to_update.name = sensor_name
sensor_type = request.POST.get("edit-select-sensor-type")
sensor_to_update.type_id = AGSensorType.objects.get(name=sensor_type)
sensor_to_update.save()
sensors = AGSensor.objects.all()
context = {
"sensors": sensors,
"sensor_types": sensor_types,
}
else:
sensors = AGSensor.objects.all()
context = {
"sensors": sensors,
"sensor_name": sensor_name,
"sensor_type": sensor_type,
"sensor_types": sensor_types,
}
return render(request, "sensor.html", context)
return redirect("/sensor")


def update_sensor_type(request, type_id):
"""This updates a sensor type in the database based on user input"""
# Currently causing a strange URL bug, need to debug

type_to_update = AGSensorType.objects.get(id=type_id)
type_name = request.POST.get("edit-type-name")
Expand All @@ -125,35 +145,23 @@ def update_sensor_type(request, type_id):
# reformat then validate inputs to avoid duplicated names or bad inputs like " "
type_name = type_name.strip().lower() # remove excess whitespace and CAPS
field_names = [string.strip().lower() for string in field_names]
valid, request = validate_add_sensor_type_inputs(type_name, field_names, request)
valid, request = validate_update_sensor_type_inputs(
type_name, field_names, type_to_update, request
)

# create sensor format which is dictionary of dictionaries
type_format = {}
fields = zip(field_names, field_types, field_units)
for field in fields:
type_format[field[0]] = {"data_type": field[1], "unit": field[2]}

sensors = AGSensor.objects.all() # for when we return context later
if valid:
type_to_update.name = type_name
type_to_update.processing_formula = 0
type_to_update.format = type_format
type_to_update.save()
sensor_types = AGSensorType.objects.all()
context = {
"sensor_types": sensor_types,
"sensors": sensors,
}
else:
sensor_types = AGSensorType.objects.all()
context = {
"sensor_types": sensor_types,
"type_name": type_name,
"type_format": type_format,
"sensors": sensors,
}

return render(request, "sensor.html", context)

return redirect("/sensor")


class CreateSensorView(TemplateView):
Expand Down