diff --git a/argocd/deployment.yaml b/argocd/deployment.yaml
index d086e5f..f233355 100644
--- a/argocd/deployment.yaml
+++ b/argocd/deployment.yaml
@@ -27,7 +27,7 @@ spec:
mountPath: /data
containers:
- name: web
- image: git.baumann.gr/adebaumann/labhelper:0.055
+ image: git.baumann.gr/adebaumann/labhelper:0.056
imagePullPolicy: Always
ports:
- containerPort: 8000
diff --git a/boxes/templates/boxes/fixme.html b/boxes/templates/boxes/fixme.html
new file mode 100644
index 0000000..25dffec
--- /dev/null
+++ b/boxes/templates/boxes/fixme.html
@@ -0,0 +1,145 @@
+{% extends "base.html" %}
+
+{% load static %}
+
+{% block title %}Fixme - LabHelper{% endblock %}
+
+{% block page_header %}
+
+{% endblock %}
+
+{% block content %}
+
+
Select a Facet
+
+ {% if facets %}
+
+ {% else %}
+
No facets found. Please create some facets first.
+ {% endif %}
+
+
+{% if selected_facet %}
+
+
Things Missing "{{ selected_facet.name }}" Tags
+
+ {% if missing_things %}
+
+ {% else %}
+
+ All things have tags for "{{ selected_facet.name }}" facet!
+
+
+ Back to Facet Selection
+
+ {% endif %}
+
+{% endif %}
+
+{% block extra_js %}
+
+{% endblock %}
+{% endblock %}
\ No newline at end of file
diff --git a/boxes/views.py b/boxes/views.py
index 7565e60..68c3b8e 100644
--- a/boxes/views.py
+++ b/boxes/views.py
@@ -2,7 +2,7 @@ import bleach
import markdown
from django.contrib.auth.decorators import login_required
-from django.db.models import Q
+from django.db.models import Q, Prefetch
from django.http import HttpResponse, JsonResponse
from django.shortcuts import get_object_or_404, redirect, render
@@ -402,3 +402,49 @@ def resources_list(request):
return render(request, 'boxes/resources_list.html', {
'resources': resources,
})
+
+
+@login_required
+def fixme(request):
+ """Page to find and fix things missing tags for specific facets."""
+ facets = Facet.objects.all().prefetch_related('tags')
+
+ selected_facet = None
+ missing_things = []
+
+ if request.method == 'GET' and 'facet_id' in request.GET:
+ try:
+ selected_facet = Facet.objects.get(pk=request.GET['facet_id'])
+ # Find things that don't have any tag from this facet
+ missing_things = Thing.objects.exclude(
+ tags__facet=selected_facet
+ ).select_related('box', 'box__box_type').prefetch_related('tags')
+ except Facet.DoesNotExist:
+ selected_facet = None
+
+ elif request.method == 'POST':
+ facet_id = request.POST.get('facet_id')
+ tag_ids = request.POST.getlist('tag_ids')
+ thing_ids = request.POST.getlist('thing_ids')
+
+ if facet_id and tag_ids and thing_ids:
+ facet = get_object_or_404(Facet, pk=facet_id)
+ tags = Tag.objects.filter(id__in=tag_ids, facet=facet)
+ things = Thing.objects.filter(id__in=thing_ids)
+
+ for thing in things:
+ if facet.cardinality == Facet.Cardinality.SINGLE:
+ # Remove existing tags from this facet
+ thing.tags.remove(*thing.tags.filter(facet=facet))
+ # Add new tags
+ for tag in tags:
+ if tag.facet == facet:
+ thing.tags.add(tag)
+
+ return redirect('fixme')
+
+ return render(request, 'boxes/fixme.html', {
+ 'facets': facets,
+ 'selected_facet': selected_facet,
+ 'missing_things': missing_things,
+ })
diff --git a/labhelper/templates/base.html b/labhelper/templates/base.html
index 0a18558..a773594 100644
--- a/labhelper/templates/base.html
+++ b/labhelper/templates/base.html
@@ -411,6 +411,7 @@