Example #1
0
    def test_handle_submit_key_expired(self):
        reg = get_current_registry()
        config = Configurator(reg)
        renderer = config.testing_add_template('templates/reset_failed.pt')
        request = self.request
        request.params['key'] = '0' * 40
        self._setupUsers()
        context = self.context
        context['profiles'] = testing.DummyModel()
        profile = context['profiles']['me'] = testing.DummyModel()
        profile.password_reset_key = '0' * 40
        controller = self._makeOne(context, request)
        converted = {'login': '******'}
        # first w/ no profile reset time
        response = controller.handle_submit(converted)
        self.failUnless(hasattr(renderer, 'api'))
        self.assertEqual(renderer.api.page_title,
                         'Password Reset Confirmation Key Expired')

        # now w/ expired key
        renderer = config.testing_add_template('templates/reset_failed.pt')
        from karl.views.resetpassword import max_reset_timedelta
        import datetime
        keytime = datetime.datetime.now() - max_reset_timedelta
        profile.password_reset_time = keytime
        response = controller.handle_submit(converted)
        self.failUnless(hasattr(renderer, 'api'))
        self.assertEqual(renderer.api.page_title,
                         'Password Reset Confirmation Key Expired')
Example #2
0
def app(global_config, **settings):
    """ This function returns a WSGI application.
    
    It is usually called by the PasteDeploy framework during 
    ``paster serve``.
    """
    names = ('src_path', 'store_url', 'cache_url', 'max_entries', 'database', 'content_dir')
    values = []
    for name in names:
        val = settings.get(name)
        if val is None: 
            raise ValueError("No ā€™%sā€™ value in application configuration." % name) 
        values.append(val)
        
    src_path, store_url, cache_url, max_entries, database, content_dir = values
    
    zcml_file = settings.get('configure_zcml', 'configure.zcml')
    config = Configurator(settings=settings, root_factory=ContentRoot(content_dir))
    # use local component registry
    config.hook_zca()
    config.begin()
    config.load_zcml(zcml_file)
    
    register_source(src_path)
    register_store(store_url, cache_url, max_entries=max_entries)
    register_catalog(database)
    config.end()
    
    return config.make_wsgi_app()
Example #3
0
 def _registerComponents(self):
     # Install a bit of configuration that make_app() usually
     # does for us.
     reg = get_current_registry()
     config = Configurator(reg)
     config.setup_registry()
     config.load_zcml('opencore.includes:configure.zcml')
Example #4
0
    def test_handle_submit_wrong_key(self):
        reg = get_current_registry()
        config = Configurator(reg)
        renderer = config.testing_add_template('templates/reset_failed.pt')
        request = self.request
        request.params['key'] = '0' * 40
        self._setupUsers()
        context = self.context
        context['profiles'] = testing.DummyModel()
        context['profiles']['me'] = testing.DummyModel()
        controller = self._makeOne(context, request)
        converted = {'login': '******'}
        # first w/ no profile reset key
        response = controller.handle_submit(converted)
        self.failUnless(hasattr(renderer, 'api'))
        self.assertEqual(renderer.api.page_title,
                         'Password Reset Confirmation Problem')

        # now w/ wrong profile reset key
        renderer = config.testing_add_template('templates/reset_failed.pt')
        context['profiles']['me'].password_reset_key = '1' * 40
        response = controller.handle_submit(converted)
        self.failUnless(hasattr(renderer, 'api'))
        self.assertEqual(renderer.api.page_title,
                         'Password Reset Confirmation Problem')
Example #5
0
class ModelUtilTests(unittest.TestCase):
    def setUp(self):
        self.config = Configurator()
        self.config.begin()

    def tearDown(self):
        self.config.end()

    def test_create_child_no_kwargs(self):
        from rfd.models import create_child
        class Thing(object):
            pass
        parent = Thing()
        name = "alice"
        child = create_child(Thing, parent, name)
        self.assertEqual(child.__parent__, parent)
        self.assertEqual(child.__name__, name)

    def test_create_child_with_kwargs(self):
        from rfd.models import create_child
        class Thing(object):
            pass
        parent = Thing()
        name = "alice"
        child = create_child(Thing, parent, name, foo="foo", bar="bar")
        self.assertEqual(child.__parent__, parent)
        self.assertEqual(child.__name__, name)
        self.assertEqual(child.foo, "foo")
        self.assertEqual(child.bar, "bar")
Example #6
0
class CodecTests(unittest.TestCase):
    def setUp(self):
        self.config = Configurator()
        self.config.begin()
    
    def tearDown(self):
        self.config.end()

    def _make_codec(self):
        from tattoo.codec import decode, encode, map_dict
        CHARS = u"ABC123.Ƥ~ā‚¬+"
        BASE = len(CHARS)
        map_dict.clear()
        for num in range(BASE):
            map_dict[num] = CHARS[num]
            map_dict[CHARS[num]] = num
        return decode, encode, map_dict

    def test_encode(self):
        decode, encode, map_dict = self._make_codec()
        self.assertEqual(encode(0), u'A')
        self.assertEqual(encode(10), u'+')
        self.assertEqual(encode(7), u'\xe4')
        self.assertEqual(encode(4), u'2')

    def test_decode(self):
        decode, encode, map_dict = self._make_codec()
        self.assertEqual(decode(u'A'), 0)
        self.assertEqual(decode(u'+'), 10)
        self.assertEqual(decode(u'\xe4'), 7)
        self.assertEqual(decode(u'2'), 4)
Example #7
0
class TestRun(unittest.TestCase):
    def setUp(self):
        self.config = Configurator()
        self.config.begin()
        
    def tearDown(self):
        self.config.end()

    def test_app(self):
        from tattoo.run import app
        myapp = app(None, 
                    setup_db=setup_db, 
                    populate=populate, 
                    db_path='mongo://foo.com:1235/dbname',
                    min_url_len=21,
                    )
        self.assertEquals(myapp.__class__.__name__, 'Router')
        
    def test_app_without_db_string(self):
        from tattoo.run import app
        self.assertRaises(ValueError, app, 
                          None, 
                          setup_db=setup_db, 
                          populate=populate, 
                          min_url_len=21,
                          )

    def test_setup_db(self):
        from tattoo.run import setup_db
        from ming import Session
        from tattoo.models import SESSION_NAME
        db_uri = 'mongo://foo.com:1235/dbname'
        setup_db(db_uri)
        session = Session.by_name(SESSION_NAME)
        self.assertTrue(SESSION_NAME in session._registry.keys())
Example #8
0
    def test___call__bad_key(self):
        # register dummy renderer for the email template
        reg = get_current_registry()
        config = Configurator(reg)
        renderer = config.testing_add_template('templates/reset_failed.pt')

        request = self.request
        # no key
        controller = self._makeOne(self.context, request)
        response = controller()
        from webob.response import Response
        self.assertEqual(response.__class__, Response)
        self.failUnless(hasattr(renderer, 'api'))
        self.assertEqual(renderer.api.page_title,
                         'Password Reset URL Problem')

        # reset renderer.api value so we know the test is useful
        renderer = config.testing_add_template('templates/reset_failed.pt')
        # key of wrong length
        request.params['key'] = 'foofoofoo'
        controller = self._makeOne(self.context, request)
        response = controller()
        from webob.response import Response
        self.assertEqual(response.__class__, Response)
        self.failUnless(hasattr(renderer, 'api'))
        self.assertEqual(renderer.api.page_title,
                         'Password Reset URL Problem')
Example #9
0
 def test_handle_submit_utf8_password(self):
     password = u'password\xe1'
     reg = get_current_registry()
     config = Configurator(reg)
     renderer = config.testing_add_template('templates/reset_complete.pt')
     request = self.request
     request.params['key'] = '0' * 40
     self._setupUsers()
     context = self.context
     context['profiles'] = testing.DummyModel()
     profile = context['profiles']['me'] = testing.DummyModel()
     profile.password_reset_key = '0' * 40
     controller = self._makeOne(context, request)
     converted = {'login': '******', 'password': password}
     import datetime
     keytime = datetime.datetime.now()
     profile.password_reset_time = keytime
     response = controller.handle_submit(converted)
     self.failUnless(hasattr(renderer, 'api'))
     self.assertEqual(renderer.api.page_title,
                      'Password Reset Complete')
     renderer.assert_(login='******', password=password)
     self.failUnless(profile.password_reset_key is None)
     self.failUnless(profile.password_reset_time is None)
     user = self.context.users.get(login='******')
     from repoze.who.plugins.zodb.users import get_sha_password
     self.assertEqual(user['password'], get_sha_password(password.encode('utf8')))
Example #10
0
 def _registerComponents(self):
     # Install a bit of configuration that make_app() usually
     # does for us.
     reg = get_current_registry()
     config = Configurator(reg)
     config.setup_registry()
     config.load_zcml('karl.includes:configure.zcml')
     from zope.interface import Interface
     testing.registerAdapter(DummyToolAddables, (Interface, Interface),
                             IToolAddables)
Example #11
0
def maintenance(global_config, **local_conf):
    config = Configurator()
    config.begin()
    config.add_static_view('static', 'karl.views:static')
    config.add_route(name='maintenance',
                    path='/*url',
                    view=dummy_view,
                    view_renderer='down_for_maintenance.pt')
    config.end()
    return config.make_wsgi_app()
Example #12
0
class ViewIntegrationTest(ViewTest):
    def setUp(self):
        import seantisinvoice
        self.config = Configurator(package=seantisinvoice)
        self.config.begin()
        self.config.load_zcml('seantisinvoice:configure.zcml')
        _initTestingDB()

    def test_zcml_registration(self):
        pass
Example #13
0
def main(global_config, **settings):
    """ This function returns a WSGI application.
    
    It is usually called by the PasteDeploy framework during 
    ``paster serve``.
    """
    from repoze.bfg.authentication import AuthTktAuthenticationPolicy
    from checking.authorization import RouteAuthorizationPolicy
    from checking.authentication import verifyUser

    if not settings.get("sqlalchemy.url"):
        raise ValueError(
            "No 'sqlalchemy.url' value in application configuration.")
    config = Configurator(settings=settings,
                          authentication_policy=AuthTktAuthenticationPolicy(
                              "secret",
                              callback=verifyUser,
                              timeout=30 * 60,
                              max_age=30 * 60,
                              reissue_time=20 * 60),
                          authorization_policy=RouteAuthorizationPolicy())
    config.hook_zca()
    config.begin()
    setupSqlalchemy(settings)
    setupRoutes(config)
    setupChameleon(config)
    setupi18n(config)
    config.end()

    app = config.make_wsgi_app()
    app = TM(app)

    return app
Example #14
0
def app(global_config, **settings):
    """ This function returns a WSGI application.
    
    It is usually called by the PasteDeploy framework during 
    ``paster serve``.
    """
    zcml_file = settings.get('configure_zcml', 'configure.zcml')
    db_string = settings.get('db_string')
    if db_string is None:
        raise ValueError("No 'db_string' value in application configuration.")
    initialize_sql(db_string)
    config = Configurator(root_factory=get_root, settings=settings)
    config.begin()
    config.load_zcml(zcml_file)
    config.end()
    # Ugly hack to configure the MapperExtension with the settings.
    removal_extension.path = settings.get('upload_directory')

    scheduler = Scheduler()
    # Send out queued mails
    from eportfolio.utilities.mail_delivery import trigger_queued_delivery
    scheduler.add_interval_job(trigger_queued_delivery, seconds=30)
    scheduler.start()

    return config.make_wsgi_app()
Example #15
0
class ViewIntegrationTest(ViewTest):
    def setUp(self):
        import seantisinvoice

        self.config = Configurator(package=seantisinvoice)
        self.config.begin()
        self.config.load_zcml("seantisinvoice:configure.zcml")
        _initTestingDB()

    def test_zcml_registration(self):
        pass
Example #16
0
 def test_handle_submit_bad_key(self):
     reg = get_current_registry()
     config = Configurator(reg)
     renderer = config.testing_add_template('templates/reset_failed.pt')
     request = self.request
     request.params['key'] = 'foofoofoo'
     controller = self._makeOne(self.context, request)
     response = controller.handle_submit({})
     self.failUnless(hasattr(renderer, 'api'))
     self.assertEqual(renderer.api.page_title,
                      'Password Reset URL Problem')
Example #17
0
def app(global_config, **settings):
    """ This function returns a WSGI application.
    
    It is usually called by the PasteDeploy framework during 
    ``paster serve``.
    """
    config = Configurator()
    config.begin()
    config.add_view(home, renderer="templates/home.pt")
    config.add_view(expense, name='expense', renderer='templates/expense.pt')
    config.end()
    return config.make_wsgi_app()
Example #18
0
class BaseTest(unittest.TestCase):
    def setUp(self):
        self.config = Configurator()
        self.config.begin()
        _initTestingDB()

    def tearDown(self):
        from seantisinvoice.models import DBSession
        import transaction
        DBSession.remove()
        transaction.abort()
        self.config.end()
Example #19
0
    def setUp(self):
        # Warnings become errors!
        #import warnings
        #warnings.filterwarnings('error',category=Warning)

        self.config = Configurator()
        self.config.begin()
        _initTestingDB()

        # Setup dummy mailer
        self.mailer = DummyMailer()
        self.config.registry.registerUtility(self.mailer)
        self.config.registry.registerUtility(MailService())
Example #20
0
class BaseTest(unittest.TestCase):
    def setUp(self):
        self.config = Configurator()
        self.config.begin()
        _initTestingDB()

    def tearDown(self):
        from seantisinvoice.models import DBSession
        import transaction

        DBSession.remove()
        transaction.abort()
        self.config.end()
Example #21
0
class ViewTests(unittest.TestCase):
    def setUp(self):
        self.config = Configurator()
        self.config.begin()

    def tearDown(self):
        self.config.end()

    def test_my_view(self):
        from bmibargains.views import my_view
        request = testing.DummyRequest()
        info = my_view(request)
        self.assertEqual(info['project'], 'bmibargains')
Example #22
0
def main(global_config, **settings):
    """ This function returns a WSGI application.
    
    It is usually called by the PasteDeploy framework during 
    ``paster serve``.
    """
    from repoze.bfg.authentication import AuthTktAuthenticationPolicy
    from checking.authorization import RouteAuthorizationPolicy
    from checking.authentication import verifyUser

    if not settings.get("sqlalchemy.url"):
        raise ValueError("No 'sqlalchemy.url' value in application configuration.")
    config = Configurator(settings=settings,
            authentication_policy=AuthTktAuthenticationPolicy("secret",
                callback=verifyUser,
                timeout=30*60, max_age=30*60,
                reissue_time=20*60),
            authorization_policy=RouteAuthorizationPolicy())
    config.hook_zca()
    config.begin()
    setupSqlalchemy(settings)
    setupRoutes(config)
    setupChameleon(config)
    setupi18n(config)
    config.end()

    app = config.make_wsgi_app()
    app = TM(app)

    return app
Example #23
0
class TestUtility(unittest.TestCase):
    def setUp(self):
        self.config = Configurator()
        self.config.begin()
        
    def tearDown(self):
        self.config.end()

    def test_expire_one_year(self):
        import datetime
        from tattoo.utility import expire_one_year
        nowish = datetime.datetime.now()
        delta = expire_one_year()-nowish
        self.assertEquals(delta.days, 365)
Example #24
0
def app(global_config, **settings):
    """ This function returns a WSGI application.
    
    It is usually called by the PasteDeploy framework during 
    ``paster serve``.
    """
    zcml_file = settings.get('configure_zcml', 'configure.zcml')
    db_string = settings.get('db_string')
    if db_string is None:
        raise ValueError("No 'db_string' value in application configuration.")
    initialize_sql(db_string)
    config = Configurator(root_factory=get_root, settings=settings)
    config.begin()
    config.load_zcml(zcml_file)
    config.end()
    # Ugly hack to configure the MapperExtension with the settings.
    removal_extension.path = settings.get('upload_directory')
    
    scheduler = Scheduler()
    # Send out queued mails
    from eportfolio.utilities.mail_delivery import trigger_queued_delivery
    scheduler.add_interval_job(trigger_queued_delivery, seconds=30)
    scheduler.start()
    
    return config.make_wsgi_app()
Example #25
0
class ViewTests(unittest.TestCase):
    def setUp(self):
        self.config = Configurator()
        self.config.begin()

    def tearDown(self):
        self.config.end()

    def test_filedrop_view(self):
        from rfd.views import filedrop
        request = testing.DummyRequest()
        context = None          # this can't be right
        info = filedrop(context, request)
        self.assertEqual(info['project'], 'rfd (repoze file drop)')
Example #26
0
class ViewTests(unittest.TestCase):
    def setUp(self):
        self.config = Configurator()
        self.config.begin()

    def tearDown(self):
        self.config.end()

    def test_my_view(self):
        from dubcore.views import my_view

        request = testing.DummyRequest()
        info = my_view(request)
        self.assertEqual(info["project"], "dubcore")
Example #27
0
class ModelTests(unittest.TestCase):
    def setUp(self):
        self.config = Configurator()
        self.config.begin()
    
    def tearDown(self):
        self.config.end()

    def test_url_model(self):
        from tattoo.models import URL
        url = URL(1234, 'long', 'short')
        self.assertEquals(url._id, 1234)
        self.assertEquals(url.url, 'long')
        self.assertEquals(url.short_url, 'short')
        self.assertEquals(type(url.created), type(datetime.datetime.now()))
Example #28
0
    def setUp(self):
        import seantisinvoice

        self.config = Configurator(package=seantisinvoice)
        self.config.begin()
        self.config.load_zcml("seantisinvoice:configure.zcml")
        _initTestingDB()
Example #29
0
 def setUp(self):
     self.config = Configurator()
     self.config.hook_zca()
     self.config.begin()
     self.config.load_zcml('eportfolio:configure.zcml')
     _initTestingDB()
     
Example #30
0
def app(global_config, **settings):
    """ This function returns a WSGI application.
    """
    zcml_file = settings.get('configure_zcml', 'configure.zcml')
    config = Configurator(root_factory=get_root, settings=settings)
    config.begin()
    config.load_zcml(zcml_file)
    config.end()
    return config.make_wsgi_app()
Example #31
0
def app(global_config, **settings):
    """ This function returns a WSGI application.
    
    It is usually called by the PasteDeploy framework during 
    ``paster serve``.
    """
    zcml_file = settings.get('configure_zcml', 'configure.zcml')
    root = Root(settings.get('amqp_host', 'localhost'),
                settings.get('amqp_exchange', EXCHANGE))
    config = Configurator(root_factory=lambda request: root, settings=settings)
    config.begin()
    config.load_zcml(zcml_file)
    config.end()
    if settings.get('debug', None):
        return DebuggedApplication(config.make_wsgi_app(), True)
    else:
        return config.make_wsgi_app()
Example #32
0
class EPortfolioIntegrationTestCase(EPortfolioTestCase):
    def setUp(self):
        self.config = Configurator()
        self.config.hook_zca()
        self.config.begin()
        self.config.load_zcml('eportfolio:configure.zcml')
        _initTestingDB()
Example #33
0
 def setUp(self):
     # Warnings become errors!
     #import warnings
     #warnings.filterwarnings('error',category=Warning)
     
     self.config = Configurator()
     self.config.begin()
     _initTestingDB()
     
     # Setup dummy mailer
     self.mailer = DummyMailer()
     self.config.registry.registerUtility(self.mailer)
     self.config.registry.registerUtility(MailService())
Example #34
0
class EPortfolioIntegrationTestCase(EPortfolioTestCase):
    
    def setUp(self):
        self.config = Configurator()
        self.config.hook_zca()
        self.config.begin()
        self.config.load_zcml('eportfolio:configure.zcml')
        _initTestingDB()
        
Example #35
0
 def setUp(self):
     """ cleanUp() is required to clear out the application registry
     between tests (done in setUp for good measure too)
     """
     self.config = Configurator()
     self.config.begin()
     self.config.add_settings({'title' : 'Tattoo', 'description' : 'Another URL Shortener'})
     self.config.add_route(name='home', path='', request_method='GET')
     self.config.add_route(name='view', path=':short_url', request_method='GET')
     self.config.add_route(name='post', path ='', request_method='POST')
     self.config.add_route(name='put', path='', request_method='PUT')
     self.config.add_route(name='list', path='list', request_method='GET')
     self.config.add_route(name='nohead', path=':short_url', request_method='HEAD')
     self.config.add_static_view(name='static', path='templates/static', cache_max_age=0)
     self.config.scan()
Example #36
0
 def setUp(self):
     self.config = Configurator()
     self.config.begin()
     self.config.add_settings({'title' : 'Tattoo', 
                               'description' : 'Another URL Shortener',
                               'min_url_len': '21',
                               'reload_templates' : False})
     self.config.add_route(name='home', path='', request_method='GET')
     self.config.add_route(name='view', path=':short_url', request_method='GET')
     self.config.add_route(name='post', path ='', request_method='POST')
     self.config.add_route(name='put', path='', request_method='PUT')
     self.config.add_route(name='list', path='list', request_method='GET')
     self.config.add_route(name='nohead', path=':short_url', request_method='HEAD')
     self.config.add_static_view(name='static', path='templates/static', cache_max_age=0)
     self.config.scan()
Example #37
0
def app(global_config, **settings):
    """ This function returns a repoze.bfg.router.Router object.
    
    It is usually called by the PasteDeploy framework during ``paster serve``.
    """
    db_string = settings.get('db_string')
    if db_string is None:
        raise ValueError("No 'db_string' value in application configuration.")
    initialize_sql(db_string)
    
    # Scheduler to copy recurring invoices
    s = Scheduler()
    # Check every 5 minutes for recurring invoices
    s.add_interval_task(copy_recurring, 300)
    s.start_scheduler()
    
    config = Configurator(root_factory=RootFactory, settings=settings)
    config.begin()
    zcml_file = settings.get('configure_zcml', 'configure.zcml')
    config.load_zcml(zcml_file)
    config.end()
    return config.make_wsgi_app()
Example #38
0
 def setUp(self):
     import seantisinvoice
     self.config = Configurator(package=seantisinvoice)
     self.config.begin()
     self.config.load_zcml('seantisinvoice:configure.zcml')
     _initTestingDB()
Example #39
0
def get_form(request):
    schema = Registration()
    form = formish.Form(schema)
    form['password'].widget = formish.CheckedPassword()
    return form

def display_form(request):
    form = get_form(request)
    return {'form':form}

def validate_form(request):
    form = get_form(request)
    try:
        data = form.validate(request)
    except formish.FormError:
        return {'form':form}
    username, password = data['username'], data['password']
    return HTTPFound(location='thanks')

if __name__ == '__main__':
    from paste.httpserver import serve
    config = Configurator()
    config.begin()
    config.add_view(display_form, request_method='GET', renderer='register.pt')
    config.add_view(validate_form, request_method='POST',renderer='register.pt')
    config.add_view(name='thanks', renderer='thanks.pt')
    config.end()
    app = config.make_wsgi_app()
    serve(app)
    
Example #40
0
 def setUp(self):
     self.config = Configurator()
     self.config.begin()
     _initTestingDB()
Example #41
0
    ]


def get_root(*args, **kw):
    return Root()


if __name__ == '__main__':
    # Configure the BFG application

    ## Set up security policies, root object, etc.
    authentication_policy = RemoteUserAuthenticationPolicy()
    authorization_policy = ACLAuthorizationPolicy()
    config = Configurator(
        root_factory=get_root,
        default_permission='view',
        authentication_policy=authentication_policy,
        authorization_policy=authorization_policy,
    )
    config.begin()

    ## Configure views
    config.add_view(unprotected)
    config.add_view(protected, 'protected.html', permission='view_protected')
    config.add_view(login, 'login.html')
    config.add_view(logout, 'logout.html')
    config.end()

    ## Create the app object.
    app = config.make_wsgi_app()

    # Configure the repoze.who middleware:
Example #42
0
def wsgi_app(**settings):
    config = Configurator(root_factory=get_root, settings=settings)
    config.load_zcml("configure.zcml")
    return config.make_wsgi_app()
Example #43
0
 def setUp(self):
     self.config = Configurator()
     self.config.hook_zca()
     self.config.begin()
     self.config.load_zcml('eportfolio:configure.zcml')
     _initTestingDB()
Example #44
0
class EPortfolioTestCase(unittest.TestCase):
    def setUp(self):
        # Warnings become errors!
        #import warnings
        #warnings.filterwarnings('error',category=Warning)

        self.config = Configurator()
        self.config.begin()
        _initTestingDB()

        # Setup dummy mailer
        self.mailer = DummyMailer()
        self.config.registry.registerUtility(self.mailer)
        self.config.registry.registerUtility(MailService())

    def tearDown(self):
        from eportfolio.models import DBSession
        import transaction
        DBSession.remove()
        transaction.abort()
        self.config.end()

    def _add_student(self,
                     first_name=u"Buck",
                     last_name=u"Mulligan",
                     email=u"*****@*****.**",
                     password=u'123456'):
        from eportfolio.models.student import Student
        from eportfolio.models import DBSession
        session = DBSession()
        student = Student()
        student.first_name = first_name
        student.last_name = last_name
        student.email = email
        student.password = u'{SHA}%s' % sha.new(password).hexdigest()
        session.add(student)
        session.flush()
        return student

    def _add_teacher(self,
                     first_name=u'Leopold',
                     last_name=u'Bloom',
                     email=u'*****@*****.**',
                     password=u'12345'):
        from eportfolio.models.teacher import Teacher
        from eportfolio.models import DBSession
        session = DBSession()
        teacher = Teacher()
        teacher.first_name = first_name
        teacher.last_name = last_name
        teacher.email = email
        teacher.password = u'{SHA}%s' % sha.new(password).hexdigest()
        session.add(teacher)
        session.flush()
        return teacher

    def _add_project(self, title=u"Project", start_date=None, end_date=None):
        from eportfolio.models.project import Project
        from eportfolio.models import DBSession

        if not start_date:
            start_date = datetime.date.today() - datetime.timedelta(days=10)

        if not end_date:
            end_date = datetime.date.today() + datetime.timedelta(days=10)

        session = DBSession()
        project = Project()
        project.title = title
        project.start_date = start_date
        project.end_date = end_date
        session.add(project)
        session.flush()
        return project

    def _add_objective(self,
                       title=u'Objective',
                       description=u'Objective',
                       project=None):
        from eportfolio.models.objective import Objective
        from eportfolio.models import DBSession

        if not project:
            project = self._add_project()

        session = DBSession()
        objective = Objective(title=title,
                              description=description,
                              project=project)
        session.add(objective)
        session.flush()
        return objective

    def _add_meta_competence(self,
                             title=u'Meta competence',
                             description=u'Meta competence'):
        from eportfolio.models.meta_competence import MetaCompetence
        from eportfolio.models import DBSession

        session = DBSession()
        meta_competence = MetaCompetence(title=title, description=description)
        session.add(meta_competence)
        session.flush()
        return meta_competence

    def _add_competence(self,
                        title=u'Competence',
                        description=u'Competence',
                        meta_competence=None):
        from eportfolio.models.competence import Competence
        from eportfolio.models import DBSession

        if not meta_competence:
            meta_competence = self._add_meta_competence()

        session = DBSession()
        competence = Competence(title=title,
                                description=description,
                                meta_competence=meta_competence)
        session.add(competence)
        session.flush()
        return competence

    def _add_indicator_set(self,
                           title=u'Indicator set',
                           description=u'Indicator set',
                           competence=None):
        from eportfolio.models.indicator_set import IndicatorSet
        from eportfolio.models import DBSession

        if not competence:
            competence = self._add_competence()

        session = DBSession()
        indicator_set = IndicatorSet(title=title,
                                     description=description,
                                     competence=competence)
        session.add(indicator_set)
        session.flush()
        return indicator_set

    def _add_indicator(self,
                       title=u'Indicator',
                       description=u'Indicator',
                       indicator_set=None):
        from eportfolio.models.indicator import Indicator
        from eportfolio.models import DBSession

        if not indicator_set:
            indicator_set = self._add_indicator_set()

        session = DBSession()
        indicator = Indicator(title=title,
                              description=description,
                              indicator_set=indicator_set)
        session.add(indicator)
        session.flush()
        return indicator