Example #1
0
def env(app, dir='', nomodel=False):
    import gluon.html as html
    import gluon.validators as validators
    from gluon.http import HTTP, redirect
    from gluon.languages import translator
    from gluon.cache import Cache
    from gluon.globals import Request, Response, Session
    from gluon.sql import SQLDB, SQLField
    from gluon.sqlhtml import SQLFORM, SQLTABLE

    request=Request()
    response=Response()
    session=Session()
    
    if not dir:
        request.folder = os.path.join('applications', app)
    else:
        request.folder = dir
        
    environment={}
    for key in html.__all__: environment[key]=eval('html.%s' % key)
    for key in validators.__all__: environment[key]=eval('validators.%s' % key)
    environment['T']=translator(request)
    environment['HTTP']=HTTP
    environment['redirect']=redirect
    environment['request']=request
    environment['response']=response
    environment['session']=session
    environment['cache']=Cache(request)
    environment['SQLDB']=SQLDB
    SQLDB._set_thread_folder(os.path.join(request.folder,'databases'))
    environment['SQLField']=SQLField
    environment['SQLFORM']=SQLFORM
    environment['SQLTABLE']=SQLTABLE
    
    if not nomodel:
        model_path = os.path.join(request.folder,'models', '*.py')
        from glob import glob
        for f in glob(model_path):
            fname, ext = os.path.splitext(f)
            execfile(f, environment)
#            print 'Imported "%s" model file' % fname
    
    return environment
    def setUp(self):

        # C0103: *Invalid name "%s" (should match %s)*
        # pylint: disable=C0103

        db_file_name = 'test.db'
        migrate_file_name = 'test_testy.table'
        uri = 'sqlite://%s' % db_file_name
        folder = '/tmp'
        m = re.compile(r'applications\.(?P<app>.*)\.modules'
                       ).match(__file__)
        if m:
            folder = 'applications/%s/databases' % m.group('app')
        self.db_ = SQLDB(uri=uri, folder=folder)
        try:
            self.db_.testy.drop()
        except KeyError:
            pass

        # Create table and some data

        self.db_.define_table('testy', Field('sequence', 'integer'),
                              migrate=migrate_file_name)

        self.db_(self.db_.testy.id > 0).delete()
        self.db_.commit()

        self.db_.testy.insert(sequence=None)
        self.db_.testy.insert(sequence=None)
        self.db_.testy.insert(sequence=None)
        self.db_.testy.insert(sequence=None)
        self.db_.commit()
        self.records = 4

        rows = self.db_().select(self.db_.testy.ALL)
        self.assertEqual(len(rows), self.records)
class TestDbSequenceField(unittest.TestCase):

    def setUp(self):

        # C0103: *Invalid name "%s" (should match %s)*
        # pylint: disable=C0103

        db_file_name = 'test.db'
        migrate_file_name = 'test_testy.table'
        uri = 'sqlite://%s' % db_file_name
        folder = '/tmp'
        m = re.compile(r'applications\.(?P<app>.*)\.modules'
                       ).match(__file__)
        if m:
            folder = 'applications/%s/databases' % m.group('app')
        self.db_ = SQLDB(uri=uri, folder=folder)
        try:
            self.db_.testy.drop()
        except KeyError:
            pass

        # Create table and some data

        self.db_.define_table('testy', Field('sequence', 'integer'),
                              migrate=migrate_file_name)

        self.db_(self.db_.testy.id > 0).delete()
        self.db_.commit()

        self.db_.testy.insert(sequence=None)
        self.db_.testy.insert(sequence=None)
        self.db_.testy.insert(sequence=None)
        self.db_.testy.insert(sequence=None)
        self.db_.commit()
        self.records = 4

        rows = self.db_().select(self.db_.testy.ALL)
        self.assertEqual(len(rows), self.records)

    def id_list(self):
        """
        This is a controller function used by other test functions.
        """

        rows = self.db_().select(self.db_.testy.ALL,
                                 orderby=self.db_.testy.sequence
                                 | self.db_.testy.id)
        ids = []
        for row in rows:
            ids.append(row['id'])

        return ids

    def reset_list(self, ids=None, sequences=None):
        """
        This is a controller function used by other test functions.
        """

        if not ids:
            ids = range(1, self.records + 1)
        if not sequences:
            sequences = range(1, self.records + 1)

        rows = self.db_().select(self.db_.testy.ALL)
        i = 0
        for row in rows:

            self.db_(self.db_.testy.id == row['id'
                     ]).update(sequence=sequences[i], id=ids[i])
            i += 1
        self.db_.commit()

        return

    def test____init__(self):
        # W0212: *Access to a protected member %s of a client class*
        # pylint: disable=W0212

        seq = DbSequenceField(field=self.db_.testy.sequence)
        self.assertEqual(seq.db_._dbname, 'sqlite')
        self.assertEqual(seq.table._tablename, 'testy')
        self.assertEqual(seq.field.name, 'sequence')

    def test_move(self):

        # Control - test that a reset returns expected

        self.reset_list()
        expect = [1, 2, 3, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        seq = DbSequenceField(field=self.db_.testy.sequence)

        # move with no position provided

        self.reset_list()
        seq.move(2)
        expect = [1, 3, 4, 2]  # 2 is moved to end
        got = self.id_list()
        self.assertEqual(got, expect)

        # move to new position upward

        self.reset_list()
        seq.move(4, 2)
        expect = [1, 4, 2, 3]
        got = self.id_list()
        self.assertEqual(got, expect)

        # move to new position downward

        self.reset_list()
        seq.move(1, 3)
        expect = [2, 3, 1, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        # move to same position

        self.reset_list()
        seq.move(2, 2)
        expect = [1, 2, 3, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        # move to 'start'

        self.reset_list()
        seq.move(3, 'start')
        expect = [3, 1, 2, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        # move to 'end'

        self.reset_list()
        seq.move(1, 'end')
        expect = [2, 3, 4, 1]
        got = self.id_list()
        self.assertEqual(got, expect)

        # move 'up'

        self.reset_list()
        seq.move(3, 'up')
        expect = [1, 3, 2, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        # move 'down'

        self.reset_list()
        seq.move(2, 'down')
        expect = [1, 3, 2, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        # Secessive moves
        # move 'up'

        self.reset_list()
        seq.move(2, 'up')
        expect = [2, 1, 3, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        seq.move(2, 'down')
        expect = [1, 2, 3, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        # Boundary tests
        # move first to 'start'

        self.reset_list()
        seq.move(1, 'start')
        expect = [1, 2, 3, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        # move last to 'end'

        self.reset_list()
        seq.move(4, 'end')
        expect = [1, 2, 3, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        # move first 'up'

        self.reset_list()
        seq.move(1, 'up')
        expect = [1, 2, 3, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        # move last 'down'

        self.reset_list()
        seq.move(4, 'down')
        expect = [1, 2, 3, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        # move to position outside of range

        self.reset_list()
        seq.move(2, 9999)
        expect = [1, 3, 4, 2]
        got = self.id_list()
        self.assertEqual(got, expect)

        # move to position outside of range

        self.reset_list()
        seq.move(3, -1)
        expect = [3, 1, 2, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

        # invalid position

        self.reset_list()
        seq.move(1, '__invalid__')
        expect = [1, 2, 3, 4]
        got = self.id_list()
        self.assertEqual(got, expect)

    def test_tidy(self):

        # if sequence = NULL, tidy sets sequences

        count = self.db_(self.db_.testy.sequence == None).count()
        self.assertEqual(count, self.records)
        seq = DbSequenceField(field=self.db_.testy.sequence)
        seq.tidy()
        count = self.db_(self.db_.testy.sequence == None).count()
        self.assertEqual(count, 0)

        # Sequence values start at 1 and are sequential

        rows = self.db_().select(self.db_.testy.ALL)
        seqs = []
        for row in rows:
            seqs.append(int(row.sequence))
        self.assertEqual(range(1, self.records + 1), seqs)

        # if multiple records have same sequence value, tidy sets them unique

        self.db_(self.db_.testy.id > 0).update(sequence=1)
        self.db_.commit()
        count = self.db_(self.db_.testy.sequence == 1).count()
        self.assertEqual(count, self.records)
        seq = DbSequenceField(field=self.db_.testy.sequence)
        seq.tidy()
        count = self.db_(self.db_.testy.sequence == 1).count()
        self.assertEqual(count, 1)

        # Doesn't kak on an empty table

        self.db_(self.db_.testy.id > 0).delete()
        self.db_.commit()
        seq = DbSequenceField(field=self.db_.testy.sequence)
        seq.tidy()