summaryrefslogtreecommitdiff
path: root/config/__init__.py
blob: 24ff9682fd22b801f0db62c40f1cf1ddfdf3fb3b (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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import tomllib
import re
import sqlalchemy.exc as sqlalchemy_exceptions
from src.database import db, init_db
from src.database.models import Blog

with open('config.toml', 'rb') as config_file:
    user_config = tomllib.load(config_file)


def initialize(app):
    app.config['SQLALCHEMY_DATABASE_URI'] = database_connection_string(app)
    init_db(app)
    # Check the config file for any blog domains.
    initialize_blogs(app)
    initialize_blueprints(app)


def database_connection_string(app):
    if app.debug:
        return (f"mysql+pymysql://{user_config['Database']['user']}:"
                f"{user_config['Database']['password']}@"
                f"{user_config['Database']['host']}/dev_simple_comments")
    else:
        return (f"mysql+pymysql://{user_config['Database']['user']}:"
                f"{user_config['Database']['password']}@"
                f"{user_config['Database']['host']}/simple_comments")


def initialize_blogs(app):
    with app.app_context():
        for domain in user_config['Blogs']['domains']:
            blog = Blog(domain=domain)
            db.session.add(blog)
            # It may be worth it to research a better way to do this...
            try:
                db.session.commit()
            # The blog's already been registered.
            except sqlalchemy_exceptions.IntegrityError:
                db.session.rollback()
                continue
            # The tables haven't been created.
            except sqlalchemy_exceptions.ProgrammingError:
                break


def initialize_blueprints(app):
    import src.controllers as app_controllers

    controller_regex = re.compile('_controller$')
    controllers = [definition for definition in dir(app_controllers)
                   if controller_regex.search(definition) is not None]

    for controller in controllers:
        # Remove the _controller substring from the controller name,
        # getting its prefix.
        controller_name = controller.split('_')[0]
        blueprint = getattr(getattr(app_controllers, controller),
                            f"{controller_name}_blueprint")
        app.register_blueprint(blueprint)