class DBTester(object): """The :class:`~ess_test.conftest.DBTester` provides functionality for interacting with the database.. """ def __init__(self): self._dbsession = DBSession() def get_model(self, name, query_params = None): """Retrieve a single instance of the model ``name``, filtered by the ``query``. :param name: The name of the model to get the instance for :type name: ``unicode`` :param query: The query to use for selecting the instance as a tuple of ``(field, comparator, value)`` :type query: ``tuple`` :return: The result of the query """ cls = getattr(models, name) query = self._dbsession.query(cls) if query_params: if query_params[1] == '==': query = query.filter(getattr(cls, query_params[0]) == query_params[2]) return query.first() def create_model(self, name, params): """Create a new instance of the model ``name`` with the given ``params``. :param name: The name of the model to create the instance of :type name: ``unicode`` :param params: The initial parameters to use for creating the instance :type params: ``dict`` :return: The new instance """ cls = getattr(models, name) loaded = list(self._dbsession.identity_map.values()) with transaction.manager: model = cls(**params) self._dbsession.add(model) self._dbsession.add(model) self._dbsession.add_all(loaded) return model def update(self, obj, **kwargs): """Update the given ``obj`` with the key/value parameters. :param obj: The obj to update :type obj: :class:`pywebtools.sqlalchemy.Base` """ loaded = list(self._dbsession.identity_map.values()) with transaction.manager: self._dbsession.add(obj) for key, value in kwargs.items(): if isinstance(value, Base): self._dbsession.add(value) setattr(obj, key, value) self._dbsession.add_all(loaded) def flush(self): """Flush the session.""" self._dbsession.flush()
def initialise_database(args): settings = get_appsettings(args.configuration) setup_logging(args.configuration) engine = engine_from_config(settings, 'sqlalchemy.') DBSession.configure(bind=engine) if args.drop_existing: Base.metadata.drop_all(engine) Base.metadata.create_all(engine) dbsession = DBSession() with transaction.manager: user = User(email='*****@*****.**', display_name='Admin', status='active') user.new_password('password') group = PermissionGroup(title='Site administrator') group.permissions.append( Permission(name='admin.users.view', title='View all users')) group.permissions.append( Permission(name='admin.users.edit', title='Edit all users')) group.permissions.append( Permission(name='admin.users.delete', title='Delete all users')) group.permissions.append( Permission(name='admin.users.permissions', title='Edit all user\'s permissions')) user.permission_groups.append(group) group = PermissionGroup(title='Developer') group.permissions.append( Permission(name='experiment.create', title='Create new experiments')) user.permission_groups.append(group) dbsession.add(user) group = PermissionGroup(title='Content administrator') group.permissions.append( Permission(name='experiment.view', title='View all experiments')) group.permissions.append( Permission(name='experiment.edit', title='Edit all experiments')) group.permissions.append( Permission(name='experiment.delete', title='Delete all experiments')) dbsession.add(group) question_types = load(QuestionTypeIOSchema(many=True), json.loads(resource_string('ess', 'scripts/templates/default_question_types.json').\ decode('utf-8'))) dbsession.add_all(question_types) alembic_config = config.Config(args.configuration, ini_section='app:main') alembic_config.set_section_option('app:main', 'script_location', 'ess:migrations') command.stamp(alembic_config, "head")
def database(): """The :func:`~ess_test.conftest.database` fixture initialises the database specified in the "testing.ini", removes any existing data, creates the standard permissions, and four test users: * admin - user with full administrative permissions * developer - user with full experiment development permissions * content - user with full editing permissions * general - user with no permissions """ global dbsession_initialised # Load settings settings = get_appsettings('testing.ini') setup_logging('testing.ini') # Init the DB engine = engine_from_config(settings, 'sqlalchemy.') if not dbsession_initialised: DBSession.configure(bind=engine) dbsession_initialised = True Base.metadata.drop_all(engine) Base.metadata.create_all(engine) dbsession = DBSession() # Create Test Users with transaction.manager: admin_user = User(email='*****@*****.**', display_name='Admin', password='******') developer_user = User(email='*****@*****.**', display_name='Developer', password='******') content_user = User(email='*****@*****.**', display_name='Content', password='******') general_user = User(email='*****@*****.**', display_name='General', password='******') dbsession.add(general_user) group = PermissionGroup(title='Site administrator') group.permissions.append(Permission(name='admin.users', title='Administer the users')) group.permissions.append(Permission(name='admin.groups', title='Administer the permission groups')) group.permissions.append(Permission(name='admin.question_types', title='Administer the question types')) admin_user.permission_groups.append(group) group = PermissionGroup(title='Developer') group.permissions.append(Permission(name='survey.new', title='Create new experiments')) admin_user.permission_groups.append(group) developer_user.permission_groups.append(group) group = PermissionGroup(title='Content administrator') group.permissions.append(Permission(name='survey.view-all', title='View all experiments')) group.permissions.append(Permission(name='survey.edit-all', title='Edit all experiments')) group.permissions.append(Permission(name='survey.delete-all', title='Delete all experiments')) content_user.permission_groups.append(group) dbsession.add(admin_user) dbsession.add(developer_user) dbsession.add(content_user) question_types = QuestionTypeIOSchema(include_schemas=(QuestionTypeGroupIOSchema,), many=True).\ loads(resource_string('ess','scripts/templates/default_question_types.json')) dbsession.add_all(question_types.data) # Alembic Stamp alembic_config = config.Config('testing.ini', ini_section='app:main') alembic_config.set_section_option('app:main', 'script_location', 'ess:migrations') command.stamp(alembic_config, "head") dbsession.close() DBSession.close_all() yield DBSession