Skip to content
Snippets Groups Projects
Forked from DM / dm-docs
261 commits behind, 766 commits ahead of the upstream repository.
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
addExperimentCli.py 4.18 KiB
#!/usr/bin/env python

from dm.ds_web_service.api.experimentRestApi import ExperimentRestApi
from dm.common.exceptions.invalidRequest import InvalidRequest
from dm.common.utility.configurationManager import ConfigurationManager
from dsWebServiceSessionCli import DsWebServiceSessionCli

class AddExperimentCli(DsWebServiceSessionCli):
    def __init__(self):
        DsWebServiceSessionCli.__init__(self)
        configManager = ConfigurationManager.getInstance()
        self.allowedExperimentTypes = configManager.getAllowedExperimentTypes()
        allowedExperimentTypesHelp = ''
        if self.allowedExperimentTypes:
            allowedExperimentTypesHelp = ' Allowed types: %s' % self.allowedExperimentTypes
            

        self.addOption('', '--experiment', dest='experimentName', help='Experiment name.')
        self.addOption('', '--station', dest='stationName', help='Experiment station name, can also be set via DM_STATION_NAME environment variable.')
        self.addOption('', '--type', dest='typeName', help='Experiment type name.%s' % allowedExperimentTypesHelp)
        self.addOption('', '--type-id', dest='typeId', help='Experiment type id (may be given instead of type name; type id is ignored if both type name and id are provided).')
        self.addOption('', '--description', dest='description', help='Experiment description.')
        self.addOption('', '--start-date', dest='startDate', help='Experiment start date in format DD-MMM-YY.')
        self.addOption('', '--end-date', dest='endDate', help='Experiment end date in format DD-MMM-YY.')

    def checkArgs(self):
        if self.options.experimentName is None:
            raise InvalidRequest('Experiment name must be provided.')
        if self.getTypeName() is None:
            raise InvalidRequest('Experiment type name must be provided.')
        if self.getStationName() is None:
            raise InvalidRequest('Experiment station name must be provided.')
        # If allowed experiment types is not set, there are no restrictions
        if self.allowedExperimentTypes:
            if self.getTypeName() not in self.allowedExperimentTypes.split(','):
                raise InvalidRequest('Experiment type %s is not allowed on this station. Allowed types are: %s.' % (self.getTypeName(), self.allowedExperimentTypes))

    def getExperimentName(self):
        return self.options.experimentName

    def getStationName(self):
        stationName = self.options.stationName
        if not stationName:
            configManager = ConfigurationManager.getInstance()
            stationName = configManager.getStationName()
        return stationName

    def getTypeName(self):
        typeName = self.options.typeName
        if not typeName:
            if self.options.typeId:
                api = ExperimentRestApi(self.getLoginUsername(), self.getLoginPassword(), self.getServiceHost(), self.getServicePort(), self.getServiceProtocol())
                experimentType = api.getExperimentTypeById(typeId)
                typeName = experimentType.get('name')
                self.options.typeName = typeName
        return typeName

    def getDescription(self):
        return self.options.description

    def getStartDate(self):
        return self.options.startDate

    def getEndDate(self):
        return self.options.endDate

    def runCommand(self):
        self.parseArgs(usage="""
    dm-add-experiment 
        --experiment=EXPERIMENTNAME --station=STATIONNAME --type=TYPENAME|--type-id=TYPEID
        [--description=DESCRIPTION] 
        [--start-date=STARTDATE] 
        [--end-date=ENDDATE]

Description:
    Add new experiment to the DM database. 
        """)
        self.checkArgs()
        api = ExperimentRestApi(self.getLoginUsername(), self.getLoginPassword(), self.getServiceHost(), self.getServicePort(), self.getServiceProtocol())
        experiment = api.addExperiment(self.getExperimentName(), self.getStationName(), self.getTypeName(), self.getDescription(), self.getStartDate(), self.getEndDate())
        print experiment.getDisplayString(self.getDisplayKeys(), self.getDisplayFormat())

#######################################################################
# Run command.
if __name__ == '__main__':
    cli = AddExperimentCli()
    cli.run()