summaryrefslogtreecommitdiff
path: root/day9/task5_vue/backend/database/scheme.py
blob: f783f791df3a01c367491485c87e30cc877efed9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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