Exemplo n.º 1
0
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()
Exemplo n.º 2
0
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")
Exemplo n.º 3
0
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