update rcr stuff

This commit is contained in:
Ross
2023-12-16 21:26:23 +00:00
parent b1e120f8e2
commit bdeb2210e1
7 changed files with 124 additions and 45 deletions
+1 -1
View File
@@ -25,4 +25,4 @@ class ItemForm(ModelForm):
#fields = ["category", "level"] #fields = ["category", "level"]
class AssessorAssignmentForm(Form): class AssessorAssignmentForm(Form):
items = ModelMultipleChoiceField(queryset=Item.objects.all()) items = ModelMultipleChoiceField(queryset=Item.objects.filter(assigned_to=None))
@@ -3,9 +3,10 @@
{% block content %} {% block content %}
<h2>Items assigned:</h2> <h2>Assign items to {{user_to_assign}}</h2>
<form action="" method="post" enctype="multipart/form-data" id="assessor-assignment-form"> <form action="" method="post" enctype="multipart/form-data" id="assessor-assignment-form">
{% csrf_token %}
{{assessor_assignment_form}} {{assessor_assignment_form}}
<input type="submit" class="submit-button" value="Submit" name="submit"> <input type="submit" class="submit-button" value="Submit" name="submit">
+1 -1
View File
@@ -8,7 +8,7 @@
<ul> <ul>
{% for assessor in assessors %} {% for assessor in assessors %}
<li> <li>
{{assessor}} <a href='{% url "rcr:radiology_index_completed_by_user_view" assessor.pk %}'>(items assessed)</a> <a href='{% url "rcr:radiology_assessor_assignment_view" assessor.pk %}'>(items assigned)</a> {{assessor}} <a href='{% url "rcr:radiology_assigned_user_view" assessor.pk %}'>(items to assess)</a> <a href='{% url "rcr:radiology_index_completed_by_user_view" assessor.pk %}'>(items assessed)</a> <a href='{% url "rcr:radiology_assessor_assignment_view" assessor.pk %}'>(assign items)</a>
</li> </li>
{% endfor %} {% endfor %}
</ul> </ul>
+47 -33
View File
@@ -3,41 +3,55 @@
{% block content %} {% block content %}
{% if assessor %} {% if assessor %}
Assessor: {{assessor}} Assessor: {{assessor}}
{% endif %} {% endif %}
{% if completed %}
<h2>Completed items:</h2>
{% else %}
<h2>Items to assess:</h2>
{% endif %}
{% if items %} {% if completed %}
<h2>Completed items:</h2>
<a href="{% url 'rcr:radiology_update_next_view' %}">Click to assess next item</a> {% else %}
<h2>Items to assess:</h2>
{% endif %} {% endif %}
<ul>
{% for item in items %}
<li> {{forloop.counter}}:
{{item.name}} / {{item.rcr_platform_id}} <a href="{% url 'rcr:radiology_detail_view' item.pk %}">view</a> <a href="{% url 'rcr:radiology_update_view' item.pk %}">edit</a>
</li>
{% empty %}
No items found.
{% endfor %}
</ul>
<a href="{% url 'rcr:radiology_index_view' %}">Todo</a> {% if items %}
<a href="{% url 'rcr:radiology_index_completed_view' %}">Done</a>
<a href="{% url 'rcr:radiology_update_next_view' %}">Click to assess next item</a>
{% endblock %}
{% endif %}
<ul>
{% for item in items %}
{% if item.completed %}
<li class="completed">
{% endif %}
{{forloop.counter}}:
{{item.name}} / {{item.rcr_platform_id}} <a href="{% url 'rcr:radiology_detail_view' item.pk %}">view</a> <a href="{% url 'rcr:radiology_update_view' item.pk %}">edit</a>
</li>
{% empty %}
No items found.
{% endfor %}
</ul>
<a href="{% url 'rcr:radiology_index_view' %}">Todo</a>
<a href="{% url 'rcr:radiology_index_completed_view' %}">Done</a>
{% endblock %}
{% block css %}
<style type="text/css">
.completed::after {
content: '✓';
color: green;
};
</style>
{% endblock css %}
+3
View File
@@ -21,6 +21,9 @@
<p> <p>
Date assessed: {{object.assessed_date}} Date assessed: {{object.assessed_date}}
</p> </p>
<p>
Assigned to: {{object.assigned_to}}
</p>
<p> <p>
Assessor(s): Assessor(s):
+1
View File
@@ -14,6 +14,7 @@ urlpatterns = [
path("radiology/", views.radiology_index, name="radiology_index_view"), path("radiology/", views.radiology_index, name="radiology_index_view"),
path("radiology/completed", views.radiology_index_completed, name="radiology_index_completed_view"), path("radiology/completed", views.radiology_index_completed, name="radiology_index_completed_view"),
path("radiology/assessors", views.radiology_assessors, name="radiology_assessors_view"), path("radiology/assessors", views.radiology_assessors, name="radiology_assessors_view"),
path("radiology/assigned/user/<int:user_pk>", views.radiology_assigned_user, name="radiology_assigned_user_view"),
path("radiology/assessors/<int:assessor_pk>/assignment", views.radiology_assessor_assignment, name="radiology_assessor_assignment_view"), path("radiology/assessors/<int:assessor_pk>/assignment", views.radiology_assessor_assignment, name="radiology_assessor_assignment_view"),
path("radiology/completed/user/<int:user_pk>", views.radiology_index_completed_by_user, name="radiology_index_completed_by_user_view"), path("radiology/completed/user/<int:user_pk>", views.radiology_index_completed_by_user, name="radiology_index_completed_by_user_view"),
path("radiology/item/<int:pk>/", views.ItemDetailView.as_view(), name="radiology_detail_view"), path("radiology/item/<int:pk>/", views.ItemDetailView.as_view(), name="radiology_detail_view"),
+69 -9
View File
@@ -1,23 +1,59 @@
from typing import Any from typing import Any
from django.db import models from django.db import models
from django.http import Http404 from django.http import Http404, HttpResponseRedirect
from django.shortcuts import redirect, render from django.shortcuts import redirect, render
from django.urls import reverse_lazy from django.urls import reverse, reverse_lazy
from django.views.generic.edit import UpdateView from django.views.generic.edit import UpdateView
from django.views.generic.detail import DetailView from django.views.generic.detail import DetailView
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.contrib.auth.decorators import user_passes_test
from rcr.models import Item from rcr.models import Item
from rcr.forms import AssessorAssignmentForm, ItemForm from rcr.forms import AssessorAssignmentForm, ItemForm
from django.core.exceptions import PermissionDenied
# Create your views here. # Create your views here.
def radiology_index(request): def user_is_rcr(function):
def wrap(request, *args, **kwargs):
if (
request.user.groups.filter(name="rcr_radiology_assessor").exists()
or request.user.is_superuser
):
return function(request, *args, **kwargs)
else:
raise PermissionDenied
items = Item.objects.all().exclude(completed=True) wrap.__doc__ = function.__doc__
wrap.__name__ = function.__name__
return wrap
class RCRRequiredMixin(object):
def get_object(self, *args, **kwargs):
obj = super().get_object(*args, **kwargs)
if (
self.request.user.groups.filter(name="rcr_radiology_assessor").exists()
or self.request.user.is_superuser
):
return obj
if self.request.user not in obj.get_author_objects():
raise PermissionDenied() # or Http404
return obj
@user_is_rcr
def radiology_index(request, assigned=True, user_pk: int | None = None):
if assigned:
items = Item.objects.filter(assigned_to=request.user).exclude(completed=True)
elif user_pk is not None:
items = Item.objects.filter(assigned_to__pk=user_pk).exclude(completed=True)
else:
items = Item.objects.all().exclude(completed=True)
return render( return render(
request, request,
@@ -28,17 +64,39 @@ def radiology_index(request):
}, },
) )
@user_passes_test(lambda u: u.is_superuser)
def radiology_assessor_assignment(request, assessor_pk: int): def radiology_assessor_assignment(request, assessor_pk: int):
assessor_assignment_form = AssessorAssignmentForm()
user = get_object_or_404(User, pk=assessor_pk)
if request.method == "POST":
assessor_assignment_form = AssessorAssignmentForm(request.POST)
if assessor_assignment_form.is_valid():
items_to_update = assessor_assignment_form.cleaned_data["items"]
for item in items_to_update:
item.assigned_to = user
Item.objects.filter(pk__in=items_to_update).bulk_update(items_to_update, ["assigned_to"])
return HttpResponseRedirect(reverse("rcr:radiology_assessors_view"))
else:
assessor_assignment_form = AssessorAssignmentForm()
return render( return render(
request, request,
"rcr/assessor_assignment_form.html", "rcr/assessor_assignment_form.html",
{ {
"assessor_assignment_form": assessor_assignment_form, "assessor_assignment_form": assessor_assignment_form,
"user_to_assign": user
}, },
) )
@user_is_rcr
def radiology_assigned_user(request, user_pk=int):
return radiology_index(request, user_pk=user_pk)
pass
@user_is_rcr
def radiology_assessors(request): def radiology_assessors(request):
assessors = User.objects.filter(groups__name="rcr_radiology_assessor") assessors = User.objects.filter(groups__name="rcr_radiology_assessor")
@@ -50,9 +108,11 @@ def radiology_assessors(request):
}, },
) )
@user_is_rcr
def radiology_index_completed_by_user(request, user_pk: int): def radiology_index_completed_by_user(request, user_pk: int):
return radiology_index_completed(request, user_pk = user_pk) return radiology_index_completed(request, user_pk = user_pk)
@user_is_rcr
def radiology_index_completed(request, user_pk=None): def radiology_index_completed(request, user_pk=None):
assessor = None assessor = None
@@ -73,7 +133,7 @@ def radiology_index_completed(request, user_pk=None):
) )
class ItemUpdateBase(UpdateView): class ItemUpdateBase(UpdateView, RCRRequiredMixin):
def form_valid(self, form): def form_valid(self, form):
self.object = form.save(commit=False) self.object = form.save(commit=False)
self.object.save() self.object.save()
@@ -81,7 +141,7 @@ class ItemUpdateBase(UpdateView):
form.instance.assessed_by.add(self.request.user.id) form.instance.assessed_by.add(self.request.user.id)
return super().form_valid(form) return super().form_valid(form)
class ItemUpdateView(ItemUpdateBase): class ItemUpdateView(ItemUpdateBase, RCRRequiredMixin):
model = Item model = Item
form_class = ItemForm form_class = ItemForm
@@ -89,7 +149,7 @@ class ItemUpdateView(ItemUpdateBase):
#excludes = ["rcr_platform_id"] #excludes = ["rcr_platform_id"]
#fields = ["category", "level"] #fields = ["category", "level"]
class ItemUpdateNextView(ItemUpdateBase): class ItemUpdateNextView(ItemUpdateBase, RCRRequiredMixin):
model = Item model = Item
form_class = ItemForm form_class = ItemForm
@@ -142,7 +202,7 @@ class ItemUpdateNextView(ItemUpdateBase):
class ItemDetailView(DetailView): class ItemDetailView(DetailView, RCRRequiredMixin):
model = Item model = Item
#template_name = "TEMPLATE_NAME" #template_name = "TEMPLATE_NAME"
#excludes = ["rcr_platform_id"] #excludes = ["rcr_platform_id"]