From 1420d743932388c2b8a1f837ace2cd197cafe33e Mon Sep 17 00:00:00 2001
From: Ross
Date: Fri, 5 Feb 2021 17:12:13 +0000
Subject: [PATCH] .
---
anatomy/static/js/anatomy.js | 3 +-
longs/forms.py | 48 ++-
longs/models.py | 26 +-
longs/templates/longs/long_display_block.html | 7 +-
longs/templates/longs/long_form.html | 59 ++++
longs/templates/longs/long_series.html | 5 +
longs/templates/longs/rapid_form.html | 292 ------------------
longs/urls.py | 2 +
longs/views.py | 71 ++++-
9 files changed, 210 insertions(+), 303 deletions(-)
create mode 100755 longs/templates/longs/long_form.html
delete mode 100755 longs/templates/longs/rapid_form.html
diff --git a/anatomy/static/js/anatomy.js b/anatomy/static/js/anatomy.js
index f9841b80..e3bca40c 100644
--- a/anatomy/static/js/anatomy.js
+++ b/anatomy/static/js/anatomy.js
@@ -361,5 +361,4 @@ function keyDownHandler(e) {
//window.scrollBy(0, -25);
break;
}
-}
-
+}
\ No newline at end of file
diff --git a/longs/forms.py b/longs/forms.py
index f5c5949b..35cff3a0 100755
--- a/longs/forms.py
+++ b/longs/forms.py
@@ -90,6 +90,9 @@ class LongSeriesForm(ModelForm):
class LongForm(ModelForm):
+
+ exams = ModelMultipleChoiceField(required=False, queryset=Exam.objects.all(),widget=FilteredSelectMultiple(verbose_name="Exams", is_stacked=False))
+
class Media:
# Django also includes a few javascript files necessary
# for the operation of this form element. You need to
@@ -110,6 +113,16 @@ class LongForm(ModelForm):
# widget=FilteredSelectMultiple(verbose_name="Examination", is_stacked=False),
#)
+ if kwargs.get("instance"):
+ # We get the 'initial' keyword argument or initialize it
+ # as a dict if it didn't exist.
+ initial = kwargs.setdefault("initial", {})
+ # The widget for a ModelMultipleChoiceField expects
+ # a list of primary key for the selected data.
+ initial["exams"] = [t.pk for t in kwargs["instance"].exams.all()]
+
+ ModelForm.__init__(self, *args, **kwargs)
+
class Meta:
model = Long
# fields = ['due_back']
@@ -117,7 +130,16 @@ class LongForm(ModelForm):
fields = [
#"examination",
#"site",
+ "history",
"feedback",
+ "condition",
+ "sign",
+ "model_observations",
+ "model_interpretation",
+ "model_principle_diagnosis",
+ "model_differential_diagnosis",
+ "model_management",
+ "open_access",
]
# fields = ['question', 'feedback', 'subspecialty', 'references']
widgets = {
@@ -126,13 +148,35 @@ class LongForm(ModelForm):
# (False, 'No')])
}
+ def save(self, commit=True):
+ # Get the unsaved Long instance
+ instance = ModelForm.save(self, False)
+
+ # Prepare a 'save_m2m' method for the form,
+ old_save_m2m = self.save_m2m
+
+ def save_m2m():
+ old_save_m2m()
+ instance.exams.clear()
+ for exam in self.cleaned_data["exams"]:
+ # We need the id here
+ instance.exams.add(exam.pk)
+
+ self.save_m2m = save_m2m
+
+ # Do we need to save all changes now?
+ # if commit:
+ instance.save()
+ self.save_m2m()
+
+ return instance
SeriesFormSet = inlineformset_factory(
Long,
LongSeries,
exclude=[],
can_delete=True,
- extra=4,
+ extra=1,
max_num=10,
field_classes="testing",
)
@@ -143,7 +187,7 @@ LongSeriesImageFormSet = inlineformset_factory(
LongSeriesImage,
exclude=[],
can_delete=True,
- extra=4,
+ extra=1,
max_num=2000,
field_classes="testing",
)
diff --git a/longs/models.py b/longs/models.py
index 4fb40dcb..7881884f 100644
--- a/longs/models.py
+++ b/longs/models.py
@@ -102,6 +102,11 @@ class Long(models.Model):
authors = ", ".join([i.username for i in self.author.all()])
return authors
+ def get_author_objects(self):
+ """Returns a comma seperated text list of authors"""
+ authors = [i for i in self.author.all()]
+ return authors
+
def __str__(self):
examinations = [series.get_examination() for series in self.series.all()]
return "{} : {}".format(self.history, ", ".join(examinations))
@@ -143,6 +148,15 @@ class LongSeries(models.Model):
def __str__(self):
return "{} : {} [{}]".format(self.get_examination(), self.description, self.long.pk)
+ def get_author_objects(self):
+ """Returns a comma seperated text list of authors"""
+ if self.long:
+ authors = [i for i in self.long.author.all()]
+ else:
+ authors = []
+
+ return authors
+
def get_examination(self):
"""Returns a comma seperated text list of regions"""
return str(self.examination)
@@ -156,16 +170,22 @@ class LongSeries(models.Model):
return ",".join(images)
def get_thumbnail(self):
- img = findMiddle(self.images.all()).image
+ images = self.images.all()
+
+ if len(images) < 1:
+ return 'No images', 0
+
+ img = findMiddle(images).image
thumbnailer = get_thumbnailer(img)
thumbnail = thumbnailer["exam-list"]
- return thumbnail
+ return '
'.format(thumbnail), len(images)
def get_block(self):
examination = self.get_examination()
- return format_html('{}

', examination, self.get_thumbnail() )
+ thumb, image_number = self.get_thumbnail()
+ return format_html('{}
{}
Images: {}
', examination, thumb, image_number )
#class LongImage(models.Model):
# long = models.ForeignKey(Long,
diff --git a/longs/templates/longs/long_display_block.html b/longs/templates/longs/long_display_block.html
index 7e0f8ce0..28106b49 100755
--- a/longs/templates/longs/long_display_block.html
+++ b/longs/templates/longs/long_display_block.html
@@ -3,7 +3,6 @@
{{ question.created_date }}
- Long: {{ question }}
History: {{ question.history }}
Abnormality: {{ question.get_abnormalities }}
@@ -15,10 +14,11 @@
{{series.get_block}}
-Test
+Popup
{% endfor %}
+ Add series
Feedback: {{ question.feedback }}
Author(s): {% for author in question.author.all %} Differential Diagnosis: {{ question.model_differential_diagnosis }}
Managment: {{ question.model_management }}
+ Exam(s): {{question.GetExams}}
Notes:
diff --git a/longs/templates/longs/long_form.html b/longs/templates/longs/long_form.html
new file mode 100755
index 00000000..71b0ed43
--- /dev/null
+++ b/longs/templates/longs/long_form.html
@@ -0,0 +1,59 @@
+{% extends "longs/base.html" %}
+{% load static from static %}
+
+{% block js %}
+
+
+
+
+{{ form.media }}
+{% endblock %}
+{% block content %}
+
Submit Long Case
+Use this form to create a long case. Once the case has been created it can be associated with image sets (series)
+
+
+{% endblock %}
\ No newline at end of file
diff --git a/longs/templates/longs/long_series.html b/longs/templates/longs/long_series.html
index eb51a826..c730462c 100755
--- a/longs/templates/longs/long_series.html
+++ b/longs/templates/longs/long_series.html
@@ -2,5 +2,10 @@
{% extends "longs/base.html" %}
{% block content %}
+
Edit
+{% if request.user.is_superuser %}
+
Admin Edit
+{% endif %}
+
{% include 'longs/long_series_viewer.html' %}
{% endblock %}
\ No newline at end of file
diff --git a/longs/templates/longs/rapid_form.html b/longs/templates/longs/rapid_form.html
deleted file mode 100755
index 4a853279..00000000
--- a/longs/templates/longs/rapid_form.html
+++ /dev/null
@@ -1,292 +0,0 @@
-{% extends "longs/base.html" %}
-{% load static from static %}
-
-{% block js %}
-
-
-
-
-{{ form.media }}
-{% endblock %}
-{% block content %}
-
Submit Long
-
Edit defaults
-
-
-
-{% endblock %}
\ No newline at end of file
diff --git a/longs/urls.py b/longs/urls.py
index 52754956..cad3ec27 100755
--- a/longs/urls.py
+++ b/longs/urls.py
@@ -37,6 +37,7 @@ urlpatterns = [
path("exam/json/
/recreate", views.exam_json_recreate, name="exam_json_recreate"),
path("create/", views.LongCreate.as_view(), name="long_create"),
path("create/series", views.LongSeriesCreate.as_view(), name="long_series_create"),
+ path("create/series/", views.LongSeriesCreate.as_view(), name="long_series_id_create"),
path("create/defaults",
views.LongCreationDefaultView.as_view(),
name="long_create_defaults"),
@@ -61,5 +62,6 @@ urlpatterns = [
views.LongUpdate.as_view(),
name="long_update",
),
+ path("series//update", views.LongSeriesUpdate.as_view(), name="long_series_update"),
path("/add_note", views.AddNote.as_view(), name="long_add_note"),
]
diff --git a/longs/views.py b/longs/views.py
index f31d3d1b..936ac981 100755
--- a/longs/views.py
+++ b/longs/views.py
@@ -64,7 +64,7 @@ class AuthorOrCheckerRequiredMixin(object):
obj = super(UpdateView, self).get_object(*args, **kwargs)
if self.request.user.groups.filter(name="long_checker").exists():
return obj
- if self.request.user not in obj.author.all():
+ if self.request.user not in obj.get_author_objects():
raise PermissionDenied() # or Http404
return obj
@@ -100,6 +100,11 @@ def long_detail(request, pk):
def long_series_detail(request, pk):
series = get_object_or_404(LongSeries, pk=pk)
+ # if request.user not in long.author.all():
+ # raise PermissionDenied
+
+ # logging.debug(long.long_notes.first())
+ # logging.debug(long.subspecialty.first().name.all())
return render(request, "longs/long_series.html", {"series": series})
@login_required
@@ -262,8 +267,19 @@ class LongSeriesCreate(LoginRequiredMixin, CreateView):
model = LongSeries
form_class = LongSeriesForm
+ def get_initial(self):
+ # print(self.request)
+ if "pk" in self.kwargs:
+ initial = super().get_initial()
+ long = get_object_or_404(Long, pk=self.kwargs["pk"])
+
+ initial['long'] = long.id
+
+ return initial
+
def get_context_data(self, **kwargs):
context = super(LongSeriesCreate, self).get_context_data(**kwargs)
+
if self.request.POST:
context["image_formset"] = LongSeriesImageFormSet(
self.request.POST, self.request.FILES
@@ -291,6 +307,46 @@ class LongSeriesCreate(LoginRequiredMixin, CreateView):
else:
return super().form_invalid(form)
+class LongSeriesUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
+ model = LongSeries
+ form_class = LongSeriesForm
+
+ # fields = '__all__'
+ # #fields = [ 'condition' ]
+ # #initial = {'date_of_death': '05/01/2018'}
+ # exclude = [ 'created_date', 'published_date' ]
+ def get_context_data(self, **kwargs):
+ context = super(LongSeriesUpdate, self).get_context_data(**kwargs)
+ if self.request.POST:
+ context["image_formset"] = LongSeriesImageFormSet(
+ self.request.POST, self.request.FILES, instance=self.object
+ )
+ context["image_formset"].full_clean()
+ else:
+ context["image_formset"] = LongSeriesImageFormSet(instance=self.object)
+ return context
+
+ def form_valid(self, form):
+
+ self.object = form.save(commit=False)
+ self.object.save()
+
+ # Do this in the form.save()
+ #new_exams = list(form.cleaned_data['exams'].values_list("pk", flat=True))
+ #self.object.exams.clear()
+ #self.object.exams.add(*new_exams)
+
+ context = self.get_context_data(form=form)
+ image_formset = context["image_formset"]
+ # logger.debug(formset.is_valid())
+ if image_formset.is_valid():
+ response = super().form_valid(form)
+ image_formset.instance = self.object
+ image_formset.save()
+ return response
+ else:
+ return super().form_invalid(form)
+
class LongCreateBase(LoginRequiredMixin, CreateView):
model = Long
form_class = LongForm
@@ -309,8 +365,16 @@ class LongCreateBase(LoginRequiredMixin, CreateView):
def form_valid(self, form):
self.object = form.save(commit=False)
+
+ # Add exam objects
+
self.object.save()
+ # Do this in the form.save()
+ #new_exams = list(form.cleaned_data['exams'].values_list("pk", flat=True))
+ #self.object.exams.clear()
+ #self.object.exams.add(*new_exams)
+
form.instance.author.add(self.request.user.id)
context = self.get_context_data(form=form)
@@ -377,6 +441,11 @@ class LongUpdate(LoginRequiredMixin, AuthorOrCheckerRequiredMixin, UpdateView):
self.object = form.save(commit=False)
self.object.save()
+ # Do this in the form.save()
+ #new_exams = list(form.cleaned_data['exams'].values_list("pk", flat=True))
+ #self.object.exams.clear()
+ #self.object.exams.add(*new_exams)
+
form.instance.author.add(self.request.user.id)
context = self.get_context_data(form=form)