Example #1
0
    def POST(self):
        session = get_session()
        params = web.input(username="", password="")
        username = params.username
        password = params.password
        r = auth_user(db, username, password)
        if r[0]:
            session.loggedin = True
            info = r[1]
            session.username = info.firstname + " " + info.lastname
            session.sesid = info.id
            session.role = info.role
            put_session(session)

            l = locals()
            del l['self']
            if info.role == 'Warehouse Manager':
                return web.seeother("/warehousedata")
            elif info.role == 'Micro Planning':
                return web.seeother("/reporters")
            else:
                return web.seeother("/dashboard")
        else:
            session.loggedin = False
            session.logon_err = r[1]
        l = locals()
        del l['self']
        return render.logon(**l)
Example #2
0
    def POST(self):
        session = get_session()
        params = web.input(username="", password="")
        username = params.username
        password = params.password
        r = auth_user(db, username, password)
        if r[0]:
            session.loggedin = True
            info = r[1]
            session.name = info.firstname + " " + info.lastname
            session.username = username
            session.sesid = info.id
            session.role = info.role
            session.criteria = ""
            put_session(session)
            log_dict = {
                'logtype': 'Web',
                'action': 'Login',
                'actor': username,
                'ip': web.ctx['ip'],
                'descr': 'User %s logged in' % username,
                'user': info.id
            }
            audit_log(db, log_dict)

            l = locals()
            del l['self']
            return web.seeother("/requests")
        else:
            session.loggedin = False
            session.logon_err = r[1]
        l = locals()
        del l['self']
        return render.login(**l)
Example #3
0
    def POST(self):
        session = get_session()
        params = web.input(username="", password="")
        username = params.username
        password = params.password
        r = auth_user(db, username, password)
        if r[0]:
            session.loggedin = True
            info = r[1]
            session.name = info.firstname + " " + info.lastname
            session.username = username
            session.sesid = info.id
            session.role = info.role
            session.perms = role_permissions(db, info.user_role)
            # get system permissions at log in time
            session.can_view_reports = has_perm(session.perms, 'Reports', 'r')
            session.can_view_warehouse = has_perm(session.perms, 'Warehouse',
                                                  'r')
            session.can_manage_warehouse = has_perm(session.perms, 'Warehouse',
                                                    'w')
            session.can_view_reporters = has_perm(session.perms, 'Reporters',
                                                  'r')
            session.can_manage_reporters = has_perm(session.perms, 'Reporters',
                                                    'w')
            session.can_view_dpoints = has_perm(session.perms,
                                                'Distribution Points', 'r')
            session.can_manage_dpoints = has_perm(session.perms,
                                                  'Distribution Points', 'w')
            session.can_view_adminunits = has_perm(session.perms,
                                                   'Admin Units', 'r')
            session.can_manage_adminunits = has_perm(session.perms,
                                                     'Admin Units', 'w')
            put_session(session)
            log_dict = {
                'logtype': 'Web',
                'action': 'Login',
                'actor': username,
                'ip': web.ctx['ip'],
                'descr': 'User %s logged in' % username,
                'user': info.id
            }
            audit_log(db, log_dict)

            l = locals()
            del l['self']
            if info.role == 'Warehouse Manager':
                return web.seeother("/warehousedata")
            elif info.role == 'Micro Planning':
                return web.seeother("/reporters")
            elif info.role == 'Data Manager':
                return web.seeother("/adminunits")
            else:
                return web.seeother("/dashboard")
        else:
            session.loggedin = False
            session.logon_err = r[1]
        l = locals()
        del l['self']
        return render.login(**l)
Example #4
0
 def GET(self):
     username, password = get_basic_auth_credentials()
     r = auth_user(db, username, password)
     if not r[0]:
         web.header("Content-Type", "application/json; charset=utf-8")
         web.header('WWW-Authenticate', 'Basic realm="Auth API"')
         web.ctx.status = '401 Unauthorized'
         return json.dumps({'detail': 'Authentication failed!'})
     web.header("Content-Type", "application/zip; charset=utf-8")
Example #5
0
 def GET(self):
     username, password = get_basic_auth_credentials()
     r = auth_user(db, username, password)
     if not r[0]:
         web.header("Content-Type", "application/json; charset=utf-8")
         web.header('WWW-Authenticate', 'Basic realm="Auth API"')
         web.ctx.status = '401 Unauthorized'
         return json.dumps({'detail': 'Authentication failed!'})
     web.header("Content-Type", "application/zip; charset=utf-8")
     # web.header('Content-disposition', 'attachment; filename=%s.csv'%file_name)
     web.seeother("/static/downloads/reporters_all.xls.zip")
Example #6
0
    def POST(self):
        params = web.input(optoutall="false")
        web.header("Content-Type", "application/json; charset=utf-8")
        username, password = get_basic_auth_credentials()
        r = auth_user(db, username, password)
        if not r[0]:
            web.header('WWW-Authenticate', 'Basic realm="Auth API"')
            web.ctx.status = '401 Unauthorized'
            return json.dumps({'detail': 'Authentication failed!'})

        secreceivers = get_webhook_msg_old(params, 'secreceivers')
        pprint.pprint(secreceivers)
        payload = json.loads(secreceivers)
        if params.optoutall == "true":
            for k, v in payload.iteritems():
                contact_id = v['contact_id']
                contact_field = v['contact_field']
                db.query(
                    "UPDATE values_value SET (string_value, decimal_value) = ('', NULL) "
                    "WHERE contact_id = $contact_id AND contact_field_id = $contact_field_id",
                    {
                        'contact_id': contact_id,
                        'contact_field_id': contact_field
                    })
            return json.dumps({'success': 'true'})

        optout_option = get_webhook_msg_old(params, 'OptOutOption')
        print("OptOutOption => ", optout_option)

        try:
            contact_details = payload['%s' % int(float(optout_option))]
        except:
            contact_details = None
        if not contact_details:
            return json.dumps({'success': 'False'})

        contact_id = contact_details['contact_id']
        contact_field = contact_details['contact_field']
        print("contact_id=>", contact_id, " fields => ", contact_field)

        db.query(
            "UPDATE values_value SET (string_value, decimal_value) = ('', NULL) "
            "WHERE contact_id = $contact_id AND contact_field_id = $contact_field_id",
            {
                'contact_id': contact_id,
                'contact_field_id': contact_field
            })

        return json.dumps({'success': 'True'})
Example #7
0
    def POST(self):
        session = get_session()
        params = web.input(username="", password="")
        username = params.username
        password = params.password
        r = auth_user(db, username, password)
        if r[0]:
            session.loggedin = True
            info = r[1]
            session.name = info.firstname + " " + info.lastname
            session.username = username
            session.sesid = info.id
            session.role = info.role
            session.districts = info.districts
            # districts_string to be used in a SIMILAR TO statment while getting reports from requests table
            session.districts_string = '|'.join(['%s' % allDistricts[d] for d in info.districts])
            print(session.districts_string)
            session.districts_array = str([int(x) for x in info.districts]).replace(
                '[', '{').replace(']', '}').replace('\'', '\"')
            session.criteria = ""
            user_perms = []
            perms = db.query(
                "SELECT codename FROM permissions WHERE id IN "
                " (SELECT permission_id FROM user_permissions WHERE user_id = $user_id)", {'user_id': info.id})
            for p in perms:
                user_perms.append(p['codename'])
            session.permissions = user_perms
            put_session(session)
            log_dict = {
                'logtype': 'Web', 'action': 'Login', 'actor': username,
                'ip': web.ctx['ip'], 'descr': 'User %s logged in' % username,
                'user': info.id
            }
            audit_log(db, log_dict)

            l = locals()
            del l['self']
            if info.role == 'District User':
                return web.seeother("/approve")
            else:
                return web.seeother("/approve")
        else:
            session.loggedin = False
            session.logon_err = r[1]
        l = locals()
        del l['self']
        return render.login(**l)
Example #8
0
    def GET(self, district_code):
        params = web.input(from_date="", type="")
        web.header("Content-Type", "application/json; charset=utf-8")
        username, password = get_basic_auth_credentials()
        r = auth_user(db, username, password)
        if not r[0]:
            web.header('WWW-Authenticate', 'Basic realm="Auth API"')
            web.ctx.status = '401 Unauthorized'
            return json.dumps({'detail': 'Authentication failed!'})

        y = db.query("SELECT id, lft, rght FROM locations WHERE code = $code",
                     {'code': district_code})
        location_id = 0
        if y:
            loc = y[0]
            location_id = loc['id']
            lft = loc['lft']
            rght = loc['rght']
        SQL = (
            "SELECT a.id, a.name, a.code, a.uuid, a.lft, a.rght, a.tree_id, a.tree_parent_id, "
            "b.code as parent_code, c.level, c.name as type, "
            "to_char(a.cdate, 'YYYY-mm-dd') as created "
            " FROM locations a, locations b, locationtype c"
            " WHERE "
            " a.tree_parent_id = b.id "
            " AND a.lft > %s AND a.lft < %s "
            " AND a.type_id = c.id ")
        SQL = SQL % (lft, rght)
        if params.from_date:
            SQL += " AND a.cdate >= $date "
        if params.type:
            SQL += " AND c.name = $type "
        r = db.query(SQL, {
            'id': location_id,
            'date': params.from_date,
            'type': params.type
        })
        ret = []
        for i in r:
            ret.append(dict(i))
        return json.dumps(ret)
Example #9
0
    def POST(self):
        params = web.input()
        web.header("Content-Type", "application/json; charset=utf-8")
        username, password = get_basic_auth_credentials()
        r = auth_user(db, username, password)
        if not r[0]:
            web.header('WWW-Authenticate', 'Basic realm="Auth API"')
            web.ctx.status = '401 Unauthorized'
            return json.dumps({'detail': 'Authentication failed!'})

        client = TembaClient(
            config.get('familyconnect_uri', 'http://localhost:8000/'),
            config['api_token'])

        secreceivers = get_webhook_msg_old(params, 'secreceivers')
        pprint.pprint(secreceivers)
        payload = json.loads(secreceivers)

        optout_option = get_webhook_msg_old(params, 'OptOutOption')
        print("OptOutOption => ", optout_option)
        try:
            contact_details = payload['%s' % int(float(optout_option))]
        except:
            contact_details = None
        if not contact_details:
            return json.dumps({'success': 'False'})

        contact_id = contact_details['contact_id']
        contact_uuid = contact_details['uuid']
        print("contact_id=>", contact_id, " uuid => ", contact_uuid)

        date_of_birth = get_webhook_msg_old(params, 'child_dob')

        try:
            client.create_flow_start(config['babytrigger_flow_uuid'],
                                     contacts=[contact_uuid],
                                     extra={'child_dob': date_of_birth})
        except:
            pass

        return json.dumps({'success': 'True'})
Example #10
0
    def GET(self):
        # params = web.input(form="")
        web.header("Content-Type", "application/json; charset=utf-8")

        username, password = get_basic_auth_credentials()
        r = auth_user(db, username, password)
        if not r[0]:
            web.header('WWW-Authenticate', 'Basic realm="Auth API"')
            web.ctx.status = '401 Unauthorized'
            return json.dumps({'detail': 'Authentication failed!'})

        indicators = db.query(
            "SELECT id, form_order, form, slug, cmd, description, shortname, dataset, dataelement, "
            "category_combo, threshold FROM dhis2_mtrack_indicators_mapping "
            "ORDER BY form, form_order")
        ret = {}
        for i in indicators:
            ret[i["slug"]] = {
                'categoryOptionCombo': i['category_combo'],
                'dataElement': i['dataelement'],
                'descr': i['description'],
            }
        return json.dumps(ret)
Example #11
0
 def GET(self, location_code):
     params = web.input(role="")
     web.header("Content-Type", "application/json; charset=utf-8")
     username, password = get_basic_auth_credentials()
     r = auth_user(db, username, password)
     if not r[0]:
         web.header('WWW-Authenticate', 'Basic realm="Auth API"')
         web.ctx.status = '401 Unauthorized'
         return json.dumps({'detail': 'Authentication failed!'})
     ret = []
     reporter_role = params.role
     SQL = (
         "SELECT firstname, lastname, telephone, alternate_tel, email, national_id, "
         "reporting_location, district, role, loc_name, location_code FROM reporters_view4 "
         "WHERE reporting_location IN (SELECT id FROM get_descendants_including_self(( SELECT id FROM "
         "locations WHERE code=$location_code))) ")
     if reporter_role:
         SQL += " AND lower(role) = $role"
     res = db.query(SQL, {
         'location_code': location_code,
         'role': reporter_role.lower()
     })
     if res:
         for r in res:
             ret.append({
                 "firstname": r.firstname,
                 "lastname": r.lastname,
                 "telephone": r.telephone,
                 "alternate_tel": r.alternate_tel,
                 "email": r.email,
                 "national_id": r.national_id,
                 "location_name": r.loc_name,
                 "location_code": r.location_code,
                 "distrcit": r.district,
                 "role": r.role
             })
     return json.dumps(ret)
Example #12
0
    def GET(self):
        params = web.input(contact="", babytrigger="false")
        web.header("Content-Type", "application/json; charset=utf-8")
        username, password = get_basic_auth_credentials()
        r = auth_user(db, username, password)
        if not r[0]:
            web.header('WWW-Authenticate', 'Basic realm="Auth API"')
            web.ctx.status = '401 Unauthorized'
            return json.dumps({'detail': 'Authentication failed!'})
        print(params.contact)
        SQL = ("SELECT * FROM fcapp_get_secondary_receivers($contact) ")
        if params.babytrigger == "true":
            SQL += " WHERE has_msisdn = 'f'"

        res = db.query(SQL, {'contact': params.contact})
        payload = {'secreceivers': {}}
        receivers_count = 0
        screen_1 = ""
        screen_2 = ""
        screen_3 = ""
        # screen_1_len = 0
        # screen_2_len = 0
        # screen_3_len = 0
        if res:
            for idx, r in enumerate(res, 1):
                receivers_count += 1
                if idx < 6:
                    screen_1 += "%s. %s\n" % (idx, r['name'])
                    payload['secreceivers']['%s' % idx] = {
                        'name': r['name'],
                        'uuid': r['uuid'],
                        'contact_id': r['contact_id'],
                        'contact_field': r['contact_field']
                    }
                elif idx > 5 and idx < 11:
                    screen_2 += "%s. %s\n" % ((idx + 1), r['name'])
                    payload['secreceivers']['%s' % (idx + 1)] = {
                        'name': r['name'],
                        'uuid': r['uuid'],
                        'contact_id': r['contact_id'],
                        'contact_field': r['contact_field']
                    }
                elif idx > 10 and idx < 16:
                    screen_3 += "%s. %s\n" % ((idx + 2), r['name'])
                    payload['secreceivers']['%s' % (idx + 2)] = {
                        'name': r['name'],
                        'uuid': r['uuid'],
                        'contact_id': r['contact_id'],
                        'contact_field': r['contact_field']
                    }

        # screen_1_len = len(screen_1.strip().split('\n'))
        # screen_2_len = len(screen_2.strip().split('\n')) if screen_2 else 0
        # screen_3_len = len(screen_3.strip().split('\n')) if screen_3 else 0

        if screen_2:
            screen_1 += "6. More\n"
            screen_2 += "0. Back"
        if screen_3:
            screen_2 += "12. More\n"
            screen_3 += "0. Back"

        payload['receivers_count'] = receivers_count
        payload['screen_1'] = screen_1
        payload['screen_2'] = screen_2
        payload['screen_3'] = screen_3
        # payload['screen_1_len'] = screen_1_len
        # payload['screen_2_len'] = screen_2_len
        # payload['screen_3_len'] = screen_3_len

        pprint.pprint(payload)

        return json.dumps(payload)
Example #13
0
    def GET(self):
        params = web.input(subcounty="",
                           subcountyid="",
                           districtid="",
                           original_name="",
                           username="",
                           password="")
        username = params.username
        password = params.password
        r = auth_user(db, username, password)
        if not r[0]:
            return "Unauthorized access"

        with db.transaction():
            res = db.query("SELECT id FROM locations WHERE dhis2id = $dhis2id",
                           {'dhis2id': params.districtid})
            if res:
                district_id = res[0]['id']
                synced = db.query(
                    "SELECT id FROM locations WHERE dhis2id = $dhis2id",
                    {'dhis2id': params.subcountyid})
                if synced:
                    # we already synced this one
                    # db.query(
                    #    "UPDATE locations SET name = $name WHERE dhis2id = $dhis2id",
                    #    {'name': params.original_name, 'dhis2id': params.subcountyid})
                    return "Subcounty already synced!"
                subcounties = {}
                res2 = db.query(
                    "SELECT id, name FROM locations WHERE tree_parent_id = $id",
                    {'id': district_id})
                for subcounty in res2:
                    subcounties[subcounty['name']] = subcounty['id']
                if params.subcounty in subcounties:
                    print "We have an exact match"
                    db.query(
                        "UPDATE locations SET dhis2id = $dhis2id WHERE id = $id",
                        {
                            'dhis2id': params.subcountyid,
                            'id': subcounties[params.subcounty]
                        })
                else:
                    print "We have to fuzzy match this one"
                    match_dict = {}
                    res3 = db.query(
                        "SELECT id, name FROM locations WHERE tree_parent_id = $id AND dhis2id = ''",
                        {'id': district_id})
                    for m in res3:
                        match_dict[m['name']] = m['id']
                    # match_list has those we want to try fuzzy matching with
                    choices = match_dict.keys()
                    matched_name = find_closest_match(params.original_name,
                                                      choices)
                    if matched_name:
                        pmatch = difflib.SequenceMatcher(
                            None, matched_name, params.subcounty).ratio()
                        # if pmatch > 0.84:
                        if pmatch > 0.9:
                            print "High match rate (%s%%) [%s => %s]" % (
                                (pmatch * 100), params.original_name,
                                matched_name)
                            db.query(
                                "UPDATE locations SET (dhis2id) = ($dhis2id) WHERE id = $id",
                                {
                                    'name': params.original_name,
                                    'dhis2id': params.subcountyid,
                                    'id': match_dict[matched_name]
                                })
                        else:
                            print "Low mating rate (%s%%) [%s => %s]" % (
                                (pmatch * 100), params.original_name,
                                matched_name)
                    else:
                        print "Nothing appropriate to fuzzy match with for =>", params.subcounty
        return "Subcounty Sync Done."
Example #14
0
    def GET(self):
        params = web.input(name="",
                           ftype="",
                           district="",
                           code="",
                           is_033b='f',
                           dhis2id="",
                           subcounty="",
                           username="",
                           password="")
        username = params.username
        password = params.password
        r = auth_user(db, username, password)
        if not r[0]:
            return "Unauthorized access"

        with db.transaction():
            res = db.query(
                "SELECT id FROM healthfacility_type "
                "WHERE lower(name) = $name ", {'name': params.ftype.lower()})
            if res:
                type_id = res[0]["id"]
                r = db.query(
                    "SELECT id FROM healthfacilities WHERE code = $code",
                    {'code': params.code})
                if not r:
                    logging.debug("Creating facility with ID:%s" % params.code)
                    new = db.query(
                        "INSERT INTO healthfacilities "
                        "(name, code, type_id, district, is_033b) VALUES "
                        "($name, $dhis2id, $type, $district, $is_033b) RETURNING id",
                        {
                            'name': params.name,
                            'dhis2id': params.dhis2id,
                            'code': params.code,
                            'type': type_id,
                            'district': params.district,
                            'active': True,
                            'deleted': False,
                            'is_033b': params.is_033b
                        })
                    if new:
                        facility_id = new[0]["id"]
                        d = db.query(
                            "SELECT id FROM locations WHERE lower(name) = $district "
                            "AND type_id = 3",
                            {'district': params.district.lower()})
                        if d:
                            district_id = d[0]["id"]
                            db.query(
                                "UPDATE healthfacilities SET district_id = $district_id "
                                " WHERE id = $facility", {
                                    'district_id': district_id,
                                    'facility': facility_id
                                })
                            res2 = db.query(
                                "SELECT id FROM locations "
                                "WHERE name ilike $name AND type_id = 4"
                                " AND tree_parent_id = $district", {
                                    'name': '%%%s%%' % params.subcounty,
                                    'district': district_id
                                })
                            if res2:
                                # we have a sub county in mTrac
                                subcounty_id = res2[0]["id"]
                                db.query(
                                    "UPDATE healthfacilities SET location = $loc, "
                                    "location_name = $loc_name"
                                    " WHERE id = $facility ", {
                                        'facility': facility_id,
                                        'loc': subcounty_id,
                                        'loc_name': params.subcounty
                                    })
                                logging.debug(
                                    "Set Facility Location: ID:%s Location:%s"
                                    % (params.code, subcounty_id))
                            else:
                                # make district catchment area
                                db.query(
                                    "UPDATE healthfacilities SET "
                                    " location = $loc, location_name = $loc_name WHERE id = $facility",
                                    {
                                        'facility': facility_id,
                                        'loc': district_id,
                                        'loc_name': params.subcounty
                                    })
                                logging.debug(
                                    "Set Facility Location: ID:%s Location:%s"
                                    % (params.code, district_id))
                        logging.debug(
                            "Facility with ID:%s sucessfully created." %
                            params.code)
                    return "Created Facility ID:%s" % params.code
                else:
                    # facility with passed uuid already exists
                    logging.debug("updating facility with ID:%s" % params.code)
                    facility_id = r[0]["id"]
                    db.query(
                        "UPDATE healthfacilities SET "
                        "name = $name, code = $dhis2id, type_id = $type, district = $district, "
                        "is_033b = $is_033b "
                        " WHERE id = $facility ", {
                            'name': params.name,
                            'dhis2id': params.dhis2id,
                            'type': type_id,
                            'district': params.district,
                            'facility': facility_id,
                            'is_033b': params.is_033b
                        })

                    logging.debug("Set h033b for facility with ID:%s to %s" %
                                  (params.code, params.is_033b))
                    d = db.query(
                        "SELECT id FROM locations WHERE lower(name) = $name "
                        "AND type_id = 3", {'name': params.district.lower()})
                    if d:
                        district_id = d[0]["id"]
                        db.query(
                            "UPDATE healthfacilities SET district_id = $district_id "
                            "WHERE id = $facility ", {
                                'facility': facility_id,
                                'district_id': district_id
                            })
                        res2 = db.query(
                            "SELECT id FROM locations WHERE name ilike $name AND type_id = 4"
                            " AND tree_parent_id = $district", {
                                'name': '%%%s%%' % params.subcounty.strip(),
                                'district': district_id
                            })
                        if res2:
                            # we have a sub county in mTrac
                            subcounty_id = res2[0]["id"]
                            logging.debug(
                                "Sub county:%s set for facility with ID:%s" %
                                (params.subcounty, params.code))
                            res3 = db.query(
                                "UPDATE  healthfacilities SET location = $loc, location_name = $loc_name "
                                " WHERE id = $facility RETURNING id", {
                                    'facility': facility_id,
                                    'loc': subcounty_id,
                                    'loc_name': params.subcounty.strip()
                                })
                            if not res3:
                                logging.debug(
                                    "Set Facility Location: ID:%s Location:%s"
                                    % (params.code, subcounty_id))
                        else:
                            # make district catchment area
                            res3 = db.query(
                                "UPDATE healthfacilities SET location = $loc, location_name = $loc_name "
                                "WHERE id = $facility RETURNING id", {
                                    'facility': facility_id,
                                    'loc': district_id,
                                    'loc_name': params.district
                                })
                            if not res3:
                                logging.debug(
                                    "Set Facility Location: ID:%s Location:%s"
                                    % (params.code, district_id))
                        logging.debug(
                            "Facility with ID:%s sucessfully updated." %
                            params.code)
                    return "Updated Facility ID:%s" % params.code
            else:
                return "Unsupported type:%s" % params.ftype