Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 26 additions & 9 deletions db/tracker/ajax.py
Original file line number Diff line number Diff line change
Expand Up @@ -572,15 +572,22 @@ def toggle_features(request):
from . import models

name = request.POST.get('name')

# check if the feature is already installed
existing_features = Feature.objects.filter(name=name)
existing_features = Feature.objects.filter(name=name).order_by('id')

if len(existing_features) > 0:
# disable the feature
Feature.objects.filter(name=name).delete()
msg = "Disabled feature: %s" % str(name)
return _respond(dict(msg=msg, status="success"))
if existing_features.filter(visible=True).exists():
# Soft-disable the feature so historical task links remain intact.
existing_features.filter(visible=True).update(visible=False)
msg = "Disabled feature: %s" % str(name)
return _respond(dict(msg=msg, status="success"))

# Re-enable an existing hidden feature instead of creating a new row.
existing_features.update(visible=True)
feat = existing_features[0]
msg = "Enabled feature: %s" % str(feat.name)
return _respond(dict(msg=msg, status="success", id=feat.id))
Comment on lines 576 to +590
elif name in built_in_features:
import_path = built_in_features[name].__module__ + '.' + built_in_features[name].__qualname__
feat = Feature(name=name, import_path=import_path)
Expand All @@ -604,11 +611,21 @@ def add_new_feature(request):
traceback.print_exc()
return _respond(dict(msg="import path invalid!", status="error"))

feat = Feature(name=name, import_path=import_path)
feat.save()
existing_feature = Feature.objects.filter(name=name).order_by('id').first()
if existing_feature is not None:
# Re-use an existing row to avoid duplicate feature names.
existing_feature.import_path = import_path
existing_feature.visible = True
existing_feature.save()
feat = existing_feature
msg = "Updated existing feature: %s" % feat.name
else:
feat = Feature(name=name, import_path=import_path)
feat.save()
msg = "Added new feature: %s" % feat.name

feature_data = dict(id=feat.id, name=feat.name, import_path=feat.import_path)
return _respond(dict(msg="Added new feature: %s" % feat.name, status="success", data=feature_data))
return _respond(dict(msg=msg, status="success", data=feature_data))

@csrf_exempt
def setup_run_upkeep(request):
Expand Down
2 changes: 1 addition & 1 deletion db/tracker/templates/setup_base.html
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,7 @@
// add new row to table
tr = $(document.createElement("tr"));
tr.html("<td>" + resp["data"].id + "</td>" + "<td>" + resp["data"].name + "</td>" + "<td>" +
"<input type=\"submit\" value=\"Remove\" onclick=\"toggle_feature(\'" + resp["data"].name + "\')\">" + "</td>");
"<input type=\"submit\" id=\"feature_" + resp["data"].name + "\" value=\"Disable\" onclick=\"toggle_feature(\'" + resp["data"].name + "\')\">" + "</td>");
$('#new-feature-row').after(tr);
}
})
Expand Down
15 changes: 10 additions & 5 deletions db/tracker/templates/setup_features.html
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,16 @@ <h2>Features</h2>
<td>{{feature.id}}</td>
<td>{{feature.name}}</td>
<td>
{% if not feature.name in built_in_feature_names %}
<input type="submit" id="feature_{{feature.name}}" value="Remove" onclick="toggle_feature('{{feature.name}}')">
{% else %}
<input type="submit" id="feature_{{feature.name}}" value="Disable" onclick="toggle_feature('{{feature.name}}')">
{% endif %}
<input type="submit" id="feature_{{feature.name}}" value="Disable" onclick="toggle_feature('{{feature.name}}')">
</tr>
Comment on lines 24 to +26
{% endfor %}

<!-- Hidden custom features -->
{% for feature in hidden_custom_features %}
<tr>
<td>{{feature.id}}</td>
<td>{{feature.name}}</td>
<td><input type="submit" id="feature_{{feature.name}}" value="Enable" onclick="toggle_feature('{{feature.name}}')"></td>
</tr>
{% endfor %}

Expand Down
5 changes: 3 additions & 2 deletions db/tracker/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -221,15 +221,16 @@ def setup_features(request):
from . import models
from .models import TaskEntry, Task, Subject, Feature, Generator

features = models.Feature.objects.all()

# populate the list of built-in features which could be added
from features import built_in_features
built_in_feature_names = list(built_in_features.keys())
features = models.Feature.objects.filter(visible=True).order_by("name")
hidden_custom_features = models.Feature.objects.filter(visible=False).exclude(name__in=built_in_feature_names).order_by("name")

return render(request, "setup_features.html",
dict(active_features=features,
active_feature_names=[feature.name for feature in features],
hidden_custom_features=hidden_custom_features,
built_in_feature_names=built_in_feature_names,
test_db=os.environ.get('BMI3D_TEST_DATABASE')))

Expand Down