from django.db.models.fields.files import ImageField from django.db.models.fields.related import ForeignKey from django.db import models from django.utils import timezone import tagulous import tagulous.models from django.core.files.storage import FileSystemStorage from django.conf import settings from django.utils.html import format_html from django.urls import reverse from django.utils.translation import ugettext_lazy as _ from django.utils.html import mark_safe from sortedm2m.fields import SortedManyToManyField import string from anatomy.models import Modality from generic.models import Examination, Condition, Sign #from generic.models import Examination, Site, Condition, Sign from easy_thumbnails.files import get_thumbnailer image_storage = FileSystemStorage( # Physical file location ROOT location=u"{0}/longs/".format(settings.MEDIA_ROOT), # Url for file base_url=u"{0}longs/".format(settings.MEDIA_URL), ) def image_directory_path(instance, filename): return u"picture/{0}".format(filename) def findMiddle(input_list): middle = float(len(input_list))/2 if middle % 2 != 0: return input_list[int(middle - .5)] else: return (input_list[int(middle)]) return (input_list[int(middle)], input_list[int(middle-1)]) class Long(models.Model): #author = models.ForeignKey('auth.User', on_delete=models.CASCADE) #image = models.ImageField() history = models.TextField(null=True, blank=True) feedback = models.TextField(null=True, blank=True) condition = tagulous.models.TagField( to=Condition, blank=True, help_text= "Associated condition. Will allow searching / filtering and tips / hints to be displayed. Conditions with spaces must be enclosed in quotes \"...\"" ) sign = tagulous.models.TagField( to=Sign, blank=True, help_text='Radiological signs in the question') # Model answers model_observations = models.TextField(null=True, blank=True) model_interpretation = models.TextField(null=True, blank=True) model_principle_diagnosis = models.TextField(null=True, blank=True) model_differential_diagnosis = models.TextField(null=True, blank=True) model_management = models.TextField(null=True, blank=True) DEFAULT_SITE_ID = 1 #site = models.ManyToManyField( # Site, # blank=True, # default=DEFAULT_SITE_ID, # help_text= # "If we know the source of the image") verified = models.BooleanField(default=False) created_date = models.DateTimeField(default=timezone.now) published_date = models.DateTimeField(blank=True, null=True) author = models.ManyToManyField(settings.AUTH_USER_MODEL, blank=True, help_text='Author of question', related_name="long_authored_questions") scrapped = models.BooleanField( default=False, help_text='Question has been scrapped and will not be shown') open_access = models.BooleanField( help_text="If an question should be freely available to browse", default=True ) def get_absolute_url(self): return reverse('longs:long_detail', kwargs={'pk': self.pk}) def get_authors(self): """Returns a comma seperated text list of authors""" authors = ", ".join([i.username 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)) def GetExams(self): e = self.exams.all().values_list("name", flat=True) exams = ", ".join(e) return exams def GetImages(self, feedback=False): qs = self.images.all() if not feedback: images = [i.image for i in qs if not i.feedback_image] else: images = [i.image for i in qs] return images def GetImageUrls(self): return ",".join(["http://penracourses.org.uk{}".format(i.url) for i in self.GetImages()]) #def GetNonFeedbackQuestionImages(self): #return self.GetImages() class LongSeriesImage(models.Model): image = models.ImageField(upload_to=image_directory_path, storage=image_storage) position = models.IntegerField(default=0) series = models.ForeignKey("LongSeries", related_name="images", on_delete=models.SET_NULL, null=True) class LongSeries(models.Model): modality = models.ForeignKey(Modality, related_name="series_modality", on_delete=models.SET_NULL, null=True) examination = models.ForeignKey( Examination, help_text="Name of the examination", related_name="series_examination", on_delete=models.SET_NULL, null=True) long = models.ForeignKey("Long", help_text="The question this series should be associated with", related_name="series", on_delete=models.SET_NULL, null=True) description = models.TextField(blank=True, help_text="Description of stack, for admin organisation, will not be visible when taking") def __str__(self): return "{} : {} [{}]".format(self.get_examination(), self.description, self.long.pk) def get_examination(self): """Returns a comma seperated text list of regions""" return str(self.examination) def get_absolute_url(self): return reverse('longs:long_series_detail', kwargs={'pk': self.pk}) def get_image_urls(self, feedback=False): images = ["http://penracourses.org.uk{}".format(i.image.url) for i in self.images.all()] return ",".join(images) def get_thumbnail(self): img = findMiddle(self.images.all()).image thumbnailer = get_thumbnailer(img) thumbnail = thumbnailer["exam-list"] return thumbnail def get_block(self): examination = self.get_examination() return format_html('