Completed
Push — master ( fe6d7a...5e9dbb )
by
unknown
02:04
created

tracim.command.initializedb   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 65
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 53
dl 0
loc 65
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A InitializeDBCommand._create_schema() 0 5 1
A InitializeDBCommand.take_action() 0 7 1
A InitializeDBCommand.get_description() 0 2 1
A InitializeDBCommand._populate_database() 0 20 3
A InitializeDBCommand.get_parser() 0 3 1
1
# -*- coding: utf-8 -*-
2
import transaction
3
from pyramid.paster import (
4
    get_appsettings,
5
    setup_logging,
6
    )
7
8
from tracim import CFG
9
from tracim.fixtures import FixturesLoader
10
from tracim.fixtures.users_and_groups import Base as BaseFixture
11
from sqlalchemy.exc import IntegrityError
12
from tracim.command import AppContextCommand
13
from tracim.models.meta import DeclarativeBase
14
from tracim.models import (
15
    get_engine,
16
    get_session_factory,
17
    get_tm_session,
18
    )
19
20
21
class InitializeDBCommand(AppContextCommand):
22
    auto_setup_context = False
23
24
    def get_description(self):
25
        return "Initialize DB"
26
27
    def get_parser(self, prog_name):
28
        parser = super().get_parser(prog_name)
29
        return parser
30
31
    def take_action(self, parsed_args):
32
        super(InitializeDBCommand, self).take_action(parsed_args)
33
        config_uri = parsed_args.config_file
34
        setup_logging(config_uri)
35
        settings = get_appsettings(config_uri)
36
        self._create_schema(settings)
37
        self._populate_database(settings)
38
39
    @classmethod
40
    def _create_schema(cls, settings):
41
        print("- Create Schemas of databases -")
42
        engine = get_engine(settings)
43
        DeclarativeBase.metadata.create_all(engine)
44
45
    @classmethod
46
    def _populate_database(cls, settings):
47
        engine = get_engine(settings)
48
        session_factory = get_session_factory(engine)
49
        app_config = CFG(settings)
50
        print("- Populate database with default data -")
51
        with transaction.manager:
52
            dbsession = get_tm_session(session_factory, transaction.manager)
53
            try:
54
                fixtures_loader = FixturesLoader(dbsession, app_config)
55
                fixtures_loader.loads([BaseFixture])
56
                transaction.commit()
57
                print("Database initialized.")
58
            except IntegrityError:
59
                print('Warning, there was a problem when adding default data'
60
                      ', it may have already been added:')
61
                import traceback
62
                print(traceback.format_exc())
63
                transaction.abort()
64
                print('Database initialization failed')
65