diff options
Diffstat (limited to 'day9/task5_vue/backend/database/scheme.py')
| -rw-r--r-- | day9/task5_vue/backend/database/scheme.py | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/day9/task5_vue/backend/database/scheme.py b/day9/task5_vue/backend/database/scheme.py new file mode 100644 index 0000000..f783f79 --- /dev/null +++ b/day9/task5_vue/backend/database/scheme.py @@ -0,0 +1,46 @@ +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 |