def post(self, project_db): SetupProjectDatabase.init(project_db) args = get_hyd_args() try: e = Hydrology_hyd.get(Hydrology_hyd.name == args['name']) abort( 400, message= 'Hydrology name must be unique. A hydrology with this name already exists.' ) except Hydrology_hyd.DoesNotExist: try: m = Hydrology_hyd() result = save_hyd(m, args) if result > 0: return model_to_dict(m), 201 abort(400, message='Unable to update hydrology properties {id}.'. format(id=id)) except IntegrityError as e: abort(400, message='Hydrology properties name must be unique.') except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def post(self, project_db): try: SetupProjectDatabase.init(project_db) lookup_args = [{ 'name': 'grow_start', 'type': str }, { 'name': 'grow_end', 'type': str }] args = self.get_args('hru_lte_hru', project_db, extra_args=lookup_args) args['grow_start_id'] = self.get_id_from_name( D_table_dtl, args['grow_start']) args['grow_end_id'] = self.get_id_from_name( D_table_dtl, args['grow_end']) args.pop('grow_start', None) args.pop('grow_end', None) result = self.save_args(Hru_lte_hru, args, is_new=True, lookup_fields=['soil_text', 'plnt_typ']) if result > 0: return {'id': result}, 201 abort(400, message='Unable to update HRU {id}.'.format(id=id)) except IntegrityError as e: abort(400, message='Name must be unique. ' + str(e)) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def put(self, project_db): SetupProjectDatabase.init(project_db) args = get_cha_lte_args(True) try: param_dict = {} if args['init_name'] is not None: param_dict['init_id'] = self.get_id_from_name(Initial_cha, args['init_name']) if args['hyd_name'] is not None: param_dict['hyd_id'] = self.get_id_from_name(Hyd_sed_lte_cha, args['hyd_name']) if args['nut_name'] is not None: param_dict['nut_id'] = self.get_id_from_name(Nutrients_cha, args['nut_name']) query = Channel_lte_cha.update(param_dict).where(Channel_lte_cha.id.in_(args['selected_ids'])) result = query.execute() if result > 0: return 200 abort(400, message='Unable to update channel properties.') except Initial_cha.DoesNotExist: abort(400, message=self.__invalid_name_msg.format(name=args['init_name'])) except Hyd_sed_lte_cha.DoesNotExist: abort(400, message=self.__invalid_name_msg.format(name=args['hyd_name'])) except Nutrients_cha.DoesNotExist: abort(400, message=self.__invalid_name_msg.format(name=args['nut_name'])) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def put(self, project_db, id): try: args = get_con_out_args() SetupProjectDatabase.init(project_db) m = Delratio_con_out.get(Delratio_con_out.id == id) m.order = args['order'] m.obj_typ = args['obj_typ'] m.obj_id = args['obj_id'] m.hyd_typ = args['hyd_typ'] m.frac = args['frac'] result = m.save() if result > 0: return 200 abort(400, message='Unable to update delratio outflow {id}.'.format( id=id)) except Delratio_con_out.DoesNotExist: abort(404, message='Delratio outflow {id} does not exist'.format(id=id)) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def put(self, project_db, id): args = get_con_args() try: SetupProjectDatabase.init(project_db) m = Delratio_con.get(Delratio_con.id == id) m.name = args['name'] m.area = args['area'] m.lat = args['lat'] m.lon = args['lon'] m.elev = args['elev'] if args['dlr_name'] is not None: m.dlr_id = self.get_id_from_name(Delratio_del, args['dlr_name']) if args['wst_name'] is not None: m.wst_id = self.get_id_from_name(Weather_sta_cli, args['wst_name']) result = m.save() if result > 0: return 200 abort(400, message='Unable to update Delratio {id}.'.format(id=id)) except IntegrityError: abort(400, message='Delratio name must be unique.') except Delratio_con.DoesNotExist: abort(404, message='Delratio {id} does not exist'.format(id=id)) except Delratio_del.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['dr_name'])) except Weather_sta_cli.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['wst_name'])) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def post(self, project_db): args = get_wet_args() try: SetupProjectDatabase.init(project_db) m = Wetland_wet() m.name = args['name'] m.description = args['description'] m.init_id = self.get_id_from_name(Initial_res, args['init_name']) m.rel_id = self.get_id_from_name(D_table_dtl, args['rel_name']) m.hyd_id = self.get_id_from_name(Hydrology_wet, args['hyd_name']) m.sed_id = self.get_id_from_name(Sediment_res, args['sed_name']) m.nut_id = self.get_id_from_name(Nutrients_res, args['nut_name']) result = m.save() if result > 0: return 200 abort(400, message='Unable to update wetland {id}.'.format(id=id)) except IntegrityError as e: abort(400, message='Wetland name must be unique.') except Initial_res.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['init_name'])) except D_table_dtl.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['rel_name'])) except Hydrology_wet.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['hyd_name'])) except Sediment_res.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['sed_name'])) except Nutrients_res.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['nut_name'])) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def post(self, project_db): args = get_routingunit_args() try: SetupProjectDatabase.init(project_db) m = Rout_unit_rtu() m.name = args['name'] m.description = args['description'] if args['dlr_name']: m.dlr_id = self.get_id_from_name(Delratio_del, args['dlr_name']) m.topo_id = self.get_id_from_name(Topography_hyd, args['topo_name']) m.field_id = self.get_id_from_name(Field_fld, args['field_name']) result = m.save() if result > 0: return 200 abort(400, message='Unable to update routing unit properties {id}.'. format(id=id)) except IntegrityError as e: abort(400, message='Routing unit properties name must be unique.') except Delratio_del.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['dlr_name'])) except Topography_hyd.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['topo_name'])) except Field_fld.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['field_name'])) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def put(self): parser = reqparse.RequestParser() parser.add_argument('project_name', type=str, required=True, location='json') parser.add_argument('project_db', type=str, required=True, location='json') parser.add_argument('reference_db', type=str, required=True, location='json') args = parser.parse_args(strict=False) project_db = utils.sanitize(args['project_db']) reference_db = utils.sanitize(args['reference_db']) SetupProjectDatabase.init(project_db) try: m = Project_config.get() m.reference_db = utils.rel_path(project_db, args['reference_db']) m.project_name = args['project_name'] result = m.save() if result > 0: return 200 abort(400, message="Unable to update project configuration table.") except Project_config.DoesNotExist: abort(404, message="Could not retrieve project configuration data.")
def base_paged_list(self, project_db, sort, reverse, page, items_per_page, table, list_name, back_refs=False): SetupProjectDatabase.init(project_db) total = table.select().count() sort_val = SQL('[{}]'.format(sort)) if reverse == 'true': sort_val = SQL('[{}]'.format(sort)).desc() m = table.select().order_by(sort_val).paginate(int(page), int(items_per_page)) if back_refs: ml = [model_to_dict(v, backrefs=True, max_depth=1) for v in m] for d in ml: self.get_obj_name(d) else: ml = [model_to_dict(v, recurse=False) for v in m] return {'total': total, list_name: ml}
def put(self, project_db): parser = reqparse.RequestParser() parser.add_argument('input_files_dir', type=str, required=False, location='json') parser.add_argument('input_files_last_written', type=str, required=False, location='json') args = parser.parse_args(strict=False) SetupProjectDatabase.init(project_db) try: m = Project_config.get() m.input_files_dir = utils.rel_path(project_db, args['input_files_dir']) m.input_files_last_written = args['input_files_last_written'] result = m.save() if result > 0: return 200 abort(400, message="Unable to update project configuration table.") except Project_config.DoesNotExist: abort(404, message="Could not retrieve project configuration data.")
def get(self, project_db): SetupProjectDatabase.init(project_db) try: c = Project_config.get() config = get_model_to_dict_dates(c, project_db) t = Time_sim.get_or_create_default() time = model_to_dict(t) m = Print_prt.get() prt = model_to_dict(m, recurse=False) o = Print_prt_object.select() objects = [model_to_dict(v, recurse=False) for v in o] prt = {'prt': prt, 'objects': objects} return { 'config': config, 'time': time, 'print': prt, 'imported_weather': climate.Weather_sta_cli.select().count() > 0 and climate.Weather_wgn_cli.select().count() > 0, 'has_observed_weather': climate.Weather_sta_cli.observed_count() > 0 } except Project_config.DoesNotExist: abort(404, message="Could not retrieve project configuration data.") except Print_prt.DoesNotExist: abort(404, message="Could not retrieve print_prt data.")
def get(self, project_db): check_config(project_db) SetupProjectDatabase.init(project_db) try: m = Project_config.get() d = get_model_to_dict_dates(m, project_db) if m.gis_version is not None and not import_gis.is_supported_version( m.gis_version ) and not import_gis_legacy.is_supported_version(m.gis_version): abort( 400, message= "This version of SWAT+ Editor does not support QSWAT+ {uv}." .format(uv=m.gis_version)) #d["has_ps"] = gis.Gis_points.select().where((gis.Gis_points.ptype == 'P') | (gis.Gis_points.ptype == 'I')).count() > 0 #d["has_res"] = gis.Gis_water.select().count() > 0 description = None conn = lib.open_db(project_db) if lib.exists_table(conn, 'object_cnt'): oc = Object_cnt.get_or_none() if oc is not None: description = oc.name d["project_description"] = description return d except Project_config.DoesNotExist: abort(404, message="Could not retrieve project configuration data.")
def put(self, project_db): parser = reqparse.RequestParser() parser.add_argument('name', type=str, required=True, location='json') parser.add_argument('description', type=str, required=True, location='json') args = parser.parse_args(strict=False) SetupProjectDatabase.init(project_db) try: m = Project_config.get() m.project_name = args['name'] result = m.save() oc = Object_cnt.get() oc.name = args['description'] result = oc.save() if result > 0: return 200 abort(400, message="Unable to update project configuration table.") except Project_config.DoesNotExist: abort(404, message="Could not retrieve project configuration data.") except Object_cnt.DoesNotExist: abort(404, message="Could not retrieve project configuration data.")
def put(self, project_db, id): try: SetupProjectDatabase.init(project_db) args = get_fld_args() m = Field_fld.get(Field_fld.id == id) m.name = args['name'] m.len = args['len'] m.wd = args['wd'] m.ang = args['ang'] result = m.save() if result > 0: return 200 abort(400, message='Unable to update field properties {id}.'.format( id=id)) except IntegrityError as e: abort(400, message='Field properties name must be unique.') except Field_fld.DoesNotExist: abort(404, message='Field properties {id} does not exist'.format(id=id)) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def put(self, project_db): SetupProjectDatabase.init(project_db) args = get_cha_lte_args(True) try: param_dict = {} if args['init_name'] is not None: param_dict['init_id'] = self.get_id_from_name(Initial_cha, args['init_name']) if args['hyd_name'] is not None: param_dict['hyd_id'] = self.get_id_from_name(Hyd_sed_lte_cha, args['hyd_name']) if args['nut_name'] is not None: param_dict['nut_id'] = self.get_id_from_name(Nutrients_cha, args['nut_name']) con_table = Chandeg_con con_prop_field = Chandeg_con.lcha_id prop_table = Channel_lte_cha result = self.base_put_many_con(args, param_dict, con_table, con_prop_field, prop_table) if result > 0: return 200 abort(400, message='Unable to update channel properties.') except Initial_cha.DoesNotExist: abort(400, message=self.__invalid_name_msg.format(name=args['init_name'])) except Hyd_sed_lte_cha.DoesNotExist: abort(400, message=self.__invalid_name_msg.format(name=args['hyd_name'])) except Nutrients_cha.DoesNotExist: abort(400, message=self.__invalid_name_msg.format(name=args['nut_name'])) except Weather_sta_cli.DoesNotExist: abort(400, message=self.__invalid_name_msg.format(name=args['wst_name'])) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def __init__(self, db_file, datasets_db_file, project_name, editor_version): self.__abort = False self.project_db = db_file self.reference_db = datasets_db_file self.project_name = project_name self.editor_version = editor_version SetupProjectDatabase.init(db_file, datasets_db_file)
def put(self, project_db, id): args = get_exco_args() try: SetupProjectDatabase.init(project_db) m = Exco_exc.get(Exco_exc.id == id) m.name = args['name'] m.om_id = self.get_id_from_name(Exco_om_exc, args['om_name']) m.pest_id = self.get_id_from_name(Exco_pest_exc, args['pest_name']) m.path_id = self.get_id_from_name(Exco_path_exc, args['path_name']) m.hmet_id = self.get_id_from_name(Exco_hmet_exc, args['hmet_name']) m.salt_id = self.get_id_from_name(Exco_salt_exc, args['salt_name']) result = m.save() if result > 0: return 200 abort(400, message='Unable to update exco properties {id}.'.format(id=id)) except IntegrityError as e: abort(400, message='Exco properties name must be unique.') except Exco_exc.DoesNotExist: abort(404, message='Exco properties {id} does not exist'.format(id=id)) except Exco_om_exc.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['om_name'])) except Exco_pest_exc.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['pest_name'])) except Exco_path_exc.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['path_name'])) except Exco_hmet_exc.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['hmet_name'])) except Exco_salt_exc.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['salt_name'])) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def put(self, project_db): parser = reqparse.RequestParser() parser.add_argument('id', type=int, required=False, location='json') parser.add_argument('day_start', type=int, required=True, location='json') parser.add_argument('yrc_start', type=int, required=True, location='json') parser.add_argument('day_end', type=int, required=True, location='json') parser.add_argument('yrc_end', type=int, required=True, location='json') parser.add_argument('step', type=int, required=False, location='json') args = parser.parse_args(strict=True) SetupProjectDatabase.init(project_db) result = Time_sim.update_and_exec(args['day_start'], args['yrc_start'], args['day_end'], args['yrc_end'], args['step']) if result == 1: return 200 abort(400, message='Unable to update time_sim table.')
def put(self, project_db): SetupProjectDatabase.init(project_db) args = get_routingunit_args(True) try: param_dict = {} if args['dlr_name'] is not None: param_dict['dlr_id'] = self.get_id_from_name( Delratio_del, args['dlr_name']) if args['topo_name'] is not None: param_dict['topo_id'] = self.get_id_from_name( Topography_hyd, args['topo_name']) if args['field_name'] is not None: param_dict['field_id'] = self.get_id_from_name( Field_fld, args['field_name']) query = Rout_unit_rtu.update(param_dict).where( Rout_unit_rtu.id.in_(args['selected_ids'])) result = query.execute() if result > 0: return 200 abort(400, message='Unable to update routing unit properties.') except Delratio_del.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['dlr_name'])) except Topography_hyd.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['topo_name'])) except Field_fld.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['field_name'])) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def put(self, project_db, id): parser = reqparse.RequestParser() parser.add_argument('id', type=int, required=False, location='json') parser.add_argument('print_prt', type=int, required=True, location='json') parser.add_argument('name', type=str, required=True, location='json') parser.add_argument('daily', type=bool, required=True, location='json') parser.add_argument('monthly', type=bool, required=True, location='json') parser.add_argument('yearly', type=bool, required=True, location='json') parser.add_argument('avann', type=bool, required=True, location='json') args = parser.parse_args(strict=True) SetupProjectDatabase.init(project_db) q = Print_prt_object.update( daily=args['daily'], monthly=args['monthly'], yearly=args['yearly'], avann=args['avann']).where(Print_prt_object.id == id) result = q.execute() if result == 1: return 200 abort(400, message='Unable to update print_print_object {}.'.format( args['name']))
def put(self, project_db): try: SetupProjectDatabase.init(project_db) args = self.get_args('aquifer_aqu', project_db, True) lookup_fields = ['init'] param_dict = {} for key in args.keys(): if args[key] is not None and key != 'selected_ids': if key in lookup_fields: d = ast.literal_eval(args[key]) if int(d['id']) != 0: param_dict[key] = int(d['id']) else: param_dict[key] = args[key] query = Aquifer_aqu.update(param_dict).where( Aquifer_aqu.id.in_(args['selected_ids'])) result = query.execute() if result > 0: return 200 abort(400, message='Unable to update aquifer properties.') except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def put(self, project_db, id): try: SetupProjectDatabase.init(project_db) args = get_topo_args() m = Topography_hyd.get(Topography_hyd.id == id) m.name = args['name'] m.slp = args['slp'] m.slp_len = args['slp_len'] m.lat_len = args['lat_len'] m.dist_cha = args['dist_cha'] m.depos = args['depos'] #m.type = args['type'] result = m.save() if result > 0: return 200 abort(400, message='Unable to update topography properties {id}.'.format(id=id)) except IntegrityError as e: abort(400, message='Topography properties name must be unique.') except Topography_hyd.DoesNotExist: abort(404, message='Topography properties {id} does not exist'.format(id=id)) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def post(self, project_db): args = get_dr_args() try: SetupProjectDatabase.init(project_db) m = Delratio_del() m.name = args['name'] m.om_id = self.get_id_from_name(Dr_om_del, args['om_name']) m.pest_id = self.get_id_from_name(Dr_pest_del, args['pest_name']) m.path_id = self.get_id_from_name(Dr_path_del, args['path_name']) m.hmet_id = self.get_id_from_name(Dr_hmet_del, args['hmet_name']) m.salt_id = self.get_id_from_name(Dr_salt_del, args['salt_name']) result = m.save() if result > 0: return 200 abort(400, message='Unable to update delratio properties {id}.'.format( id=id)) except IntegrityError as e: abort(400, message='Delratio properties name must be unique.') except Dr_om_del.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['om_name'])) except Dr_pest_del.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['pest_name'])) except Dr_path_del.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['path_name'])) except Dr_hmet_del.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['hmet_name'])) except Dr_salt_del.DoesNotExist: abort(400, message=invalid_name_msg.format(name=args['salt_name'])) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def post(self, project_db): SetupProjectDatabase.init(project_db) args = get_topo_args() try: e = Topography_hyd.get(Topography_hyd.name == args['name']) abort(400, message='Topography name must be unique. A topography with this name already exists.') except Topography_hyd.DoesNotExist: try: m = Topography_hyd() m.name = args['name'] m.slp = args['slp'] m.slp_len = args['slp_len'] m.lat_len = args['lat_len'] m.dist_cha = args['dist_cha'] m.depos = args['depos'] m.type = '' result = m.save() if result > 0: return model_to_dict(m), 201 abort(400, message='Unable to update topography properties {id}.'.format(id=id)) except IntegrityError as e: abort(400, message='Topography properties name must be unique.') except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def put(self, project_db, id): try: SetupProjectDatabase.init(project_db) lookup_args = [ {'name': 'grow_start', 'type': str}, {'name': 'grow_end', 'type': str} ] args = self.get_args('hru_lte_hru', project_db, extra_args=lookup_args) args['grow_start_id'] = self.get_id_from_name(D_table_dtl, args['grow_start']) args['grow_end_id'] = self.get_id_from_name(D_table_dtl, args['grow_end']) args.pop('grow_start', None) args.pop('grow_end', None) result = self.save_args(Hru_lte_hru, args, id=id, lookup_fields=['soil_text', 'plnt_typ']) if result > 0: return 200 abort(400, message='Unable to update hru {id}.'.format(id=id)) except IntegrityError as e: abort(400, message='Graze operation name must be unique.') except Hru_lte_hru.DoesNotExist: abort(404, message='Hru-lte {id} does not exist'.format(id=id)) except Exception as ex: abort(400, message='Unexpected error {ex}'.format(ex=ex))
def post(self, project_db): SetupProjectDatabase.init(project_db) args = get_fld_args() try: e = Field_fld.get(Field_fld.name == args['name']) abort(400, message='Field name must be unique. A field with this name already exists.') except Field_fld.DoesNotExist: try: m = Field_fld() m.name = args['name'] m.len = args['len'] m.wd = args['wd'] m.ang = args['ang'] result = m.save() if result > 0: return model_to_dict(m), 201 abort(400, message='Unable to update field properties {id}.'.format(id=id)) except IntegrityError as e: abort(400, message='Field properties name must be unique.') except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def get(self, project_db): SetupProjectDatabase.init(project_db) cha_type = 'lte' if Channel_con.select().count() > 0: cha_type = 'regular' return {'type': cha_type}
def get(self, project_db, id): table = Recall_dat SetupProjectDatabase.init(project_db) args = self.get_table_args() sort = self.get_arg(args, 'sort', 'name') reverse = self.get_arg(args, 'reverse', 'n') page = self.get_arg(args, 'page', 1) per_page = self.get_arg(args, 'per_page', 50) s = table.select().where(table.recall_rec_id == id) total = s.count() if sort == 'name': sort_val = table.name if reverse != 'y' else table.name.desc() else: sort_val = SQL('[{}]'.format(sort)) if reverse == 'y': sort_val = SQL('[{}]'.format(sort)).desc() m = s.order_by(sort_val).paginate(int(page), int(per_page)) return { 'total': total, 'matches': total, 'items': [model_to_dict(v, recurse=False) for v in m] }
def post(self, project_db): args = get_cha_lte_args() try: SetupProjectDatabase.init(project_db) m = Channel_lte_cha() m.name = args['name'] m.description = args['description'] m.init_id = self.get_id_from_name(Initial_cha, args['init_name']) m.hyd_id = self.get_id_from_name(Hyd_sed_lte_cha, args['hyd_name']) m.nut_id = self.get_id_from_name(Nutrients_cha, args['nut_name']) result = m.save() if result > 0: return 200 abort(400, message='Unable to update channel properties {id}.'.format(id=id)) except IntegrityError as e: abort(400, message='Channel properties name must be unique.') except Initial_cha.DoesNotExist: abort(400, message=self.__invalid_name_msg.format(name=args['init_name'])) except Hyd_sed_lte_cha.DoesNotExist: abort(400, message=self.__invalid_name_msg.format(name=args['hyd_name'])) except Nutrients_cha.DoesNotExist: abort(400, message=self.__invalid_name_msg.format(name=args['nut_name'])) except Exception as ex: abort(400, message="Unexpected error {ex}".format(ex=ex))
def get(self, project_db): SetupProjectDatabase.init(project_db) items = gis.Gis_subbasins.select().order_by(gis.Gis_subbasins.id) return [{ 'value': m.id, 'text': 'Subbasin {}'.format(m.id) } for m in items]