initializedb.py 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. # -*- coding: utf-8 -*-
  2. import argparse
  3. import plaster_pastedeploy
  4. import transaction
  5. from pyramid.paster import (
  6. get_appsettings,
  7. setup_logging,
  8. )
  9. from tracim import CFG
  10. from tracim.fixtures import FixturesLoader
  11. from tracim.fixtures.users_and_groups import Base as BaseFixture
  12. from sqlalchemy.exc import IntegrityError
  13. from tracim.command import AppContextCommand
  14. from tracim.models.meta import DeclarativeBase
  15. from tracim.models import (
  16. get_engine,
  17. get_session_factory,
  18. get_tm_session,
  19. )
  20. class InitializeDBCommand(AppContextCommand):
  21. auto_setup_context = False
  22. def get_description(self) -> str:
  23. return "Initialize DB"
  24. def get_parser(self, prog_name: str) -> argparse.ArgumentParser:
  25. parser = super().get_parser(prog_name)
  26. return parser
  27. def take_action(self, parsed_args: argparse.Namespace) -> None:
  28. super(InitializeDBCommand, self).take_action(parsed_args)
  29. config_uri = parsed_args.config_file
  30. setup_logging(config_uri)
  31. settings = get_appsettings(config_uri)
  32. self._create_schema(settings)
  33. self._populate_database(settings)
  34. @classmethod
  35. def _create_schema(
  36. cls,
  37. settings: plaster_pastedeploy.ConfigDict
  38. ) -> None:
  39. print("- Create Schemas of databases -")
  40. engine = get_engine(settings)
  41. DeclarativeBase.metadata.create_all(engine)
  42. @classmethod
  43. def _populate_database(
  44. cls,
  45. settings: plaster_pastedeploy.ConfigDict
  46. ) -> None:
  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')