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

#
# Base DM controller class.
#

#######################################################################

import cherrypy
import httplib
from sys import exc_info
from dm.common.utility import loggingManager
from dm.common.constants import dmStatus
from dm.common.constants import dmHttpHeaders
from dm.common.exceptions.dmException import DmException
from dm.common.exceptions import dmExceptionMap
from dm.common.exceptions.internalError import InternalError

#######################################################################

class DmController(object):
    """ Base controller class. """
    def __init__(self):
        self._logger = loggingManager.getLogger(self.__class__.__name__)

    def getLogger(self):
        return self._logger

    @classmethod
    def addDmResponseHeaders(cls, status=dmStatus.DM_OK, msg='Success', exceptionType=None):
        cherrypy.response.headers[dmHttpHeaders.DM_STATUS_CODE_HTTP_HEADER] = status
        cherrypy.response.headers[dmHttpHeaders.DM_STATUS_MESSAGE_HTTP_HEADER] = msg
        if exceptionType is not None:
            cherrypy.response.headers[dmHttpHeaders.DM_EXCEPTION_TYPE_HTTP_HEADER] = exceptionType

    @classmethod
    def addDmSessionRoleHeaders(cls, role):
        cherrypy.response.headers[dmHttpHeaders.DM_SESSION_ROLE_HTTP_HEADER] = role

    @classmethod
    def addDmExceptionHeaders(cls, ex):
        cls.handleException(ex)

    @classmethod
    def handleCpException(cls):
        cherrypy.response.status = httplib.OK
        ex = exc_info()[1]
        if ex == None:
            ex = InternalError('Internal Webservice Error')
        cls.handleException(ex)

    @classmethod
    def handleException(cls, ex):
        exClass = ex.__class__.__name__.split('.')[-1]
        status = None
        msg = '%s' % ex
        msg = msg.split('\n')[0]
        for code in dmExceptionMap.exceptionMap.keys():
            exStr = dmExceptionMap.exceptionMap.get(code).split('.')[-1]
            if exStr == exClass:
                status = code
        if not status:
            status = dmStatus.DM_ERROR
        cls.addDmResponseHeaders(status, msg, exClass)

    def formatJsonResponse(self, response):
        cherrypy.response.headers['Content-Type'] = 'application/json'
        return '%s' % (response)