diff options
| author | Georgios Andreadis <info@gandreadis.com> | 2020-06-24 09:13:09 +0200 |
|---|---|---|
| committer | Georgios Andreadis <info@gandreadis.com> | 2020-06-24 09:13:09 +0200 |
| commit | bae760a62fc6a480fbe615dff6a7de03c7fd6d1d (patch) | |
| tree | 06fc47f9922add14a3ac50fcfdfeb3d4fdc00363 /opendc/models | |
| parent | 6fdb3e75dad15523d996e457c216647755b29101 (diff) | |
Add formatter
Diffstat (limited to 'opendc/models')
27 files changed, 59 insertions, 207 deletions
diff --git a/opendc/models/allowed_object.py b/opendc/models/allowed_object.py index 62fcb1ae..48f2abd5 100644 --- a/opendc/models/allowed_object.py +++ b/opendc/models/allowed_object.py @@ -2,12 +2,7 @@ from opendc.models.model import Model class AllowedObject(Model): - JSON_TO_PYTHON_DICT = { - 'AllowedObject': { - 'roomType': 'room_type', - 'objectType': 'object_type' - } - } + JSON_TO_PYTHON_DICT = {'AllowedObject': {'roomType': 'room_type', 'objectType': 'object_type'}} COLLECTION_NAME = 'allowed_objects' COLUMNS = ['room_type', 'object_type'] diff --git a/opendc/models/authorization.py b/opendc/models/authorization.py index 4c714e6d..7ec88e78 100644 --- a/opendc/models/authorization.py +++ b/opendc/models/authorization.py @@ -18,12 +18,7 @@ class Authorization(Model): def google_id_has_at_least(self, google_id, authorization_level): """Return True if the User has at least the given auth level over this Authorization.""" - authorization = Authorization.from_primary_key( - ( - User.from_google_id(google_id).id, - self.simulation_id - ) - ) + authorization = Authorization.from_primary_key((User.from_google_id(google_id).id, self.simulation_id)) if authorization is None: return False diff --git a/opendc/models/cpu.py b/opendc/models/cpu.py index 7ab8cecc..034a86fe 100644 --- a/opendc/models/cpu.py +++ b/opendc/models/cpu.py @@ -19,15 +19,8 @@ class CPU(Model): COLLECTION_NAME = 'cpus' COLUMNS = [ - 'id', - 'manufacturer', - 'family', - 'generation', - 'model', - 'clock_rate_mhz', - 'number_of_cores', - 'energy_consumption_w', - 'failure_model_id' + 'id', 'manufacturer', 'family', 'generation', 'model', 'clock_rate_mhz', 'number_of_cores', + 'energy_consumption_w', 'failure_model_id' ] COLUMNS_PRIMARY_KEY = ['id'] diff --git a/opendc/models/datacenter.py b/opendc/models/datacenter.py index 21e37b52..d4cbf811 100644 --- a/opendc/models/datacenter.py +++ b/opendc/models/datacenter.py @@ -3,13 +3,7 @@ from opendc.models.section import Section class Datacenter(Model): - JSON_TO_PYTHON_DICT = { - 'datacenter': { - 'id': 'id', - 'starred': 'starred', - 'simulationId': 'simulation_id' - } - } + JSON_TO_PYTHON_DICT = {'datacenter': {'id': 'id', 'starred': 'starred', 'simulationId': 'simulation_id'}} PATH = '/v1/simulations/{simulationId}/datacenters' diff --git a/opendc/models/experiment.py b/opendc/models/experiment.py index 23d80047..1f33fa3b 100644 --- a/opendc/models/experiment.py +++ b/opendc/models/experiment.py @@ -27,7 +27,7 @@ class Experiment(Model): # Get the Simulation try: - simulation = Simulation.from_primary_key((self.simulation_id,)) + simulation = Simulation.from_primary_key((self.simulation_id, )) except exceptions.RowNotFoundError: return False diff --git a/opendc/models/failure_model.py b/opendc/models/failure_model.py index cffa2c47..f5c4909d 100644 --- a/opendc/models/failure_model.py +++ b/opendc/models/failure_model.py @@ -2,13 +2,7 @@ from opendc.models.model import Model class FailureModel(Model): - JSON_TO_PYTHON_DICT = { - 'FailureModel': { - 'id': 'id', - 'name': 'name', - 'rate': 'rate' - } - } + JSON_TO_PYTHON_DICT = {'FailureModel': {'id': 'id', 'name': 'name', 'rate': 'rate'}} COLLECTION_NAME = 'failure_models' COLUMNS = ['id', 'name', 'rate'] diff --git a/opendc/models/gpu.py b/opendc/models/gpu.py index d56ceba6..672df6fa 100644 --- a/opendc/models/gpu.py +++ b/opendc/models/gpu.py @@ -19,15 +19,8 @@ class GPU(Model): COLLECTION_NAME = 'gpus' COLUMNS = [ - 'id', - 'manufacturer', - 'family', - 'generation', - 'model', - 'clock_rate_mhz', - 'number_of_cores', - 'energy_consumption_w', - 'failure_model_id' + 'id', 'manufacturer', 'family', 'generation', 'model', 'clock_rate_mhz', 'number_of_cores', + 'energy_consumption_w', 'failure_model_id' ] COLUMNS_PRIMARY_KEY = ['id'] diff --git a/opendc/models/job.py b/opendc/models/job.py index aaf2a20c..81354952 100644 --- a/opendc/models/job.py +++ b/opendc/models/job.py @@ -2,12 +2,7 @@ from opendc.models.model import Model class Job(Model): - JSON_TO_PYTHON_DICT = { - 'Job': { - 'id': 'id', - 'name': 'name' - } - } + JSON_TO_PYTHON_DICT = {'Job': {'id': 'id', 'name': 'name'}} COLLECTION_NAME = 'jobs' COLUMNS = ['id', 'name'] diff --git a/opendc/models/machine.py b/opendc/models/machine.py index b79cae94..1b853bf9 100644 --- a/opendc/models/machine.py +++ b/opendc/models/machine.py @@ -41,15 +41,13 @@ class Machine(Model): # First, delete current machine-device links statement = 'DELETE FROM machine_{} WHERE machine_id = %s'.format(device_table) - database.execute(statement, (before_insert.id,)) + database.execute(statement, (before_insert.id, )) # Then, add current ones for device_id in getattr(before_insert, before_insert.device_table_to_attribute[device_table]): statement = 'INSERT INTO machine_{} (machine_id, {}) VALUES (%s, %s)'.format( - device_table, - before_insert.device_table_to_attribute[device_table][:-1] - ) + device_table, before_insert.device_table_to_attribute[device_table][:-1]) database.execute(statement, (before_insert.id, device_id)) @@ -68,7 +66,7 @@ class Machine(Model): except: return cls(id=-1) - return cls.from_primary_key((machine_id,)) + return cls.from_primary_key((machine_id, )) def google_id_has_at_least(self, google_id, authorization_level): """Return True if the user has at least the given auth level over this Machine.""" @@ -76,7 +74,7 @@ class Machine(Model): # Get the Rack try: - rack = Rack.from_primary_key((self.rack_id,)) + rack = Rack.from_primary_key((self.rack_id, )) except exceptions.RowNotFoundError: return False @@ -102,7 +100,7 @@ class Machine(Model): for device_table in self.device_table_to_attribute.keys(): statement = 'SELECT * FROM machine_{} WHERE machine_id = %s'.format(device_table) - results = database.fetch_all(statement, (self.id,)) + results = database.fetch_all(statement, (self.id, )) device_ids = [] diff --git a/opendc/models/machine_state.py b/opendc/models/machine_state.py index ba6d261f..3418f66e 100644 --- a/opendc/models/machine_state.py +++ b/opendc/models/machine_state.py @@ -14,8 +14,7 @@ class MachineState(Model): } COLLECTION_NAME = 'machine_states' - COLUMNS = ['id', 'machine_id', 'experiment_id', 'tick', 'temperature_c', 'in_use_memory_mb', - 'load_fraction'] + COLUMNS = ['id', 'machine_id', 'experiment_id', 'tick', 'temperature_c', 'in_use_memory_mb', 'load_fraction'] COLUMNS_PRIMARY_KEY = ['id'] @@ -23,13 +22,7 @@ class MachineState(Model): def _from_database_row(cls, row): """Instantiate a MachineState from a database row (including tick from the TaskState).""" - return cls( - machine_id=row[1], - temperature_c=row[4], - in_use_memory_mb=row[5], - load_fraction=row[6], - tick=row[3] - ) + return cls(machine_id=row[1], temperature_c=row[4], in_use_memory_mb=row[5], load_fraction=row[6], tick=row[3]) @classmethod def from_experiment_id(cls, experiment_id): @@ -38,7 +31,7 @@ class MachineState(Model): machine_states = [] statement = 'SELECT * FROM machine_states WHERE experiment_id = %s' - results = database.fetch_all(statement, (experiment_id,)) + results = database.fetch_all(statement, (experiment_id, )) for row in results: machine_states.append(cls._from_database_row(row)) @@ -65,7 +58,7 @@ class MachineState(Model): super(MachineState, self).read() statement = 'SELECT tick FROM task_states WHERE id = %s' - result = database.fetch_one(statement, (self.task_state_id,)) + result = database.fetch_one(statement, (self.task_state_id, )) self.tick = result[0] diff --git a/opendc/models/memory.py b/opendc/models/memory.py index 496c887f..17a79e14 100644 --- a/opendc/models/memory.py +++ b/opendc/models/memory.py @@ -19,14 +19,7 @@ class Memory(Model): COLLECTION_NAME = 'memories' COLUMNS = [ - 'id', - 'manufacturer', - 'family', - 'generation', - 'model', - 'speed_mb_per_s', - 'size_mb', - 'energy_consumption_w', + 'id', 'manufacturer', 'family', 'generation', 'model', 'speed_mb_per_s', 'size_mb', 'energy_consumption_w', 'failure_model_id' ] diff --git a/opendc/models/model.py b/opendc/models/model.py index e9ce4f5e..896eb235 100644 --- a/opendc/models/model.py +++ b/opendc/models/model.py @@ -4,11 +4,7 @@ from opendc.util import database, exceptions class Model(object): # MUST OVERRIDE IN DERIVED CLASS - JSON_TO_PYTHON_DICT = { - 'Model': { - 'jsonParameterName': 'python_parameter_name' - } - } + JSON_TO_PYTHON_DICT = {'Model': {'jsonParameterName': 'python_parameter_name'}} PATH = '' PATH_PARAMETERS = {} @@ -33,10 +29,7 @@ class Model(object): for attribute in self.COLUMNS_PRIMARY_KEY: identifiers.append('{} = {}'.format(attribute, getattr(self, attribute))) - return '{} ({})'.format( - self.COLLECTION_NAME[:-1].title().replace('_', ''), - '; '.join(identifiers) - ) + return '{} ({})'.format(self.COLLECTION_NAME[:-1].title().replace('_', ''), '; '.join(identifiers)) # JSON CONVERSION METHODS @@ -120,9 +113,7 @@ class Model(object): def _generate_update_columns_string(cls): """Generate a SQLite updatable columns string for this Model.""" - return ', '.join( - ['{} = %s'.format(x) for x in cls.COLUMNS if x not in cls.COLUMNS_PRIMARY_KEY] - ) + return ', '.join(['{} = %s'.format(x) for x in cls.COLUMNS if x not in cls.COLUMNS_PRIMARY_KEY]) # SQL TUPLE GENERATION METHODS @@ -182,10 +173,7 @@ class Model(object): If the primary key does not exist in the database, return a stub. """ - query = 'SELECT * FROM {} WHERE {}'.format( - cls.COLLECTION_NAME, - cls._generate_primary_key_string() - ) + query = 'SELECT * FROM {} WHERE {}'.format(cls.COLLECTION_NAME, cls._generate_primary_key_string()) # Return an instantiation of the Model with values from the row if it exists @@ -207,7 +195,7 @@ class Model(object): if column_name is not None and value is not None: statement = 'SELECT * FROM {} WHERE {} = %s'.format(cls.COLLECTION_NAME, column_name) - database_models = database.fetch_all(statement, (value,)) + database_models = database.fetch_all(statement, (value, )) else: statement = 'SELECT * FROM {}'.format(cls.COLLECTION_NAME) @@ -230,10 +218,7 @@ class Model(object): self.read() - statement = 'DELETE FROM {} WHERE {}'.format( - self.COLLECTION_NAME, - self._generate_primary_key_string() - ) + statement = 'DELETE FROM {} WHERE {}'.format(self.COLLECTION_NAME, self._generate_primary_key_string()) values = self._generate_primary_key_tuple() @@ -254,18 +239,12 @@ class Model(object): """ if column is None: - query = query.format( - self.COLLECTION_NAME, - self._generate_primary_key_string() - ) + query = query.format(self.COLLECTION_NAME, self._generate_primary_key_string()) values = self._generate_primary_key_tuple() else: - query = query.format( - self.COLLECTION_NAME, - '{} = %s'.format(column) - ) - values = (getattr(self, column),) + query = query.format(self.COLLECTION_NAME, '{} = %s'.format(column)) + values = (getattr(self, column), ) return database.fetch_one(query, values)[0] == 1 @@ -280,11 +259,9 @@ class Model(object): def insert_with_id(self, is_auto_generated=True): """Insert this Model into the database without removing its id.""" - statement = 'INSERT INTO {} ({}) VALUES ({})'.format( - self.COLLECTION_NAME, - self._generate_insert_columns_string(), - self._generate_insert_placeholders_string() - ) + statement = 'INSERT INTO {} ({}) VALUES ({})'.format(self.COLLECTION_NAME, + self._generate_insert_columns_string(), + self._generate_insert_placeholders_string()) values = self._generate_insert_columns_tuple() @@ -315,11 +292,8 @@ class Model(object): def update(self): """Update this Model's non-primary key attributes in the database.""" - statement = 'UPDATE {} SET {} WHERE {}'.format( - self.COLLECTION_NAME, - self._generate_update_columns_string(), - self._generate_primary_key_string() - ) + statement = 'UPDATE {} SET {} WHERE {}'.format(self.COLLECTION_NAME, self._generate_update_columns_string(), + self._generate_primary_key_string()) values = self._generate_update_columns_tuple() + self._generate_primary_key_tuple() diff --git a/opendc/models/object.py b/opendc/models/object.py index dab2f24e..2ce079af 100644 --- a/opendc/models/object.py +++ b/opendc/models/object.py @@ -2,12 +2,7 @@ from opendc.models.model import Model class Object(Model): - JSON_TO_PYTHON_DICT = { - 'Object': { - 'id': 'id', - 'type': 'type' - } - } + JSON_TO_PYTHON_DICT = {'Object': {'id': 'id', 'type': 'type'}} COLLECTION_NAME = 'objects' COLUMNS = ['id', 'type'] diff --git a/opendc/models/queued_experiment.py b/opendc/models/queued_experiment.py index cd00a495..b59cfedc 100644 --- a/opendc/models/queued_experiment.py +++ b/opendc/models/queued_experiment.py @@ -2,11 +2,7 @@ from opendc.models.model import Model class QueuedExperiment(Model): - JSON_TO_PYTHON_DICT = { - 'QueuedExperiment': { - 'experimentId': 'experiment_id' - } - } + JSON_TO_PYTHON_DICT = {'QueuedExperiment': {'experimentId': 'experiment_id'}} COLLECTION_NAME = 'queued_experiments' COLUMNS = ['experiment_id'] diff --git a/opendc/models/rack.py b/opendc/models/rack.py index 7b085a57..52cb0ffe 100644 --- a/opendc/models/rack.py +++ b/opendc/models/rack.py @@ -24,12 +24,12 @@ class Rack(Model): def from_tile_id(cls, tile_id): """Get a Rack from the ID of the Tile it's on.""" - tile = Tile.from_primary_key((tile_id,)) + tile = Tile.from_primary_key((tile_id, )) if not tile.exists(): return Rack(id=-1) - return cls.from_primary_key((tile.object_id,)) + return cls.from_primary_key((tile.object_id, )) def google_id_has_at_least(self, google_id, authorization_level): """Return True if the user has at least the given auth level over this Rack.""" @@ -57,5 +57,5 @@ class Rack(Model): def delete(self): """Delete a Rack by deleting its associated object.""" - obj = Object.from_primary_key((self.id,)) + obj = Object.from_primary_key((self.id, )) obj.delete() diff --git a/opendc/models/rack_state.py b/opendc/models/rack_state.py index 440ab293..a261fce0 100644 --- a/opendc/models/rack_state.py +++ b/opendc/models/rack_state.py @@ -3,23 +3,13 @@ from opendc.util import database class RackState(Model): - JSON_TO_PYTHON_DICT = { - 'RackState': { - 'rackId': 'rack_id', - 'loadFraction': 'load_fraction', - 'tick': 'tick' - } - } + JSON_TO_PYTHON_DICT = {'RackState': {'rackId': 'rack_id', 'loadFraction': 'load_fraction', 'tick': 'tick'}} @classmethod def _from_database_row(cls, row): """Instantiate a RackState from a database row.""" - return cls( - rack_id=row[0], - load_fraction=row[1], - tick=row[2] - ) + return cls(rack_id=row[0], load_fraction=row[1], tick=row[2]) @classmethod def from_experiment_id(cls, experiment_id): @@ -35,7 +25,7 @@ class RackState(Model): WHERE machine_states.experiment_id = %s GROUP BY machine_states.tick, racks.id ''' - results = database.fetch_all(statement, (experiment_id,)) + results = database.fetch_all(statement, (experiment_id, )) for row in results: rack_states.append(cls._from_database_row(row)) diff --git a/opendc/models/room.py b/opendc/models/room.py index a4266627..6a7627f5 100644 --- a/opendc/models/room.py +++ b/opendc/models/room.py @@ -26,7 +26,7 @@ class Room(Model): # Get the Datacenter try: - datacenter = Datacenter.from_primary_key((self.datacenter_id,)) + datacenter = Datacenter.from_primary_key((self.datacenter_id, )) except exceptions.RowNotFoundError: return False diff --git a/opendc/models/room_state.py b/opendc/models/room_state.py index 2404d86b..4326a32b 100644 --- a/opendc/models/room_state.py +++ b/opendc/models/room_state.py @@ -3,23 +3,13 @@ from opendc.util import database class RoomState(Model): - JSON_TO_PYTHON_DICT = { - 'RoomState': { - 'roomId': 'room_id', - 'loadFraction': 'load_fraction', - 'tick': 'tick' - } - } + JSON_TO_PYTHON_DICT = {'RoomState': {'roomId': 'room_id', 'loadFraction': 'load_fraction', 'tick': 'tick'}} @classmethod def _from_database_row(cls, row): """Instantiate a RoomState from a database row.""" - return cls( - room_id=row[0], - load_fraction=row[1], - tick=row[2] - ) + return cls(room_id=row[0], load_fraction=row[1], tick=row[2]) @classmethod def from_experiment_id(cls, experiment_id): @@ -39,7 +29,7 @@ class RoomState(Model): AND machine_states.experiment_id = %s GROUP BY machine_states.tick, rooms.id ''' - results = database.fetch_all(statement, (experiment_id,)) + results = database.fetch_all(statement, (experiment_id, )) for row in results: room_states.append(cls._from_database_row(row)) diff --git a/opendc/models/room_type.py b/opendc/models/room_type.py index c252e4fe..b91c1e67 100644 --- a/opendc/models/room_type.py +++ b/opendc/models/room_type.py @@ -2,11 +2,7 @@ from opendc.models.model import Model class RoomType(Model): - JSON_TO_PYTHON_DICT = { - 'RoomType': { - 'name': 'name' - } - } + JSON_TO_PYTHON_DICT = {'RoomType': {'name': 'name'}} COLLECTION_NAME = 'room_types' COLUMNS = ['name'] diff --git a/opendc/models/scheduler.py b/opendc/models/scheduler.py index c9523ce2..c3c98b7a 100644 --- a/opendc/models/scheduler.py +++ b/opendc/models/scheduler.py @@ -2,11 +2,7 @@ from opendc.models.model import Model class Scheduler(Model): - JSON_TO_PYTHON_DICT = { - 'Scheduler': { - 'name': 'name' - } - } + JSON_TO_PYTHON_DICT = {'Scheduler': {'name': 'name'}} COLLECTION_NAME = 'schedulers' COLUMNS = ['name'] diff --git a/opendc/models/section.py b/opendc/models/section.py index 53b5e6c9..2fd71068 100644 --- a/opendc/models/section.py +++ b/opendc/models/section.py @@ -23,7 +23,7 @@ class Section(Model): # Get the Path try: - path = Path.from_primary_key((self.path_id,)) + path = Path.from_primary_key((self.path_id, )) except exceptions.RowNotFoundError: return False diff --git a/opendc/models/storage.py b/opendc/models/storage.py index 3f84ba5e..93cc8b68 100644 --- a/opendc/models/storage.py +++ b/opendc/models/storage.py @@ -19,14 +19,7 @@ class Storage(Model): COLLECTION_NAME = 'storages' COLUMNS = [ - 'id', - 'manufacturer', - 'family', - 'generation', - 'model', - 'speed_mb_per_s', - 'size_mb', - 'energy_consumption_w', + 'id', 'manufacturer', 'family', 'generation', 'model', 'speed_mb_per_s', 'size_mb', 'energy_consumption_w', 'failure_model_id' ] diff --git a/opendc/models/task_duration.py b/opendc/models/task_duration.py index 14cbc31a..ad6459ab 100644 --- a/opendc/models/task_duration.py +++ b/opendc/models/task_duration.py @@ -3,21 +3,13 @@ from opendc.util import database class TaskDuration(Model): - JSON_TO_PYTHON_DICT = { - 'TaskDuration': { - 'taskId': 'task_id', - 'duration': 'duration' - } - } + JSON_TO_PYTHON_DICT = {'TaskDuration': {'taskId': 'task_id', 'duration': 'duration'}} @classmethod def _from_database_row(cls, row): """Instantiate a RoomState from a database row.""" - return cls( - task_id=row[0], - duration=row[1] - ) + return cls(task_id=row[0], duration=row[1]) @classmethod def from_experiment_id(cls, experiment_id): @@ -31,7 +23,7 @@ class TaskDuration(Model): GROUP BY task_id ''' - results = database.fetch_all(statement, (experiment_id,)) + results = database.fetch_all(statement, (experiment_id, )) for row in results: room_states.append(cls._from_database_row(row)) diff --git a/opendc/models/task_state.py b/opendc/models/task_state.py index ad78cc67..2cef20ee 100644 --- a/opendc/models/task_state.py +++ b/opendc/models/task_state.py @@ -29,15 +29,7 @@ class TaskState(Model): results = database.fetch_all(statement, (experiment_id, tick)) for row in results: - task_states.append( - cls( - id=row[0], - task_id=row[1], - experiment_id=row[2], - tick=row[3], - flops_left=row[4] - ) - ) + task_states.append(cls(id=row[0], task_id=row[1], experiment_id=row[2], tick=row[3], flops_left=row[4])) return task_states diff --git a/opendc/models/tile.py b/opendc/models/tile.py index ac22ccac..a945564f 100644 --- a/opendc/models/tile.py +++ b/opendc/models/tile.py @@ -29,7 +29,7 @@ class Tile(Model): # Get the Room try: - room = Room.from_primary_key((self.room_id,)) + room = Room.from_primary_key((self.room_id, )) except exceptions.RowNotFoundError: return False @@ -43,5 +43,5 @@ class Tile(Model): super(Tile, self).read() if self.object_id is not None: - obj = Object.from_primary_key((self.object_id,)) + obj = Object.from_primary_key((self.object_id, )) self.object_type = obj.type diff --git a/opendc/models/trace.py b/opendc/models/trace.py index 2f5e33cd..f6d2e1c1 100644 --- a/opendc/models/trace.py +++ b/opendc/models/trace.py @@ -2,12 +2,7 @@ from opendc.models.model import Model class Trace(Model): - JSON_TO_PYTHON_DICT = { - 'Trace': { - 'id': 'id', - 'name': 'name' - } - } + JSON_TO_PYTHON_DICT = {'Trace': {'id': 'id', 'name': 'name'}} COLLECTION_NAME = 'traces' COLUMNS = ['id', 'name'] diff --git a/opendc/models/user.py b/opendc/models/user.py index 0406c31c..df3a4e76 100644 --- a/opendc/models/user.py +++ b/opendc/models/user.py @@ -20,7 +20,7 @@ class User(Model): def from_google_id(cls, google_id): """Initialize a User by fetching them by their google id.""" - user = cls._from_database('SELECT * FROM users WHERE google_id = %s', (google_id,)) + user = cls._from_database('SELECT * FROM users WHERE google_id = %s', (google_id, )) if user is not None: return user @@ -31,7 +31,7 @@ class User(Model): def from_email(cls, email): """Initialize a User by fetching them by their email.""" - user = cls._from_database('SELECT * FROM users WHERE email = %s', (email,)) + user = cls._from_database('SELECT * FROM users WHERE email = %s', (email, )) if user is not None: return user |
