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)