#! /usr/bin/python2.2
#------------------------------------------------------------------------
# name: poage.py
# author: J Skinner
# Date Written: 2003
# Purpose: generate html pages from a database
# Notes
#------------------------------------------------------------------------
#------------------------ GLOBALS ------------------------------------
from constants import *
from utils import *
def get_file_as_string(fname):
return '\n'.join(open(fname, 'r').readlines())
#------------------------------------------------------------------------
class Url_List:
' vertical list of urls '
def __init__(self, page_id, db, auth_level, page_info=None, xtra_info=None):
self.__template='<a href="%(item_data)s">%(item_name)s</a><br>'
self.__db = db
self.__page_id = page_id
self.__page_info = page_info
self.__xtra_info = xtra_info
self.__auth_level = auth_level
self.__data = self.__get_items()
def __get_items(self):
self.__page_data = self.__db.get_dict('page_data_simple',
['item_name', 'item_data', 'auth_level'],
where='page_id=%s and auth_level <= %s'%(self.__page_id,
self.__auth_level), order='item_name')
def show(self):
formatted_list = []
for i in self.__page_data:
formatted_list.append(self.__template%i)
return '\n'.join(formatted_list)
def walk(self):
return self.show()
#------------------------------------------------------------------------
class Item_list:
def __init__(self, page_id, db, auth, page_info=None, xtra_info=None):
self.__template='<a href="./index.cgi?page=edit&the_id=%(doc_id)s">%(title)s</a><br>'
self.__db = db
self.__page_id = page_id
self.__page_info = page_info
self.__xtra_info = xtra_info
self.__auth = auth
self.__data = self.__get_items()
def __get_items(self):
# print 'parent', self.__page_info['parent'
# print 'page_id', self.__page_info['page_id']
self.__page_data = self.__db.get_dict('document_info',
['doc_id', 'author_id', 'pub_date', 'has_blob',
'is_active', 'title', 'short_desc', 'long_desc'],
order='title')
def show(self):
formatted_list = []
for i in self.__page_data:
formatted_list.append(self.__template%i)
return 'main_text', '\n'.join(formatted_list)
def walk(self):
return self.show()
#------------------------------------------------------------------------
class Simple_Text:
def __init__(self, page_id, db, auth, page_info=None, xtra_info=None):
self.__template='<a href="./index.cgi?page=edit&the_id=%(doc_id)s">%(title)s</a><br>'
self.__db = db
self.__page_id = page_id
self.__page_info = page_info
self.__xtra_info = xtra_info
self.__auth = auth
self.__data = self.__get_items()
def __get_items(self):
# print 'parent', self.__page_info['parent'
# print 'page_id', self.__page_info['page_id']
# print 'page_id', self.__page_id
self.__page_text = self.__db.get_dict('page_data_simple',
['item_data'],
where='page_id=%s and item_name="main_text"'%self.__page_id)
def show(self):
formatted_list = []
for i in self.__page_data:
formatted_list.append(self.__template%i)
return 'main_text', '\n'.join(formatted_list)
def walk(self):
return self.show()
#class Complex_Text:
# def __init__(self, page_id, db, auth, page_info=None, xtra_info=None):
# pass
#------------------------------------------------------------------------
class Page:
def __init__(self, page_id, db, auth, page_info=None, xtra_info=None):
# print page_id
self.__page_id = page_id
self.__parts = []
self.__page_info = page_info
self.__xtra_info = xtra_info
self.__auth = auth
self.__db = db
self.__page_types = {'1':Simple_Text, '2':Url_List}
if auth.do_login: # page == '200':
# this is an ugly hack
template = {'template_name':'top',
'template':"%(content)s"}
page_data = {'item_name':'content',
'content':get_file_as_string(TEMPLATE_DIR+'login.html')}
self.page = template['template']%page_data
elif auth.do_download:
self.__send_file()
self.page = None
else:
if auth.do_logout: # page_id == '300':
self.__auth.logout()
self.page = self.__get_parts(page_info)
def __build(self, xtra_info):
parts = []
tables = []
static_query_parts = {'keywords':
[''' document_info.doc_id=kw_doc.doc_id and
keywords.keyword_id=kw_doc.keyword_id ''',
'keywords, kw_doc, document_info'],
'authors': ['''
document_authors.author_id = doc_auth.author_id and
doc_auth.document_id = document_info.doc_id''',
'document_authors, doc_auth, document_info'],
'department':[''' ''', '']}
print 'content-type: text/html'
print
for i in [ ['keywords', 'keyword'], ['authors', 'name'],
['deparment', 'department']]:
if xtra_info.has_key(i[0]):
parts.append( '('+' or '.join(
['%s = "%s"'%(i[1], _i.strip())
for _i in xtra_info[i[0]].split(',')])+')')
parts.append(static_query_parts[i[0]][0])
tables.append(static_query_parts[i[0]][1])
if len(parts):
tables_hash = {}
for i in ','.join(tables).split(','):
tables_hash[i.strip()] = 1
tables = ','.join(tables_hash.keys())
print tables, ' and '.join(parts)
return tables, ' and '.join(parts)
else:
print 'boom'
return 'document_info.doc_id=kw_doc.doc_id and '+\
'keywords.keyword_id=kw_doc.keyword_id'
#------------------------------------------------------------------------
def __get_parts(self, page_info):
if not page_info:
page_info = self.__page_info = self.__db.get_dict('pages',
['page_id', 'page_type', 'auth_level',
'has_subparts', 'parent', 'template_id', 'sub_type'],
where='page_id=%s'%self.__page_id)[0]
self.__page_items = {}
self.__page_items['left_bar'] = Url_List(2, self.__db, self.__auth.auth_level).show()
try:
stuff = self.__db.get_dict('page_data_simple',
['item_name', 'item_data'],
where='page_id=%s'%self.__page_id)
except self.__db.NO_DATA:
pass
template = self.__db.get('page_templates', ['template'],
where='template_id = "%s"'%1)[0]
for i in stuff:
self.__page_items[i['item_name']] = i['item_data']
if page_info['page_type'] == 1:
# this is a simple type so we don't need anything more done
pass
elif page_info['page_type'] == 2:
# search for an items and show them
#query = build_query(extra_info)
template_line = self.__db.get('page_templates', ['template'],
where='template_id="%s"'%SEARCH_TEMPLATE_LINE_ID)[0][0]
template_body = self.__db.get('page_templates', ['template'],
where='template_id="%s"'%SEARCH_TEMPLATE_BODY_ID)[0][0]
try:
tables, filter = self.__build(self.__xtra_info)
results = self.__db.get( tables,
['document_info.doc_id', 'title'],
distinct='Y', where=filter)
except self.__db.NO_DATA:
self.__page_items['main_text'] = \
template_body%'No Items Found'
else:
search_parts = []
for i in results:
search_parts.append(template_line%i)
self.__page_items['main_text'] = \
template_body%'\n'.join(search_parts)
elif page_info['page_type'] == 3:
# display the detailed view for an item
results = self.__db.get_dict('document_info',
[ 'doc_id', 'pub_date', 'title', 'short_desc', 'long_desc',
'has_blob'],
where='doc_id="%s"'%self.__xtra_info['item_id'])[0]
if results['has_blob'] == 1:
results['download'] = '<a href="./index.cgi?action=download&doc_id=%s">Download</a>'%results['doc_id']
else:
results['download'] = ''
authors = self.__db.get_dict('doc_auth, document_authors',
[ ('doc_auth.author_id', 'author_id'), 'name' ],
where='document_authors.author_id = doc_auth.author_id and '+\
'doc_auth.document_id="%s"'%results['doc_id'] )
author_list = []
author_template = \
'<a href="./index.cgi?action=show_author&auth_id=%(author_id)s">%(name)s</a>'
for i in authors:
author_list.append(author_template%i)
results['the_authors'] = ', '.join(author_list)
template_body = self.__db.get('page_templates', ['template'],
where='template_id="%s"'%ITEM_TEMPLATE_BODY_ID)[0][0]
self.__page_items['main_text'] = \
template_body%results
elif page_info['page_type'] == 4:
# entry form for document input
authors = self.__db.get('document_authors', ['author_id', 'name'],
order='name')
template_body = self.__db.get('page_templates', ['template'],
where='template_id="%s"'%ENTRY_TEMPLATE_BODY_ID)[0][0]
dropbox = '\n'.join(['<option value="%s">%s'%_i for _i in authors])
self.__page_items['main_text'] = \
template_body%{'author_list':dropbox}
elif page_info['page_type'] == 5:
results = self.__db.get_dict('document_authors',
['name', 'email_address', 'notes'],
where='author_id=%s'%self.__xtra_info['auth_id'])[0]
template_body = self.__db.get('page_templates', ['template'],
where='template_id="%s"'%AUTHOR_BODY_ID)[0][0]
self.__page_items['main_text'] = \
template_body%results
self.__page_items['login_status'] = self.__auth.login_status()
return template[0]%self.__page_items
#------------------------------------------------------------------------
def __send_file(self):
data = self.__db.get('document_data', ['filename', 'the_doc'],
where='doc_id=%s'%self.__xtra_info['doc_id'])[0]
print '''\
Content-Type: application/octet-stream; name="%(filename)s"
Content-Disposition: attachment; filename="%(filename)s"'''%{'filename':data[0]}
print
print data[1]
def __show_header(self):
print 'Content-type: text/html'
print self.__auth.get_cookie_header()
print
def show(self):
" display the page "
#dummy, page = self.walk()
# print 'abc'
if self.page == None:
return
self.__show_header()
print self.page
def walk(self):
body_items = {}
for i in self.__parts:
the_name, the_content = i.walk()
body_items[the_name] = the_content
for i in self.__page_data:
body_items[i['item_name']] = i['item_data']
return (self.__template['template_name'],
self.__template['template']%body_items)
# simple mapping for various part handler classes
component_part = {'Page':Page, 'Url_List':Url_List}
comp_types = {'1':'Page', '2':'Url_List'}
#------------------------------------------------------------------------
def test():
'''\
test routine -
this is run when then module is run as a program for regression testing
'''
import access
import cgi
print 'Content-type: text/html'
print
page_id = 1
db = access.Access(dbname='pysocks', user='crypt')
form = cgi.FieldStorage()
if form.has_key('page'):
page_id = int(form['page'].value)
test_page = Page(page_id, db)
test_page.show()
if __name__ == '__main__':
test()