#!/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()