repalce rapid - long
This commit is contained in:
+109
-109
@@ -19,8 +19,8 @@ from django.http import Http404, JsonResponse
|
||||
from django.http import HttpResponseRedirect, HttpResponse
|
||||
|
||||
from .forms import (
|
||||
RapidForm,
|
||||
MarkRapidQuestionForm,
|
||||
LongForm,
|
||||
MarkLongQuestionForm,
|
||||
ImageFormSet,
|
||||
NoteForm,
|
||||
RegionForm,
|
||||
@@ -30,7 +30,7 @@ from .forms import (
|
||||
AnswerUpdateFormSet,
|
||||
)
|
||||
from .models import (
|
||||
Rapid,
|
||||
Long,
|
||||
Note,
|
||||
Abnormality,
|
||||
Region,
|
||||
@@ -39,13 +39,13 @@ from .models import (
|
||||
Answer,
|
||||
CidUserAnswer,
|
||||
)
|
||||
from .tables import RapidTable
|
||||
from .filters import RapidFilter
|
||||
from .tables import LongTable
|
||||
from .filters import LongFilter
|
||||
|
||||
from django_tables2 import SingleTableView, SingleTableMixin
|
||||
from django_filters.views import FilterView
|
||||
|
||||
from .decorators import user_is_author_or_rapid_checker
|
||||
from .decorators import user_is_author_or_long_checker
|
||||
|
||||
from collections import defaultdict
|
||||
import json
|
||||
@@ -59,8 +59,8 @@ from helpers.images import image_as_base64
|
||||
import logging
|
||||
from copy import deepcopy
|
||||
from django.forms.models import model_to_dict
|
||||
from rapids.forms import RapidCreationDefaultForm
|
||||
from rapids.models import RapidCreationDefault
|
||||
from longs.forms import LongCreationDefaultForm
|
||||
from longs.models import LongCreationDefault
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -68,7 +68,7 @@ logger = logging.getLogger(__name__)
|
||||
class AuthorOrCheckerRequiredMixin(object):
|
||||
def get_object(self, *args, **kwargs):
|
||||
obj = super(UpdateView, self).get_object(*args, **kwargs)
|
||||
if self.request.user.groups.filter(name="rapid_checker").exists():
|
||||
if self.request.user.groups.filter(name="long_checker").exists():
|
||||
return obj
|
||||
if self.request.user not in obj.author.all():
|
||||
raise PermissionDenied() # or Http404
|
||||
@@ -78,67 +78,67 @@ class AuthorOrCheckerRequiredMixin(object):
|
||||
@login_required
|
||||
def index(request):
|
||||
exams = Exam.objects.all()
|
||||
return render(request, "rapids/index.html", {"exams": exams})
|
||||
return render(request, "longs/index.html", {"exams": exams})
|
||||
|
||||
|
||||
# def index(request):
|
||||
# other_rapids = Rapid.objects.exclude(author=request.user.pk)
|
||||
# user_rapids = Rapid.objects.filter(author=request.user.pk)
|
||||
# other_longs = Long.objects.exclude(author=request.user.pk)
|
||||
# user_longs = Long.objects.filter(author=request.user.pk)
|
||||
# return render(
|
||||
# request,
|
||||
# "rapids/index.html",
|
||||
# {"other_rapids": other_rapids, "user_rapids": user_rapids},
|
||||
# "longs/index.html",
|
||||
# {"other_longs": other_longs, "user_longs": user_longs},
|
||||
# )
|
||||
|
||||
|
||||
@login_required
|
||||
def rapid_detail(request, pk):
|
||||
rapid = get_object_or_404(Rapid, pk=pk)
|
||||
def long_detail(request, pk):
|
||||
long = get_object_or_404(Long, pk=pk)
|
||||
|
||||
# if request.user not in rapid.author.all():
|
||||
# if request.user not in long.author.all():
|
||||
# raise PermissionDenied
|
||||
|
||||
# logging.debug(rapid.rapid_notes.first())
|
||||
# logging.debug(rapid.subspecialty.first().name.all())
|
||||
return render(request, "rapids/rapid_detail.html", {"question": rapid})
|
||||
# logging.debug(long.long_notes.first())
|
||||
# logging.debug(long.subspecialty.first().name.all())
|
||||
return render(request, "longs/long_detail.html", {"question": long})
|
||||
|
||||
|
||||
@login_required
|
||||
def rapid_split(request, pk):
|
||||
rapid = get_object_or_404(Rapid, pk=pk)
|
||||
def long_split(request, pk):
|
||||
long = get_object_or_404(Long, pk=pk)
|
||||
|
||||
images = rapid.images.all()
|
||||
images = long.images.all()
|
||||
|
||||
old_abnormality = rapid.abnormality.all()
|
||||
old_region = rapid.region.all()
|
||||
old_examination = rapid.examination.all()
|
||||
old_site = rapid.site.all()
|
||||
old_author = rapid.author.all()
|
||||
old_abnormality = long.abnormality.all()
|
||||
old_region = long.region.all()
|
||||
old_examination = long.examination.all()
|
||||
old_site = long.site.all()
|
||||
old_author = long.author.all()
|
||||
|
||||
if not images:
|
||||
raise Http404
|
||||
|
||||
for n in range(len(images) - 1):
|
||||
rapid.pk = None
|
||||
long.pk = None
|
||||
|
||||
rapid.save()
|
||||
long.save()
|
||||
|
||||
rapid.abnormality.set(old_abnormality)
|
||||
rapid.region.set(old_region)
|
||||
rapid.examination.set(old_examination)
|
||||
rapid.site.set(old_site)
|
||||
rapid.author.set(old_author)
|
||||
images[n].rapid = rapid
|
||||
long.abnormality.set(old_abnormality)
|
||||
long.region.set(old_region)
|
||||
long.examination.set(old_examination)
|
||||
long.site.set(old_site)
|
||||
long.author.set(old_author)
|
||||
images[n].long = long
|
||||
images[n].save()
|
||||
|
||||
# images[-1].rapid
|
||||
# images[-1].long
|
||||
|
||||
# if request.user not in rapid.author.all():
|
||||
# if request.user not in long.author.all():
|
||||
# raise PermissionDenied
|
||||
|
||||
# logging.debug(rapid.rapid_notes.first())
|
||||
# logging.debug(rapid.subspecialty.first().name.all())
|
||||
return render(request, "rapids/rapid_detail.html", {"question": rapid})
|
||||
# logging.debug(long.long_notes.first())
|
||||
# logging.debug(long.subspecialty.first().name.all())
|
||||
return render(request, "longs/long_detail.html", {"question": long})
|
||||
|
||||
|
||||
@login_required
|
||||
@@ -147,22 +147,22 @@ def author_detail(request, pk):
|
||||
# author = get_object_or_404(Author, pk=pk)
|
||||
author = User.objects.get(pk=pk)
|
||||
|
||||
rapids = Rapid.objects.filter(author=pk)
|
||||
longs = Long.objects.filter(author=pk)
|
||||
|
||||
return render(
|
||||
request, "rapids/category_detail.html", {"category": author, "rapids": rapids}
|
||||
request, "longs/category_detail.html", {"category": author, "longs": longs}
|
||||
)
|
||||
|
||||
|
||||
def author_list(request):
|
||||
authors = User.objects.all()
|
||||
|
||||
return render(request, "rapids/author_list.html", {"authors": authors})
|
||||
return render(request, "longs/author_list.html", {"authors": authors})
|
||||
|
||||
|
||||
class RapidCreationDefaultView(LoginRequiredMixin, UpdateView):
|
||||
model = RapidCreationDefault
|
||||
form_class = RapidCreationDefaultForm
|
||||
class LongCreationDefaultView(LoginRequiredMixin, UpdateView):
|
||||
model = LongCreationDefault
|
||||
form_class = LongCreationDefaultForm
|
||||
|
||||
# fields = '__all__'
|
||||
# #fields = [ 'condition' ]
|
||||
@@ -170,13 +170,13 @@ class RapidCreationDefaultView(LoginRequiredMixin, UpdateView):
|
||||
# exclude = [ 'created_date', 'published_date' ]
|
||||
# def dispatch(self, request, *args, **kwargs):
|
||||
# """
|
||||
# Overridden so we can make sure the `Rapid` instance exists
|
||||
# Overridden so we can make sure the `Long` instance exists
|
||||
# before going any further.
|
||||
# """
|
||||
# self.pk = get_object_or_404(Rapid, pk=kwargs['pk'])
|
||||
# self.pk = get_object_or_404(Long, pk=kwargs['pk'])
|
||||
# return super().dispatch(request, *args, **kwargs)
|
||||
def get_object(self, queryset=None):
|
||||
obj, create = RapidCreationDefault.objects.get_or_create(
|
||||
obj, create = LongCreationDefault.objects.get_or_create(
|
||||
author=self.request.user
|
||||
)
|
||||
|
||||
@@ -206,17 +206,17 @@ class AddNote(LoginRequiredMixin, CreateView):
|
||||
# exclude = [ 'created_date', 'published_date' ]
|
||||
def dispatch(self, request, *args, **kwargs):
|
||||
"""
|
||||
Overridden so we can make sure the `Rapid` instance exists
|
||||
Overridden so we can make sure the `Long` instance exists
|
||||
before going any further.
|
||||
"""
|
||||
self.pk = get_object_or_404(Rapid, pk=kwargs["pk"])
|
||||
self.pk = get_object_or_404(Long, pk=kwargs["pk"])
|
||||
return super().dispatch(request, *args, **kwargs)
|
||||
|
||||
def form_valid(self, form):
|
||||
|
||||
note = form.save(commit=False)
|
||||
|
||||
note.rapid = self.pk
|
||||
note.long = self.pk
|
||||
|
||||
note.author = self.request.user
|
||||
note.save()
|
||||
@@ -229,12 +229,12 @@ class AddNote(LoginRequiredMixin, CreateView):
|
||||
|
||||
|
||||
@login_required
|
||||
def rapid_clone(request, pk):
|
||||
new_item = get_object_or_404(Rapid, pk=pk)
|
||||
def long_clone(request, pk):
|
||||
new_item = get_object_or_404(Long, pk=pk)
|
||||
new_item.pk = None # autogen a new pk (item_id)
|
||||
# new_item.name = "Copy of " + new_item.name #need to change uniques
|
||||
|
||||
form = RapidForm(request.POST or None, instance=new_item)
|
||||
form = LongForm(request.POST or None, instance=new_item)
|
||||
|
||||
image_formset = ImageFormSet()
|
||||
answer_formset = AnswerFormSet()
|
||||
@@ -261,15 +261,15 @@ def rapid_clone(request, pk):
|
||||
# other context
|
||||
}
|
||||
|
||||
return render(request, "rapids/rapid_form.html", context)
|
||||
return render(request, "longs/long_form.html", context)
|
||||
|
||||
|
||||
class RapidCreateBase(LoginRequiredMixin, CreateView):
|
||||
model = Rapid
|
||||
form_class = RapidForm
|
||||
class LongCreateBase(LoginRequiredMixin, CreateView):
|
||||
model = Long
|
||||
form_class = LongForm
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(RapidCreateBase, self).get_context_data(**kwargs)
|
||||
context = super(LongCreateBase, self).get_context_data(**kwargs)
|
||||
if self.request.POST:
|
||||
context["image_formset"] = ImageFormSet(
|
||||
self.request.POST, self.request.FILES
|
||||
@@ -303,21 +303,21 @@ class RapidCreateBase(LoginRequiredMixin, CreateView):
|
||||
return response
|
||||
# else we redirect to the clone url
|
||||
else:
|
||||
return redirect("rapids:rapid_clone", pk=self.object.pk)
|
||||
return redirect("longs:long_clone", pk=self.object.pk)
|
||||
|
||||
else:
|
||||
return super().form_invalid(form)
|
||||
|
||||
|
||||
# @login_required
|
||||
class RapidCreate(RapidCreateBase):
|
||||
class LongCreate(LongCreateBase):
|
||||
|
||||
initial = {"laterality": Rapid.NONE}
|
||||
initial = {"laterality": Long.NONE}
|
||||
|
||||
def get_initial(self):
|
||||
# There has to be a better way...
|
||||
try:
|
||||
s = (i.pk for i in self.request.user.rapid_default.site.all())
|
||||
s = (i.pk for i in self.request.user.long_default.site.all())
|
||||
self.initial.update({"site": s})
|
||||
except AttributeError:
|
||||
pass
|
||||
@@ -335,16 +335,16 @@ class RapidCreate(RapidCreateBase):
|
||||
# return super().form_valid(form)
|
||||
|
||||
|
||||
class RapidUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
||||
model = Rapid
|
||||
form_class = RapidForm
|
||||
class LongUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
||||
model = Long
|
||||
form_class = LongForm
|
||||
|
||||
# fields = '__all__'
|
||||
# #fields = [ 'condition' ]
|
||||
# #initial = {'date_of_death': '05/01/2018'}
|
||||
# exclude = [ 'created_date', 'published_date' ]
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(RapidUpdate, self).get_context_data(**kwargs)
|
||||
context = super(LongUpdate, self).get_context_data(**kwargs)
|
||||
if self.request.POST:
|
||||
context["image_formset"] = ImageFormSet(
|
||||
self.request.POST, self.request.FILES, instance=self.object
|
||||
@@ -381,8 +381,8 @@ class RapidUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
||||
return super().form_invalid(form)
|
||||
|
||||
|
||||
class RapidClone(RapidCreateBase):
|
||||
"""Clones a existing rapid"""
|
||||
class LongClone(LongCreateBase):
|
||||
"""Clones a existing long"""
|
||||
|
||||
# fields = '__all__'
|
||||
# #fields = [ 'condition' ]
|
||||
@@ -390,23 +390,23 @@ class RapidClone(RapidCreateBase):
|
||||
# exclude = [ 'created_date', 'published_date' ]
|
||||
def get_initial(self):
|
||||
# print(self.request)
|
||||
old_object = get_object_or_404(Rapid, pk=self.kwargs["pk"])
|
||||
old_object = get_object_or_404(Long, pk=self.kwargs["pk"])
|
||||
initial_data = model_to_dict(old_object, exclude=["id"])
|
||||
|
||||
return initial_data
|
||||
|
||||
|
||||
@login_required
|
||||
@user_is_author_or_rapid_checker
|
||||
def rapid_scrap(request, pk):
|
||||
@user_is_author_or_long_checker
|
||||
def long_scrap(request, pk):
|
||||
try:
|
||||
rapid = Rapid.objects.get(pk=pk)
|
||||
except Rapid.DoesNotExist:
|
||||
raise Http404("Rapid does not exist")
|
||||
long = Long.objects.get(pk=pk)
|
||||
except Long.DoesNotExist:
|
||||
raise Http404("Long does not exist")
|
||||
|
||||
rapid.scrapped = not rapid.scrapped
|
||||
rapid.save()
|
||||
return HttpResponseRedirect(reverse("rapids:rapid_detail", args=(pk,)))
|
||||
long.scrapped = not long.scrapped
|
||||
long.save()
|
||||
return HttpResponseRedirect(reverse("longs:long_detail", args=(pk,)))
|
||||
|
||||
|
||||
# @login_required
|
||||
@@ -416,7 +416,7 @@ def rapid_scrap(request, pk):
|
||||
# if form.is_valid():
|
||||
# instance = form.save()
|
||||
# return HttpResponse('<script>opener.closePopup(window, "%s", "%s", "#id_abnormality");</script>' % (instance.pk, instance))
|
||||
# return render(request, "rapids/create_simple.html", {'form': form})
|
||||
# return render(request, "longs/create_simple.html", {'form': form})
|
||||
|
||||
|
||||
@login_required
|
||||
@@ -429,7 +429,7 @@ def create_abnormality(request):
|
||||
% (instance.pk, instance)
|
||||
)
|
||||
return render(
|
||||
request, "rapids/create_simple.html", {"form": form, "name": "Abnormality"}
|
||||
request, "longs/create_simple.html", {"form": form, "name": "Abnormality"}
|
||||
)
|
||||
|
||||
|
||||
@@ -455,7 +455,7 @@ def create_examination(request):
|
||||
% (instance.pk, instance)
|
||||
)
|
||||
return render(
|
||||
request, "rapids/create_simple.html", {"form": form, "name": "Examination"}
|
||||
request, "longs/create_simple.html", {"form": form, "name": "Examination"}
|
||||
)
|
||||
|
||||
|
||||
@@ -481,7 +481,7 @@ def create_region(request):
|
||||
% (instance.pk, instance)
|
||||
)
|
||||
return render(
|
||||
request, "rapids/create_simple.html", {"form": form, "name": "Region"}
|
||||
request, "longs/create_simple.html", {"form": form, "name": "Region"}
|
||||
)
|
||||
|
||||
|
||||
@@ -497,12 +497,12 @@ def get_region_id(request):
|
||||
return HttpResponse("/")
|
||||
|
||||
|
||||
class RapidView(SingleTableMixin, FilterView):
|
||||
model = Rapid
|
||||
table_class = RapidTable
|
||||
template_name = "rapids/view.html"
|
||||
class LongView(SingleTableMixin, FilterView):
|
||||
model = Long
|
||||
table_class = LongTable
|
||||
template_name = "longs/view.html"
|
||||
|
||||
filterset_class = RapidFilter
|
||||
filterset_class = LongFilter
|
||||
|
||||
|
||||
def loadJsonAnswer(answer):
|
||||
@@ -617,7 +617,7 @@ def mark_overview(request, pk):
|
||||
questions = exam.exam_questions.all()
|
||||
|
||||
return render(
|
||||
request, "rapids/mark_overview.html", {"exam": exam, "questions": questions}
|
||||
request, "longs/mark_overview.html", {"exam": exam, "questions": questions}
|
||||
)
|
||||
|
||||
|
||||
@@ -659,14 +659,14 @@ def mark(request, pk, sk):
|
||||
|
||||
if request.method == "POST":
|
||||
|
||||
form = MarkRapidQuestionForm(request.POST)
|
||||
form = MarkLongQuestionForm(request.POST)
|
||||
# *******************************
|
||||
# TODO: convert to JSON request
|
||||
# *******************************
|
||||
if form.is_valid():
|
||||
# If skip button is pressed skip the question without marking
|
||||
if "skip" in request.POST:
|
||||
return redirect("rapids:mark", pk=pk, sk=n + 1)
|
||||
return redirect("longs:mark", pk=pk, sk=n + 1)
|
||||
|
||||
cd = form.cleaned_data
|
||||
# correct = cd.get("correct")
|
||||
@@ -738,14 +738,14 @@ def mark(request, pk, sk):
|
||||
# answer.published_date = timezone.now()
|
||||
# answer.save()
|
||||
if "next" in request.POST:
|
||||
return redirect("rapids:mark", pk=pk, sk=n + 1)
|
||||
return redirect("longs:mark", pk=pk, sk=n + 1)
|
||||
elif "previous" in request.POST:
|
||||
return redirect("rapids:mark", pk=pk, sk=n - 1)
|
||||
return redirect("longs:mark", pk=pk, sk=n - 1)
|
||||
|
||||
# Reset user answers (relies on the functional javascript)
|
||||
unmarked_user_answers = set()
|
||||
else:
|
||||
form = MarkRapidQuestionForm()
|
||||
form = MarkLongQuestionForm()
|
||||
|
||||
correct_answers = question.answers.filter(status=Answer.MarkOptions.CORRECT)
|
||||
half_mark_answers = question.answers.filter(status=Answer.MarkOptions.HALF_MARK)
|
||||
@@ -753,7 +753,7 @@ def mark(request, pk, sk):
|
||||
|
||||
return render(
|
||||
request,
|
||||
"rapids/mark.html",
|
||||
"longs/mark.html",
|
||||
{
|
||||
"exam": exam,
|
||||
"form": form,
|
||||
@@ -808,7 +808,7 @@ def active_exams(request, json=True):
|
||||
{
|
||||
"name": exam.get_exam_name(),
|
||||
"url": request.build_absolute_uri(exam.get_json_url()),
|
||||
"type": "rapid",
|
||||
"type": "long",
|
||||
}
|
||||
)
|
||||
|
||||
@@ -825,7 +825,7 @@ def exam_json(request, pk):
|
||||
if not exam.active:
|
||||
raise Http404("No available exam")
|
||||
|
||||
exam_json_cache = cache.get("rapids_exam_json_{}".format(pk))
|
||||
exam_json_cache = cache.get("longs_exam_json_{}".format(pk))
|
||||
|
||||
if exam_json_cache is not None and not exam.recreate_json:
|
||||
exam_json_cache["cached"] = True
|
||||
@@ -840,7 +840,7 @@ def exam_json(request, pk):
|
||||
for q in questions:
|
||||
exam_order.append(q.id)
|
||||
|
||||
# Loop through rapidimage associations
|
||||
# Loop through longimage associations
|
||||
images = []
|
||||
feedback_images = []
|
||||
for i in q.images.all():
|
||||
@@ -857,7 +857,7 @@ def exam_json(request, pk):
|
||||
"images": images,
|
||||
#"feedback_image": [],
|
||||
#"annotations": [str(q.image_annotations)],
|
||||
"type": "rapid",
|
||||
"type": "long",
|
||||
}
|
||||
|
||||
#if feedback_images:
|
||||
@@ -865,9 +865,9 @@ def exam_json(request, pk):
|
||||
|
||||
|
||||
exam_json = {
|
||||
"eid": "rapid/{}".format(exam.id),
|
||||
"eid": "long/{}".format(exam.id),
|
||||
"cached": False,
|
||||
"exam_type": "rapid",
|
||||
"exam_type": "long",
|
||||
"exam_name": exam.name,
|
||||
"exam_mode": True,
|
||||
"exam_order": exam_order,
|
||||
@@ -880,7 +880,7 @@ def exam_json(request, pk):
|
||||
exam.recreate_json = False
|
||||
exam.save()
|
||||
|
||||
cache.set("rapids_exam_json_{}".format(pk), exam_json, 3600)
|
||||
cache.set("longs_exam_json_{}".format(pk), exam_json, 3600)
|
||||
|
||||
return JsonResponse(exam_json)
|
||||
|
||||
@@ -892,7 +892,7 @@ def exam_json_recreate(request, pk):
|
||||
exam.recreate_json = True
|
||||
exam.save()
|
||||
|
||||
return redirect("rapids:exam_overview", pk=pk)
|
||||
return redirect("longs:exam_overview", pk=pk)
|
||||
|
||||
|
||||
@login_required
|
||||
@@ -980,7 +980,7 @@ def exam_scores_cid(request, pk):
|
||||
|
||||
return render(
|
||||
request,
|
||||
"rapids/exam_scores.html",
|
||||
"longs/exam_scores.html",
|
||||
{
|
||||
"cids": cids,
|
||||
"exam": exam,
|
||||
@@ -1053,7 +1053,7 @@ def exam_scores_cid_user(request, pk, sk):
|
||||
|
||||
return render(
|
||||
request,
|
||||
"rapids/exam_scores_user.html",
|
||||
"longs/exam_scores_user.html",
|
||||
{
|
||||
"exam": exam,
|
||||
"cid": cid,
|
||||
@@ -1088,7 +1088,7 @@ def exam_question_detail(request, pk, sk):
|
||||
|
||||
return render(
|
||||
request,
|
||||
"rapids/rapid_detail.html",
|
||||
"longs/long_detail.html",
|
||||
{
|
||||
"question": question,
|
||||
"exam": exam,
|
||||
@@ -1103,7 +1103,7 @@ def exam_question_detail(request, pk, sk):
|
||||
@login_required
|
||||
def exam_list(request):
|
||||
exams = Exam.objects.all()
|
||||
return render(request, "rapids/exam_list.html", {"exams": exams})
|
||||
return render(request, "longs/exam_list.html", {"exams": exams})
|
||||
|
||||
|
||||
@login_required
|
||||
@@ -1121,6 +1121,6 @@ def exam_overview(request, pk):
|
||||
|
||||
return render(
|
||||
request,
|
||||
"rapids/exam_overview.html",
|
||||
"longs/exam_overview.html",
|
||||
{"exam": exam, "questions": questions, "question_number": question_number},
|
||||
)
|
||||
Reference in New Issue
Block a user