from backend.database.validators import ValidationError class DatabaseScheme: meta = {} fields = {} @classmethod def get_create_line(cls) -> str: fields = cls.fields meta = cls.meta lines = [f'`{name}` {field.sql_line}' for name, field in fields.items()] if 'primary_key' in meta: primary_key = ', PRIMARY KEY (`{}`)'.format(meta['primary_key']) else: primary_key = '' return 'CREATE TABLE IF NOT EXISTS `{name}` (\n{fields}{primary_key}\n);'.format( name=meta['name'], fields=',\n'.join(lines), primary_key=primary_key ) @classmethod def validate(cls, data: dict) -> dict: data_fields = set(data.keys()) scheme_fields = set(cls.fields.keys()) defined_fields = scheme_fields & data_fields not_defined_fields = scheme_fields ^ defined_fields validation_results = {'error': False} for field in not_defined_fields: validation_results['error'] = True validation_results[field] = 'Field is not defined' for field in defined_fields: try: cls.fields[field].validate(data[field]) except ValidationError as e: validation_results['error'] = True validation_results[field] = str(e) else: validation_results[field] = None return validation_results