.
This commit is contained in:
@@ -18,6 +18,8 @@ from generic.models import Examination, ExamBase
|
|||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from helpers.images import image_as_base64
|
from helpers.images import image_as_base64
|
||||||
|
|
||||||
|
import reversion
|
||||||
|
|
||||||
image_storage = FileSystemStorage(
|
image_storage = FileSystemStorage(
|
||||||
# Physical file location ROOT
|
# Physical file location ROOT
|
||||||
location=u"{0}/".format(settings.MEDIA_ROOT),
|
location=u"{0}/".format(settings.MEDIA_ROOT),
|
||||||
@@ -66,6 +68,7 @@ class QuestionType(models.Model):
|
|||||||
return self.text
|
return self.text
|
||||||
|
|
||||||
|
|
||||||
|
@reversion.register
|
||||||
class AnatomyQuestion(models.Model):
|
class AnatomyQuestion(models.Model):
|
||||||
# author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
|
# author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
|
||||||
# image = models.ImageField()
|
# image = models.ImageField()
|
||||||
@@ -269,6 +272,7 @@ class Answer(models.Model):
|
|||||||
# self.answer.strip()
|
# self.answer.strip()
|
||||||
|
|
||||||
|
|
||||||
|
@reversion.register
|
||||||
class Exam(ExamBase):
|
class Exam(ExamBase):
|
||||||
app_name = "anatomy"
|
app_name = "anatomy"
|
||||||
|
|
||||||
|
|||||||
+7
-6
@@ -47,6 +47,7 @@ from .models import (
|
|||||||
)
|
)
|
||||||
from generic.models import Examination
|
from generic.models import Examination
|
||||||
from generic.views import ExamViews
|
from generic.views import ExamViews
|
||||||
|
from reversion.views import RevisionMixin
|
||||||
|
|
||||||
from .decorators import user_is_author_or_anatomy_checker
|
from .decorators import user_is_author_or_anatomy_checker
|
||||||
|
|
||||||
@@ -694,7 +695,7 @@ def exam_scores_cid_user(request, pk, sk):
|
|||||||
# )
|
# )
|
||||||
|
|
||||||
|
|
||||||
class AnatomyQuestionCreateBase(LoginRequiredMixin, CreateView):
|
class AnatomyQuestionCreateBase(RevisionMixin, LoginRequiredMixin, CreateView):
|
||||||
model = AnatomyQuestion
|
model = AnatomyQuestion
|
||||||
form_class = AnatomyQuestionForm
|
form_class = AnatomyQuestionForm
|
||||||
|
|
||||||
@@ -799,7 +800,7 @@ class AnatomyQuestionCreate(AnatomyQuestionCreateBase):
|
|||||||
|
|
||||||
|
|
||||||
# class AnatomyQuestionUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin,
|
# class AnatomyQuestionUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin,
|
||||||
class AnatomyQuestionUpdate(AuthorOrCheckerRequiredMixin, UpdateView):
|
class AnatomyQuestionUpdate(RevisionMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
||||||
model = AnatomyQuestion
|
model = AnatomyQuestion
|
||||||
form_class = AnatomyQuestionForm
|
form_class = AnatomyQuestionForm
|
||||||
|
|
||||||
@@ -989,7 +990,7 @@ class QuestionDelete(AuthorOrCheckerRequiredMixin, DeleteView):
|
|||||||
model = AnatomyQuestion
|
model = AnatomyQuestion
|
||||||
success_url = reverse_lazy("anatomy:anatomy_question_view")
|
success_url = reverse_lazy("anatomy:anatomy_question_view")
|
||||||
|
|
||||||
class ExamCreate(LoginRequiredMixin, CreateView):
|
class ExamCreate(RevisionMixin, LoginRequiredMixin, CreateView):
|
||||||
model = Exam
|
model = Exam
|
||||||
form_class = ExamForm
|
form_class = ExamForm
|
||||||
|
|
||||||
@@ -1000,7 +1001,7 @@ class ExamCreate(LoginRequiredMixin, CreateView):
|
|||||||
form.instance.author.add(self.request.user.id)
|
form.instance.author.add(self.request.user.id)
|
||||||
return super().form_valid(form)
|
return super().form_valid(form)
|
||||||
|
|
||||||
class ExamUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
class ExamUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
||||||
model = Exam
|
model = Exam
|
||||||
form_class = ExamForm
|
form_class = ExamForm
|
||||||
|
|
||||||
@@ -1011,7 +1012,7 @@ class ExamUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
|||||||
form.instance.author.add(self.request.user.id)
|
form.instance.author.add(self.request.user.id)
|
||||||
return super().form_valid(form)
|
return super().form_valid(form)
|
||||||
|
|
||||||
class ExamViewSet(viewsets.ModelViewSet):
|
class ExamViewSet(RevisionMixin, viewsets.ModelViewSet):
|
||||||
#queryset = Exam.objects.all().order_by('name')
|
#queryset = Exam.objects.all().order_by('name')
|
||||||
serializer_class = ExamSerializer
|
serializer_class = ExamSerializer
|
||||||
permission_classes = [permissions.IsAuthenticated]
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
@@ -1026,6 +1027,6 @@ class ExamViewSet(viewsets.ModelViewSet):
|
|||||||
|
|
||||||
return Exam.objects.filter(author__id=user.id)
|
return Exam.objects.filter(author__id=user.id)
|
||||||
|
|
||||||
class ExamDelete(AuthorOrCheckerRequiredMixin, DeleteView):
|
class ExamDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView):
|
||||||
model = Exam
|
model = Exam
|
||||||
success_url = reverse_lazy("anatomy:index")
|
success_url = reverse_lazy("anatomy:index")
|
||||||
@@ -38,6 +38,8 @@ from easy_thumbnails.exceptions import InvalidImageFormatError
|
|||||||
import pydicom
|
import pydicom
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
image_storage = FileSystemStorage(
|
image_storage = FileSystemStorage(
|
||||||
@@ -61,6 +63,7 @@ def findMiddle(input_list):
|
|||||||
return (input_list[int(middle)], input_list[int(middle - 1)])
|
return (input_list[int(middle)], input_list[int(middle - 1)])
|
||||||
|
|
||||||
|
|
||||||
|
@reversion.register
|
||||||
class Long(models.Model):
|
class Long(models.Model):
|
||||||
# author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
|
# author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
|
||||||
# image = models.ImageField()
|
# image = models.ImageField()
|
||||||
@@ -281,6 +284,7 @@ class LongSeriesImage(models.Model):
|
|||||||
ordering = ['position']
|
ordering = ['position']
|
||||||
|
|
||||||
|
|
||||||
|
@reversion.register
|
||||||
class LongSeries(models.Model):
|
class LongSeries(models.Model):
|
||||||
modality = models.ForeignKey(
|
modality = models.ForeignKey(
|
||||||
Modality, related_name="series_modality", on_delete=models.SET_NULL, null=True
|
Modality, related_name="series_modality", on_delete=models.SET_NULL, null=True
|
||||||
@@ -512,6 +516,7 @@ class LongCreationDefault(models.Model):
|
|||||||
return reverse("longs:long_create")
|
return reverse("longs:long_create")
|
||||||
|
|
||||||
|
|
||||||
|
@reversion.register
|
||||||
class Exam(ExamBase):
|
class Exam(ExamBase):
|
||||||
app_name = "longs"
|
app_name = "longs"
|
||||||
|
|
||||||
|
|||||||
+8
-59
@@ -58,6 +58,7 @@ from longs.forms import LongCreationDefaultForm
|
|||||||
from longs.models import LongCreationDefault
|
from longs.models import LongCreationDefault
|
||||||
|
|
||||||
from generic.views import ExamViews
|
from generic.views import ExamViews
|
||||||
|
from reversion.views import RevisionMixin
|
||||||
|
|
||||||
|
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
@@ -245,11 +246,11 @@ class AddNote(LoginRequiredMixin, CreateView):
|
|||||||
#def long_delete(request, pk):
|
#def long_delete(request, pk):
|
||||||
#q = get_object_or_404(Long, pk=pk)
|
#q = get_object_or_404(Long, pk=pk)
|
||||||
#q.delete()
|
#q.delete()
|
||||||
class LongDelete(AuthorOrCheckerRequiredMixin, DeleteView):
|
class LongDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView):
|
||||||
model = Long
|
model = Long
|
||||||
success_url = reverse_lazy("longs:long_view")
|
success_url = reverse_lazy("longs:long_view")
|
||||||
|
|
||||||
class LongSeriesDelete(AuthorOrCheckerRequiredMixin, DeleteView):
|
class LongSeriesDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView):
|
||||||
model = LongSeries
|
model = LongSeries
|
||||||
success_url = reverse_lazy("longs:long_series_view")
|
success_url = reverse_lazy("longs:long_series_view")
|
||||||
|
|
||||||
@@ -285,7 +286,7 @@ def long_clone(request, pk):
|
|||||||
|
|
||||||
return render(request, "longs/long_form.html", context)
|
return render(request, "longs/long_form.html", context)
|
||||||
|
|
||||||
class LongSeriesCreate(LoginRequiredMixin, CreateView):
|
class LongSeriesCreate(RevisionMixin, LoginRequiredMixin, CreateView):
|
||||||
model = LongSeries
|
model = LongSeries
|
||||||
form_class = LongSeriesForm
|
form_class = LongSeriesForm
|
||||||
|
|
||||||
@@ -329,7 +330,7 @@ class LongSeriesCreate(LoginRequiredMixin, CreateView):
|
|||||||
else:
|
else:
|
||||||
return super().form_invalid(form)
|
return super().form_invalid(form)
|
||||||
|
|
||||||
class LongSeriesUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
class LongSeriesUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
||||||
model = LongSeries
|
model = LongSeries
|
||||||
form_class = LongSeriesForm
|
form_class = LongSeriesForm
|
||||||
|
|
||||||
@@ -371,7 +372,7 @@ class LongSeriesUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateV
|
|||||||
else:
|
else:
|
||||||
return super().form_invalid(form)
|
return super().form_invalid(form)
|
||||||
|
|
||||||
class LongCreateBase(LoginRequiredMixin, CreateView):
|
class LongCreateBase(RevisionMixin, LoginRequiredMixin, CreateView):
|
||||||
model = Long
|
model = Long
|
||||||
form_class = LongForm
|
form_class = LongForm
|
||||||
|
|
||||||
@@ -441,7 +442,7 @@ class LongCreate(LongCreateBase):
|
|||||||
# return super().form_valid(form)
|
# return super().form_valid(form)
|
||||||
|
|
||||||
|
|
||||||
class LongUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
class LongUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
||||||
model = Long
|
model = Long
|
||||||
form_class = LongForm
|
form_class = LongForm
|
||||||
|
|
||||||
@@ -522,32 +523,6 @@ def long_scrap(request, pk):
|
|||||||
# return render(request, "longs/create_simple.html", {'form': form})
|
# return render(request, "longs/create_simple.html", {'form': form})
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
|
||||||
def create_abnormality(request):
|
|
||||||
form = AbnormalityForm(request.POST or None)
|
|
||||||
if form.is_valid():
|
|
||||||
instance = form.save()
|
|
||||||
return HttpResponse(
|
|
||||||
'<script>opener.closePopup(window, "%s", "%s", "#id_abnormality");</script>'
|
|
||||||
% (instance.pk, instance)
|
|
||||||
)
|
|
||||||
return render(
|
|
||||||
request, "longs/create_simple.html", {"form": form, "name": "Abnormality"}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@csrf_exempt
|
|
||||||
def get_abnormality_id(request):
|
|
||||||
if request.is_ajax():
|
|
||||||
abnormality_name = request.GET["abnormality_name"]
|
|
||||||
abnormality_id = Abnormality.objects.get(name=abnormality_name).id
|
|
||||||
data = {
|
|
||||||
"abnormality_id": abnormality_id,
|
|
||||||
}
|
|
||||||
return HttpResponse(json.dumps(data), content_type="application/json")
|
|
||||||
return HttpResponse("/")
|
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def create_examination(request):
|
def create_examination(request):
|
||||||
form = ExaminationForm(request.POST or None)
|
form = ExaminationForm(request.POST or None)
|
||||||
@@ -574,32 +549,6 @@ def get_examination_id(request):
|
|||||||
return HttpResponse("/")
|
return HttpResponse("/")
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
|
||||||
def create_region(request):
|
|
||||||
form = RegionForm(request.POST or None)
|
|
||||||
if form.is_valid():
|
|
||||||
instance = form.save()
|
|
||||||
return HttpResponse(
|
|
||||||
'<script>opener.closePopup(window, "%s", "%s", "#id_region");</script>'
|
|
||||||
% (instance.pk, instance)
|
|
||||||
)
|
|
||||||
return render(
|
|
||||||
request, "longs/create_simple.html", {"form": form, "name": "Region"}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@csrf_exempt
|
|
||||||
def get_region_id(request):
|
|
||||||
if request.is_ajax():
|
|
||||||
region_name = request.GET["region_name"]
|
|
||||||
region_id = Region.objects.get(name=region_name).id
|
|
||||||
data = {
|
|
||||||
"region_id": region_id,
|
|
||||||
}
|
|
||||||
return HttpResponse(json.dumps(data), content_type="application/json")
|
|
||||||
return HttpResponse("/")
|
|
||||||
|
|
||||||
|
|
||||||
class LongView(LoginRequiredMixin, SingleTableMixin, FilterView):
|
class LongView(LoginRequiredMixin, SingleTableMixin, FilterView):
|
||||||
model = Long
|
model = Long
|
||||||
table_class = LongTable
|
table_class = LongTable
|
||||||
@@ -997,7 +946,7 @@ def long_series_order_upload_filename(request, pk):
|
|||||||
|
|
||||||
LongExamViews = ExamViews(Exam, Long, "longs", "long", loadJsonAnswer)
|
LongExamViews = ExamViews(Exam, Long, "longs", "long", loadJsonAnswer)
|
||||||
|
|
||||||
class ExamViewSet(viewsets.ModelViewSet):
|
class ExamViewSet(RevisionMixin, viewsets.ModelViewSet):
|
||||||
queryset = Exam.objects.all().order_by('name')
|
queryset = Exam.objects.all().order_by('name')
|
||||||
serializer_class = ExamSerializer
|
serializer_class = ExamSerializer
|
||||||
|
|
||||||
|
|||||||
+4
-1
@@ -22,6 +22,8 @@ from helpers.images import image_as_base64
|
|||||||
|
|
||||||
from generic.models import Site, Condition, Sign, ExamBase
|
from generic.models import Site, Condition, Sign, ExamBase
|
||||||
|
|
||||||
|
import reversion
|
||||||
|
|
||||||
image_storage = FileSystemStorage(
|
image_storage = FileSystemStorage(
|
||||||
# Physical file location ROOT
|
# Physical file location ROOT
|
||||||
location=u"{0}".format(settings.MEDIA_ROOT),
|
location=u"{0}".format(settings.MEDIA_ROOT),
|
||||||
@@ -104,6 +106,7 @@ class Answer(models.Model):
|
|||||||
self.answer_compare = s
|
self.answer_compare = s
|
||||||
|
|
||||||
|
|
||||||
|
@reversion.register
|
||||||
class Rapid(models.Model):
|
class Rapid(models.Model):
|
||||||
#author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
|
#author = models.ForeignKey('auth.User', on_delete=models.CASCADE)
|
||||||
#image = models.ImageField()
|
#image = models.ImageField()
|
||||||
@@ -349,7 +352,7 @@ class RapidCreationDefault(models.Model):
|
|||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse('rapids:rapid_create')
|
return reverse('rapids:rapid_create')
|
||||||
|
|
||||||
|
@reversion.register
|
||||||
class Exam(ExamBase):
|
class Exam(ExamBase):
|
||||||
app_name = "rapids"
|
app_name = "rapids"
|
||||||
|
|
||||||
|
|||||||
+9
-7
@@ -43,6 +43,8 @@ from .models import (
|
|||||||
|
|
||||||
from generic.views import ExamViews
|
from generic.views import ExamViews
|
||||||
|
|
||||||
|
from reversion.views import RevisionMixin
|
||||||
|
|
||||||
from .tables import RapidTable, RapidUserAnswerTable
|
from .tables import RapidTable, RapidUserAnswerTable
|
||||||
from .filters import RapidFilter, RapidUserAnswerFilter
|
from .filters import RapidFilter, RapidUserAnswerFilter
|
||||||
|
|
||||||
@@ -268,7 +270,7 @@ def rapid_clone(request, pk):
|
|||||||
return render(request, "rapids/rapid_form.html", context)
|
return render(request, "rapids/rapid_form.html", context)
|
||||||
|
|
||||||
|
|
||||||
class RapidCreateBase(LoginRequiredMixin, CreateView):
|
class RapidCreateBase(RevisionMixin, LoginRequiredMixin, CreateView):
|
||||||
model = Rapid
|
model = Rapid
|
||||||
form_class = RapidForm
|
form_class = RapidForm
|
||||||
|
|
||||||
@@ -353,7 +355,7 @@ class RapidCreate(RapidCreateBase):
|
|||||||
# return super().form_valid(form)
|
# return super().form_valid(form)
|
||||||
|
|
||||||
|
|
||||||
class RapidUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
class RapidUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
||||||
model = Rapid
|
model = Rapid
|
||||||
form_class = RapidForm
|
form_class = RapidForm
|
||||||
|
|
||||||
@@ -928,7 +930,7 @@ class QuestionDelete(AuthorOrCheckerRequiredMixin, DeleteView):
|
|||||||
RapidExamViews = ExamViews(Exam, Rapid, "rapids", "rapid", loadJsonAnswer)
|
RapidExamViews = ExamViews(Exam, Rapid, "rapids", "rapid", loadJsonAnswer)
|
||||||
|
|
||||||
|
|
||||||
class ExamCreate(LoginRequiredMixin, CreateView):
|
class ExamCreate(RevisionMixin, LoginRequiredMixin, CreateView):
|
||||||
model = Exam
|
model = Exam
|
||||||
form_class = ExamForm
|
form_class = ExamForm
|
||||||
|
|
||||||
@@ -939,7 +941,7 @@ class ExamCreate(LoginRequiredMixin, CreateView):
|
|||||||
form.instance.author.add(self.request.user.id)
|
form.instance.author.add(self.request.user.id)
|
||||||
return super().form_valid(form)
|
return super().form_valid(form)
|
||||||
|
|
||||||
class ExamUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
class ExamUpdate(RevisionMixin, LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
|
||||||
model = Exam
|
model = Exam
|
||||||
form_class = ExamForm
|
form_class = ExamForm
|
||||||
|
|
||||||
@@ -970,7 +972,7 @@ class StandardResultsSetPagination(PageNumberPagination):
|
|||||||
page_size = 100
|
page_size = 100
|
||||||
page_size_query_param = 'page_size'
|
page_size_query_param = 'page_size'
|
||||||
max_page_size = 1000
|
max_page_size = 1000
|
||||||
class ExamViewSet(viewsets.ModelViewSet):
|
class ExamViewSet(RevisionMixin, viewsets.ModelViewSet):
|
||||||
#queryset = Exam.objects.all().order_by('name')
|
#queryset = Exam.objects.all().order_by('name')
|
||||||
serializer_class = ExamSerializer
|
serializer_class = ExamSerializer
|
||||||
|
|
||||||
@@ -995,12 +997,12 @@ class UserAnswerViewSet(viewsets.ModelViewSet):
|
|||||||
permission_classes = [permissions.IsAuthenticated]
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
|
|
||||||
|
|
||||||
class RapidViewSet(viewsets.ModelViewSet):
|
class RapidViewSet(RevisionMixin, viewsets.ModelViewSet):
|
||||||
queryset = Rapid.objects.all()#.order_by('name')
|
queryset = Rapid.objects.all()#.order_by('name')
|
||||||
serializer_class = RapidSerializer
|
serializer_class = RapidSerializer
|
||||||
permission_classes = [permissions.IsAuthenticated]
|
permission_classes = [permissions.IsAuthenticated]
|
||||||
pagination_class = StandardResultsSetPagination
|
pagination_class = StandardResultsSetPagination
|
||||||
|
|
||||||
class ExamDelete(AuthorOrCheckerRequiredMixin, DeleteView):
|
class ExamDelete(RevisionMixin, AuthorOrCheckerRequiredMixin, DeleteView):
|
||||||
model = Exam
|
model = Exam
|
||||||
success_url = reverse_lazy("rapids:index")
|
success_url = reverse_lazy("rapids:index")
|
||||||
Reference in New Issue
Block a user