Author: echatellier Date: 2013-02-11 17:33:39 +0100 (Mon, 11 Feb 2013) New Revision: 92 Url: http://forge.codelutin.com/projects/cantharella/repository/revisions/92 Log: Affiche de la liste des mol?\195?\169cules par provenance Modified: trunk/cantharella.data/src/main/resources/commons/data_en.properties trunk/cantharella.data/src/main/resources/commons/data_fr.properties trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/MoleculeServiceImpl.java trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java Modified: trunk/cantharella.data/src/main/resources/commons/data_en.properties =================================================================== --- trunk/cantharella.data/src/main/resources/commons/data_en.properties 2013-02-11 16:31:35 UTC (rev 91) +++ trunk/cantharella.data/src/main/resources/commons/data_en.properties 2013-02-11 16:33:39 UTC (rev 92) @@ -181,7 +181,7 @@ ParamMethoPuriEffect.valeur=Value -Molecule.idMolecule=Molecule id +Molecule.idMolecule=Id Molecule.nomCommun=Common name Molecule.familleChimique=Chemical Family Molecule.formuleDevMol=Developed formula @@ -198,9 +198,11 @@ Molecule.provenance.produit.ref=Product ref. Molecule.provenance.presence=% Molecule.provenance.lot.ref=Lot ref. +Molecule.provenance.embranchement=Phylum Molecule.provenance.genre=Gender Molecule.provenance.espece=Species Molecule.provenance.campagne=Campaign +Molecule.provenance.programme=Program TestBio.ref=Test ref. Modified: trunk/cantharella.data/src/main/resources/commons/data_fr.properties =================================================================== --- trunk/cantharella.data/src/main/resources/commons/data_fr.properties 2013-02-11 16:31:35 UTC (rev 91) +++ trunk/cantharella.data/src/main/resources/commons/data_fr.properties 2013-02-11 16:33:39 UTC (rev 92) @@ -181,7 +181,7 @@ ParamMethoPuriEffect.valeur=Valeur -Molecule.idMolecule=Molécule N° +Molecule.idMolecule=N° Molecule.nomCommun=Nom commun Molecule.familleChimique=Famille Chimique Molecule.formuleDevMol=Formule développée @@ -198,9 +198,11 @@ Molecule.provenance.produit.ref=Réf. Produit Molecule.provenance.presence=% Molecule.provenance.lot.ref=Réf. Lot +Molecule.provenance.embranchement=Embranchement Molecule.provenance.genre=Genre Molecule.provenance.espece=Espèce Molecule.provenance.campagne=Campagne +Molecule.provenance.programme=Programme TestBio.ref=Réf. test TestBio.manipulateur=Manipulateur Modified: trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java =================================================================== --- trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java 2013-02-11 16:31:35 UTC (rev 91) +++ trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/MoleculeService.java 2013-02-11 16:33:39 UTC (rev 92) @@ -28,8 +28,8 @@ import nc.ird.cantharella.data.exceptions.DataNotFoundException; import nc.ird.cantharella.data.model.Molecule; import nc.ird.cantharella.data.model.MoleculeProvenance; -import nc.ird.cantharella.data.model.ResultatTestBio; import nc.ird.cantharella.data.model.Utilisateur; +import nc.ird.cantharella.data.model.utils.AbstractModel; import nc.ird.cantharella.service.utils.normalizers.MoleculeNormalizer; import nc.ird.cantharella.service.utils.normalizers.utils.Normalize; @@ -46,6 +46,7 @@ * Compte le nombre de molecules * @return Nombre de Molecules */ + @Transactional(readOnly = true) long countMolecules(); /** @@ -63,18 +64,31 @@ void deleteMolecule(Molecule molecule) throws DataConstraintException; /** - * Liste les molecules + * List molecule provenance and molecule without provenance or provenance + * not visible by current user. + * * @return Molecules */ @Transactional(readOnly = true) List<Molecule> listMolecules(); /** + * List molecule provenance and molecule without provenance or provenance + * not visible by current user. + * + * @param utilisateur utilisateur to filter results + * @return Molecules + */ + @Transactional(readOnly = true) + List<AbstractModel> listMoleculeProvenances(Utilisateur utilisateur); + + /** * Charge une molecule * @param numero numero * @return Le lot correspondant * @throws DataNotFoundException Si le lot n'existe pas */ + @Transactional(readOnly = true) Molecule loadMolecule(Integer numero) throws DataNotFoundException; /** @@ -92,14 +106,14 @@ * @return TRUE s'il a le droit */ boolean updateOrdeleteMoleculeEnabled(Molecule molecule, Utilisateur utilisateur); - + /** * Liste les programmes des organismes déjà saisis * @return Organisme des molécules */ @Transactional(readOnly = true) List<String> listMoleculeOrganisme(); - + /** * Détermine si un utilisateur peut accéder à une provenance de molecule. * @param moleculeProvenance provenance Modified: trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/MoleculeServiceImpl.java =================================================================== --- trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/MoleculeServiceImpl.java 2013-02-11 16:31:35 UTC (rev 91) +++ trunk/cantharella.service/src/main/java/nc/ird/cantharella/service/services/impl/MoleculeServiceImpl.java 2013-02-11 16:33:39 UTC (rev 92) @@ -22,6 +22,7 @@ */ package nc.ird.cantharella.service.services.impl; +import java.util.ArrayList; import java.util.List; import nc.ird.cantharella.data.dao.GenericDao; @@ -37,6 +38,7 @@ import nc.ird.cantharella.data.model.Produit; import nc.ird.cantharella.data.model.Utilisateur; import nc.ird.cantharella.data.model.Utilisateur.TypeDroit; +import nc.ird.cantharella.data.model.utils.AbstractModel; import nc.ird.cantharella.service.services.LotService; import nc.ird.cantharella.service.services.MoleculeService; import nc.ird.module.utils.AssertTools; @@ -98,6 +100,31 @@ public List<Molecule> listMolecules() { return dao.readList(Molecule.class, "idMolecule"); } + + /** {@inheritDoc} */ + @Override + public List<AbstractModel> listMoleculeProvenances(Utilisateur utilisateur) { + List<AbstractModel> result = new ArrayList<AbstractModel>(); + List<Molecule> molecules = listMolecules(); + + for (Molecule molecule : molecules) { + boolean isOneProductVisible = false; + + List<MoleculeProvenance> moleculeProvenances = molecule.getProvenances(); + for (MoleculeProvenance moleculeProvenance : moleculeProvenances) { + if (isMoleculeProvenanceAccessibleByUser(moleculeProvenance, utilisateur)) { + result.add(moleculeProvenance); + isOneProductVisible = true; + } + } + + if (!isOneProductVisible) { + result.add(molecule); + } + } + + return result; + } /** {@inheritDoc} */ @Override Modified: trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java =================================================================== --- trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java 2013-02-11 16:31:35 UTC (rev 91) +++ trunk/cantharella.web/src/main/java/nc/ird/cantharella/web/pages/domain/molecule/ListMoleculesPage.java 2013-02-11 16:33:39 UTC (rev 92) @@ -25,16 +25,25 @@ import java.util.ArrayList; import java.util.List; +import nc.ird.cantharella.data.model.Extrait; +import nc.ird.cantharella.data.model.Fraction; import nc.ird.cantharella.data.model.Molecule; +import nc.ird.cantharella.data.model.MoleculeProvenance; +import nc.ird.cantharella.data.model.Produit; +import nc.ird.cantharella.data.model.Utilisateur; +import nc.ird.cantharella.data.model.utils.AbstractModel; import nc.ird.cantharella.service.services.MoleculeService; import nc.ird.cantharella.web.config.WebContext; import nc.ird.cantharella.web.pages.TemplatePage; +import nc.ird.cantharella.web.pages.domain.lot.ReadLotPage; import nc.ird.cantharella.web.utils.CallerPage; import nc.ird.cantharella.web.utils.behaviors.MoleculeViewBehavior; import nc.ird.cantharella.web.utils.columns.BooleanPropertyColumn; import nc.ird.cantharella.web.utils.columns.DecimalPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkPropertyColumn; import nc.ird.cantharella.web.utils.columns.LinkableImagePropertyColumn; +import nc.ird.cantharella.web.utils.models.DisplayBooleanPropertyModel; +import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel; import nc.ird.cantharella.web.utils.models.DisplayDecimalPropertyModel.DecimalDisplFormat; import nc.ird.cantharella.web.utils.models.LoadableDetachableSortableListDataProvider; import nc.ird.cantharella.web.utils.security.AuthRole; @@ -90,58 +99,261 @@ add(moleculesRefresh); // Liste des molecules - final List<Molecule> molecules = moleculeService.listMolecules(); + Utilisateur utilisateur = getSession().getUtilisateur(); + final List<AbstractModel> moleculeProvenances = moleculeService.listMoleculeProvenances(utilisateur); - LoadableDetachableSortableListDataProvider<Molecule> moleculesDataProvider = new LoadableDetachableSortableListDataProvider<Molecule>( - molecules, getSession().getLocale()); + LoadableDetachableSortableListDataProvider<AbstractModel> moleculesDataProvider = + new LoadableDetachableSortableListDataProvider<AbstractModel>( + moleculeProvenances, getSession().getLocale()); - List<IColumn<Molecule>> columns = new ArrayList<IColumn<Molecule>>(); + List<IColumn<AbstractModel>> columns = new ArrayList<IColumn<AbstractModel>>(); - columns.add(new LinkableImagePropertyColumn<Molecule>("images/read.png", getString("Read"), getString("Read")) { + columns.add(new LinkableImagePropertyColumn<AbstractModel>("images/read.png", getString("Read"), getString("Read")) { @Override - public void onClick(Item<ICellPopulator<Molecule>> item, String componentId, IModel<Molecule> model) { - setResponsePage(new ReadMoleculePage(model.getObject().getIdMolecule(), currentPage)); + public void onClick(Item<ICellPopulator<AbstractModel>> item, String componentId, IModel<AbstractModel> model) { + int idMolecule; + if (model.getObject() instanceof Molecule) { + idMolecule = ((Molecule)model.getObject()).getIdMolecule(); + } else { + idMolecule = ((MoleculeProvenance)model.getObject()).getMolecule().getIdMolecule(); + } + setResponsePage(new ReadMoleculePage(idMolecule, currentPage)); } }); - columns.add(new LinkPropertyColumn<Molecule>(new Model<String>(getString("Molecule.idMolecule")), "idMolecule", "idMolecule", + columns.add(new LinkPropertyColumn<AbstractModel>(new Model<String>(getString("Molecule.idMolecule")), "idMolecule", getString("Read")) { @Override - public void onClick(Item<ICellPopulator<Molecule>> item, String componentId, IModel<Molecule> model) { - setResponsePage(new ReadMoleculePage(model.getObject().getIdMolecule(), currentPage)); + protected IModel<AbstractModel> createLabelModel(final IModel<AbstractModel> rowModel) { + PropertyModel<AbstractModel> propertyModel; + if (rowModel.getObject() instanceof Molecule) { + propertyModel = new PropertyModel<AbstractModel>(rowModel, "idMolecule"); + } else { + propertyModel = new PropertyModel<AbstractModel>(rowModel, "molecule.idMolecule"); + } + return propertyModel; } + + @Override + public void onClick(Item<ICellPopulator<AbstractModel>> item, String componentId, IModel<AbstractModel> model) { + int idMolecule; + if (model.getObject() instanceof Molecule) { + idMolecule = ((Molecule)model.getObject()).getIdMolecule(); + } else { + idMolecule = ((MoleculeProvenance)model.getObject()).getMolecule().getIdMolecule(); + } + setResponsePage(new ReadMoleculePage(idMolecule, currentPage)); + } }); - columns.add(new AbstractColumn<Molecule>(new Model<String>(getString("Molecule.formuleDevMol"))) { - public void populateItem(Item<ICellPopulator<Molecule>> cellItem, String componentId, IModel<Molecule> rowModel) { - cellItem.add(new Label(componentId, "-") + columns.add(new AbstractColumn<AbstractModel>(new Model<String>(getString("Molecule.formuleDevMol"))) { + public void populateItem(Item<ICellPopulator<AbstractModel>> cellItem, String componentId, IModel<AbstractModel> rowModel) { + if (rowModel.getObject() instanceof Molecule) { + cellItem.add(new Label(componentId, "-") .add(new MoleculeViewBehavior(new PropertyModel<String>(rowModel, "formuleDevMol")))); + } else { + cellItem.add(new Label(componentId, "-") + .add(new MoleculeViewBehavior(new PropertyModel<String>(rowModel, "molecule.formuleDevMol")))); + } } }); - columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.nomCommun")), "nomCommun", - "nomCommun")); - columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.familleChimique")), "familleChimique", - "familleChimique")); - columns.add(new PropertyColumn<Molecule>(new Model<String>(getString("Molecule.formuleBrute")), "formuleBrute", - "formuleBrute")); - columns.add(new DecimalPropertyColumn<Molecule>(new Model<String>(getString("Molecule.masseMolaire")), "masseMolaire", - "masseMolaire", DecimalDisplFormat.SMALL, getLocale())); - columns.add(new BooleanPropertyColumn<Molecule>(new Model<String>(getString("Molecule.nouvMolecul")), "nouvMolecul", - "nouvMolecul", this)); - - columns.add(new LinkableImagePropertyColumn<Molecule>("images/edit.png", getString("Update"), getString("Update")) { - // pas de lien d'édition si l'utilisateur n'a pas les droits + columns.add(new PropertyColumn<AbstractModel>(new Model<String>(getString("Molecule.nomCommun")), "nomCommun", + "nomCommun") { @Override - public void populateItem(Item<ICellPopulator<Molecule>> item, String componentId, IModel<Molecule> model) { - item.add(new LinkableImagePanel(item, componentId, model)); + public void populateItem(Item<ICellPopulator<AbstractModel>> cellItem, String componentId, IModel<AbstractModel> rowModel) { + String nomCommun; + if (rowModel.getObject() instanceof Molecule) { + nomCommun = ((Molecule)rowModel.getObject()).getNomCommun(); + } else { + nomCommun = ((MoleculeProvenance)rowModel.getObject()).getMolecule().getNomCommun(); + } + cellItem.add(new Label(componentId, nomCommun)); } + }); + columns.add(new PropertyColumn<AbstractModel>(new Model<String>(getString("Molecule.familleChimique")), "familleChimique", + "familleChimique") { + @Override + public void populateItem(Item<ICellPopulator<AbstractModel>> cellItem, String componentId, IModel<AbstractModel> rowModel) { + String familleChimique; + if (rowModel.getObject() instanceof Molecule) { + familleChimique = ((Molecule)rowModel.getObject()).getFamilleChimique(); + } else { + familleChimique = ((MoleculeProvenance)rowModel.getObject()).getMolecule().getFamilleChimique(); + } + cellItem.add(new Label(componentId, familleChimique)); + } + }); + columns.add(new PropertyColumn<AbstractModel>(new Model<String>(getString("Molecule.formuleBrute")), "formuleBrute", + "formuleBrute") { + @Override + public void populateItem(Item<ICellPopulator<AbstractModel>> cellItem, String componentId, IModel<AbstractModel> rowModel) { + String formuleBrute; + if (rowModel.getObject() instanceof Molecule) { + formuleBrute = ((Molecule)rowModel.getObject()).getFormuleBrute(); + } else { + formuleBrute = ((MoleculeProvenance)rowModel.getObject()).getMolecule().getFormuleBrute(); + } + cellItem.add(new Label(componentId, formuleBrute)); + } + }); + columns.add(new DecimalPropertyColumn<AbstractModel>(new Model<String>(getString("Molecule.masseMolaire")), "masseMolaire", + "masseMolaire", DecimalDisplFormat.SMALL, getLocale()) { + @Override + public void populateItem(Item<ICellPopulator<AbstractModel>> cellItem, String componentId, IModel<AbstractModel> rowModel) { + if (rowModel.getObject() instanceof Molecule) { + cellItem.add(new Label(componentId, new DisplayDecimalPropertyModel(rowModel.getObject(), "masseMolaire", + DecimalDisplFormat.SMALL, getLocale()))); + } else { + cellItem.add(new Label(componentId, new DisplayDecimalPropertyModel(rowModel.getObject(), "molecule.masseMolaire", + DecimalDisplFormat.SMALL, getLocale()))); + } + } + }); + columns.add(new BooleanPropertyColumn<AbstractModel>(new Model<String>(getString("Molecule.nouvMolecul")), "nouvMolecul", + "nouvMolecul", this) { + @Override + public void populateItem(Item<ICellPopulator<AbstractModel>> cellItem, String componentId, IModel<AbstractModel> rowModel) { + if (rowModel.getObject() instanceof Molecule) { + cellItem.add(new Label(componentId, new DisplayBooleanPropertyModel(rowModel.getObject(), "nouvMolecul", + ListMoleculesPage.this))); + } else { + cellItem.add(new Label(componentId, new DisplayBooleanPropertyModel(rowModel.getObject(), "molecule.nouvMolecul", + ListMoleculesPage.this))); + } + } + }); + columns.add(new PropertyColumn<AbstractModel>(new Model<String>(getString("Molecule.provenance.embranchement")), "embranchement", + "embranchement") { + @Override + public void populateItem(Item<ICellPopulator<AbstractModel>> cellItem, String componentId, IModel<AbstractModel> rowModel) { + if (rowModel.getObject() instanceof Molecule) { + cellItem.add(new Label(componentId, "-")); + } else { + MoleculeProvenance provenance = (MoleculeProvenance)rowModel.getObject(); + Produit produit = provenance.getProduit(); + if (produit instanceof Fraction) { + Fraction fraction = (Fraction)produit; + cellItem.add(new Label(componentId, fraction.getPurification().getLotSource().getSpecimenRef().getEmbranchement())); + } else { + Extrait extrait = (Extrait)produit; + cellItem.add(new Label(componentId, extrait.getExtraction().getLot().getSpecimenRef().getEmbranchement())); + } + } + } + }); + columns.add(new PropertyColumn<AbstractModel>(new Model<String>(getString("Molecule.provenance.genre")), "genre", + "genre") { + @Override + public void populateItem(Item<ICellPopulator<AbstractModel>> cellItem, String componentId, IModel<AbstractModel> rowModel) { + if (rowModel.getObject() instanceof Molecule) { + cellItem.add(new Label(componentId, "-")); + } else { + MoleculeProvenance provenance = (MoleculeProvenance)rowModel.getObject(); + Produit produit = provenance.getProduit(); + if (produit instanceof Fraction) { + Fraction fraction = (Fraction)produit; + cellItem.add(new Label(componentId, fraction.getPurification().getLotSource().getSpecimenRef().getGenre())); + } else { + Extrait extrait = (Extrait)produit; + cellItem.add(new Label(componentId, extrait.getExtraction().getLot().getSpecimenRef().getGenre())); + } + } + } + }); + columns.add(new PropertyColumn<AbstractModel>(new Model<String>(getString("Molecule.provenance.espece")), "espece", + "espece") { + @Override + public void populateItem(Item<ICellPopulator<AbstractModel>> cellItem, String componentId, IModel<AbstractModel> rowModel) { + if (rowModel.getObject() instanceof Molecule) { + cellItem.add(new Label(componentId, "-")); + } else { + MoleculeProvenance provenance = (MoleculeProvenance)rowModel.getObject(); + Produit produit = provenance.getProduit(); + if (produit instanceof Fraction) { + Fraction fraction = (Fraction)produit; + cellItem.add(new Label(componentId, fraction.getPurification().getLotSource().getSpecimenRef().getEspece())); + } else { + Extrait extrait = (Extrait)produit; + cellItem.add(new Label(componentId, extrait.getExtraction().getLot().getSpecimenRef().getEspece())); + } + } + } + }); + columns.add(new LinkPropertyColumn<AbstractModel>(new Model<String>(getString("Molecule.provenance.lot.ref")), "lot.ref", + getString("Read")) { + @Override + public void populateItem(Item<ICellPopulator<AbstractModel>> cellItem, String componentId, IModel<AbstractModel> rowModel) { + if (rowModel.getObject() instanceof Molecule) { + cellItem.add(new Label(componentId, "-")); + } else { + super.populateItem(cellItem, componentId, rowModel); + } + } + @Override + protected IModel<AbstractModel> createLabelModel(final IModel<AbstractModel> rowModel) { + IModel<AbstractModel> propertyModel = null; + if (rowModel.getObject() instanceof MoleculeProvenance) { + MoleculeProvenance provenance = (MoleculeProvenance)rowModel.getObject(); + Produit produit = provenance.getProduit(); + if (produit instanceof Fraction) { + propertyModel = new PropertyModel<AbstractModel>(rowModel, "produit.purification.lotSource.ref"); + } else { + propertyModel = new PropertyModel<AbstractModel>(rowModel, "produit.extraction.lot.ref"); + } + } + return propertyModel; + } @Override - public void onClick(Item<ICellPopulator<Molecule>> item, String componentId, IModel<Molecule> model) { - setResponsePage(new ManageMoleculePage(model.getObject().getIdMolecule(), currentPage)); + public void onClick(Item<ICellPopulator<AbstractModel>> item, String componentId, IModel<AbstractModel> model) { + int idLot; + if (model.getObject() instanceof MoleculeProvenance) { + MoleculeProvenance provenance = (MoleculeProvenance)model.getObject(); + Produit produit = provenance.getProduit(); + if (produit instanceof Fraction) { + Fraction fraction = (Fraction)produit; + idLot = fraction.getPurification().getLotSource().getIdLot(); + } else { + Extrait extrait = (Extrait)produit; + idLot = extrait.getExtraction().getLot().getIdLot(); + } + + setResponsePage(new ReadLotPage(idLot, currentPage)); + } } }); + columns.add(new PropertyColumn<AbstractModel>(new Model<String>(getString("Molecule.provenance.programme")), "programme", + "programme") { + @Override + public void populateItem(Item<ICellPopulator<AbstractModel>> cellItem, String componentId, IModel<AbstractModel> rowModel) { + if (rowModel.getObject() instanceof Molecule) { + cellItem.add(new Label(componentId, "-")); + } else { + MoleculeProvenance provenance = (MoleculeProvenance)rowModel.getObject(); + Produit produit = provenance.getProduit(); + if (produit instanceof Fraction) { + Fraction fraction = (Fraction)produit; + cellItem.add(new Label(componentId, fraction.getPurification().getLotSource().getCampagne().getProgramme())); + } else { + Extrait extrait = (Extrait)produit; + cellItem.add(new Label(componentId, extrait.getExtraction().getLot().getCampagne().getProgramme())); + } + } + } + }); + columns.add(new LinkableImagePropertyColumn<AbstractModel>("images/edit.png", getString("Update"), getString("Update")) { + @Override + public void onClick(Item<ICellPopulator<AbstractModel>> item, String componentId, IModel<AbstractModel> model) { + int idMolecule; + if (model.getObject() instanceof Molecule) { + idMolecule = ((Molecule)model.getObject()).getIdMolecule(); + } else { + idMolecule = ((MoleculeProvenance)model.getObject()).getMolecule().getIdMolecule(); + } + setResponsePage(new ManageMoleculePage(idMolecule, currentPage)); + } + }); - final DataTable<Molecule> moleculesDataTable = new AjaxFallbackDefaultDataTable<Molecule>("ListMoleculesPage.Molecules", columns, + final DataTable<AbstractModel> moleculesDataTable = new AjaxFallbackDefaultDataTable<AbstractModel>("ListMoleculesPage.Molecules", columns, moleculesDataProvider, WebContext.ROWS_PER_PAGE); moleculesRefresh.add(moleculesDataTable); }