initializedb.py 2.1KB

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