class Index(TemplateView): template_name = 'zsearch/index.html' # Le serveur orthanc orthanc_server = get_orthanc_server() o = ORTC( orthanc_server['host'], orthanc_server['port'], orthanc_server['user'], orthanc_server['password'], ) def get(self, request, *args, **kwargs): return self.render_to_response({ 'patientform': PatientForm(prefix='patientform_pre'), 'studyform': StudyForm(prefix='studyform_pre') }) # Si c'est POST alors on fait des trucs def post(self, request, *args, **kwargs): patientform = _get_form(request, PatientForm, 'patientform_pre') studyform = _get_form(request, StudyForm, 'studyform_pre') return self.render_to_response({ 'patientform': patientform, 'studyform': studyform })
class SerieDownload(LoginRequiredMixin, TemplateView): template_name = 'view/serie_download.html' # Le serveur orthanc orthanc_server = get_orthanc_server() o = ORTC(orthanc_server['host'], orthanc_server['port'], orthanc_server['user'], orthanc_server['password'], ) # Ajout les infos au contexte def get_context_data(self, **kwargs): # Appel de l'implémentation de base pour obtenir un contexte context = super().get_context_data(**kwargs) # Authentification if self.request.user.is_authenticated: django_user = User.objects.get(username=self.request.user.username) context['django_user'] = django_user else: context['django_user'] = None # Récupère la série et enrichit le contexte if 'serie_id' in self.kwargs: serie_id = self.kwargs['serie_id'] serie = self.o.GetSerie(serie_id) else: serie_id = None serie = None context['serie'] = serie # Récupère l'étude et enrichit le contexte if serie: study = self.o.GetStudy(serie['ParentStudy']) else: study = None context['study'] = study # Récupère le patient et enrichit le contexte if study: context['patient'] = self.o.GetPatient(study['ParentPatient']) else: context['patient'] = None # Récupère la provenance de l'url et enrichit le contexte if 'ref' in self.kwargs: context['ref'] = self.kwargs['ref'] else: context['ref'] = None # Télécharge l'étude if serie_id is not None: self.o.DownloadSerie(serie_id, django_user) # Retourne le contexte return context
class Patient(ListView): template_name = 'view/patient.html' context_object_name = 'studies' # Le serveur orthanc orthanc_server = get_orthanc_server() o = ORTC(orthanc_server['host'], orthanc_server['port'], orthanc_server['user'], orthanc_server['password'], ) # Surcharge queryset parce que l'on ne positionne pas de modèle # et que l'on veut juste bénéficier des facilités de gestion et d'affichage # offertes par la classe ListView sur un jeu de données # issues non pas de la base mais de requêtes REST def get_queryset(self): # Récupère les études if 'patient_id' in self.kwargs: studies = self.o.GetPatientStudies(self.kwargs['patient_id']) else: studies = None # Pagination si l'on trouve des études if studies: self.paginate_by = params['paginate_by'] # Retourne ses études return studies # Enrichit le contexte def get_context_data(self, **kwargs): # Appel de l'implémentation de base pour obtenir un contexte context = super().get_context_data(**kwargs) # Récupère le patient et enrichit le contexte if 'patient_id' in self.kwargs: context['patient'] = self.o.GetPatient(self.kwargs['patient_id']) else: context['patient'] = None # Récupère la provenance de l'url et enrichit le contexte if 'ref' in self.kwargs: context['ref'] = self.kwargs['ref'] else: context['ref'] = None # Retourne le contexte return context
class Serie(DetailView): template_name = 'view/serie.html' context_object_name = 'serie' # Le serveur orthanc orthanc_server = get_orthanc_server() o = ORTC(orthanc_server['host'], orthanc_server['port'], orthanc_server['user'], orthanc_server['password'], ) # Surcharge queryset parce que l'on ne positionne pas de modèle # et que l'on veut juste bénéficier des facilités de gestion et d'affichage # offertes par la classe ListView sur un jeu de données # issues non pas de la base mais de requêtes REST def get_queryset(self): # La série serie = None # Retourne la série return serie # Ajout le détail du patient au contexte def get_context_data(self, **kwargs): # Appel de l'implémentation de base pour obtenir un contexte context = super().get_context_data(**kwargs) # Récupère l'étude et enrichit le contexte if 'study_id' in self.kwargs: study = self.o.GetStudy(self.kwargs['study_id']) else: study = None context['study'] = study # Récupère le patient et enrichit le contexte if study: context['patient'] = self.o.GetPatient(study['ParentPatient']) else: context['patient'] = None # Récupère la provenance de l'url et enrichit le contexte if 'ref' in self.kwargs: context['ref'] = self.kwargs['ref'] else: context['ref'] = None # Retourne le contexte return context
def index(request): stats = None # Récupère les statistiques orthanc_server = get_orthanc_server() o = ORTC(orthanc_server['host'], orthanc_server['port'], orthanc_server['user'], orthanc_server['password'], ) stats = o.GetStatistics() return render(request, 'zstats/index.html', {'orthanc_name': orthanc_server['name'], 'stats': stats,})
class Studies(ListView): template_name = 'view/studies.html' context_object_name = 'studies' paginate_by = params['paginate_by'] orthanc_server = get_orthanc_server() o = ORTC( orthanc_server['host'], orthanc_server['port'], orthanc_server['user'], orthanc_server['password'], ) # Surcharge queryset parce que l'on ne positionne pas de modèle # et que l'on veut juste bénéficier des facilités de gestion et d'affichage # offertes par la classe ListView sur un jeu de données # issues non pas de la base mais de requêtes REST def get_queryset(self): # Appel de l'implémentation de base pour obtenir un contexte request = self.request # Récupère les études qui correspondent à la recherche if 'studies' not in request.session: studies = None else: studies = request.session['studies'] # Retourne les études return studies # Enrichit le contexte def get_context_data(self, **kwargs): # Appel de l'implémentation de base pour obtenir un contexte context = super().get_context_data(**kwargs) # Récupère la provenance de l'url if 'ref' in self.kwargs: context['ref'] = self.kwargs['ref'] else: context['ref'] = None # Retourne le contexte return context # Si c'est POST alors on fait des trucs def post(self, request, *args, **kwargs): studyform = _get_form(request, StudyForm, 'studyform_pre') if studyform.is_bound and studyform.is_valid(): # Process studyform and render response print(studyform.cleaned_data) # Lance la recherche # Ce qui aura pour effet de positionner le payload self.Search(studyform.cleaned_data) # Récupère le contexte context = super().get_context_data(**kwargs) # Positionne la provenance de l'url context['ref'] = 'search' # Rendu de la page return self.render_to_response(context) else: print('oops') # La recherche proprement dite def Search(self, cleaned_data): # Pour le payload REST payload = {} # Quel tag est cherché ? if cleaned_data['study_tag'] == 'REQPD': study_tag = 'RequestedProcedureDescription' elif cleaned_data['study_tag'] == 'INAME': study_tag = 'InstitutionName' # Construction de l'expression de recherche query_expression = 'oops' if cleaned_data['search_scope'] == 'STARTS': query_expression = cleaned_data['study_search_text'] + '*' elif cleaned_data['search_scope'] == 'CONTAINS': query_expression = '*' + cleaned_data['study_search_text'] + '*' # Construit le payload payload['Level'] = 'Study' payload['Expand'] = True payload['Query'] = {} payload['Query'][study_tag] = query_expression print(payload) # Récupère les études studies = self.o.Search(payload) # On met le payload dans la session # Ce qui servira pour la pagination par exemple request = self.request request.session['studies'] = studies # Hyper important self.queryset = studies self.object_list = self.queryset return studies