from zsystem import ZSystem from site import Site import Globals, OFS import string, re, time, types class ZSite(ZSystem): id = 'site' name = 'ZSite' icon = 'misc_/ZSite/Icon' meta_type = 'ZSite' color = '#003366' utf8 = 0 editor = 1 _properties = ZSystem._properties + ( {'id' : 'editor', 'type' : 'boolean', 'mode' : 'w'}, ) manage_options = ( ZSystem.manage_options[0], ZSystem.manage_options[1], { 'label' : 'Data', 'icon' : '', 'action' : 'manage_data', 'target' : '_self', }, { 'label' : 'Site', 'icon' : '', 'action' : 'manage_site', 'target' : '_self', }, ZSystem.manage_options[2], ZSystem.manage_options[3], ZSystem.manage_options[4], ZSystem.manage_options[5], ZSystem.manage_options[6], ZSystem.manage_options[7], ZSystem.manage_options[8], ) manage_data = Globals.DTMLFile('manage/data', globals()) manage_site = Globals.DTMLFile('manage/site', globals()) manage_data_dtml = Globals.DTMLFile('manage/code/data', globals()) manage_config_dtml = Globals.DTMLFile('manage/code/config', globals()) manage_markup_dtml = Globals.DTMLFile('manage/code/markup', globals()) manage_object_dtml = Globals.DTMLFile('manage/code/object', globals()) manage_site_dtml = Globals.DTMLFile('manage/code/site', globals()) manage_document_dtml = Globals.DTMLFile('manage/code/document', globals()) manage_text_dtml = Globals.DTMLFile('manage/code/text', globals()) manage_content_dtml = Globals.DTMLFile('manage/code/content', globals()) edit_text = Globals.DTMLFile('edit/text', globals()) edit_content = Globals.DTMLFile('edit/content', globals()) edit_image = Globals.DTMLFile('edit/image', globals()) edit_file = Globals.DTMLFile('edit/file', globals()) edit_access = Globals.DTMLFile('edit/access', globals()) edit_login = Globals.DTMLFile('edit/login', globals()) edit_state = Globals.DTMLFile('edit/state', globals()) edit_history = Globals.DTMLFile('edit/history', globals()) edit_admin = Globals.DTMLFile('edit/admin', globals()) file_icon = Globals.ImageFile('images/file.gif', globals()) def __init__(self, name, database, location): self._v_system = Site(name, database, location) return def init(self): self._v_system = Site(self.name, self.database, self.location) return def open(self): if not hasattr(self, '_v_system'): self.init() return self._v_system.open() def close(self): return self._v_system.close() def environment(self, request=None): if request == None: return ZSystem.environment(self, request) request.set('site_', request.system_) request.set('id_', self.getdocumentid(request.path_)) if request.path_ and request.id_ == 0: request.set('id_', self.getdocumentid(request.path_[:-1])) request.set('document_', self.getdocument(request.id_)) request.set('parents_', self.listparents(request.id_)) request.set('menu_', self.listmenu(0)) request.set('scope_', '') if request.owner_: request.set('state_', self.getstateofdocument(request.id_, request.language_, request.owner_)) request.set('history_', self.gethistoryofdocument(request.id_, request.language_)) request.set('identifier_', '%s_%s' % (request.base_, request.owner_)) objects = {} for object in self.listobjects(): objects[object.name] = self.listobjectvalues(object.name) request.set('objects_', objects) markups = {} for markup in self._v_system.listmarkups(): if markup['code1']: markups['' % (markup[''])] = markup['code1'] if markup['code2']: markups['' % (markup[''])] = markup['code2'] request.set('markups_', markups) if not request.edit_ and request.document_.link: request.RESPONSE.redirect(request.document_.link) return def getvalue(self, name, type=''): if type: return self._v_system.getvalue(name, 'site::%s' % (type)) else: return self._v_system.getvalue(name, 'site') class Object(OFS.SimpleItem.SimpleItem): (object, id, name, size) = ('', 0, '', '') def __init__(self, object): self.object = object[''] if object['id']: self.id = int(object['id']) self.name = object['name'] self.size = object['size'] return def listobjects(self): list = [] for object in self._v_system.listobjects(): list.append(self.Object(object)) return list class ObjectValue(OFS.SimpleItem.SimpleItem): (object, value) = ('', '') (id, name, type, size, default) = (0, '', 'text', '1', '') def __init__(self, object, value): self.object = object self.value = value[''] if value['id']: self.id = int(value['id']) self.name = value['name'] self.type = value['type'] self.size = value['size'] self.default = value['default'] return def listobjectvalues(self, object): list = [] for value in self._v_system.listobjectvalues(object): list.append(self.ObjectValue(object, value)) return list class Markup(OFS.SimpleItem.SimpleItem): (markup, id, name, code1, code2) = ('', 0, '', '', '') def __init__(self, markup): self.markup = markup[''] if markup['id']: self.id = int(markup['id']) self.name = markup['name'] self.code1 = markup['code1'] self.code2 = markup['code2'] return def listmarkups(self): list = [] for markup in self._v_system.listmarkups(): list.append(self.Markup(markup)) return list def lastupdate(self): return self._v_system.lastupdate() class Document(OFS.SimpleItem.SimpleItem): (id_, id, time) = (0, 0, '00010101') (parent, type, name, title) = (0, '', '', '') (template, link) = ('', '') (parameter, menu, sort) = ('', 0, '') def __init__(self, document): if document: self.id_ = document['id'] self.id = document['id'] self.time = document['time'] self.parent = document['parent'] self.type = document['type'] self.name = document['name'] self.title = document['title'] self.template = document['template'] self.link = document['link'] self.parameter = document['parameter'] self.menu = document['menu'] self.sort = document['sort'] self.keys_ = ['id','time','parent','type','name','title','template','link','parameter','menu','sort'] return def get(self, attr, start=0, end=0, default=''): value = getattr(self, attr, default) if not value: value = default if start and end: value = value[start:end] elif start: value = value[start:] elif end: value = value[:end] return value def keys(self): return self.keys_ def __dict__(self): data = {} for key in self.keys_: data[key] = getattr(self, key) return data def __getitem__(self, key): return getattr(self, key) def __setitem__(self, key, value): if not key in self.keys_: self.keys_.append(key) self.keys_.sort() setattr(self, key, value) return self def __str__(self): text = [] for key in self.keys_: text.append('%s: %s' % (key, getattr(self, key))) return(string.join(text, '\n')) def __len__(self): return len(self.keys_) def getdocument(self, id): return self.Document(self._v_system.getdocument(id)) def setdocument(self, id, document): return self._v_system.setdocument(id, document) def listdocuments(self, parent=0, expression=''): list = [] for document in self._v_system.listdocuments(parent, expression): list.append(self.Document(document)) return list def getdocumentid(self, list): return self._v_system.getdocumentid(0, list) def listdocumentids(self, parent=0, expression=''): return self._v_system.listdocumentids(parent, expression) def geturl(self, id): if id == 0: return '' document = self.getdocument(id) if document.parent == 0: return document.name return '%s/%s' % (self.geturl(document.parent), document.name) def getfolderobject(self, root, id): folder = root for id in self._v_system.listparents(id): name = self._v_system.getdata('document', id)['name'] folder = folder[name] return folder def listparents(self, id): return self._v_system.listparents(id) def listmenu(self, id): return map(self.getdocument, self._v_system.listmenu(id)) class State(OFS.SimpleItem.SimpleItem): (id_, id, time) = (0, 0, '00010101') (document, language, owner) = (0, '', '') (state, date, remark, sort) = ('', '00010101', '', '') def __init__(self, state): if state: self.id_ = state['id'] self.id = state['id'] self.time = state['time'] self.document = state['document'] self.language = state['language'] self.owner = state['owner'] self.state = state['state'] self.date = state['date'] self.remark = state['remark'] self.sort = state['document'] return def getstate(self, id): return self.State(self._v_system.getstate(id)) def setstate(self, id, state): return self._v_system.setstate(id, state) def liststates(self, document, language, states=['']): list = [] for state in self._v_system.liststates(document, language, states): list.append(self.State(state)) return list def getstateofdocument(self, document, language, owner): return self.State(self._v_system.getstateofdocument(document, language, owner)) def setstateofdocument(self, document, language, owner, state): return self._v_system.setstateofdocument(document, language, owner, state) class History(OFS.SimpleItem.SimpleItem): (id_, id, time) = (0, 0, '00010101') (document, language, owner) = (0, '', '') (remark, sort) = ('', '') def __init__(self, history): if history: self.id_ = history['id'] self.id = history['id'] self.time = history['time'] self.document = history['document'] self.language = history['language'] self.owner = history['owner'] self.remark = history['remark'] self.sort = history['document'] return def gethistory(self, id): return self.History(self._v_system.gethistory(id)) def sethistory(self, id, history): return self._v_system.sethistory(id, history) def listhistories(self, document, language): list = [] for history in self._v_system.listhistories(document, language): list.append(self.History(history)) return list def gethistoryofdocument(self, document, language): return self.History(self._v_system.gethistoryofdocument(document, language)) def sethistoryofdocument(self, document, language, history): return self._v_system.sethistoryofdocument(document, language, history) def recoverdocument(self, document, language, owner): return self._v_system.recoverdocument(document, language, owner) def publishdocument(self, document, language, owner, remark=''): return self._v_system.publishdocument(document, language, owner, remark) class Text(OFS.SimpleItem.SimpleItem): (id_, id, time) = (0, 0, '00010101') (document, language, owner) = (0, '', '') (type, name, date, text, sort) = ('', '', '00010101', '', '') def __init__(self, text): if text: self.id_ = text['id'] self.id = text['id'] self.time = text['time'] self.document = text['document'] self.language = text['language'] self.owner = text['owner'] self.type = text['type'] self.name = text['name'] self.date = text['date'] self.text = text['text'] self.sort = text['sort'] return def sort_plus_id(self): return '%s %09d' % (self.sort, self.id) def edit(self, edit=1, base='', init={}): if edit: parameter = ['id_:int=%d' % (self.id)] for key in init.keys(): parameter.append('init_.%s:record%s=%s' % (key, ['',':int'][type(init[key])==types.IntType], init[key])) return '[edit] ' % (base, string.join(parameter, '&'), self.id, ['edit','new'][init != {}]) return '' def show(self, edit=0, html=0, base=''): text = string.strip(self.text) if html: text = string.replace(text, '\r\n\r\n', '

') text = string.replace(text, '\r\n', '
') text = string.replace(text, '
<', '<') text = '

%s

' % (text) if edit: return '%s%s' % (self.edit(edit, base), text) return text def gettext(self, id, init={}): text = self._v_system.gettext(id) if not text: text = { 'id' : id, 'time' : 'now', 'document' : -1, 'language' : '', 'owner' : '', 'type' : '', 'name' : '', 'date' : '00010101', 'text' : '', 'sort' : '' } for key in init.keys(): text[key] = init[key] return self.Text(text) def settext(self, id, text): return self._v_system.settext(id, text) def listtexts(self, document, language, owner, type='', expression=''): list = [] for text in self._v_system.listtexts(document, language, owner, expression): if type: if type == text['type']: list.append(self.Text(text)) else: list.append(self.Text(text)) return list def gettextbyname(self, document, language, owner, name): return self.gettext(self._v_system.gettextidbyname(document, language, owner, name)) def listtextbytype(self, document, language, owner, type, expression=''): list = [] for id in self._v_system.listtextidsbytype(document, language, owner, type, expression): list.append(self.gettext(id)) return list class Content(OFS.SimpleItem.SimpleItem): (id_, id, time) = (0, 0, '00010101') (document, language, owner, parent) = (0, '', '', -1) (type, name, date, text, sort) = ('', '', '00010101', [], '') (size) = ('480') def __init__(self, content, size='480'): if content: self.id_ = content['id'] self.id = content['id'] self.time = content['time'] self.document = content['document'] self.language = content['language'] self.owner = content['owner'] self.parent = content['parent'] self.type = content['type'] self.name = content['name'] self.date = content['date'] self.text = content['text'].split('\t') self.sort = content['sort'] self.size = size return def sort_plus_id(self): return '%s %09d' % (self.sort, self.id) def sort_by_date(self): sort = (self.text[0]).split(' ')[-1] return '%s %09d' % (sort, self.id) def edit(self, edit=1, data='data', init={}): if edit: parameter = ['id_:int=%d' % (self.id), 'data_=%s' % (data)] for key in init.keys(): parameter.append('init_.%s:record%s=%s' % (key, ['',':int'][type(init[key])==types.IntType], init[key])) return '[edit] ' % (string.join(parameter, '&'), self.id, self.size, ['edit','new'][init != {}]) return '' def show(self, edit=0): if edit: return '%s%s' % (self.edit(edit), self.text) return self.text def getcontent(self, id, init={}): content = self._v_system.getcontent(id) if not content: content = { 'id' : id, 'time' : 'now', 'document' : -1, 'language' : '', 'owner' : '', 'parent' : -1, 'type' : '', 'name' : '', 'date' : '00010101', 'text' : '', 'sort' : '' } for key in init.keys(): content[key] = init[key] return self.Content(content, self._v_system.getvalue(content['type'], 'object::size')) def setcontent(self, id, content): return self._v_system.setcontent(id, content) def listcontents(self, document, language, owner, type='', expression=''): list = [] for content in self._v_system.listcontents(document, language, owner, expression): if type: if type == content['type']: list.append(self.Content(content, self._v_system.getvalue(content['type'], 'object::size'))) else: list.append(self.Content(content, self._v_system.getvalue(content['type'], 'object::size'))) return list def getcontentbyname(self, document, language, owner, type, name): return self.getcontent(self._v_system.getcontentidbyname(document, language, owner, type, name)) def listcontentbytype(self, document, language, owner, type, expression=''): list = [] for id in self._v_system.listcontentidsbytype(document, language, owner, type, expression): list.append(self.getcontent(id)) return list def getparameter(self, parameter): return self._v_system.getparameter(parameter) def log(self, document, language, owner, action, data): name = '%s/log/%d' % (self.location, document) return self.writelog(name, [language, owner, action, str(data)]) def text2dict(self, text, objecttype, objectvalues=None): dict = {} (index, max) = (0, len(text)) if not objectvalues: objectvalues = self.listobjectvalues(objecttype) for objectvalue in objectvalues: if index < max: if objectvalue.type == 'date': size = int(objectvalue.size) list = re.split('\r*\n', '%s%s' % (text[index], size*'\n'))[:size] dict[objectvalue.value] = [] for i in range(size): temp = re.split(' ', list[i]) while len(temp) < 3: temp.append('') dict[objectvalue.value].append(string.join(temp[:-2], ' ').strip()) dict[objectvalue.value].append(temp[-2]) dict[objectvalue.value].append(temp[-1]) elif objectvalue.type == 'image': size = int(objectvalue.size) list = re.split('\r*\n', '%s%s' % (text[index], size*'\n'))[:size] dict[objectvalue.value] = [] for i in range(size): temp = re.split(' ', list[i]) while len(temp) < 3: temp.append('') dict[objectvalue.value].append(temp[0]) dict[objectvalue.value].append(temp[1]) dict[objectvalue.value].append(string.join(temp[2:], ' ').strip()) elif objectvalue.type == 'file': size = int(objectvalue.size) list = re.split('\r*\n', '%s%s' % (text[index], size*'\n'))[:size] dict[objectvalue.value] = [] for i in range(size): temp = re.split(' ', list[i]) while len(temp) < 3: temp.append('') dict[objectvalue.value].append(temp[0]) dict[objectvalue.value].append(string.join(temp[1:-1], ' ').strip()) dict[objectvalue.value].append(temp[-1]) elif objectvalue.type == 'link': size = int(objectvalue.size) list = re.split('\r*\n', '%s%s' % (text[index], size*'\n'))[:size] dict[objectvalue.value] = [] for i in range(size): temp = re.split(' ', list[i]) while len(temp) < 3: temp.append('') dict[objectvalue.value].append(temp[0]) dict[objectvalue.value].append(string.join(temp[1:-1], ' ').strip()) dict[objectvalue.value].append(temp[-1]) elif objectvalue.type == 'table': list = re.split('\r*\n', text[index]) dict[objectvalue.value] = [] for line in list: dict[objectvalue.value].append(re.split('\s+\|\s+', line)) else: dict[objectvalue.value] = text[index] else: if objectvalue.type == 'date': size = int(objectvalue.size) dict[objectvalue.value] = [] for i in range(size): temp = re.split(' ', objectvalue.default) while len(temp) < 3: temp.append('') dict[objectvalue.value].append(string.join(temp[:-2], ' ').strip()) dict[objectvalue.value].append(temp[-2]) dict[objectvalue.value].append(temp[-1]) elif objectvalue.type == 'image': size = int(objectvalue.size) dict[objectvalue.value] = [] for i in range(size): temp = re.split(' ', objectvalue.default) while len(temp) < 3: temp.append('') dict[objectvalue.value].append(temp[0]) dict[objectvalue.value].append(temp[1]) dict[objectvalue.value].append(string.join(temp[2:], ' ').strip()) elif objectvalue.type == 'file': size = int(objectvalue.size) dict[objectvalue.value] = [] for i in range(size): temp = re.split(' ', objectvalue.default) while len(temp) < 3: temp.append('') dict[objectvalue.value].append(temp[0]) dict[objectvalue.value].append(string.join(temp[1:-1], ' ').strip()) dict[objectvalue.value].append(temp[-1]) elif objectvalue.type == 'link': size = int(objectvalue.size) dict[objectvalue.value] = [] for i in range(size): temp = re.split(' ', objectvalue.default) while len(temp) < 3: temp.append('') dict[objectvalue.value].append(temp[0]) dict[objectvalue.value].append(string.join(temp[1:-1], ' ').strip()) dict[objectvalue.value].append(temp[-1]) elif objectvalue.type == 'table': list = re.split('\r*\n', objectvalue.default) dict[objectvalue.value] = [] for line in list: dict[objectvalue.value].append(re.split('\s+\|\s+', line)) else: dict[objectvalue.value] = objectvalue.default index += 1 return dict def dict2text(self, dict, objecttype, objectvalues=None): text = [] if not objectvalues: objectvalues = self.listobjectvalues(objecttype) for objectvalue in objectvalues: if objectvalue.type == 'date': size = int(objectvalue.size) list = [] for i in range(size): if type(dict[objectvalue.value][3*i]) == types.ListType: force = dict[objectvalue.value][(3*i)+1][0] == '1' sort = self.date2sort(dict[objectvalue.value][(3*i)][0]) if force: sort = dict[objectvalue.value][(3*i)+2][0] list.append('%s %d %s' % (dict[objectvalue.value][3*i][0], force, sort)) else: force = dict[objectvalue.value][(3*i)+1] == '1' sort = self.date2sort(dict[objectvalue.value][(3*i)]) if force: sort = dict[objectvalue.value][(3*i)+2] list.append('%s %d %s' % (dict[objectvalue.value][3*i], force, sort)) text.append(string.join(list, '\n')) elif objectvalue.type == 'image': size = int(objectvalue.size) list = [] for i in range(size): if type(dict[objectvalue.value][3*i]) == types.ListType: list.append('%s %s %s' % (dict[objectvalue.value][3*i][0], dict[objectvalue.value][(3*i)+1][0], dict[objectvalue.value][(3*i)+2][0])) else: list.append('%s %s %s' % (dict[objectvalue.value][3*i], dict[objectvalue.value][(3*i)+1], dict[objectvalue.value][(3*i)+2])) text.append(string.join(list, '\n')) elif objectvalue.type == 'file': size = int(objectvalue.size) list = [] for i in range(size): if type(dict[objectvalue.value][3*i]) == types.ListType: list.append('%s %s %s' % (dict[objectvalue.value][3*i][0], dict[objectvalue.value][(3*i)+1][0], dict[objectvalue.value][(3*i)+2][0])) else: list.append('%s %s %s' % (dict[objectvalue.value][3*i], dict[objectvalue.value][(3*i)+1], dict[objectvalue.value][(3*i)+2])) text.append(string.join(list, '\n')) elif objectvalue.type == 'link': size = int(objectvalue.size) list = [] for i in range(size): if type(dict[objectvalue.value][3*i]) == types.ListType: list.append('%s %s %s' % (dict[objectvalue.value][3*i][0], dict[objectvalue.value][(3*i)+1][0], dict[objectvalue.value][(3*i)+2][0])) else: list.append('%s %s %s' % (dict[objectvalue.value][3*i], dict[objectvalue.value][(3*i)+1], dict[objectvalue.value][(3*i)+2])) text.append(string.join(list, '\n')) elif objectvalue.type == 'table': if type(dict[objectvalue.value]) == types.ListType: list = [] for line in dict[objectvalue.value]: list.append(string.join(line, ' | ')) text.append(string.join(list, '\n')) else: text.append(string.strip(dict[objectvalue.value])) else: text.append(string.strip(str(dict[objectvalue.value]))) for i in range(len(text)): text[i] = string.replace(text[i], '\t', ' ') return string.join(text, '\t') def find(self, language, owner, words, type_list=[], all_words=0, case_sensitive=0, whole_words=0): list = [] operator = '~*' if case_sensitive: operator = '~' for word in re.split('\s+', words.strip()): expr = '(document > -1) AND (' delimiter = ['', ''] if whole_words: delimiter = ['([^a-zA-Z0-9]|^)', '([^a-zA-Z0-9]|$)'] expr += 'text%s\'%s%s%s\' OR ' % (operator, delimiter[0], self.quote(word), delimiter[1]) expr += 'FALSE)' list.append(expr) operator = ' OR ' if all_words: operator = ' AND ' if type_list: expression = 'type IN (\'%s\') AND (%s)' % (string.join(type_list, '\',\''), string.join(list, operator)) else: expression = '%s' % (string.join(list, operator)) where = "language='%s' AND owner='%s' AND %s" % (language, owner, expression) list = [] try: for id in self._v_system.listids('text', where): list.append(self.gettext(id)) for id in self._v_system.listids('content', where): list.append(self.getcontent(id)) except Exception: self.rollback() return list def selectdocuments(self, list): list.sort(self._sortbydocument) c = 0 if list: list[0] = self.getdocument(list[0].document) for i in range(1, len(list)): if list[c].id != list[i].document: c = c+1 list[c] = self.getdocument(list[i].document) c = c+1 return list[:c] def _sortbydocument(self, left, right): if left.document < right.document: return -1 if left.document > right.document: return 1 return 0 def checkname(self, name): return self._v_system.getuser(name)['id'] def name2id(self, name): return re.sub('[^\S\w\-]+', '_', name.strip()).lower() def list2dict(self, list, name='value'): dict = {} for item in list: dict[item['id']] = item[name] return dict def text2html(self, text): text = string.replace(text, '\r\n\r\n', '

') text = re.sub('\n[ \t\r]*<(/?)(ul|ol)([^>]*)>', '<\\1\\2\\3>', text) text = re.sub('\n[ \t\r]*<(/?)(ul|ol)([^>]*)>', '<\\1\\2\\3>', text) text = re.sub('<(/?)(ul|ol)([^>]*)>[ \t\r]*\n', '<\\1\\2\\3>', text) text = re.sub('<(/?)(ul|ol)([^>]*)>[ \t\r]*\n', '<\\1\\2\\3>', text) text = re.sub('\n[ \t\r]*<(/?)(li|p|table|tr|td|th|map)([^>]*)>', '<\\1\\2\\3>', text) text = re.sub('<(/?)(li|p|table|tr|td|th|map)([^>]*)>[ \t\r]*\n', '<\\1\\2\\3>', text) text = re.sub('\n[ \t\r]*<(br|hr|img|area)([^>]*)>', '<\\1\\2>', text) text = re.sub('<(br|hr|img|area)([^>]*)>[ \t\r]*\n', '<\\1\\2>', text) text = string.replace(text, '\r\n', '
') return text def plugin(self, extension): dict = { 'adobe_reader': ('pdf', 'Adobe Reader', 'http://www.adobe.com/de/products/acrobat/'), 'flash_player': ('swf', 'Adobe Flash Player', 'http://www.adobe.com/go/getflashplayer_de'), 'java' : ('jar class', 'Sun Java SE Runtime Environment (JRE)', 'http://java.com/de/download'), 'shock_wave' : ('sbl lob', 'Adobe Shockwave', 'http://www.adobe.com/shockwave/download/'), 'real_audio' : ('ram mpv awb r1m', 'Real Player', 'http://germany.real.com/player/'), 'media_player': ('avi wmz rmi midi ivf ogm', 'Windows Media Player', 'http://update.microsoft.com/microsoftupdate/'), 'quick_time' : ('mov qt qtc qti qti qtif qtm qts', 'Apple Quicktime', 'http://www.apple.com/de/quicktime/download/'), } for key, value in dict.items(): if extension in value[0].split(): return (value[1], value[2]) return None def test(self): return self.markup manage_addZSite = Globals.DTMLFile('manage/add', globals()) def manage_add(self, id, title, REQUEST=None): """Add a new ZSite instance""" handle = ZSite(REQUEST.name, REQUEST.database, REQUEST.location) handle.id = id handle.title = title handle.name = REQUEST.name handle.database = REQUEST.database handle.location = REQUEST.location self = self.this() self._setObject(id, handle) if REQUEST is not None: REQUEST['RESPONSE'].redirect(self.absolute_url()+'/manage_main')