Page Source
from utils.display import Display, Arguments, Database, Modal
from utils.controls import *
from utils.web_exc import WebError
from utils import shapes, perms, actions
import queries, debugging
from utils import misc, bounce, docs
from config import docroot
import string, os
import time
import MySQLdb
from utils.output.html import *
class DocsLinkControl(SingleLinkControl):
def __init__(self,field=None,defurl=None):
self.field = field
self.defurl = defurl
def output_disp(self,display,container):
pd = docs.parsetext(display.fields['desc_text'],
defdict={'URL':self.defurl,
'TEXT':display.fields['desc_text']})
self.url = pd['URL']
self.linktext=pd['TEXT']
SingleLinkControl.output_disp(self,display,container)
class ListDocDisplay(Display, Database, Arguments, Modal):
prefix = "/docs"
multiple_container_control = SimpleContainerControl(TABLE)
multiple_row_container_control = SimpleContainerControl(TR)
multiple_controls = [ DocsLinkControl(defurl = "%(part:pubdocs)s%(!path_desc)s",
field = "desc_text"),
SingleLinkControl(url = "%(part:pubdocs)s/listing%(!path_desc)s",
linktext = NoEditControl(field="path_desc",title="Path Description"))
]
error_messages = {
"no_key" : ("No Key",
'Unknown quick key. Create a new one if necessary'),
"FATAL" : ("Fatal Error",
'Fatal Error in Programming. Contact webmaster@cs.uchicago.edu \
giving details.'),
"perms" : ("Permission Denied",
"You dont have permissions to access this page")
}
def get_multiple_title(self):
return "Show all doc nodes"
def process_arguments(self):
try:
form_start = self.req.form_data['start']
except:
form_start = None
if form_start: # form data overrides URL data
bounce.bounce(req = self.req,
location = "%(script)s/%(!start)s" % self.req.urls(self.req.form_data))
self.args = {'start' : "/"+string.join(self.req.url.arguments,'/')}
if self.args['start'] == "/":
self.args['start'] = self.prefix
if self.args['start'][:len(self.prefix)] != self.prefix: # Does not start with prefix
self.args['start'] = self.prefix+self.args['start']
def make_page(self,page):
self.process_arguments()
page.set_title(self.get_multiple_title())
if not self.permit_mode('display'):
raise WebError("perms{}")
if self.get_mode() != 'display':
bounce.bounce(self.req, self.req.urls['mode:display'])
page.add_navigation("%(part:pubdocs)s%(!start)s" % self.req.urls(self.args), "Category View")
page.add_navigation("%(part:pubdocs)s/add" % self.req.urls,"Add doc")
page.append(self.multiple_database())
def is_multiple(self): # always multiple mode
return 1
def permit_mode(self, mode):
return mode in ('display','pretty')
def db_rows(self):
return self.query_count
def db_fetch(self):
if self.query_records:
self.fields = self.query_records.pop()
else:
self.fields = None
return self.fields
def db_query(self):
# only in multiple mode
if self.is_multiple():
wc = "path_desc like '" + self.args['start'] + "%'"
q = queries.Select(tables=[docs.TABLENAME],
columns={'path_desc' : 'path_desc',
'desc_text' : 'desc_text'
},
where = wc,
order=["path_desc"])
q.execute()
self.query_records = q.fetchall()
self.query_records.sort(cmp)
self.query_count = len(self.query_records)
def cmp(x,y):
"""x and y are dictionaries with path_desc as an attribute.
Shallower entries come up last. Among entries of same depth reverse alphabetical order.
Then when we keep popping things come in reverse order."""
b = y['path_desc']
a = x['path_desc']
diff = string.count(b,"/") - string.count(a,"/")
if diff != 0:
return diff
if b < a:
return -1
elif a < b:
return 1
else:
return 0
def new(req):
return ListDocDisplay(req)