from system import System import time, types, string class Site(System): def init(self): System.init(self) try: self.addentry('', 'object', '') self.addentry('', 'object::id', '0') self.addentry('', 'object::name', '') self.addentry('', 'object::size', '480') self.addentry('', 'object::value', '') self.addentry('', 'object::value::id', '0') self.addentry('', 'object::value::name', '') self.addentry('', 'object::value::type', '') self.addentry('', 'object::value::size', '') self.addtable('document') self.addfield('document', 'parent', 'INTEGER', '-1', 'BTREE') self.addfield('document', 'type', 'TEXT', '', 'BTREE') self.addfield('document', 'name', 'TEXT', '', 'BTREE') self.addfield('document', 'title', 'TEXT', '', 'BTREE') self.addfield('document', 'template', 'TEXT', '', 'BTREE') self.addfield('document', 'link', 'TEXT', '', 'BTREE') self.addfield('document', 'menu', 'BOOLEAN', 'false', 'BTREE') self.addfield('document', 'parameter', 'TEXT', '', 'BTREE') self.addfield('document', 'sort', 'TEXT', '', 'BTREE') self.addtable('state') self.addfield('state', 'document', 'INTEGER', '-1', 'BTREE') self.addfield('state', 'language', 'TEXT', '', 'BTREE') self.addfield('state', 'owner', 'TEXT', '', 'BTREE') self.addfield('state', 'state', 'TEXT', '', 'BTREE') self.addfield('state', 'date', 'TEXT', '', 'BTREE') self.addfield('state', 'remark', 'TEXT', '', '') self.addtable('history') self.addfield('history', 'document', 'INTEGER', '-1', 'BTREE') self.addfield('history', 'language', 'TEXT', '', 'BTREE') self.addfield('history', 'owner', 'TEXT', '', 'BTREE') self.addfield('history', 'remark', 'TEXT', '', '') self.addtable('text') self.addfield('text', 'document', 'INTEGER', '-1', 'BTREE') self.addfield('text', 'language', 'TEXT', '', 'BTREE') self.addfield('text', 'owner', 'TEXT', '', 'BTREE') self.addfield('text', 'type', 'TEXT', '', 'BTREE') self.addfield('text', 'name', 'TEXT', '', 'BTREE') self.addfield('text', 'date', 'TIMESTAMP', '00010101', 'BTREE') self.addfield('text', 'text', 'TEXT', '', '') self.addfield('text', 'sort', 'TEXT', '', 'BTREE') self.addtable('content') self.addfield('content', 'document', 'INTEGER', '-1', 'BTREE') self.addfield('content', 'language', 'TEXT', '', 'BTREE') self.addfield('content', 'owner', 'TEXT', '', 'BTREE') self.addfield('content', 'parent', 'INTEGER', '-1', 'BTREE') self.addfield('content', 'type', 'TEXT', '', 'BTREE') self.addfield('content', 'name', 'TEXT', '', 'BTREE') self.addfield('content', 'date', 'TIMESTAMP', '00010101', 'BTREE') self.addfield('content', 'text', 'TEXT', '', '') self.addfield('content', 'sort', 'TEXT', '', 'BTREE') self.connection.commit() except Exception: self.connection.rollback() return def getdocument(self, id): return self.getdata('document', id) def setdocument(self, id, document): self.setdata('document', id, document) return def listdocuments(self, parent=0, expression=''): list = [] if expression: expression = " AND (%s)" % (expression) cursor = self.connection.cursor() cursor.execute('''SELECT * FROM %s_document WHERE parent=%d %s ''' % (self.name, parent, expression)) list = cursor.dictfetchall() cursor.close() return list def getdocumentid(self, id, list): cursor = self.connection.cursor() for name in list: cursor.execute('''SELECT id FROM %s_document WHERE parent=%d AND name='%s' OR id=0 ORDER BY id DESC LIMIT 1 ''' % (self.name, id, name)) id = cursor.fetchone()[0] cursor.close() return id def listdocumentids(self, parent=0, expression=''): list = [] if expression: expression = " AND (%s)" % (expression) cursor = self.connection.cursor() cursor.execute('''SELECT id FROM %s_document WHERE parent=%d %s ''' % (self.name, parent, expression)) list = map(self.head, cursor.fetchall()) cursor.close() return list def listparents(self, id): list = [id] cursor = self.connection.cursor() while id: cursor.execute('''SELECT parent FROM %s_document WHERE id=%d ''' % (self.name, id)) id = cursor.fetchone()[0] list.append(id) cursor.close() list.reverse() return list def listmenu(self, id): list = [] cursor = self.connection.cursor() cursor.execute('''SELECT id,sort FROM %s_document WHERE parent=%d AND menu ORDER BY sort ''' % (self.name, id)) list = map(self.head, cursor.fetchall()) cursor.close() return list def getstate(self, id): return self.getdata('state', id) def setstate(self, id, state): self.setdata('state', id, state) return def liststates(self, document, language, states=['']): list = [] cursor = self.connection.cursor() cursor.execute('''SELECT * FROM %s_state WHERE document=%d AND language='%s' AND state in (%s) ''' % (self.name, document, language, str(states)[1:-1])) list = cursor.dictfetchall() cursor.close() return list def getstateofdocument(self, document, language, owner): cursor = self.connection.cursor() cursor.execute('''SELECT id FROM %s_state WHERE document=%d AND language='%s' AND owner='%s' ''' % (self.name, document, language, owner)) data = cursor.fetchall() if data: id = data[0][0] else: id = 0 cursor.close() if not id: id = self.newdata('state') self.setdata('state', id, {'document':document, 'language':language, 'owner':owner}) self.commit() return self.getdata('state', id) def setstateofdocument(self, document, language, owner, state): id = self.getstateofdocument(document, language, owner)['id'] self.setstate(id, state) def gethistory(self, id): return self.getdata('history', id) def sethistory(self, id, history): self.setdata('history', id, history) return def listhistories(self, document, language): list = [] cursor = self.connection.cursor() cursor.execute('''SELECT * FROM %s_history WHERE document=%d AND language='%s' ''' % (self.name, document, language)) list = cursor.dictfetchall() cursor.close() return list def gethistoryofdocument(self, document, language): cursor = self.connection.cursor() cursor.execute('''SELECT id FROM %s_history WHERE document=%d AND language='%s' ORDER BY time DESC ''' % (self.name, document, language)) data = cursor.fetchall() if data: id = data[0][0] else: id = 0 cursor.close() if not id: id = self.newdata('history') self.setdata('history', id, {'document':document, 'language':language}) self.commit() return self.getdata('history', id) def sethistoryofdocument(self, document, language, history): id = self.gethistoryofdocument(document, language)['id'] self.sethistory(id, history) def recoverdocument(self, document, language, owner): if not owner: return for text in self.listtexts(document, language, owner): self.deldata('text', text['id']) for text in self.listtexts(document, language, ''): id = self.newdata('text') text['owner'] = owner self.setdata('text', id, text) for content in self.listcontents(document, language, owner): self.deldata('content', content['id']) parent = {} for content in self.listcontents(document, language, ''): id = self.newdata('content') content['owner'] = owner if content['parent'] != -1: content['parent'] = parent.get(content['parent'], -1) self.setdata('content', id, content) parent[content['id']] = id return def publishdocument(self, document, language, owner, remark=''): if not owner: return for text in self.listtexts(document, language, ''): self.deldata('text', text['id']) for text in self.listtexts(document, language, owner): id = self.newdata('text') text['owner'] = '' self.setdata('text', id, text) for content in self.listcontents(document, language, ''): self.deldata('content', content['id']) parent = {} for content in self.listcontents(document, language, owner): id = self.newdata('content') content['owner'] = '' if content['parent'] != -1: content['parent'] = parent.get(content['parent'], -1) self.setdata('content', id, content) parent[content['id']] = id self.setdata('history', self.newdata('history'), {'document':document, 'language':language, 'owner':owner, 'remark':remark}) return def gettext(self, id): return self.getdata('text', id) def settext(self, id, text): self.setdata('text', id, text) return def listtexts(self, document, language, owner, expression=''): list = [] if expression: expression = " AND (%s)" % (expression) cursor = self.connection.cursor() cursor.execute('''SELECT * FROM %s_text WHERE document=%d AND language='%s' AND owner='%s' %s ORDER BY id ''' % (self.name, document, language, owner, expression)) list = cursor.dictfetchall() cursor.close() return list def gettextidbyname(self, document, language, owner, name): cursor = self.connection.cursor() cursor.execute('''SELECT id FROM %s_text WHERE document=%d AND name='%s' AND language='%s' AND owner='%s' ''' % (self.name, document, name, language, owner)) data = cursor.fetchall() if data: id = data[0][0] else: id = 0 cursor.close() if not id: id = self.newdata('text') self.setdata('text', id, {'document':document, 'language':language, 'owner':owner, 'name':name}) self.commit() return id def listtextidsbytype(self, document, language, owner, type, expression=''): if expression: expression = " AND (%s)" % (expression) cursor = self.connection.cursor() if document == None: cursor.execute('''SELECT id FROM %s_text WHERE type~'%s' %s AND language='%s' AND owner='%s' ORDER by sort ''' % (self.name, type, expression, language, owner)) else: cursor.execute('''SELECT id FROM %s_text WHERE document=%d AND type~'%s' %s AND language='%s' AND owner='%s' ORDER by sort ''' % (self.name, document, type, expression, language, owner)) list = map(self.head, cursor.fetchall()) cursor.close() return list def getcontent(self, id): return self.getdata('content', id) def setcontent(self, id, content): self.setdata('content', id, content) return def listcontents(self, document, language, owner, parent=None, expression=''): list = [] if expression: expression = " AND (%s)" % (expression) cursor = self.connection.cursor() if document == None: cursor.execute('''SELECT * FROM %s_content WHERE language='%s' AND owner='%s' %s ORDER BY id ''' % (self.name, language, owner, expression)) elif parent == None: cursor.execute('''SELECT * FROM %s_content WHERE document=%d AND language='%s' AND owner='%s' %s ORDER BY id ''' % (self.name, document, language, owner, expression)) else: cursor.execute('''SELECT * FROM %s_content WHERE document=%d AND parent=%d AND language='%s' AND owner='%s' %s ORDER BY id ''' % (self.name, document, parent, language, owner, expression)) list = cursor.dictfetchall() cursor.close() return list def getcontentidbyname(self, document, language, owner, type, name): cursor = self.connection.cursor() cursor.execute('''SELECT id FROM %s_content WHERE document=%d AND type='%s' AND name='%s' AND language='%s' AND owner='%s' ''' % (self.name, document, type, name, language, owner)) data = cursor.fetchall() if data: id = data[0][0] else: id = 0 cursor.close() if not id: id = self.newdata('content') self.setdata('content', id, {'document':document, 'language':language, 'owner':owner, 'type':type, 'name':name}) self.commit() return id def listcontentidsbytype(self, document, language, owner, type, expression=''): if expression: expression = " AND (%s)" % (expression) cursor = self.connection.cursor() if document == None: cursor.execute('''SELECT id FROM %s_content WHERE type~'%s' %s AND language='%s' AND owner='%s' ORDER by sort ''' % (self.name, type, expression, language, owner)) else: cursor.execute('''SELECT id FROM %s_content WHERE document=%d AND type~'%s' %s AND language='%s' AND owner='%s' ORDER by sort ''' % (self.name, document, type, expression, language, owner)) list = map(self.head, cursor.fetchall()) cursor.close() return list def getparameter(self, parameter): dict = {} for param in parameter.split('; '): param = param.strip() temp = param.split('=') if len(temp) == 1: dict[temp[0]] = 1 else: value = string.join(temp[1:], '=') list = value.split(', ') if len(list) == 1: dict[temp[0]] = value else: dict[temp[0]] = list return dict def addobject(self, name, size='480'): self.addentry(name, 'object', name) id = max([0] + map(int, self.listvalues('.*', 'object::id'))) + 1 self.addentry(name, 'object::id', id) self.addentry(name, 'object::name', name) self.addentry(name, 'object::size', size) return def delobject(self, name): self.delentry(name, 'object') self.delentries('^%s$' % name, '^object::') return def getobject(self, name): return { '' : self.getvalue(name, 'object'), 'id' : self.getvalue(name, 'object::id'), 'name' : self.getvalue(name, 'object::name'), 'size' : self.getvalue(name, 'object::size'), } def setobject(self, name, dict): for id in dict.keys(): if id: self.setvalue(name, 'object::%s' % id, dict[id]) else: self.setvalue(name, 'object', dict[id]) return def listobjects(self): list = [] for name in self.listnames('^object$', '^.+'): list.append(self.getobject(name)) return list def addobjectvalue(self, object, name, type='text', size='1', default=''): objectvalue = '%s.%s' % (object, name) self.addentry(objectvalue, 'object::value', name) id = max([0] + map(int, self.listvalues('^%s\\\..*' % (object), 'object::value::id'))) + 1 self.addentry(objectvalue, 'object::value::id', id) self.addentry(objectvalue, 'object::value::name', name) self.addentry(objectvalue, 'object::value::type', type) self.addentry(objectvalue, 'object::value::size', size) self.addentry(objectvalue, 'object::value::default', default) return def delobjectvalue(self, object, name): objectvalue = '%s.%s' % (object, name) self.delentry(objectvalue, 'object::value') self.delentries('^%s$' % objectvalue, '^object::value::') return def getobjectvalue(self, object, name): objectvalue = '%s.%s' % (object, name) return { '' : self.getvalue(objectvalue, 'object::value'), 'id' : self.getvalue(objectvalue, 'object::value::id'), 'name' : self.getvalue(objectvalue, 'object::value::name'), 'type' : self.getvalue(objectvalue, 'object::value::type'), 'size' : self.getvalue(objectvalue, 'object::value::size'), 'default' : self.getvalue(objectvalue, 'object::value::default'), } def setobjectvalue(self, object, name, dict): objectvalue = '%s.%s' % (object, name) for id in dict.keys(): if id: self.setvalue(objectvalue, 'object::value::%s' % id, dict[id]) else: self.setvalue(objectvalue, 'object::value', dict[id]) return def listobjectvalues(self, object): list = [] for objectvalue in self.listnames('^object::value$', '^%s\\\.' % (object)): list.append(self.getobjectvalue(object, objectvalue.split('.')[1])) return self.sort(list, 'id') def addmarkup(self, name, code1='', code2=''): self.addentry(name, 'markup', name) id = max([0] + map(int, self.listvalues('.*', 'markup::id'))) + 1 self.addentry(name, 'markup::id', id) self.addentry(name, 'markup::name', name) self.addentry(name, 'markup::code1', code1) self.addentry(name, 'markup::code2', code2) return def delmarkup(self, name): self.delentry(name, 'markup') self.delentries('^%s$' % name, '^markup::') return def getmarkup(self, name): return { '' : self.getvalue(name, 'markup'), 'id' : self.getvalue(name, 'markup::id'), 'name' : self.getvalue(name, 'markup::name'), 'code1' : self.getvalue(name, 'markup::code1'), 'code2' : self.getvalue(name, 'markup::code2'), } def setmarkup(self, name, dict): for id in dict.keys(): if id: self.setvalue(name, 'markup::%s' % id, dict[id]) else: self.setvalue(name, 'markup', dict[id]) return def listmarkups(self): list = [] for name in self.listnames('^markup$', '^.+'): list.append(self.getmarkup(name)) return list def lastupdate(self): cursor = self.connection.cursor() cursor.execute('''SELECT time FROM %s_text ORDER by time DESC LIMIT 1 ''' % (self.name)) data = cursor.fetchall() if data: date = data[0][0] cursor.execute('''SELECT time FROM %s_content ORDER by time DESC LIMIT 1 ''' % (self.name)) data = cursor.fetchall() if data: if date < data[0][0]: date = data[0][0] cursor.close() if type(date) in [types.StringType]: return '%s.%s.%s' % (date[8:10], date[5:7], date[0:4]) return time.strftime('%d.%m.%Y', time.localtime(date))