feat: implement new pathology report search functionality with dedicated view and form.
This commit is contained in:
parent
38f54f252f
commit
6f052be127
15 changed files with 445 additions and 17 deletions
|
|
@ -105,7 +105,7 @@ def ScanOPSchedule(year=False, month=False):
|
|||
# if starts.month != ends.month:
|
||||
# SaveOP(vs, end, end)
|
||||
# print vs, start, end
|
||||
OPSchedule.objects.filter(Complete__in=['NO', 'OO']).update(Complete="完成")
|
||||
OPSchedule.objects.filter(Complete__in=['NO', 'OO', 'OO,OS,OE']).update(Complete="完成")
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -42,9 +42,11 @@ def SavePathology(ChartNo, SESSION = None):
|
|||
p.PersonID = r['PersonID']
|
||||
# p.PathCode = r['PathCode']
|
||||
p.SpecimenGetDate = r['SpecimenGetDate'].replace('/', '-').split(' ')[0]
|
||||
p.ReportDate = r['ReportDate'].replace('/', '-').split(' ')[0]
|
||||
# p.ReportDate = r['ReportDate'].replace('/', '-').split(' ')[0]
|
||||
p.ReportDate = datetime.strptime(r['ReportDate'], "%Y/%m/%d %H:%M")
|
||||
p.url = r['url']
|
||||
p.html = r['html']
|
||||
# print(r['ReportDate'], p.ReportDate)
|
||||
p.save()
|
||||
|
||||
def ScanPathology(days = False):
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 126 KiB After Width: | Height: | Size: 89 KiB |
|
|
@ -402,6 +402,8 @@ ALLOWED_HOSTS = [
|
|||
'192.168.26.10',
|
||||
]
|
||||
|
||||
DEFAULT_AUTO_FIELD='django.db.models.AutoField'
|
||||
|
||||
########## HAYSTACK
|
||||
# HAYSTACK_CONNECTIONS = {
|
||||
# 'default': {
|
||||
|
|
|
|||
|
|
@ -7,17 +7,16 @@ from django.views.generic import TemplateView
|
|||
|
||||
import fileupload.views
|
||||
|
||||
# Uncomment the next two lines to enable the admin:
|
||||
# from django.contrib import admin
|
||||
# admin.autodiscover()
|
||||
|
||||
from django.contrib import admin
|
||||
admin.autodiscover()
|
||||
|
||||
#from fileupload.views import PictureCreateView, PictureDeleteView, multiple_uploader
|
||||
#from registry.views import PictureCreateView, PictureDeleteView, multiple_uploader
|
||||
|
||||
from registry import views as registry_views
|
||||
from registry.views import *
|
||||
|
||||
from django.contrib import admin
|
||||
admin.autodiscover()
|
||||
|
||||
|
||||
urlpatterns = [
|
||||
# Examples:
|
||||
|
|
@ -45,7 +44,8 @@ urlpatterns = [
|
|||
|
||||
|
||||
re_path(r'^registry/op_note/(?P<PatChartNo>\d+)/(?P<date>\d{4}-\d\d-\d\d)/', registry_views.op_note),
|
||||
re_path(r'^registry/patho_report/(?P<PatChartNo>\d+)/(?P<date>\d{4}-\d\d-\d\d)/', registry_views.patho_report),
|
||||
# re_path(r'^registry/patho_report/(?P<PatChartNo>\d+)/(?P<date>\d{4}-\d\d-\d\d)/', registry_views.patho_report),
|
||||
re_path(r'^registry/patho_report/(?P<PathCode>.+)/', registry_views.patho_report),
|
||||
|
||||
re_path(r'^registry/op_prepare/', registry_views.op_prepare),
|
||||
|
||||
|
|
@ -53,7 +53,10 @@ urlpatterns = [
|
|||
re_path(r'^registry/op_edit/', registry_views.op_edit),
|
||||
|
||||
re_path(r'^registry/op_search/', registry_views.op_search),
|
||||
|
||||
re_path(r'^registry/patho_search/', registry_views.patho_search),
|
||||
path('pathology/search/', PathologyReportSearchView.as_view(), name='pathology_search'),
|
||||
|
||||
re_path(r'^registry/op_uncategorized/', registry_views.op_uncategorized),
|
||||
re_path(r'^registry/op_month/', registry_views.op_month),
|
||||
re_path(r'^registry/op_year/', registry_views.op_year),
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 33 KiB |
107
ntuh/rReportTab_lsvReportBody_ctrl0_ctl00_tblDisplay.txt
Normal file
107
ntuh/rReportTab_lsvReportBody_ctrl0_ctl00_tblDisplay.txt
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
<table id="rReportTab_lsvReportBody_ctrl0_ctl00_tblDisplay" class="standard" cellspacing="1" width="100%" cellpadding="1" border="1">
|
||||
<tbody><tr>
|
||||
<th width="10%">
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblTitlePathCode">病理號</span>
|
||||
</th>
|
||||
<td>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblPathCode">S0219316</span>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblFrozenFlag"></span>
|
||||
</td>
|
||||
<th width="10%">
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblTitleSpecimenGetdate">收件日</span>
|
||||
</th>
|
||||
<td>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblSpecimenGetDate">2002/08/12</span>
|
||||
</td>
|
||||
<th width="10%">
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblTitleReportDate">報告日</span>
|
||||
</th>
|
||||
<td>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblReportDate">2002/08/13 00:00</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th width="5%">
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblTitleSpecimenCode">檢體</span>
|
||||
</th>
|
||||
<td>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblSpecimenCode">b</span>
|
||||
</td>
|
||||
<th>科別
|
||||
</th>
|
||||
<td>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblDepCode">SURG</span>
|
||||
</td>
|
||||
<th>病床
|
||||
</th>
|
||||
<td>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblWardNoRoomCoBedNo">04B10801</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th width="10%">
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblTitleTissue">組織由來</span>
|
||||
</th>
|
||||
<td colspan="5">
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblTissue"></span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th width="10%">
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblTitleBedDiagnosis">臨床診斷</span>
|
||||
</th>
|
||||
<td colspan="5">
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblBedDiagnosis">Neurotic tumor</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6" style="font-size: medium">
|
||||
<table border="1" width="100%"><tbody><tr><th colspan="2">01</th></tr><tr><th width="15%">器官與術式</th><td>Lung,left,apex,excision</td></tr><tr><th width="15%">組織學診斷1</th><td>schwannoma</td></tr><tr><th width="15%">診斷描述1</th><td></td></tr></tbody></table>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="6" width="10%">
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblTitleresult">檢查報告</span>
|
||||
|
||||
</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td colspan="6">
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblAlertMessage"></span>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblResult">The specimen submitted consists of 3 tissue fragments measuring up to<br> 3.5 x 3.0 x 2.5 cm. in size fixed in formalin.<br> <br> Grossly, they are yellowish white and elastic. <br> <br> <br> <br> All for section. Jar 0 <br> <br> <br> <br> Microscopically, it shows schwannoma. Prominent Antoni A and Antoni B areas are<br>seen. Same areas of hyalinization and hemorrhage are also noted.<br><br><br><br>Ref.S02-19242</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="1" width="10%">
|
||||
|
||||
</th>
|
||||
<td colspan="5">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
<tr id="rReportTab_lsvReportBody_ctrl0_ctl00_rowReportHide">
|
||||
<th>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblTitleExamDoctorName">執行醫師</span>
|
||||
</th>
|
||||
<td>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblExamDoctorName">林中梧(病解專醫字第0279號)</span>
|
||||
</td>
|
||||
<th>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblTitleInChargeDoctorName">負責醫師</span>
|
||||
</th>
|
||||
<td>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblInChargeDoctorName">王逸平</span>
|
||||
</td>
|
||||
<th>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblTitleReCheckDoctorName">覆閱醫師</span>
|
||||
</th>
|
||||
<td>
|
||||
<span id="rReportTab_lsvReportBody_ctrl0_ctl00_lblReCheckDoctorName"></span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr align="right">
|
||||
<td colspan="6">
|
||||
|
||||
</td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
24
ntuh/registry/forms.py
Normal file
24
ntuh/registry/forms.py
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
|
||||
from django import forms
|
||||
|
||||
from haystack.forms import SearchForm, ModelSearchForm
|
||||
|
||||
class PathologyReportForm(SearchForm):
|
||||
# class PathologyReportForm(ModelSearchForm):
|
||||
q = forms.CharField(
|
||||
required=False,
|
||||
# label=_("Search"),
|
||||
widget=forms.TextInput(attrs={"type": "search"}),
|
||||
)
|
||||
# def __init__(self, *args, **kwargs):
|
||||
# super().__init__(*args, **kwargs)
|
||||
# self.fields["models"] = forms.MultipleChoiceField(
|
||||
# choices=[
|
||||
# # ('registry.opnote', 'Op notes'),
|
||||
# ('registry.pathologyreport', 'Pathology reports')
|
||||
# ],
|
||||
# required=False,
|
||||
# # label=_("Search In"),
|
||||
# widget=forms.CheckboxSelectMultiple,
|
||||
# )
|
||||
|
||||
0
ntuh/registry/templatetags/__init__.py
Normal file
0
ntuh/registry/templatetags/__init__.py
Normal file
29
ntuh/registry/templatetags/pathology.py
Normal file
29
ntuh/registry/templatetags/pathology.py
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
from django import template
|
||||
from pyquery import PyQuery
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@register.filter
|
||||
def patho_short(html):
|
||||
doc = PyQuery(html)
|
||||
report_text = doc('#rReportTab_lsvReportBody_ctrl0_ctl00_TextBox2').text().strip()
|
||||
if not report_text:
|
||||
# report_text = doc('#ContentContainer').text().strip()
|
||||
# report_text = doc('#rReportTab_lsvReportBody_ctrl0_ctl00_tblDisplay').text().strip()
|
||||
# report_text = doc(
|
||||
# '#rReportTab_lsvReportBody_ctrl0_ctl00_tblDisplay > tbody:nth-child(1) > tr:nth-child(5) > td:nth-child(1) > table:nth-child(1)'
|
||||
# ).text().strip()
|
||||
report_text = doc('#rReportTab_lsvReportBody_ctrl0_ctl00_lblResult').text().strip()
|
||||
return report_text
|
||||
|
||||
@register.filter
|
||||
def patho_long(html):
|
||||
doc = PyQuery(html)
|
||||
report_text = doc('#rReportTab_lsvReportBody_ctrl0_ctl00_tblDisplay').text().strip()
|
||||
return report_text
|
||||
|
||||
@register.filter
|
||||
def DOB(html):
|
||||
doc = PyQuery(html)
|
||||
report_text = doc('.patientInfo > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(6)').text().strip()
|
||||
return report_text
|
||||
|
|
@ -8,6 +8,7 @@ import re
|
|||
|
||||
from django.contrib.auth import *
|
||||
from django.contrib.auth.decorators import *
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
|
||||
from django.core import serializers
|
||||
from django.http import *
|
||||
|
|
@ -22,6 +23,7 @@ from categories.models import *
|
|||
from dateutil.relativedelta import *
|
||||
from excel_response import ExcelResponse
|
||||
|
||||
from haystack.generic_views import SearchView
|
||||
from haystack.inputs import AutoQuery, Raw
|
||||
from haystack.query import SearchQuerySet, SQ
|
||||
|
||||
|
|
@ -30,6 +32,8 @@ from pyquery import PyQuery
|
|||
|
||||
from ntuh import settings
|
||||
from registry.models import *
|
||||
|
||||
from .forms import *
|
||||
from .utils import RenewSchedule
|
||||
|
||||
#from multiuploader.models import *
|
||||
|
|
@ -171,13 +175,29 @@ def op_note(request, PatChartNo, date):
|
|||
return HttpResponse()
|
||||
|
||||
@login_required
|
||||
def patho_report(request, PatChartNo, date):
|
||||
for patho in PathologyReport.objects.filter(ChartNo = PatChartNo).order_by('-SpecimenGetDate'):
|
||||
def patho_report2(request, PatChartNo, date):
|
||||
for patho in PathologyReport.objects.filter(ChartNo = PatChartNo).order_by('-ReportDate'):
|
||||
print(patho.ReportDate, date)
|
||||
if patho.ReportDate.strftime("%Y-%m-%d") == date:
|
||||
matches = re.findall('(<table id="rReportTab.*?</table>)', patho.html, re.DOTALL)
|
||||
return HttpResponse(matches[0])
|
||||
|
||||
return HttpResponse()
|
||||
|
||||
@login_required
|
||||
def patho_report(request, PathCode):
|
||||
for patho in PathologyReport.objects.filter(PathCode = PathCode).order_by('-ReportDate'):
|
||||
# matches = re.findall('(<table id="rReportTab.*?</table>)', patho.html, re.DOTALL)
|
||||
# matches = re.findall('(<table id="rReportTab.*?</table>)', patho.html, re.DOTALL)
|
||||
# return HttpResponse(matches[0])
|
||||
doc = PyQuery(patho.html)
|
||||
html = doc('#rReportTab_lsvReportBody_ctrl0_ctl00_tblDisplay').outerHtml().strip()
|
||||
# with open('rReportTab_lsvReportBody_ctrl0_ctl00_tblDisplay.txt', 'w') as f:
|
||||
# f.write(html)
|
||||
|
||||
return HttpResponse(html)
|
||||
return HttpResponse()
|
||||
|
||||
|
||||
#@login_required
|
||||
#def op_images(request, PatChartNo, date):
|
||||
|
|
@ -934,6 +954,19 @@ def patho_html2text(html):
|
|||
report_text = doc('#ContentContainer').text().strip()
|
||||
return report_text
|
||||
|
||||
def patho_long(html):
|
||||
doc = PyQuery(html)
|
||||
report_text = doc('#rReportTab_lsvReportBody_ctrl0_ctl00_tblDisplay').text().strip()
|
||||
return report_text
|
||||
|
||||
def patho_info(html):
|
||||
doc = PyQuery(html)
|
||||
return {
|
||||
'long': doc('#rReportTab_lsvReportBody_ctrl0_ctl00_tblDisplay').text().strip(),
|
||||
'DOB': doc('.patientInfo > table:nth-child(1) > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(6)').text().strip(),
|
||||
}
|
||||
|
||||
|
||||
# using haystack
|
||||
@login_required
|
||||
def patho_search(request):
|
||||
|
|
@ -1502,3 +1535,47 @@ def Default_Dr(request, ChartNo):
|
|||
return HttpResponse(data)
|
||||
return HttpResponse('Only POST accepted')
|
||||
|
||||
class PathologyReportSearchView(LoginRequiredMixin, SearchView):
|
||||
template_name = 'registry/pathology_search.html'
|
||||
# queryset = SearchQuerySet().filter(author='john')
|
||||
# form_class = PathologyReportForm
|
||||
results_per_page = 25
|
||||
|
||||
def get_queryset(self):
|
||||
|
||||
form = PathologyReportForm(self.request.GET or None) # Use GET for filter forms
|
||||
|
||||
sqs = SearchQuerySet().models(PathologyReport)
|
||||
|
||||
queryset = None
|
||||
|
||||
if form.is_valid():
|
||||
filter_value = form.cleaned_data.get('q')
|
||||
if filter_value:
|
||||
queryset = sqs.filter(text=Raw(filter_value)).order_by('-ReportDate')
|
||||
|
||||
return queryset
|
||||
|
||||
def render_to_response(self, context, **response_kwargs):
|
||||
|
||||
if self.request.GET.get('search_xls', None):
|
||||
|
||||
obj2 = context['page_obj'].paginator.object_list
|
||||
|
||||
data = [['ChartNo', 'ReportKey', 'ReportCode',
|
||||
# 'PersonID',
|
||||
'DOB', 'PathCode', 'SpecimenGetDate', 'ReportDate', 'url', 'Report']]
|
||||
for r1 in obj2:
|
||||
r = r1.object
|
||||
p1 = patho_info(r.html)
|
||||
r2 = [r.ChartNo, r.ReportKey, r.ReportCode,
|
||||
# r.PersonID,
|
||||
p1['DOB'], r.PathCode, r.SpecimenGetDate, r.ReportDate, r.url, p1['long']]
|
||||
data.append(r2)
|
||||
|
||||
return ExcelResponse(data,
|
||||
# auto_adjust_width=False
|
||||
)
|
||||
|
||||
return super().render_to_response(context, **response_kwargs)
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 126 KiB |
|
|
@ -113,7 +113,8 @@
|
|||
<li role="presentation"><a href="/registry/op_month/">月報</a></li>
|
||||
<li role="presentation"><a href="/registry/op_year">年報</a></li>
|
||||
<li role="presentation"><a href="/registry/op_search">手術搜尋</a></li>
|
||||
<li role="presentation"><a href="/registry/patho_search">病理搜尋</a></li>
|
||||
<!-- <li role="presentation"><a href="/registry/patho_search">病理搜尋</a></li> -->
|
||||
<li role="presentation"><a href="{% url 'pathology_search' %}">病理搜尋</a></li>
|
||||
<li role="presentation"><a href="/registry/op_charge">緊急到院處理費</a></li>
|
||||
<li role="presentation"><a href="/changelog">更新日誌</a></li>
|
||||
<li role="presentation"><a href="/accounts/logout/?next=/">Logout</a></li>
|
||||
|
|
|
|||
|
|
@ -143,7 +143,7 @@
|
|||
<tr style="background-color:#C0C0FF;">
|
||||
<th>counter</th>
|
||||
<th>病歷號</th>
|
||||
<th>ReportKey</th>
|
||||
<!-- <th>ReportKey</th> -->
|
||||
<!-- <th>ReportCode</td> -->
|
||||
<th>PersonID</th>
|
||||
<th>病理號</th>
|
||||
|
|
@ -158,9 +158,9 @@
|
|||
<tr>
|
||||
<td>{{forloop.counter}}</td>
|
||||
<td>{{report.ChartNo}}</td>
|
||||
<td>{{report.ReportKey|slice:"-8:"}}</td>
|
||||
<!-- <td>{{report.ReportKey|slice:"-8:"}}</td> -->
|
||||
<!-- <td>{{report.ReportCode}}</td> -->
|
||||
<td>{{report.PersonID}}</td>
|
||||
<td>{{report.PersonID}} {{report.html|DOB}}</td>
|
||||
<td>{{report.PathCode}}</td>
|
||||
<td>{{report.SpecimenGetDate|date:"Y-m-d"}}</td>
|
||||
<td>{{report.ReportDate|date:"Y-m-d"}}</td>
|
||||
|
|
|
|||
183
ntuh/templates/registry/pathology_search.html
Normal file
183
ntuh/templates/registry/pathology_search.html
Normal file
|
|
@ -0,0 +1,183 @@
|
|||
{% extends 'base.html' %}
|
||||
|
||||
{% load pathology %}
|
||||
|
||||
{% block head %}
|
||||
<script type="text/javascript">
|
||||
|
||||
function showUrlInDialogx(url, options){
|
||||
options = options || {};
|
||||
var tag = $("<div></div>"); //This tag will the hold the dialog content.
|
||||
$.ajax({
|
||||
url: url,
|
||||
type: (options.type || 'GET'),
|
||||
beforeSend: options.beforeSend,
|
||||
error: options.error,
|
||||
complete: options.complete,
|
||||
success: function(data, textStatus, jqXHR) {
|
||||
if(typeof data == "object" && data.html) { //response is assumed to be JSON
|
||||
tag.html(data.html).dialog({modal: options.modal, title: data.title}).dialog('open');
|
||||
} else { //response is assumed to be HTML
|
||||
tag.html(data).dialog({modal: options.modal, title: options.title}).dialog('open');
|
||||
}
|
||||
$.isFunction(options.success) && (options.success)(data, textStatus, jqXHR);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function showUrlInDialog(url){
|
||||
var tag = $("<div></div>");
|
||||
$.ajax({
|
||||
url: url,
|
||||
success: function(data) {
|
||||
tag.html(data).dialog({
|
||||
dialogClass: "alert",
|
||||
modal: true,
|
||||
show: "slide",
|
||||
width: 640,
|
||||
open: function(){
|
||||
$("body").css("overflow", "hidden");
|
||||
},
|
||||
close: function(){
|
||||
$("body").css("overflow", "auto");
|
||||
},
|
||||
}).dialog('open');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Your code here will execute once the DOM is ready
|
||||
// document.getElementById('id_models').style.display = 'none';
|
||||
document.getElementById("id_models").innerHTML = "<label>Pathology reports</label>";
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
|
||||
{% endblock %}
|
||||
|
||||
{% block logo %}
|
||||
<h1><a href="#">{{specialty}} 病理報告搜尋</a></h1>
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<h2>Search</h2>
|
||||
|
||||
<div id="accordion">
|
||||
<div class="card">
|
||||
<div class="card-header" id="headingTwo">
|
||||
<h5 class="mb-0">
|
||||
<button class="btn btn-primary" data-toggle="collapse" data-target="#collapseTwo" aria-expanded="false" aria-controls="collapseTwo">
|
||||
Query tips!
|
||||
</button>
|
||||
<a href="https://whoosh.readthedocs.io/en/latest/querylang.html" target="_blank">query language</a>
|
||||
</h5>
|
||||
</div>
|
||||
<div id="collapseTwo" class="collapse" aria-labelledby="headingTwo" data-parent="#accordion">
|
||||
<div class="card-body">
|
||||
<table class="table table-sm">
|
||||
<tr><td>單一關鍵字(非100%精確)</td><td>e.g. meningioma, metastatic, schwannoma</td><td>"malignant meningioma"</td></tr>
|
||||
<tr><td>含任一關鍵字</td><td>metastases OR metastasis OR metastatic</td><td>SSTR2a OR EMA</td></tr>
|
||||
<tr><td>含所有關鍵字</td><td>meningioma malignancy</td><td>meningioma AND malignancy</td></tr>
|
||||
<tr><td>排除關鍵字(慎用)</td><td>meningioma NOT atypical NOT malignancy</td><td>meningioma NOT (atypical OR malignancy)</td></tr>
|
||||
<tr><td>萬用字元(慢)</td><td>metasta*</td><td>metastas?s</td></tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<form method="get" action=".">
|
||||
<table>
|
||||
{{ form.as_table }}
|
||||
<tr>
|
||||
<td> </td>
|
||||
<td>
|
||||
<!-- <input type="submit" value="Search"> -->
|
||||
<input class="btn btn-primary" type="submit" id="search_submit" name="search_submit" value="Search" />
|
||||
<input class="btn btn-success" type="submit" id="search_xls" name="search_xls" value="匯出 Excel 2007-2013 XML 工作簿" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
{% if query %}
|
||||
<h3>Results - {{page_obj.paginator.count}} Page: {{page_obj.number}}/{{page_obj.paginator.num_pages}}</h3>
|
||||
|
||||
{% with page=page_obj %}
|
||||
|
||||
{% if page.has_previous or page.has_next %}
|
||||
<nav aria-label="Page navigation example">
|
||||
<ul class="pagination">
|
||||
{% if page.has_previous %}
|
||||
<li class="page-item"><a class="page-link" href="?q={{ query }}&page=1">First</a></li>
|
||||
<li class="page-item"><a class="page-link" href="?q={{ query }}&page={{ page.previous_page_number }}">Previous</a></li>
|
||||
{% endif %}
|
||||
<li class="page-item"><a class="page-link">{{page_obj.number}}</a></li>
|
||||
{% if page.has_next %}
|
||||
<li class="page-item"><a class="page-link" href="?q={{ query }}&page={{ page.next_page_number }}">Next</a></li>
|
||||
<li class="page-item"><a class="page-link" href="?q={{ query }}&page={{ page_obj.paginator.num_pages }}">Last({{ page_obj.paginator.num_pages }})</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</nav>
|
||||
{% endif %}
|
||||
|
||||
<table class="table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>病歷號</th>
|
||||
<!-- <th>ReportKey</th> -->
|
||||
<!-- <th>ReportCode</th> -->
|
||||
<!-- <th>PersonID</th> -->
|
||||
<th>生日</th>
|
||||
<th>病理號</th>
|
||||
<th>收件日</th>
|
||||
<th>報告日</th>
|
||||
<th>html</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for result in page.object_list %}
|
||||
<tr>
|
||||
<td>{{ result.object.ChartNo }}</td>
|
||||
<!-- <td>{{ result.object.ReportKey }}</td> -->
|
||||
<!-- <td>{{ result.object.ReportCode }}</td> -->
|
||||
<!-- <td>{{ r.object.PersonID }}</td> -->
|
||||
<td>{{ result.object.html|DOB }}</td>
|
||||
<td>{{ result.object.PathCode }}</td>
|
||||
<td>{{ result.object.SpecimenGetDate|date:"Y-m-d" }}</td>
|
||||
<td>{{ result.object.ReportDate|date:"Y-m-d" }}</td>
|
||||
<!-- <td>{{ result.object.url }}</td> -->
|
||||
<td>
|
||||
<a href="#" title='{{result.object.html|patho_long}}' onclick="showUrlInDialog('/registry/patho_report/{{result.object.PathCode}}/'); return false;">{{result.object.html|patho_short|truncatewords:20}}</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<p>No results found.</p>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
{% if page.has_previous or page.has_next %}
|
||||
<nav aria-label="Page navigation example">
|
||||
<ul class="pagination">
|
||||
{% if page.has_previous %}
|
||||
<li class="page-item"><a class="page-link" href="?q={{ query }}&page=1">First</a></li>
|
||||
<li class="page-item"><a class="page-link" href="?q={{ query }}&page={{ page.previous_page_number }}">Previous</a></li>
|
||||
{% endif %}
|
||||
<li class="page-item"><a class="page-link">{{page_obj.number}}</a></li>
|
||||
{% if page.has_next %}
|
||||
<li class="page-item"><a class="page-link" href="?q={{ query }}&page={{ page.next_page_number }}">Next</a></li>
|
||||
<li class="page-item"><a class="page-link" href="?q={{ query }}&page={{ page_obj.paginator.num_pages }}">Last({{ page_obj.paginator.num_pages }})</a></li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</nav>
|
||||
{% endif %}
|
||||
|
||||
{% endwith %}
|
||||
{% else %}
|
||||
{# Show some example queries to run, maybe query syntax, something else? #}
|
||||
{% endif %}
|
||||
</form>
|
||||
{% endblock %}
|
||||
Loading…
Reference in a new issue