def upgrade()

in migrations/versions/0eee8c1abd3a_.py [0:0]


def upgrade():
    conn = op.get_bind()
    print("Populating country information for Projects....")

    op.add_column("projects", sa.Column("country", ARRAY(sa.String()), nullable=True))

    fetch_all_project_geoms = (
        "SELECT id, ST_AsText(ST_GeomFromWKB(ST_AsEWKB(centroid))) from projects;"
    )
    projects = conn.execute(fetch_all_project_geoms)
    total_projects = projects.rowcount
    print("Total projects in the DB: " + str(total_projects))
    project_continent = ""
    continents = ""
    count = 0
    match = 0

    with open("scripts/world/continents.json") as continents_data:
        continents = json.load(continents_data)

    for project in projects:
        count = count + 1
        project_id = project[0]
        try:
            project_centroid = shapely.wkt.loads(project[1])
        except Exception as e:
            sys.stdout.write("\033[K")
            print("Geometry Exception: Project " + str(project_id) + " " + str(e))
            continue

        if not project_centroid.is_valid:
            project_centroid = project_centroid.buffer(0)

        for continent in continents["features"]:
            continent_polygon = shape(continent["geometry"])
            is_match = project_centroid.within(continent_polygon)
            if is_match:
                project_continent = continent["properties"]["CONTINENT"]
                with open(
                    "scripts/world/" + project_continent + ".json",
                    "r",
                    encoding="utf-8",
                ) as countries_data:
                    countries = json.load(countries_data)
                    if not project_centroid.is_valid:
                        project_centroid = project_centroid.buffer(0)

                    for country in countries[project_continent]:
                        country_polygon = shape(country["geometry"])
                        is_match = project_centroid.within(country_polygon)
                        if is_match:
                            match = match + 1
                            update_country_info = (
                                "update projects "
                                + "set country = array_append(country, '"
                                + country["properties"]["NAME"]
                                + "') where id = "
                                + str(project_id)
                            )

                            op.execute(update_country_info)
                            print(
                                str(match)
                                + "/"
                                + str(total_projects)
                                + " projects mapped to countries"
                            )
                            sys.stdout.write("\033[F")
                            break
                    if count == total_projects:
                        print(
                            "Migration Done! "
                            + str(count)
                            + "/"
                            + str(total_projects)
                            + " projects scanned."
                            + "\n"
                            + str(match)
                            + "/"
                            + str(total_projects)
                            + " projects mapped to countries"
                        )

                break