ReferenceField( 'Preparator', vocabulary='getLabContacts', allowed_types=('LabContact', ), relationship='LabContactInstrumentCertificatePreparator', widget=ReferenceWidget( checkbox_bound=0, label=_("Prepared by"), description=_( "The person at the supplier who prepared the certificate"), size=30, base_query={'is_active': True}, showOn=True, colModel=[{ 'columnName': 'UID', 'hidden': True }, { 'columnName': 'JobTitle', 'width': '20', 'label': _('Job Title') }, { 'columnName': 'Title', 'width': '80', 'label': _('Name') }], ), ), ReferenceField( 'Validator', vocabulary='getLabContacts', allowed_types=('LabContact', ),
), ), ReferenceField( 'SampleType', required=1, vocabulary_display_path_bound=sys.maxsize, allowed_types=('SampleType', ), relationship='SampleSampleType', referenceClass=HoldingReference, mode="rw", read_permission=permissions.View, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget( label=_("Sample Type"), render_own_label=True, visible=False, catalog_name='bika_setup_catalog', base_query={'is_active': True}, showOn=True, ), ), ComputedField( 'SampleTypeTitle', expression= "here.getSampleType() and here.getSampleType().Title() or ''", widget=ComputedWidget(visible=False, ), ), ReferenceField( 'SamplePoint', vocabulary_display_path_bound=sys.maxsize, allowed_types=('SamplePoint', ), relationship='SampleSamplePoint',
)), ReferenceField( 'Client', required=0, allowed_types=('Client', ), relationship='BatchClient', widget=ReferenceWidget( label=_("Client"), size=30, visible=True, base_query={'inactive_state': 'active'}, showOn=True, colModel=[{ 'columnName': 'UID', 'hidden': True }, { 'columnName': 'Title', 'width': '60', 'label': _('Title') }, { 'columnName': 'ClientID', 'width': '20', 'label': _('Client ID') }], ), ), StringField('ClientBatchID', searchable=True, required=0, widget=StringWidget(label=_("Client Batch ID"))), DateTimeField(
class BatchSchemaExtender(object): adapts(IBatch) implements(IOrderableSchemaExtender, IBrowserLayerAwareExtender) layer = INalLimsLayer security = ClassSecurityInfo() fields = [ ExtDateTimeField( "SDGDate", required=True, widget=DateTimeWidget( label="Date Received", description="The Date the Sample Delivery Group was received by the lab.", show_time=False, datepicker_nofuture=1, ) ), ExtStringField( 'SDGTime', required=True, widget=StringWidget( label=_("Time Received"), description=_("The Time the Sample Delivery Group was received by the lab."), ), ), ExtStringField( 'ReportContact', widget=StringWidget( label=_("Report Contact"), description=_("Optional field. Used if there is a secondary client the results are being tested for."), ), ), ExtReferenceField( 'ProjectContact', required=True, default_method='getContactUIDForUser', allowed_types=('Contact',), referenceClass=HoldingReference, relationship="SDGProjectContact", mode="rw", widget=ReferenceWidget( label=_("Project Contact"), size=20, helper_js=("bika_widgets/referencewidget.js", "++resource++bika.lims.js/contact.js"), description=_("The main contact for the project"), catalog_name="portal_catalog", base_query={"is_active": True, "sort_limit": 50, "sort_on": "sortable_title", "sort_order": "ascending"}, showOn=True, popup_width='400px', colModel=[ {'columnName': 'Fullname', 'width': '50', 'label': _('Name')}, {'columnName': 'EmailAddress', 'width': '50', 'label': _('Email Address')}, ], ui_item='Fullname', ), ), ExtReferenceField( 'SamplerContact', required=True, default_method='getContactUIDForUser', allowed_types=('Contact',), referenceClass=HoldingReference, relationship="SDGSamplerContact", mode="rw", widget=ReferenceWidget( label=_("Sampled By"), size=20, helper_js=("bika_widgets/referencewidget.js", "++resource++bika.lims.js/contact.js"), description=_("The person who performed the sampling method."), catalog_name="portal_catalog", base_query={"is_active": True, "sort_limit": 50, "sort_on": "sortable_title", "sort_order": "ascending"}, showOn=True, popup_width='400px', colModel=[ {'columnName': 'Fullname', 'width': '50', 'label': _('Name')}, {'columnName': 'EmailAddress', 'width': '50', 'label': _('Email Address')}, ], ui_item='Fullname', ), ), ExtFileField( 'COC', widget=FileWidget( label="Chain Of Custody", description="Select a printed COC to attach.", visible=False, ) ), ] #Custom function for Contact Fields security.declarePublic('getContactUIDForUser') security.declarePublic('getCurrentDate') def getContactUIDForUser(self): """get the UID of the contact associated with the authenticated user """ mt = getToolByName(self, 'portal_membership') user = mt.getAuthenticatedMember() user_id = user.getUserName() pc = getToolByName(self, 'portal_catalog') r = pc(portal_type='Contact', getUsername=user_id) if len(r) == 1: return r[0].UID def __init__(self, context): self.context = context def getOrder(self, schematas): return schematas def getFields(self): return self.fields
class AnalysisRequestSchemaExtender(object): adapts(IAnalysisRequest) implements(IOrderableSchemaExtender) fields = [ ExtReferenceField( 'Doctor', allowed_types=('Doctor', ), referenceClass=HoldingReference, relationship='AnalysisRequestDoctor', widget=ReferenceWidget( label=_('Doctor'), size=20, render_own_label=True, visible={ 'edit': 'visible', 'view': 'visible', 'add': 'edit', 'header_table': 'visible', 'secondary': 'disabled' }, catalog_name='portal_catalog', base_query={'inactive_state': 'active'}, showOn=True, ), ), ExtComputedField( 'DoctorUID', expression= 'context.getDoctor() and context.getDoctor().UID() or None', widget=ComputedWidget(visible=False, ), ), ExtReferenceField( 'Patient', required=1, allowed_types=('Patient', ), referenceClass=HoldingReference, relationship='AnalysisRequestPatient', read_permission=hpermissions.ViewPatients, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget( label=_('Patient'), size=20, render_own_label=True, visible={ 'edit': 'visible', 'view': 'visible', 'add': 'edit', 'secondary': 'disabled' }, catalog_name='bika_patient_catalog', base_query={'inactive_state': 'active'}, showOn=True, ), ), ExtComputedField( 'PatientID', expression= "context.Schema()['Patient'].get(context).getPatientID() if context.Schema()['Patient'].get(context) else None", mode="r", read_permission=hpermissions.ViewPatients, write_permission=permissions.ModifyPortalContent, widget=ComputedWidget(visible=True, ), ), ExtComputedField( 'PatientUID', expression= "context.Schema()['Patient'].get(context).UID() if context.Schema()['Patient'].get(context) else None", widget=ComputedWidget(visible=False, ), ), BooleanField( 'PanicEmailAlertToClientSent', default=False, widget=BooleanWidget(visible={ 'edit': 'invisible', 'view': 'invisible', 'add': 'invisible' }, ), ), ExtStringField( 'ClientPatientID', searchable=True, required=0, read_permission=hpermissions.ViewPatients, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget( label=_("Client Patient ID"), size=20, colModel=[ { 'columnName': 'id', 'width': '20', 'label': _('Patient ID'), 'align': 'left' }, { 'columnName': 'ClientPatientID', 'width': '20', 'label': _('Client PID'), 'align': 'left' }, { 'columnName': 'Title', 'width': '60', 'label': _('Fullname'), 'align': 'left' }, { 'columnName': 'UID', 'hidden': True }, ], ui_item='ClientPatientID', search_query='', discard_empty=('ClientPatientID', ), search_fields=('ClientPatientID', ), portal_types=('Patient', ), render_own_label=True, visible={ 'edit': 'visible', 'view': 'visible', 'add': 'edit', }, catalog_name='bika_patient_catalog', base_query={'inactive_state': 'active'}, showOn=True, ), ), ] def getOrder(self, schematas): default = schematas['default'] default.remove('Patient') default.remove('Doctor') default.remove('ClientPatientID') default.insert(default.index('Template'), 'ClientPatientID') default.insert(default.index('Template'), 'Patient') default.insert(default.index('Template'), 'Doctor') schematas['default'] = default return schematas def __init__(self, context): self.context = context def getFields(self): return self.fields
class BatchSchemaExtender(object): adapts(IBatch) implements(IOrderableSchemaExtender) fields = [ # ExtComputedField('ClientID', # expression="context.Schema()['Client'].get(context) and context.Schema()['Client'].get(context).ID() or None", # ), # ExtComputedField('ClientUID', # expression="context.Schema()['Client'].get(context) and context.Schema()['Client'].get(context).UID() or None", # ), # ExtComputedField('ClientTitle', # expression="context.Schema()['Client'].get(context) and context.Schema()['Client'].get(context).Title() or None", # ), ExtReferenceField( 'Doctor', required=1, multiValued=0, allowed_types=('Doctor', ), referenceClass=HoldingReference, relationship='BatchDoctor', widget=ReferenceWidget( label=_("Doctor"), description="", render_own_label=False, visible={ 'edit': 'visible', 'view': 'visible' }, base_query={'inactive_state': 'active'}, catalog_name='portal_catalog', showOn=True, colModel=[ { 'columnName': 'DoctorID', 'width': '20', 'label': _('Doctor ID') }, { 'columnName': 'Title', 'width': '80', 'label': _('Full Name') }, ], add_button={ 'visible': True, 'url': 'doctors/portal_factory/Doctor/new/edit', 'return_fields': ['Firstname', 'Surname'], 'js_controllers': [ '#doctor-base-edit', ], 'overlay_handler': 'HealthDoctorOverlayHandler', }, edit_button={ 'visible': True, # url with the root to create/edit a object. 'url': 'doctors/portal_factory/Doctor', 'return_fields': ['Firstname', 'Surname'], 'js_controllers': [ '#doctor-base-edit', ], 'overlay_handler': 'HealthDoctorOverlayHandler', }), ), # ExtComputedField('DoctorID', # expression="context.Schema()['Doctor'].get(context) and context.Schema()['Doctor'].get(context).ID() or None", # ), # ExtComputedField('DoctorUID', # expression="context.Schema()['Doctor'].get(context) and context.Schema()['Doctor'].get(context).UID() or None", # ), # ExtComputedField('DoctorTitle', # expression="context.Schema()['Doctor'].get(context) and context.Schema()['Doctor'].get(context).Title() or None", # ), ExtReferenceField( 'Patient', required=1, multiValued=0, allowed_types=('Patient', ), referenceClass=HoldingReference, relationship='BatchPatient', widget=ReferenceWidget( label=_("Patient"), description="", render_own_label=False, visible={ 'edit': 'visible', 'view': 'visible' }, base_query={'inactive_state': 'active'}, catalog_name='bika_patient_catalog', showOn=True, colModel=[{ 'columnName': 'getPatientID', 'width': '20', 'label': _('Patient ID') }, { 'columnName': 'Title', 'width': '40', 'label': _('Full Name') }, { 'columnName': 'PatientIdentifiers', 'width': '40', 'label': _('Additional Identifiers') }], add_button={ 'visible': True, 'url': 'patients/portal_factory/Patient/new/edit', 'return_fields': ['Firstname', 'Surname'], 'js_controllers': [ '#patient-base-edit', ], 'overlay_handler': 'HealthPatientOverlayHandler', }, edit_button={ 'visible': True, # url with the root to create/edit a object. 'url': 'patients/portal_factory/Patient', 'return_fields': ['Firstname', 'Surname'], 'js_controllers': [ '#patient-base-edit', ], 'overlay_handler': 'HealthPatientOverlayHandler', }), ), # ExtComputedField('PatientID', # expression="context.Schema()['Patient'].get(context) and context.Schema()['Patient'].get(context).ID() or None", # ), # ExtComputedField('PatientUID', # expression="context.Schema()['Patient'].get(context) and context.Schema()['Patient'].get(context).UID() or None", # ), # ExtComputedField('PatientTitle', # expression="context.Schema()['Patient'].get(context) and context.Schema()['Patient'].get(context).Title() or None", # ), ExtDateTimeField( 'OnsetDate', widget=DateTimeWidget(label=_('Onset Date'), ), ), ExtStringField( 'PatientBirthDate', widget=StringWidget(visible=False, ), ), ExtRecordsField( 'PatientAgeAtCaseOnsetDate', widget=SplittedDateWidget( label=_('Patient Age at Case Onset Date'), ), ), ExtBooleanField( 'OnsetDateEstimated', default=False, widget=BooleanWidget(label=_("Onset Date Estimated"), ), ), ExtRecordsField( 'ProvisionalDiagnosis', type='provisionaldiagnosis', subfields=('Code', 'Title', 'Description', 'Onset'), # Temporary fix: https://github.com/bikalabs/bika.health/issues/89 #required_subfields=('Title'), subfield_sizes={ 'Code': 7, 'Title': 20, 'Description': 35, 'Onset': 10 }, subfield_labels={ 'Code': _('Code'), 'Title': _('Provisional diagnosis'), 'Description': _('Description'), 'Onset': _('Onset') }, subfield_types={'Onset': 'datepicker_nofuture'}, widget=RecordsWidget( label='Provisional diagnosis', combogrid_options={ 'Title': { 'colModel': [{ 'columnName': 'Code', 'width': '10', 'label': _('Code') }, { 'columnName': 'Title', 'width': '30', 'label': _('Title') }, { 'columnName': 'Description', 'width': '60', 'label': _('Description') }], 'url': 'getsymptomsbytitle', 'showOn': True, 'width': "650px", }, 'Code': { 'colModel': [{ 'columnName': 'Code', 'width': '10', 'label': _('Code') }, { 'columnName': 'Title', 'width': '30', 'label': _('Title') }, { 'columnName': 'Description', 'width': '60', 'label': _('Description') }], 'url': 'getsymptomsbycode', 'showOn': True, 'width': "650px", }, 'Description': { 'colModel': [{ 'columnName': 'Code', 'width': '10', 'label': _('Code') }, { 'columnName': 'Title', 'width': '30', 'label': _('Title') }, { 'columnName': 'Description', 'width': '60', 'label': _('Description') }], 'url': 'getsymptomsbydesc', 'showOn': True, 'width': "650px", }, }, ), ), ExtTextField( 'AdditionalNotes', default_content_type='text/plain', allowable_content_types=('text/plain', ), default_output_type="text/plain", widget=TextAreaWidget(label=_('Additional notes'), ), ), ExtLinesField( 'CaseStatus', vocabulary=getCaseStatus(), widget=MultiSelectionWidget(format='checkbox', label=_("Case status")), ), ExtLinesField( 'CaseOutcome', vocabulary=getCaseOutcome(), widget=MultiSelectionWidget(format='checkbox', label=_("Case outcome")), ), ExtRecordsField( 'Symptoms', type='symptoms', subfields=('UID', 'Title', 'Description', 'Severity'), widget=CaseSymptomsWidget(label='Symptoms', ), ), ExtRecordsField( 'AetiologicAgents', type='aetiologicagents', subfields=('Title', 'Description', 'Subtype'), subfield_sizes={ 'Title': 15, 'Description': 25, 'Subtype': 10 }, subfield_labels={ 'Title': _('Aetiologic agent'), 'Description': _b('Description'), 'Subtype': _('Subtype') }, # Temporary fix: https://github.com/bikalabs/bika.health/issues/89 # required_subfields=('Title'), widget=RecordsWidget( label='Aetiologic agents', combogrid_options={ 'Title': { 'colModel': [{ 'columnName': 'Title', 'width': '30', 'label': _('Aetiologic agent') }, { 'columnName': 'Description', 'width': '60', 'label': _b('Description') }, { 'columnName': 'Subtype', 'width': '30', 'label': _('Subtype') }], 'url': 'getaetiologicagents', 'showOn': True, 'width': "650px", }, }, ), ), ExtIntegerField( 'HoursFasting', required=0, widget=IntegerWidget(label=_('Hours fasting'), ), ), ExtRecordsField( 'PatientCondition', widget=CasePatientConditionWidget(label='Patient condition', ), ), ExtRecordsField( 'MenstrualStatus', widget=CaseMenstrualStatusWidget(label='Menstrual status', ), ), ExtRecordsField( 'BasalBodyTemperature', widget=CaseBasalBodyTempWidget(label='Basal body temperature', ), ), ExtStringField( 'ClientPatientID', searchable=True, required=0, widget=ReferenceWidget( label=_b("Client Patient ID"), size=12, colModel=[ { 'columnName': 'id', 'width': '20', 'label': _('Patient ID'), 'align': 'left' }, { 'columnName': 'ClientPatientID', 'width': '20', 'label': _('Client PID'), 'align': 'left' }, { 'columnName': 'Title', 'width': '60', 'label': _('Fullname'), 'align': 'left' }, { 'columnName': 'UID', 'hidden': True }, ], ui_item='ClientPatientID', search_query='', discard_empty=('ClientPatientID', ), search_fields=('ClientPatientID', ), portal_types=('Patient', ), render_own_label=False, visible={ 'edit': 'visible', 'view': 'visible', 'add': 'visible' }, catalog_name='bika_patient_catalog', base_query={'inactive_state': 'active'}, showOn=True, ), ), ] def __init__(self, context): self.context = context def getOrder(self, schematas): schematas['default'] = [ 'id', 'title', 'description', 'BatchID', 'ClientPatientID', 'Patient', # 'PatientID', # 'PatientUID', # 'PatientTitle', 'Client', # 'ClientID', # 'ClientUID', # 'ClientTitle', 'ClientBatchID', 'Doctor', # 'DoctorID', # 'DoctorUID', # 'DoctorTitle', 'BatchDate', 'OnsetDate', 'PatientAgeAtCaseOnsetDate', 'OnsetDateEstimated', 'HoursFasting', 'PatientCondition', 'BasalBodyTemperature', 'MenstrualStatus', 'Symptoms', 'ProvisionalDiagnosis', 'CaseStatus', 'CaseOutcome', 'AetiologicAgents', 'AdditionalNotes', 'Remarks', 'PatientBirthDate', 'BatchLabels', 'InheritedObjects', 'InheritedObjectsUI', ] return schematas def getFields(self): return self.fields
from bika.lims.content.bikaschema import BikaSchema from bika.lims.content.bikaschema import BikaFolderSchema from bika.lims import bikaMessageFactory as _ schema = BikaFolderSchema.copy() + BikaSchema.copy() + Schema(( ReferenceField( 'InstrumentType', vocabulary='getInstrumentTypes', allowed_types=('InstrumentType', ), relationship='InstrumentInstrumentType', required=1, widget=ReferenceWidget( label=_("Instrument type"), showOn=True, catalog_name='bika_setup_catalog', base_query={ "is_active": True, "sort_on": "sortable_title", "sort_order": "ascending", }, ), ), ReferenceField( 'Manufacturer', allowed_types=('Manufacturer', ), relationship='InstrumentManufacturer', required=1, widget=ReferenceWidget( label=_("Manufacturer"), showOn=True, catalog_name='bika_setup_catalog', base_query={
## accessors and mutators below to get/set a string value ## (the Title of the object), but still store a normal Reference. ## Form autocomplete widgets can then work with the Titles. ReferenceField('SamplePoint', vocabulary_display_path_bound = sys.maxint, allowed_types = ('SamplePoint',), relationship = 'ARTemplateSamplePoint', referenceClass = HoldingReference, accessor = 'getSamplePoint', edit_accessor = 'getSamplePoint', mutator = 'setSamplePoint', widget=ReferenceWidget( label = _("Sample Point"), description = _("Location where sample was taken"), visible={'edit': 'visible', 'view': 'visible', 'add': 'visible', 'secondary': 'invisible'}, catalog_name='bika_setup_catalog', base_query={'inactive_state': 'active'}, showOn=True, ), ), ComputedField( "SamplePointUID", expression="context.Schema()['SamplePoint'].get(context) and context.Schema()['SamplePoint'].get(context).UID() or ''", widget=ComputedWidget( visible=False, ), ), ReferenceField('SampleType', vocabulary_display_path_bound = sys.maxint, allowed_types = ('SampleType',),
}, }, render_own_label=True, ), ), ReferenceField( 'LinkedSample', vocabulary_display_path_bound=sys.maxsize, multiValue=1, allowed_types=('Sample', ), relationship='SampleSample', referenceClass=HoldingReference, mode="rw", read_permission=permissions.View, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget(label=_("Linked Sample"), ), ), ReferenceField( 'SampleType', required=1, vocabulary_display_path_bound=sys.maxsize, allowed_types=('SampleType', ), relationship='SampleSampleType', referenceClass=HoldingReference, mode="rw", read_permission=permissions.View, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget( label=_("Sample Type"), render_own_label=True, visible={
class AnalysisRequestSchemaExtender(object): adapts(IAnalysisRequest) implements(IOrderableSchemaExtender) def __init__(self, context): self.context = context fields = [ ExtReferenceField( 'Doctor', allowed_types=('Doctor', ), referenceClass=HoldingReference, relationship='AnalysisRequestDoctor', widget=ReferenceWidget( label=_('Doctor'), size=20, render_own_label=True, visible={ 'edit': 'visible', 'view': 'visible', 'add': 'edit', 'header_table': 'visible', 'secondary': 'disabled' }, catalog_name='portal_catalog', base_query={'inactive_state': 'active'}, showOn=True, add_button={ 'visible': True, 'url': 'doctors/portal_factory/Doctor/new/edit', 'return_fields': ['Firstname', 'Surname'], }), ), ExtComputedField( 'DoctorUID', # It looks like recursive, but we must pass through the Schema to obtain data. In this way we allow to LIMS obtain it. expression="context._getDoctorUID()", widget=ComputedWidget(visible=False, ), ), ExtReferenceField( 'Patient', required=1, allowed_types=('Patient', ), referenceClass=HoldingReference, relationship='AnalysisRequestPatient', read_permission=ViewPatients, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget( label=_('Patient'), size=20, render_own_label=True, visible={ 'edit': 'visible', 'view': 'visible', 'add': 'edit', 'secondary': 'disabled' }, catalog_name='bikahealth_catalog_patient_listing', base_query={'inactive_state': 'active'}, colModel=[ { 'columnName': 'Title', 'width': '30', 'label': _('Title'), 'align': 'left' }, # UID is required in colModel { 'columnName': 'UID', 'hidden': True }, ], showOn=True, add_button={ 'visible': True, 'url': 'patients/portal_factory/Patient/new/edit', 'return_fields': ['Firstname', 'Surname'], 'js_controllers': [ '#patient-base-edit', ], 'overlay_handler': 'HealthPatientOverlayHandler', }), ), ExtComputedField( 'PatientID', expression= "context.Schema()['Patient'].get(context).getPatientID() if context.Schema()['Patient'].get(context) else None", mode="r", read_permission=ViewPatients, write_permission=permissions.ModifyPortalContent, widget=ComputedWidget(visible=True, ), ), ExtComputedField( 'PatientUID', expression="here._getPatientUID()", widget=ComputedWidget(visible=False, ), ), BooleanField( 'PanicEmailAlertToClientSent', default=False, widget=BooleanWidget(visible={ 'edit': 'invisible', 'view': 'invisible', 'add': 'invisible' }, ), ), ExtStringField( 'ClientPatientID', searchable=True, required=1, read_permission=ViewPatients, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget( label=_("Client Patient ID"), size=20, colModel=[ { 'columnName': 'id', 'width': '20', 'label': _('Patient ID'), 'align': 'left' }, { 'columnName': 'getClientPatientID', 'width': '20', 'label': _('Client PID'), 'align': 'left' }, { 'columnName': 'Title', 'width': '60', 'label': _('Fullname'), 'align': 'left' }, { 'columnName': 'UID', 'hidden': True }, ], ui_item='getClientPatientID', search_query='', discard_empty=('ClientPatientID', ), search_fields=('ClientPatientID', ), portal_types=('Patient', ), render_own_label=True, visible={ 'edit': 'visible', 'view': 'visible', 'add': 'edit', }, catalog_name='bikahealth_catalog_patient_listing', base_query={'inactive_state': 'active'}, showOn=True, ), ), ] def getOrder(self, schematas): default = schematas['default'] default.remove('Patient') default.remove('Doctor') default.remove('ClientPatientID') default.insert(default.index('Template'), 'ClientPatientID') default.insert(default.index('Template'), 'Patient') default.insert(default.index('Template'), 'Doctor') schematas['default'] = default return schematas def getFields(self): return self.fields
"reports."), label=_("Comments")), ) Department = ReferenceField( "Department", required=1, allowed_types=("Department",), relationship="AnalysisCategoryDepartment", referenceClass=HoldingReference, widget=ReferenceWidget( label=_("Department"), description=_("The laboratory department"), showOn=True, catalog_name=SETUP_CATALOG, base_query={ "is_active": True, "sort_on": "sortable_title", "sort_order": "ascending" }, ) ) SortKey = FloatField( "SortKey", validators=("SortKeyValidator",), widget=DecimalWidget( label=_("Sort Key"), description=_( "Float value from 0.0 - 1000.0 indicating the sort order. " "Duplicate values are ordered alphabetically."),
allowed_types=('Client', ), relationship='PatientClient', widget=ReferenceWidget( label=_("Client"), size=30, catalog_name="portal_catalog", base_query={ "is_active": True, "sort_limit": 30, "sort_on": "sortable_title", "sort_order": "ascending" }, colModel=[{ "columnName": "Title", "label": _("Title"), "width": "30", "align": "left" }, { "columnName": "getProvince", "label": _("Province"), "width": "30", "align": "left" }, { "columnName": "getDistrict", "label": _("District"), "width": "30", "align": "left" }], showOn=True, ), ), ComputedField(
class BatchSchemaExtender(object): adapts(IBatch) implements(IOrderableSchemaExtender) fields = [ ExtReferenceField( 'Doctor', required=1, multiValued=0, allowed_types=('Doctor', ), referenceClass=HoldingReference, relationship='BatchDoctor', widget=ReferenceWidget( label=_("Doctor"), description="", render_own_label=False, visible={ 'edit': 'visible', 'view': 'visible' }, base_query={'is_active': True}, catalog_name='portal_catalog', showOn=True, colModel=[ { 'columnName': 'DoctorID', 'width': '20', 'label': _('Doctor ID') }, { 'columnName': 'Title', 'width': '80', 'label': _('Full Name') }, ], ), ), ExtReferenceField( 'Patient', required=1, multiValued=0, allowed_types=('Patient', ), referenceClass=HoldingReference, relationship='BatchPatient', widget=ReferenceWidget( label=_("Patient"), description="", render_own_label=False, visible={ 'edit': 'visible', 'view': 'visible' }, catalog_name='bikahealth_catalog_patient_listing', search_fields=('listing_searchable_text', ), base_query={ 'is_active': True, 'sort_limit': 50, 'sort_on': 'getPatientID', 'sort_order': 'ascending' }, colModel=[ { 'columnName': "getPatientID", 'width': '30', 'label': _('PID'), 'align': 'left' }, { 'columnName': "getClientPatientID", 'width': '30', 'label': _('CPID'), 'align': 'left' }, { 'columnName': 'Title', 'width': '30', 'label': _('Title'), 'align': 'left' }, ], showOn=True, ), ), ExtDateTimeField( 'OnsetDate', required=1, widget=DateTimeWidget(label=_('Onset Date'), ), ), ExtRecordsField( 'PatientAgeAtCaseOnsetDate', widget=SplittedDateWidget( label=_('Patient Age at Case Onset Date'), ), ), ExtBooleanField( 'OnsetDateEstimated', default=False, widget=BooleanWidget(label=_("Onset Date Estimated"), ), ), ExtRecordsField( 'ProvisionalDiagnosis', type='provisionaldiagnosis', subfields=('Code', 'Title', 'Description', 'Onset'), # Temporary fix: https://github.com/bikalabs/bika.health/issues/89 #required_subfields=('Title'), subfield_sizes={ 'Code': 7, 'Title': 20, 'Description': 35, 'Onset': 10 }, subfield_labels={ 'Code': _('Code'), 'Title': _('Provisional diagnosis'), 'Description': _('Description'), 'Onset': _('Onset') }, subfield_types={'Onset': 'datepicker_nofuture'}, widget=RecordsWidget( label='Provisional diagnosis', combogrid_options={ 'Title': { 'colModel': [{ 'columnName': 'Code', 'width': '10', 'label': _('Code') }, { 'columnName': 'Title', 'width': '30', 'label': _('Title') }, { 'columnName': 'Description', 'width': '60', 'label': _('Description') }], 'url': 'getsymptomsbytitle', 'showOn': True, 'width': "650px", }, 'Code': { 'colModel': [{ 'columnName': 'Code', 'width': '10', 'label': _('Code') }, { 'columnName': 'Title', 'width': '30', 'label': _('Title') }, { 'columnName': 'Description', 'width': '60', 'label': _('Description') }], 'url': 'getsymptomsbycode', 'showOn': True, 'width': "650px", }, 'Description': { 'colModel': [{ 'columnName': 'Code', 'width': '10', 'label': _('Code') }, { 'columnName': 'Title', 'width': '30', 'label': _('Title') }, { 'columnName': 'Description', 'width': '60', 'label': _('Description') }], 'url': 'getsymptomsbydesc', 'showOn': True, 'width': "650px", }, }, ), ), ExtTextField( 'AdditionalNotes', default_content_type='text/plain', allowable_content_types=('text/plain', ), default_output_type="text/plain", widget=TextAreaWidget(label=_('Additional notes'), ), ), ExtLinesField( 'CaseStatus', vocabulary=getCaseStatus(), widget=MultiSelectionWidget(format='checkbox', label=_("Case status")), ), ExtLinesField( 'CaseOutcome', vocabulary=getCaseOutcome(), widget=MultiSelectionWidget(format='checkbox', label=_("Case outcome")), ), ExtRecordsField( 'Symptoms', type='symptoms', subfields=('UID', 'Title', 'Description', 'Severity'), widget=CaseSymptomsWidget(label='Symptoms', ), ), ExtRecordsField( 'AetiologicAgents', type='aetiologicagents', subfields=('Title', 'Description', 'Subtype'), subfield_sizes={ 'Title': 15, 'Description': 25, 'Subtype': 10 }, subfield_labels={ 'Title': _('Aetiologic agent'), 'Description': _b('Description'), 'Subtype': _('Subtype') }, # Temporary fix: https://github.com/bikalabs/bika.health/issues/89 # required_subfields=('Title'), widget=RecordsWidget( label='Aetiologic agents', combogrid_options={ 'Title': { 'colModel': [{ 'columnName': 'Title', 'width': '30', 'label': _('Aetiologic agent') }, { 'columnName': 'Description', 'width': '60', 'label': _b('Description') }, { 'columnName': 'Subtype', 'width': '30', 'label': _('Subtype') }], 'url': 'getaetiologicagents', 'showOn': True, 'width': "650px", }, }, ), ), ExtIntegerField( 'HoursFasting', required=0, widget=IntegerWidget(label=_('Hours fasting'), ), ), ExtRecordsField( 'PatientCondition', widget=CasePatientConditionWidget(label='Patient condition', ), ), ExtRecordsField( 'MenstrualStatus', widget=CaseMenstrualStatusWidget(label='Menstrual status', ), ), ExtRecordsField( 'BasalBodyTemperature', widget=CaseBasalBodyTempWidget(label='Basal body temperature', ), ), ExtStringField( 'ClientPatientID', required=0, widget=ReferenceWidget( label=_b("Client Patient ID"), size=20, visible={ 'edit': 'invisible', 'view': 'visible', 'add': 'edit' }, catalog_name='bikahealth_catalog_patient_listing', portal_types=('Patient', ), search_fields=('getClientPatientID', ), base_query={ 'is_active': True, 'sort_limit': 50, 'sort_on': 'getClientPatientID', 'sort_order': 'ascending' }, force_all=False, colModel=[ { 'columnName': "getPatientID", 'width': '30', 'label': _('PID'), 'align': 'left' }, { 'columnName': "getClientPatientID", 'width': '30', 'label': _('CPID'), 'align': 'left' }, { 'columnName': 'Title', 'width': '30', 'label': _('Fullname'), 'align': 'left' }, # UID is required in colModel { 'columnName': 'UID', 'hidden': True }, ], ui_item="getClientPatientID", showOn=False, ), ), ] def __init__(self, context): self.context = context def getOrder(self, schematas): schematas['default'] = [ 'id', 'title', 'description', 'BatchID', 'Client', 'ClientBatchID', 'ClientPatientID', 'Patient', 'Doctor', 'BatchDate', 'OnsetDate', 'OnsetDateEstimated', 'PatientAgeAtCaseOnsetDate', 'HoursFasting', 'PatientCondition', 'BasalBodyTemperature', 'MenstrualStatus', 'Symptoms', 'ProvisionalDiagnosis', 'CaseStatus', 'CaseOutcome', 'AetiologicAgents', 'AdditionalNotes', 'Remarks', 'BatchLabels', ] return schematas def getFields(self): return self.fields
multiValued=True, allowed_types=("AnalysisRequest",), relationship="ARReportAnalysisRequest", widget=ReferenceWidget( label=_("Contained Analysis Requests"), render_own_label=False, size=20, description=_("Referenced Analysis Requests in the PDF"), visible={ "edit": "visible", "view": "visible", "add": "edit", }, catalog_name="bika_catalog_analysisrequest_listing", base_query={}, showOn=True, colModel=[ { "columnName": "UID", "hidden": True, }, { "columnName": "Title", "label": "Title" }, { "columnName": "ClientTitle", "label": "Client" }, ], ), ), RecordField( "Metadata",
from bika.lims.interfaces import IDepartment Manager = ReferenceField( 'Manager', required=1, allowed_types=('LabContact',), referenceClass=HoldingReference, relationship="DepartmentLabContact", widget=ReferenceWidget( label=_("Manager"), description=_( "Select a manager from the available personnel configured under " "the 'lab contacts' setup item. Departmental managers are " "referenced on analysis results reports containing analyses by " "their department."), showOn=True, catalog_name=SETUP_CATALOG, base_query=dict( is_active=True, sort_on="sortable_title", sort_order="ascending", ), ), ) schema = BikaSchema.copy() + Schema(( Manager, )) schema['description'].widget.visible = True schema['description'].schemata = 'default'
widget=StringWidget( size=60, label=_("Lab URL"), description=_("The Laboratory's web address"), ), ), UIDReferenceField("Supervisor", required=0, allowed_types=("LabContact", ), write_permission=ManageBika, widget=ReferenceWidget( label=_("Supervisor"), description=_("Supervisor of the Lab"), showOn=True, catalog_name=SETUP_CATALOG, base_query=dict( is_active=True, sort_on="sortable_title", sort_order="ascending", ), )), IntegerField( "Confidence", schemata="Accreditation", widget=IntegerWidget( label=_("Confidence Level %"), description=_("This value is reported at the bottom of all " "published results"), ), ), BooleanField(
}, ), ), ReferenceField( "DefaultCategories", schemata="Preferences", required=0, multiValued=1, allowed_types=("AnalysisCategory", ), relationship="ClientDefaultCategories", widget=ReferenceWidget( label=_("Default categories"), description=_( "Always expand the selected categories in client views"), showOn=True, catalog_name=SETUP_CATALOG, base_query=dict( is_active=True, sort_on="sortable_title", sort_order="ascending", ), ), ), ReferenceField( "RestrictedCategories", schemata="Preferences", required=0, multiValued=1, validators=("restrictedcategoriesvalidator", ), allowed_types=("AnalysisCategory", ), relationship="ClientRestrictedCategories", widget=ReferenceWidget(
'disposed': {'view': 'visible', 'edit': 'invisible'}, }, render_own_label=True, ), ), ReferenceField('LinkedSample', vocabulary_display_path_bound=sys.maxsize, multiValue=1, allowed_types=('Sample',), relationship='SampleSample', referenceClass=HoldingReference, mode="rw", read_permission=permissions.View, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget( label=_("Linked Sample"), ), ), ReferenceField('SampleType', required=1, vocabulary_display_path_bound=sys.maxsize, allowed_types=('SampleType',), relationship='SampleSampleType', referenceClass=HoldingReference, mode="rw", read_permission=permissions.View, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget( label=_("Sample Type"), render_own_label=True, visible={'edit': 'visible',
relationship='DoctorClient', required=1, widget=ReferenceWidget( label=_("Client"), size=30, catalog_name="portal_catalog", base_query={ "is_active": True, "sort_limit": 30, "sort_on": "sortable_title", "sort_order": "ascending" }, colModel=[{ "columnName": "Title", "label": _("Title"), "width": "30", "align": "left" }, { "columnName": "getProvince", "label": _("Province"), "width": "30", "align": "left" }, { "columnName": "getDistrict", "label": _("District"), "width": "30", "align": "left" }], showOn=True, ), ), ComputedField(
class AnalysisRequestSchemaExtender(object): adapts(IAnalysisRequest) implements(IOrderableSchemaExtender) def __init__(self, context): self.context = context fields = [ ExtReferenceField( 'Doctor', allowed_types=('Doctor', ), referenceClass=HoldingReference, relationship='AnalysisRequestDoctor', widget=ReferenceWidget( label=_('Doctor'), size=20, render_own_label=True, visible={ 'add': 'edit', 'secondary': 'disabled' }, catalog_name='portal_catalog', base_query={ 'is_active': True, }, minLength=3, showOn=True, add_button={ 'visible': True, 'url': 'doctors/portal_factory/Doctor/new/edit', 'return_fields': ['Firstname', 'Surname'], }), ), ExtReferenceField( 'Patient', required=1, allowed_types=('Patient', ), referenceClass=HoldingReference, relationship='AnalysisRequestPatient', read_permission=ViewPatients, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget( label=_('Patient'), size=20, render_own_label=True, visible={ 'add': 'edit', 'secondary': 'disabled' }, catalog_name='bikahealth_catalog_patient_listing', search_fields=('listing_searchable_text', ), base_query={ 'is_active': True, 'sort_limit': 50, 'sort_on': 'getPatientID', 'sort_order': 'ascending' }, colModel=[ { 'columnName': "getPatientID", 'width': '30', 'label': _('PID'), 'align': 'left' }, { 'columnName': "getClientPatientID", 'width': '30', 'label': _('CPID'), 'align': 'left' }, { 'columnName': 'Title', 'width': '30', 'label': _('Fullname'), 'align': 'left' }, ], minLength=3, showOn=True, add_button={ 'visible': True, 'url': 'patients/portal_factory/Patient/new/edit', 'return_fields': ['Firstname', 'Surname'], 'js_controllers': [ '#patient-base-edit', ], 'overlay_handler': 'HealthPatientOverlayHandler', }), ), ExtBooleanField( 'PanicEmailAlertToClientSent', default=False, widget=BooleanWidget(visible={ 'edit': 'invisible', 'view': 'invisible', 'add': 'invisible' }, ), ), ExtStringField( 'ClientPatientID', searchable=True, required=0, read_permission=ViewPatients, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget( label=_("Client Patient ID"), size=20, render_own_label=True, visible={ 'add': 'edit', 'secondary': 'disabled' }, catalog_name='bikahealth_catalog_patient_listing', portal_types=('Patient', ), search_field='getClientPatientID', base_query={ 'is_active': True, 'sort_limit': 50, 'sort_on': 'getClientPatientID', 'sort_order': 'ascending' }, colModel=[ { 'columnName': "getPatientID", 'width': '30', 'label': _('PID'), 'align': 'left' }, { 'columnName': "getClientPatientID", 'width': '30', 'label': _('CPID'), 'align': 'left' }, { 'columnName': 'Title', 'width': '30', 'label': _('Fullname'), 'align': 'left' }, ], ui_item="getClientPatientID", minLength=3, showOn=True, ), ), ] def getOrder(self, schematas): default = schematas['default'] default.remove('Patient') default.remove('Doctor') default.remove('ClientPatientID') default.insert(default.index('Template'), 'ClientPatientID') default.insert(default.index('Template'), 'Patient') default.insert(default.index('Template'), 'Doctor') schematas['default'] = default return schematas def getFields(self): return self.fields
'view': 'visible' }, render_own_label=True, ), ), ReferenceField( 'LinkedSample', vocabulary_display_path_bound=sys.maxsize, multiValue=1, allowed_types=('Sample', ), relationship='SampleSample', referenceClass=HoldingReference, mode="rw", read_permission=permissions.View, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget(label=_("Linked Sample"), ), ), ReferenceField( 'SampleType', required=1, vocabulary_display_path_bound=sys.maxsize, allowed_types=('SampleType', ), relationship='SampleSampleType', referenceClass=HoldingReference, mode="rw", read_permission=permissions.View, write_permission=permissions.ModifyPortalContent, widget=ReferenceWidget( label=_("Sample Type"), render_own_label=True, visible={
ReferenceField( "SamplePoint", vocabulary_display_path_bound=sys.maxint, allowed_types=("SamplePoint", ), relationship="ARTemplateSamplePoint", referenceClass=HoldingReference, accessor="getSamplePoint", edit_accessor="getSamplePoint", mutator="setSamplePoint", widget=ReferenceWidget( label=_("Sample Point"), description=_("Location where sample is collected"), visible={ "edit": "visible", "view": "visible", "add": "visible", "secondary": "invisible", }, catalog_name="bika_setup_catalog", base_query={"is_active": True}, showOn=True, ), ), ComputedField( "SamplePointUID", expression= "context.Schema()['SamplePoint'].get(context) and context.Schema()['SamplePoint'].get(context).UID() or ''", widget=ComputedWidget(visible=False, ), ), ReferenceField( "SampleType",
from bika.lims.config import PROJECTNAME from bika.lims.content.bikaschema import BikaSchema from bika.lims.content.clientawaremixin import ClientAwareMixin from bika.lims.content.sampletype import SampleTypeAwareMixin from bika.lims.interfaces import IAnalysisSpec from bika.lims.interfaces import IDeactivable schema = Schema(( UIDReferenceField( 'SampleType', allowed_types=('SampleType', ), required=1, widget=ReferenceWidget( label=_("Sample Type"), showOn=True, catalog_name=SETUP_CATALOG, base_query=dict(is_active=True, sort_on="sortable_title", sort_order="ascending"), ), ), UIDReferenceField( 'DynamicAnalysisSpec', allowed_types=('DynamicAnalysisSpec', ), required=0, widget=ReferenceWidget( label=_("Dynamic Analysis Specification"), showOn=True, catalog_name=SETUP_CATALOG, base_query=dict(sort_on="sortable_title", sort_order="ascending"), ), ),
), ReferenceField( 'Worker', vocabulary='getLabContacts', allowed_types=('LabContact', ), relationship='LabContactInstrumentValidation', widget=ReferenceWidget( checkbox_bound=0, label=_("Performed by"), description=_("The person at the supplier who performed the task"), size=30, base_query={'inactive_state': 'active'}, showOn=True, colModel=[{ 'columnName': 'UID', 'hidden': True }, { 'columnName': 'JobTitle', 'width': '20', 'label': _('Job Title') }, { 'columnName': 'Title', 'width': '80', 'label': _('Name') }], ), ), StringField('ReportID', widget=StringWidget( label=_("Report ID"), description=_("Report identification number"), )),
class ClientSchemaExtender(object): adapts(IClient) implements(IOrderableSchemaExtender, IBrowserLayerAwareExtender) layer = INalLimsLayer fields = [ ExtStringField("MBGGrowerNumber", schemata="Grower Info", required=False, widget=StringWidget( label="MBG Grower Number", description="", )), ExtStringField("TBGrowerNumber", schemata="Grower Info", required=False, widget=StringWidget( label="True Blue Grower Number", description="", )), ExtReferenceField( 'GrowerList', schemata="Grower Info", multiValued=1, relationship="ClientDistributor", allowed_types=('Client', ), mode="rw", widget=ReferenceWidget( label=_("List of Client Growers"), description=_("A list of associated Growers for Consultants."), size=20, catalog_name="portal_catalog", base_query={ "is_active": True, "sort_limit": 30, "sort_on": "sortable_title", "sort_order": "ascending" }, showOn=True, popup_width='400px', colModel=[ { 'columnName': 'Name', 'width': '50', 'label': _('Name') }, { 'columnName': 'ClientID', 'width': '50', 'label': _('Email Address') }, ], ui_item='Name', ), ), ] def __init__(self, context): self.context = context def getOrder(self, schematas): return schematas def getFields(self): return self.fields