diff --git a/generic/models.py b/generic/models.py
index dbf5ccec..7e70c986 100644
--- a/generic/models.py
+++ b/generic/models.py
@@ -34,6 +34,7 @@ from django.utils.html import format_html
from easy_thumbnails.files import get_thumbnailer
from easy_thumbnails.exceptions import InvalidImageFormatError
+
import pydicom
import dicognito.anonymizer
@@ -1282,7 +1283,6 @@ USER_EXAM_TYPES = (
# ("CaseCollection", "user_casecollection_exams"),
)
-
class UserProfile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
supervisor = models.ForeignKey(
diff --git a/rad/settings.py b/rad/settings.py
index dfe6e2d7..3fe46bc7 100644
--- a/rad/settings.py
+++ b/rad/settings.py
@@ -50,6 +50,7 @@ INSTALLED_APPS = [
"wally",
"atlas",
"rcr",
+ "rota",
"reversion",
"debug_toolbar",
"django_tables2",
diff --git a/rad/urls.py b/rad/urls.py
index 8599b2a0..34e1d981 100644
--- a/rad/urls.py
+++ b/rad/urls.py
@@ -65,6 +65,7 @@ urlpatterns = [
path("generic/", include("generic.urls"), name="generic"),
path("atlas/", include("atlas.urls"), name="atlas"),
path("rcr/", include("rcr.urls"), name="rcr"),
+ path("rota/", include("rota.urls"), name="rota"),
path(
"accounts/check_users", views.accounts_check_users, name="accounts_check_users"
),
diff --git a/rcr/forms.py b/rcr/forms.py
index 40f84066..7d2277c7 100644
--- a/rcr/forms.py
+++ b/rcr/forms.py
@@ -16,9 +16,13 @@ from django.forms import (
)
from rcr.models import Item, Category, Level
+from django.contrib.auth.models import User
class ItemForm(ModelForm):
class Meta:
model = Item
exclude = ["rcr_platform_id", "name", "assessed_by", "assessed_date"]
- #fields = ["category", "level"]
\ No newline at end of file
+ #fields = ["category", "level"]
+
+class AssessorAssignmentForm(Form):
+ items = ModelMultipleChoiceField(queryset=Item.objects.all())
\ No newline at end of file
diff --git a/rcr/migrations/0005_item_assigned_to_alter_item_assessed_by.py b/rcr/migrations/0005_item_assigned_to_alter_item_assessed_by.py
new file mode 100644
index 00000000..80f96352
--- /dev/null
+++ b/rcr/migrations/0005_item_assigned_to_alter_item_assessed_by.py
@@ -0,0 +1,26 @@
+# Generated by Django 4.1.4 on 2023-12-12 20:11
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+ ('rcr', '0004_outcomereason_item_outcome_reason'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='item',
+ name='assigned_to',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='assigned_items', to=settings.AUTH_USER_MODEL),
+ ),
+ migrations.AlterField(
+ model_name='item',
+ name='assessed_by',
+ field=models.ManyToManyField(blank=True, related_name='assessed_items', to=settings.AUTH_USER_MODEL),
+ ),
+ ]
diff --git a/rcr/models.py b/rcr/models.py
index f3360905..9b2c5520 100644
--- a/rcr/models.py
+++ b/rcr/models.py
@@ -24,7 +24,9 @@ class Item(models.Model):
assessed_date = models.DateTimeField(auto_now=True)
- assessed_by = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True)
+ assessed_by = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, related_name="assessed_items")
+
+ assigned_to = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, on_delete=models.SET_NULL, related_name="assigned_items")
outcome = models.ForeignKey("Outcome", on_delete=models.SET_NULL, blank=True, null=True)
outcome_reason = models.ForeignKey("OutcomeReason", on_delete=models.SET_NULL, blank=True, null=True)
diff --git a/rcr/templates/rcr/assessor_assignment_form.html b/rcr/templates/rcr/assessor_assignment_form.html
new file mode 100644
index 00000000..911b2a1f
--- /dev/null
+++ b/rcr/templates/rcr/assessor_assignment_form.html
@@ -0,0 +1,14 @@
+{% extends 'rcr/base.html' %}
+
+{% block content %}
+
+
+
Items assigned:
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/rcr/templates/rcr/assessors.html b/rcr/templates/rcr/assessors.html
new file mode 100644
index 00000000..27d19c50
--- /dev/null
+++ b/rcr/templates/rcr/assessors.html
@@ -0,0 +1,17 @@
+{% extends 'rcr/base.html' %}
+
+{% block content %}
+
+
+Assessors:
+
+
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/rcr/templates/rcr/base.html b/rcr/templates/rcr/base.html
index 243c69bd..e35d6783 100644
--- a/rcr/templates/rcr/base.html
+++ b/rcr/templates/rcr/base.html
@@ -79,6 +79,9 @@
Index
+
+ Assessors
+
{% if request.user.is_staff %}
Admin
diff --git a/rcr/templates/rcr/index.html b/rcr/templates/rcr/index.html
index edcbee5d..8192b6bc 100644
--- a/rcr/templates/rcr/index.html
+++ b/rcr/templates/rcr/index.html
@@ -3,6 +3,13 @@
{% block content %}
+{% if assessor %}
+Assessor: {{assessor}}
+
+{% endif %}
+
+
+
{% if completed %}
Completed items:
{% else %}
@@ -20,10 +27,8 @@
{% for item in items %}
--
-{{item.name}} / {{item.rcr_platform_id}}
-view
-edit
+ - {{forloop.counter}}:
+{{item.name}} / {{item.rcr_platform_id}} view edit
{% empty %}
No items found.
diff --git a/rcr/templates/rcr/item_detail.html b/rcr/templates/rcr/item_detail.html
index fd7a51c7..753100ce 100644
--- a/rcr/templates/rcr/item_detail.html
+++ b/rcr/templates/rcr/item_detail.html
@@ -11,6 +11,13 @@
{% endfor %}
+
+ Outcome: {{object.outcome}}
+
+
+ Outcome reason: {{object.reason}}
+
+
Date assessed: {{object.assessed_date}}
diff --git a/rcr/urls.py b/rcr/urls.py
index d029f03b..ef1d00d8 100644
--- a/rcr/urls.py
+++ b/rcr/urls.py
@@ -13,6 +13,9 @@ app_name = "rcr"
urlpatterns = [
path("radiology/", views.radiology_index, name="radiology_index_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//assignment", views.radiology_assessor_assignment, name="radiology_assessor_assignment_view"),
+ path("radiology/completed/user/", views.radiology_index_completed_by_user, name="radiology_index_completed_by_user_view"),
path("radiology/item//", views.ItemDetailView.as_view(), name="radiology_detail_view"),
path("radiology/item/next/update", views.ItemUpdateNextView.as_view(), name="radiology_update_next_view"),
path("radiology/item//update", views.ItemUpdateView.as_view(), name="radiology_update_view"),
diff --git a/rcr/views.py b/rcr/views.py
index 08f4460d..64798bdc 100644
--- a/rcr/views.py
+++ b/rcr/views.py
@@ -5,9 +5,13 @@ from django.shortcuts import redirect, render
from django.urls import reverse_lazy
from django.views.generic.edit import UpdateView
from django.views.generic.detail import DetailView
+from django.shortcuts import get_object_or_404
+from django.conf import settings
+from django.contrib.auth.models import User
+
from rcr.models import Item
-from rcr.forms import ItemForm
+from rcr.forms import AssessorAssignmentForm, ItemForm
# Create your views here.
@@ -24,16 +28,47 @@ def radiology_index(request):
},
)
-def radiology_index_completed(request):
+def radiology_assessor_assignment(request, assessor_pk: int):
+ assessor_assignment_form = AssessorAssignmentForm()
- items = Item.objects.filter(completed=True)
+ return render(
+ request,
+ "rcr/assessor_assignment_form.html",
+ {
+ "assessor_assignment_form": assessor_assignment_form,
+ },
+ )
+
+def radiology_assessors(request):
+ assessors = User.objects.filter(groups__name="rcr_radiology_assessor")
+
+ return render(
+ request,
+ "rcr/assessors.html",
+ {
+ "assessors": assessors
+ },
+ )
+
+def radiology_index_completed_by_user(request, user_pk: int):
+ return radiology_index_completed(request, user_pk = user_pk)
+
+def radiology_index_completed(request, user_pk=None):
+
+ assessor = None
+ if user_pk is not None:
+ items = Item.objects.filter(completed=True, assessed_by=user_pk)
+ assessor = User.objects.get(pk=user_pk)
+ else:
+ items = Item.objects.filter(completed=True)
return render(
request,
"rcr/index.html",
{
"items": items,
- "completed": True
+ "completed": True,
+ "assessor": assessor
},
)
@@ -43,7 +78,7 @@ class ItemUpdateBase(UpdateView):
self.object = form.save(commit=False)
self.object.save()
- form.instance.author.add(self.request.user.id)
+ form.instance.assessed_by.add(self.request.user.id)
return super().form_valid(form)
class ItemUpdateView(ItemUpdateBase):