def get_region_struct(cls): """ get City->RegionGroup->Region struct :return: [{'city_id': <city_id>, 'city_name': <city_name>, 'region_groups': {'region_group_id': <>, 'region_group_name': <>, 'regions': {'region_id': <>, 'region_name': <>, 'region_type': <>, } } } ... ... ] """ city_pairs = city_base.get_city_id_name_pairs( cls.get_user_city_ids()) city_region_group_map = rg_base.\ get_city_region_group_map(city_pairs.keys()) region_ids = [r.id for r in region_base.get_all()] region_group_region_map = \ region_base.get_region_group_region_map(region_ids) region_struct = [] for city_id, city_name in city_pairs.items(): region_groups = [] for r_group in city_region_group_map.get(city_id, []): regions = [] for region in region_group_region_map.get(r_group.id, []): regions.append({'region_id': region.id, 'region_name': region.name, 'region_type': region.type_code}) region_groups.append({'region_group_id': r_group.id, 'region_group_name': r_group.name, 'regions': regions}) region_struct.append({'city_id': city_id, 'city_name': city_name, 'region_groups': region_groups}) return region_struct