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) +
+ {% csrf_token %} + + + {{ form.as_table }} +
+

Series:

+ +
+ {% for form in series_formset %} +
    + {{form.non_field_errors}} + {{form.errors}} + {{ form.as_ul }} +
+ {% endfor %} +
+ {{ series_formset.management_form }} + +
+ +{% 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 -
- {% csrf_token %} - - - - - - {{ form.as_table }} -
-

Answers:

- -
- {% for form in answer_formset %} -
    - {{form.non_field_errors}} - {{form.errors}} - {{ form.as_ul }} -
- {% endfor %} -
- {{ answer_formset.management_form }} -

Images:

- -
Drop images here (or use the buttons below)
Feedback image?
drop those here
-
-
-
- {% for form in image_formset %} -
    - {{form.non_field_errors}} - {{form.errors}} - {{ form.as_ul }} -
- {% endfor %} -
- {{ image_formset.management_form }} - - -
- - -{% 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)