Split lims module code and merge planification and department modules

This commit is contained in:
Sebastián Marró 2018-05-05 00:36:46 -03:00
parent 90a55361bf
commit 226f440b87
224 changed files with 30232 additions and 34509 deletions

View File

@ -6,11 +6,6 @@
These instructions will get you a copy of the project up and running.
### Prerequisites
You need a working [Tryton](http://www.tryton.org/) system. Follow the [first steps](http://doc.tryton.org/4.4/trytond/doc/index.html#first-steps) in order to install Tryton.
### Installing
Execute:

View File

@ -1,5 +1,5 @@
Copyright (C) 2017 Ignacio Parszyk <iparszyk@kalenislims.com>
Copyright (C) 2013-2017 Sebastián Marró <smarro@kalenislims.com>
Copyright (C) 2017-2018 Ignacio Parszyk <iparszyk@kalenislims.com>
Copyright (C) 2013-2018 Sebastián Marró <smarro@kalenislims.com>
Copyright (C) 2013-2016 Luis Falcon <falcon@gnu.org>
This program is free software: you can redistribute it and/or modify

View File

@ -3,269 +3,348 @@
# the full copyright notices and license terms.
from trytond.pool import Pool
from .formula_parser import *
from .configuration import *
from .lims import *
from .stock import *
from .product import *
from .party import *
from report import *
from wizard import *
from . import formula_parser
from . import department
from . import configuration
from . import laboratory
from . import analysis
from . import sample
from . import entry
from . import notebook
from . import certification
from . import control_tendency
from . import planification
from . import results_report
from . import stock
from . import uom
from . import party
def register():
Pool.register(
FormulaParser,
LimsLaboratory2,
LimsNotebookView,
LimsNotebookViewColumn,
LimsUserRole,
LimsUserRoleGroup,
LimsPrinter,
User,
LimsUserLaboratory,
LimsConfiguration,
LimsConfigurationLaboratory,
LimsLabWorkYear,
LimsLabWorkYearSequence,
LimsLaboratoryProfessional,
LimsLaboratory,
LimsLabMethod,
LimsLabDeviceType,
LimsLabDevice,
LimsLabDeviceLaboratory,
LimsProductType,
LimsMatrix,
LimsFormula,
LimsFractionType,
LimsLaboratoryCVCorrection,
LimsFormulaVariable,
LimsAnalysis,
LimsTypification,
LimsTypificationAditional,
LimsTypificationReadOnly,
LimsCalculatedTypification,
LimsCalculatedTypificationReadOnly,
LimsPackagingType,
LimsAnalysisIncluded,
LimsAnalysisDevice,
LimsCertificationType,
LimsTechnicalScope,
LimsTechnicalScopeVersion,
LimsTechnicalScopeVersionLine,
LimsPackagingIntegrity,
LimsEntrySuspensionReason,
LimsEntry,
LimsZone,
LimsVariety,
LimsSampleProducer,
LimsSample,
LimsFraction,
LimsService,
LimsConcentrationLevel,
LimsEntryDetailAnalysis,
LimsNotebook,
LimsResultsReport,
LimsPlanification,
LimsNotebookLine,
LimsNotebookLineAllFields,
LimsNotebookLineProfessional,
LimsRangeType,
LimsResultsReportVersion,
LimsResultsReportVersionDetail,
LimsResultsReportVersionDetailLine,
LimsAnalysisFamily,
LimsAnalysisFamilyCertificant,
LimsMatrixVariety,
LimsLabDeviceTypeLabMethod,
LimsAnalysisLaboratory,
LimsAnalysisLabMethod,
LimsNotebookLineLaboratoryProfessional,
LimsEntryInvoiceContact,
LimsEntryReportContact,
LimsEntryAcknowledgmentContact,
LimsVolumeConversion,
LimsUomConversion,
LimsRange,
LimsControlTendency,
LimsControlTendencyDetail,
LimsControlTendencyDetailRule,
LimsDuplicateSampleStart,
LimsDuplicateSampleFromEntryStart,
LimsCopyTypificationStart,
LimsCopyCalculatedTypificationStart,
LimsRelateAnalysisStart,
LimsNotebookInitialConcentrationCalcStart,
LimsNotebookResultsConversionStart,
LimsNotebookLimitsValidationStart,
LimsNotebookInternalRelationsCalc1Start,
LimsNotebookInternalRelationsCalc1Relation,
LimsNotebookInternalRelationsCalc1Variable,
LimsNotebookInternalRelationsCalc2Start,
LimsNotebookInternalRelationsCalc2Result,
LimsNotebookInternalRelationsCalc2Relation,
LimsNotebookInternalRelationsCalc2Variable,
LimsNotebookInternalRelationsCalc2Process,
LimsNotebookLoadResultsFormulaStart,
LimsNotebookLoadResultsFormulaEmpty,
LimsNotebookLoadResultsFormulaResult,
LimsNotebookLoadResultsFormulaLine,
LimsNotebookLoadResultsFormulaAction,
LimsNotebookLoadResultsFormulaProcess,
LimsNotebookLoadResultsFormulaVariable,
LimsNotebookLoadResultsFormulaBeginning,
LimsNotebookLoadResultsFormulaConfirm,
LimsNotebookLoadResultsFormulaSit1,
LimsNotebookLoadResultsFormulaSit2,
LimsNotebookLoadResultsFormulaSit2Detail,
LimsNotebookLoadResultsFormulaSit2DetailLine,
LimsNotebookLoadResultsManualStart,
LimsNotebookLoadResultsManualEmpty,
LimsNotebookLoadResultsManualResult,
LimsNotebookLoadResultsManualLine,
LimsNotebookLoadResultsManualSit1,
LimsNotebookLoadResultsManualSit2,
LimsNotebookAddInternalRelationsStart,
LimsNotebookAcceptLinesStart,
LimsNotebookLineRepeatAnalysisStart,
FractionsByLocationsStart,
LimsNotebookResultsVerificationStart,
LimsUncertaintyCalcStart,
LimsNotebookPrecisionControlStart,
LimsMeansDeviationsCalcStart,
LimsMeansDeviationsCalcEmpty,
LimsMeansDeviationsCalcResult,
LimsControlResultLine,
LimsControlResultLineDetail,
LimsMeansDeviationsCalcResult2,
LimsTendenciesAnalysisStart,
LimsTendenciesAnalysisResult,
LimsDivideReportsResult,
LimsDivideReportsDetail,
LimsDivideReportsProcess,
LimsGenerateResultsReportStart,
LimsGenerateResultsReportEmpty,
LimsGenerateResultsReportResultAut,
LimsGenerateResultsReportResultAutNotebook,
LimsGenerateResultsReportResultAutNotebookLine,
LimsGenerateResultsReportResultAutExcludedNotebook,
LimsGenerateResultsReportResultAutExcludedNotebookLine,
LimsGenerateResultsReportResultMan,
LimsDuplicateAnalysisFamilyStart,
LimsResultsReportAnnulationStart,
LimsCountersampleStorageStart,
LimsCountersampleStorageEmpty,
LimsCountersampleStorageResult,
LimsCountersampleStorageRevertStart,
LimsCountersampleStorageRevertEmpty,
LimsCountersampleStorageRevertResult,
LimsCountersampleDischargeStart,
LimsCountersampleDischargeEmpty,
LimsCountersampleDischargeResult,
LimsFractionDischargeStart,
LimsFractionDischargeEmpty,
LimsFractionDischargeResult,
LimsFractionDischargeRevertStart,
LimsFractionDischargeRevertEmpty,
LimsFractionDischargeRevertResult,
LimsCreateSampleStart,
LimsCreateSampleService,
LimsChangeInvoicePartyStart,
LimsChangeInvoicePartyError,
AddTypificationsStart,
RemoveTypificationsStart,
ChangeEstimatedDaysForResultsStart,
LimsCountersampleStoragePrintStart,
LimsCountersampleDischargePrintStart,
PrintAnalysisPendingInformStart,
Location,
Move,
ShipmentInternal,
InventoryLine,
Uom,
UomCategory,
Template,
Party,
Address,
Company,
PrintAnalysisCheckedPendingInformStart,
formula_parser.FormulaParser,
department.Department,
department.UserDepartment,
configuration.NotebookView,
configuration.NotebookViewColumn,
configuration.UserRole,
configuration.UserRoleGroup,
configuration.Printer,
configuration.User,
configuration.UserLaboratory,
configuration.Configuration,
configuration.ConfigurationLaboratory,
configuration.ConfigurationSequence,
configuration.ConfigurationProductCategory,
configuration.LabWorkYear,
configuration.LabWorkYearSequence,
laboratory.LaboratoryProfessional,
laboratory.Laboratory,
laboratory.LabMethod,
laboratory.LabDeviceType,
laboratory.LabDevice,
laboratory.LabDeviceLaboratory,
analysis.ProductType,
analysis.Matrix,
analysis.Formula,
sample.FractionType,
laboratory.LaboratoryCVCorrection,
analysis.FormulaVariable,
analysis.Analysis,
analysis.Typification,
analysis.TypificationAditional,
analysis.TypificationReadOnly,
analysis.CalculatedTypification,
analysis.CalculatedTypificationReadOnly,
sample.PackagingType,
analysis.AnalysisIncluded,
analysis.AnalysisDevice,
certification.CertificationType,
certification.TechnicalScope,
certification.TechnicalScopeVersion,
certification.TechnicalScopeVersionLine,
sample.PackagingIntegrity,
entry.EntrySuspensionReason,
entry.Entry,
sample.Zone,
sample.Variety,
sample.SampleProducer,
sample.Sample,
sample.Fraction,
sample.Service,
uom.ConcentrationLevel,
entry.EntryDetailAnalysis,
notebook.Notebook,
results_report.ResultsReport,
notebook.NotebookLine,
notebook.NotebookLineAllFields,
notebook.NotebookLineProfessional,
control_tendency.RangeType,
results_report.ResultsReportVersion,
results_report.ResultsReportVersionDetail,
results_report.ResultsReportVersionDetailLine,
certification.AnalysisFamily,
certification.AnalysisFamilyCertificant,
sample.MatrixVariety,
laboratory.LabDeviceTypeLabMethod,
analysis.AnalysisLaboratory,
analysis.AnalysisLabMethod,
notebook.NotebookLineLaboratoryProfessional,
entry.EntryInvoiceContact,
entry.EntryReportContact,
entry.EntryAcknowledgmentContact,
uom.VolumeConversion,
uom.UomConversion,
control_tendency.Range,
control_tendency.ControlTendency,
control_tendency.ControlTendencyDetail,
control_tendency.ControlTendencyDetailRule,
sample.DuplicateSampleStart,
sample.DuplicateSampleFromEntryStart,
analysis.CopyTypificationStart,
analysis.CopyCalculatedTypificationStart,
analysis.RelateAnalysisStart,
notebook.NotebookInitialConcentrationCalcStart,
notebook.NotebookResultsConversionStart,
notebook.NotebookLimitsValidationStart,
notebook.NotebookInternalRelationsCalc1Start,
notebook.NotebookInternalRelationsCalc1Relation,
notebook.NotebookInternalRelationsCalc1Variable,
notebook.NotebookInternalRelationsCalc2Start,
notebook.NotebookInternalRelationsCalc2Result,
notebook.NotebookInternalRelationsCalc2Relation,
notebook.NotebookInternalRelationsCalc2Variable,
notebook.NotebookInternalRelationsCalc2Process,
notebook.NotebookLoadResultsFormulaStart,
notebook.NotebookLoadResultsFormulaEmpty,
notebook.NotebookLoadResultsFormulaResult,
notebook.NotebookLoadResultsFormulaLine,
notebook.NotebookLoadResultsFormulaAction,
notebook.NotebookLoadResultsFormulaProcess,
notebook.NotebookLoadResultsFormulaVariable,
notebook.NotebookLoadResultsFormulaBeginning,
notebook.NotebookLoadResultsFormulaConfirm,
notebook.NotebookLoadResultsFormulaSit1,
notebook.NotebookLoadResultsFormulaSit2,
notebook.NotebookLoadResultsFormulaSit2Detail,
notebook.NotebookLoadResultsFormulaSit2DetailLine,
notebook.NotebookLoadResultsManualStart,
notebook.NotebookLoadResultsManualEmpty,
notebook.NotebookLoadResultsManualResult,
notebook.NotebookLoadResultsManualLine,
notebook.NotebookLoadResultsManualSit1,
notebook.NotebookLoadResultsManualSit2,
notebook.NotebookAddInternalRelationsStart,
notebook.NotebookAcceptLinesStart,
notebook.NotebookLineRepeatAnalysisStart,
sample.FractionsByLocationsStart,
notebook.NotebookResultsVerificationStart,
notebook.UncertaintyCalcStart,
notebook.NotebookPrecisionControlStart,
control_tendency.MeansDeviationsCalcStart,
control_tendency.MeansDeviationsCalcEmpty,
control_tendency.MeansDeviationsCalcResult,
control_tendency.ControlResultLine,
control_tendency.ControlResultLineDetail,
control_tendency.MeansDeviationsCalcResult2,
control_tendency.TendenciesAnalysisStart,
control_tendency.TendenciesAnalysisResult,
results_report.DivideReportsResult,
results_report.DivideReportsDetail,
results_report.DivideReportsProcess,
results_report.GenerateResultsReportStart,
results_report.GenerateResultsReportEmpty,
results_report.GenerateResultsReportResultAut,
results_report.GenerateResultsReportResultAutNotebook,
results_report.GenerateResultsReportResultAutNotebookLine,
results_report.GenerateResultsReportResultAutExcludedNotebook,
results_report.GenerateResultsReportResultAutExcludedNotebookLine,
results_report.GenerateResultsReportResultMan,
certification.DuplicateAnalysisFamilyStart,
results_report.ResultsReportAnnulationStart,
sample.CountersampleStorageStart,
sample.CountersampleStorageEmpty,
sample.CountersampleStorageResult,
sample.CountersampleStorageRevertStart,
sample.CountersampleStorageRevertEmpty,
sample.CountersampleStorageRevertResult,
sample.CountersampleDischargeStart,
sample.CountersampleDischargeEmpty,
sample.CountersampleDischargeResult,
sample.FractionDischargeStart,
sample.FractionDischargeEmpty,
sample.FractionDischargeResult,
sample.FractionDischargeRevertStart,
sample.FractionDischargeRevertEmpty,
sample.FractionDischargeRevertResult,
sample.CreateSampleStart,
sample.CreateSampleService,
entry.ChangeInvoicePartyStart,
entry.ChangeInvoicePartyError,
analysis.AddTypificationsStart,
analysis.RemoveTypificationsStart,
notebook.ChangeEstimatedDaysForResultsStart,
sample.CountersampleStoragePrintStart,
sample.CountersampleDischargePrintStart,
notebook.PrintAnalysisPendingInformStart,
stock.Location,
stock.Move,
stock.ShipmentInternal,
uom.Uom,
uom.UomCategory,
uom.Template,
party.Party,
party.Address,
party.Company,
notebook.PrintAnalysisCheckedPendingInformStart,
planification.Planification,
planification.PlanificationTechnician,
planification.PlanificationTechnicianDetail,
planification.PlanificationDetail,
planification.PlanificationServiceDetail,
planification.NotebookLineFraction,
planification.PlanificationServiceDetailLaboratoryProfessional,
planification.PlanificationAnalysis,
planification.PlanificationFraction,
planification.FractionReagent,
planification.LabProfessionalMethod,
planification.LabProfessionalMethodRequalification,
planification.LabProfessionalMethodRequalificationSupervisor,
planification.LabProfessionalMethodRequalificationControl,
planification.BlindSample,
planification.RelateTechniciansStart,
planification.RelateTechniciansResult,
planification.RelateTechniciansDetail1,
planification.RelateTechniciansDetail2,
planification.RelateTechniciansDetail3,
planification.UnlinkTechniciansStart,
planification.UnlinkTechniciansDetail1,
planification.AddFractionControlStart,
planification.AddFractionRMBMZStart,
planification.AddFractionBREStart,
planification.AddFractionMRTStart,
planification.RemoveControlStart,
planification.AddAnalysisStart,
planification.SearchFractionsNext,
planification.SearchFractionsDetail,
planification.SearchPlannedFractionsStart,
planification.SearchPlannedFractionsNext,
planification.SearchPlannedFractionsDetail,
planification.CreateFractionControlStart,
planification.ReleaseFractionStart,
planification.ReleaseFractionEmpty,
planification.ReleaseFractionResult,
planification.QualificationSituations,
planification.QualificationSituation,
planification.QualificationAction,
planification.QualificationSituation2,
planification.QualificationSituation3,
planification.QualificationSituation4,
planification.ReplaceTechnicianStart,
planification.PrintBlindSampleReportStart,
planification.PrintPendingServicesUnplannedReportStart,
module='lims', type_='model')
Pool.register(
LimsPrintAcknowledgmentOfReceipt,
LimsEntryLabelsPrinter,
LimsSampleLabelsPrinter,
LimsPrintControlChart,
LimsCountersampleStoragePrint,
LimsCountersampleDischargePrint,
PrintAnalysisPendingInform,
LimsDuplicateSample,
LimsDuplicateSampleFromEntry,
LimsForwardAcknowledgmentOfReceipt,
LimsCopyTypification,
LimsCopyCalculatedTypification,
LimsRelateAnalysis,
LimsManageServices,
LimsCompleteServices,
LimsNotebookInitialConcentrationCalc,
LimsNotebookLineInitialConcentrationCalc,
LimsNotebookResultsConversion,
LimsNotebookLineResultsConversion,
LimsNotebookLimitsValidation,
LimsNotebookLineLimitsValidation,
LimsNotebookInternalRelationsCalc1,
LimsNotebookLineInternalRelationsCalc1,
LimsNotebookInternalRelationsCalc2,
LimsNotebookLineInternalRelationsCalc2,
LimsNotebookLoadResultsFormula,
LimsNotebookLoadResultsManual,
LimsNotebookAddInternalRelations,
LimsNotebookAcceptLines,
LimsNotebookLineAcceptLines,
LimsNotebookLineUnacceptLines,
LimsNotebookLineRepeatAnalysis,
FractionsByLocations,
LimsNotebookResultsVerification,
LimsNotebookLineResultsVerification,
LimsUncertaintyCalc,
LimsNotebookLineUncertaintyCalc,
LimsNotebookPrecisionControl,
LimsNotebookLinePrecisionControl,
LimsMeansDeviationsCalc,
LimsTendenciesAnalysis,
LimsDivideReports,
LimsGenerateResultsReport,
LimsPrintResultsReport,
LimsDuplicateAnalysisFamily,
LimsServiceResultsReport,
LimsFractionResultsReport,
LimsSampleResultsReport,
LimsResultsReportSample,
LimsResultsReportAnnulation,
LimsCountersampleStorage,
LimsCountersampleStorageRevert,
LimsCountersampleDischarge,
LimsFractionDischarge,
LimsFractionDischargeRevert,
LimsCreateSample,
OpenNotebookLines,
LimsCreateAnalysisProduct,
LimsChangeInvoiceParty,
OpenTypifications,
AddTypifications,
RemoveTypifications,
ChangeEstimatedDaysForResults,
PrintAnalysisCheckedPendingInform,
entry.PrintAcknowledgmentOfReceipt,
entry.EntryLabelsPrinter,
sample.SampleLabelsPrinter,
control_tendency.PrintControlChart,
sample.CountersampleStoragePrint,
sample.CountersampleDischargePrint,
notebook.PrintAnalysisPendingInform,
sample.DuplicateSample,
sample.DuplicateSampleFromEntry,
entry.ForwardAcknowledgmentOfReceipt,
analysis.CopyTypification,
analysis.CopyCalculatedTypification,
analysis.RelateAnalysis,
sample.ManageServices,
sample.CompleteServices,
notebook.NotebookInitialConcentrationCalc,
notebook.NotebookLineInitialConcentrationCalc,
notebook.NotebookResultsConversion,
notebook.NotebookLineResultsConversion,
notebook.NotebookLimitsValidation,
notebook.NotebookLineLimitsValidation,
notebook.NotebookInternalRelationsCalc1,
notebook.NotebookLineInternalRelationsCalc1,
notebook.NotebookInternalRelationsCalc2,
notebook.NotebookLineInternalRelationsCalc2,
notebook.NotebookLoadResultsFormula,
notebook.NotebookLoadResultsManual,
notebook.NotebookAddInternalRelations,
notebook.NotebookAcceptLines,
notebook.NotebookLineAcceptLines,
notebook.NotebookLineUnacceptLines,
notebook.NotebookLineRepeatAnalysis,
sample.FractionsByLocations,
notebook.NotebookResultsVerification,
notebook.NotebookLineResultsVerification,
notebook.UncertaintyCalc,
notebook.NotebookLineUncertaintyCalc,
notebook.NotebookPrecisionControl,
notebook.NotebookLinePrecisionControl,
control_tendency.MeansDeviationsCalc,
control_tendency.TendenciesAnalysis,
results_report.DivideReports,
results_report.GenerateResultsReport,
results_report.PrintResultsReport,
certification.DuplicateAnalysisFamily,
results_report.ServiceResultsReport,
results_report.FractionResultsReport,
results_report.SampleResultsReport,
results_report.ResultsReportSample,
results_report.ResultsReportAnnulation,
sample.CountersampleStorage,
sample.CountersampleStorageRevert,
sample.CountersampleDischarge,
sample.FractionDischarge,
sample.FractionDischargeRevert,
sample.CreateSample,
notebook.OpenNotebookLines,
analysis.CreateAnalysisProduct,
entry.ChangeInvoiceParty,
analysis.OpenTypifications,
analysis.AddTypifications,
analysis.RemoveTypifications,
notebook.ChangeEstimatedDaysForResults,
notebook.PrintAnalysisCheckedPendingInform,
planification.RelateTechnicians,
planification.UnlinkTechnicians,
planification.AddFractionControl,
planification.AddFractionRMBMZ,
planification.AddFractionBRE,
planification.AddFractionMRT,
planification.RemoveControl,
planification.AddAnalysis,
planification.SearchFractions,
planification.SearchPlannedFractions,
planification.CreateFractionControl,
planification.ReleaseFraction,
planification.TechniciansQualification,
planification.ReplaceTechnician,
planification.LoadServices,
planification.PrintBlindSampleReport,
planification.PrintPendingServicesUnplannedReport,
module='lims', type_='wizard')
Pool.register(
LimsAcknowledgmentOfReceipt,
LimsEntryDetail,
LimsEntryLabels,
LimsControlChartReport,
LimsResultReport,
LimsResultReportTranscription,
LimsGlobalResultReport,
LimsCountersampleStorageReport,
LimsCountersampleDischargeReport,
AnalysisPendingInform,
AnalysisCheckedPendingInform,
entry.AcknowledgmentOfReceipt,
entry.EntryDetail,
entry.EntryLabels,
control_tendency.ControlChartReport,
results_report.ResultReport,
results_report.ResultReportTranscription,
results_report.GlobalResultReport,
sample.CountersampleStorageReport,
sample.CountersampleDischargeReport,
notebook.AnalysisPendingInform,
notebook.AnalysisCheckedPendingInform,
planification.PlanificationSequenceReport,
planification.PlanificationWorksheetAnalysisReport,
planification.PlanificationWorksheetMethodReport,
planification.PlanificationWorksheetReport,
planification.PendingServicesUnplannedReport,
planification.PendingServicesUnplannedSpreadsheet,
planification.BlindSampleReport,
planification.PlanificationSequenceAnalysisReport,
module='lims', type_='report')

2419
lims/analysis.py Normal file

File diff suppressed because it is too large Load Diff

526
lims/analysis.xml Normal file
View File

@ -0,0 +1,526 @@
<?xml version="1.0"?>
<tryton>
<data>
<!-- Typification -->
<record model="ir.ui.view" id="lims_typification_view_form">
<field name="model">lims.typification</field>
<field name="type">form</field>
<field name="name">typification_form</field>
</record>
<record model="ir.ui.view" id="lims_typification_view_list">
<field name="model">lims.typification</field>
<field name="type">tree</field>
<field name="name">typification_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_typification_list">
<field name="name">Typifications</field>
<field name="res_model">lims.typification</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_typification_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_typification_view_list"/>
<field name="act_window" ref="act_lims_typification_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_typification_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_typification_view_form"/>
<field name="act_window" ref="act_lims_typification_list"/>
</record>
<!-- Typification Read Only -->
<record model="ir.ui.view" id="lims_typification_readonly_view_list">
<field name="model">lims.typification.readonly</field>
<field name="type">tree</field>
<field name="name">typification_readonly_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_typification_readonly_list">
<field name="name">Typifications</field>
<field name="res_model">lims.typification.readonly</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_typification_readonly_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_typification_readonly_view_list"/>
<field name="act_window" ref="act_lims_typification_readonly_list"/>
</record>
<!-- Calculated Typification Read Only -->
<record model="ir.ui.view" id="lims_typification_calculated_readonly_view_list">
<field name="model">lims.typification.calculated.readonly</field>
<field name="type">tree</field>
<field name="name">typification_calculated_readonly_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_typification_calculated_readonly_list">
<field name="name">Sets/Groups Typifications</field>
<field name="res_model">lims.typification.calculated.readonly</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_typification_calculated_readonly_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_typification_calculated_readonly_view_list"/>
<field name="act_window" ref="act_lims_typification_calculated_readonly_list"/>
</record>
<!-- Product type -->
<record model="ir.ui.view" id="lims_product_type_view_form">
<field name="model">lims.product.type</field>
<field name="type">form</field>
<field name="name">product_type_form</field>
</record>
<record model="ir.ui.view" id="lims_product_type_view_list">
<field name="model">lims.product.type</field>
<field name="type">tree</field>
<field name="name">product_type_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_product_type_list">
<field name="name">Product types</field>
<field name="res_model">lims.product.type</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_product_type_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_product_type_view_list"/>
<field name="act_window" ref="act_lims_product_type_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_product_type_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_product_type_view_form"/>
<field name="act_window" ref="act_lims_product_type_list"/>
</record>
<!-- Matrix -->
<record model="ir.ui.view" id="lims_matrix_view_form">
<field name="model">lims.matrix</field>
<field name="type">form</field>
<field name="name">matrix_form</field>
</record>
<record model="ir.ui.view" id="lims_matrix_view_list">
<field name="model">lims.matrix</field>
<field name="type">tree</field>
<field name="name">matrix_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_matrix_list">
<field name="name">Matrix</field>
<field name="res_model">lims.matrix</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_matrix_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_matrix_view_list"/>
<field name="act_window" ref="act_lims_matrix_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_matrix_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_matrix_view_form"/>
<field name="act_window" ref="act_lims_matrix_list"/>
</record>
<!-- Formula -->
<record model="ir.ui.view" id="lims_formula_view_form">
<field name="model">lims.formula</field>
<field name="type">form</field>
<field name="name">formula_form</field>
</record>
<record model="ir.ui.view" id="lims_formula_view_list">
<field name="model">lims.formula</field>
<field name="type">tree</field>
<field name="name">formula_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_formula_list">
<field name="name">Formulas</field>
<field name="res_model">lims.formula</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_formula_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_formula_view_list"/>
<field name="act_window" ref="act_lims_formula_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_formula_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_formula_view_form"/>
<field name="act_window" ref="act_lims_formula_list"/>
</record>
<!-- Formula Variable -->
<record model="ir.ui.view" id="lims_formula_variable_view_form">
<field name="model">lims.formula.variable</field>
<field name="type">form</field>
<field name="name">formula_variable_form</field>
</record>
<record model="ir.ui.view" id="lims_formula_variable_view_list">
<field name="model">lims.formula.variable</field>
<field name="type">tree</field>
<field name="name">formula_variable_list</field>
</record>
<!-- Analysis/Set/Group -->
<record model="ir.ui.view" id="lims_analysis_view_form">
<field name="model">lims.analysis</field>
<field name="type">form</field>
<field name="name">analysis_form</field>
</record>
<record model="ir.ui.view" id="lims_analysis_view_list">
<field name="model">lims.analysis</field>
<field name="type">tree</field>
<field name="name">analysis_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_analysis_list">
<field name="name">Analysis/Sets/Groups</field>
<field name="res_model">lims.analysis</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_analysis_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_analysis_view_list"/>
<field name="act_window" ref="act_lims_analysis_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_analysis_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_analysis_view_form"/>
<field name="act_window" ref="act_lims_analysis_list"/>
</record>
<record model="ir.rule.group" id="rule_group_analysis_laboratory">
<field name="model" search="[('model', '=', 'lims.analysis-laboratory')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_analysis_laboratory">
<field name="domain"
eval="[If(Bool(Eval('user', {}).get('laboratory', False)), ('laboratory', '=', Eval('user', {}).get('laboratory', None)), If(Bool(Eval('user', {}).get('laboratories', False)), ('laboratory', 'in', Eval('user', {}).get('laboratories', [])), ('id', '!=', 0)))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_analysis_laboratory"/>
</record>
<!-- Included Analysis -->
<record model="ir.ui.view" id="lims_analysis_included_view_form">
<field name="model">lims.analysis.included</field>
<field name="type">form</field>
<field name="name">analysis_included_form</field>
</record>
<record model="ir.ui.view" id="lims_analysis_included_view_list">
<field name="model">lims.analysis.included</field>
<field name="type">tree</field>
<field name="name">analysis_included_list</field>
</record>
<record model="ir.rule.group" id="rule_group_analysis_included">
<field name="model" search="[('model', '=', 'lims.analysis.included')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_analysis_included">
<field name="domain"
eval="[If(Bool(Eval('user', {}).get('laboratory', False)), ('laboratory', '=', Eval('user', {}).get('laboratory', None)), If(Bool(Eval('user', {}).get('laboratories', False)), ('laboratory', 'in', Eval('user', {}).get('laboratories', [])), ('id', '!=', 0)))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_analysis_included"/>
</record>
<!-- Analysis Device -->
<record model="ir.ui.view" id="lims_analysis_device_view_form">
<field name="model">lims.analysis.device</field>
<field name="type">form</field>
<field name="name">analysis_device_form</field>
</record>
<record model="ir.ui.view" id="lims_analysis_device_view_list">
<field name="model">lims.analysis.device</field>
<field name="type">tree</field>
<field name="name">analysis_device_list</field>
</record>
<record model="ir.rule.group" id="rule_group_analysis_device">
<field name="model" search="[('model', '=', 'lims.analysis.device')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_analysis_device">
<field name="domain"
eval="[If(Bool(Eval('user', {}).get('laboratory', False)), ('laboratory', '=', Eval('user', {}).get('laboratory', None)), If(Bool(Eval('user', {}).get('laboratories', False)), ('laboratory', 'in', Eval('user', {}).get('laboratories', [])), ('id', '!=', 0)))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_analysis_device"/>
</record>
<!-- Analysis Laboratory -->
<record model="ir.ui.view" id="lims_analysis_laboratory_view_form">
<field name="model">lims.analysis-laboratory</field>
<field name="type">form</field>
<field name="name">analysis_laboratory_form</field>
</record>
<record model="ir.ui.view" id="lims_analysis_laboratory_view_list">
<field name="model">lims.analysis-laboratory</field>
<field name="type">tree</field>
<field name="name">analysis_laboratory_list</field>
</record>
<!-- Typification actions related -->
<record model="ir.action.act_window" id="act_lims_technical_scope_version_line_related1">
<field name="name">Technical Scope Version Lines</field>
<field name="res_model">lims.technical.scope.version.line</field>
<field name="domain" eval="[('typification', 'in', Eval('active_ids'))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_technical_scope_version_line_keyword1">
<field name="keyword">form_relate</field>
<field name="model">lims.typification,-1</field>
<field name="action" ref="act_lims_technical_scope_version_line_related1"/>
</record>
<record model="ir.action.act_window" id="act_lims_technical_scope_version_related1">
<field name="name">Technical Scope Versions</field>
<field name="res_model">lims.technical.scope.version</field>
<field name="domain" eval="[('version_lines.id', 'in', Eval('active_ids', []))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_technical_scope_version_keyword1">
<field name="keyword">form_relate</field>
<field name="model">lims.typification,-1</field>
<field name="action" ref="act_lims_technical_scope_version_related1"/>
</record>
<!-- Wizard Copy/Move Typification -->
<record model="ir.ui.view" id="lims_copy_typification_start_view_form">
<field name="model">lims.typification.copy.start</field>
<field name="type">form</field>
<field name="name">typification_copy_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_copy_typification">
<field name="name">Copy/Move Typification</field>
<field name="wiz_name">lims.typification.copy</field>
</record>
<record model="ir.action.keyword" id="lims_copy_typification_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.typification,-1</field>
<field name="action" ref="wiz_lims_copy_typification"/>
</record>
<!-- Wizard Copy Calculated Typification -->
<record model="ir.ui.view" id="lims_copy_calculated_typification_start_view_form">
<field name="model">lims.typification.calculated.copy.start</field>
<field name="type">form</field>
<field name="name">typification_calculated_copy_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_copy_calculated_typification">
<field name="name">Copy Typification</field>
<field name="wiz_name">lims.typification.calculated.copy</field>
</record>
<record model="ir.action.keyword" id="lims_copy_calculated_typification_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.typification.calculated.readonly,-1</field>
<field name="action" ref="wiz_lims_copy_calculated_typification"/>
</record>
<!-- Wizard Relate Analysis -->
<record model="ir.ui.view" id="lims_relate_analysis_start_view_form">
<field name="model">lims.relate_analysis.start</field>
<field name="type">form</field>
<field name="name">analysis_relate_analysis_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_relate_analysis">
<field name="name">Relate Analysis</field>
<field name="wiz_name">lims.relate_analysis</field>
</record>
<!-- Wizard Create Analysis Product -->
<record model="ir.action.wizard" id="wiz_lims_create_analysis_product">
<field name="name">Create Analysis Product</field>
<field name="wiz_name">lims.create_analysis_product</field>
</record>
<record model="ir.action.keyword" id="lims_create_analysis_product_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.analysis,-1</field>
<field name="action" ref="wiz_lims_create_analysis_product"/>
</record>
<!-- Wizard Open Typifications -->
<record model="ir.action.wizard" id="act_open_typifications">
<field name="name">Typifications</field>
<field name="wiz_name">lims.scope_version.open_typifications</field>
<field name="model">lims.technical.scope.version</field>
</record>
<!-- Wizard Add Typifications -->
<record model="ir.ui.view" id="scope_version_add_typifications_start_view_form">
<field name="model">lims.scope_version.add_typifications.start</field>
<field name="type">form</field>
<field name="name">scope_version_add_typifications_start_form</field>
</record>
<record model="ir.action.wizard" id="act_add_typifications">
<field name="name">Add Typifications</field>
<field name="wiz_name">lims.scope_version.add_typifications</field>
<field name="model">lims.technical.scope.version</field>
</record>
<!-- Wizard Remove Typifications -->
<record model="ir.ui.view" id="scope_version_remove_typifications_start_view_form">
<field name="model">lims.scope_version.remove_typifications.start</field>
<field name="type">form</field>
<field name="name">scope_version_remove_typifications_start_form</field>
</record>
<record model="ir.action.wizard" id="act_remove_typifications">
<field name="name">Remove Typifications</field>
<field name="wiz_name">lims.scope_version.remove_typifications</field>
<field name="model">lims.technical.scope.version</field>
</record>
<menuitem parent="lims_config_base_tables" action="act_lims_product_type_list"
id="lims_product_type_menu" sequence="10"/>
<menuitem parent="lims_config_base_tables" action="act_lims_matrix_list"
id="lims_matrix_menu" sequence="20"/>
<menuitem parent="lims_config_base_tables" action="act_lims_lab_method_list"
id="lims_lab_method_menu" sequence="30"/>
<menuitem parent="lims_config_base_tables" action="act_lims_formula_list"
id="lims_formula_list_menu" sequence="40"/>
<menuitem parent="lims_config_base_tables" action="act_lims_analysis_list"
id="lims_analysis_menu" sequence="50"/>
<menuitem parent="lims_config_base_tables" action="act_lims_typification_list"
id="lims_typification_menu" sequence="60"/>
<menuitem parent="lims_typification_menu" action="act_lims_typification_calculated_readonly_list"
id="lims_typification_calculated_menu" sequence="10"/>
<record model="ir.model.access" id="access_product_type">
<field name="model" search="[('model', '=', 'lims.product.type')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_product_type_group_conf_base_tables_admin">
<field name="model" search="[('model', '=', 'lims.product.type')]"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_matrix">
<field name="model" search="[('model', '=', 'lims.matrix')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_matrix_group_conf_base_tables_admin">
<field name="model" search="[('model', '=', 'lims.matrix')]"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_formula">
<field name="model" search="[('model', '=', 'lims.formula')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_formula_group_conf_base_tables_admin">
<field name="model" search="[('model', '=', 'lims.formula')]"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_analysis">
<field name="model" search="[('model', '=', 'lims.analysis')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_analysis_group_conf_base_tables_admin">
<field name="model" search="[('model', '=', 'lims.analysis')]"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_typification">
<field name="model" search="[('model', '=', 'lims.typification')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_typification_group_conf_base_tables_admin">
<field name="model" search="[('model', '=', 'lims.typification')]"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_typification_readonly">
<field name="model" search="[('model', '=', 'lims.typification.readonly')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_typification_calculated_readonly">
<field name="model" search="[('model', '=', 'lims.typification.calculated.readonly')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.button" id="analysis_disable_button">
<field name="name">disable</field>
<field name="model" search="[('model', '=', 'lims.analysis')]"/>
</record>
<record model="ir.model.button-res.group" id="analysis_disable_button_group_admin">
<field name="button" ref="analysis_disable_button"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.model.button" id="analysis_activate_button">
<field name="name">activate</field>
<field name="model" search="[('model', '=', 'lims.analysis')]"/>
</record>
<record model="ir.model.button-res.group" id="analysis_activate_button_group_group_lims_conf_base_tables_admin">
<field name="button" ref="analysis_activate_button"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
</record>
<record model="ir.model.button" id="analysis_relate_analysis_button">
<field name="name">relate_analysis</field>
<field name="model" search="[('model', '=', 'lims.analysis')]"/>
</record>
<record model="ir.model.button-res.group" id="analysis_relate_analysis_button_group_group_lims_conf_base_tables_admin">
<field name="button" ref="analysis_relate_analysis_button"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
</record>
</data>
</tryton>

235
lims/certification.py Normal file
View File

@ -0,0 +1,235 @@
# -*- coding: utf-8 -*-
# This file is part of lims module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from trytond.model import ModelView, ModelSQL, fields, Unique
from trytond.wizard import Wizard, StateTransition, StateView, Button
from trytond.pyson import Eval
from trytond.pool import Pool
from trytond.transaction import Transaction
__all__ = ['CertificationType', 'TechnicalScope', 'TechnicalScopeVersion',
'TechnicalScopeVersionLine', 'AnalysisFamily', 'AnalysisFamilyCertificant',
'DuplicateAnalysisFamilyStart', 'DuplicateAnalysisFamily']
class CertificationType(ModelSQL, ModelView):
'Certification Type'
__name__ = 'lims.certification.type'
_rec_name = 'description'
code = fields.Char('Code', required=True)
description = fields.Char('Description', required=True)
report = fields.Boolean('Report')
def get_rec_name(self, name):
if self.code:
return self.code + ' - ' + self.description
else:
return self.description
@classmethod
def search_rec_name(cls, name, clause):
field = None
for field in ('code', 'description'):
records = cls.search([(field,) + tuple(clause[1:])], limit=1)
if records:
break
if records:
return [(field,) + tuple(clause[1:])]
return [(cls._rec_name,) + tuple(clause[1:])]
class TechnicalScope(ModelSQL, ModelView):
'Technical Scope'
__name__ = 'lims.technical.scope'
party = fields.Many2One('party.party', 'Party', required=True)
certification_type = fields.Many2One('lims.certification.type',
'Certification type')
versions = fields.One2Many('lims.technical.scope.version',
'technical_scope', 'Versions')
def get_rec_name(self, name):
if self.party:
return self.party.rec_name
@classmethod
def search_rec_name(cls, name, clause):
return [('party',) + tuple(clause[1:])]
class TechnicalScopeVersion(ModelSQL, ModelView):
'Technical Scope Version'
__name__ = 'lims.technical.scope.version'
_rec_name = 'number'
technical_scope = fields.Many2One('lims.technical.scope',
'Technical scope', required=True)
number = fields.Char('Number', required=True)
date = fields.Date('Date', required=True)
expiration_date = fields.Date('Expiration date')
version_lines = fields.Many2Many('lims.technical.scope.version.line',
'version', 'typification', 'Typifications')
valid = fields.Boolean('Active')
@classmethod
def __setup__(cls):
super(TechnicalScopeVersion, cls).__setup__()
cls._error_messages.update({
'active_version': ('Only one version can be active for each '
'technical scope'),
})
cls._buttons.update({
'open_typifications': {},
'add_typifications': {
'invisible': ~Eval('valid'),
},
'remove_typifications': {
'invisible': ~Eval('valid'),
},
})
@staticmethod
def default_valid():
return True
@classmethod
def validate(cls, versions):
super(TechnicalScopeVersion, cls).validate(versions)
for version in versions:
version.check_active()
def check_active(self):
if self.valid:
versions = self.search([
('technical_scope', '=', self.technical_scope.id),
('valid', '=', True),
('id', '!=', self.id),
])
if versions:
self.raise_user_error('active_version')
@classmethod
@ModelView.button_action('lims.act_open_typifications')
def open_typifications(cls, versions):
pass
@classmethod
@ModelView.button_action('lims.act_add_typifications')
def add_typifications(cls, versions):
pass
@classmethod
@ModelView.button_action('lims.act_remove_typifications')
def remove_typifications(cls, versions):
pass
class TechnicalScopeVersionLine(ModelSQL):
'Technical Scope Version Line'
__name__ = 'lims.technical.scope.version.line'
version = fields.Many2One('lims.technical.scope.version',
'Technical scope version', ondelete='CASCADE', select=True,
required=True)
typification = fields.Many2One('lims.typification', 'Typification',
ondelete='CASCADE', select=True, required=True)
class AnalysisFamily(ModelSQL, ModelView):
'Analysis Family'
__name__ = 'lims.analysis.family'
_rec_name = 'description'
code = fields.Char('Code', required=True)
description = fields.Char('Description', required=True)
party = fields.Many2One('party.party', 'Certificant party')
certificants = fields.One2Many('lims.analysis.family.certificant',
'family', 'Product Type - Matrix')
@classmethod
def __setup__(cls):
super(AnalysisFamily, cls).__setup__()
t = cls.__table__()
cls._sql_constraints += [
('code_uniq', Unique(t, t.code),
'Analysis family code must be unique'),
]
def get_rec_name(self, name):
if self.code:
return self.code + ' - ' + self.description
else:
return self.description
@classmethod
def search_rec_name(cls, name, clause):
field = None
for field in ('code', 'description'):
records = cls.search([(field,) + tuple(clause[1:])], limit=1)
if records:
break
if records:
return [(field,) + tuple(clause[1:])]
return [(cls._rec_name,) + tuple(clause[1:])]
class AnalysisFamilyCertificant(ModelSQL, ModelView):
'Product Type - Matrix'
__name__ = 'lims.analysis.family.certificant'
family = fields.Many2One('lims.analysis.family', 'Family', required=True)
product_type = fields.Many2One('lims.product.type', 'Product type',
required=True)
matrix = fields.Many2One('lims.matrix', 'Matrix', required=True)
@classmethod
def __setup__(cls):
super(AnalysisFamilyCertificant, cls).__setup__()
t = cls.__table__()
cls._sql_constraints += [
('product_matrix_uniq',
Unique(t, t.family, t.product_type, t.matrix),
'This record already exists'),
]
class DuplicateAnalysisFamilyStart(ModelView):
'Duplicate Analysis Family'
__name__ = 'lims.analysis.family.duplicate.start'
family_origin = fields.Many2One('lims.analysis.family', 'Family Origin')
code = fields.Char('Code', required=True)
description = fields.Char('Description', required=True)
party = fields.Many2One('party.party', 'Certificant party')
class DuplicateAnalysisFamily(Wizard):
'Duplicate Analysis Family'
__name__ = 'lims.analysis.family.duplicate'
start = StateView('lims.analysis.family.duplicate.start',
'lims.lims_duplicate_analysis_family_start_view_form', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Duplicate', 'duplicate', 'tryton-ok', default=True),
])
duplicate = StateTransition()
def default_start(self, fields):
AnalysisFamily = Pool().get('lims.analysis.family')
family_origin = AnalysisFamily(Transaction().context['active_id'])
return {
'family_origin': family_origin.id,
'code': family_origin.code,
'description': family_origin.description,
}
def transition_duplicate(self):
AnalysisFamily = Pool().get('lims.analysis.family')
AnalysisFamily.copy([self.start.family_origin], default={
'code': self.start.code,
'description': self.start.description,
'party': self.start.party.id if self.start.party else None,
})
return 'end'

294
lims/certification.xml Normal file
View File

@ -0,0 +1,294 @@
<?xml version="1.0"?>
<tryton>
<data>
<!-- Certification Type -->
<record model="ir.ui.view" id="lims_certification_type_view_form">
<field name="model">lims.certification.type</field>
<field name="type">form</field>
<field name="name">certification_type_form</field>
</record>
<record model="ir.ui.view" id="lims_certification_type_view_list">
<field name="model">lims.certification.type</field>
<field name="type">tree</field>
<field name="name">certification_type_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_certification_type_list">
<field name="name">Certification Type</field>
<field name="res_model">lims.certification.type</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_certification_type_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_certification_type_view_list"/>
<field name="act_window" ref="act_lims_certification_type_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_certification_type_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_certification_type_view_form"/>
<field name="act_window" ref="act_lims_certification_type_list"/>
</record>
<!-- Technical Scope -->
<record model="ir.ui.view" id="lims_technical_scope_view_form">
<field name="model">lims.technical.scope</field>
<field name="type">form</field>
<field name="name">technical_scope_form</field>
</record>
<record model="ir.ui.view" id="lims_technical_scope_view_list">
<field name="model">lims.technical.scope</field>
<field name="type">tree</field>
<field name="name">technical_scope_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_technical_scope_list">
<field name="name">Technical Scopes</field>
<field name="res_model">lims.technical.scope</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_technical_scope_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_technical_scope_view_list"/>
<field name="act_window" ref="act_lims_technical_scope_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_technical_scope_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_technical_scope_view_form"/>
<field name="act_window" ref="act_lims_technical_scope_list"/>
</record>
<!-- Technical Scope Version -->
<record model="ir.ui.view" id="lims_technical_scope_version_view_form">
<field name="model">lims.technical.scope.version</field>
<field name="type">form</field>
<field name="name">technical_scope_version_form</field>
</record>
<record model="ir.ui.view" id="lims_technical_scope_version_view_list">
<field name="model">lims.technical.scope.version</field>
<field name="type">tree</field>
<field name="name">technical_scope_version_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_technical_scope_version_list">
<field name="name">Technical Scope Versions</field>
<field name="res_model">lims.technical.scope.version</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_technical_scope_version_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_technical_scope_version_view_list"/>
<field name="act_window" ref="act_lims_technical_scope_version_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_technical_scope_version_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_technical_scope_version_view_form"/>
<field name="act_window" ref="act_lims_technical_scope_version_list"/>
</record>
<record model="ir.model.button" id="technical_scope_version_open_typifications_button">
<field name="name">open_typifications</field>
<field name="model" search="[('model', '=', 'lims.technical.scope.version')]"/>
</record>
<record model="ir.model.button-res.group" id="technical_scope_version_open_typifications_button_group_lims_conf_certification_admin">
<field name="button" ref="technical_scope_version_open_typifications_button"/>
<field name="group" ref="group_lims_conf_certification_admin"/>
</record>
<record model="ir.model.button" id="technical_scope_version_add_typifications_button">
<field name="name">add_typifications</field>
<field name="model" search="[('model', '=', 'lims.technical.scope.version')]"/>
</record>
<record model="ir.model.button-res.group" id="technical_scope_version_add_typifications_button_group_lims_conf_certification_admin">
<field name="button" ref="technical_scope_version_add_typifications_button"/>
<field name="group" ref="group_lims_conf_certification_admin"/>
</record>
<record model="ir.model.button" id="technical_scope_version_remove_typifications_button">
<field name="name">remove_typifications</field>
<field name="model" search="[('model', '=', 'lims.technical.scope.version')]"/>
</record>
<record model="ir.model.button-res.group" id="technical_scope_version_remove_typifications_button_group_lims_conf_certification_admin">
<field name="button" ref="technical_scope_version_remove_typifications_button"/>
<field name="group" ref="group_lims_conf_certification_admin"/>
</record>
<!-- Analysis Family -->
<record model="ir.ui.view" id="lims_analysis_family_view_form">
<field name="model">lims.analysis.family</field>
<field name="type">form</field>
<field name="name">analysis_family_form</field>
</record>
<record model="ir.ui.view" id="lims_analysis_family_view_list">
<field name="model">lims.analysis.family</field>
<field name="type">tree</field>
<field name="name">analysis_family_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_analysis_family_list">
<field name="name">Analysis Families</field>
<field name="res_model">lims.analysis.family</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_analysis_family_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_analysis_family_view_list"/>
<field name="act_window" ref="act_lims_analysis_family_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_analysis_family_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_analysis_family_view_form"/>
<field name="act_window" ref="act_lims_analysis_family_list"/>
</record>
<!-- Analysis Family Certificant -->
<record model="ir.ui.view" id="lims_analysis_family_certificant_view_form">
<field name="model">lims.analysis.family.certificant</field>
<field name="type">form</field>
<field name="name">analysis_family_certificant_form</field>
</record>
<record model="ir.ui.view" id="lims_analysis_family_certificant_view_list">
<field name="model">lims.analysis.family.certificant</field>
<field name="type">tree</field>
<field name="name">analysis_family_certificant_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_analysis_family_certificant_list">
<field name="name">Certificant Party - Product Type - Matrix</field>
<field name="res_model">lims.analysis.family.certificant</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_analysis_family_certificant_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_analysis_family_certificant_view_list"/>
<field name="act_window" ref="act_lims_analysis_family_certificant_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_analysis_family_certificant_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_analysis_family_certificant_view_form"/>
<field name="act_window" ref="act_lims_analysis_family_certificant_list"/>
</record>
<!-- Wizard Duplicate Analysis Family -->
<record model="ir.ui.view" id="lims_duplicate_analysis_family_start_view_form">
<field name="model">lims.analysis.family.duplicate.start</field>
<field name="type">form</field>
<field name="name">analysis_family_duplicate_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_duplicate_analysis_family">
<field name="name">Duplicate Analysis Family</field>
<field name="wiz_name">lims.analysis.family.duplicate</field>
</record>
<record model="ir.action.keyword" id="lims_duplicate_analysis_family_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.analysis.family,-1</field>
<field name="action" ref="wiz_lims_duplicate_analysis_family"/>
</record>
<!-- Configuration / Certification -->
<menuitem name="Certification" parent="lims_config"
id="lims_config_certification" sequence="20"/>
<menuitem parent="lims_config_certification" action="act_lims_certification_type_list"
id="lims_certification_type_list_menu" sequence="10"/>
<menuitem parent="lims_config_certification" action="act_lims_analysis_family_list"
id="lims_analysis_family_menu" sequence="20"/>
<menuitem parent="lims_config_certification" action="act_lims_technical_scope_list"
id="lims_technical_scope_menu" sequence="30"/>
<menuitem parent="lims_technical_scope_menu" action="act_lims_technical_scope_version_list"
id="lims_technical_scope_version_menu" sequence="10"/>
<record model="ir.model.access" id="access_certification_type">
<field name="model" search="[('model', '=', 'lims.certification.type')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_certification_type_group_conf_certification_admin">
<field name="model" search="[('model', '=', 'lims.certification.type')]"/>
<field name="group" ref="group_lims_conf_certification_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_analysis_family">
<field name="model" search="[('model', '=', 'lims.analysis.family')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_analysis_family_group_conf_certification_admin">
<field name="model" search="[('model', '=', 'lims.analysis.family')]"/>
<field name="group" ref="group_lims_conf_certification_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_technical_scope">
<field name="model" search="[('model', '=', 'lims.technical.scope')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_technical_scope_group_conf_certification_admin">
<field name="model" search="[('model', '=', 'lims.technical.scope')]"/>
<field name="group" ref="group_lims_conf_certification_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_technical_scope_version">
<field name="model" search="[('model', '=', 'lims.technical.scope.version')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_technical_scope_version_group_conf_certification_admin">
<field name="model" search="[('model', '=', 'lims.technical.scope.version')]"/>
<field name="group" ref="group_lims_conf_certification_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_conf_certification_readonly">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_conf_certification_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_conf_certification_admin">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_conf_certification_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_group_conf_certification_readonly">
<field name="menu" ref="lims_config"/>
<field name="group" ref="group_lims_conf_certification_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_group_conf_certification_admin">
<field name="menu" ref="lims_config"/>
<field name="group" ref="group_lims_conf_certification_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_certification_group_conf_certification_readonly">
<field name="menu" ref="lims_config_certification"/>
<field name="group" ref="group_lims_conf_certification_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_certification_group_conf_certification_admin">
<field name="menu" ref="lims_config_certification"/>
<field name="group" ref="group_lims_conf_certification_admin"/>
</record>
</data>
</tryton>

View File

@ -3,30 +3,23 @@
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from trytond import backend
from trytond.model import ModelSingleton, ModelView, ModelSQL, fields
from trytond.pyson import Eval
from trytond.transaction import Transaction
from trytond.pool import Pool, PoolMeta
from trytond.tools.multivalue import migrate_property
from trytond.modules.company.model import (
CompanyMultiValueMixin, CompanyValueMixin)
__all__ = ['LimsLaboratory2', 'LimsNotebookView', 'LimsNotebookViewColumn',
'LimsUserRole', 'LimsUserRoleGroup', 'LimsPrinter', 'User',
'LimsUserLaboratory', 'LimsConfiguration', 'LimsConfigurationLaboratory',
'LimsLabWorkYear', 'LimsLabWorkYearSequence']
__all__ = ['NotebookView', 'NotebookViewColumn', 'UserRole', 'UserRoleGroup',
'Printer', 'User', 'UserLaboratory', 'Configuration',
'ConfigurationLaboratory', 'ConfigurationSequence',
'ConfigurationProductCategory', 'LabWorkYear', 'LabWorkYearSequence']
sequence_names = [
'entry_sequence', 'sample_sequence', 'service_sequence',
'results_report_sequence']
class LimsLaboratory2(ModelSQL):
'Laboratory'
__name__ = 'lims.laboratory'
class LimsNotebookView(ModelSQL, ModelView):
class NotebookView(ModelSQL, ModelView):
'Laboratory Notebook View'
__name__ = 'lims.notebook.view'
@ -35,7 +28,7 @@ class LimsNotebookView(ModelSQL, ModelView):
required=True)
class LimsNotebookViewColumn(ModelSQL, ModelView):
class NotebookViewColumn(ModelSQL, ModelView):
'Laboratory Notebook View Column'
__name__ = 'lims.notebook.view.column'
@ -47,11 +40,11 @@ class LimsNotebookViewColumn(ModelSQL, ModelView):
@classmethod
def __setup__(cls):
super(LimsNotebookViewColumn, cls).__setup__()
super(NotebookViewColumn, cls).__setup__()
cls._order.insert(0, ('sequence', 'ASC'))
class LimsUserRole(ModelSQL, ModelView):
class UserRole(ModelSQL, ModelView):
'User Role'
__name__ = 'lims.user.role'
@ -60,7 +53,7 @@ class LimsUserRole(ModelSQL, ModelView):
'role', 'group', 'Groups')
class LimsUserRoleGroup(ModelSQL):
class UserRoleGroup(ModelSQL):
'User Role - Group'
__name__ = 'lims.user.role-res.group'
@ -71,7 +64,7 @@ class LimsUserRoleGroup(ModelSQL):
@classmethod
def create(cls, vlist):
role_groups = super(LimsUserRoleGroup, cls).create(vlist)
role_groups = super(UserRoleGroup, cls).create(vlist)
cls._create_user_groups(role_groups)
return role_groups
@ -98,7 +91,7 @@ class LimsUserRoleGroup(ModelSQL):
@classmethod
def delete(cls, role_groups):
cls._delete_user_groups(role_groups)
super(LimsUserRoleGroup, cls).delete(role_groups)
super(UserRoleGroup, cls).delete(role_groups)
@classmethod
def _delete_user_groups(cls, role_groups):
@ -119,7 +112,7 @@ class LimsUserRoleGroup(ModelSQL):
UserGroup.delete(user_groups)
class LimsPrinter(ModelSQL, ModelView):
class Printer(ModelSQL, ModelView):
'Printer'
__name__ = 'lims.printer'
@ -137,6 +130,7 @@ class User:
laboratory = fields.Many2One('lims.laboratory', 'Main Laboratory',
domain=[('id', 'in', Eval('laboratories'))], depends=['laboratories'])
printer = fields.Many2One('lims.printer', 'Printer')
departments = fields.One2Many('user.department', 'user', 'Departments')
@classmethod
def __setup__(cls):
@ -222,7 +216,7 @@ class User:
return status
class LimsUserLaboratory(ModelSQL):
class UserLaboratory(ModelSQL):
'User - Laboratory'
__name__ = 'lims.user-laboratory'
@ -232,7 +226,8 @@ class LimsUserLaboratory(ModelSQL):
ondelete='CASCADE', select=True, required=True)
class LimsConfiguration(ModelSingleton, ModelSQL, ModelView):
class Configuration(ModelSingleton, ModelSQL, ModelView,
CompanyMultiValueMixin):
'Configuration'
__name__ = 'lims.configuration'
@ -253,13 +248,46 @@ class LimsConfiguration(ModelSingleton, ModelSQL, ModelView):
soluble_solids_digits = fields.Integer('Soluble solids digits')
rm_start_uom = fields.Many2One('product.uom', 'RM Start UoM',
domain=[('category.lims_only_available', '=', True)])
invoice_party_relation_type = fields.Many2One('party.relation.type',
'Invoice Party Relation Type')
email_qa = fields.Char('QA Email')
analysis_product_category = fields.Many2One('product.category',
'Analysis Product Category', states={'required': True})
entry_confirm_background = fields.Boolean(
'Confirm Entries in Background')
planification_sequence = fields.MultiValue(fields.Many2One(
'ir.sequence', 'Planification Sequence', required=True,
domain=[
('company', 'in',
[Eval('context', {}).get('company', -1), None]),
('code', '=', 'lims.planification'),
]))
mcl_fraction_type = fields.Many2One('lims.fraction.type',
'MCL fraction type')
con_fraction_type = fields.Many2One('lims.fraction.type',
'Control fraction type')
bmz_fraction_type = fields.Many2One('lims.fraction.type',
'BMZ fraction type')
rm_fraction_type = fields.Many2One('lims.fraction.type',
'RM fraction type')
bre_fraction_type = fields.Many2One('lims.fraction.type',
'BRE fraction type')
mrt_fraction_type = fields.Many2One('lims.fraction.type',
'MRT fraction type')
coi_fraction_type = fields.Many2One('lims.fraction.type',
'COI fraction type')
mrc_fraction_type = fields.Many2One('lims.fraction.type',
'MRC fraction type')
sla_fraction_type = fields.Many2One('lims.fraction.type',
'SLA fraction type')
itc_fraction_type = fields.Many2One('lims.fraction.type',
'ITC fraction type')
itl_fraction_type = fields.Many2One('lims.fraction.type',
'ITL fraction type')
reagents = fields.Many2Many('lims.configuration-product.category',
'configuration', 'category', 'Reagents')
planification_process_background = fields.Boolean(
'Process Planifications in Background')
invoice_party_relation_type = fields.Many2One('party.relation.type',
'Invoice Party Relation Type')
@staticmethod
def default_brix_digits():
@ -277,8 +305,45 @@ class LimsConfiguration(ModelSingleton, ModelSQL, ModelView):
def default_entry_confirm_background():
return False
@classmethod
def multivalue_model(cls, field):
pool = Pool()
if field == 'planification_sequence':
return pool.get('lims.configuration.sequence')
return super(Configuration, cls).multivalue_model(field)
class LimsConfigurationLaboratory(ModelSQL):
@classmethod
def default_planification_sequence(cls, **pattern):
return cls.multivalue_model(
'planification_sequence').default_planification_sequence()
@staticmethod
def default_planification_process_background():
return False
def get_reagents(self):
res = []
if self.reagents:
for r in self.reagents:
res.append(r.id)
res.extend(self.get_reagent_childs(r.id))
return res
def get_reagent_childs(self, reagent_id):
Category = Pool().get('product.category')
res = []
categories = Category.search([
('parent', '=', reagent_id),
])
if categories:
for c in categories:
res.append(c.id)
res.extend(self.get_reagent_childs(c.id))
return res
class ConfigurationLaboratory(ModelSQL):
'Configuration - Laboratory'
__name__ = 'lims.configuration-laboratory'
@ -288,7 +353,37 @@ class LimsConfigurationLaboratory(ModelSQL):
ondelete='CASCADE', select=True, required=True)
class LimsLabWorkYear(ModelSQL, ModelView, CompanyMultiValueMixin):
class ConfigurationSequence(ModelSQL, CompanyValueMixin):
'Configuration Sequence'
__name__ = 'lims.configuration.sequence'
planification_sequence = fields.Many2One('ir.sequence',
'Planification Sequence', depends=['company'], domain=[
('company', 'in', [Eval('company', -1), None]),
('code', '=', 'lims.planification'),
])
@classmethod
def default_planification_sequence(cls):
pool = Pool()
ModelData = pool.get('ir.model.data')
try:
return ModelData.get_id('lims.planification', 'seq_planification')
except KeyError:
return None
class ConfigurationProductCategory(ModelSQL):
'Configuration - Product Category'
__name__ = 'lims.configuration-product.category'
configuration = fields.Many2One('lims.configuration', 'Configuration',
ondelete='CASCADE', select=True, required=True)
category = fields.Many2One('product.category', 'Category',
ondelete='CASCADE', select=True, required=True)
class LabWorkYear(ModelSQL, ModelView, CompanyMultiValueMixin):
'Work Year'
__name__ = 'lims.lab.workyear'
_rec_name = 'code'
@ -297,7 +392,7 @@ class LimsLabWorkYear(ModelSQL, ModelView, CompanyMultiValueMixin):
start_date = fields.Date('Start date', required=True)
end_date = fields.Date('End date', required=True)
entry_sequence = fields.MultiValue(fields.Many2One(
'ir.sequence.strict', 'Entry Sequence', required=True,
'ir.sequence', 'Entry Sequence', required=True,
domain=[
('company', 'in',
[Eval('context', {}).get('company', -1), None]),
@ -318,16 +413,20 @@ class LimsLabWorkYear(ModelSQL, ModelView, CompanyMultiValueMixin):
('code', '=', 'lims.service'),
]))
results_report_sequence = fields.MultiValue(fields.Many2One(
'ir.sequence.strict', 'Results Report Sequence', required=True,
'ir.sequence', 'Results Report Sequence', required=True,
domain=[
('company', 'in',
[Eval('context', {}).get('company', -1), None]),
('code', '=', 'lims.results_report'),
]))
sequences = fields.One2Many('lims.lab.workyear.sequence',
'workyear', 'Sequences')
default_entry_control = fields.Many2One('lims.entry',
'Default entry control')
@classmethod
def __setup__(cls):
super(LimsLabWorkYear, cls).__setup__()
super(LabWorkYear, cls).__setup__()
cls._order.insert(0, ('start_date', 'ASC'))
cls._error_messages.update({
'workyear_overlaps': ('Work year "%(first)s" and '
@ -340,7 +439,7 @@ class LimsLabWorkYear(ModelSQL, ModelView, CompanyMultiValueMixin):
pool = Pool()
if field in sequence_names:
return pool.get('lims.lab.workyear.sequence')
return super(LimsLabWorkYear, cls).multivalue_model(field)
return super(LabWorkYear, cls).multivalue_model(field)
@classmethod
def default_entry_sequence(cls, **pattern):
@ -359,7 +458,7 @@ class LimsLabWorkYear(ModelSQL, ModelView, CompanyMultiValueMixin):
@classmethod
def validate(cls, years):
super(LimsLabWorkYear, cls).validate(years)
super(LabWorkYear, cls).validate(years)
for year in years:
year.check_dates()
@ -367,13 +466,13 @@ class LimsLabWorkYear(ModelSQL, ModelView, CompanyMultiValueMixin):
cursor = Transaction().connection.cursor()
table = self.__table__()
cursor.execute(*table.select(table.id,
where=(((table.start_date <= self.start_date)
& (table.end_date >= self.start_date))
| ((table.start_date <= self.end_date)
& (table.end_date >= self.end_date))
| ((table.start_date >= self.start_date)
& (table.end_date <= self.end_date)))
& (table.id != self.id)))
where=(((table.start_date <= self.start_date) &
(table.end_date >= self.start_date)) |
((table.start_date <= self.end_date) &
(table.end_date >= self.end_date)) |
((table.start_date >= self.start_date) &
(table.end_date <= self.end_date))) &
(table.id != self.id)))
second_id = cursor.fetchone()
if second_id:
second = self.__class__(second_id[0])
@ -413,13 +512,13 @@ class LimsLabWorkYear(ModelSQL, ModelView, CompanyMultiValueMixin):
return sequence
class LimsLabWorkYearSequence(ModelSQL, CompanyValueMixin):
class LabWorkYearSequence(ModelSQL, CompanyValueMixin):
'Work Year Sequence'
__name__ = 'lims.lab.workyear.sequence'
workyear = fields.Many2One('lims.lab.workyear', 'Work Year',
ondelete='CASCADE', select=True)
entry_sequence = fields.Many2One('ir.sequence.strict',
entry_sequence = fields.Many2One('ir.sequence',
'Entry Sequence', depends=['company'], domain=[
('company', 'in', [Eval('company', -1), None]),
('code', '=', 'lims.entry'),
@ -434,31 +533,12 @@ class LimsLabWorkYearSequence(ModelSQL, CompanyValueMixin):
('company', 'in', [Eval('company', -1), None]),
('code', '=', 'lims.service'),
])
results_report_sequence = fields.Many2One('ir.sequence.strict',
results_report_sequence = fields.Many2One('ir.sequence',
'Results Report Sequence', depends=['company'], domain=[
('company', 'in', [Eval('company', -1), None]),
('code', '=', 'lims.results_report'),
])
@classmethod
def __register__(cls, module_name):
TableHandler = backend.get('TableHandler')
exist = TableHandler.table_exist(cls._table)
super(LimsLabWorkYearSequence, cls).__register__(module_name)
if not exist:
cls._migrate_property([], [], [])
@classmethod
def _migrate_property(cls, field_names, value_names, fields):
field_names.extend(sequence_names)
value_names.extend(sequence_names)
fields.append('company')
migrate_property(
'lims.lab.workyear', field_names, cls, value_names,
parent='workyear', fields=fields)
@classmethod
def default_entry_sequence(cls):
pool = Pool()

260
lims/configuration.xml Normal file
View File

@ -0,0 +1,260 @@
<?xml version="1.0"?>
<tryton>
<data>
<record model="ir.ui.icon" id="configuration_icon">
<field name="name">lims-configuration</field>
<field name="path">icons/configuration.svg</field>
</record>
<!-- Configuration -->
<record model="ir.ui.view" id="lims_configuration_view">
<field name="model">lims.configuration</field>
<field name="type">form</field>
<field name="name">configuration_form</field>
</record>
<record model="ir.action.act_window" id="act_lims_configuration">
<field name="name">Configuration</field>
<field name="res_model">lims.configuration</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_configuration_view">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_configuration_view"/>
<field name="act_window" ref="act_lims_configuration"/>
</record>
<!-- Work Year -->
<record model="ir.ui.view" id="lims_workyear_view_form">
<field name="model">lims.lab.workyear</field>
<field name="type">form</field>
<field name="name">workyear_form</field>
</record>
<record model="ir.ui.view" id="lims_workyear_view_list">
<field name="model">lims.lab.workyear</field>
<field name="type">tree</field>
<field name="name">workyear_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_workyear_list">
<field name="name">Work Years</field>
<field name="res_model">lims.lab.workyear</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_workyear_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_workyear_view_list"/>
<field name="act_window" ref="act_lims_workyear_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_workyear_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_workyear_view_form"/>
<field name="act_window" ref="act_lims_workyear_list"/>
</record>
<!-- Laboratory Notebook View -->
<record model="ir.ui.view" id="lims_notebook_views_view_form">
<field name="model">lims.notebook.view</field>
<field name="type">form</field>
<field name="name">notebook_view_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_views_view_list">
<field name="model">lims.notebook.view</field>
<field name="type">tree</field>
<field name="name">notebook_view_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_notebook_views_list">
<field name="name">Laboratory Notebook Views</field>
<field name="res_model">lims.notebook.view</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_notebook_views_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_notebook_views_view_list"/>
<field name="act_window" ref="act_lims_notebook_views_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_notebook_views_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_notebook_views_view_form"/>
<field name="act_window" ref="act_lims_notebook_views_list"/>
</record>
<!-- Laboratory Notebook View Column -->
<record model="ir.ui.view" id="lims_notebook_view_column_view_form">
<field name="model">lims.notebook.view.column</field>
<field name="type">form</field>
<field name="name">notebook_view_column_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_view_column_view_list">
<field name="model">lims.notebook.view.column</field>
<field name="type">tree</field>
<field name="name">notebook_view_column_list</field>
</record>
<!-- Printer -->
<record model="ir.ui.view" id="lims_printer_view_form">
<field name="model">lims.printer</field>
<field name="type">form</field>
<field name="name">printer_form</field>
</record>
<record model="ir.ui.view" id="lims_printer_view_list">
<field name="model">lims.printer</field>
<field name="type">tree</field>
<field name="name">printer_list</field>
</record>
<record model="ir.action.act_window" id="act_printer_list">
<field name="name">Printers</field>
<field name="res_model">lims.printer</field>
</record>
<record model="ir.action.act_window.view" id="act_printer_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_printer_view_list"/>
<field name="act_window" ref="act_printer_list"/>
</record>
<record model="ir.action.act_window.view" id="act_printer_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_printer_view_form"/>
<field name="act_window" ref="act_printer_list"/>
</record>
<!-- Configuration -->
<menuitem name="Configuration" parent="lims_menu"
id="lims_config" sequence="10" icon="lims-configuration"/>
<!-- Configuration / Base -->
<menuitem name="Base" parent="lims_config"
id="lims_config_base" sequence="10"/>
<menuitem parent="lims_config_base" action="act_lims_configuration"
id="lims_configuration_menu" sequence="10"/>
<menuitem parent="lims_config_base" action="act_lims_workyear_list"
id="lims_workyear_menu" sequence="20"/>
<menuitem parent="lims_config_base" action="act_printer_list"
id="lims_printer_menu" sequence="30"/>
<menuitem name="Base Tables" parent="lims_config"
id="lims_config_base_tables" sequence="70"/>
<menuitem name="Laboratory" parent="lims_config"
id="lims_config_laboratory" sequence="40"/>
<menuitem parent="lims_config_laboratory" action="act_lims_laboratory_list"
id="lims_laboratory_menu" sequence="10"/>
<menuitem parent="lims_config_laboratory" action="act_lims_laboratory_professional_list"
id="lims_laboratory_professional_menu" sequence="20"/>
<menuitem parent="lims_config_laboratory" action="act_lims_notebook_views_list"
id="lims_notebook_views_menu" sequence="30"/>
<menuitem parent="lims_config_laboratory" action="act_lims_lab_device_type_list"
id="lims_lab_device_type_menu" sequence="40"/>
<menuitem parent="lims_config_laboratory" action="act_lims_lab_device_list"
id="lims_lab_device_menu" sequence="50"/>
<record model="ir.model.access" id="access_configuration">
<field name="model" search="[('model', '=', 'lims.configuration')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_configuration_group_conf_base_admin">
<field name="model" search="[('model', '=', 'lims.configuration')]"/>
<field name="group" ref="group_lims_conf_base_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_workyear">
<field name="model" search="[('model', '=', 'lims.lab.workyear')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_workyear_group_conf_base_admin">
<field name="model" search="[('model', '=', 'lims.lab.workyear')]"/>
<field name="group" ref="group_lims_conf_base_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_conf_base_readonly">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_conf_base_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_conf_base_admin">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_conf_base_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_group_conf_base_readonly">
<field name="menu" ref="lims_config"/>
<field name="group" ref="group_lims_conf_base_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_group_conf_base_admin">
<field name="menu" ref="lims_config"/>
<field name="group" ref="group_lims_conf_base_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_base_group_conf_base_readonly">
<field name="menu" ref="lims_config_base"/>
<field name="group" ref="group_lims_conf_base_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_base_group_conf_base_admin">
<field name="menu" ref="lims_config_base"/>
<field name="group" ref="group_lims_conf_base_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_conf_base_tables_readonly">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_conf_base_tables_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_conf_base_tables_admin">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_group_conf_base_tables_readonly">
<field name="menu" ref="lims_config"/>
<field name="group" ref="group_lims_conf_base_tables_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_group_conf_base_tables_admin">
<field name="menu" ref="lims_config"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_laboratory_group_conf_base_tables_readonly">
<field name="menu" ref="lims_config_base_tables"/>
<field name="group" ref="group_lims_conf_base_tables_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_laboratory_group_conf_base_tables_admin">
<field name="menu" ref="lims_config_base_tables"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_group_conf_laboratory_readonly">
<field name="menu" ref="lims_config"/>
<field name="group" ref="group_lims_conf_laboratory_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_group_conf_laboratory_admin">
<field name="menu" ref="lims_config"/>
<field name="group" ref="group_lims_conf_laboratory_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_laboratory_group_conf_laboratory_readonly">
<field name="menu" ref="lims_config_laboratory"/>
<field name="group" ref="group_lims_conf_laboratory_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_laboratory_group_conf_laboratory_admin">
<field name="menu" ref="lims_config_laboratory"/>
<field name="group" ref="group_lims_conf_laboratory_admin"/>
</record>
</data>
</tryton>

View File

@ -1,169 +0,0 @@
<?xml version="1.0"?>
<tryton>
<data>
<!-- Menu items in lims_menu.xml -->
<!-- Configuration -->
<record model="ir.ui.view" id="lims_configuration_view">
<field name="model">lims.configuration</field>
<field name="type">form</field>
<field name="name">configuration_form</field>
</record>
<record model="ir.action.act_window" id="act_lims_configuration">
<field name="name">Configuration</field>
<field name="res_model">lims.configuration</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_configuration_view">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_configuration_view"/>
<field name="act_window" ref="act_lims_configuration"/>
</record>
<!-- Work Year -->
<record model="ir.ui.view" id="lims_workyear_view_form">
<field name="model">lims.lab.workyear</field>
<field name="type">form</field>
<field name="name">workyear_form</field>
</record>
<record model="ir.ui.view" id="lims_workyear_view_list">
<field name="model">lims.lab.workyear</field>
<field name="type">tree</field>
<field name="name">workyear_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_workyear_list">
<field name="name">Work Years</field>
<field name="res_model">lims.lab.workyear</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_workyear_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_workyear_view_list"/>
<field name="act_window" ref="act_lims_workyear_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_workyear_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_workyear_view_form"/>
<field name="act_window" ref="act_lims_workyear_list"/>
</record>
<!-- Laboratory Notebook View -->
<record model="ir.ui.view" id="lims_notebook_views_view_form">
<field name="model">lims.notebook.view</field>
<field name="type">form</field>
<field name="name">notebook_view_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_views_view_list">
<field name="model">lims.notebook.view</field>
<field name="type">tree</field>
<field name="name">notebook_view_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_notebook_views_list">
<field name="name">Laboratory Notebook Views</field>
<field name="res_model">lims.notebook.view</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_notebook_views_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_notebook_views_view_list"/>
<field name="act_window" ref="act_lims_notebook_views_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_notebook_views_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_notebook_views_view_form"/>
<field name="act_window" ref="act_lims_notebook_views_list"/>
</record>
<!-- Laboratory Notebook View Column -->
<record model="ir.ui.view" id="lims_notebook_view_column_view_form">
<field name="model">lims.notebook.view.column</field>
<field name="type">form</field>
<field name="name">notebook_view_column_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_view_column_view_list">
<field name="model">lims.notebook.view.column</field>
<field name="type">tree</field>
<field name="name">notebook_view_column_list</field>
</record>
<!-- User Role -->
<record model="ir.ui.view" id="lims_user_role_view_form">
<field name="model">lims.user.role</field>
<field name="type">form</field>
<field name="name">user_role_form</field>
</record>
<record model="ir.ui.view" id="lims_user_role_view_list">
<field name="model">lims.user.role</field>
<field name="type">tree</field>
<field name="name">user_role_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_user_role_list">
<field name="name">User Roles</field>
<field name="res_model">lims.user.role</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_user_role_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_user_role_view_list"/>
<field name="act_window" ref="act_lims_user_role_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_user_role_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_user_role_view_form"/>
<field name="act_window" ref="act_lims_user_role_list"/>
</record>
<!-- User -->
<record model="ir.ui.view" id="lims_user_view_form_preferences">
<field name="model">res.user</field>
<field name="inherit" ref="res.user_view_form_preferences"/>
<field name="name">user_form_preferences</field>
</record>
<record model="ir.ui.view" id="lims_user_view_form">
<field name="model">res.user</field>
<field name="inherit" ref="res.user_view_form"/>
<field name="name">user_form</field>
</record>
<record model="ir.ui.view" id="lims_user_view_list">
<field name="model">res.user</field>
<field name="inherit" ref="res.user_view_tree"/>
<field name="name">user_list</field>
</record>
<!-- Printer -->
<record model="ir.ui.view" id="lims_printer_view_form">
<field name="model">lims.printer</field>
<field name="type">form</field>
<field name="name">printer_form</field>
</record>
<record model="ir.ui.view" id="lims_printer_view_list">
<field name="model">lims.printer</field>
<field name="type">tree</field>
<field name="name">printer_list</field>
</record>
<record model="ir.action.act_window" id="act_printer_list">
<field name="name">Printers</field>
<field name="res_model">lims.printer</field>
</record>
<record model="ir.action.act_window.view" id="act_printer_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_printer_view_list"/>
<field name="act_window" ref="act_printer_list"/>
</record>
<record model="ir.action.act_window.view" id="act_printer_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_printer_view_form"/>
<field name="act_window" ref="act_printer_list"/>
</record>
</data>
</tryton>

1259
lims/control_tendency.py Normal file

File diff suppressed because it is too large Load Diff

391
lims/control_tendency.xml Normal file
View File

@ -0,0 +1,391 @@
<?xml version="1.0"?>
<tryton>
<data>
<record model="ir.ui.icon" id="laboratory_control_icon">
<field name="name">lims-laboratory_control</field>
<field name="path">icons/laboratory_control.svg</field>
</record>
<record model="ir.ui.icon" id="tendencies_icon">
<field name="name">lims-tendencies</field>
<field name="path">icons/tendencies.svg</field>
</record>
<record model="ir.ui.icon" id="concentration_level_icon">
<field name="name">lims-concentration_level</field>
<field name="path">icons/concentration_level.svg</field>
</record>
<record model="ir.ui.icon" id="control_means_deviations_calc_icon">
<field name="name">lims-control_means_deviations_calc</field>
<field name="path">icons/control_means_deviations_calc.svg</field>
</record>
<record model="ir.ui.icon" id="tendencies_analysis_icon">
<field name="name">lims-tendencies_analysis</field>
<field name="path">icons/tendencies_analysis.svg</field>
</record>
<!-- Origins -->
<record model="ir.ui.view" id="lims_range_type_view_form">
<field name="model">lims.range.type</field>
<field name="type">form</field>
<field name="name">range_type_form</field>
</record>
<record model="ir.ui.view" id="lims_range_type_view_list">
<field name="model">lims.range.type</field>
<field name="type">tree</field>
<field name="name">range_type_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_range_type_list">
<field name="name">Origins</field>
<field name="res_model">lims.range.type</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_range_type_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_range_type_view_list"/>
<field name="act_window" ref="act_lims_range_type_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_range_type_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_range_type_view_form"/>
<field name="act_window" ref="act_lims_range_type_list"/>
</record>
<!-- Range -->
<record model="ir.ui.view" id="lims_range_view_form">
<field name="model">lims.range</field>
<field name="type">form</field>
<field name="name">range_form</field>
</record>
<record model="ir.ui.view" id="lims_range_view_list">
<field name="model">lims.range</field>
<field name="type">tree</field>
<field name="name">range_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_range_list">
<field name="name">Ranges</field>
<field name="res_model">lims.range</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_range_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_range_view_list"/>
<field name="act_window" ref="act_lims_range_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_range_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_range_view_form"/>
<field name="act_window" ref="act_lims_range_list"/>
</record>
<!-- Tendency -->
<record model="ir.ui.view" id="lims_control_tendency_view_list">
<field name="model">lims.control.tendency</field>
<field name="type">tree</field>
<field name="name">control_tendency_list</field>
</record>
<record model="ir.ui.view" id="lims_control_tendency_view_form">
<field name="model">lims.control.tendency</field>
<field name="type">form</field>
<field name="name">control_tendency_form</field>
</record>
<record model="ir.action.act_window" id="act_lims_control_tendency">
<field name="name">Tendencies</field>
<field name="res_model">lims.control.tendency</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_control_tendency_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_control_tendency_view_list"/>
<field name="act_window" ref="act_lims_control_tendency"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_control_tendency_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_control_tendency_view_form"/>
<field name="act_window" ref="act_lims_control_tendency"/>
</record>
<!-- Tendency 2 -->
<record model="ir.ui.view" id="lims_control_tendency_view_form2">
<field name="model">lims.control.tendency</field>
<field name="type">form</field>
<field name="name">control_tendency_form2</field>
</record>
<record model="ir.action.act_window" id="act_lims_control_tendency2">
<field name="name">Tendencies</field>
<field name="res_model">lims.control.tendency</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_control_tendency2_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_control_tendency_view_list"/>
<field name="act_window" ref="act_lims_control_tendency2"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_control_tendency2_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_control_tendency_view_form2"/>
<field name="act_window" ref="act_lims_control_tendency2"/>
</record>
<!-- Tendency 3 -->
<record model="ir.ui.view" id="lims_control_tendency_view_list3">
<field name="model">lims.control.tendency</field>
<field name="type">tree</field>
<field name="name">control_tendency_list3</field>
</record>
<record model="ir.ui.view" id="lims_control_tendency_view_form3">
<field name="model">lims.control.tendency</field>
<field name="type">form</field>
<field name="name">control_tendency_form3</field>
</record>
<record model="ir.ui.view" id="lims_control_tendency_detail_view_list">
<field name="model">lims.control.tendency.detail</field>
<field name="type">tree</field>
<field name="name">control_tendency_detail_list</field>
</record>
<record model="ir.ui.view" id="lims_control_tendency_detail_view_form">
<field name="model">lims.control.tendency.detail</field>
<field name="type">form</field>
<field name="name">control_tendency_detail_form</field>
</record>
<record model="ir.action.act_window" id="act_lims_control_tendency3">
<field name="name">Tendencies Analysis</field>
<field name="res_model">lims.control.tendency</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_control_tendency3_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_control_tendency_view_list3"/>
<field name="act_window" ref="act_lims_control_tendency3"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_control_tendency3_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_control_tendency_view_form3"/>
<field name="act_window" ref="act_lims_control_tendency3"/>
</record>
<!-- Wizard Calculation of Means and Deviations -->
<record model="ir.ui.view" id="lims_control_means_deviations_calc_start_view_form">
<field name="model">lims.control.means_deviations_calc.start</field>
<field name="type">form</field>
<field name="name">control_means_deviations_calc_start_form</field>
</record>
<record model="ir.ui.view" id="lims_control_means_deviations_calc_empty_view_form">
<field name="model">lims.control.means_deviations_calc.empty</field>
<field name="type">form</field>
<field name="name">control_means_deviations_calc_empty_form</field>
</record>
<record model="ir.ui.view" id="lims_control_means_deviations_calc_result_view_form">
<field name="model">lims.control.means_deviations_calc.result</field>
<field name="type">form</field>
<field name="name">control_means_deviations_calc_result_form</field>
</record>
<record model="ir.ui.view" id="lims_control_result_line_view_list">
<field name="model">lims.control.result_line</field>
<field name="type">tree</field>
<field name="name">control_result_line_list</field>
</record>
<record model="ir.ui.view" id="lims_control_result_line_view_form">
<field name="model">lims.control.result_line</field>
<field name="type">form</field>
<field name="name">control_result_line_form</field>
</record>
<record model="ir.ui.view" id="lims_control_result_line_detail_view_list">
<field name="model">lims.control.result_line.detail</field>
<field name="type">tree</field>
<field name="name">control_result_line_detail_list</field>
</record>
<record model="ir.ui.view" id="lims_control_result_line_detail_view_form">
<field name="model">lims.control.result_line.detail</field>
<field name="type">form</field>
<field name="name">control_result_line_detail_form</field>
</record>
<record model="ir.ui.view" id="lims_control_means_deviations_calc_result2_view_form">
<field name="model">lims.control.means_deviations_calc.result2</field>
<field name="type">form</field>
<field name="name">control_means_deviations_calc_result2_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_control_means_deviations_calc">
<field name="name">Calculation of Means and Deviations</field>
<field name="wiz_name">lims.control.means_deviations_calc</field>
</record>
<record model="ir.model.field.access" id="access_means_deviations_calc_result_lines">
<field name="field"
search="[('name', '=', 'lines'), ('model.model', '=', 'lims.control.means_deviations_calc.result')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<!-- Wizard Tendencies Analysis -->
<record model="ir.ui.view" id="lims_control_tendencies_analysis_start_view_form">
<field name="model">lims.control.tendencies_analysis.start</field>
<field name="type">form</field>
<field name="name">control_tendencies_analysis_start_form</field>
</record>
<record model="ir.ui.view" id="lims_control_tendencies_analysis_result_view_form">
<field name="model">lims.control.tendencies_analysis.result</field>
<field name="type">form</field>
<field name="name">control_tendencies_analysis_result_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_control_tendencies_analysis">
<field name="name">Tendencies Analysis</field>
<field name="wiz_name">lims.control.tendencies_analysis</field>
</record>
<!-- Control Charts -->
<record model="ir.action.wizard" id="wiz_control_chart_print">
<field name="name">Control Chart</field>
<field name="wiz_name">lims.control_chart.print</field>
<field name="model">lims.control.tendency</field>
</record>
<record model="ir.action.report" id="report_control_chart">
<field name="name">Control Chart</field>
<field name="model">lims.control.tendency</field>
<field name="report_name">lims.control_chart.report</field>
<field name="report">lims/report/control_chart_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_control_chart_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.control.tendency,-1</field>
<field name="action" ref="wiz_control_chart_print"/>
</record>
<menuitem parent="lims_config_base_tables" action="act_lims_range_type_list"
id="lims_range_type_list_menu" sequence="80"/>
<menuitem parent="lims_config_base_tables" action="act_lims_range_list"
id="lims_range_list_menu" sequence="90"/>
<menuitem name="Control Charts" parent="lims_laboratory"
id="lims_laboratory_control" sequence="40"
icon="lims-laboratory_control"/>
<menuitem parent="lims_laboratory_control" action="act_lims_control_tendency"
id="lims_control_tendency_menu" sequence="10"
icon="lims-tendencies"/>
<menuitem parent="lims_laboratory_control" action="act_lims_concentration_level"
id="lims_concentration_level_menu" sequence="20"
icon="lims-concentration_level"/>
<menuitem parent="lims_laboratory_control" action="wiz_lims_control_means_deviations_calc"
id="lims_control_means_deviations_calc_menu" sequence="30"
icon="lims-control_means_deviations_calc"/>
<menuitem parent="lims_laboratory_control" action="wiz_lims_control_tendencies_analysis"
id="lims_control_tendencies_analysis_menu" sequence="40"
icon="lims-tendencies_analysis"/>
<record model="ir.model.access" id="access_range_type">
<field name="model" search="[('model', '=', 'lims.range.type')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_range_type_group_conf_base_tables_admin">
<field name="model" search="[('model', '=', 'lims.range.type')]"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_range">
<field name="model" search="[('model', '=', 'lims.range')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_range_group_conf_base_tables_admin">
<field name="model" search="[('model', '=', 'lims.range')]"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_control_tendency">
<field name="model" search="[('model', '=', 'lims.control.tendency')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_control_tendency_group_control">
<field name="model" search="[('model', '=', 'lims.control.tendency')]"/>
<field name="group" ref="group_lims_control"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_control_readonly">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_control_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_control">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_control"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_group_control_readonly">
<field name="menu" ref="lims_laboratory"/>
<field name="group" ref="group_lims_control_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_group_control">
<field name="menu" ref="lims_laboratory"/>
<field name="group" ref="group_lims_control"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_control_group_control_readonly">
<field name="menu" ref="lims_laboratory_control"/>
<field name="group" ref="group_lims_control_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_control_group_control">
<field name="menu" ref="lims_laboratory_control"/>
<field name="group" ref="group_lims_control"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_control_tendency_group_control_readonly">
<field name="menu" ref="lims_control_tendency_menu"/>
<field name="group" ref="group_lims_control_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_control_tendency_group_control">
<field name="menu" ref="lims_control_tendency_menu"/>
<field name="group" ref="group_lims_control"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_concentration_level_group_control_readonly">
<field name="menu" ref="lims_concentration_level_menu"/>
<field name="group" ref="group_lims_control_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_concentration_level_group_control">
<field name="menu" ref="lims_concentration_level_menu"/>
<field name="group" ref="group_lims_control"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_control_means_deviations_calc_group_control">
<field name="menu" ref="lims_control_means_deviations_calc_menu"/>
<field name="group" ref="group_lims_control"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_control_tendencies_analysis_group_control">
<field name="menu" ref="lims_control_tendencies_analysis_menu"/>
<field name="group" ref="group_lims_control"/>
</record>
</data>
</tryton>

View File

@ -1,69 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<tryton>
<data noupdate="1">
<!-- Sequences for Entry -->
<record model="ir.sequence.type" id="seq_type_entry">
<field name="name">Entry</field>
<field name="code">lims.entry</field>
</record>
<record model="ir.sequence.type-res.group"
id="seq_type_entry_group_admin">
<field name="sequence_type" ref="seq_type_entry"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.sequence.strict" id="seq_entry">
<field name="name">Entry</field>
<field name="code">lims.entry</field>
<field eval="7" name="padding"/>
</record>
<!-- Sequences for Sample -->
<record model="ir.sequence.type" id="seq_type_sample">
<field name="name">Sample</field>
<field name="code">lims.sample</field>
</record>
<record model="ir.sequence.type-res.group"
id="seq_type_sample_group_admin">
<field name="sequence_type" ref="seq_type_sample"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.sequence" id="seq_sample">
<field name="name">Sample</field>
<field name="code">lims.sample</field>
<field eval="7" name="padding"/>
</record>
<!-- Sequences for Service -->
<record model="ir.sequence.type" id="seq_type_service">
<field name="name">Service</field>
<field name="code">lims.service</field>
</record>
<record model="ir.sequence.type-res.group"
id="seq_type_service_group_admin">
<field name="sequence_type" ref="seq_type_service"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.sequence" id="seq_service">
<field name="name">Service</field>
<field name="code">lims.service</field>
<field eval="8" name="padding"/>
</record>
<!-- Sequences for Results Report -->
<record model="ir.sequence.type" id="seq_type_results_report">
<field name="name">Results Report</field>
<field name="code">lims.results_report</field>
</record>
<record model="ir.sequence.type-res.group"
id="seq_type_results_report_group_admin">
<field name="sequence_type" ref="seq_type_results_report"/>
<field name="group" ref="res.group_admin"/>
</record>
</data>
</tryton>

View File

@ -1,12 +1,11 @@
# -*- coding: utf-8 -*-
# This file is part of lims_department module for Tryton.
# This file is part of lims module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from trytond.model import ModelView, ModelSQL, fields
from trytond.pool import PoolMeta
__all__ = ['Department', 'User', 'UserDepartment']
__all__ = ['Department', 'UserDepartment']
class Department(ModelSQL, ModelView):
@ -19,13 +18,6 @@ class Department(ModelSQL, ModelView):
domain=[('type', '=', 'storage')])
class User:
__name__ = 'res.user'
__metaclass__ = PoolMeta
departments = fields.One2Many('user.department', 'user', 'Departments')
class UserDepartment(ModelSQL, ModelView):
'User Department'
__name__ = 'user.department'

View File

@ -2,7 +2,6 @@
<tryton>
<data>
<!-- Menu items in lims_menu.xml -->
<!-- Department -->
@ -32,6 +31,10 @@
<field name="act_window" ref="act_company_department_list"/>
</record>
<menuitem parent="party.menu_configuration"
action="act_company_department_list"
id="company_department_menu"/>
<!-- User Department -->
<record model="ir.ui.view" id="user_department_view_form">
@ -45,5 +48,30 @@
<field name="name">user_department_list</field>
</record>
<record model="ir.model.access" id="access_department">
<field name="model" search="[('model', '=', 'company.department')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_department_group_party_admin">
<field name="model" search="[('model', '=', 'company.department')]"/>
<field name="group" ref="party.group_party_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<!-- Access Rights on Menu -->
<!-- Other menu items -->
<record model="ir.ui.menu-res.group" id="menu_company_department_group_party_admin">
<field name="menu" ref="company_department_menu"/>
<field name="group" ref="party.group_party_admin"/>
</record>
</data>
</tryton>

1655
lims/entry.py Normal file

File diff suppressed because it is too large Load Diff

563
lims/entry.xml Normal file
View File

@ -0,0 +1,563 @@
<?xml version="1.0"?>
<tryton>
<data>
<record model="ir.ui.icon" id="entry_board_icon">
<field name="name">lims-entry_board</field>
<field name="path">icons/entry_board.svg</field>
</record>
<!-- Sequences for Entry -->
<record model="ir.sequence.type" id="seq_type_entry">
<field name="name">Entry</field>
<field name="code">lims.entry</field>
</record>
<record model="ir.sequence.type-res.group"
id="seq_type_entry_group_admin">
<field name="sequence_type" ref="seq_type_entry"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.sequence.strict" id="seq_entry">
<field name="name">Entry</field>
<field name="code">lims.entry</field>
<field eval="7" name="padding"/>
</record>
<!-- Entry -->
<record model="ir.ui.view" id="lims_entry_view_form">
<field name="model">lims.entry</field>
<field name="type">form</field>
<field name="name">entry_form</field>
</record>
<record model="ir.ui.view" id="lims_entry_view_list">
<field name="model">lims.entry</field>
<field name="type">tree</field>
<field name="name">entry_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_entry_list">
<field name="name">Entries</field>
<field name="res_model">lims.entry</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_entry_list_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_entry_view_list"/>
<field name="act_window" ref="act_lims_entry_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_entry_list_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_entry_view_form"/>
<field name="act_window" ref="act_lims_entry_list"/>
</record>
<record model="ir.action.act_window" id="act_lims_entry_form">
<field name="name">New Entry</field>
<field name="res_model">lims.entry</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_entry_form_view_form">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_entry_view_form"/>
<field name="act_window" ref="act_lims_entry_form"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_entry_form_view_list">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_entry_view_list"/>
<field name="act_window" ref="act_lims_entry_form"/>
</record>
<record model="ir.action.act_window.domain" id="act_lims_entry_list_domain_draft">
<field name="name">Draft</field>
<field name="sequence" eval="10"/>
<field name="domain"
eval="[('state', '=', 'draft')]"
pyson="1"/>
<field name="act_window" ref="act_lims_entry_list"/>
</record>
<record model="ir.action.act_window.domain" id="act_lims_entry_list_domain_ongoing">
<field name="name">Ongoing</field>
<field name="sequence" eval="20"/>
<field name="domain"
eval="[('state', '=', 'ongoing')]"
pyson="1"/>
<field name="act_window" ref="act_lims_entry_list"/>
</record>
<record model="ir.action.act_window.domain" id="act_lims_entry_list_domain_pending">
<field name="name">Administration pending</field>
<field name="sequence" eval="30"/>
<field name="domain"
eval="[('state', '=', 'pending')]"
pyson="1"/>
<field name="act_window" ref="act_lims_entry_list"/>
</record>
<record model="ir.action.act_window.domain" id="act_lims_entry_list_domain_all">
<field name="name">All</field>
<field name="sequence" eval="9999"/>
<field name="domain"></field>
<field name="act_window" ref="act_lims_entry_list"/>
</record>
<record model="ir.model.button" id="entry_create_sample_button">
<field name="name">create_sample</field>
<field name="model" search="[('model', '=', 'lims.entry')]"/>
</record>
<record model="ir.model.button-res.group" id="entry_create_sample_button_group_lims_entry">
<field name="button" ref="entry_create_sample_button"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.model.button" id="entry_confirm_button">
<field name="name">confirm</field>
<field name="model" search="[('model', '=', 'lims.entry')]"/>
</record>
<record model="ir.model.button-res.group" id="entry_confirm_button_group_lims_entry">
<field name="button" ref="entry_confirm_button"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.model.button" id="entry_on_hold_button">
<field name="name">on_hold</field>
<field name="model" search="[('model', '=', 'lims.entry')]"/>
</record>
<record model="ir.model.button-res.group" id="entry_on_hold_button_group_lims_entry">
<field name="button" ref="entry_on_hold_button"/>
<field name="group" ref="group_lims_entry"/>
</record>
<!-- Entry Invoice Contact -->
<record model="ir.ui.view" id="lims_entry_invoice_contacts_view_form">
<field name="model">lims.entry.invoice_contacts</field>
<field name="type">form</field>
<field name="name">entry_invoice_contacts_form</field>
</record>
<record model="ir.ui.view" id="lims_entry_invoice_contacts_view_list">
<field name="model">lims.entry.invoice_contacts</field>
<field name="type">tree</field>
<field name="name">entry_invoice_contacts_list</field>
</record>
<!-- Entry Report Contact -->
<record model="ir.ui.view" id="lims_entry_report_contacts_view_form">
<field name="model">lims.entry.report_contacts</field>
<field name="type">form</field>
<field name="name">entry_report_contacts_form</field>
</record>
<record model="ir.ui.view" id="lims_entry_report_contacts_view_list">
<field name="model">lims.entry.report_contacts</field>
<field name="type">tree</field>
<field name="name">entry_report_contacts_list</field>
</record>
<!-- Entry Acknowledgment Contact -->
<record model="ir.ui.view" id="lims_entry_acknowledgment_contacts_view_form">
<field name="model">lims.entry.acknowledgment_contacts</field>
<field name="type">form</field>
<field name="name">entry_acknowledgment_contacts_form</field>
</record>
<record model="ir.ui.view" id="lims_entry_acknowledgment_contacts_view_list">
<field name="model">lims.entry.acknowledgment_contacts</field>
<field name="type">tree</field>
<field name="name">entry_acknowledgment_contacts_list</field>
</record>
<!-- Entry Suspension Reason -->
<record model="ir.ui.view" id="lims_entry_suspension_reason_view_form">
<field name="model">lims.entry.suspension.reason</field>
<field name="type">form</field>
<field name="name">entry_suspension_reason_form</field>
</record>
<record model="ir.ui.view" id="lims_entry_suspension_reason_view_list">
<field name="model">lims.entry.suspension.reason</field>
<field name="type">tree</field>
<field name="name">entry_suspension_reason_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_entry_suspension_reason_list">
<field name="name">Entry Suspension Reasons</field>
<field name="res_model">lims.entry.suspension.reason</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_entry_suspension_reason_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_entry_suspension_reason_view_list"/>
<field name="act_window" ref="act_lims_entry_suspension_reason_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_entry_suspension_reason_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_entry_suspension_reason_view_form"/>
<field name="act_window" ref="act_lims_entry_suspension_reason_list"/>
</record>
<!-- Entry Detail Analysis -->
<record model="ir.ui.view" id="lims_entry_detail_analysis_view_form">
<field name="model">lims.entry.detail.analysis</field>
<field name="type">form</field>
<field name="name">entry_detail_analysis_form</field>
</record>
<record model="ir.ui.view" id="lims_entry_detail_analysis_view_list">
<field name="model">lims.entry.detail.analysis</field>
<field name="type">tree</field>
<field name="name">entry_detail_analysis_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_entry_detail_analysis_list">
<field name="name">Entry Detail Analysis</field>
<field name="res_model">lims.entry.detail.analysis</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_entry_detail_analysis_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_entry_detail_analysis_view_list"/>
<field name="act_window" ref="act_lims_entry_detail_analysis_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_entry_detail_analysis_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_entry_detail_analysis_view_form"/>
<field name="act_window" ref="act_lims_entry_detail_analysis_list"/>
</record>
<record model="ir.rule.group" id="rule_group_entry_detail_analysis">
<field name="model" search="[('model', '=', 'lims.entry.detail.analysis')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_entry_detail_analysis">
<field name="domain"
eval="[If(Bool(Eval('user', {}).get('laboratory', False)), ('laboratory', '=', Eval('user', {}).get('laboratory', None)), If(Bool(Eval('user', {}).get('laboratories', False)), ('laboratory', 'in', Eval('user', {}).get('laboratories', [])), ('id', '!=', 0)))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_entry_detail_analysis"/>
</record>
<!-- Entry actions related -->
<record model="ir.action.act_window" id="act_lims_sample_related1">
<field name="name">1. Samples</field>
<field name="res_model">lims.sample</field>
<field name="domain" eval="[('entry', 'in', Eval('active_ids'))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_sample_keyword1">
<field name="keyword">form_relate</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="act_lims_sample_related1"/>
</record>
<record model="ir.action.act_window" id="act_lims_fraction_related1">
<field name="name">2. Fractions</field>
<field name="res_model">lims.fraction</field>
<field name="domain" eval="[('entry', 'in', Eval('active_ids'))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_fraction_keyword1">
<field name="keyword">form_relate</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="act_lims_fraction_related1"/>
</record>
<record model="ir.action.act_window" id="act_lims_service_related1">
<field name="name">3. Services</field>
<field name="res_model">lims.service</field>
<field name="domain" eval="[('entry', 'in', Eval('active_ids'))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_service_keyword1">
<field name="keyword">form_relate</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="act_lims_service_related1"/>
</record>
<record model="ir.action.act_window" id="act_lims_entry_detail_analysis_related1">
<field name="name">4. Entry Detail Analysis</field>
<field name="res_model">lims.entry.detail.analysis</field>
<field name="domain" eval="[('entry', 'in', Eval('active_ids'))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_entry_detail_analysis_keyword1">
<field name="keyword">form_relate</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="act_lims_entry_detail_analysis_related1"/>
</record>
<!-- Cron -->
<record model="ir.cron" id="cron_lims_acknowledgment_of_receipt">
<field name="name">Lims Acknowledgment of Receipt (Samples)</field>
<field name="request_user" ref="res.user_admin"/>
<field name="user" ref="user_acknowledgment_of_receipt"/>
<field name="active" eval="True"/>
<field name="interval_number" eval="20"/>
<field name="interval_type">minutes</field>
<field name="number_calls" eval="-1"/>
<field name="repeat_missed" eval="False"/>
<field name="model">lims.entry</field>
<field name="function">cron_acknowledgment_of_receipt</field>
</record>
<record model="ir.cron" id="cron_lims_confirm_waiting_entries">
<field name="name">Lims Confirm Waiting Entries</field>
<field name="request_user" ref="res.user_admin"/>
<field name="user" ref="user_entry_confirm"/>
<field name="active" eval="True"/>
<field name="interval_number" eval="1"/>
<field name="interval_type">minutes</field>
<field name="number_calls" eval="-1"/>
<field name="repeat_missed" eval="False"/>
<field name="model">lims.fraction</field>
<field name="function">confirm_waiting_fractions</field>
</record>
<!-- Wizard Forward Acknowledgment of Samples Receipt -->
<record model="ir.action.wizard" id="wiz_lims_forward_entry_acknowledgment">
<field name="name">Forward Acknowledgment of Samples Receipt</field>
<field name="wiz_name">lims.entry.acknowledgment.forward</field>
</record>
<record model="ir.action.keyword" id="lims_forward_entry_acknowledgment_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="wiz_lims_forward_entry_acknowledgment"/>
</record>
<!-- Wizard Change Invoice Party -->
<record model="ir.ui.view" id="lims_change_invoice_party_start_view_form">
<field name="model">lims.entry.change_invoice_party.start</field>
<field name="type">form</field>
<field name="name">entry_change_invoice_party_start_form</field>
</record>
<record model="ir.ui.view" id="lims_change_invoice_party_error_view_form">
<field name="model">lims.entry.change_invoice_party.error</field>
<field name="type">form</field>
<field name="name">entry_change_invoice_party_error_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_change_invoice_party">
<field name="name">Change Invoice Party</field>
<field name="wiz_name">lims.entry.change_invoice_party</field>
</record>
<record model="ir.action.keyword" id="lims_change_invoice_party_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="wiz_lims_change_invoice_party"/>
</record>
<!-- Acknowledgment of Samples Receipt -->
<record model="ir.action.wizard" id="print_entry_acknowledgment">
<field name="name">Acknowledgment of Samples Receipt</field>
<field name="wiz_name">lims.entry.acknowledgment.print</field>
<field name="model">lims.entry</field>
</record>
<record model="ir.action.report" id="report_entry_acknowledgment">
<field name="name">Acknowledgment of Samples Receipt</field>
<field name="model">lims.entry</field>
<field name="report_name">lims.entry.acknowledgment.report</field>
<field name="report">lims/report/entry_acknowledgment_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_entry_acknowledgment_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="print_entry_acknowledgment"/>
</record>
<!-- Entry Detail -->
<record model="ir.action.report" id="report_entry_detail">
<field name="name">Entry Detail</field>
<field name="model">lims.entry</field>
<field name="report_name">lims.entry.detail.report</field>
<field name="report">lims/report/entry_detail_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_entry_detail_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="report_entry_detail"/>
</record>
<!-- Entry Labels -->
<record model="ir.action.report" id="report_entry_labels">
<field name="name">Entry Labels</field>
<field name="model">lims.entry</field>
<field name="report_name">lims.entry.labels.report</field>
<field name="report">lims/report/entry_labels_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_entry_labels_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="report_entry_labels"/>
</record>
<!-- Entry Labels Printer -->
<record model="ir.action.wizard" id="wiz_report_entry_labels_printer">
<field name="name">Entry Labels Printer</field>
<field name="wiz_name">lims.entry.labels.printer.report</field>
<field name="model">lims.entry</field>
</record>
<record model="ir.action.keyword"
id="wiz_report_entry_labels_printer_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="wiz_report_entry_labels_printer"/>
</record>
<!-- Configuration / Entry -->
<menuitem name="Entry" parent="lims_config"
id="lims_config_entry" sequence="30"/>
<menuitem parent="lims_config_entry" action="act_lims_entry_suspension_reason_list"
id="lims_entry_suspension_reason_menu" sequence="50"/>
<menuitem parent="lims_menu" name="Entries Board"
id="lims_entry_board_menu" sequence="30" icon="lims-entry_board"/>
<!-- <menuitem parent="lims_entry_board_menu" action="wiz_lims_create_entry"
id="lims_create_entry_menu" sequence="5"/>-->
<menuitem parent="lims_entry_board_menu" action="act_lims_entry_form"
id="lims_entry_form_menu" sequence="10" icon="tryton-new"/>
<menuitem parent="lims_entry_board_menu" action="act_lims_entry_list"
id="lims_entry_menu" sequence="20" icon="tryton-list"/>
<record model="ir.model.access" id="access_entry_suspension_reason">
<field name="model" search="[('model', '=', 'lims.entry.suspension.reason')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_entry_suspension_reason_group_conf_entry_admin">
<field name="model" search="[('model', '=', 'lims.entry.suspension.reason')]"/>
<field name="group" ref="group_lims_conf_entry_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_entry">
<field name="model" search="[('model', '=', 'lims.entry')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_entry_group_entry">
<field name="model" search="[('model', '=', 'lims.entry')]"/>
<field name="group" ref="group_lims_entry"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_entry_detail_analysis">
<field name="model" search="[('model', '=', 'lims.entry.detail.analysis')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_entry_detail_analysis_group_entry_update">
<field name="model" search="[('model', '=', 'lims.entry.detail.analysis')]"/>
<field name="group" ref="group_lims_entry_update"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_entry_detail_analysis_group_entry">
<field name="model" search="[('model', '=', 'lims.entry.detail.analysis')]"/>
<field name="group" ref="group_lims_entry"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_entry_detail_analysis_group_laboratory_results_acceptance">
<field name="model" search="[('model', '=', 'lims.entry.detail.analysis')]"/>
<field name="group" ref="group_lims_laboratory_results_acceptance"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_entry_detail_analysis_group_laboratory_reports">
<field name="model" search="[('model', '=', 'lims.entry.detail.analysis')]"/>
<field name="group" ref="group_lims_laboratory_reports"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_conf_entry_readonly">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_conf_entry_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_conf_entry_admin">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_conf_entry_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_group_conf_entry_readonly">
<field name="menu" ref="lims_config"/>
<field name="group" ref="group_lims_conf_entry_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_group_conf_entry_admin">
<field name="menu" ref="lims_config"/>
<field name="group" ref="group_lims_conf_entry_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_entry_group_conf_entry_readonly">
<field name="menu" ref="lims_config_entry"/>
<field name="group" ref="group_lims_conf_entry_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_config_entry_group_conf_entry_admin">
<field name="menu" ref="lims_config_entry"/>
<field name="group" ref="group_lims_conf_entry_admin"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_entry_readonly">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_entry_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_entry_update">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_entry_update"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_entry">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_entry_board_group_entry_readonly">
<field name="menu" ref="lims_entry_board_menu"/>
<field name="group" ref="group_lims_entry_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_entry_board_group_entry_update">
<field name="menu" ref="lims_entry_board_menu"/>
<field name="group" ref="group_lims_entry_update"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_entry_board_group_entry">
<field name="menu" ref="lims_entry_board_menu"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_entry_form_group_entry">
<field name="menu" ref="lims_entry_form_menu"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_entry_group_entry_readonly">
<field name="menu" ref="lims_entry_menu"/>
<field name="group" ref="group_lims_entry_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_entry_group_entry_update">
<field name="menu" ref="lims_entry_menu"/>
<field name="group" ref="group_lims_entry_update"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_entry_group_entry">
<field name="menu" ref="lims_entry_menu"/>
<field name="group" ref="group_lims_entry"/>
</record>
</data>
</tryton>

64
lims/icons/blue.svg Normal file
View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256px"
height="256px"
viewBox="0 0 256 256"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.2pre0 (973e216, 2017-07-25)"
sodipodi:docname="blue.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="128"
inkscape:cy="128"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1364"
inkscape:window-height="688"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs3699" />
<metadata
id="metadata3702">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Capa 1">
<rect
style="fill:#0000ff"
id="rect3715"
width="287"
height="276"
x="-4"
y="-2" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

64
lims/icons/green.svg Normal file
View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256px"
height="256px"
viewBox="0 0 256 256"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.2pre0 (973e216, 2017-07-25)"
sodipodi:docname="green.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="128"
inkscape:cy="128"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1364"
inkscape:window-height="688"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs3699" />
<metadata
id="metadata3702">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Capa 1">
<rect
style="fill:#008000"
id="rect3715"
width="287"
height="276"
x="-4"
y="-2" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

64
lims/icons/red.svg Normal file
View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256px"
height="256px"
viewBox="0 0 256 256"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.2pre0 (973e216, 2017-07-25)"
sodipodi:docname="red.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="128"
inkscape:cy="128"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1364"
inkscape:window-height="688"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs3699" />
<metadata
id="metadata3702">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Capa 1">
<rect
style="fill:#ff0000"
id="rect3715"
width="287"
height="276"
x="-4"
y="-2" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

64
lims/icons/yellow.svg Normal file
View File

@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="256px"
height="256px"
viewBox="0 0 256 256"
version="1.1"
id="SVGRoot"
inkscape:version="0.92.2pre0 (973e216, 2017-07-25)"
sodipodi:docname="yellow.svg">
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="128"
inkscape:cy="128"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="1364"
inkscape:window-height="688"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1"
inkscape:grid-bbox="true" />
<defs
id="defs3699" />
<metadata
id="metadata3702">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:groupmode="layer"
inkscape:label="Capa 1">
<rect
style="fill:#ffff00"
id="rect3715"
width="287"
height="276"
x="-4"
y="-2" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

324
lims/laboratory.py Normal file
View File

@ -0,0 +1,324 @@
# -*- coding: utf-8 -*-
# This file is part of lims module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from trytond.model import ModelView, ModelSQL, fields, Unique
from trytond.pool import Pool
from trytond.transaction import Transaction
__all__ = ['LaboratoryProfessional', 'Laboratory', 'LaboratoryCVCorrection',
'LabMethod', 'LabDeviceType', 'LabDevice', 'LabDeviceLaboratory',
'LabDeviceTypeLabMethod', ]
class Laboratory(ModelSQL, ModelView):
'Laboratory'
__name__ = 'lims.laboratory'
_rec_name = 'description'
code = fields.Char('Code', required=True)
description = fields.Char('Description', required=True)
default_laboratory_professional = fields.Many2One(
'lims.laboratory.professional', 'Default professional')
default_signer = fields.Many2One('lims.laboratory.professional',
'Default signer', required=True)
related_location = fields.Many2One('stock.location', 'Related location',
required=True, domain=[('type', '=', 'storage')])
cv_corrections = fields.One2Many('lims.laboratory.cv_correction',
'laboratory', 'CV Corrections',
help="Corrections for Coefficients of Variation (Control Charts)")
section = fields.Selection([
('amb', 'Ambient'),
('for', 'Formulated'),
('mi', 'Microbiology'),
('rp', 'Agrochemical Residues'),
('sq', 'Chemistry'),
], 'Section', sort=False)
headquarters = fields.Char('Headquarters', translate=True)
@classmethod
def __setup__(cls):
super(Laboratory, cls).__setup__()
t = cls.__table__()
cls._sql_constraints += [
('code_uniq', Unique(t, t.code),
'Laboratory code must be unique'),
]
def get_rec_name(self, name):
if self.code:
return self.code + ' - ' + self.description
else:
return self.description
@classmethod
def search_rec_name(cls, name, clause):
field = None
for field in ('code', 'description'):
records = cls.search([(field,) + tuple(clause[1:])], limit=1)
if records:
break
if records:
return [(field,) + tuple(clause[1:])]
return [(cls._rec_name,) + tuple(clause[1:])]
class LaboratoryCVCorrection(ModelSQL, ModelView):
'CV Correction'
__name__ = 'lims.laboratory.cv_correction'
laboratory = fields.Many2One('lims.laboratory', 'Laboratory',
required=True, ondelete='CASCADE', select=True)
fraction_type = fields.Many2One('lims.fraction.type', 'Fraction type',
required=True)
min_cv = fields.Float('Minimum CV (%)')
max_cv = fields.Float('Maximum CV (%)')
min_cv_corr_fact = fields.Float('Correction factor for Minimum CV',
help="Correction factor for CV between Min and Max")
max_cv_corr_fact = fields.Float('Correction factor for Maximum CV',
help="Correction factor for CV greater than Max")
class LaboratoryProfessional(ModelSQL, ModelView):
'Laboratory Professional'
__name__ = 'lims.laboratory.professional'
party = fields.Many2One('party.party', 'Party', required=True,
domain=[('is_lab_professional', '=', True)])
code = fields.Char('Code')
role = fields.Char('Signature role', translate=True)
signature = fields.Binary('Signature')
methods = fields.One2Many('lims.lab.professional.method', 'professional',
'Methods')
@classmethod
def __setup__(cls):
super(LaboratoryProfessional, cls).__setup__()
t = cls.__table__()
cls._sql_constraints += [
('code_uniq', Unique(t, t.code),
'Professional code must be unique'),
('party_uniq', Unique(t, t.party),
'The party is already associated to a professional'),
]
def get_rec_name(self, name):
if self.party:
return self.party.name
@classmethod
def search_rec_name(cls, name, clause):
return [('party',) + tuple(clause[1:])]
@classmethod
def get_lab_professional(cls):
cursor = Transaction().connection.cursor()
login_user_id = Transaction().user
cursor.execute('SELECT id '
'FROM party_party '
'WHERE is_lab_professional = true '
'AND lims_user = %s '
'LIMIT 1', (login_user_id,))
party_id = cursor.fetchone()
if not party_id:
return None
cursor.execute('SELECT id '
'FROM "' + cls._table + '" '
'WHERE party = %s '
'LIMIT 1', (party_id[0],))
lab_professional_id = cursor.fetchone()
if (lab_professional_id):
return lab_professional_id[0]
return None
class LabMethod(ModelSQL, ModelView):
'Laboratory Method'
__name__ = 'lims.lab.method'
code = fields.Char('Code', required=True)
name = fields.Char('Name', required=True, translate=True)
reference = fields.Char('Reference')
determination = fields.Char('Determination', required=True)
requalification_months = fields.Integer('Requalification months',
required=True)
supervised_requalification = fields.Boolean('Supervised requalification')
deprecated_since = fields.Date('Deprecated since')
pnt = fields.Char('PNT')
results_estimated_waiting = fields.Integer(
'Estimated number of days for results')
@classmethod
def __setup__(cls):
super(LabMethod, cls).__setup__()
t = cls.__table__()
cls._sql_constraints += [
('code_uniq', Unique(t, t.code),
'Method code must be unique'),
]
def get_rec_name(self, name):
if self.code:
return self.code + ' - ' + self.name
else:
return self.name
@classmethod
def search_rec_name(cls, name, clause):
field = None
for field in ('code', 'name'):
records = cls.search([(field,) + tuple(clause[1:])], limit=1)
if records:
break
if records:
return [(field,) + tuple(clause[1:])]
return [(cls._rec_name,) + tuple(clause[1:])]
@classmethod
def write(cls, *args):
super(LabMethod, cls).write(*args)
actions = iter(args)
for methods, vals in zip(actions, actions):
if 'results_estimated_waiting' in vals:
cls.update_laboratory_notebook(methods)
@classmethod
def update_laboratory_notebook(cls, methods):
LimsNotebookLine = Pool().get('lims.notebook.line')
for method in methods:
notebook_lines = LimsNotebookLine.search([
('method', '=', method.id),
('accepted', '=', False),
])
if notebook_lines:
LimsNotebookLine.write(notebook_lines, {
'results_estimated_waiting': (
method.results_estimated_waiting),
})
class LabDevice(ModelSQL, ModelView):
'Laboratory Device'
__name__ = 'lims.lab.device'
_rec_name = 'description'
code = fields.Char('Code', required=True)
description = fields.Char('Description', required=True)
device_type = fields.Many2One('lims.lab.device.type', 'Device type',
required=True)
laboratories = fields.One2Many('lims.lab.device.laboratory', 'device',
'Laboratories', required=True)
serial_number = fields.Char('Serial number')
@classmethod
def __setup__(cls):
super(LabDevice, cls).__setup__()
t = cls.__table__()
cls._sql_constraints += [
('code_uniq', Unique(t, t.code),
'Device code must be unique'),
]
def get_rec_name(self, name):
if self.code:
return self.code + ' - ' + self.description
else:
return self.description
@classmethod
def search_rec_name(cls, name, clause):
field = None
for field in ('code', 'description'):
records = cls.search([(field,) + tuple(clause[1:])], limit=1)
if records:
break
if records:
return [(field,) + tuple(clause[1:])]
return [(cls._rec_name,) + tuple(clause[1:])]
class LabDeviceType(ModelSQL, ModelView):
'Laboratory Device Type'
__name__ = 'lims.lab.device.type'
_rec_name = 'description'
code = fields.Char('Code', required=True)
description = fields.Char('Description', required=True)
methods = fields.Many2Many('lims.lab.device.type-lab.method',
'device_type', 'method', 'Methods')
@classmethod
def __setup__(cls):
super(LabDeviceType, cls).__setup__()
t = cls.__table__()
cls._sql_constraints += [
('code_uniq', Unique(t, t.code),
'Device type code must be unique'),
]
def get_rec_name(self, name):
if self.code:
return self.code + ' - ' + self.description
else:
return self.description
@classmethod
def search_rec_name(cls, name, clause):
field = None
for field in ('code', 'description'):
records = cls.search([(field,) + tuple(clause[1:])], limit=1)
if records:
break
if records:
return [(field,) + tuple(clause[1:])]
return [(cls._rec_name,) + tuple(clause[1:])]
class LabDeviceTypeLabMethod(ModelSQL):
'Laboratory Device Type - Laboratory Method'
__name__ = 'lims.lab.device.type-lab.method'
device_type = fields.Many2One('lims.lab.device.type', 'Device type',
ondelete='CASCADE', select=True, required=True)
method = fields.Many2One('lims.lab.method', 'Method',
ondelete='CASCADE', select=True, required=True)
class LabDeviceLaboratory(ModelSQL, ModelView):
'Laboratory Device Laboratory'
__name__ = 'lims.lab.device.laboratory'
device = fields.Many2One('lims.lab.device', 'Device', required=True,
ondelete='CASCADE', select=True)
laboratory = fields.Many2One('lims.laboratory', 'Laboratory',
required=True)
physically_here = fields.Boolean('Physically here')
@classmethod
def __setup__(cls):
super(LabDeviceLaboratory, cls).__setup__()
cls._error_messages.update({
'physically_elsewhere': ('This Device is physically in another'
' Laboratory'),
})
@staticmethod
def default_physically_here():
return True
@classmethod
def validate(cls, laboratories):
super(LabDeviceLaboratory, cls).validate(laboratories)
for l in laboratories:
l.check_location()
def check_location(self):
if self.physically_here:
laboratories = self.search([
('device', '=', self.device.id),
('physically_here', '=', True),
('id', '!=', self.id),
])
if laboratories:
self.raise_user_error('physically_elsewhere')

306
lims/laboratory.xml Normal file
View File

@ -0,0 +1,306 @@
<?xml version="1.0"?>
<tryton>
<data>
<record model="ir.ui.icon" id="lab_icon">
<field name="name">lims-lab</field>
<field name="path">icons/lab_icon.svg</field>
</record>
<record model="ir.ui.icon" id="laboratory_icon">
<field name="name">lims-laboratory</field>
<field name="path">icons/laboratory.svg</field>
</record>
<record model="ir.ui.icon" id="yellow_icon">
<field name="name">lims-yellow</field>
<field name="path">icons/yellow.svg</field>
</record>
<record model="ir.ui.icon" id="red_icon">
<field name="name">lims-red</field>
<field name="path">icons/red.svg</field>
</record>
<record model="ir.ui.icon" id="blue_icon">
<field name="name">lims-blue</field>
<field name="path">icons/blue.svg</field>
</record>
<record model="ir.ui.icon" id="green_icon">
<field name="name">lims-green</field>
<field name="path">icons/green.svg</field>
</record>
<menuitem name="LIMS"
id="lims_menu" icon="lims-lab"/>
<!-- Laboratory -->
<record model="ir.ui.view" id="lims_laboratory_view_form">
<field name="model">lims.laboratory</field>
<field name="type">form</field>
<field name="name">laboratory_form</field>
</record>
<record model="ir.ui.view" id="lims_laboratory_view_list">
<field name="model">lims.laboratory</field>
<field name="type">tree</field>
<field name="name">laboratory_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_laboratory_list">
<field name="name">Laboratories</field>
<field name="res_model">lims.laboratory</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_laboratory_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_laboratory_view_list"/>
<field name="act_window" ref="act_lims_laboratory_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_laboratory_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_laboratory_view_form"/>
<field name="act_window" ref="act_lims_laboratory_list"/>
</record>
<record model="ir.rule.group" id="rule_group_laboratory">
<field name="model" search="[('model', '=', 'lims.laboratory')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_laboratory">
<field name="domain"
eval="[If(Bool(Eval('user', {}).get('laboratories', False)), ('id', 'in', Eval('user', {}).get('laboratories', [])), ('id', '!=', 0))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_laboratory"/>
</record>
<!-- Laboratory CV Correction -->
<record model="ir.ui.view" id="lims_laboratory_cv_correction_view_form">
<field name="model">lims.laboratory.cv_correction</field>
<field name="type">form</field>
<field name="name">laboratory_cv_correction_form</field>
</record>
<record model="ir.ui.view" id="lims_laboratory_cv_correction_view_list">
<field name="model">lims.laboratory.cv_correction</field>
<field name="type">tree</field>
<field name="name">laboratory_cv_correction_list</field>
</record>
<!-- Laboratory Professional -->
<record model="ir.ui.view" id="lims_laboratory_professional_view_form">
<field name="model">lims.laboratory.professional</field>
<field name="type">form</field>
<field name="name">laboratory_professional_form</field>
</record>
<record model="ir.ui.view" id="lims_laboratory_professional_view_list">
<field name="model">lims.laboratory.professional</field>
<field name="type">tree</field>
<field name="name">laboratory_professional_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_laboratory_professional_list">
<field name="name">Laboratory Professionals</field>
<field name="res_model">lims.laboratory.professional</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_laboratory_professional_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_laboratory_professional_view_list"/>
<field name="act_window" ref="act_lims_laboratory_professional_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_laboratory_professional_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_laboratory_professional_view_form"/>
<field name="act_window" ref="act_lims_laboratory_professional_list"/>
</record>
<!-- Laboratory Method -->
<record model="ir.ui.view" id="lims_lab_method_view_form">
<field name="model">lims.lab.method</field>
<field name="type">form</field>
<field name="name">lab_method_form</field>
</record>
<record model="ir.ui.view" id="lims_lab_method_view_list">
<field name="model">lims.lab.method</field>
<field name="type">tree</field>
<field name="name">lab_method_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_lab_method_list">
<field name="name">Methods</field>
<field name="res_model">lims.lab.method</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_lab_method_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_lab_method_view_list"/>
<field name="act_window" ref="act_lims_lab_method_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_lab_method_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_lab_method_view_form"/>
<field name="act_window" ref="act_lims_lab_method_list"/>
</record>
<!-- Laboratory Device -->
<record model="ir.ui.view" id="lims_lab_device_view_form">
<field name="model">lims.lab.device</field>
<field name="type">form</field>
<field name="name">lab_device_form</field>
</record>
<record model="ir.ui.view" id="lims_lab_device_view_list">
<field name="model">lims.lab.device</field>
<field name="type">tree</field>
<field name="name">lab_device_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_lab_device_list">
<field name="name">Devices</field>
<field name="res_model">lims.lab.device</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_lab_device_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_lab_device_view_list"/>
<field name="act_window" ref="act_lims_lab_device_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_lab_device_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_lab_device_view_form"/>
<field name="act_window" ref="act_lims_lab_device_list"/>
</record>
<!-- Laboratory Device Type -->
<record model="ir.ui.view" id="lims_lab_device_type_view_form">
<field name="model">lims.lab.device.type</field>
<field name="type">form</field>
<field name="name">lab_device_type_form</field>
</record>
<record model="ir.ui.view" id="lims_lab_device_type_view_list">
<field name="model">lims.lab.device.type</field>
<field name="type">tree</field>
<field name="name">lab_device_type_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_lab_device_type_list">
<field name="name">Device types</field>
<field name="res_model">lims.lab.device.type</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_lab_device_type_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_lab_device_type_view_list"/>
<field name="act_window" ref="act_lims_lab_device_type_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_lab_device_type_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_lab_device_type_view_form"/>
<field name="act_window" ref="act_lims_lab_device_type_list"/>
</record>
<!-- Laboratory Device Laboratory -->
<record model="ir.ui.view" id="lims_lab_device_laboratory_view_form">
<field name="model">lims.lab.device.laboratory</field>
<field name="type">form</field>
<field name="name">lab_device_laboratory_form</field>
</record>
<record model="ir.ui.view" id="lims_lab_device_laboratory_view_list">
<field name="model">lims.lab.device.laboratory</field>
<field name="type">tree</field>
<field name="name">lab_device_laboratory_list</field>
</record>
<!-- Configuration / Laboratory -->
<menuitem name="Laboratory" parent="lims_menu"
id="lims_laboratory" sequence="50"
icon="lims-laboratory"/>
<record model="ir.model.access" id="access_laboratory">
<field name="model" search="[('model', '=', 'lims.laboratory')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_laboratory_group_conf_laboratory_admin">
<field name="model" search="[('model', '=', 'lims.laboratory')]"/>
<field name="group" ref="group_lims_conf_laboratory_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_laboratory_professional">
<field name="model" search="[('model', '=', 'lims.laboratory.professional')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_laboratory_professional_group_conf_laboratory_admin">
<field name="model" search="[('model', '=', 'lims.laboratory.professional')]"/>
<field name="group" ref="group_lims_conf_laboratory_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_lab_device_type">
<field name="model" search="[('model', '=', 'lims.lab.device.type')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_lab_device_type_group_conf_laboratory_admin">
<field name="model" search="[('model', '=', 'lims.lab.device.type')]"/>
<field name="group" ref="group_lims_conf_laboratory_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_lab_device">
<field name="model" search="[('model', '=', 'lims.lab.device')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_lab_device_group_conf_laboratory_admin">
<field name="model" search="[('model', '=', 'lims.lab.device')]"/>
<field name="group" ref="group_lims_conf_laboratory_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_lab_method">
<field name="model" search="[('model', '=', 'lims.lab.method')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_lab_method_group_conf_base_tables_admin">
<field name="model" search="[('model', '=', 'lims.lab.method')]"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_conf_laboratory_readonly">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_conf_laboratory_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_conf_laboratory_admin">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_conf_laboratory_admin"/>
</record>
</data>
</tryton>

File diff suppressed because it is too large Load Diff

View File

@ -1,248 +0,0 @@
<?xml version="1.0"?>
<tryton>
<data>
<!-- Create the Lims icons -->
<record model="ir.ui.icon" id="lab_icon">
<field name="name">lims-lab</field>
<field name="path">icons/lab_icon.svg</field>
</record>
<record model="ir.ui.icon" id="configuration_icon">
<field name="name">lims-configuration</field>
<field name="path">icons/configuration.svg</field>
</record>
<record model="ir.ui.icon" id="entry_board_icon">
<field name="name">lims-entry_board</field>
<field name="path">icons/entry_board.svg</field>
</record>
<record model="ir.ui.icon" id="laboratory_icon">
<field name="name">lims-laboratory</field>
<field name="path">icons/laboratory.svg</field>
</record>
<record model="ir.ui.icon" id="notebook_icon">
<field name="name">lims-notebook</field>
<field name="path">icons/notebook.svg</field>
</record>
<record model="ir.ui.icon" id="notebook_line_all_menu_icon">
<field name="name">lims-notebook_line_all_menu</field>
<field name="path">icons/notebook_line_all_menu.svg</field>
</record>
<record model="ir.ui.icon" id="laboratory_results_icon">
<field name="name">lims-laboratory_results</field>
<field name="path">icons/laboratory_results.svg</field>
</record>
<record model="ir.ui.icon" id="notebook_load_results_manual_icon">
<field name="name">lims-notebook_load_results_manual</field>
<field name="path">icons/notebook_load_results_manual.svg</field>
</record>
<record model="ir.ui.icon" id="notebook_load_results_formula_icon">
<field name="name">lims-notebook_load_results_formula</field>
<field name="path">icons/notebook_load_results_formula.svg</field>
</record>
<record model="ir.ui.icon" id="laboratory_reports_icon">
<field name="name">lims-laboratory_reports</field>
<field name="path">icons/laboratory_reports.svg</field>
</record>
<record model="ir.ui.icon" id="generate_results_report_icon">
<field name="name">lims-generate_results_report</field>
<field name="path">icons/generate_results_report.svg</field>
</record>
<record model="ir.ui.icon" id="results_report_version_detail_icon">
<field name="name">lims-results_report_version_detail</field>
<field name="path">icons/results_report_version_detail.svg</field>
</record>
<record model="ir.ui.icon" id="laboratory_control_icon">
<field name="name">lims-laboratory_control</field>
<field name="path">icons/laboratory_control.svg</field>
</record>
<record model="ir.ui.icon" id="tendencies_icon">
<field name="name">lims-tendencies</field>
<field name="path">icons/tendencies.svg</field>
</record>
<record model="ir.ui.icon" id="concentration_level_icon">
<field name="name">lims-concentration_level</field>
<field name="path">icons/concentration_level.svg</field>
</record>
<record model="ir.ui.icon" id="control_means_deviations_calc_icon">
<field name="name">lims-control_means_deviations_calc</field>
<field name="path">icons/control_means_deviations_calc.svg</field>
</record>
<record model="ir.ui.icon" id="tendencies_analysis_icon">
<field name="name">lims-tendencies_analysis</field>
<field name="path">icons/tendencies_analysis.svg</field>
</record>
<!-- Menu -->
<menuitem name="LIMS"
id="lims_menu" icon="lims-lab"/>
<!-- Configuration -->
<menuitem name="Configuration" parent="lims_menu"
id="lims_config" sequence="10" icon="lims-configuration"/>
<!-- Configuration / Base -->
<menuitem name="Base" parent="lims_config"
id="lims_config_base" sequence="10"/>
<menuitem parent="lims_config_base" action="act_lims_configuration"
id="lims_configuration_menu" sequence="10"/>
<menuitem parent="lims_config_base" action="act_lims_workyear_list"
id="lims_workyear_menu" sequence="20"/>
<menuitem parent="lims_config_base" action="act_printer_list"
id="lims_printer_menu" sequence="30"/>
<!-- Configuration / Certification -->
<menuitem name="Certification" parent="lims_config"
id="lims_config_certification" sequence="20"/>
<menuitem parent="lims_config_certification" action="act_lims_certification_type_list"
id="lims_certification_type_list_menu" sequence="10"/>
<menuitem parent="lims_config_certification" action="act_lims_analysis_family_list"
id="lims_analysis_family_menu" sequence="20"/>
<menuitem parent="lims_config_certification" action="act_lims_technical_scope_list"
id="lims_technical_scope_menu" sequence="30"/>
<menuitem parent="lims_technical_scope_menu" action="act_lims_technical_scope_version_list"
id="lims_technical_scope_version_menu" sequence="10"/>
<!-- Configuration / Entry -->
<menuitem name="Entry" parent="lims_config"
id="lims_config_entry" sequence="30"/>
<menuitem parent="lims_config_entry" action="act_lims_packaging_type_list"
id="lims_packaging_type_menu" sequence="10"/>
<menuitem parent="lims_config_entry" action="act_lims_packaging_integrity_list"
id="lims_packaging_integrity_menu" sequence="20"/>
<menuitem parent="lims_config_entry" action="act_lims_variety_list"
id="lims_variety_menu" sequence="30"/>
<menuitem parent="lims_config_entry" action="act_lims_zone_list"
id="lims_zone_menu" sequence="40"/>
<menuitem parent="lims_config_entry" action="act_lims_entry_suspension_reason_list"
id="lims_entry_suspension_reason_menu" sequence="50"/>
<!-- Configuration / Laboratory -->
<menuitem name="Laboratory" parent="lims_config"
id="lims_config_laboratory" sequence="40"/>
<menuitem parent="lims_config_laboratory" action="act_lims_laboratory_list"
id="lims_laboratory_menu" sequence="10"/>
<menuitem parent="lims_config_laboratory" action="act_lims_laboratory_professional_list"
id="lims_laboratory_professional_menu" sequence="20"/>
<menuitem parent="lims_config_laboratory" action="act_lims_notebook_views_list"
id="lims_notebook_views_menu" sequence="30"/>
<menuitem parent="lims_config_laboratory" action="act_lims_lab_device_type_list"
id="lims_lab_device_type_menu" sequence="40"/>
<menuitem parent="lims_config_laboratory" action="act_lims_lab_device_list"
id="lims_lab_device_menu" sequence="50"/>
<!-- Configuration / Base Tables -->
<menuitem name="Base Tables" parent="lims_config"
id="lims_config_base_tables" sequence="70"/>
<menuitem parent="lims_config_base_tables" action="act_lims_product_type_list"
id="lims_product_type_menu" sequence="10"/>
<menuitem parent="lims_config_base_tables" action="act_lims_matrix_list"
id="lims_matrix_menu" sequence="20"/>
<menuitem parent="lims_config_base_tables" action="act_lims_lab_method_list"
id="lims_lab_method_menu" sequence="30"/>
<menuitem parent="lims_config_base_tables" action="act_lims_formula_list"
id="lims_formula_list_menu" sequence="40"/>
<menuitem parent="lims_config_base_tables" action="act_lims_analysis_list"
id="lims_analysis_menu" sequence="50"/>
<menuitem parent="lims_config_base_tables" action="act_lims_typification_list"
id="lims_typification_menu" sequence="60"/>
<menuitem parent="lims_typification_menu" action="act_lims_typification_calculated_readonly_list"
id="lims_typification_calculated_menu" sequence="10"/>
<menuitem parent="lims_config_base_tables" action="act_lims_fraction_type_list"
id="lims_fraction_type_menu" sequence="70"/>
<menuitem parent="lims_config_base_tables" action="act_lims_range_type_list"
id="lims_range_type_list_menu" sequence="80"/>
<menuitem parent="lims_config_base_tables" action="act_lims_range_list"
id="lims_range_list_menu" sequence="90"/>
<menuitem parent="lims_config_base_tables" action="act_lims_volume_conversion_list"
id="lims_volume_conversion_list_menu" sequence="100"/>
<menuitem parent="lims_config_base_tables" action="act_lims_uom_conversion_list"
id="lims_uom_conversion_list_menu" sequence="110"/>
<!-- Entries Board -->
<menuitem parent="lims_menu" name="Entries Board"
id="lims_entry_board_menu" sequence="30" icon="lims-entry_board"/>
<!-- <menuitem parent="lims_entry_board_menu" action="wiz_lims_create_entry"
id="lims_create_entry_menu" sequence="5"/>-->
<menuitem parent="lims_entry_board_menu" action="act_lims_entry_form"
id="lims_entry_form_menu" sequence="10" icon="tryton-new"/>
<menuitem parent="lims_entry_board_menu" action="act_lims_entry_list"
id="lims_entry_menu" sequence="20" icon="tryton-list"/>
<menuitem parent="lims_entry_board_menu" action="act_lims_sample_list"
id="lims_sample_menu" sequence="30"/>
<menuitem parent="lims_entry_board_menu" action="act_lims_fraction_list"
id="lims_fraction_menu" sequence="40"/>
<menuitem parent="lims_fraction_menu" action="wizard_fractions_by_locations"
id="lims_fractions_by_locations_menu" sequence="10"/>
<menuitem parent="lims_entry_board_menu" action="act_lims_service_list"
id="lims_service_menu" sequence="50"/>
<menuitem parent="lims_entry_board_menu" action="act_lims_entry_detail_analysis_list"
id="lims_entry_detail_analysis_menu" sequence="60"/>
<!-- Laboratory -->
<menuitem name="Laboratory" parent="lims_menu"
id="lims_laboratory" sequence="50"
icon="lims-laboratory"/>
<menuitem parent="lims_laboratory" action="act_lims_notebook_list"
id="lims_notebook_menu" sequence="15"
icon="lims-notebook"/>
<menuitem parent="lims_notebook_menu" action="act_lims_notebook_line_all_fields_list"
id="lims_notebook_line_all_menu" sequence="10"
icon="lims-notebook_line_all_menu"/>
<menuitem parent="lims_notebook_line_all_menu" action="wiz_print_analysis_pending_inform"
id="menu_print_analysis_pending_inform" sequence="100"
icon="tryton-print"/>
<menuitem parent="lims_notebook_line_all_menu" action="wiz_print_analysis_checked_pending_inform"
id="menu_print_analysis_checked_pending_inform" sequence="100"
icon="tryton-print"/>
<!-- Laboratory / Results entry -->
<menuitem name="Results entry" parent="lims_laboratory"
id="lims_laboratory_results" sequence="20"
icon="lims-laboratory_results"/>
<menuitem parent="lims_laboratory_results" action="wiz_lims_notebook_load_results_manual"
id="lims_notebook_load_results_manual_menu" sequence="10"
icon="lims-notebook_load_results_manual"/>
<menuitem parent="lims_laboratory_results" action="wiz_lims_notebook_load_results_formula"
id="lims_notebook_load_results_formula_menu" sequence="20"
icon="lims-notebook_load_results_formula"/>
<!-- Laboratory / Results reports -->
<menuitem name="Results reports" parent="lims_laboratory"
id="lims_laboratory_reports" sequence="30"
icon="lims-laboratory_reports"/>
<menuitem parent="lims_laboratory_reports" action="act_lims_results_report"
id="lims_results_report_menu" sequence="10"
icon="lims-laboratory_reports"/>
<menuitem parent="lims_laboratory_reports" action="wiz_lims_generate_results_report"
id="lims_generate_results_report_menu" sequence="20"
icon="lims-generate_results_report"/>
<menuitem parent="lims_laboratory_reports" action="act_lims_results_report_version_detail"
id="lims_results_report_version_detail_menu" sequence="30"
icon="lims-results_report_version_detail"/>
<!-- Laboratory / Control Charts -->
<menuitem name="Control Charts" parent="lims_laboratory"
id="lims_laboratory_control" sequence="40"
icon="lims-laboratory_control"/>
<menuitem parent="lims_laboratory_control" action="act_lims_control_tendency"
id="lims_control_tendency_menu" sequence="10"
icon="lims-tendencies"/>
<menuitem parent="lims_laboratory_control" action="act_lims_concentration_level"
id="lims_concentration_level_menu" sequence="20"
icon="lims-concentration_level"/>
<menuitem parent="lims_laboratory_control" action="wiz_lims_control_means_deviations_calc"
id="lims_control_means_deviations_calc_menu" sequence="30"
icon="lims-control_means_deviations_calc"/>
<menuitem parent="lims_laboratory_control" action="wiz_lims_control_tendencies_analysis"
id="lims_control_tendencies_analysis_menu" sequence="40"
icon="lims-tendencies_analysis"/>
<!-- Other menu items -->
<menuitem parent="res.menu_res" action="act_lims_user_role_list"
id="lims_user_role_menu" sequence="5"/>
</data>
</tryton>

View File

@ -1,218 +0,0 @@
<?xml version="1.0"?>
<tryton>
<data>
<!-- Acknowledgment of Samples Receipt -->
<record model="ir.action.wizard" id="print_entry_acknowledgment">
<field name="name">Acknowledgment of Samples Receipt</field>
<field name="wiz_name">lims.entry.acknowledgment.print</field>
<field name="model">lims.entry</field>
</record>
<record model="ir.action.report" id="report_entry_acknowledgment">
<field name="name">Acknowledgment of Samples Receipt</field>
<field name="model">lims.entry</field>
<field name="report_name">lims.entry.acknowledgment.report</field>
<field name="report">lims/report/entry_acknowledgment_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_entry_acknowledgment_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="print_entry_acknowledgment"/>
</record>
<!-- Entry Detail -->
<record model="ir.action.report" id="report_entry_detail">
<field name="name">Entry Detail</field>
<field name="model">lims.entry</field>
<field name="report_name">lims.entry.detail.report</field>
<field name="report">lims/report/entry_detail_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_entry_detail_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="report_entry_detail"/>
</record>
<!-- Entry Labels -->
<record model="ir.action.report" id="report_entry_labels">
<field name="name">Entry Labels</field>
<field name="model">lims.entry</field>
<field name="report_name">lims.entry.labels.report</field>
<field name="report">lims/report/entry_labels_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_entry_labels_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="report_entry_labels"/>
</record>
<!-- Entry Labels Printer -->
<record model="ir.action.wizard" id="wiz_report_entry_labels_printer">
<field name="name">Entry Labels Printer</field>
<field name="wiz_name">lims.entry.labels.printer.report</field>
<field name="model">lims.entry</field>
</record>
<record model="ir.action.keyword"
id="wiz_report_entry_labels_printer_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="wiz_report_entry_labels_printer"/>
</record>
<!-- Sample Labels Printer -->
<record model="ir.action.wizard" id="wiz_report_sample_labels_printer">
<field name="name">Sample Labels Printer</field>
<field name="wiz_name">lims.sample.labels.printer.report</field>
<field name="model">lims.sample</field>
</record>
<record model="ir.action.keyword"
id="wiz_report_sample_labels_printer_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.sample,-1</field>
<field name="action" ref="wiz_report_sample_labels_printer"/>
</record>
<!-- Control Charts -->
<record model="ir.action.wizard" id="wiz_control_chart_print">
<field name="name">Control Chart</field>
<field name="wiz_name">lims.control_chart.print</field>
<field name="model">lims.control.tendency</field>
</record>
<record model="ir.action.report" id="report_control_chart">
<field name="name">Control Chart</field>
<field name="model">lims.control.tendency</field>
<field name="report_name">lims.control_chart.report</field>
<field name="report">lims/report/control_chart_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_control_chart_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.control.tendency,-1</field>
<field name="action" ref="wiz_control_chart_print"/>
</record>
<!-- Results Report -->
<record model="ir.action.report" id="report_results_report">
<field name="name">Results Report</field>
<field name="model">lims.results_report.version.detail</field>
<field name="report_name">lims.result_report</field>
<field name="report">lims/report/results_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_results_report_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.results_report.version.detail,-1</field>
<field name="action" ref="report_results_report"/>
</record>
<!-- Transcription Results Report -->
<record model="ir.action.report" id="report_results_report_transcription">
<field name="name">Transcription Results Report</field>
<field name="model">lims.results_report.version.detail</field>
<field name="report_name">lims.result_report.transcription</field>
<field name="report">lims/report/results_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_results_report_transcription_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.results_report.version.detail,-1</field>
<field name="action" ref="report_results_report_transcription"/>
</record>
<!-- Global Results Report -->
<record model="ir.action.report" id="report_global_results_report">
<field name="name">Global Results Report</field>
<field name="model"></field>
<field name="report_name">lims.global_result_report</field>
<field name="report">lims/report/global_results_report.odt</field>
</record>
<!-- Countersamples Storage Report -->
<record model="ir.ui.view" id="lims_countersample_storage_print_start_view_form">
<field name="model">lims.countersample.storage.print.start</field>
<field name="type">form</field>
<field name="name">countersample_storage_print_start_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_countersample_storage_print">
<field name="name">Countersamples Storage Report</field>
<field name="wiz_name">lims.countersample.storage.print</field>
</record>
<record model="ir.action.report" id="report_countersample_storage">
<field name="name">Countersamples Storage Report</field>
<!-- <field name="model">lims.fraction</field> -->
<field name="report_name">lims.countersample.storage.report</field>
<field name="report">lims/report/countersample_storage_report.odt</field>
</record>
<record model="ir.action.keyword" id="lims_countersample_storage_print_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="wiz_lims_countersample_storage_print"/>
</record>
<!-- Countersamples Discharge Report -->
<record model="ir.ui.view" id="lims_countersample_discharge_print_start_view_form">
<field name="model">lims.countersample.discharge.print.start</field>
<field name="type">form</field>
<field name="name">countersample_discharge_print_start_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_countersample_discharge_print">
<field name="name">Countersamples Discharge Report</field>
<field name="wiz_name">lims.countersample.discharge.print</field>
</record>
<record model="ir.action.report" id="report_countersample_discharge">
<field name="name">Countersamples Discharge Report</field>
<!-- <field name="model">lims.fraction</field> -->
<field name="report_name">lims.countersample.discharge.report</field>
<field name="report">lims/report/countersample_discharge_report.odt</field>
</record>
<record model="ir.action.keyword" id="lims_countersample_discharge_print_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="wiz_lims_countersample_discharge_print"/>
</record>
<!-- Analysis Pending of Inform -->
<record model="ir.ui.view" id="print_analysis_pending_inform_start_view_form">
<field name="model">lims.print_analysis_pending_inform.start</field>
<field name="type">form</field>
<field name="name">analysis_pending_inform_start_form</field>
</record>
<record model="ir.action.wizard" id="wiz_print_analysis_pending_inform">
<field name="name">Pending analysis Unchecked</field>
<field name="wiz_name">lims.print_analysis_pending_inform</field>
</record>
<record model="ir.action.report" id="report_analysis_pending_inform">
<field name="name">Pending analysis Unchecked</field>
<field name="report_name">lims.analysis_pending_inform</field>
<field name="report">lims/report/analysis_pending_inform.ods</field>
</record>
<!-- Analysis Checked pending of inform -->
<record model="ir.ui.view" id="print_analysis_checked_pending_inform_start_view_form">
<field name="model">lims.print_analysis_checked_pending_inform.start</field>
<field name="type">form</field>
<field name="name">print_analysis_checked_pending_inform_start_view_form</field>
</record>
<record model="ir.action.wizard" id="wiz_print_analysis_checked_pending_inform">
<field name="name">Analysis checked pending of inform</field>
<field name="wiz_name">lims.print_analysis_checked_pending_inform</field>
</record>
<record model="ir.action.report" id="report_analysis_checked_pending_inform">
<field name="name">Analysis checked pending of inform</field>
<field name="report_name">lims.analysis_checked_pending_inform</field>
<field name="report">lims/report/analysis_checked_pending_inform.ods</field>
</record>
</data>
</tryton>

File diff suppressed because it is too large Load Diff

View File

@ -346,6 +346,12 @@ msgctxt "error:lims.results_report.version.detail:"
msgid "Absence"
msgstr "Ausencia"
msgctxt "error:lims.results_report.version.detail:"
msgid "Elements results are reported without recovery correction."
msgstr ""
"Los resultados de metales se informan sin la corrección en función de la "
"recuperación."
msgctxt "error:lims.results_report.version.detail:"
msgid "Expressed at %s"
msgstr "Expresado a %s"
@ -362,13 +368,28 @@ msgctxt "error:lims.results_report.version.detail:"
msgid "Expressed at dry matter"
msgstr "Expresado a base seca"
msgctxt "error:lims.results_report.version.detail:"
msgid ""
"LABORATORY N° 0112. The laboratory undertakes to submit results in this "
"protocol only in specific actions for which it is AUTHORIZED by the NATIONAL"
" LABORATORY NETWORK and for the sole purpose of being submitted to SENASA."
msgstr ""
"LABORATORIO N° 0112. El laboratorio se compromete a remitir resultados en el"
" presente únicamente en acciones especificas para las cuales se encuentra "
"AUTORIZADO por la RED NACIONAL DE LABORATORIOS y al solo efecto de ser "
"presentado ante el SENASA."
msgctxt "error:lims.results_report.version.detail:"
msgid "LoD= Limit of Detection."
msgstr "LD= Límite de Detección."
msgctxt "error:lims.results_report.version.detail:"
msgid "LoQ= Limit of Quantitation."
msgstr "LC= Límite de Cuantificación."
msgid ""
"LoQ= Limit of Quantitation. Result <LoQ indicates that the detected value is"
" between LoD (Limit of Detection) and LoQ (Limit of Quantitation)."
msgstr ""
"LC= Límite de Cuantificación. Resultado <LC indica que el valor detectado se"
" encuentra entre el límite de detección y el límite de cuantificación."
msgctxt "error:lims.results_report.version.detail:"
msgid "NOT SPECIFIED BY THE CLIENT"
@ -410,13 +431,6 @@ msgctxt "error:lims.results_report.version.detail:"
msgid "The report has not lines to print"
msgstr "El informe no tiene líneas para imprimir"
msgctxt "error:lims.results_report.version.detail:"
msgid ""
"Elements results are reported without recovery correction."
msgstr ""
"Los resultados de metales se informan sin la corrección en función de la "
"recuperación."
msgctxt "error:lims.results_report.version.detail:"
msgid "This report is annulled"
msgstr "Este informe está anulado"
@ -1526,6 +1540,10 @@ msgctxt "field:lims.control.tendency.detail,fraction:"
msgid "Fraction"
msgstr "Fracción"
msgctxt "field:lims.control.tendency.detail,icon:"
msgid "Icon"
msgstr "Icono"
msgctxt "field:lims.control.tendency.detail,id:"
msgid "ID"
msgstr "ID"
@ -1841,8 +1859,6 @@ msgstr "Observaciones"
msgctxt "field:lims.create_sample.start,date:"
msgid "Date"
msgstr "Fecha de ingreso"
##msgstr "Fecha de recepción"
msgctxt "field:lims.create_sample.start,fraction_state:"
msgid "Package state"
@ -2040,6 +2056,10 @@ msgctxt "field:lims.entry,ack_report_cache:"
msgid "Acknowledgment report cache"
msgstr "Cache acuse de recibo"
msgctxt "field:lims.entry,ack_report_cache_id:"
msgid "Acknowledgment report cache ID"
msgstr "ID Cache acuse de recibo"
msgctxt "field:lims.entry,ack_report_format:"
msgid "Acknowledgment report format"
msgstr "Formato acuse de recibo"
@ -2079,8 +2099,6 @@ msgstr "Fecha"
msgctxt "field:lims.entry,date:"
msgid "Date"
msgstr "Fecha de ingreso"
##msgstr "Fecha de recepción"
msgctxt "field:lims.entry,email_report:"
msgid "Email report"
@ -2090,6 +2108,10 @@ msgctxt "field:lims.entry,english_report:"
msgid "English report"
msgstr "Informe en inglés"
msgctxt "field:lims.entry,icon:"
msgid "Icon"
msgstr "Icono"
msgctxt "field:lims.entry,id:"
msgid "ID"
msgstr "ID"
@ -2329,8 +2351,6 @@ msgstr "Usuario modificación"
msgctxt "field:lims.entry.duplicate_sample.start,date:"
msgid "Date"
msgstr "Fecha de ingreso"
##msgstr "Fecha de recepción"
msgctxt "field:lims.entry.duplicate_sample.start,entry:"
msgid "Entry"
@ -2604,6 +2624,10 @@ msgctxt "field:lims.fraction,has_results_report:"
msgid "Results Report"
msgstr "Informe de resultados"
msgctxt "field:lims.fraction,icon:"
msgid "Icon"
msgstr "Icono"
msgctxt "field:lims.fraction,id:"
msgid "ID"
msgstr "ID"
@ -3385,6 +3409,10 @@ msgctxt "field:lims.lab.workyear,sample_sequence:"
msgid "Sample Sequence"
msgstr "Secuencia de muestras"
msgctxt "field:lims.lab.workyear,sequences:"
msgid "Sequences"
msgstr "Secuencias"
msgctxt "field:lims.lab.workyear,service_sequence:"
msgid "Service Sequence"
msgstr "Secuencia de servicios"
@ -3401,6 +3429,54 @@ msgctxt "field:lims.lab.workyear,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
msgctxt "field:lims.lab.workyear.sequence,company:"
msgid "Company"
msgstr "Empresa"
msgctxt "field:lims.lab.workyear.sequence,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
msgctxt "field:lims.lab.workyear.sequence,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
msgctxt "field:lims.lab.workyear.sequence,entry_sequence:"
msgid "Entry Sequence"
msgstr "Secuencia de partidas"
msgctxt "field:lims.lab.workyear.sequence,id:"
msgid "ID"
msgstr "ID"
msgctxt "field:lims.lab.workyear.sequence,rec_name:"
msgid "Name"
msgstr "Nombre"
msgctxt "field:lims.lab.workyear.sequence,results_report_sequence:"
msgid "Results Report Sequence"
msgstr "Secuencia de informes de resultados"
msgctxt "field:lims.lab.workyear.sequence,sample_sequence:"
msgid "Sample Sequence"
msgstr "Secuencia de muestras"
msgctxt "field:lims.lab.workyear.sequence,service_sequence:"
msgid "Service Sequence"
msgstr "Secuencia de servicios"
msgctxt "field:lims.lab.workyear.sequence,workyear:"
msgid "Work Year"
msgstr "Año laboral"
msgctxt "field:lims.lab.workyear.sequence,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
msgctxt "field:lims.lab.workyear.sequence,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
msgctxt "field:lims.laboratory,code:"
msgid "Code"
msgstr "Código"
@ -3649,6 +3725,10 @@ msgctxt "field:lims.notebook,fraction_type:"
msgid "Fraction type"
msgstr "Tipo de fracción"
msgctxt "field:lims.notebook,icon:"
msgid "Icon"
msgstr "Icono"
msgctxt "field:lims.notebook,id:"
msgid "ID"
msgstr "ID"
@ -4040,8 +4120,6 @@ msgstr "Fecha"
msgctxt "field:lims.notebook.line,date:"
msgid "Date"
msgstr "Fecha de ingreso"
##msgstr "Fecha de recepción "
msgctxt "field:lims.notebook.line,decimals:"
msgid "Decimals"
@ -4091,6 +4169,10 @@ msgctxt "field:lims.notebook.line,fraction_type:"
msgid "Fraction type"
msgstr "Tipo de fracción"
msgctxt "field:lims.notebook.line,icon:"
msgid "Icon"
msgstr "Icono"
msgctxt "field:lims.notebook.line,id:"
msgid "ID"
msgstr "ID"
@ -4147,6 +4229,10 @@ msgctxt "field:lims.notebook.line,party:"
msgid "Party"
msgstr "Entidad"
msgctxt "field:lims.notebook.line,planification:"
msgid "Planification"
msgstr "Planificación"
msgctxt "field:lims.notebook.line,priority:"
msgid "Priority"
msgstr "Prioridad"
@ -4342,8 +4428,6 @@ msgstr "Usuario creación"
msgctxt "field:lims.notebook.line.all_fields,date:"
msgid "Date"
msgstr "Fecha de ingreso"
##msgstr "Fecha de recepción"
msgctxt "field:lims.notebook.line.all_fields,decimals:"
msgid "Decimals"
@ -5254,6 +5338,30 @@ msgctxt "field:lims.packaging.type,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
msgctxt "field:lims.planification,create_date:"
msgid "Create Date"
msgstr "Fecha creación"
msgctxt "field:lims.planification,create_uid:"
msgid "Create User"
msgstr "Usuario creación"
msgctxt "field:lims.planification,id:"
msgid "ID"
msgstr "ID"
msgctxt "field:lims.planification,rec_name:"
msgid "Name"
msgstr "Nombre"
msgctxt "field:lims.planification,write_date:"
msgid "Write Date"
msgstr "Fecha modificación"
msgctxt "field:lims.planification,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
msgctxt "field:lims.print_analysis_pending_inform.start,date_from:"
msgid "Date from"
msgstr "Fecha desde"
@ -5562,6 +5670,14 @@ msgctxt "field:lims.results_report,report_cache_eng:"
msgid "Report cache"
msgstr "Cache informe"
msgctxt "field:lims.results_report,report_cache_eng_id:"
msgid "Report cache id"
msgstr "ID Cache informe"
msgctxt "field:lims.results_report,report_cache_id:"
msgid "Report cache id"
msgstr "ID Cache informe"
msgctxt "field:lims.results_report,report_format:"
msgid "Report format"
msgstr "Formato informe"
@ -5682,6 +5798,10 @@ msgctxt "field:lims.results_report.version.detail,fraction_comments:"
msgid "Fraction comments"
msgstr "Observaciones de la fracción"
msgctxt "field:lims.results_report.version.detail,icon:"
msgid "Icon"
msgstr "Icono"
msgctxt "field:lims.results_report.version.detail,id:"
msgid "ID"
msgstr "ID"
@ -5714,6 +5834,14 @@ msgctxt "field:lims.results_report.version.detail,report_cache_eng:"
msgid "Report cache"
msgstr "Cache informe"
msgctxt "field:lims.results_report.version.detail,report_cache_eng_id:"
msgid "Report cache id"
msgstr "ID Cache informe"
msgctxt "field:lims.results_report.version.detail,report_cache_id:"
msgid "Report cache id"
msgstr "ID Cache informe"
msgctxt "field:lims.results_report.version.detail,report_cache_odt:"
msgid "Transcription Report cache"
msgstr "Cache transcripción informe"
@ -5722,6 +5850,14 @@ msgctxt "field:lims.results_report.version.detail,report_cache_odt_eng:"
msgid "Transcription Report cache"
msgstr "Cache transcripción informe"
msgctxt "field:lims.results_report.version.detail,report_cache_odt_eng_id:"
msgid "Transcription Report cache id"
msgstr "ID Cache transcripción informe"
msgctxt "field:lims.results_report.version.detail,report_cache_odt_id:"
msgid "Transcription Report cache id"
msgstr "ID Cache transcripción informe"
msgctxt "field:lims.results_report.version.detail,report_format:"
msgid "Report format"
msgstr "Formato informe"
@ -5794,6 +5930,10 @@ msgctxt "field:lims.results_report.version.detail,write_uid:"
msgid "Write User"
msgstr "Usuario modificación"
msgctxt "field:lims.results_report.version.detail,z_senasa_protocol_report:"
msgid "SENASA Protocol report"
msgstr "Informe con protocolo SENASA"
msgctxt "field:lims.results_report.version.detail.line,analysis:"
msgid "Analysis"
msgstr "Análisis"
@ -5851,6 +5991,10 @@ msgctxt "field:lims.results_report.version.detail.line,literal_result:"
msgid "Literal result"
msgstr "Resultado textual"
msgctxt "field:lims.results_report.version.detail.line,matrix:"
msgid "Matrix"
msgstr "Matriz"
msgctxt "field:lims.results_report.version.detail.line,method:"
msgid "Method"
msgstr "Método"
@ -5871,6 +6015,10 @@ msgctxt "field:lims.results_report.version.detail.line,priority:"
msgid "Priority"
msgstr "Prioridad"
msgctxt "field:lims.results_report.version.detail.line,product_type:"
msgid "Product type"
msgstr "Tipo de producto"
msgctxt "field:lims.results_report.version.detail.line,rec_name:"
msgid "Name"
msgstr "Nombre"
@ -5950,8 +6098,6 @@ msgstr "Fecha"
msgctxt "field:lims.sample,date:"
msgid "Date"
msgstr "Fecha de ingreso"
##msgstr "Fecha de recepción"
msgctxt "field:lims.sample,entry:"
msgid "Entry"
@ -5969,6 +6115,10 @@ msgctxt "field:lims.sample,has_results_report:"
msgid "Results Report"
msgstr "Informe de resultados"
msgctxt "field:lims.sample,icon:"
msgid "Icon"
msgstr "Icono"
msgctxt "field:lims.sample,id:"
msgid "ID"
msgstr "ID"
@ -6080,8 +6230,6 @@ msgstr "Zona"
msgctxt "field:lims.sample.duplicate.start,date:"
msgid "Date"
msgstr "Fecha de ingreso"
##msgstr "Fecha de recepción"
msgctxt "field:lims.sample.duplicate.start,id:"
msgid "ID"
@ -6224,6 +6372,10 @@ msgctxt "field:lims.service,has_results_report:"
msgid "Results Report"
msgstr "Informe de resultados"
msgctxt "field:lims.service,icon:"
msgid "Icon"
msgstr "Icono"
msgctxt "field:lims.service,id:"
msgid "ID"
msgstr "ID"
@ -7073,6 +7225,10 @@ msgctxt "field:party.party,single_sending_report:"
msgid "Single sending of report"
msgstr "Envío único de Informe"
msgctxt "field:party.party,z_senasa_protocol_report:"
msgid "SENASA Protocol report"
msgstr "Informe con protocolo SENASA"
msgctxt "field:product.uom,maximum_concentration:"
msgid "Maximum concentration"
msgstr "Concentración máxima"
@ -8296,6 +8452,10 @@ msgctxt "model:lims.lab.workyear,name:"
msgid "Work Year"
msgstr "Año laboral"
msgctxt "model:lims.lab.workyear.sequence,name:"
msgid "Work Year Sequence"
msgstr "Secuencia de años laborales"
msgctxt "model:lims.laboratory,name:"
msgid "Laboratory"
msgstr "Laboratorio"
@ -8496,6 +8656,10 @@ msgctxt "model:lims.packaging.type,name:"
msgid "Packaging Type"
msgstr "Tipo de envase"
msgctxt "model:lims.planification,name:"
msgid "Planification"
msgstr "Planificación"
msgctxt "model:lims.print_analysis_pending_inform.start,name:"
msgid "Analysis Pending of Inform"
msgstr "Análisis pendientes sin tildar"
@ -9061,8 +9225,8 @@ msgid "/"
msgstr "/"
msgctxt "report:lims.countersample.discharge.report:"
msgid "Code"
msgstr "Código"
msgid "CIATI Code"
msgstr "Código CIATI"
msgctxt "report:lims.countersample.discharge.report:"
msgid "Comments"
@ -9126,8 +9290,8 @@ msgid "/"
msgstr "/"
msgctxt "report:lims.countersample.storage.report:"
msgid "Code"
msgstr "Código"
msgid "CIATI Code"
msgstr "Código CIATI"
msgctxt "report:lims.countersample.storage.report:"
msgid "Comments"
@ -9314,13 +9478,21 @@ msgctxt "report:lims.result_report.transcription:"
msgid "Analysis"
msgstr "Análisis"
msgctxt "report:lims.result_report.transcription:"
msgid ""
"Av. Mitre y 20 de Junio (8336) Villa Regina - Río Negro - Argentina - Tel: "
"54-298-4462810 (Rotativas) Fax: 54-298-4461101 e-mail: info@ciati.com.ar -"
msgstr ""
"Av. Mitre y 20 de Junio (8336) Villa Regina - Río Negro - Argentina - Tel: "
"54-298-4462810 (Rotativas) Fax: 54-298-4461101 e-mail: info@ciati.com.ar - "
msgctxt "report:lims.result_report.transcription:"
msgid "BEGINNING OF THE ANALYSIS:"
msgstr "FECHA INICIO DE ANÁLISIS:"
msgctxt "report:lims.result_report.transcription:"
msgid "CODE OF THE SAMPLE:"
msgstr "CÓDIGO DE LA MUESTRA:"
msgid "CIATI CODE OF THE SAMPLE:"
msgstr "CÓDIGO CIATI DE LA MUESTRA:"
msgctxt "report:lims.result_report.transcription:"
msgid "CONFIRMATION SAMPLE RECEPTION:"
@ -9330,6 +9502,10 @@ msgctxt "report:lims.result_report.transcription:"
msgid "CONTAINER:"
msgstr "ENVASE:"
msgctxt "report:lims.result_report.transcription:"
msgid "CUSTOMER DESCRIPTION:"
msgstr "DESCRIPCIÓN DEL CLIENTE:"
msgctxt "report:lims.result_report.transcription:"
msgid "DAYS AFTER TREATMENT (DAT):"
msgstr "DÍAS DESPUÉS DE APLICADO:"
@ -9386,10 +9562,6 @@ msgctxt "report:lims.result_report.transcription:"
msgid "PRODUCER COMPANY:"
msgstr "EMPRESA PRODUCTORA:"
msgctxt "report:lims.result_report.transcription:"
msgid "CUSTOMER DESCRIPTION:"
msgstr "DESCRIPCIÓN DEL CLIENTE:"
msgctxt "report:lims.result_report.transcription:"
msgid "Page:"
msgstr "Página:"
@ -9449,10 +9621,11 @@ msgstr "TRATAMIENTO:"
msgctxt "report:lims.result_report.transcription:"
msgid ""
"The results only refer to the analyzed samples. This report must not be "
"partially reproduced without the written approval of "
"partially reproduced without the written approval of CIATI AC."
msgstr ""
"Los resultados se refieren exclusivamente a las muestras analizadas. El "
"informe no debe reproducirse parcialmente sin la aprobación escrita de "
"informe no debe reproducirse parcialmente sin la aprobación escrita de CIATI"
" AC."
msgctxt "report:lims.result_report.transcription:"
msgid "Unit"
@ -9466,6 +9639,10 @@ msgctxt "report:lims.result_report.transcription:"
msgid "ZONE:"
msgstr "ZONA:"
msgctxt "report:lims.result_report.transcription:"
msgid "www.ciati.com.ar"
msgstr "www.ciati.com.ar"
msgctxt "report:lims.result_report.transcription:"
msgid "· Page:"
msgstr "· Página:"
@ -9506,13 +9683,21 @@ msgctxt "report:lims.result_report:"
msgid "Analysis"
msgstr "Análisis"
msgctxt "report:lims.result_report:"
msgid ""
"Av. Mitre y 20 de Junio (8336) Villa Regina - Río Negro - Argentina - Tel: "
"54-298-4462810 (Rotativas) Fax: 54-298-4461101 e-mail: info@ciati.com.ar -"
msgstr ""
"Av. Mitre y 20 de Junio (8336) Villa Regina - Río Negro - Argentina - Tel: "
"54-298-4462810 (Rotativas) Fax: 54-298-4461101 e-mail: info@ciati.com.ar - "
msgctxt "report:lims.result_report:"
msgid "BEGINNING OF THE ANALYSIS:"
msgstr "FECHA INICIO DE ANÁLISIS:"
msgctxt "report:lims.result_report:"
msgid "CODE OF THE SAMPLE:"
msgstr "CÓDIGO DE LA MUESTRA:"
msgid "CIATI CODE OF THE SAMPLE:"
msgstr "CÓDIGO CIATI DE LA MUESTRA:"
msgctxt "report:lims.result_report:"
msgid "CONFIRMATION SAMPLE RECEPTION:"
@ -9522,6 +9707,10 @@ msgctxt "report:lims.result_report:"
msgid "CONTAINER:"
msgstr "ENVASE:"
msgctxt "report:lims.result_report:"
msgid "CUSTOMER DESCRIPTION:"
msgstr "DESCRIPCIÓN DEL CLIENTE:"
msgctxt "report:lims.result_report:"
msgid "DAYS AFTER TREATMENT (DAT):"
msgstr "DÍAS DESPUÉS DE APLICADO:"
@ -9578,10 +9767,6 @@ msgctxt "report:lims.result_report:"
msgid "PRODUCER COMPANY:"
msgstr "EMPRESA PRODUCTORA:"
msgctxt "report:lims.result_report:"
msgid "CUSTOMER DESCRIPTION:"
msgstr "DESCRIPCIÓN DEL CLIENTE:"
msgctxt "report:lims.result_report:"
msgid "Page:"
msgstr "Página:"
@ -9641,10 +9826,11 @@ msgstr "TRATAMIENTO:"
msgctxt "report:lims.result_report:"
msgid ""
"The results only refer to the analyzed samples. This report must not be "
"partially reproduced without the written approval of "
"partially reproduced without the written approval of CIATI AC."
msgstr ""
"Los resultados se refieren exclusivamente a las muestras analizadas. El "
"informe no debe reproducirse parcialmente sin la aprobación escrita de "
"informe no debe reproducirse parcialmente sin la aprobación escrita de CIATI"
" AC."
msgctxt "report:lims.result_report:"
msgid "Unit"
@ -9658,6 +9844,10 @@ msgctxt "report:lims.result_report:"
msgid "ZONE:"
msgstr "ZONA:"
msgctxt "report:lims.result_report:"
msgid "www.ciati.com.ar"
msgstr "www.ciati.com.ar"
msgctxt "report:lims.result_report:"
msgid "· Page:"
msgstr "· Página:"
@ -12384,7 +12574,10 @@ msgstr ""
"El resultado convertido o el modificador del resultado convertido es "
"inválido"
##
msgctxt "selection:lims.project,type:"
msgid "Water sampling"
msgstr "Muestreo"
msgctxt "field:lims.laboratory,headquarters:"
msgid "Headquarters"
msgstr "Sede"

4926
lims/notebook.py Normal file

File diff suppressed because it is too large Load Diff

822
lims/notebook.xml Normal file
View File

@ -0,0 +1,822 @@
<?xml version="1.0"?>
<tryton>
<data>
<record model="ir.ui.icon" id="notebook_icon">
<field name="name">lims-notebook</field>
<field name="path">icons/notebook.svg</field>
</record>
<record model="ir.ui.icon" id="notebook_line_all_menu_icon">
<field name="name">lims-notebook_line_all_menu</field>
<field name="path">icons/notebook_line_all_menu.svg</field>
</record>
<record model="ir.ui.icon" id="laboratory_results_icon">
<field name="name">lims-laboratory_results</field>
<field name="path">icons/laboratory_results.svg</field>
</record>
<record model="ir.ui.icon" id="notebook_load_results_manual_icon">
<field name="name">lims-notebook_load_results_manual</field>
<field name="path">icons/notebook_load_results_manual.svg</field>
</record>
<record model="ir.ui.icon" id="notebook_load_results_formula_icon">
<field name="name">lims-notebook_load_results_formula</field>
<field name="path">icons/notebook_load_results_formula.svg</field>
</record>
<!-- Notebook -->
<record model="ir.ui.view" id="lims_notebook_view_form">
<field name="model">lims.notebook</field>
<field name="type">form</field>
<field name="name">notebook_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_view_list">
<field name="model">lims.notebook</field>
<field name="type">tree</field>
<field name="name">notebook_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_notebook_list">
<field name="name">Laboratory Notebooks</field>
<field name="res_model">lims.notebook</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_notebook_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_notebook_view_list"/>
<field name="act_window" ref="act_lims_notebook_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_notebook_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_notebook_view_form"/>
<field name="act_window" ref="act_lims_notebook_list"/>
</record>
<record model="ir.rule.group" id="rule_group_notebook">
<field name="model" search="[('model', '=', 'lims.notebook')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_notebook">
<field name="domain"
eval="[If(Bool(Eval('user', {}).get('laboratory', False)), ('lines.laboratory', '=', Eval('user', {}).get('laboratory', None)), If(Bool(Eval('user', {}).get('laboratories', False)), ('lines.laboratory', 'in', Eval('user', {}).get('laboratories', [])), ('id', '!=', 0)))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_notebook"/>
</record>
<record model="ir.action.act_window" id="act_lims_notebook_line_related1">
<field name="name">Notebook Lines</field>
<field name="res_model">lims.notebook.line</field>
</record>
<record model="ir.action.wizard" id="act_open_notebook_lines">
<field name="name">Notebook Lines</field>
<field name="wiz_name">lims.open_notebook_lines</field>
<field name="model">lims.notebook</field>
</record>
<record model="ir.action.keyword" id="act_open_notebook_line_keyword1">
<field name="keyword">form_relate</field>
<field name="model">lims.notebook,-1</field>
<field name="action" ref="act_open_notebook_lines"/>
</record>
<!-- Notebook Line -->
<record model="ir.ui.view" id="lims_notebook_line_view_form">
<field name="model">lims.notebook.line</field>
<field name="type">form</field>
<field name="name">notebook_line_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_line_view_list">
<field name="model">lims.notebook.line</field>
<field name="type">tree</field>
<field name="name">notebook_line_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_notebook_line_list">
<field name="name">Notebook Lines</field>
<field name="res_model">lims.notebook.line</field>
<field name="domain"
eval="[('notebook', '=', Get(Eval('lims.act_lims_notebook_list', {}), 'id', None))]"
pyson="1"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_notebook_line_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_notebook_line_view_list"/>
<field name="act_window" ref="act_lims_notebook_line_list"/>
</record>
<record model="ir.rule.group" id="rule_group_notebook_line">
<field name="model" search="[('model', '=', 'lims.notebook.line')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_notebook_line">
<field name="domain"
eval="[If(Bool(Eval('user', {}).get('laboratory', False)), ('laboratory', '=', Eval('user', {}).get('laboratory', None)), If(Bool(Eval('user', {}).get('laboratories', False)), ('laboratory', 'in', Eval('user', {}).get('laboratories', [])), ('id', '!=', 0)))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_notebook_line"/>
</record>
<!-- Notebook Line Professional -->
<record model="ir.ui.view" id="lims_notebook_line_professional_view_form">
<field name="model">lims.notebook.line.professional</field>
<field name="type">form</field>
<field name="name">notebook_line_professional_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_line_professional_view_list">
<field name="model">lims.notebook.line.professional</field>
<field name="type">tree</field>
<field name="name">notebook_line_professional_list</field>
</record>
<!-- Notebook Line All Fields -->
<record model="ir.ui.view" id="lims_notebook_line_all_fields_view_form">
<field name="model">lims.notebook.line.all_fields</field>
<field name="type">form</field>
<field name="name">notebook_line_all_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_line_all_fields_view_list">
<field name="model">lims.notebook.line.all_fields</field>
<field name="type">tree</field>
<field name="name">notebook_line_all_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_notebook_line_all_fields_list">
<field name="name">All Notebook Lines</field>
<field name="res_model">lims.notebook.line.all_fields</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_notebook_line_all_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_notebook_line_all_fields_view_list"/>
<field name="act_window" ref="act_lims_notebook_line_all_fields_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_notebook_line_all_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_notebook_line_all_fields_view_form"/>
<field name="act_window" ref="act_lims_notebook_line_all_fields_list"/>
</record>
<record model="ir.rule.group" id="rule_group_notebook_line_all_fields">
<field name="model" search="[('model', '=', 'lims.notebook.line.all_fields')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_notebook_line_all_fields">
<field name="domain"
eval="[If(Bool(Eval('user', {}).get('laboratory', False)), ('laboratory', '=', Eval('user', {}).get('laboratory', None)), If(Bool(Eval('user', {}).get('laboratories', False)), ('laboratory', 'in', Eval('user', {}).get('laboratories', [])), ('id', '!=', 0)))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_notebook_line_all_fields"/>
</record>
<!-- Wizard Initial Concentration Calculation -->
<record model="ir.ui.view" id="lims_notebook_initial_concentration_calc_view_form">
<field name="model">lims.notebook.initial_concentration_calc.start</field>
<field name="type">form</field>
<field name="name">notebook_initial_concentration_calc_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_initial_concentration_calc">
<field name="name">Initial Concentration Calculation</field>
<field name="wiz_name">lims.notebook.initial_concentration_calc</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_initial_concentration_calc_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook,-1</field>
<field name="action" ref="wiz_lims_notebook_initial_concentration_calc"/>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_line_initial_concentration_calc">
<field name="name">Initial Concentration Calculation</field>
<field name="wiz_name">lims.notebook_line.initial_concentration_calc</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_line_initial_concentration_calc_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line,-1</field>
<field name="action" ref="wiz_lims_notebook_line_initial_concentration_calc"/>
</record>
<!-- Wizard Results Conversion -->
<record model="ir.ui.view" id="lims_notebook_results_conversion_view_form">
<field name="model">lims.notebook.results_conversion.start</field>
<field name="type">form</field>
<field name="name">notebook_results_conversion_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_results_conversion">
<field name="name">Results Conversion</field>
<field name="wiz_name">lims.notebook.results_conversion</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_results_conversion_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook,-1</field>
<field name="action" ref="wiz_lims_notebook_results_conversion"/>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_line_results_conversion">
<field name="name">Results Conversion</field>
<field name="wiz_name">lims.notebook_line.results_conversion</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_line_results_conversion_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line,-1</field>
<field name="action" ref="wiz_lims_notebook_line_results_conversion"/>
</record>
<!-- Wizard Limits Validation -->
<record model="ir.ui.view" id="lims_notebook_limits_validation_view_form">
<field name="model">lims.notebook.limits_validation.start</field>
<field name="type">form</field>
<field name="name">notebook_limits_validation_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_limits_validation">
<field name="name">Limits Validation</field>
<field name="wiz_name">lims.notebook.limits_validation</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_limits_validation_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook,-1</field>
<field name="action" ref="wiz_lims_notebook_limits_validation"/>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_line_limits_validation">
<field name="name">Limits Validation</field>
<field name="wiz_name">lims.notebook_line.limits_validation</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_line_limits_validation_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line,-1</field>
<field name="action" ref="wiz_lims_notebook_line_limits_validation"/>
</record>
<!-- Wizard Internal Relations Calculation 1 (repetition zero) -->
<record model="ir.ui.view" id="lims_notebook_internal_relations_calc_1_start_view_form">
<field name="model">lims.notebook.internal_relations_calc_1.start</field>
<field name="type">form</field>
<field name="name">notebook_internal_relations_calc_1_start_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_internal_relations_calc_1">
<field name="name">Internal Relations Calculation</field>
<field name="wiz_name">lims.notebook.internal_relations_calc_1</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_internal_relations_calc_1_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook,-1</field>
<field name="action" ref="wiz_lims_notebook_internal_relations_calc_1"/>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_line_internal_relations_calc_1">
<field name="name">Internal Relations Calculation</field>
<field name="wiz_name">lims.notebook_line.internal_relations_calc_1</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_line_internal_relations_calc_1_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line,-1</field>
<field name="action" ref="wiz_lims_notebook_line_internal_relations_calc_1"/>
</record>
<!-- Wizard Internal Relations Calculation 2 (with repetitions) -->
<record model="ir.ui.view" id="lims_notebook_internal_relations_calc_2_start_view_form">
<field name="model">lims.notebook.internal_relations_calc_2.start</field>
<field name="type">form</field>
<field name="name">notebook_internal_relations_calc_2_start_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_internal_relations_calc_2_result_view_form">
<field name="model">lims.notebook.internal_relations_calc_2.result</field>
<field name="type">form</field>
<field name="name">notebook_internal_relations_calc_2_result_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_internal_relations_calc_2_process_view_form">
<field name="model">lims.notebook.internal_relations_calc_2.process</field>
<field name="type">form</field>
<field name="name">notebook_internal_relations_calc_2_process_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_internal_relations_calc_2_variable_view_list">
<field name="model">lims.notebook.internal_relations_calc_2.variable</field>
<field name="type">tree</field>
<field name="name">notebook_internal_relations_calc_2_variable_list</field>
</record>
<record model="ir.ui.view" id="lims_notebook_internal_relations_calc_2_variable_view_form">
<field name="model">lims.notebook.internal_relations_calc_2.variable</field>
<field name="type">form</field>
<field name="name">notebook_internal_relations_calc_2_variable_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_internal_relations_calc_2">
<field name="name">Internal Relations Calculation</field>
<field name="wiz_name">lims.notebook.internal_relations_calc_2</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_internal_relations_calc_2_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook,-1</field>
<field name="action" ref="wiz_lims_notebook_internal_relations_calc_2"/>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_line_internal_relations_calc_2">
<field name="name">Internal Relations Calculation</field>
<field name="wiz_name">lims.notebook_line.internal_relations_calc_2</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_line_internal_relations_calc_2_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line,-1</field>
<field name="action" ref="wiz_lims_notebook_line_internal_relations_calc_2"/>
</record>
<record model="ir.model.field.access" id="access_internal_relations_calc_2_process_variables">
<field name="field"
search="[('name', '=', 'variables'), ('model.model', '=', 'lims.notebook.internal_relations_calc_2.process')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<!-- Wizard Load Results by Formula -->
<record model="ir.ui.view" id="lims_notebook_load_results_formula_start_view_form">
<field name="model">lims.notebook.load_results_formula.start</field>
<field name="type">form</field>
<field name="name">notebook_load_results_formula_start_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_formula_empty_view_form">
<field name="model">lims.notebook.load_results_formula.empty</field>
<field name="type">form</field>
<field name="name">notebook_load_results_formula_empty_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_formula_result_view_form">
<field name="model">lims.notebook.load_results_formula.result</field>
<field name="type">form</field>
<field name="name">notebook_load_results_formula_result_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_formula_process_view_form">
<field name="model">lims.notebook.load_results_formula.process</field>
<field name="type">form</field>
<field name="name">notebook_load_results_formula_process_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_formula_variable_view_list">
<field name="model">lims.notebook.load_results_formula.variable</field>
<field name="type">tree</field>
<field name="name">notebook_load_results_formula_variable_list</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_formula_variable_view_form">
<field name="model">lims.notebook.load_results_formula.variable</field>
<field name="type">form</field>
<field name="name">notebook_load_results_formula_variable_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_formula_beginning_view_form">
<field name="model">lims.notebook.load_results_formula.beginning</field>
<field name="type">form</field>
<field name="name">notebook_load_results_formula_beginning_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_formula_confirm_view_form">
<field name="model">lims.notebook.load_results_formula.confirm</field>
<field name="type">form</field>
<field name="name">notebook_load_results_formula_confirm_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_formula_sit1_view_form">
<field name="model">lims.notebook.load_results_formula.sit1</field>
<field name="type">form</field>
<field name="name">notebook_load_results_formula_sit1_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_formula_sit2_view_form">
<field name="model">lims.notebook.load_results_formula.sit2</field>
<field name="type">form</field>
<field name="name">notebook_load_results_formula_sit2_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_formula_sit2_detail_view_list">
<field name="model">lims.notebook.load_results_formula.sit2.detail</field>
<field name="type">tree</field>
<field name="name">notebook_load_results_formula_sit2_detail_list</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_formula_sit2_detail_view_form">
<field name="model">lims.notebook.load_results_formula.sit2.detail</field>
<field name="type">form</field>
<field name="name">notebook_load_results_formula_sit2_detail_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_load_results_formula">
<field name="name">Load Results by Formula</field>
<field name="wiz_name">lims.notebook.load_results_formula</field>
</record>
<record model="ir.model.field.access" id="access_load_results_formula_sit2_details">
<field name="field"
search="[('name', '=', 'details'), ('model.model', '=', 'lims.notebook.load_results_formula.sit2')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<!-- Wizard Load Results Manually -->
<record model="ir.ui.view" id="lims_notebook_load_results_manual_start_view_form">
<field name="model">lims.notebook.load_results_manual.start</field>
<field name="type">form</field>
<field name="name">notebook_load_results_manual_start_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_manual_empty_view_form">
<field name="model">lims.notebook.load_results_manual.empty</field>
<field name="type">form</field>
<field name="name">notebook_load_results_manual_empty_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_manual_result_view_form">
<field name="model">lims.notebook.load_results_manual.result</field>
<field name="type">form</field>
<field name="name">notebook_load_results_manual_result_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_manual_result_line_view_list">
<field name="model">lims.notebook.load_results_manual.line</field>
<field name="type">tree</field>
<field name="name">notebook_load_results_manual_result_line_list</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_manual_result_line_view_form">
<field name="model">lims.notebook.load_results_manual.line</field>
<field name="type">form</field>
<field name="name">notebook_load_results_manual_result_line_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_manual_sit1_view_form">
<field name="model">lims.notebook.load_results_manual.sit1</field>
<field name="type">form</field>
<field name="name">notebook_load_results_manual_sit1_form</field>
</record>
<record model="ir.ui.view" id="lims_notebook_load_results_manual_sit2_view_form">
<field name="model">lims.notebook.load_results_manual.sit2</field>
<field name="type">form</field>
<field name="name">notebook_load_results_manual_sit2_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_load_results_manual">
<field name="name">Load Results Manually</field>
<field name="wiz_name">lims.notebook.load_results_manual</field>
</record>
<record model="ir.model.field.access" id="access_load_results_manual_result_lines">
<field name="field"
search="[('name', '=', 'lines'), ('model.model', '=', 'lims.notebook.load_results_manual.result')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<!-- Wizard Add Internal Relations -->
<record model="ir.ui.view" id="lims_notebook_add_internal_relations_start_view_form">
<field name="model">lims.notebook.add_internal_relations.start</field>
<field name="type">form</field>
<field name="name">notebook_add_internal_relations_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_add_internal_relations">
<field name="name">Add Internal Relations</field>
<field name="wiz_name">lims.notebook.add_internal_relations</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_add_internal_relations_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook,-1</field>
<field name="action" ref="wiz_lims_notebook_add_internal_relations"/>
</record>
<!-- Wizard Repeat Analysis -->
<record model="ir.ui.view" id="lims_notebook_line_repeat_analysis_start_view_form">
<field name="model">lims.notebook.line.repeat_analysis.start</field>
<field name="type">form</field>
<field name="name">notebook_line_repeat_analysis_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_line_repeat_analysis">
<field name="name">Repeat Analysis</field>
<field name="wiz_name">lims.notebook.line.repeat_analysis</field>
</record>
<record model="ir.action.keyword" id="lims_lims_notebook_line_repeat_analysis_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line,-1</field>
<field name="action" ref="wiz_lims_notebook_line_repeat_analysis"/>
</record>
<!-- Wizard Accept Lines -->
<record model="ir.ui.view" id="lims_notebook_accept_lines_start_view_form">
<field name="model">lims.notebook.accept_lines.start</field>
<field name="type">form</field>
<field name="name">notebook_accept_lines_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_accept_lines">
<field name="name">Accept Lines</field>
<field name="wiz_name">lims.notebook.accept_lines</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_accept_lines_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook,-1</field>
<field name="action" ref="wiz_lims_notebook_accept_lines"/>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_line_accept_lines">
<field name="name">Accept Lines</field>
<field name="wiz_name">lims.notebook_line.accept_lines</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_line_accept_lines_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line,-1</field>
<field name="action" ref="wiz_lims_notebook_line_accept_lines"/>
</record>
<!-- Wizard Unaccept Lines -->
<record model="ir.action.wizard" id="wiz_lims_notebook_line_unaccept_lines">
<field name="name">Unaccept Lines</field>
<field name="wiz_name">lims.notebook_line.unaccept_lines</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_line_unaccept_lines_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line,-1</field>
<field name="action" ref="wiz_lims_notebook_line_unaccept_lines"/>
</record>
<!-- Wizard Results Verification -->
<record model="ir.ui.view" id="lims_notebook_results_verification_view_form">
<field name="model">lims.notebook.results_verification.start</field>
<field name="type">form</field>
<field name="name">notebook_results_verification_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_results_verification">
<field name="name">Results Verification</field>
<field name="wiz_name">lims.notebook.results_verification</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_results_verification_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook,-1</field>
<field name="action" ref="wiz_lims_notebook_results_verification"/>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_line_results_verification">
<field name="name">Results Verification</field>
<field name="wiz_name">lims.notebook_line.results_verification</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_line_results_verification_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line,-1</field>
<field name="action" ref="wiz_lims_notebook_line_results_verification"/>
</record>
<!-- Wizard Uncertainty Calculation -->
<record model="ir.ui.view" id="lims_notebook_uncertainty_calc_view_form">
<field name="model">lims.notebook.uncertainty_calc.start</field>
<field name="type">form</field>
<field name="name">notebook_uncertainty_calc_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_uncertainty_calc">
<field name="name">Uncertainty Calculation</field>
<field name="wiz_name">lims.notebook.uncertainty_calc</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_uncertainty_calc_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook,-1</field>
<field name="action" ref="wiz_lims_notebook_uncertainty_calc"/>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_line_uncertainty_calc">
<field name="name">Uncertainty Calculation</field>
<field name="wiz_name">lims.notebook_line.uncertainty_calc</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_line_uncertainty_calc_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line,-1</field>
<field name="action" ref="wiz_lims_notebook_line_uncertainty_calc"/>
</record>
<!-- Wizard Precision Control -->
<record model="ir.ui.view" id="lims_notebook_precision_control_view_form">
<field name="model">lims.notebook.precision_control.start</field>
<field name="type">form</field>
<field name="name">notebook_precision_control_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_precision_control">
<field name="name">Precision Control</field>
<field name="wiz_name">lims.notebook.precision_control</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_precision_control_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook,-1</field>
<field name="action" ref="wiz_lims_notebook_precision_control"/>
</record>
<record model="ir.action.wizard" id="wiz_lims_notebook_line_precision_control">
<field name="name">Precision Control</field>
<field name="wiz_name">lims.notebook_line.precision_control</field>
</record>
<record model="ir.action.keyword" id="lims_notebook_line_precision_control_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line,-1</field>
<field name="action" ref="wiz_lims_notebook_line_precision_control"/>
</record>
<!-- Change Estimated Days For Results -->
<record model="ir.ui.view" id="change_results_estimated_waiting_start_view_form">
<field name="model">lims.change_results_estimated_waiting.start</field>
<field name="type">form</field>
<field name="name">change_results_estimated_waiting_start_form</field>
</record>
<record model="ir.action.wizard" id="wiz_change_results_estimated_waiting">
<field name="name">Change Estimated Days For Results</field>
<field name="wiz_name">lims.change_results_estimated_waiting</field>
</record>
<record model="ir.action.keyword" id="change_results_estimated_waiting_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.notebook.line.all_fields,-1</field>
<field name="action" ref="wiz_change_results_estimated_waiting"/>
</record>
<!-- Analysis Pending of Inform -->
<record model="ir.ui.view" id="print_analysis_pending_inform_start_view_form">
<field name="model">lims.print_analysis_pending_inform.start</field>
<field name="type">form</field>
<field name="name">analysis_pending_inform_start_form</field>
</record>
<record model="ir.action.wizard" id="wiz_print_analysis_pending_inform">
<field name="name">Pending analysis Unchecked</field>
<field name="wiz_name">lims.print_analysis_pending_inform</field>
</record>
<record model="ir.action.report" id="report_analysis_pending_inform">
<field name="name">Pending analysis Unchecked</field>
<field name="report_name">lims.analysis_pending_inform</field>
<field name="report">lims/report/analysis_pending_inform.ods</field>
</record>
<!-- Analysis Checked pending of inform -->
<record model="ir.ui.view" id="print_analysis_checked_pending_inform_start_view_form">
<field name="model">lims.print_analysis_checked_pending_inform.start</field>
<field name="type">form</field>
<field name="name">print_analysis_checked_pending_inform_start_view_form</field>
</record>
<record model="ir.action.wizard" id="wiz_print_analysis_checked_pending_inform">
<field name="name">Analysis checked pending of inform</field>
<field name="wiz_name">lims.print_analysis_checked_pending_inform</field>
</record>
<record model="ir.action.report" id="report_analysis_checked_pending_inform">
<field name="name">Analysis checked pending of inform</field>
<field name="report_name">lims.analysis_checked_pending_inform</field>
<field name="report">lims/report/analysis_checked_pending_inform.ods</field>
</record>
<menuitem parent="lims_laboratory" action="act_lims_notebook_list"
id="lims_notebook_menu" sequence="15"
icon="lims-notebook"/>
<menuitem parent="lims_notebook_menu" action="act_lims_notebook_line_all_fields_list"
id="lims_notebook_line_all_menu" sequence="10"
icon="lims-notebook_line_all_menu"/>
<menuitem parent="lims_notebook_line_all_menu" action="wiz_print_analysis_pending_inform"
id="menu_print_analysis_pending_inform" sequence="100"
icon="tryton-print"/>
<menuitem parent="lims_notebook_line_all_menu" action="wiz_print_analysis_checked_pending_inform"
id="menu_print_analysis_checked_pending_inform" sequence="100"
icon="tryton-print"/>
<menuitem name="Results entry" parent="lims_laboratory"
id="lims_laboratory_results" sequence="20"
icon="lims-laboratory_results"/>
<menuitem parent="lims_laboratory_results" action="wiz_lims_notebook_load_results_manual"
id="lims_notebook_load_results_manual_menu" sequence="10"
icon="lims-notebook_load_results_manual"/>
<menuitem parent="lims_laboratory_results" action="wiz_lims_notebook_load_results_formula"
id="lims_notebook_load_results_formula_menu" sequence="20"
icon="lims-notebook_load_results_formula"/>
<record model="ir.model.access" id="access_notebook_views">
<field name="model" search="[('model', '=', 'lims.notebook.view')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_notebook_views_group_conf_laboratory_admin">
<field name="model" search="[('model', '=', 'lims.notebook.view')]"/>
<field name="group" ref="group_lims_conf_laboratory_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_notebook">
<field name="model" search="[('model', '=', 'lims.notebook')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_notebook_group_notebook">
<field name="model" search="[('model', '=', 'lims.notebook')]"/>
<field name="group" ref="group_lims_notebook"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_notebook_line">
<field name="model" search="[('model', '=', 'lims.notebook.line')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_notebook_line_group_notebook">
<field name="model" search="[('model', '=', 'lims.notebook.line')]"/>
<field name="group" ref="group_lims_notebook"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.field.access" id="access_notebook_line_accepted">
<field name="field" search="[('name', '=', 'accepted'), ('model.model', '=', 'lims.notebook.line')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.field.access" id="access_notebook_line_accepted_group_laboratory_results_acceptance">
<field name="field" search="[('name', '=', 'accepted'), ('model.model', '=', 'lims.notebook.line')]"/>
<field name="group" ref="group_lims_laboratory_results_acceptance"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_notebook_readonly">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_notebook_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_notebook">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_notebook"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_group_notebook_readonly">
<field name="menu" ref="lims_laboratory"/>
<field name="group" ref="group_lims_notebook_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_group_notebook">
<field name="menu" ref="lims_laboratory"/>
<field name="group" ref="group_lims_notebook"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_notebook_group_notebook_readonly">
<field name="menu" ref="lims_notebook_menu"/>
<field name="group" ref="group_lims_notebook_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_notebook_group_notebook">
<field name="menu" ref="lims_notebook_menu"/>
<field name="group" ref="group_lims_notebook"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_notebook_line_all_group_notebook_readonly">
<field name="menu" ref="lims_notebook_line_all_menu"/>
<field name="group" ref="group_lims_notebook_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_notebook_line_all_group_notebook">
<field name="menu" ref="lims_notebook_line_all_menu"/>
<field name="group" ref="group_lims_notebook"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_laboratory_results">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_laboratory_results"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_group_laboratory_results">
<field name="menu" ref="lims_laboratory"/>
<field name="group" ref="group_lims_laboratory_results"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_results_group_laboratory_results">
<field name="menu" ref="lims_laboratory_results"/>
<field name="group" ref="group_lims_laboratory_results"/>
</record>
</data>
</tryton>

View File

@ -65,12 +65,8 @@ class Address:
Bool(Eval('report_contact')),
Bool(Eval('acknowledgment_contact'))),
},
depends=['invoice_contact', 'report_contact',
'acknowledgment_contact'])
invoice_contact = fields.Boolean('Invoice contact')
invoice_contact_default = fields.Boolean('Invoice contact by default',
states={'readonly': ~Bool(Eval('invoice_contact'))},
depends=['invoice_contact'])
depends=['report_contact', 'acknowledgment_contact',
'invoice_contact'])
report_contact = fields.Boolean('Report contact')
report_contact_default = fields.Boolean('Report contact by default',
states={'readonly': ~Bool(Eval('report_contact'))},
@ -80,6 +76,10 @@ class Address:
'Acknowledgment contact by default',
states={'readonly': ~Bool(Eval('acknowledgment_contact'))},
depends=['acknowledgment_contact'])
invoice_contact = fields.Boolean('Invoice contact')
invoice_contact_default = fields.Boolean('Invoice contact by default',
states={'readonly': ~Bool(Eval('invoice_contact'))},
depends=['invoice_contact'])
@classmethod
def __setup__(cls):
@ -88,11 +88,6 @@ class Address:
'invoice_address': 'There is already a address with invoice type',
})
@fields.depends('invoice_contact')
def on_change_invoice_contact(self):
if not self.invoice_contact:
self.invoice_contact_default = False
@fields.depends('report_contact')
def on_change_report_contact(self):
if not self.report_contact:
@ -103,21 +98,10 @@ class Address:
if not self.acknowledgment_contact:
self.acknowledgment_contact_default = False
@classmethod
def validate(cls, addresses):
super(Address, cls).validate(addresses)
for address in addresses:
address.check_invoice_type()
def check_invoice_type(self):
if self.invoice:
addresses = self.search([
('party', '=', self.party.id),
('invoice', '=', True),
('id', '!=', self.id),
])
if addresses:
self.raise_user_error('invoice_address')
@fields.depends('invoice_contact')
def on_change_invoice_contact(self):
if not self.invoice_contact:
self.invoice_contact_default = False
class Company:
@ -125,7 +109,7 @@ class Company:
__metaclass__ = PoolMeta
def get_timezone(self):
timezone = None
timezone = pytz.utc
if self.timezone:
timezone = pytz.timezone(self.timezone)
return timezone

File diff suppressed because it is too large Load Diff

1149
lims/planification.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,52 +0,0 @@
# -*- coding: utf-8 -*-
# This file is part of lims module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from trytond.model import fields, Unique
from trytond.pool import PoolMeta
__all__ = ['Uom', 'UomCategory', 'Template']
class Uom:
__name__ = 'product.uom'
__metaclass__ = PoolMeta
maximum_concentration = fields.Char('Maximum concentration')
rsd_horwitz = fields.Char('% RSD Horwitz')
@classmethod
def __setup__(cls):
super(Uom, cls).__setup__()
cls.symbol.size = 30
t = cls.__table__()
cls._sql_constraints += [
('symbol_uniq', Unique(t, t.symbol),
'UoM symbol must be unique'),
]
def get_rec_name(self, name):
return self.symbol
class UomCategory:
__name__ = 'product.uom.category'
__metaclass__ = PoolMeta
lims_only_available = fields.Boolean('Only available in Lims')
@staticmethod
def default_lims_only_available():
return False
class Template:
__name__ = "product.template"
__metaclass__ = PoolMeta
@classmethod
def __setup__(cls):
super(Template, cls).__setup__()
new_domain = [('category.lims_only_available', '!=', True)]
cls.default_uom.domain = new_domain

View File

@ -1,33 +0,0 @@
<?xml version="1.0"?>
<tryton>
<data>
<!-- Product UoM -->
<record model="ir.ui.view" id="lims_uom_view_list">
<field name="model">product.uom</field>
<field name="inherit" ref="product.uom_view_tree"/>
<field name="name">product_uom_list</field>
</record>
<record model="ir.ui.view" id="lims_uom_view_form">
<field name="model">product.uom</field>
<field name="inherit" ref="product.uom_view_form"/>
<field name="name">product_uom_form</field>
</record>
<!-- UoM Categories -->
<record model="ir.ui.view" id="lims_uom_category_view_list">
<field name="model">product.uom.category</field>
<field name="inherit" ref="product.uom_category_view_tree"/>
<field name="name">product_uom_category_list</field>
</record>
<record model="ir.ui.view" id="lims_uom_category_view_form">
<field name="model">product.uom.category</field>
<field name="inherit" ref="product.uom_category_view_form"/>
<field name="name">product_uom_category_form</field>
</record>
</data>
</tryton>

File diff suppressed because it is too large Load Diff

3122
lims/results_report.py Normal file

File diff suppressed because it is too large Load Diff

483
lims/results_report.xml Normal file
View File

@ -0,0 +1,483 @@
<?xml version="1.0"?>
<tryton>
<data>
<record model="ir.ui.icon" id="laboratory_reports_icon">
<field name="name">lims-laboratory_reports</field>
<field name="path">icons/laboratory_reports.svg</field>
</record>
<record model="ir.ui.icon" id="generate_results_report_icon">
<field name="name">lims-generate_results_report</field>
<field name="path">icons/generate_results_report.svg</field>
</record>
<record model="ir.ui.icon" id="results_report_version_detail_icon">
<field name="name">lims-results_report_version_detail</field>
<field name="path">icons/results_report_version_detail.svg</field>
</record>
<!-- Sequences for Results Report -->
<record model="ir.sequence.type" id="seq_type_results_report">
<field name="name">Results Report</field>
<field name="code">lims.results_report</field>
</record>
<record model="ir.sequence.type-res.group"
id="seq_type_results_report_group_admin">
<field name="sequence_type" ref="seq_type_results_report"/>
<field name="group" ref="res.group_admin"/>
</record>
<!-- Results Report -->
<record model="ir.ui.view" id="lims_results_report_view_list">
<field name="model">lims.results_report</field>
<field name="type">tree</field>
<field name="name">results_report_list</field>
</record>
<record model="ir.ui.view" id="lims_results_report_view_form">
<field name="model">lims.results_report</field>
<field name="type">form</field>
<field name="name">results_report_form</field>
</record>
<record model="ir.action.act_window" id="act_lims_results_report">
<field name="name">Results Reports</field>
<field name="res_model">lims.results_report</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_results_report_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_results_report_view_list"/>
<field name="act_window" ref="act_lims_results_report"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_results_report_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_results_report_view_form"/>
<field name="act_window" ref="act_lims_results_report"/>
</record>
<!-- Results Report Version -->
<record model="ir.ui.view" id="lims_results_report_version_view_list">
<field name="model">lims.results_report.version</field>
<field name="type">tree</field>
<field name="name">results_report_version_list</field>
</record>
<record model="ir.ui.view" id="lims_results_report_version_view_form">
<field name="model">lims.results_report.version</field>
<field name="type">form</field>
<field name="name">results_report_version_form</field>
</record>
<record model="ir.rule.group" id="rule_group_results_report_version">
<field name="model" search="[('model', '=', 'lims.results_report.version')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_results_report_version">
<field name="domain"
eval="[If(Bool(Eval('user', {}).get('laboratory', False)), ('laboratory', '=', Eval('user', {}).get('laboratory', None)), If(Bool(Eval('user', {}).get('laboratories', False)), ('laboratory', 'in', Eval('user', {}).get('laboratories', [])), ('id', '!=', 0)))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_results_report_version"/>
</record>
<!-- Results Report Version Detail -->
<record model="ir.ui.view" id="lims_results_report_version_detail_view_list">
<field name="model">lims.results_report.version.detail</field>
<field name="type">tree</field>
<field name="name">results_report_version_detail_list</field>
</record>
<record model="ir.ui.view" id="lims_results_report_version_detail_view_form">
<field name="model">lims.results_report.version.detail</field>
<field name="type">form</field>
<field name="name">results_report_version_detail_form</field>
</record>
<record model="ir.action.act_window" id="act_lims_results_report_version_detail">
<field name="name">Approval of Reports</field>
<field name="res_model">lims.results_report.version.detail</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_results_report_version_detail_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_results_report_version_detail_view_list"/>
<field name="act_window" ref="act_lims_results_report_version_detail"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_results_report_version_detail_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_results_report_version_detail_view_form"/>
<field name="act_window" ref="act_lims_results_report_version_detail"/>
</record>
<record model="ir.rule.group" id="rule_group_results_report_version_detail">
<field name="model" search="[('model', '=', 'lims.results_report.version.detail')]"/>
<field name="global_p" eval="True"/>
</record>
<record model="ir.rule" id="rule_results_report_version_detail">
<field name="domain"
eval="[If(Bool(Eval('user', {}).get('laboratory', False)), ('laboratory', '=', Eval('user', {}).get('laboratory', None)), If(Bool(Eval('user', {}).get('laboratories', False)), ('laboratory', 'in', Eval('user', {}).get('laboratories', [])), ('id', '!=', 0)))]"
pyson="1"/>
<field name="rule_group" ref="rule_group_results_report_version_detail"/>
</record>
<!-- Results Report Version Detail Line -->
<record model="ir.ui.view" id="lims_results_report_version_detail_line_view_list">
<field name="model">lims.results_report.version.detail.line</field>
<field name="type">tree</field>
<field name="name">results_report_version_detail_line_list</field>
</record>
<record model="ir.ui.view" id="lims_results_report_version_detail_line_view_form">
<field name="model">lims.results_report.version.detail.line</field>
<field name="type">form</field>
<field name="name">results_report_version_detail_line_form</field>
</record>
<!-- Wizard Divide Reports -->
<record model="ir.ui.view" id="lims_divide_reports_result_view_form">
<field name="model">lims.divide_reports.result</field>
<field name="type">form</field>
<field name="name">service_divide_reports_result_form</field>
</record>
<record model="ir.ui.view" id="lims_divide_reports_process_view_form">
<field name="model">lims.divide_reports.process</field>
<field name="type">form</field>
<field name="name">service_divide_reports_process_form</field>
</record>
<record model="ir.ui.view" id="lims_divide_reports_detail_view_form">
<field name="model">lims.divide_reports.detail</field>
<field name="type">form</field>
<field name="name">service_divide_reports_detail_form</field>
</record>
<record model="ir.ui.view" id="lims_divide_reports_detail_view_list">
<field name="model">lims.divide_reports.detail</field>
<field name="type">tree</field>
<field name="name">service_divide_reports_detail_list</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_divide_reports">
<field name="name">Divide Reports</field>
<field name="wiz_name">lims.divide_reports</field>
</record>
<record model="ir.action.keyword" id="lims_divide_reports_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="wiz_lims_divide_reports"/>
</record>
<record model="ir.model.field.access" id="access_divide_reports_process_analysis_detail">
<field name="field"
search="[('name', '=', 'analysis_detail'), ('model.model', '=', 'lims.divide_reports.process')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<!-- Wizard Generate Results Reports -->
<record model="ir.ui.view" id="lims_generate_results_report_start_view_form">
<field name="model">lims.generate_results_report.start</field>
<field name="type">form</field>
<field name="name">generate_results_report_start_form</field>
</record>
<record model="ir.ui.view" id="lims_generate_results_report_empty_view_form">
<field name="model">lims.generate_results_report.empty</field>
<field name="type">form</field>
<field name="name">generate_results_report_empty_form</field>
</record>
<record model="ir.ui.view" id="lims_generate_results_report_result_aut_view_form">
<field name="model">lims.generate_results_report.result_aut</field>
<field name="type">form</field>
<field name="name">generate_results_report_result_aut_form</field>
</record>
<record model="ir.ui.view" id="lims_generate_results_report_result_man_view_form">
<field name="model">lims.generate_results_report.result_man</field>
<field name="type">form</field>
<field name="name">generate_results_report_result_man_form</field>
</record>
<record model="ir.ui.view" id="lims_generate_results_report_result_aut_notebook_view_list">
<field name="model">lims.generate_results_report.aut.notebook</field>
<field name="type">tree</field>
<field name="name">generate_results_report_result_aut_notebook_list</field>
</record>
<record model="ir.ui.view" id="lims_generate_results_report_result_aut_notebook_view_form">
<field name="model">lims.generate_results_report.aut.notebook</field>
<field name="type">form</field>
<field name="name">generate_results_report_result_aut_notebook_form</field>
</record>
<record model="ir.ui.view" id="lims_generate_results_report_result_aut_excluded_notebook_view_list">
<field name="model">lims.generate_results_report.aut.excluded_notebook</field>
<field name="type">tree</field>
<field name="name">generate_results_report_result_aut_excluded_notebook_list</field>
</record>
<record model="ir.ui.view" id="lims_generate_results_report_result_aut_excluded_notebook_view_form">
<field name="model">lims.generate_results_report.aut.excluded_notebook</field>
<field name="type">form</field>
<field name="name">generate_results_report_result_aut_excluded_notebook_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_generate_results_report">
<field name="name">Generate Reports</field>
<field name="wiz_name">lims.generate_results_report</field>
</record>
<record model="ir.ui.view" id="lims_notebook_line_generate_results_view_list">
<field name="model">lims.notebook.line</field>
<field name="type">tree</field>
<field name="name">notebook_line_generate_results_list</field>
</record>
<!-- Wizard Print Global Results Report -->
<record model="ir.action.wizard" id="wiz_lims_print_results_report">
<field name="name">Print Global Report</field>
<field name="wiz_name">lims.print_results_report</field>
</record>
<record model="ir.action.keyword" id="lims_print_results_report_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.results_report,-1</field>
<field name="action" ref="wiz_lims_print_results_report"/>
</record>
<!-- Wizard Service Results Report -->
<record model="ir.action.wizard" id="wiz_lims_service_results_report">
<field name="name">Service Results Reports</field>
<field name="wiz_name">lims.service.results_report</field>
</record>
<record model="ir.action.keyword" id="lims_service_results_report_keyword">
<field name="keyword">form_relate</field>
<field name="model">lims.service,-1</field>
<field name="action" ref="wiz_lims_service_results_report"/>
</record>
<!-- Wizard Fraction Results Report -->
<record model="ir.action.wizard" id="wiz_lims_fraction_results_report">
<field name="name">Fraction Results Reports</field>
<field name="wiz_name">lims.fraction.results_report</field>
</record>
<record model="ir.action.keyword" id="lims_fraction_results_report_keyword">
<field name="keyword">form_relate</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="wiz_lims_fraction_results_report"/>
</record>
<!-- Wizard Sample Results Report -->
<record model="ir.action.wizard" id="wiz_lims_sample_results_report">
<field name="name">Sample Results Reports</field>
<field name="wiz_name">lims.sample.results_report</field>
</record>
<record model="ir.action.keyword" id="lims_sample_results_report_keyword">
<field name="keyword">form_relate</field>
<field name="model">lims.sample,-1</field>
<field name="action" ref="wiz_lims_sample_results_report"/>
</record>
<!-- Wizard Results Report Sample -->
<record model="ir.action.wizard" id="wiz_lims_results_report_sample">
<field name="name">Results Report Samples</field>
<field name="wiz_name">lims.results_report.sample</field>
</record>
<record model="ir.action.keyword" id="lims_results_report_sample_keyword">
<field name="keyword">form_relate</field>
<field name="model">lims.results_report,-1</field>
<field name="action" ref="wiz_lims_results_report_sample"/>
</record>
<!-- Wizard Report Annulation -->
<record model="ir.ui.view" id="lims_results_report_annulation_start_view_form">
<field name="model">lims.results_report_annulation.start</field>
<field name="type">form</field>
<field name="name">results_report_annulation_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_results_report_annulation">
<field name="name">Report Annulation</field>
<field name="wiz_name">lims.results_report_annulation</field>
</record>
<!-- Results Report -->
<record model="ir.action.report" id="report_results_report">
<field name="name">Results Report</field>
<field name="model">lims.results_report.version.detail</field>
<field name="report_name">lims.result_report</field>
<field name="report">lims/report/results_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_results_report_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.results_report.version.detail,-1</field>
<field name="action" ref="report_results_report"/>
</record>
<!-- Transcription Results Report -->
<record model="ir.action.report" id="report_results_report_transcription">
<field name="name">Transcription Results Report</field>
<field name="model">lims.results_report.version.detail</field>
<field name="report_name">lims.result_report.transcription</field>
<field name="report">lims/report/results_report.odt</field>
</record>
<record model="ir.action.keyword" id="report_results_report_transcription_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.results_report.version.detail,-1</field>
<field name="action" ref="report_results_report_transcription"/>
</record>
<!-- Global Results Report -->
<record model="ir.action.report" id="report_global_results_report">
<field name="name">Global Results Report</field>
<field name="model"></field>
<field name="report_name">lims.global_result_report</field>
<field name="report">lims/report/global_results_report.odt</field>
</record>
<menuitem name="Results reports" parent="lims_laboratory"
id="lims_laboratory_reports" sequence="30"
icon="lims-laboratory_reports"/>
<menuitem parent="lims_laboratory_reports" action="act_lims_results_report"
id="lims_results_report_menu" sequence="10"
icon="lims-laboratory_reports"/>
<menuitem parent="lims_laboratory_reports" action="wiz_lims_generate_results_report"
id="lims_generate_results_report_menu" sequence="20"
icon="lims-generate_results_report"/>
<menuitem parent="lims_laboratory_reports" action="act_lims_results_report_version_detail"
id="lims_results_report_version_detail_menu" sequence="30"
icon="lims-results_report_version_detail"/>
<record model="ir.model.access" id="access_results_report">
<field name="model" search="[('model', '=', 'lims.results_report')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_results_report_group_laboratory_reports">
<field name="model" search="[('model', '=', 'lims.results_report')]"/>
<field name="group" ref="group_lims_laboratory_reports"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_results_report_version_detail">
<field name="model" search="[('model', '=', 'lims.results_report.version.detail')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_results_report_version_detail_group_laboratory_reports">
<field name="model" search="[('model', '=', 'lims.results_report.version.detail')]"/>
<field name="group" ref="group_lims_laboratory_reports"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.button" id="results_report_version_detail_revise_button">
<field name="name">revise</field>
<field name="model" search="[('model', '=', 'lims.results_report.version.detail')]"/>
</record>
<record model="ir.model.button-res.group" id="results_report_version_detail_revise_button_group_lims_laboratory_reports">
<field name="button" ref="results_report_version_detail_revise_button"/>
<field name="group" ref="group_lims_laboratory_reports"/>
</record>
<record model="ir.model.button" id="results_report_version_detail_annul_button">
<field name="name">annul</field>
<field name="model" search="[('model', '=', 'lims.results_report.version.detail')]"/>
</record>
<record model="ir.model.button-res.group" id="results_report_version_detail_annul_button_group_lims_laboratory_reports">
<field name="button" ref="results_report_version_detail_annul_button"/>
<field name="group" ref="group_lims_laboratory_reports"/>
</record>
<record model="ir.model.button" id="results_report_version_detail_revise_all_lang_button">
<field name="name">revise_all_lang</field>
<field name="model" search="[('model', '=', 'lims.results_report.version.detail')]"/>
</record>
<record model="ir.model.button-res.group" id="results_report_version_detail_revise_all_lang_button_group_lims_laboratory_reports">
<field name="button" ref="results_report_version_detail_revise_all_lang_button"/>
<field name="group" ref="group_lims_laboratory_reports"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_laboratory_reports_readonly">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_laboratory_reports_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_lims_group_laboratory_reports">
<field name="menu" ref="lims_menu"/>
<field name="group" ref="group_lims_laboratory_reports"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_group_laboratory_reports_readonly">
<field name="menu" ref="lims_laboratory"/>
<field name="group" ref="group_lims_laboratory_reports_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_group_laboratory_reports">
<field name="menu" ref="lims_laboratory"/>
<field name="group" ref="group_lims_laboratory_reports"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_reports_group_laboratory_reports_readonly">
<field name="menu" ref="lims_laboratory_reports"/>
<field name="group" ref="group_lims_laboratory_reports_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_laboratory_reports_group_laboratory_reports">
<field name="menu" ref="lims_laboratory_reports"/>
<field name="group" ref="group_lims_laboratory_reports"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_results_report_group_laboratory_reports_readonly">
<field name="menu" ref="lims_results_report_menu"/>
<field name="group" ref="group_lims_laboratory_reports_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_results_report_group_laboratory_reports">
<field name="menu" ref="lims_results_report_menu"/>
<field name="group" ref="group_lims_laboratory_reports"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_generate_results_report_group_laboratory_reports">
<field name="menu" ref="lims_generate_results_report_menu"/>
<field name="group" ref="group_lims_laboratory_reports"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_results_report_version_detail_group_laboratory_reports_readonly">
<field name="menu" ref="lims_results_report_version_detail_menu"/>
<field name="group" ref="group_lims_laboratory_reports_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_results_report_version_detail_group_laboratory_reports">
<field name="menu" ref="lims_results_report_version_detail_menu"/>
<field name="group" ref="group_lims_laboratory_reports"/>
</record>
<record model="ir.action-res.group"
id="wiz_notebook_accept_lines-group_laboratory_results_acceptance">
<field name="action" ref="wiz_lims_notebook_accept_lines"/>
<field name="group" ref="group_lims_laboratory_results_acceptance"/>
</record>
<record model="ir.action-res.group"
id="wiz_notebook_line_accept_lines-group_laboratory_results_acceptance">
<field name="action" ref="wiz_lims_notebook_line_accept_lines"/>
<field name="group" ref="group_lims_laboratory_results_acceptance"/>
</record>
<record model="ir.action-res.group"
id="wiz_notebook_line_unaccept_lines-group_laboratory_results_acceptance">
<field name="action" ref="wiz_lims_notebook_line_unaccept_lines"/>
<field name="group" ref="group_lims_laboratory_results_acceptance"/>
</record>
</data>
</tryton>

5123
lims/sample.py Normal file

File diff suppressed because it is too large Load Diff

974
lims/sample.xml Normal file
View File

@ -0,0 +1,974 @@
<?xml version="1.0"?>
<tryton>
<data>
<!-- Sequences for Sample -->
<record model="ir.sequence.type" id="seq_type_sample">
<field name="name">Sample</field>
<field name="code">lims.sample</field>
</record>
<record model="ir.sequence.type-res.group"
id="seq_type_sample_group_admin">
<field name="sequence_type" ref="seq_type_sample"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.sequence" id="seq_sample">
<field name="name">Sample</field>
<field name="code">lims.sample</field>
<field eval="7" name="padding"/>
</record>
<!-- Sequences for Service -->
<record model="ir.sequence.type" id="seq_type_service">
<field name="name">Service</field>
<field name="code">lims.service</field>
</record>
<record model="ir.sequence.type-res.group"
id="seq_type_service_group_admin">
<field name="sequence_type" ref="seq_type_service"/>
<field name="group" ref="res.group_admin"/>
</record>
<record model="ir.sequence" id="seq_service">
<field name="name">Service</field>
<field name="code">lims.service</field>
<field eval="8" name="padding"/>
</record>
<!-- Packaging Type -->
<record model="ir.ui.view" id="lims_packaging_type_view_form">
<field name="model">lims.packaging.type</field>
<field name="type">form</field>
<field name="name">packaging_type_form</field>
</record>
<record model="ir.ui.view" id="lims_packaging_type_view_list">
<field name="model">lims.packaging.type</field>
<field name="type">tree</field>
<field name="name">packaging_type_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_packaging_type_list">
<field name="name">Packaging Types</field>
<field name="res_model">lims.packaging.type</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_packaging_type_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_packaging_type_view_list"/>
<field name="act_window" ref="act_lims_packaging_type_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_packaging_type_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_packaging_type_view_form"/>
<field name="act_window" ref="act_lims_packaging_type_list"/>
</record>
<!-- Fraction Type -->
<record model="ir.ui.view" id="lims_fraction_type_view_form">
<field name="model">lims.fraction.type</field>
<field name="type">form</field>
<field name="name">fraction_type_form</field>
</record>
<record model="ir.ui.view" id="lims_fraction_type_view_list">
<field name="model">lims.fraction.type</field>
<field name="type">tree</field>
<field name="name">fraction_type_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_fraction_type_list">
<field name="name">Fraction Types</field>
<field name="res_model">lims.fraction.type</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_fraction_type_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_fraction_type_view_list"/>
<field name="act_window" ref="act_lims_fraction_type_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_fraction_type_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_fraction_type_view_form"/>
<field name="act_window" ref="act_lims_fraction_type_list"/>
</record>
<!-- Service -->
<record model="ir.ui.view" id="lims_service_view_form">
<field name="model">lims.service</field>
<field name="type">form</field>
<field name="name">service_form</field>
</record>
<record model="ir.ui.view" id="lims_service_view_list">
<field name="model">lims.service</field>
<field name="type">tree</field>
<field name="name">service_list</field>
</record>
<record model="ir.ui.view" id="lims_service2_view_list">
<field name="model">lims.service</field>
<field name="type">tree</field>
<field name="name">service2_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_service_list">
<field name="name">Services</field>
<field name="res_model">lims.service</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_service_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_service_view_list"/>
<field name="act_window" ref="act_lims_service_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_service_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_service_view_form"/>
<field name="act_window" ref="act_lims_service_list"/>
</record>
<record model="ir.model.field.access" id="access_lims_service_analysis_detail">
<field name="field"
search="[('name', '=', 'analysis_detail'), ('model.model', '=', 'lims.service')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<!-- Fraction -->
<record model="ir.ui.view" id="lims_fraction_view_form">
<field name="model">lims.fraction</field>
<field name="type">form</field>
<field name="name">fraction_form</field>
</record>
<record model="ir.ui.view" id="lims_fraction_view_list">
<field name="model">lims.fraction</field>
<field name="type">tree</field>
<field name="name">fraction_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_fraction_list">
<field name="name">Fractions</field>
<field name="res_model">lims.fraction</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_fraction_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_fraction_view_list"/>
<field name="act_window" ref="act_lims_fraction_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_fraction_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_fraction_view_form"/>
<field name="act_window" ref="act_lims_fraction_list"/>
</record>
<!-- Sample -->
<record model="ir.ui.view" id="lims_sample_view_form">
<field name="model">lims.sample</field>
<field name="type">form</field>
<field name="name">sample_form</field>
</record>
<record model="ir.ui.view" id="lims_sample_view_list">
<field name="model">lims.sample</field>
<field name="type">tree</field>
<field name="name">sample_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_sample_list">
<field name="name">Samples</field>
<field name="res_model">lims.sample</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_sample_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_sample_view_list"/>
<field name="act_window" ref="act_lims_sample_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_sample_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_sample_view_form"/>
<field name="act_window" ref="act_lims_sample_list"/>
</record>
<!-- Zone -->
<record model="ir.ui.view" id="lims_zone_view_form">
<field name="model">lims.zone</field>
<field name="type">form</field>
<field name="name">zone_form</field>
</record>
<record model="ir.ui.view" id="lims_zone_view_list">
<field name="model">lims.zone</field>
<field name="type">tree</field>
<field name="name">zone_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_zone_list">
<field name="name">Zones/Regions</field>
<field name="res_model">lims.zone</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_zone_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_zone_view_list"/>
<field name="act_window" ref="act_lims_zone_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_zone_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_zone_view_form"/>
<field name="act_window" ref="act_lims_zone_list"/>
</record>
<!-- Variety -->
<record model="ir.ui.view" id="lims_variety_view_form">
<field name="model">lims.variety</field>
<field name="type">form</field>
<field name="name">variety_form</field>
</record>
<record model="ir.ui.view" id="lims_variety_view_list">
<field name="model">lims.variety</field>
<field name="type">tree</field>
<field name="name">variety_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_variety_list">
<field name="name">Varieties</field>
<field name="res_model">lims.variety</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_variety_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_variety_view_list"/>
<field name="act_window" ref="act_lims_variety_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_variety_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_variety_view_form"/>
<field name="act_window" ref="act_lims_variety_list"/>
</record>
<!-- Matrix Variety -->
<record model="ir.ui.view" id="lims_matrix_variety_view_form">
<field name="model">lims.matrix.variety</field>
<field name="type">form</field>
<field name="name">matrix_variety_form</field>
</record>
<record model="ir.ui.view" id="lims_matrix_variety_view_list">
<field name="model">lims.matrix.variety</field>
<field name="type">tree</field>
<field name="name">matrix_variety_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_matrix_variety_list">
<field name="name">Product Type - Matrix - Variety</field>
<field name="res_model">lims.matrix.variety</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_matrix_variety_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_matrix_variety_view_list"/>
<field name="act_window" ref="act_lims_matrix_variety_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_matrix_variety_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_matrix_variety_view_form"/>
<field name="act_window" ref="act_lims_matrix_variety_list"/>
</record>
<!-- Packaging Integrity -->
<record model="ir.ui.view" id="lims_packaging_integrity_view_form">
<field name="model">lims.packaging.integrity</field>
<field name="type">form</field>
<field name="name">packaging_integrity_form</field>
</record>
<record model="ir.ui.view" id="lims_packaging_integrity_view_list">
<field name="model">lims.packaging.integrity</field>
<field name="type">tree</field>
<field name="name">packaging_integrity_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_packaging_integrity_list">
<field name="name">Packaging Integrities</field>
<field name="res_model">lims.packaging.integrity</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_packaging_integrity_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_packaging_integrity_view_list"/>
<field name="act_window" ref="act_lims_packaging_integrity_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_packaging_integrity_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_packaging_integrity_view_form"/>
<field name="act_window" ref="act_lims_packaging_integrity_list"/>
</record>
<!-- Sample actions related -->
<record model="ir.action.act_window" id="act_lims_fraction_related2">
<field name="name">1. Fractions</field>
<field name="res_model">lims.fraction</field>
<field name="domain" eval="[('sample', 'in', Eval('active_ids'))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_fraction_keyword2">
<field name="keyword">form_relate</field>
<field name="model">lims.sample,-1</field>
<field name="action" ref="act_lims_fraction_related2"/>
</record>
<record model="ir.action.act_window" id="act_lims_service_related2">
<field name="name">2. Services</field>
<field name="res_model">lims.service</field>
<field name="domain" eval="[('sample', 'in', Eval('active_ids'))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_service_keyword2">
<field name="keyword">form_relate</field>
<field name="model">lims.sample,-1</field>
<field name="action" ref="act_lims_service_related2"/>
</record>
<record model="ir.action.act_window" id="act_lims_entry_detail_analysis_related2">
<field name="name">3. Entry Detail Analysis</field>
<field name="res_model">lims.entry.detail.analysis</field>
<field name="domain" eval="[('sample', 'in', Eval('active_ids'))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_entry_detail_analysis_keyword2">
<field name="keyword">form_relate</field>
<field name="model">lims.sample,-1</field>
<field name="action" ref="act_lims_entry_detail_analysis_related2"/>
</record>
<!-- Fraction actions related -->
<record model="ir.action.act_window" id="act_lims_service_related3">
<field name="name">1. Services</field>
<field name="res_model">lims.service</field>
<field name="domain" eval="[('fraction', 'in', Eval('active_ids'))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_service_keyword3">
<field name="keyword">form_relate</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="act_lims_service_related3"/>
</record>
<record model="ir.action.act_window" id="act_lims_entry_detail_analysis_related3">
<field name="name">2. Entry Detail Analysis</field>
<field name="res_model">lims.entry.detail.analysis</field>
<field name="domain" eval="[('fraction', 'in', Eval('active_ids'))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_entry_detail_analysis_keyword3">
<field name="keyword">form_relate</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="act_lims_entry_detail_analysis_related3"/>
</record>
<!-- Service actions related -->
<record model="ir.action.act_window" id="act_lims_entry_detail_analysis_related4">
<field name="name">1. Entry Detail Analysis</field>
<field name="res_model">lims.entry.detail.analysis</field>
<field name="domain" eval="[('service', 'in', Eval('active_ids'))]" pyson="1"/>
</record>
<record model="ir.action.keyword" id="act_open_entry_detail_analysis_keyword4">
<field name="keyword">form_relate</field>
<field name="model">lims.service,-1</field>
<field name="action" ref="act_lims_entry_detail_analysis_related4"/>
</record>
<!-- Wizard Copy Sample -->
<record model="ir.ui.view" id="lims_duplicate_sample_start_view_form">
<field name="model">lims.sample.duplicate.start</field>
<field name="type">form</field>
<field name="name">sample_duplicate_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_duplicate_sample">
<field name="name">Copy Sample</field>
<field name="wiz_name">lims.sample.duplicate</field>
</record>
<record model="ir.action.keyword" id="lims_duplicate_sample_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.sample,-1</field>
<field name="action" ref="wiz_lims_duplicate_sample"/>
</record>
<!-- Wizard Copy Sample From Entry -->
<record model="ir.ui.view" id="lims_duplicate_sample_from_entry_start_view_form">
<field name="model">lims.entry.duplicate_sample.start</field>
<field name="type">form</field>
<field name="name">entry_duplicate_sample_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_duplicate_sample_from_entry">
<field name="name">Copy Sample</field>
<field name="wiz_name">lims.entry.duplicate_sample</field>
</record>
<record model="ir.action.keyword" id="lims_duplicate_sample_from_entry_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.entry,-1</field>
<field name="action" ref="wiz_lims_duplicate_sample_from_entry"/>
</record>
<!-- Wizard Manage Services -->
<record model="ir.ui.view" id="lims_manage_services_view_form">
<field name="model">lims.fraction</field>
<field name="type">form</field>
<field name="name">fraction_manage_services_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_manage_services">
<field name="name">Manage Services</field>
<field name="wiz_name">lims.manage_services</field>
</record>
<!-- Wizard Complete Services -->
<record model="ir.action.wizard" id="wiz_lims_complete_services">
<field name="name">Complete Services</field>
<field name="wiz_name">lims.complete_services</field>
</record>
<!-- Fractions by Locations -->
<record model="ir.action.act_window" id="act_lims_fractions_by_locations">
<field name="name">Fractions</field>
<field name="res_model">lims.fraction</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_fractions_by_locations_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_fraction_view_list"/>
<field name="act_window" ref="act_lims_fractions_by_locations"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_fractions_by_locations_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_fraction_view_form"/>
<field name="act_window" ref="act_lims_fractions_by_locations"/>
</record>
<record model="ir.ui.view" id="fractions_by_locations_start_view_form">
<field name="model">lims.fractions_by_locations.start</field>
<field name="type">form</field>
<field name="name">fractions_by_locations_start_form</field>
</record>
<record model="ir.action.wizard" id="wizard_fractions_by_locations">
<field name="name">Fractions by Locations</field>
<field name="wiz_name">lims.fractions_by_locations</field>
</record>
<!-- Wizard Countersamples Storage -->
<record model="ir.ui.view" id="lims_countersample_storage_start_view_form">
<field name="model">lims.countersample.storage.start</field>
<field name="type">form</field>
<field name="name">countersample_storage_start_form</field>
</record>
<record model="ir.ui.view" id="lims_countersample_storage_empty_view_form">
<field name="model">lims.countersample.storage.empty</field>
<field name="type">form</field>
<field name="name">countersample_storage_empty_form</field>
</record>
<record model="ir.ui.view" id="lims_countersample_storage_result_view_form">
<field name="model">lims.countersample.storage.result</field>
<field name="type">form</field>
<field name="name">countersample_storage_result_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_countersample_storage">
<field name="name">Countersamples Storage</field>
<field name="wiz_name">lims.countersample.storage</field>
</record>
<record model="ir.action.keyword" id="lims_countersample_storage_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="wiz_lims_countersample_storage"/>
</record>
<!-- Wizard Revert Countersamples Storage -->
<record model="ir.ui.view" id="lims_countersample_storage_revert_start_view_form">
<field name="model">lims.countersample.storage_revert.start</field>
<field name="type">form</field>
<field name="name">countersample_storage_revert_start_form</field>
</record>
<record model="ir.ui.view" id="lims_countersample_storage_revert_empty_view_form">
<field name="model">lims.countersample.storage_revert.empty</field>
<field name="type">form</field>
<field name="name">countersample_storage_revert_empty_form</field>
</record>
<record model="ir.ui.view" id="lims_countersample_storage_revert_result_view_form">
<field name="model">lims.countersample.storage_revert.result</field>
<field name="type">form</field>
<field name="name">countersample_storage_revert_result_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_countersample_storage_revert">
<field name="name">Revert Countersamples Storage</field>
<field name="wiz_name">lims.countersample.storage_revert</field>
</record>
<record model="ir.action.keyword" id="lims_countersample_storage_revert_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="wiz_lims_countersample_storage_revert"/>
</record>
<!-- Wizard Countersamples Discharge -->
<record model="ir.ui.view" id="lims_countersample_discharge_start_view_form">
<field name="model">lims.countersample.discharge.start</field>
<field name="type">form</field>
<field name="name">countersample_discharge_start_form</field>
</record>
<record model="ir.ui.view" id="lims_countersample_discharge_empty_view_form">
<field name="model">lims.countersample.discharge.empty</field>
<field name="type">form</field>
<field name="name">countersample_discharge_empty_form</field>
</record>
<record model="ir.ui.view" id="lims_countersample_discharge_result_view_form">
<field name="model">lims.countersample.discharge.result</field>
<field name="type">form</field>
<field name="name">countersample_discharge_result_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_countersample_discharge">
<field name="name">Countersamples Discharge</field>
<field name="wiz_name">lims.countersample.discharge</field>
</record>
<record model="ir.action.keyword" id="lims_countersample_discharge_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="wiz_lims_countersample_discharge"/>
</record>
<!-- Wizard Fractions Discharge -->
<record model="ir.ui.view" id="lims_fraction_discharge_start_view_form">
<field name="model">lims.fraction.discharge.start</field>
<field name="type">form</field>
<field name="name">fraction_discharge_start_form</field>
</record>
<record model="ir.ui.view" id="lims_fraction_discharge_empty_view_form">
<field name="model">lims.fraction.discharge.empty</field>
<field name="type">form</field>
<field name="name">fraction_discharge_empty_form</field>
</record>
<record model="ir.ui.view" id="lims_fraction_discharge_result_view_form">
<field name="model">lims.fraction.discharge.result</field>
<field name="type">form</field>
<field name="name">fraction_discharge_result_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_fraction_discharge">
<field name="name">Fractions Discharge</field>
<field name="wiz_name">lims.fraction.discharge</field>
</record>
<record model="ir.action.keyword" id="lims_fraction_discharge_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="wiz_lims_fraction_discharge"/>
</record>
<!-- Wizard Revert Fractions Discharge -->
<record model="ir.ui.view" id="lims_fraction_discharge_revert_start_view_form">
<field name="model">lims.fraction.discharge_revert.start</field>
<field name="type">form</field>
<field name="name">fraction_discharge_revert_start_form</field>
</record>
<record model="ir.ui.view" id="lims_fraction_discharge_revert_empty_view_form">
<field name="model">lims.fraction.discharge_revert.empty</field>
<field name="type">form</field>
<field name="name">fraction_discharge_revert_empty_form</field>
</record>
<record model="ir.ui.view" id="lims_fraction_discharge_revert_result_view_form">
<field name="model">lims.fraction.discharge_revert.result</field>
<field name="type">form</field>
<field name="name">fraction_discharge_revert_result_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_fraction_discharge_revert">
<field name="name">Revert Fractions Discharge</field>
<field name="wiz_name">lims.fraction.discharge_revert</field>
</record>
<record model="ir.action.keyword" id="lims_fraction_discharge_revert_keyword">
<field name="keyword">form_action</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="wiz_lims_fraction_discharge_revert"/>
</record>
<!-- Wizard Create Sample -->
<record model="ir.ui.view" id="lims_create_sample_start_view_form">
<field name="model">lims.create_sample.start</field>
<field name="type">form</field>
<field name="name">create_sample_start_form</field>
</record>
<record model="ir.ui.view" id="lims_create_sample_service_view_list">
<field name="model">lims.create_sample.service</field>
<field name="type">tree</field>
<field name="name">create_sample_service_list</field>
</record>
<record model="ir.ui.view" id="lims_create_sample_service_view_form">
<field name="model">lims.create_sample.service</field>
<field name="type">form</field>
<field name="name">create_sample_service_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_create_sample">
<field name="name">Enter Samples</field>
<field name="wiz_name">lims.create_sample</field>
</record>
<!-- Sample Labels Printer -->
<record model="ir.action.wizard" id="wiz_report_sample_labels_printer">
<field name="name">Sample Labels Printer</field>
<field name="wiz_name">lims.sample.labels.printer.report</field>
<field name="model">lims.sample</field>
</record>
<record model="ir.action.keyword"
id="wiz_report_sample_labels_printer_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.sample,-1</field>
<field name="action" ref="wiz_report_sample_labels_printer"/>
</record>
<!-- Countersamples Storage Report -->
<record model="ir.ui.view" id="lims_countersample_storage_print_start_view_form">
<field name="model">lims.countersample.storage.print.start</field>
<field name="type">form</field>
<field name="name">countersample_storage_print_start_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_countersample_storage_print">
<field name="name">Countersamples Storage Report</field>
<field name="wiz_name">lims.countersample.storage.print</field>
</record>
<record model="ir.action.report" id="report_countersample_storage">
<field name="name">Countersamples Storage Report</field>
<!-- <field name="model">lims.fraction</field> -->
<field name="report_name">lims.countersample.storage.report</field>
<field name="report">lims/report/countersample_storage_report.odt</field>
</record>
<record model="ir.action.keyword" id="lims_countersample_storage_print_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="wiz_lims_countersample_storage_print"/>
</record>
<!-- Countersamples Discharge Report -->
<record model="ir.ui.view" id="lims_countersample_discharge_print_start_view_form">
<field name="model">lims.countersample.discharge.print.start</field>
<field name="type">form</field>
<field name="name">countersample_discharge_print_start_form</field>
</record>
<record model="ir.action.wizard" id="wiz_lims_countersample_discharge_print">
<field name="name">Countersamples Discharge Report</field>
<field name="wiz_name">lims.countersample.discharge.print</field>
</record>
<record model="ir.action.report" id="report_countersample_discharge">
<field name="name">Countersamples Discharge Report</field>
<!-- <field name="model">lims.fraction</field> -->
<field name="report_name">lims.countersample.discharge.report</field>
<field name="report">lims/report/countersample_discharge_report.odt</field>
</record>
<record model="ir.action.keyword" id="lims_countersample_discharge_print_keyword">
<field name="keyword">form_print</field>
<field name="model">lims.fraction,-1</field>
<field name="action" ref="wiz_lims_countersample_discharge_print"/>
</record>
<menuitem parent="lims_config_base_tables" action="act_lims_fraction_type_list"
id="lims_fraction_type_menu" sequence="70"/>
<menuitem parent="lims_config_entry" action="act_lims_packaging_type_list"
id="lims_packaging_type_menu" sequence="10"/>
<menuitem parent="lims_config_entry" action="act_lims_packaging_integrity_list"
id="lims_packaging_integrity_menu" sequence="20"/>
<menuitem parent="lims_config_entry" action="act_lims_variety_list"
id="lims_variety_menu" sequence="30"/>
<menuitem parent="lims_config_entry" action="act_lims_zone_list"
id="lims_zone_menu" sequence="40"/>
<menuitem parent="lims_entry_board_menu" action="act_lims_sample_list"
id="lims_sample_menu" sequence="30"/>
<menuitem parent="lims_entry_board_menu" action="act_lims_fraction_list"
id="lims_fraction_menu" sequence="40"/>
<menuitem parent="lims_fraction_menu" action="wizard_fractions_by_locations"
id="lims_fractions_by_locations_menu" sequence="10"/>
<menuitem parent="lims_entry_board_menu" action="act_lims_service_list"
id="lims_service_menu" sequence="50"/>
<menuitem parent="lims_entry_board_menu" action="act_lims_entry_detail_analysis_list"
id="lims_entry_detail_analysis_menu" sequence="60"/>
<record model="ir.model.access" id="access_packaging_type">
<field name="model" search="[('model', '=', 'lims.packaging.type')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_packaging_type_group_conf_entry_admin">
<field name="model" search="[('model', '=', 'lims.packaging.type')]"/>
<field name="group" ref="group_lims_conf_entry_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_packaging_integrity">
<field name="model" search="[('model', '=', 'lims.packaging.integrity')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_packaging_integrity_group_conf_entry_admin">
<field name="model" search="[('model', '=', 'lims.packaging.integrity')]"/>
<field name="group" ref="group_lims_conf_entry_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_variety">
<field name="model" search="[('model', '=', 'lims.variety')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_variety_group_conf_entry_admin">
<field name="model" search="[('model', '=', 'lims.variety')]"/>
<field name="group" ref="group_lims_conf_entry_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_zone">
<field name="model" search="[('model', '=', 'lims.zone')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_zone_group_conf_entry_admin">
<field name="model" search="[('model', '=', 'lims.zone')]"/>
<field name="group" ref="group_lims_conf_entry_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_fraction_type">
<field name="model" search="[('model', '=', 'lims.fraction.type')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_fraction_type_group_conf_base_tables_admin">
<field name="model" search="[('model', '=', 'lims.fraction.type')]"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_sample">
<field name="model" search="[('model', '=', 'lims.sample')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_sample_group_entry_update">
<field name="model" search="[('model', '=', 'lims.sample')]"/>
<field name="group" ref="group_lims_entry_update"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_sample_group_entry">
<field name="model" search="[('model', '=', 'lims.sample')]"/>
<field name="group" ref="group_lims_entry"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_fraction">
<field name="model" search="[('model', '=', 'lims.fraction')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_fraction_group_entry_update">
<field name="model" search="[('model', '=', 'lims.fraction')]"/>
<field name="group" ref="group_lims_entry_update"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_fraction_group_entry">
<field name="model" search="[('model', '=', 'lims.fraction')]"/>
<field name="group" ref="group_lims_entry"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_service">
<field name="model" search="[('model', '=', 'lims.service')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_service_group_entry_update">
<field name="model" search="[('model', '=', 'lims.service')]"/>
<field name="group" ref="group_lims_entry_update"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_service_group_entry">
<field name="model" search="[('model', '=', 'lims.service')]"/>
<field name="group" ref="group_lims_entry"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_sample_group_entry_readonly">
<field name="menu" ref="lims_sample_menu"/>
<field name="group" ref="group_lims_entry_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_sample_group_entry_update">
<field name="menu" ref="lims_sample_menu"/>
<field name="group" ref="group_lims_entry_update"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_sample_group_entry">
<field name="menu" ref="lims_sample_menu"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_fraction_group_entry_readonly">
<field name="menu" ref="lims_fraction_menu"/>
<field name="group" ref="group_lims_entry_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_fraction_group_entry_update">
<field name="menu" ref="lims_fraction_menu"/>
<field name="group" ref="group_lims_entry_update"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_fraction_group_entry">
<field name="menu" ref="lims_fraction_menu"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_fractions_by_locations_group_entry_readonly">
<field name="menu" ref="lims_fractions_by_locations_menu"/>
<field name="group" ref="group_lims_entry_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_fractions_by_locations_group_entry">
<field name="menu" ref="lims_fractions_by_locations_menu"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_service_group_entry_readonly">
<field name="menu" ref="lims_service_menu"/>
<field name="group" ref="group_lims_entry_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_service_group_entry_update">
<field name="menu" ref="lims_service_menu"/>
<field name="group" ref="group_lims_entry_update"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_service_group_entry">
<field name="menu" ref="lims_service_menu"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_entry_detail_analysis_group_entry_readonly">
<field name="menu" ref="lims_entry_detail_analysis_menu"/>
<field name="group" ref="group_lims_entry_readonly"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_entry_detail_analysis_group_entry_update">
<field name="menu" ref="lims_entry_detail_analysis_menu"/>
<field name="group" ref="group_lims_entry_update"/>
</record>
<record model="ir.ui.menu-res.group" id="menu_entry_detail_analysis_group_entry">
<field name="menu" ref="lims_entry_detail_analysis_menu"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.model.button" id="fraction_load_services_button">
<field name="name">load_services</field>
<field name="model" search="[('model', '=', 'lims.fraction')]"/>
</record>
<record model="ir.model.button-res.group" id="fraction_load_services_button_group_blind_sample">
<field name="button" ref="fraction_load_services_button"/>
<field name="group" ref="group_lims_blind_sample"/>
</record>
<record model="ir.model.button" id="fraction_manage_services_button">
<field name="name">manage_services</field>
<field name="model" search="[('model', '=', 'lims.fraction')]"/>
</record>
<record model="ir.model.button-res.group" id="fraction_manage_services_button_group_lims_entry">
<field name="button" ref="fraction_manage_services_button"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.model.button-res.group" id="fraction_manage_services_button_group_lims_entry_update">
<field name="button" ref="fraction_manage_services_button"/>
<field name="group" ref="group_lims_entry_update"/>
</record>
<record model="ir.model.button" id="fraction_complete_services_button">
<field name="name">complete_services</field>
<field name="model" search="[('model', '=', 'lims.fraction')]"/>
</record>
<record model="ir.model.button-res.group" id="fraction_complete_services_button_group_lims_entry">
<field name="button" ref="fraction_complete_services_button"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.model.button-res.group" id="fraction_complete_services_button_group_lims_entry_update">
<field name="button" ref="fraction_complete_services_button"/>
<field name="group" ref="group_lims_entry_update"/>
</record>
<record model="ir.model.button" id="fraction_confirm_button">
<field name="name">confirm</field>
<field name="model" search="[('model', '=', 'lims.fraction')]"/>
</record>
<record model="ir.model.button-res.group" id="fraction_confirm_button_group_lims_entry">
<field name="button" ref="fraction_confirm_button"/>
<field name="group" ref="group_lims_entry"/>
</record>
<record model="ir.model.button-res.group" id="fraction_confirm_button_group_lims_entry_update">
<field name="button" ref="fraction_confirm_button"/>
<field name="group" ref="group_lims_entry_update"/>
</record>
</data>
</tryton>

File diff suppressed because it is too large Load Diff

View File

@ -4,11 +4,11 @@
# the full copyright notices and license terms.
from trytond.model import fields
from trytond.pyson import In, Eval, Bool
from trytond.pyson import In, Eval, Bool, If
from trytond.pool import Pool, PoolMeta
from trytond.transaction import Transaction
__all__ = ['Location', 'Move', 'ShipmentInternal', 'InventoryLine']
__all__ = ['Location', 'Move', 'ShipmentInternal']
class Location:
@ -35,11 +35,12 @@ class Move:
fraction = fields.Many2One('lims.fraction', 'Fraction', select=True,
ondelete='CASCADE', states={
'readonly': (In(Eval('state'), ['cancel', 'assigned', 'done'])
| Bool(Eval('fraction_readonly')))},
domain=['OR',
('current_location', '=', Eval('from_location')),
('id', '=', Eval('fraction')),
'readonly': (In(Eval('state'), ['cancel', 'assigned', 'done']) |
Bool(Eval('fraction_readonly')))},
domain=[
If(~Eval('fraction'),
('current_location', '=', Eval('from_location')),
('id', '=', Eval('fraction'))),
],
depends=['state', 'fraction_readonly', 'from_location'])
fraction_readonly = fields.Function(fields.Boolean('Fraction Read Only'),
@ -65,9 +66,9 @@ class Move:
return True
if not self.product or self.product != config.fraction_product:
return True
if (self.from_location and self.to_location
and self.from_location.type == 'storage'
and self.to_location.type == 'storage'):
if (self.from_location and self.to_location and
self.from_location.type == 'storage' and
self.to_location.type == 'storage'):
return False
return True
@ -87,6 +88,16 @@ class ShipmentInternal:
return super(ShipmentInternal, cls).copy(shipments,
default=default)
@classmethod
def _sync_moves(cls, shipments):
with Transaction().set_context(check_current_location=False):
super(ShipmentInternal, cls)._sync_moves(shipments)
@classmethod
def _set_transit(cls, shipments):
with Transaction().set_context(check_current_location=False):
super(ShipmentInternal, cls)._set_transit(shipments)
@classmethod
def draft(cls, shipments):
with Transaction().set_context(check_current_location=False):
@ -97,6 +108,11 @@ class ShipmentInternal:
with Transaction().set_context(check_current_location=False):
super(ShipmentInternal, cls).wait(shipments)
@classmethod
def ship(cls, shipments):
with Transaction().set_context(check_current_location=False):
super(ShipmentInternal, cls).ship(shipments)
@classmethod
def done(cls, shipments):
with Transaction().set_context(check_current_location=False):
@ -116,30 +132,3 @@ class ShipmentInternal:
def assign_force(cls, shipments):
with Transaction().set_context(check_current_location=False):
super(ShipmentInternal, cls).assign_force(shipments)
class InventoryLine:
__name__ = 'stock.inventory.line'
__metaclass__ = PoolMeta
account_move = fields.Function(fields.Many2One('account.move',
'Account Move'), 'get_account_move')
def get_account_move_id(self, account_move):
if not account_move:
return None
if not account_move.origin:
return None
AccountMove = Pool().get('account.move')
account_move_origin = '%s,%s' % (account_move.origin.__name__,
account_move.origin.id)
account_move, = AccountMove.search([
'origin', '=', account_move_origin,
])
return account_move.id
def get_account_move(self, name):
for move in self.moves:
account_move = move._get_account_stock_move()
return self.get_account_move_id(account_move)
return None

View File

@ -28,19 +28,6 @@
<field name="name">stock_move_list</field>
</record>
<!-- Inventory Line -->
<record model="ir.ui.view" id="lims_inventory_line_view_form">
<field name="model">stock.inventory.line</field>
<field name="inherit" ref="stock.inventory_line_view_form"/>
<field name="name">stock_inventory_line_form</field>
</record>
<record model="ir.ui.view" id="lims_inventory_line_view_list">
<field name="model">stock.inventory.line</field>
<field name="inherit" ref="stock.inventory_line_view_tree"/>
<field name="name">stock_inventory_line_list</field>
</record>
<!-- Shipment -->
<record model="ir.ui.view" id="lims_shipment_in_view_form">

View File

@ -0,0 +1,140 @@
=============
LIMS Scenario
=============
Imports::
>>> import datetime
>>> from proteus import Model, Wizard
>>> from trytond.tests.tools import activate_modules
>>> from trytond.modules.company.tests.tools import create_company, \
... get_company
>>> from trytond.modules.lims.tests.tools import \
... set_lims_configuration, create_workyear, create_base_tables
>>> today = datetime.date.today()
Install lims_tests::
>>> config = activate_modules('lims')
Create company::
>>> _ = create_company()
>>> company = get_company()
Set Lims configuration::
>>> set_lims_configuration(company)
>>> create_workyear(company, today)
Create base tables::
>>> create_base_tables()
Create customer::
>>> Party = Model.get('party.party')
>>> customer = Party(name='Customer')
>>> address = customer.addresses.new()
>>> address.invoice_contact = True
>>> address.invoice_contact_default = True
>>> address.report_contact = True
>>> address.report_contact_default = True
>>> address.acknowledgment_contact = True
>>> address.acknowledgment_contact_default = True
>>> address.email = 'name@domain.com'
>>> customer.save()
Create Entry::
>>> Entry = Model.get('lims.entry')
>>> entry = Entry()
>>> entry.party = customer
>>> entry.save()
Create Samples::
>>> product_type, = Model.get('lims.product.type').find([
... ('code', '=', 'WINE')])
>>> matrix, = Model.get('lims.matrix').find([
... ('code', '=', 'GRAPE')])
>>> fraction_state, = Model.get('lims.packaging.integrity').find([
... ('code', '=', 'OK')])
>>> package_type, = Model.get('lims.packaging.type').find([
... ('code', '=', '01')])
>>> zone, = Model.get('lims.zone').find([
... ('code', '=', 'N')])
>>> fraction_type, = Model.get('lims.fraction.type').find([
... ('code', '=', 'MCL')])
>>> storage_location, = Model.get('stock.location').find([
... ('code', '=', 'STO')])
>>> analysis, = Model.get('lims.analysis').find([
... ('code', '=', '0002')])
>>> laboratory, = Model.get('lims.laboratory').find([
... ('code', '=', 'SQ')])
>>> method, = Model.get('lims.lab.method').find([
... ('code', '=', '002')])
>>> device, = Model.get('lims.lab.device').find([
... ('code', '=', 'PH01')])
>>> create_sample = Wizard('lims.create_sample', [entry])
>>> create_sample.form.sample_client_description = 'Wine'
>>> create_sample.form.product_type = product_type
>>> create_sample.form.matrix = matrix
>>> create_sample.form.fraction_state = fraction_state
>>> create_sample.form.package_type = package_type
>>> create_sample.form.packages_quantity = 1
>>> create_sample.form.zone = zone
>>> create_sample.form.fraction_type = fraction_type
>>> create_sample.form.storage_location = storage_location
>>> create_sample.form.labels = u'LBL-001\nLBL-002\nLBL-003'
>>> service = create_sample.form.services.new()
>>> service.analysis = analysis
>>> service.laboratory = laboratory
>>> service.method = method
>>> service.device = device
>>> create_sample.execute('create_')
Confirm Entry::
>>> entry.reload()
>>> entry.click('confirm')
Plan the analysis::
>>> Professional = Model.get('lims.laboratory.professional')
>>> professional, = Professional.find([('code', '=', 'LP')])
>>> Planification = Model.get('lims.planification')
>>> planification = Planification()
>>> planification.laboratory = laboratory
>>> planification.start_date = today
>>> planification.date_from = today
>>> planification.date_to = today
>>> planification.analysis.append(analysis)
>>> _ = planification.technicians.new(laboratory_professional=professional)
>>> planification.save()
>>> planification.reload()
>>> search_fractions = Wizard('lims.planification.search_fractions',
... [planification])
>>> details = Model.get(
... 'lims.planification.search_fractions.detail').find()
>>> for d in details:
... search_fractions.form.details.append(d)
>>> search_fractions.execute('add')
>>> planification.reload()
>>> planification.click('preplan')
>>> for f in planification.details:
... for s in f.details:
... s.staff_responsible.append(Professional(professional.id))
>>> planification.save()
>>> planification.reload()
>>> technicians_qualification = Wizard(
... 'lims.planification.technicians_qualification', [planification])
>>> _ = planification.click('confirm')

View File

@ -2,8 +2,11 @@
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
import unittest
import doctest
import trytond.tests.test_tryton
from trytond.tests.test_tryton import ModuleTestCase
from trytond.tests.test_tryton import doctest_teardown
from trytond.tests.test_tryton import doctest_checker
class LimsTestCase(ModuleTestCase):
@ -15,4 +18,8 @@ def suite():
suite = trytond.tests.test_tryton.suite()
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
LimsTestCase))
suite.addTests(doctest.DocFileSuite('scenario_lims.rst',
tearDown=doctest_teardown, encoding='utf-8',
checker=doctest_checker,
optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
return suite

333
lims/tests/tools.py Normal file
View File

@ -0,0 +1,333 @@
# -*- coding: utf-8 -*-
# This file is part of the lims module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
import datetime
from decimal import Decimal
from dateutil.relativedelta import relativedelta
from proteus import Model
from trytond.modules.company.tests.tools import get_company
__all__ = ['set_lims_configuration', 'create_workyear', 'create_base_tables']
def set_lims_configuration(company=None, config=None):
"Set Lims Configuration"
if not company:
company = get_company()
# Create fraction product
ProductUom = Model.get('product.uom', config=config)
unit, = ProductUom.find([('name', '=', 'Unit')])
ProductTemplate = Model.get('product.template', config=config)
Product = Model.get('product.product', config=config)
fraction_product = Product()
fraction_template = ProductTemplate()
fraction_template.name = 'Fraction'
fraction_template.default_uom = unit
fraction_template.type = 'goods'
fraction_template.list_price = Decimal('1')
fraction_template.cost_price = Decimal('1')
fraction_template.save()
fraction_product.template = fraction_template
fraction_product.save()
# Create analysis product category
ProductCategory = Model.get('product.category', config=config)
analysis_product_category = ProductCategory()
analysis_product_category.name = 'Analysis Services'
analysis_product_category.save()
# Create default notebook view
default_notebook_view = _create_default_notebook_view(config)
# Create required sequences
Sequence = Model.get('ir.sequence', config=config)
planification_sequence = Sequence()
planification_sequence.name = 'Planification Sequence'
planification_sequence.code = 'lims.planification'
planification_sequence.company = company
planification_sequence.save()
# Set Lims configuration
LimsConfiguration = Model.get('lims.configuration', config=config)
lims_config, = LimsConfiguration.find()
lims_config.fraction_product = fraction_product
lims_config.analysis_product_category = analysis_product_category
lims_config.default_notebook_view = default_notebook_view
lims_config.planification_sequence = planification_sequence
lims_config.save()
def _create_default_notebook_view(config=None):
"Create default notebook view"
NotebookView = Model.get('lims.notebook.view', config=config)
NotebookViewColumn = Model.get('lims.notebook.view.column', config=config)
Field = Model.get('ir.model.field', config=config)
default_notebook_view = NotebookView()
default_notebook_view.name = 'Default View'
sequence = 1
for field_name in ('analysis', ):
column = NotebookViewColumn()
default_notebook_view.columns.append(column)
field, = Field.find([
('model.model', '=', 'lims.notebook.line'),
('name', '=', field_name),
])
column.field = field
column.sequence = sequence
sequence += 1
default_notebook_view.save()
return default_notebook_view
def create_workyear(company=None, today=None, config=None):
"Create Work Year"
if not company:
company = get_company()
if not today:
today = datetime.date.today()
# Create sequences
Sequence = Model.get('ir.sequence', config=config)
entry_sequence = Sequence()
entry_sequence.name = 'Entry Sequence'
entry_sequence.code = 'lims.entry'
entry_sequence.company = company
entry_sequence.save()
sample_sequence = Sequence()
sample_sequence.name = 'Sample Sequence'
sample_sequence.code = 'lims.sample'
sample_sequence.company = company
sample_sequence.save()
service_sequence = Sequence()
service_sequence.name = 'Service Sequence'
service_sequence.code = 'lims.service'
service_sequence.company = company
service_sequence.save()
results_report_sequence = Sequence()
results_report_sequence.name = 'Results Report Sequence'
results_report_sequence.code = 'lims.results_report'
results_report_sequence.company = company
results_report_sequence.save()
# Create Work Year
LabWorkYear = Model.get('lims.lab.workyear', config=config)
workyear = LabWorkYear()
workyear.code = str(today.year)
workyear.start_date = today + relativedelta(month=1, day=1)
workyear.end_date = today + relativedelta(month=12, day=31)
workyear.entry_sequence = entry_sequence
workyear.sample_sequence = sample_sequence
workyear.service_sequence = service_sequence
workyear.results_report_sequence = results_report_sequence
workyear.save()
# Set default entry control
default_entry_control = _create_default_entry_control(company, today,
config)
workyear.default_entry_control = default_entry_control
workyear.save()
def _create_default_entry_control(company=None, today=None, config=None):
"Create default entry control"
Entry = Model.get('lims.entry', config=config)
InvoiceContact = Model.get('lims.entry.invoice_contacts', config=config)
ReportContact = Model.get('lims.entry.report_contacts', config=config)
AcknowledgmentContact = Model.get('lims.entry.acknowledgment_contacts',
config=config)
default_entry_control = Entry()
default_entry_control.date = datetime.datetime.combine(today,
datetime.time.min)
default_entry_control.party = company.party
default_entry_control.invoice_party = company.party
# Set party contacts
contact = _create_company_contacts(company, config)
invoice_contact = InvoiceContact()
default_entry_control.invoice_contacts.append(invoice_contact)
invoice_contact.contact = contact
report_contact = ReportContact()
default_entry_control.report_contacts.append(report_contact)
report_contact.contact = contact
acknowledgment_contact = AcknowledgmentContact()
default_entry_control.acknowledgment_contacts.append(
acknowledgment_contact)
acknowledgment_contact.contact = contact
default_entry_control.no_acknowledgment_of_receipt = True
default_entry_control.state = 'draft'
default_entry_control.save()
# Confirm entry
default_entry_control.click('confirm')
return default_entry_control
def _create_company_contacts(company=None, config=None):
"Create contacts for company party"
if not company:
company = get_company()
Address = Model.get('party.address', config=config)
address, = Address.find([('party', '=', company.party.id)])
address.invoice_contact = True
address.report_contact = True
address.acknowledgment_contact = True
address.email = 'name@domain.com'
address.save()
return address
def create_base_tables(config=None):
"Create Base Tables"
# Configuration / Certification
# Configuration / Entry
_create_base_entry_tables(config)
# Configuration / Laboratory
_create_base_laboratory_tables(config)
# Configuration / Base Tables
_create_base_tables(config)
def _create_base_entry_tables(config=None):
"Configuration / Entry"
PackagingType = Model.get('lims.packaging.type', config=config)
PackagingIntegrity = Model.get('lims.packaging.integrity', config=config)
Zone = Model.get('lims.zone', config=config)
EntrySuspensionReason = Model.get('lims.entry.suspension.reason',
config=config)
packaging_type = PackagingType(
code='01',
description='Package')
packaging_type.save()
packaging_integrity = PackagingIntegrity(
code='OK',
description='Ok')
packaging_integrity.save()
zone = Zone(
code='N',
description='North')
zone.save()
suspension_reason = EntrySuspensionReason(
code='01',
description='Administration pending',
by_default=True)
suspension_reason.save()
def _create_base_laboratory_tables(config=None):
"Configuration / Laboratory"
LaboratoryProfessional = Model.get('lims.laboratory.professional',
config=config)
Laboratory = Model.get('lims.laboratory', config=config)
LabDeviceType = Model.get('lims.lab.device.type', config=config)
LabDevice = Model.get('lims.lab.device', config=config)
User = Model.get('res.user', config=config)
Party = Model.get('party.party', config=config)
Location = Model.get('stock.location', config=config)
lims_user = User(1)
party = Party(
name='Laboratory Professional',
is_lab_professional=True,
lims_user=lims_user)
party.save()
professional = LaboratoryProfessional(
party=party,
code='LP',
role='Responsible')
professional.save()
related_location, = Location.find([('code', '=', 'STO')])
laboratory = Laboratory(
code='SQ',
description='Chemistry Laboratory',
default_laboratory_professional=professional,
default_signer=professional,
related_location=related_location,
section='sq')
laboratory.save()
lims_user.laboratories.append(laboratory)
lims_user.save()
device_type = LabDeviceType(
code='PH',
description='pH Meters')
device_type.save()
device = LabDevice(
code='PH01',
description='pH Meter 01',
device_type=device_type)
device.laboratories.new(laboratory=laboratory)
device.save()
def _create_base_tables(config=None):
"Configuration / Base Tables"
ProductType = Model.get('lims.product.type', config=config)
Matrix = Model.get('lims.matrix', config=config)
LabMethod = Model.get('lims.lab.method', config=config)
Analysis = Model.get('lims.analysis', config=config)
Typification = Model.get('lims.typification', config=config)
Laboratory = Model.get('lims.laboratory', config=config)
LabDevice = Model.get('lims.lab.device', config=config)
FractionType = Model.get('lims.fraction.type', config=config)
product_type = ProductType(
code='WINE',
description='Wine')
product_type.save()
matrix = Matrix(
code='GRAPE',
description='Grape')
matrix.save()
method = LabMethod(
code='002',
name='SQ 002 : By potentiometry',
determination='DETERMINATION OF pH MEASUREMENT BY POTENTIOMETRY',
requalification_months=12,
results_estimated_waiting=10)
method.save()
laboratory, = Laboratory.find([('code', '=', 'SQ')])
device, = LabDevice.find([('code', '=', 'PH01')])
analysis = Analysis(
code='0002',
description='pH (at 20°C)',
type='analysis',
behavior='normal')
analysis.laboratories.new(laboratory=laboratory)
analysis.methods.append(method)
analysis.devices.new(laboratory=laboratory, device=device)
analysis.save()
analysis.click('activate')
typification = Typification(
product_type=product_type,
matrix=matrix,
analysis=analysis,
method=method)
typification.save()
fraction_type = FractionType(
code='MCL',
description='Customer')
fraction_type.save()

View File

@ -1,20 +1,22 @@
[tryton]
version=4.4.0
version=4.8.0
depends:
account_invoice
account_stock_continental
carrier
party_relationship
lims_department
stock_lot
xml:
security/users.xml
lims_view.xml
configuration_view.xml
stock_view.xml
product_view.xml
party_view.xml
lims_report.xml
wizard/lims.xml
data/lims_sequences.xml
lims_menu.xml
security/access_rights.xml
user.xml
laboratory.xml
configuration.xml
department.xml
analysis.xml
entry.xml
sample.xml
planification.xml
notebook.xml
uom.xml
control_tendency.xml
certification.xml
results_report.xml
stock.xml
party.xml

245
lims/uom.py Normal file
View File

@ -0,0 +1,245 @@
# -*- coding: utf-8 -*-
# This file is part of lims module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from trytond.model import ModelView, ModelSQL, fields, Unique
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval
__all__ = ['Uom', 'UomCategory', 'UomConversion', 'Template',
'ConcentrationLevel', 'VolumeConversion']
class Uom:
__name__ = 'product.uom'
__metaclass__ = PoolMeta
maximum_concentration = fields.Char('Maximum concentration')
rsd_horwitz = fields.Char('% RSD Horwitz')
@classmethod
def __setup__(cls):
super(Uom, cls).__setup__()
cls.symbol.size = 30
t = cls.__table__()
cls._sql_constraints += [
('symbol_uniq', Unique(t, t.symbol),
'UoM symbol must be unique'),
]
def get_rec_name(self, name):
return self.symbol
class UomCategory:
__name__ = 'product.uom.category'
__metaclass__ = PoolMeta
lims_only_available = fields.Boolean('Only available in Lims')
@staticmethod
def default_lims_only_available():
return False
class UomConversion(ModelSQL, ModelView):
'Uom Conversion'
__name__ = 'lims.uom.conversion'
initial_uom = fields.Many2One('product.uom', 'Initial UoM', required=True,
domain=[('category.lims_only_available', '=', True)])
final_uom = fields.Many2One('product.uom', 'Final UoM', required=True,
domain=[('category.lims_only_available', '=', True)])
initial_uom_volume = fields.Boolean('Volume involved in Initial UoM')
final_uom_volume = fields.Boolean('Volume involved in Final UoM')
conversion_formula = fields.Char('Conversion formula')
@classmethod
def get_conversion_formula(cls, initial_uom, final_uom):
if not initial_uom or not final_uom:
return None
values = cls.search([
('initial_uom', '=', initial_uom),
('final_uom', '=', final_uom),
])
if values:
return values[0].conversion_formula
return None
class Template:
__name__ = "product.template"
__metaclass__ = PoolMeta
@classmethod
def __setup__(cls):
super(Template, cls).__setup__()
new_domain = [('category.lims_only_available', '!=', True)]
cls.default_uom.domain = new_domain
class VolumeConversion(ModelSQL, ModelView):
'Volume Conversion'
__name__ = 'lims.volume.conversion'
brix = fields.Float('Brix', required=True, digits=(16,
Eval('brix_digits', 2)), depends=['brix_digits'])
density = fields.Float('Density', required=True, digits=(16,
Eval('density_digits', 2)), depends=['density_digits'])
soluble_solids = fields.Float('Soluble solids', required=True,
digits=(16, Eval('soluble_solids_digits', 2)),
depends=['soluble_solids_digits'])
brix_digits = fields.Function(fields.Integer('Brix digits'),
'get_configuration_field')
density_digits = fields.Function(fields.Integer('Density digits'),
'get_configuration_field')
soluble_solids_digits = fields.Function(fields.Integer(
'Soluble solids digits'), 'get_configuration_field')
@classmethod
def __setup__(cls):
super(VolumeConversion, cls).__setup__()
cls._order.insert(0, ('brix', 'ASC'))
@staticmethod
def default_brix_digits():
Config = Pool().get('lims.configuration')
config = Config(1)
return getattr(config, 'brix_digits', 2)
@staticmethod
def default_density_digits():
Config = Pool().get('lims.configuration')
config = Config(1)
return getattr(config, 'density_digits', 2)
@staticmethod
def default_soluble_solids_digits():
Config = Pool().get('lims.configuration')
config = Config(1)
return getattr(config, 'soluble_solids_digits', 2)
@classmethod
def get_configuration_field(cls, volume_conversions, names):
Config = Pool().get('lims.configuration')
config = Config(1)
result = {}
for name in names:
value = getattr(config, name, 2)
result[name] = dict((vc.id, value)
for vc in volume_conversions)
return result
@classmethod
def brixToDensity(cls, brix):
if not brix:
return None
brix = float(brix)
values = cls.search([
('brix', '=', brix),
], limit=1)
if values:
return values[0].density
intrpltn = {
'x_a': 0,
'y_a': 0,
'x_b': 0,
'y_b': 0,
}
lower_values = cls.search([
('brix', '<', brix),
], order=[('brix', 'DESC')], limit=1)
if not lower_values:
return None
intrpltn['x_a'] = lower_values[0].brix
intrpltn['y_a'] = lower_values[0].density
upper_values = cls.search([
('brix', '>', brix),
], order=[('brix', 'ASC')], limit=1)
if not upper_values:
return None
intrpltn['x_b'] = upper_values[0].brix
intrpltn['y_b'] = upper_values[0].density
value = (intrpltn['y_a'] + (brix - intrpltn['x_a']) * (
(intrpltn['y_b'] - intrpltn['y_a']) /
(intrpltn['x_b'] - intrpltn['x_a'])))
return value
@classmethod
def brixToSolubleSolids(cls, brix):
if not brix:
return None
brix = float(brix)
values = cls.search([
('brix', '=', brix),
], limit=1)
if values:
return values[0].soluble_solids
intrpltn = {
'x_a': 0,
'y_a': 0,
'x_b': 0,
'y_b': 0,
}
lower_values = cls.search([
('brix', '<', brix),
], order=[('brix', 'DESC')], limit=1)
if not lower_values:
return None
intrpltn['x_a'] = lower_values[0].brix
intrpltn['y_a'] = lower_values[0].soluble_solids
upper_values = cls.search([
('brix', '>', brix),
], order=[('brix', 'ASC')], limit=1)
if not upper_values:
return None
intrpltn['x_b'] = upper_values[0].brix
intrpltn['y_b'] = upper_values[0].soluble_solids
value = (intrpltn['y_a'] + (brix - intrpltn['x_a']) * (
(intrpltn['y_b'] - intrpltn['y_a']) /
(intrpltn['x_b'] - intrpltn['x_a'])))
return value
class ConcentrationLevel(ModelSQL, ModelView):
'Concentration Level'
__name__ = 'lims.concentration.level'
_rec_name = 'description'
code = fields.Char('Code', required=True)
description = fields.Char('Description', required=True)
@classmethod
def __setup__(cls):
super(ConcentrationLevel, cls).__setup__()
t = cls.__table__()
cls._sql_constraints += [
('code_uniq', Unique(t, t.code),
'Concentration level code must be unique'),
]
def get_rec_name(self, name):
if self.code:
return self.code + ' - ' + self.description
else:
return self.description
@classmethod
def search_rec_name(cls, name, clause):
field = None
for field in ('code', 'description'):
records = cls.search([(field,) + tuple(clause[1:])], limit=1)
if records:
break
if records:
return [(field,) + tuple(clause[1:])]
return [(cls._rec_name,) + tuple(clause[1:])]

170
lims/uom.xml Normal file
View File

@ -0,0 +1,170 @@
<?xml version="1.0"?>
<tryton>
<data>
<!-- Product UoM -->
<record model="ir.ui.view" id="lims_uom_view_list">
<field name="model">product.uom</field>
<field name="inherit" ref="product.uom_view_tree"/>
<field name="name">product_uom_list</field>
</record>
<record model="ir.ui.view" id="lims_uom_view_form">
<field name="model">product.uom</field>
<field name="inherit" ref="product.uom_view_form"/>
<field name="name">product_uom_form</field>
</record>
<!-- UoM Categories -->
<record model="ir.ui.view" id="lims_uom_category_view_list">
<field name="model">product.uom.category</field>
<field name="inherit" ref="product.uom_category_view_tree"/>
<field name="name">product_uom_category_list</field>
</record>
<record model="ir.ui.view" id="lims_uom_category_view_form">
<field name="model">product.uom.category</field>
<field name="inherit" ref="product.uom_category_view_form"/>
<field name="name">product_uom_category_form</field>
</record>
<!-- Volume Conversion -->
<record model="ir.ui.view" id="lims_volume_conversion_view_form">
<field name="model">lims.volume.conversion</field>
<field name="type">form</field>
<field name="name">volume_conversion_form</field>
</record>
<record model="ir.ui.view" id="lims_volume_conversion_view_list">
<field name="model">lims.volume.conversion</field>
<field name="type">tree</field>
<field name="name">volume_conversion_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_volume_conversion_list">
<field name="name">Volume Conversions</field>
<field name="res_model">lims.volume.conversion</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_volume_conversion_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_volume_conversion_view_list"/>
<field name="act_window" ref="act_lims_volume_conversion_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_volume_conversion_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_volume_conversion_view_form"/>
<field name="act_window" ref="act_lims_volume_conversion_list"/>
</record>
<!-- Uom Conversion -->
<record model="ir.ui.view" id="lims_uom_conversion_view_form">
<field name="model">lims.uom.conversion</field>
<field name="type">form</field>
<field name="name">uom_conversion_form</field>
</record>
<record model="ir.ui.view" id="lims_uom_conversion_view_list">
<field name="model">lims.uom.conversion</field>
<field name="type">tree</field>
<field name="name">uom_conversion_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_uom_conversion_list">
<field name="name">Uom Conversions</field>
<field name="res_model">lims.uom.conversion</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_uom_conversion_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_uom_conversion_view_list"/>
<field name="act_window" ref="act_lims_uom_conversion_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_uom_conversion_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_uom_conversion_view_form"/>
<field name="act_window" ref="act_lims_uom_conversion_list"/>
</record>
<!-- Concentration Level -->
<record model="ir.ui.view" id="lims_concentration_level_view_list">
<field name="model">lims.concentration.level</field>
<field name="type">tree</field>
<field name="name">concentration_level_list</field>
</record>
<record model="ir.ui.view" id="lims_concentration_level_view_form">
<field name="model">lims.concentration.level</field>
<field name="type">form</field>
<field name="name">concentration_level_form</field>
</record>
<record model="ir.action.act_window" id="act_lims_concentration_level">
<field name="name">Concentration Levels</field>
<field name="res_model">lims.concentration.level</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_concentration_level_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_concentration_level_view_list"/>
<field name="act_window" ref="act_lims_concentration_level"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_concentration_level_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_concentration_level_view_form"/>
<field name="act_window" ref="act_lims_concentration_level"/>
</record>
<menuitem parent="lims_config_base_tables" action="act_lims_volume_conversion_list"
id="lims_volume_conversion_list_menu" sequence="100"/>
<menuitem parent="lims_config_base_tables" action="act_lims_uom_conversion_list"
id="lims_uom_conversion_list_menu" sequence="110"/>
<record model="ir.model.access" id="access_volume_conversion">
<field name="model" search="[('model', '=', 'lims.volume.conversion')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_volume_conversion_group_conf_base_tables_admin">
<field name="model" search="[('model', '=', 'lims.volume.conversion')]"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_uom_conversion">
<field name="model" search="[('model', '=', 'lims.uom.conversion')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_uom_conversion_group_conf_base_tables_admin">
<field name="model" search="[('model', '=', 'lims.uom.conversion')]"/>
<field name="group" ref="group_lims_conf_base_tables_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_concentration_level">
<field name="model" search="[('model', '=', 'lims.concentration.level')]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_concentration_level_group_control">
<field name="model" search="[('model', '=', 'lims.concentration.level')]"/>
<field name="group" ref="group_lims_control"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
</data>
</tryton>

View File

@ -4,6 +4,52 @@ this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<!-- User Role -->
<record model="ir.ui.view" id="lims_user_role_view_form">
<field name="model">lims.user.role</field>
<field name="type">form</field>
<field name="name">user_role_form</field>
</record>
<record model="ir.ui.view" id="lims_user_role_view_list">
<field name="model">lims.user.role</field>
<field name="type">tree</field>
<field name="name">user_role_list</field>
</record>
<record model="ir.action.act_window" id="act_lims_user_role_list">
<field name="name">User Roles</field>
<field name="res_model">lims.user.role</field>
</record>
<record model="ir.action.act_window.view" id="act_lims_user_role_view_list">
<field name="sequence" eval="10"/>
<field name="view" ref="lims_user_role_view_list"/>
<field name="act_window" ref="act_lims_user_role_list"/>
</record>
<record model="ir.action.act_window.view" id="act_lims_user_role_view_form">
<field name="sequence" eval="20"/>
<field name="view" ref="lims_user_role_view_form"/>
<field name="act_window" ref="act_lims_user_role_list"/>
</record>
<!-- User -->
<record model="ir.ui.view" id="lims_user_view_form_preferences">
<field name="model">res.user</field>
<field name="inherit" ref="res.user_view_form_preferences"/>
<field name="name">user_form_preferences</field>
</record>
<record model="ir.ui.view" id="lims_user_view_form">
<field name="model">res.user</field>
<field name="inherit" ref="res.user_view_form"/>
<field name="name">user_form</field>
</record>
<record model="ir.ui.view" id="lims_user_view_list">
<field name="model">res.user</field>
<field name="inherit" ref="res.user_view_tree"/>
<field name="name">user_list</field>
</record>
<!-- Groups -->
<record model="res.group" id="group_lims_conf_base_readonly">
@ -148,5 +194,45 @@ this repository contains the full copyright notices and license terms. -->
<field name="group" ref="group_lims_entry"/>
</record>
<!-- Groups -->
<record model="res.group" id="group_lims_blind_sample_readonly">
<field name="name">Lims Blind Samples Read Only</field>
</record>
<record model="res.group" id="group_lims_blind_sample">
<field name="name">Lims Blind Samples</field>
</record>
<record model="res.user-res.group" id="user_admin_group_lims_blind_sample">
<field name="user" ref="res.user_admin"/>
<field name="group" ref="group_lims_blind_sample"/>
</record>
<record model="res.group" id="group_lims_planification_readonly">
<field name="name">Lims Planification Read Only</field>
</record>
<record model="res.group" id="group_lims_planification">
<field name="name">Lims Planification</field>
</record>
<record model="res.user-res.group" id="user_admin_group_lims_planification">
<field name="user" ref="res.user_admin"/>
<field name="group" ref="group_lims_planification"/>
</record>
<!-- Users -->
<record model="res.user" id="user_planification_process">
<field name="login">user_cron_planification_process</field>
<field name="name">Cron Lims Planification Process</field>
<field name="signature"></field>
<field name="active" eval="False"/>
</record>
<record model="res.user-res.group" id="user_planification_process_group_planification">
<field name="user" ref="user_planification_process"/>
<field name="group" ref="group_lims_planification"/>
</record>
<menuitem parent="res.menu_res" action="act_lims_user_role_list"
id="lims_user_role_menu" sequence="5"/>
</data>
</tryton>

View File

@ -6,6 +6,8 @@
<field name="fraction_product"/>
<label name="default_notebook_view"/>
<field name="default_notebook_view"/>
<label name="planification_sequence"/>
<field name="planification_sequence"/>
<label name="rm_start_uom"/>
<field name="rm_start_uom"/>
<label name="invoice_party_relation_type"/>
@ -16,8 +18,37 @@
<field name="analysis_product_category"/>
<label name="entry_confirm_background"/>
<field name="entry_confirm_background"/>
<label name="planification_process_background"/>
<field name="planification_process_background"/>
<field name="microbiology_laboratories" colspan="4"/>
</page>
<page string="Fraction Types" id="fraction_type">
<label name="mcl_fraction_type"/>
<field name="mcl_fraction_type"/>
<label name="con_fraction_type"/>
<field name="con_fraction_type"/>
<label name="bmz_fraction_type"/>
<field name="bmz_fraction_type"/>
<label name="rm_fraction_type"/>
<field name="rm_fraction_type"/>
<label name="bre_fraction_type"/>
<field name="bre_fraction_type"/>
<label name="mrt_fraction_type"/>
<field name="mrt_fraction_type"/>
<label name="coi_fraction_type"/>
<field name="coi_fraction_type"/>
<label name="mrc_fraction_type"/>
<field name="mrc_fraction_type"/>
<label name="sla_fraction_type"/>
<field name="sla_fraction_type"/>
<label name="itc_fraction_type"/>
<field name="itc_fraction_type"/>
<label name="itl_fraction_type"/>
<field name="itl_fraction_type"/>
</page>
<page string="Reagents" id="reagents">
<field name="reagents" colspan="4"/>
</page>
<page string="Mail Acknowledgment of Samples Receipt"
id="mail_ack_samples" col="6">
<separator string="Email body of Acknowledgment of Samples Receipt"

View File

@ -4,6 +4,6 @@
<field name="fraction"/>
<field name="device"/>
<field name="result"/>
<field name="rules2"/>
<field name="rules2" icon="icon"/>
<field name="rule" tree_invisible="1"/>
</tree>

View File

@ -14,6 +14,14 @@
<field name="entry"/>
<label name="party"/>
<field name="party" colspan="3"/>
<field name="cie_fraction_type" invisible="1" colspan="4"/>
<group col="4" colspan="4" id="cie">
<separator colspan="4" id="cie_separator" string="CIE"/>
<label name="cie_min_value"/>
<field name="cie_min_value"/>
<label name="cie_max_value"/>
<field name="cie_max_value"/>
</group>
<separator colspan="4" id="separator"/>
<label name="analysis"/>
<field name="analysis"/>
@ -27,6 +35,8 @@
<field name="device"/>
<label name="analysis_origin"/>
<field name="analysis_origin"/>
<label name="state"/>
<field name="state"/>
<label name="report_grouper"/>
<field name="report_grouper"/>
<label name="confirmation_date"/>

View File

@ -8,6 +8,7 @@
<field name="entry"/>
<field name="party"/>
<field name="analysis_origin"/>
<field name="state"/>
<field name="analysis"/>
<field name="laboratory"/>
<field name="method"/>

View File

@ -1,6 +1,6 @@
<?xml version="1.0"?>
<tree>
<field name="number"/>
<field name="number" icon="icon"/>
<field name="date" widget="date"/>
<field name="date" widget="time" string="Hora"/>
<field name="create_date2" widget="date"/>

View File

@ -50,6 +50,10 @@
<field name="shared"/>
<label name="current_location"/>
<field name="current_location"/>
<field name="special_type" invisible="1" colspan="4"/>
<field name="cie_fraction_type_available" invisible="1" colspan="4"/>
<label name="cie_fraction_type"/>
<field name="cie_fraction_type"/>
<label name="entry_state"/>
<field name="entry_state"/>
</page>
@ -64,6 +68,52 @@
<field name="services" colspan="4" mode="tree,form"
view_ids="lims.lims_service2_view_list,lims.lims_service_view_form"/>
</page>
<page string="Control" id="con">
<label name="con_type"/>
<field name="con_type"/>
<label name="con_original_fraction"/>
<field name="con_original_fraction"/>
</page>
<page string="BMZ" id="bmz">
<label name="bmz_type"/>
<field name="bmz_type"/>
<label name="bmz_original_fraction"/>
<field name="bmz_original_fraction"/>
<label name="bmz_product_type"/>
<field name="bmz_product_type"/>
<label name="bmz_matrix"/>
<field name="bmz_matrix"/>
</page>
<page string="RM" id="rm">
<label name="rm_type"/>
<field name="rm_type"/>
<label name="rm_original_fraction"/>
<field name="rm_original_fraction"/>
<label name="rm_product_type"/>
<field name="rm_product_type"/>
<label name="rm_matrix"/>
<field name="rm_matrix"/>
</page>
<page string="BRE" id="bre">
<label name="bre_product_type"/>
<field name="bre_product_type"/>
<label name="bre_matrix"/>
<field name="bre_matrix"/>
<field name="bre_reagents" colspan="4"/>
</page>
<page string="MRT" id="mrt">
<label name="mrt_product_type"/>
<field name="mrt_product_type"/>
<label name="mrt_matrix"/>
<field name="mrt_matrix"/>
</page>
<page string="CIE" id="cie">
<label name="cie_original_fraction"/>
<field name="cie_original_fraction"/>
<group colspan="2" id="buttons">
<button name="load_services" string="Load Services"/>
</group>
</page>
<page string="Comments" id="comments">
<separator string="Comments" colspan="4" id="comments"/>
<field name="comments" colspan="4"/>

View File

@ -1,6 +1,6 @@
<?xml version="1.0"?>
<tree>
<field name="number"/>
<field name="number" icon="icon"/>
<field name="create_date2" widget="date"/>
<field name="create_date2" widget="time" string="Time"/>
<field name="sample"/>

View File

@ -10,6 +10,14 @@
</group>
<label name="requalify"/>
<field name="requalify"/>
<label name="default_package_type"/>
<field name="default_package_type"/>
<label name="default_fraction_state"/>
<field name="default_fraction_state"/>
<label name="plannable"/>
<field name="plannable"/>
<label name="cie_fraction_type"/>
<field name="cie_fraction_type"/>
<label name="control_charts"/>
<field name="control_charts"/>
<label name="report"/>

View File

@ -4,6 +4,8 @@
<field name="description"/>
<field name="max_storage_time"/>
<field name="requalify"/>
<field name="plannable"/>
<field name="cie_fraction_type"/>
<field name="control_charts"/>
<field name="report"/>
</tree>

View File

@ -2,6 +2,7 @@
<tree>
<field name="professional"/>
<field name="method"/>
<field name="determination"/>
<field name="state"/>
<field name="type"/>
</tree>

View File

@ -12,5 +12,7 @@
<field name="related_location"/>
<label name="section"/>
<field name="section"/>
<label name="headquarters"/>
<field name="headquarters"/>
<field name="cv_corrections" colspan="4"/>
</form>

View File

@ -5,4 +5,5 @@
<field name="default_laboratory_professional"/>
<field name="default_signer"/>
<field name="related_location"/>
<field name="headquarters"/>
</tree>

View File

@ -7,6 +7,8 @@
<label name="role"/>
<field name="role"/>
<newline/>
<field name="methods" colspan="4"/>
<newline/>
<group colspan="4" yfill="1" string="Signature" id="signature">
<field xfill="0" xexpand="1" name="signature" height="200" width="200" widget="image"/>
</group>

View File

@ -28,6 +28,9 @@
<field name="initial_concentration"/>
<label name="final_concentration"/>
<field name="final_concentration"/>
<label name="planification"/>
<field name="planification"/>
<field name="controls" colspan="4"/>
<field name="laboratory_professionals" colspan="4"/>
<label name="initial_unit"/>
<field name="initial_unit"/>

View File

@ -21,4 +21,6 @@
<field name="final_unit"/>
<field name="literal_result"/>
<field name="comments"/>
<field name="product_type"/>
<field name="matrix"/>
</tree>

View File

@ -14,6 +14,8 @@
<field name="report_date"/>
<field name="initial_concentration"/>
<field name="final_concentration"/>
<field name="planification"/>
<field name="controls"/>
<field name="laboratory_professionals"/>
<field name="initial_unit"/>
<field name="final_unit"/>

View File

@ -1,6 +1,6 @@
<?xml version="1.0"?>
<tree>
<field name="fraction"/>
<field name="fraction" icon="icon"/>
<field name="party_code"/>
<field name="product_type"/>
<field name="matrix"/>

View File

@ -7,10 +7,6 @@
<label name="email"/>
<field name="email"/>
<group col="12" colspan="6" id="entry_contacts">
<label name="invoice_contact"/>
<field name="invoice_contact"/>
<label name="invoice_contact_default"/>
<field name="invoice_contact_default"/>
<label name="report_contact"/>
<field name="report_contact"/>
<label name="report_contact_default"/>
@ -19,6 +15,10 @@
<field name="acknowledgment_contact"/>
<label name="acknowledgment_contact_default"/>
<field name="acknowledgment_contact_default"/>
<label name="invoice_contact"/>
<field name="invoice_contact"/>
<label name="invoice_contact_default"/>
<field name="invoice_contact_default"/>
</group>
</xpath>
</data>

View File

@ -4,11 +4,11 @@
expr="/tree/field[@name='subdivision']"
position="after">
<field name="email"/>
<field name="invoice_contact"/>
<field name="invoice_contact_default"/>
<field name="report_contact"/>
<field name="report_contact_default"/>
<field name="acknowledgment_contact"/>
<field name="acknowledgment_contact_default"/>
<field name="invoice_contact"/>
<field name="invoice_contact_default"/>
</xpath>
</data>

View File

@ -5,6 +5,6 @@
<label name="date_to"/>
<field name="date_to"/>
<field name="analysis" colspan="4" mode="tree,form"
view_ids="lims_planification.lims_analysis_pending_view_list,lims.lims_analysis_view_form"/>
view_ids="lims.lims_analysis_pending_view_list,lims.lims_analysis_view_form"/>
<field name="laboratory" invisible="1"/>
</form>

View File

@ -10,11 +10,11 @@
<field name="product_type"/>
<label name="matrix"/>
<field name="matrix"/>
<label name="repetitions"/>
<field name="repetitions"/>
<label name="label"/>
<field name="label"/>
<label name="concentration_level"/>
<field name="concentration_level"/>
<label name="generate_repetition"/>
<field name="generate_repetition"/>
<field name="planification" invisible="1"/>
</form>

Some files were not shown because too many files have changed in this diff Show More