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

import cherrypy

from dm.common.service.dmSessionController import DmSessionController
from dm.common.exceptions.invalidRequest import InvalidRequest
from dm.common.exceptions.authorizationError import AuthorizationError
from dm.common.utility.encoder import Encoder

from dm.ds_web_service.service.impl.experimentSessionControllerImpl import ExperimentSessionControllerImpl


class ExperimentSessionController(DmSessionController):

    def __init__(self):
        DmSessionController.__init__(self)
        self.experimentSessionControllerImpl = ExperimentSessionControllerImpl()

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def getExperimentTypes(self, **kwargs):
        return self.listToJson(self.experimentSessionControllerImpl.getExperimentTypes())

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def getExperimentTypeById(self, id, **kwargs):
        experimentType = self.experimentSessionControllerImpl.getExperimentTypeById(id)
        return experimentType.getFullJsonRep()

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    @DmSessionController.execute
    def getExperiments(self, **kwargs):
        return self.listToJson(self.experimentSessionControllerImpl.getExperiments())

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def getExperimentsByStation(self, stationName, **kwargs):
        if not self.hasAdministratorRole() and not self.hasManagerRole(stationName):
            raise AuthorizationError('User %s cannot retrieve experiments for station %s.' % (self.getSessionUsername(), stationName))
        return self.listToJson(self.experimentSessionControllerImpl.getExperimentsByStation(stationName))

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def getExperimentByName(self, name, **kwargs):
        experiment = self.experimentSessionControllerImpl.getExperimentByName(name)
        if not self.hasAdministratorRole() and not self.hasManagerRole(experiment['experimentStationId']):
            raise AuthorizationError('User %s cannot retrieve experiment %s.' % (self.getSessionUsername(), name))
        return experiment.getFullJsonRep()

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def getExperimentById(self, id, **kwargs):
        experiment = self.experimentSessionControllerImpl.getExperimentById(id)
        if not self.hasAdministratorRole() and not self.hasManagerRole(experiment['experimentStationId']):
            raise AuthorizationError('User %s cannot retrieve experiment %s.' % (self.getSessionUsername(), id))
        return experiment.getFullJsonRep()

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def addExperiment(self, **kwargs):
        name = kwargs.get('name')
        if not name:
            raise InvalidRequest('Missing experiment name.')
        name = Encoder.decode(name)
        stationName = kwargs.get('stationName')
        if not stationName:
            raise InvalidRequest('Missing experiment station name.')
        stationName = Encoder.decode(stationName)
        typeName = kwargs.get('typeName')
        if not typeName:
            raise InvalidRequest('Missing experiment type.')
        typeName = Encoder.decode(typeName)
        description = kwargs.get('description')
        if description is not None:
            description = Encoder.decode(description)
        startDate = kwargs.get('startDate')
        if startDate is not None:
            startDate = Encoder.decode(startDate)
        endDate = kwargs.get('endDate')
        if endDate is not None:
            endDate = Encoder.decode(endDate)
        if not self.hasAdministratorRole() and not self.hasManagerRole(stationName):
            raise AuthorizationError('User %s is not allowed to add experiment on station %s.' % (self.getSessionUsername(), stationName))
        response = self.experimentSessionControllerImpl.addExperiment(name, stationName, typeName, description, startDate, endDate).getFullJsonRep()
        
        self.logger.debug('Added experiment: %s' % response)
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def startExperiment(self, **kwargs):
        name = kwargs.get('name')
        if not name:
            raise InvalidRequest('Missing experiment name.')
        name = Encoder.decode(name)
        experiment = self.experimentSessionControllerImpl.getExperimentByName(name)
        if not self.hasAdministratorRole() and not self.hasManagerRole(experiment['experimentStationId']):
            raise AuthorizationError('User %s cannot start experiment %s.' % (self.getSessionUsername(), name))
        response = self.experimentSessionControllerImpl.startExperiment(experiment).getFullJsonRep()
        self.logger.debug('Started experiment: %s' % response)
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def updateExperiment(self, **kwargs):
        name = kwargs.get('name')
        if name is None or not len(name):
            raise InvalidRequest('Missing experiment name.')
        name = Encoder.decode(name)
        experiment = self.experimentSessionControllerImpl.getExperimentByName(name)
        if not self.hasAdministratorRole() and not self.hasManagerRole(experiment['experimentStationId']):
            raise AuthorizationError('User %s cannot update experiment %s.' % (self.getSessionUsername(), name))
        response = self.experimentSessionControllerImpl.updateExperiment(experiment).getFullJsonRep()
        self.logger.debug('Updated experiment: %s' % response)
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def stopExperiment(self, **kwargs):
        name = kwargs.get('name')
        if name is None or not len(name):
            raise InvalidRequest('Missing experiment name.')
        name = Encoder.decode(name)
        experiment = self.experimentSessionControllerImpl.getExperimentByName(name)
        if not self.hasAdministratorRole() and not self.hasManagerRole(experiment['experimentStationId']):
            raise AuthorizationError('User %s cannot stop experiment %s.' % (self.getSessionUsername(), name))
        response = self.experimentSessionControllerImpl.stopExperiment(experiment).getFullJsonRep()
        self.logger.debug('Stopped experiment: %s' % response)
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def authorizeDownload(self, username, experimentName, **kwargs):
        if not username:
            raise InvalidRequest('Invalid username provided.')
        if not experimentName:
            raise InvalidRequest('Invalid experiment name provided.')
        experiment = self.experimentSessionControllerImpl.getExperimentByName(experimentName)
        if not self.hasAdministratorRole() and not self.hasManagerRole(experiment['experimentStationId']):
            raise AuthorizationError('User %s is not allowed to authorize download for experiment %s.' % (self.getSessionUsername(), experimentName))
        response = self.experimentSessionControllerImpl.authorizeDownload(username, experiment).getFullJsonRep()
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isLoggedIn())
    @DmSessionController.execute
    def deauthorizeDownload(self, username, experimentName, **kwargs):
        if not username:
            raise InvalidRequest('Invalid username provided.')
        if not experimentName:
            raise InvalidRequest('Invalid experiment name provided.')
        experiment = self.experimentSessionControllerImpl.getExperimentByName(experimentName)
        if not self.hasAdministratorRole() and not self.hasManagerRole(experiment['experimentStationId']):
            raise AuthorizationError('User %s is not allowed to de-authorize download for experiment %s.' % (self.getSessionUsername(), experimentName))
        response = self.experimentSessionControllerImpl.deauthorizeDownload(username, experiment).getFullJsonRep()
        return response