def get(self, country_code):
     country = CountryModel.find_by_code(country_code)
     if country:
         return country.json(), 200
     return {
         'message': "Country -'{}'- not found.".format(country_code)
     }, 404
Exemple #2
0
    def json(self):
        country = CountryModel.find_by_code(self.country_code)
        if country:
            country = country.json()

        return {
            'code': self.admin_code,
            'country': country,
            'description': self.description
        }
def populate_country_table():
    # when working locally use ./raw_data for relative file path.
    # when running on remote server use abolute file path
    # with open('/var/www/html/items-rest/raw_data/country_codes.csv', 'r') as country_code_file:
    with open('./raw_data/country_codes.csv', 'r') as country_code_file:
        country_reader = csv.reader(country_code_file)
        for row in country_reader:
            new_country_object = CountryModel(*row)

            country = CountryModel.find_by_code(
                new_country_object.country_code)
            if country:
                continue
            else:
                if new_country_object.country_name == "name":
                    continue
                new_country_object.save_to_db()
    def post(self, country_name):
        if CountryModel.find_by_name(country_name):
            return {
                'message':
                "A country with name '{}' already exists.".format(country_name)
            }, 400

        data = CountryName.parser.parse_args()

        if CountryModel.find_by_code(data['country_code']):
            return {
                'message':
                "A country with code '{}' already exists.".format(
                    data['country_code'])
            }, 400

        country = CountryModel(data['country_code'], country_name)

        try:
            country.save_to_db()
        except:
            return {'message': "An error occurred inserting the country."}, 500
        return country.json(), 201
    def get(self):

        query = {}

        country_code = request.args.get('country', type=str)
        if country_code:
            if not valid_country_code(country_code):
                return {
                    'message':
                    '{} is not a valid country_code'.format(country_code)
                }, 400
            query['country_code'] = country_code

        year = request.args.get('year', type=str)
        if year:
            if not valid_year(year):
                return {'message': 'Please enter a valid year'}, 400
            query['year'] = year

        sex = request.args.get('sex', type=str)
        if sex:
            if not valid_sex(sex):
                return {'message': 'Please enter a valid sex code'}, 400
            query['sex'] = sex

        admin = request.args.get('admin', type=str)
        if admin:
            if not valid_admin(admin):
                return {'message': 'Please enter a valid admin code'}, 400
            query['admin_code'] = admin

        subdiv = request.args.get('subdiv', type=str)
        if subdiv:
            if not valid_subdiv(subdiv):
                return {'message': 'Please enter a valid subdiv code'}, 400
            query['subdiv_code'] = subdiv

        cause = request.args.get('cause', type=str)
        if cause:
            cause_upper = cause.upper()
            if not valid_cause(cause_upper):
                return {'message': 'Please enter a valid cause code'}, 400
            cause_code_list_extended = {}

            icd_codes = [
                code.json() for code in IcdModel.find_by_code(cause_upper)
            ]
            for icd_code in icd_codes:

                matching_codes = [
                    matching_icd_code.json() for matching_icd_code in
                    IcdModel.search_specific(icd_code['description'])
                ]
            unspecified_codes = []
            generic_codes = []

            pattern = "unspecified"
            match = re.search(pattern, icd_code['description'])
            if not match:
                unspecified_code = icd_code['description'] + \
                    " (unspecified)"
                unspecified_codes = [
                    matching_icd_code.json() for matching_icd_code in
                    IcdModel.search_specific(unspecified_code)
                ]
            else:

                position = match.span()
                start = position[0] - 2
                end = position[1] + 1

                generic_code = icd_code['description'][0:start] + \
                    icd_code['description'][end:]
                generic_codes = [
                    matching_icd_code.json() for matching_icd_code in
                    IcdModel.search_specific(generic_code)
                ]

            for matching_code in matching_codes:
                cause_code_list_extended[
                    matching_code['list']] = matching_code['code']

            if generic_codes:
                for matching_code in generic_codes:
                    cause_code_list_extended[
                        matching_code['list']] = matching_code['code']
            if unspecified_codes:
                for matching_code in unspecified_codes:
                    cause_code_list_extended[
                        matching_code['list']] = matching_code['code']

            if "103" not in cause_code_list_extended:
                try:
                    cause_code_list_extended['103'] = cause_code_list_extended[
                        '104'][:-1]
                except:
                    pass

            code_list_entry = CodeListRefModel.find_by_year_and_country(
                year, country_code)

            try:
                cause = cause_code_list_extended[code_list_entry.code_list]
            except:
                return {
                    'message':
                    "Can't find matching cause code for the specified country."
                }, 400

            query['cause'] = cause

        results = [
            entry.json()
            for entry in MortalityDataModel.search_mortalities(query)
        ]

        if code_list_entry.code_list == "104" and len(cause_code_list_extended[
                code_list_entry.code_list]) == 3 and len(results) == 0:
            cause = cause + "9"
            query['cause'] = cause
            results = [
                entry.json()
                for entry in MortalityDataModel.search_mortalities(query)
            ]

        if code_list_entry.code_list == "10M" and len(cause_code_list_extended[
                code_list_entry.code_list]) == 3 and len(results) == 0:
            cause = cause + "9"
            query['cause'] = cause
            result = [
                entry.json()
                for entry in MortalityDataModel.search_mortalities(query)
            ]

        if code_list_entry.code_list == "10M" and len(cause_code_list_extended[
                code_list_entry.code_list]) == 4 and len(results) == 0:
            cause = cause[:-1]
            query['cause'] = cause
            result = [
                entry.json()
                for entry in MortalityDataModel.search_mortalities(query)
            ]

        if not results:
            return {'message': "No mortality entries match your query."}, 404

        if results:
            if len(results) > 1:
                return {
                    'message':
                    "More than one population entry was found matching your query."
                }, 400

            for entry in results:
                pop_query = {}
                pop_query['country_code'] = entry['country']['code']
                pop_query['year'] = entry['year']
                pop_query['sex'] = entry['sex']['code']

                admin = entry['admin']
                if admin != "None":
                    pop_query['admin'] = admin['code']

                subdiv = entry['subdiv']
                if subdiv != "None":
                    pop_query['subdiv'] = subdiv['code']
                pop_data = PopulationModel.search_single_population(pop_query)
                if pop_data:
                    pop_data = pop_data.json()
                else:
                    country = CountryModel.find_by_code(country_code).json()
                    return {
                        'message':
                        "No population data available for '{}' in year {} for sex '{}'."
                        .format(country['description'], year, sex)
                    }, 404

                del entry['infant_age_breakdown']
                del entry['age_format']
                del entry['infant_age_format']

                things_to_skip = [
                    "country", "admin", "subdiv", "year", "code_list", "cause",
                    "sex", "infant_age_breakdown"
                ]
                for key, value in entry.items():
                    if key in things_to_skip:
                        continue

                    # format age_breakdown data per 100,000
                    if key == "age_breakdown":
                        ages_to_delete = []
                        for age_range, value in entry[key].items():
                            pop = pop_data[key].get(age_range)
                            entry[key][age_range] = pop
                            if pop:
                                if pop == "0":
                                    continue
                                entry[key][age_range] = str(
                                    round_up(
                                        float(value) / float(pop) * 100000, 3))
                            if pop == None:
                                ages_to_delete.append(age_range)
                        for index in ages_to_delete:
                            del entry[key][index]
                    else:
                        entry[key] = str(
                            round_up(
                                float(value) / float(pop_data[key]) * 100000,
                                3))

            return {'adjusted_entries': results}, 200
    def get(self):
        def strip_whitespace(string):
            return ('').join(string.split(' '))

        country_code_input = request.args.get('country', type=str)
        year_input = request.args.get('year', type=str)
        sex_code_input = request.args.get('sex', type=str)
        cause_code_input = request.args.get('cause', type=str)
        admin_code_input = request.args.get('admin', type=str)
        subdiv_code_input = request.args.get('subdiv', type=str)

        if not country_code_input or not year_input or not sex_code_input or not cause_code_input:
            return {
                'message':
                "Please add at least a year, country, sex and cause variable"
            }, 400

        country_code_list = strip_whitespace(country_code_input).split(',')
        year_list = strip_whitespace(year_input).split(',')
        sex_code_list = strip_whitespace(sex_code_input).split(',')
        cause_code_list = strip_whitespace(cause_code_input).split(',')
        cause_code_list = list(map(lambda x: x.upper(), cause_code_list))

        cause_code_list_extended = {}
        for icd_code in filter(valid_cause, cause_code_list):

            complete_icd_codes = [
                code.json() for code in IcdModel.find_by_code(icd_code)
            ]

            for icd_code in complete_icd_codes:
                matching_codes = [
                    matching_icd_code.json() for matching_icd_code in
                    IcdModel.search_specific(icd_code['description'])
                ]
                # try to make it possible to compare countries that use different code lists
                # check if contains "unspecified". if not, add it and search again. else remove "(unspecified)"
                # TODO: in case that unspecified doesn't match. sum up all instances of code + extra digit.
                # e.g. A02 input by user. if code list is 104, sum all A020, A021, ...A029. return sum
                # TODO: if user input is 4 digit cause code, remove last digit and search for 103 code list with that
                unspecified_codes = []
                generic_codes = []

                pattern = "unspecified"
                match = re.search(pattern, icd_code['description'])
                if not match:
                    unspecified_code = icd_code['description'] + \
                        " (unspecified)"
                    unspecified_codes = [
                        matching_icd_code.json() for matching_icd_code in
                        IcdModel.search_specific(unspecified_code)
                    ]
                else:

                    position = match.span()
                    start = position[0] - 2
                    end = position[1] + 1

                    generic_code = icd_code['description'][0:start] + \
                        icd_code['description'][end:]
                    generic_codes = [
                        matching_icd_code.json() for matching_icd_code in
                        IcdModel.search_specific(generic_code)
                    ]

                for matching_code in matching_codes:
                    cause_code_list_extended[
                        matching_code['list']] = matching_code['code']

                if generic_codes:
                    for matching_code in generic_codes:
                        cause_code_list_extended[
                            matching_code['list']] = matching_code['code']
                if unspecified_codes:
                    for matching_code in unspecified_codes:
                        cause_code_list_extended[
                            matching_code['list']] = matching_code['code']

                if "103" not in cause_code_list_extended:
                    try:
                        cause_code_list_extended[
                            '103'] = cause_code_list_extended['104'][:-1]
                    except:
                        pass

        # add "" to admin and subdiv lists to ensure some results if no specific code given
        admin_code_list = []
        if admin_code_input:
            admin_code_list = strip_whitespace(admin_code_input).split(',')
        admin_code_list.append("")

        subdiv_code_list = []
        if subdiv_code_input:
            subdiv_code_list = strip_whitespace(subdiv_code_input).split(',')
        subdiv_code_list.append("")

        # results of each mortality adj search
        results = []
        # loop over all permutations of list items and validate codes.
        for country_code in filter(valid_country_code, country_code_list):
            for year in filter(valid_year, year_list):
                for sex in filter(valid_sex, sex_code_list):
                    for cause in filter(valid_cause, cause_code_list):
                        for admin in filter(valid_admin, admin_code_list):
                            for subdiv in filter(valid_subdiv,
                                                 subdiv_code_list):

                                # generate query
                                code_list_entry = CodeListRefModel.find_by_year_and_country(
                                    year, country_code)

                                try:
                                    cause = cause_code_list_extended[
                                        code_list_entry.code_list]
                                except:
                                    continue

                                query = {}
                                query['country_code'] = country_code
                                query['sex'] = sex
                                query['year'] = year
                                query['cause'] = cause
                                query['admin_code'] = admin
                                query['subdiv_code'] = subdiv

                                result = [
                                    entry.json()
                                    for entry in MortalityDataModel.
                                    search_mortalities(query)
                                ]

                                if code_list_entry.code_list == "104" and len(
                                        cause_code_list_extended[
                                            code_list_entry.code_list]
                                ) == 3 and len(result) == 0:
                                    cause = cause + "9"
                                    query['cause'] = cause
                                    result = [
                                        entry.json()
                                        for entry in MortalityDataModel.
                                        search_mortalities(query)
                                    ]

                                if code_list_entry.code_list == "10M" and len(
                                        cause_code_list_extended[
                                            code_list_entry.code_list]
                                ) == 3 and len(result) == 0:
                                    cause = cause + "9"
                                    query['cause'] = cause
                                    result = [
                                        entry.json()
                                        for entry in MortalityDataModel.
                                        search_mortalities(query)
                                    ]

                                if code_list_entry.code_list == "10M" and len(
                                        cause_code_list_extended[
                                            code_list_entry.code_list]
                                ) == 4 and len(result) == 0:
                                    cause = cause[:-1]
                                    query['cause'] = cause
                                    result = [
                                        entry.json()
                                        for entry in MortalityDataModel.
                                        search_mortalities(query)
                                    ]

                                if result:
                                    if len(result) > 1:
                                        continue

                                # adjust for population and add to results list
                                for entry in result:
                                    pop_query = {}
                                    pop_query['country_code'] = entry[
                                        'country']['code']
                                    pop_query['year'] = entry['year']
                                    pop_query['sex'] = entry['sex']['code']

                                    admin = entry['admin']
                                    if admin != "None":
                                        pop_query['admin'] = admin['code']

                                    subdiv = entry['subdiv']
                                    if subdiv != "None":
                                        pop_query['subdiv'] = subdiv['code']

                                    pop_data = PopulationModel.search_single_population(
                                        pop_query)
                                    if pop_data:
                                        pop_data = pop_data.json()
                                    else:
                                        country = CountryModel.find_by_code(
                                            country_code).json()

                                        del entry['infant_age_breakdown']
                                        del entry['age_format']
                                        del entry['infant_age_format']
                                        del entry['age_breakdown']
                                        entry[
                                            'all_ages'] = "No population data."
                                        continue

                                    # remove infant mortality data as no related population data given
                                    del entry['infant_age_breakdown']
                                    # delete age format numbers as now irrelevant
                                    del entry['age_format']
                                    del entry['infant_age_format']

                                    # divide mortality data by corresponding population number and multiply by 100,000
                                    # population is population of that specific age/sex. not total country population
                                    things_to_skip = [
                                        "country", "admin", "subdiv", "year",
                                        "code_list", "cause", "sex",
                                        "infant_age_breakdown"
                                    ]
                                    for key, value in entry.items():
                                        if key in things_to_skip:
                                            continue

                                        # format age_breakdown data per 100,000
                                        if key == "age_breakdown":
                                            ages_to_delete = []
                                            for age_range, value in entry[
                                                    key].items():
                                                pop = pop_data[key].get(
                                                    age_range)
                                                entry[key][age_range] = pop
                                                if pop:
                                                    if pop == "0":
                                                        continue
                                                    entry[key][
                                                        age_range] = str(
                                                            round_up(
                                                                float(value) /
                                                                float(pop) *
                                                                100000, 3))
                                                if pop == None:
                                                    ages_to_delete.append(
                                                        age_range)
                                            for index in ages_to_delete:
                                                del entry[key][index]
                                        else:
                                            entry[key] = str(
                                                round_up(
                                                    float(value) /
                                                    float(pop_data[key]) *
                                                    100000, 3))

                                # append to results list if anything found
                                if result:
                                    results.append(result[0])

        if len(results) == 0:
            return {'message': "No mortality entries match your query."}, 404

        return {'results': results}, 200
Exemple #7
0
    def json(self):
        admin = AdminModel.find_by_code_and_country(self.admin,
                                                    self.country_code)
        if admin:
            admin = {
                'code': admin.admin_code,
                'description': admin.description
            }
        else:
            admin = 'None'

        subdiv = SubdivModel.find_by_code(self.subdiv)
        if subdiv:
            subdiv = {
                'code': subdiv.subdiv_code,
                'description': subdiv.description
            }
        else:
            subdiv = 'None'

        sex = SexModel.find_by_code(self.sex)
        if sex:
            sex = sex.json()
        else:
            sex = "Sex code '{}' not found.".format(self.sex)

        country = CountryModel.find_by_code(self.country_code)
        if country:
            country = country.json()
        else:
            country = "Country with code '{}' not found.".format(
                self.country_code)

        # sort the age data according to the given age format for the population entry
        age_breakdown_format = AgeFormatModel.find_by_code(
            self.age_format).json()
        pops = [
            self.pop2, self.pop3, self.pop4, self.pop5, self.pop6, self.pop7,
            self.pop8, self.pop9, self.pop10, self.pop11, self.pop12,
            self.pop13, self.pop14, self.pop15, self.pop16, self.pop17,
            self.pop18, self.pop19, self.pop20, self.pop21, self.pop22,
            self.pop23, self.pop24, self.pop25, self.pop26
        ]
        age_breakdown = {}
        count = 0
        for pop, age_range in age_breakdown_format.items():
            if pop == "age_format_code":
                continue
            age_breakdown[age_range] = pops[count]
            count += 1
        empties = []
        for age_range, value in age_breakdown.items():
            if value == "":
                empties.append(age_range)
        for index in empties:
            del age_breakdown[index]

        return {
            'id': self.id,
            'country': country,
            'admin': admin,
            'subdiv': subdiv,
            'year': self.year,
            'sex': sex,
            'age_format': self.age_format,
            'all_ages': self.pop1,
            'age_breakdown': age_breakdown,
            'live_births': self.live_births
        }
Exemple #8
0
def valid_country_code(country_code):
    if CountryModel.find_by_code(country_code):
        return True
    return False