Update of /cvsroot/sqlobject/SQLObject/examples
In directory sc8-pr-cvs1:/tmp/cvs-serv1222
Added Files:
codebits.py config.py examplestripper.py personaddress.py
setup.py simpleperson.py styles.py userrole.py
Log Message:
Added examples, example stripper
--- NEW FILE: codebits.py ---
# This isn't a full example...
## Snippet "person_magicmethod"
class Person(SQLObject):
# ...
def imageFilename(self):
return 'images/person-%s.jpg' % self.id
def _get_image(self):
if not os.path.exists(self.imageFilename()):
return None
f = open(self.imageFilename())
v = f.read()
f.close()
return v
def _set_image(self, value):
# assume we get a string for the image
f = open(self.imageFilename(), 'w')
f.write(value)
f.close()
def _del_image(self, value):
# I usually wouldn't include a method like this, but for
# instructional purposes...
os.unlink(self.imageFilename())
_doc_image = 'The headshot for the person'
## end snippet
## Snippet "person_magicoverride"
class Person(SQLObject):
lastName = StringCol()
firstName = StringCol()
def _set_lastName(self, value):
self.notifyLastNameChange(value)
self._SO_set_lastName(value)
## end snippet
## Snippet "phonenumber_magicoverride"
import re
class PhoneNumber(SQLObject):
phoneNumber = StringCol(length=30)
_garbageCharactersRE = re.compile(r'[\-\.\(\) ]')
_phoneNumberRE = re.compile(r'^[0-9]+$')
def _set_phoneNumber(self, value):
value = self._garbageCharactersRE.sub('', value)
if not len(value) >= 10:
raise ValueError, 'Phone numbers must be at least 10 digits long'
if not self._phoneNumberRE.match(value):
raise ValueError, 'Phone numbers can contain only digits'
self._SO_set_phoneNumber(value)
def _get_phoneNumber(self):
value = self._SO_get_phoneNumber()
number = '(%s) %s-%s' % (value[0:3], value[3:6], value[6:10])
if len(value) > 10:
number += ' ext.%s' % value[10:]
return number
## end snippet
## Snippet "transactions1"
conn = DBConnection.PostgresConnection('yada')
trans = conn.transaction()
p = Person(1, trans)
p.firstName = 'Bob'
trans.commit()
p.firstName = 'Billy'
trans.rollback()
## end snippet
## Snippet "transactions2"
class Person(SQLObject):
_cacheValue = False
# ...
## end snippet
--- NEW FILE: config.py ---
from SQLObject import *
"""
This contains basic configuration for all the examples. Since they
all require a connection, you can configure that just in this file.
"""
## Use one of these to define your connection:
"""
conn = MySQLConnection(user='test', db='testdb')
conn = PostgresConnection('user=test dbname=testdb')
conn = SQLiteConnect('database.db')
conn = DBMConnection('database/')
"""
conn = DBMConnection('database/')
conn = MySQLConnection(user='test', db='test')
--- NEW FILE: examplestripper.py ---
#!/usr/bin/env python
"""
This script strips bits of examples from a larger script, formats
them as HTML, and writes them out.
You mark snippets of code like:
## Snippet "snippetname"
code...
## End Snippet
Then a file snippets/snippetname.html is created.
"""
import re, os, sys
import warnings
_snippetRE = re.compile(r'^##\s+Snippet\s+"(.*?)"', re.I)
_endSnippetRE = re.compile(r'^##\s+End\s+Snippet', re.I)
def stripSnippets(lines):
results = {}
name = None
for line in lines:
match = _snippetRE.search(line)
if match:
if name is not None:
warnings.warn('You started snippet %s when snippet %s was not ended'
% (match.group(1), name))
name = match.group(1)
continue
match = _endSnippetRE.search(line)
if match:
name = None
if name is None:
continue
results.setdefault(name, []).append(line)
return results
_bodyRE = re.compile(r'<body[^>]*>', re.I)
_endBodyRE = re.compile(r'</body>', re.I)
_preRE = re.compile(r'<pre>\n<tt>\n', re.I)
_endPreRE = re.compile(r'\n</pre>', re.I)
def snipFile(filename):
f = open(filename)
d = stripSnippets(f)
f.close()
dirname = os.path.join(os.path.dirname(filename), 'snippets')
if not os.path.exists(dirname):
os.mkdir(dirname)
for key, value in d.items():
fn = os.path.join(dirname, '%s' % key)
f = open(fn + ".py", 'w')
f.write(''.join(value))
f.close()
os.system('source-highlight -spython -fxhtml -cdefault.css %s > /dev/null 2>&1'
% (fn + ".py"))
f = open(fn + ".py.html")
c = f.read()
f.close()
os.unlink(fn + ".py.html")
c = c[_bodyRE.search(c).end():]
c = c[:_endBodyRE.search(c).start()]
c = _preRE.sub('<pre class="literal-block"><tt>', c)
c = _endPreRE.sub('</pre>', c)
f = open(fn + ".html", 'w')
f.write(c)
f.close()
def snipAll(dir):
if dir == sys.argv[0]:
return
if dir.endswith('snippets'):
return
if os.path.isdir(dir):
for fn in os.listdir(dir):
fn = os.path.join(dir, fn)
snipAll(fn)
elif dir.endswith('.py'):
snipFile(dir)
if __name__ == '__main__':
args = sys.argv[1:]
if not args:
args = ['.']
for arg in args:
snipAll(arg)
--- NEW FILE: personaddress.py ---
from SQLObject import *
from config import conn
__connection__ = conn
## Snippet "address-person"
class Person(SQLObject):
firstName = StringCol()
middleInitial = StringCol(length=1, default=None)
lastName = StringCol()
addresses = MultipleJoin('Address')
## end snippet
## Snippet "address-address"
class Address(SQLObject):
street = StringCol()
city = StringCol()
state = StringCol(length=2)
zip = StringCol(length=9)
person = ForeignKey('Person')
## end snippet
def reset():
Person.dropTable(ifExists=True)
Person.createTable()
Address.dropTable(ifExists=True)
Address.createTable()
reset()
## Snippet "address-use1"
p = Person.new(firstName='John', lastName='Doe')
print p.addresses
#>> []
a1 = Address.new(street='123', city='Smallsville',
state='IL', zip='50484', person=p)
print [a.street for a in p.addresses]
#>> ['123']
## end snippet
# We'll add some more data to make the results more interesting:
add1 = Person.new(firstName='Jane', lastName='Doe')
add2 = Person.new(firstName='Tom', lastName='Brown')
Address.new(street='5839', city='Eckersville',
state='IL', zip='50482', person=add1)
Address.new(street='4', city='Whinging',
state='AZ', zip='49378', person=add2)
## Snippet "person-select1"
peeps = Person.select(Person.q.firstName=="John")
print list(peeps)
#>> [<Person 1 lastName='Doe' middleInitial=None firstName='John'>]
# SELECT person.id FROM person WHERE person.first_name = 'John';
## end snippet
## Snippet "person-select2"
peeps = Person.select(
AND(Address.q.personID == Person.q.id,
Address.q.zip.startswith('504')))
print list(peeps)
# SELECT person.id FROM person, phone_number
# WHERE (phone_number.id = person.id AND
# phone_number.phone_number LIKE '612%');
## end snippet
## Snippet "person-select3"
peeps = Person.select("""address.id = person.id AND
address.zip LIKE '504%'""",
clauseTables=['address'])
## end snippet
list(peeps)
--- NEW FILE: setup.py ---
import sys
from config import conn
import SQLObject
main = sys.modules['__main__']
if '-v' in sys.argv:
conn.debug = 1
def reset():
classes = []
for name in dir(main):
value = getattr(main, name)
if isinstance(value, type) \
and issubclass(value, SQLObject.SQLObject)\
and value is not SQLObject.SQLObject:
value.dropTable(ifExists=True)
value.createTable()
--- NEW FILE: simpleperson.py ---
from SQLObject import *
## Use one of these to define your connection:
"""
## Snippet "connections"
conn = MySQLConnection(user='test', db='testdb')
conn = PostgresConnection('user=test dbname=testdb')
conn = SQLiteConnect('database.db')
conn = DBMConnection('database/')
## End snippet
"""
conn = DBMConnection('database/')
conn = MySQLConnection(user='test', db='test')
## Snippet "simpleaddress-person1"
class Person(SQLObject):
_connection = conn
firstName = StringCol()
middleInitial = StringCol(length=1, default=None)
lastName = StringCol()
## end snippet
## We create a table like this: (for MySQL)
"""
## Snippet "simpleaddress-schema-person1"
CREATE TABLE person (
id INT PRIMARY KEY AUTO_INCREMENT,
first_name TEXT,
middle_initial CHAR(1),
last_name TEXT
);
## end snippet
"""
def reset():
Person.dropTable(ifExists=True)
Person.createTable()
## Get rid of any tables we have left over...
Person.dropTable(ifExists=True)
## Now we create new tables...
## Snippet "simpleaddress-person1-create"
Person.createTable()
## End snippet
## Snippet "simpleaddress-person1-use"
p = Person.new(firstName="John", lastName="Doe")
print p
#>> <Person 1 firstName='John' middleInitial=None lastName='Doe'>
print p.firstName
#>> 'John'
p.middleInitial = 'Q'
print p.middleInitial
#>> 'Q'
p2 = Person(1)
print p2
#>> <Person 1 firstName='John' middleInitial='Q' lastName='Doe'>
print p is p2
#>> True
## End snippet
reset()
print '-'*60
conn.debug = 1
## Snippet "simpleaddress-person1-use-debug"
p = Person.new(firstName="John", lastName="Doe")
#>> QueryIns:
# INSERT INTO person (last_name, middle_initial, first_name)
# VALUES ('Doe', NULL, 'John')
#
#-- Not quite optimized, we don't remember the values we used to
#-- create the object, so they get re-fetched from the database:
#>> QueryOne:
# SELECT last_name, middle_initial, first_name
# FROM person
# WHERE id = 1
print p
#>> <Person 1 firstName='John' middleInitial=None lastName='Doe'>
print p.firstName
#-- Now we've saved cached the column values, so we don't fetch
#-- it again.
#>> 'John'
p.middleInitial = 'Q'
#>> Query :
# UPDATE person
# SET middle_initial = 'Q'
# WHERE id = 1
print p.middleInitial
#>> 'Q'
p2 = Person(1)
#-- Again, no database access, since we're just grabbing the same
#-- instance we already had.
print p2
#>> <Person 1 firstName='John' middleInitial='Q' lastName='Doe'>
print p is p2
#>> True
## End snippet
## Snippet "simpleaddress-person1-use-set"
p.set(firstName='Bob', lastName='Dole')
## end snippet
--- NEW FILE: styles.py ---
from SQLObject import *
from config import conn
__connection__ = conn
## Snippet "style1"
class Person(SQLObject):
_style = MixedCaseStyle(longID=True)
firstName = StringCol()
lastName = StringCol()
## end snippet
"""
## Snippet "default-style"
__connection__.style = MixedCaseStyle(longID=True)
## end snippet
"""
## Snippet "style-table"
class User(SQLObject):
_table = "user_table"
_idName = "userid"
username = StringCol(length=20, dbName='name')
## end snippet
--- NEW FILE: userrole.py ---
from SQLObject import *
import setup
__connection__ = setup.conn
True, False = 1==1, 0==1
## Snippet "userrole-classes"
class User(SQLObject):
# user is a reserved word in some databases, so we won't
# use that for the table name:
_table = "user_table"
username = StringCol(alternateID=True, length=20)
# We'd probably define more attributes, but we'll leave
# that excersize to the reader...
roles = RelatedJoin('Role')
class Role(SQLObject):
name = StringCol(alternateID=True, length=20)
users = RelatedJoin('User')
## end snippet
#def reset():
# User.dropTable(ifExists=True)
# User.createTable()
# Role.dropTable(ifExists=True)
# Role.createTable()
setup.reset()
## Snippet "userrole-use"
bob = User.new(username='bob')
tim = User.new(username='tim')
jay = User.new(username='jay')
admin = Role.new(name='admin')
editor = Role.new(name='editor')
bob.addRole(admin)
bob.addRole(editor)
tim.addRole(editor)
print bob.roles
#>> [<Role 1 name='admin'>, <Role 2 name='editor'>]
print tim.roles
#>> [<Role 2 name='editor'>]
print jay.roles
#>> []
print admin.users
#>> [<User 1 username='bob'>]
print editor.users
#>> [<User 1 username='bob'>, <User 2 username='tim'>]
## end snippet
## Snippet "userrole-use-alternate"
print User.byUsername('bob')
#>> <User 1 username='bob'>
print Role.byName('admin')
#>> <Role 1 name='admin'>
## End snippet
|