""" Data model objects """ # $Header: /cvsroot/dbagg2/lib/dbagg2/model.py,v 1.10 2004/04/20 13:24:55 deusx Exp $ import sys, md5 from mx.DateTime import * from SQLObject import * from SQLObject.Col import SOStringCol from SQLObject.include import * from dbagg2.config import * __connection__ = so_conn global log log = logging.getLogger("%s"%__name__) class UnicodeStringValidator(Validator.Validator): # TODO: This seems stupid & evil. Learn about Unicode & fix. def toPython(self, value, state): if value is None: return u'' if type(value) is unicode: return value # TODO: Figure out how to handle Unicode encoding detection try: return unicode(value, 'utf-8') except: try: return unicode(value, 'iso-8859-1') except: return unicode(value, 'latin-1') class SOUnicodeStringCol(SOStringCol): def __init__(self, **kw): SOStringCol.__init__(self, **kw) self.validator = Validator.All.join(UnicodeStringValidator(), self.validator) class UnicodeStringCol(Col): baseClass = SOUnicodeStringCol class Person(SQLObject): username = StringCol(length=100, alternateID=True) class AssignedSourceCategory(SQLObject): source = ForeignKey('Source') sourceCategory = ForeignKey('SourceCategory') class SourceCategory(SQLObject): tag = UnicodeStringCol(default='') description = UnicodeStringCol(default='') sortOrder = IntCol(default=0) sources = RelatedJoin('Source', joinColumn='source_category_id', otherColumn='source_id', intermediateTable='assigned_source_category') class Source(SQLObject): url = StringCol(length=255, alternateID=True) type = StringCol(length=32) version = StringCol(length=32) link = StringCol(length=255) title = UnicodeStringCol(length=255,default='untitled') language = StringCol(length=16,default='en-us') description = UnicodeStringCol(default='no description') active = IntCol(default=0) private = BoolCol(default=False) created = DateTimeCol(default=SQLBuilder.func.now()) nextScan = DateTimeCol(default=DateTime(1975)) updatePeriod = FloatCol(default=1.0) modified = DateTimeCol(default=DateTime(1975)) lastScan = DateTimeCol(default=DateTime(1975)) lastUpdate = DateTimeCol(default=DateTime(1975)) etag = StringCol(default='', length=255) categories = RelatedJoin('SourceCategory', joinColumn='source_id', otherColumn='source_category_id', intermediateTable='assigned_source_category') items = MultipleJoin('Item') history = MultipleJoin('ScanHistory') def destroySelf(self): # Chase down all references for item in self.items: item.destroySelf() for history in self.history: history.destroySelf() for cat in self.categories: self.removeSourceCategory(cat) SQLObject.destroySelf(self) class ScanHistory(SQLObject): source = ForeignKey('Source') scanTime = DateTimeCol(default=DateTime(1975)) newItems = IntCol(default=0) totalItems = IntCol(default=0) httpStatus = IntCol(default=200) notes = UnicodeStringCol(default='') class Item(SQLObject): source = ForeignKey('Source') created = DateTimeCol(default=SQLBuilder.func.now()) uniq = StringCol(length=255, alternateID=True) seen = BoolCol(default=False) visited = BoolCol(default=False) shown = BoolCol(default=False) queued = DateTimeCol() date = DateTimeCol(default=SQLBuilder.func.now()) title = UnicodeStringCol(length=255) link = StringCol(length=255) description = UnicodeStringCol() rating = FloatCol(default=0.0) def makeItemUniq(data): m = md5.md5() try: if data.has_key('link'): m.update(data['link'].encode('utf-8')) if data.has_key('title'): m.update(data['title'].encode('utf-8')) if data.has_key('description'): m.update(data['description'].encode('utf-8')) except UnicodeDecodeError: try: if data.has_key('link'): m.update(data['link'].encode('iso-8859-1')) if data.has_key('title'): m.update(data['title'].encode('iso-8859-1')) if data.has_key('description'): m.update(data['description'].encode('iso-8859-1')) except: pass return m.hexdigest() def createTables(): for obj in [Source, ScanHistory, SourceCategory, Item]: obj.dropTable(ifExists=True) obj.createTable() if __name__ == '__main__': if sys.argv[1] == 'createTables': createTables()