Ejemplo n.º 1
0
 def get_project_responses(self, _req, _resp):
     """ screendoor page response """
     scrndr = Screendoor(os.environ['SD_KEY'])
     responses = scrndr.get_project_responses(os.environ['SD_PROJECT'], {
         'per_page': 1,
         'page': 1
     }, 1)
     _resp.status = falcon.HTTP_200
     _resp.body = json.dumps(responses)
Ejemplo n.º 2
0
 def on_get(self, _req, _resp, name):
     """ on page GET requests """
     dispatch = None
     if hasattr(self.__class__, name) and callable(getattr(self.__class__, name)):
         dispatch = getattr(self, name)
     if dispatch:
         self.scrndr = Screendoor(os.environ['SD_KEY'])
         self.project_id = os.environ['SD_PROJECT_ID']
         self.response_id = os.environ['SD_RESPONSE_ID']
     else:
         dispatch = self.default_page
     dispatch(_req, _resp)
Ejemplo n.º 3
0
def test_get_project_responses():
    """ Test get_project_responses """
    scrndr = Screendoor(SD_KEY)
    with patch('screendoor_sdk.screendoor.requests.get') as mock_get:
        mock_get.return_value.status_code = 200
        mock_get.return_value.json.return_value = json.loads(MOCK_RESPONSES)
        responses = scrndr.get_project_responses(SD_PROJECT_ID, {'page': 1}, 2)
    assert json.loads(MOCK_RESPONSES) + json.loads(MOCK_RESPONSES) == responses

    with patch('screendoor_sdk.screendoor.requests.get') as mock_get:
        mock_get.return_value.status_code = 200
        mock_get.return_value.json.return_value = []
        responses = scrndr.get_project_responses(SD_PROJECT_ID, {'page': 1}, 1)
    assert [] == responses
Ejemplo n.º 4
0
def test_get_url():
    """ Test get api url """
    params = {'per_page': 50, 'page': 10}

    scrndr = Screendoor(SD_KEY, '0', 'https://screendoor.dobt.co/api')
    sd_url = scrndr.get_url({
        'path': '/projects/' + SD_PROJECT_ID + '/responses',
        'params': params
    })

    expected_sd_url = 'https://screendoor.dobt.co/api/projects/'
    expected_sd_url += SD_PROJECT_ID + '/responses?v=0&api_key=' + SD_KEY + '&per_page=50&page=10'

    assert expected_sd_url == sd_url
Ejemplo n.º 5
0
def test_screendoor_url():
    """Test screen api url"""
    sd_key = 'SCREENDOOR_API_KEY'
    sd_project_id = '1234'
    params = {'per_page': 50, 'page': 10}

    sd_api = Screendoor(sd_key, '0', 'https://screendoor.dobt.co/api')
    sd_url = sd_api.get_url({
        'path': '/projects/' + sd_project_id + '/responses',
        'params': params
    })

    expected_sd_url = 'https://screendoor.dobt.co/api/projects/'
    expected_sd_url += sd_project_id + '/responses?v=0&api_key=' + sd_key + '&per_page=50&page=10'

    assert expected_sd_url == sd_url
Ejemplo n.º 6
0
def test_update_project_response():
    """ TEST update_project_response """
    scrndr = Screendoor(SD_KEY)
    with patch('screendoor_sdk.screendoor.requests.put') as mock_put:
        mock_put.return_value.status_code = 200
        mock_put.return_value.json.return_value = json.loads(MOCK_RESPONSES)
        responses = scrndr.update_project_response(
            SD_PROJECT_ID, 1, {"hkf58ruh": {
                "checked": ["Option 3"]
            }}, 'Submitted', ['Label One'])
    assert json.loads(MOCK_RESPONSES) == responses.json()

    with patch('screendoor_sdk.screendoor.requests.put') as mock_put:
        mock_json = """{"ok": false, "errors": {"responses_hkf58ruh": ["can't be blank"]}}"""
        mock_put.return_value.status_code = 400
        mock_put.return_value.json.return_value = json.loads(mock_json)
        responses = scrndr.update_project_response(
            SD_PROJECT_ID, 1, {"hkf58ruh": {
                "checked": ["Option 3"]
            }}, 'Submitted', ['Label One'], True)
    assert json.loads(mock_json) == responses.json()
Ejemplo n.º 7
0
def test_project_labels():
    """ Test project_labels """
    labels = [{
        "name": "Missing information",
        "color": "3600ff",
        "responses_count": 1
    }, {
        "name": "Questionable",
        "color": "336699",
        "responses_count": 0
    }]

    scrndr = Screendoor(SD_KEY)
    with patch('screendoor_sdk.screendoor.requests.get') as mock_get:
        mock_get.return_value.status_code = 200
        mock_get.return_value.json.return_value = labels
        responses = scrndr.get_project_labels(SD_PROJECT_ID)
    assert labels == responses

    with patch('screendoor_sdk.screendoor.requests.get') as mock_get:
        mock_get.return_value.status_code = 401
        mock_get.return_value.json.return_value = {'error': 'not authorized'}
        responses = scrndr.get_project_labels(SD_PROJECT_ID)
    assert [] == responses
Ejemplo n.º 8
0
class PermitList():
    """Permit List class"""
    scrndr = None
    scrndr_proj_id = None
    logger_name = ''

    referred_label_map = {
        'MOD - Referred': "Mayor's Office of Disability",
        'Planning - Referred': "Planning Department",
        'Fire - Referred': "Fire Department",
        'DPH - Referred': "Department of Public Health",
        'Police - Referred': "Police Department",
        'Environment - Referred': "Department of the Environment"
    }

    status_map = {
        'Submitted': 'Submitted',
        'Processing': 'Processing',
        'On Hold': 'On Hold',
        'Approved': 'Approved',
        'Build-out': 'Under Construction'
    }

    activity_map = {
        'retail': {
            'text': 'retailer (medical and adult use)',
            'value': 'retailer (medical and adult use)'
        },
        'delivery': {
            'text': 'delivery only retailer (medical and adult use)',
            'value': 'delivery only retail (medical and adult use)'
        },
        'mcd': {
            'text': 'medicinal cannabis retailer (medical only)',
            'value': 'medical retailer (medical only)'
        }
    }

    def __init__(self):
        self.logger_name = self.__class__.__name__.lower()

    def init_screendoor(self, key, version, host, project_id):
        """initialize screendoor"""
        self.scrndr = Screendoor(key, version, host)
        self.scrndr_proj_id = project_id

    def get_permit_list(self, permit_type):
        """return list of permits"""
        self.logger_name += '.get_permit_list.' + permit_type
        params = {'per_page': 100, 'page': 1}

        # pylint: disable=line-too-long
        params[
            'advanced_search'] = '%5B%7B"name"%3A"form"%2C"placeholder"%3Anull%2C"method"%3A"is"%2C"value"%3A5804%7D%2C%7B"name"%3A"rfdd8a5g7g"%2C"placeholder"%3A"answer_to"%2C"method"%3A"is_any"%2C"value"%3A%5B"retailer+(medical+and+adult+use)"%2C"medical+retailer+(medical+only)"%2C"delivery+only+retail+(medical+and+adult+use)"%5D%7D%5D'

        sd_responses = self.scrndr.get_project_responses(
            self.scrndr_proj_id, params, 500)

        sd_responses_context = sd_responses
        if isinstance(sd_responses, list):
            sd_responses_context = {
                'length':
                len(sd_responses),
                'data':
                list(map(lambda x: x.get('sequential_id', ''), sd_responses))
            }

        with sentry_sdk.configure_scope() as scope:
            scope.set_tag('logger', self.logger_name)
            scope.set_extra('get_permit_list.sd_responses',
                            sd_responses_context)

        return self.get_list_transform(sd_responses)

    def get_list_transform(self, sd_responses):
        """return a transformed list from screendoor reponses """
        permit_list = False
        responses_missing = []
        sd_fields = {
            'activity': 'dd8a5g7g',
            'app_id': 'uqqrsogr',
            'biz_name': 't00kheyd',
            'dba_name': '60w4ep9y',
            'addr': 'kbqz4189',
            'parcel': 'kvrgbqrl'
        }
        if isinstance(sd_responses, list):
            permit_list = []
            for resp in sd_responses:
                if (resp.get('responses', False)
                        and resp['responses'].get(sd_fields['activity'], False)
                        and
                    (resp['responses'].get(sd_fields['biz_name'], False)
                     or resp['responses'].get(sd_fields['dba_name'], False))
                        and
                    (resp.get('status', '') in self.status_map.keys())):
                    resp_status = self.status_map[resp.get('status')].lower()
                    resp_referred = self.get_referred_departments(
                        resp.get('labels'))
                    item = {
                        'application_id': '',
                        'business_name': '',
                        'dba_name': '',
                        'address': '',
                        'parcel': '',
                        'status': resp_status,
                        'referred': ", ".join(resp_referred)
                    }
                    data = resp['responses']
                    item['application_id'] = str(
                        data.get(sd_fields['app_id']) or '')
                    if not data.get(sd_fields['app_id']):
                        item['application_id'] = 'P-' + str(resp['id'])
                    item['business_name'] = str(
                        data.get(sd_fields['biz_name']) or '')
                    item['dba_name'] = str(
                        data.get(sd_fields['dba_name'])
                        or item['business_name'])
                    item['parcel'] = data.get(sd_fields['parcel'], '')
                    if data.get(sd_fields['addr']) and data.get(
                            sd_fields['addr']).get('street'):
                        addr = data.get(sd_fields['addr'])
                        item['address'] = str(addr.get('street') or '')
                        item['address'] += ', ' + str(addr.get('city') or '')
                        item['address'] += ', ' + str(addr.get('state') or '')
                        item['address'] += ' ' + str(addr.get('zipcode') or '')
                    item['address'] = item['address'].strip(' ,')
                    if data[sd_fields['activity']] and data[
                            sd_fields['activity']]['checked']:
                        for applied_permit_type in data[
                                sd_fields['activity']]['checked']:
                            item[applied_permit_type.lower()] = resp_status

                    permit_list.append(item)
                else:
                    responses_missing.append({
                        'id':
                        resp['id'],
                        'sequential_id':
                        resp['sequential_id']
                    })

            with sentry_sdk.configure_scope() as scope:
                scope.set_extra('get_list_transform.permit_list_len',
                                len(permit_list))
                if responses_missing:
                    scope.set_extra('get_list_transform.responses_missing',
                                    responses_missing)
        return permit_list

    def get_legacy_list_transform(self, permit_list):
        """ return permit list in legacy format """
        legacy_permit_list = {}
        for item in permit_list:
            new_item = {
                'application_id': item['application_id'],
                'dba_name': item['dba_name'],
                'address': item['address'],
                'parcel': item['parcel'],
                'activities': '',
                'referring_dept': item['referred'],
                'status': item['status'].title()
            }
            key = (new_item['dba_name'] + ' ' +
                   new_item['application_id']).strip().upper()
            acts = []
            if item.get(self.activity_map['retail']['value']):
                acts.append(self.activity_map['retail']['text'])
            if item.get(self.activity_map['delivery']['value']):
                acts.append(self.activity_map['delivery']['text'])
            if item.get(self.activity_map['mcd']['value']):
                acts.append(self.activity_map['mcd']['text'])
            new_item['activities'] = ", ".join(acts)

            #skip if activity only contains delivery only
            if new_item['activities'] != self.activity_map['delivery']['text']:
                legacy_permit_list[key] = new_item

        return legacy_permit_list

    def get_referred_departments(self, labels):
        """ return list of referred to departments """
        referred_to = []
        for label in labels:
            if label in list(self.referred_label_map.keys()):
                referred_to.append(self.referred_label_map.get(label))
        return referred_to

    def on_get(self, _req, resp, permit_type):
        """on GET request
        return list of permits
        """
        msg = False
        if permit_type in ('retail', 'retail_legacy'):
            permit_list = self.get_permit_list(permit_type)
            permit_list.sort(key=lambda v: ((v.get('dba_name') if v.get(
                'dba_name') else v.get('business_name', '')) + ' ' + v.get(
                    'application_id', '')).upper())
            if isinstance(permit_list, list):
                if permit_type == 'retail_legacy':
                    data = self.get_legacy_list_transform(permit_list)
                else:
                    data = {'list': permit_list}
                data_json = jsend.success(data)
                msg = 'success (' + str(len(permit_list)) + ')'
        else:
            pass

        if msg is not False:
            sentry_sdk.capture_message(msg, 'info')
            resp.body = json.dumps(data_json)
            resp.status = falcon.HTTP_200
        else:
            msg = 'ERROR'
            sentry_sdk.capture_message(msg, 'error')
            resp.body = json.dumps(jsend.error(msg))
            resp.status = falcon.HTTP_400
Ejemplo n.º 9
0
 def init_screendoor(self, key, version, host, project_id):
     """initialize screendoor"""
     self.scrndr = Screendoor(key, version, host)
     self.scrndr_proj_id = project_id
Ejemplo n.º 10
0
class Page():
    """ Page class """
    scrndr = None
    project_id = None
    response_id = None

    def on_get(self, _req, _resp, name):
        """ on page GET requests """
        dispatch = None
        if hasattr(self.__class__, name) and callable(getattr(self.__class__, name)):
            dispatch = getattr(self, name)
        if dispatch:
            self.scrndr = Screendoor(os.environ['SD_KEY'])
            self.project_id = os.environ['SD_PROJECT_ID']
            self.response_id = os.environ['SD_RESPONSE_ID']
        else:
            dispatch = self.default_page
        dispatch(_req, _resp)

    def default_page(self, _req, _resp):
        """ default page response """
        msg = {'message': 'hello'}
        _resp.body = json.dumps(jsend.success(msg))
        _resp.status = falcon.HTTP_200

    def default_error(self, _req, resp):
        """Handle default error"""
        msg = falcon.HTTP_404
        status = falcon.HTTP_404
        resp.status = status
        msg_error = jsend.error(msg)
        resp.body = json.dumps(msg_error)

    def get_project_responses(self, _req, resp):
        """ screendoor project response """
        responses = self.scrndr.get_project_responses(
            self.project_id,
            {'per_page': 10, 'page' : 1},
            1
            )
        resp.status = falcon.HTTP_200
        resp.body = json.dumps(responses)

    def get_project_labels(self, _req, resp):
        """ screendoor project labels """
        responses = self.scrndr.get_project_labels(self.project_id)
        resp.status = falcon.HTTP_200
        resp.body = json.dumps(responses)

    def update_project_response_labels_all(self, _req, resp):
        """ update a project response with all labels """
        response_id = self.response_id
        response_fields = None
        status = None
        labels = []
        force_validation = True

        project_labels = self.scrndr.get_project_labels(self.project_id)
        if project_labels:
            for label in project_labels:
                labels.append(label['name'])

        response = self.scrndr.update_project_response(
            self.project_id, response_id, response_fields,
            status, labels, force_validation)
        if response.headers:
            resp.status = response.headers['Status']
            resp.body = json.dumps(response.json())
        else:
            self.default_error(_req, resp)

    def update_project_response_labels_none(self, _req, resp):
        """ update a project response with no labels"""
        response_id = self.response_id
        response_fields = None
        status = None
        labels = []
        force_validation = True

        response = self.scrndr.update_project_response(
            self.project_id, response_id, response_fields,
            status, labels, force_validation)
        if response.headers:
            resp.status = response.headers['Status']
            resp.body = json.dumps(response.json())
        else:
            self.default_error(_req, resp)