Source code for aequilibrae.project.network.mode

import string

from aequilibrae.utils.db_utils import commit_and_close
from aequilibrae.utils.spatialite_utils import connect_spatialite


[docs] class Mode: """A mode object represents a single record in the *modes* table""" __alowed_characters = string.ascii_letters + "_"
[docs] def __init__(self, mode_id: str, project) -> None: self.project = project if mode_id is None: raise ValueError("Mode IDs cannot be None") if len(mode_id) != 1 or mode_id not in string.ascii_letters: raise ValueError("Mode IDs must be a single ascii character") with commit_and_close(connect_spatialite(self.project.path_to_file)) as conn: table_struct = conn.execute("pragma table_info(modes)").fetchall() self.__fields = [x[1] for x in table_struct] self.__original__ = {} # data for the mode dt = conn.execute(f"select * from 'modes' where mode_id='{mode_id}'").fetchone() if dt is None: # if the mode was not found, we return a new one for k in self.__fields: self.__dict__[k] = None self.__original__[k] = None self.__dict__["mode_id"] = mode_id self.__original__["mode_id"] = mode_id else: for k, v in zip(self.__fields, dt): self.__dict__[k] = v self.__original__[k] = v
def __setattr__(self, instance, value) -> None: if instance == "mode_name" and value is None: raise ValueError("mode_name cannot be None") if instance == "mode_id": raise ValueError("Changing a mode_id is not supported. Create a new one and delete this one") else: self.__dict__[instance] = value
[docs] def save(self): if self.mode_id not in self.__alowed_characters: raise ValueError("mode_id needs to be a ascii letter") for letter in self.mode_name: if letter not in self.__alowed_characters: raise ValueError('mode_name can only contain letters and "_"') with commit_and_close(connect_spatialite(self.project.path_to_file)) as conn: if conn.execute(f'select count(*) from modes where mode_id="{self.mode_id}"').fetchone()[0] == 0: raise ValueError("Mode does not exist in the model. You need to explicitly add it") table_struct = [x[1] for x in conn.execute("pragma table_info(modes)").fetchall()] for key, value in self.__dict__.items(): if key in table_struct and key != "mode_id": v_old = self.__original__.get(key, None) if value != v_old and value is not None: self.__original__[key] = value conn.execute(f"update 'modes' set '{key}'=? where mode_id='{self.mode_id}'", [value])