예제 #1
0
class DetailHTML:
    """Given an actitvity to prefrom on a record (view, edit, add)
       return a list of html building blocks to paint the page"""

    def __init__(self, book_id, activity):
        self.book_id = book_id
        self.activity = activity
        self.connection = getDictConnection()
        self.conn = getConnection()
        self.htmlUtils = HTMLutils()
        # bring in yaml metadata
        metadata = Metadata()
        self.columns = metadata.loadYaml("columns")
        self.pages = metadata.loadYaml("pages")

        if activity == "edit":
            self.report = Report("edit")
            self.header = "Edit Record"
            self.page = "edit"
            self.new_activity = "update"
            self.button_text = "Submit"
            self.show_blank = ""
            self.cancel_button_text = "Cancel"
            self.cancel_button_address = "detail.py?book_id=%s&activity=view" % book_id

        elif activity == "view":
            self.report = Report("record")
            self.header = "Book Record"
            self.page = "record"
            self.new_activity = "edit"
            self.button_text = "Edit"
            self.show_blank = "-"
            self.cancel_button_address = "main.py"
            self.cancel_button_text = "Back to Catalog"

        elif activity == "add":
            self.header = "Enter New Record"
            self.page = "edit"
            self.new_activity = "submit_new"
            self.button_text = "Save"
            self.show_blank = ""
            self.cancel_button_address = "main.py"
            self.cancel_button_text = "Cancel"

        else:
            raise Exception("Unrecognized activity: %s" % activity)

        # build the dictionary of autocomplete lists by
        self.autoCompleteList = self._getAutoCList()

    def build_html_header(self):
        html_header = """
        <html>
        <link rel="stylesheet" 
            href="//code.jquery.com/ui/1.11.1/themes/smoothness/jquery-ui.css">
        <script src="//code.jquery.com/jquery-1.10.2.js"></script>
        <script src="//code.jquery.com/ui/1.11.1/jquery-ui.js"></script>
        <script>
                $(function(){
                    $(".author_autocomplete").autocomplete({source: %s});
                    $("#series_autocomplete").autocomplete({source: %s});
                });

                $(function() {
                    $( "#when_read_datepicker" ).datepicker();
                });

                $(function(){
                    $("#add_new_author").click(function(){
                        $("#new_author_fields").toggle();
                     });
                });

        </script>

        <h3>%s</h3>
        """ % (
            self.autoCompleteList["author"],
            self.autoCompleteList["series"],
            self.header,
        )
        return html_header

    def buildMessage(self, updated, added):
        updates = ""
        adds = ""

        if updated:
            updates = "Updated: <br> "
            for item in updated:
                if item in self.columns:
                    d_name = self.columns[item][0]["display"]
                    updates += "%s changed to:  %s <br>" % (d_name, updated[item])
                else:
                    updates += "%s was %s <br>" % (item, updated[item])

        if added:
            adds = "Added: <br> "
            for item in added:
                adds += "%s: %s " % (item, added[item])

        message = "For this record the following fields were <br> %s %s" % (updates, adds)

        if not added and not updated:
            message = "Message: No fields changed, no updates made"

        return message

    def build_report(self):

        if self.activity == "view":
            # make a simple table, not a form
            report = self.report.buildDetail(self.book_id)

        else:
            report = self.report.buildEditBook(self.book_id)

        return report

    def build_input_button(self):
        input_button = """<div>
         <input type = "hidden" name = "book_id" value = "%s"/>
         <input type = "hidden" name = "activity" value = "%s"/>
         <input type = "button" value = "%s"
              onclick = "javascript: document.form.submit()";/>
         </div>""" % (
            self.book_id,
            self.new_activity,
            self.button_text,
        )
        return input_button

    def build_cancel_button(self):
        cancel_button = """
          <input type = "button" onClick = 
          "location.href='%s'" value = "%s">
           """ % (
            self.cancel_button_address,
            self.cancel_button_text,
        )
        return cancel_button

    def _getAutoCList(self):
        ##TO BE REPLACED BY query.getColumnValues when dict auto complete
        # is enabled

        """Behavior: populate acList{}
           with dic of lists to use by autocomplete fields"""
        aclist = {}

        for column in self.columns:
            resultsList = []

            if "form_type" in self.columns[column][0] and self.columns[column][0]["form_type"] == "autocomplete":

                sql = """select %s from %s group by %s_id
                """ % (
                    self.columns[column][0]["select"],
                    self.columns[column][0]["from"],
                    column,
                )
                results = execute(self.conn, sql)
                for item in results:
                    resultsList.append(item[0])
                    aclist[column] = resultsList

        return aclist
예제 #2
0
파일: detail.py 프로젝트: jzlink/library
class Detail():

   def __init__(self):

      self.htmlUtils = HTMLutils()
      self.dynamicJS = DynamicJS()
      self.detailProcessor = DetailProcessor()

      #get form values
      form = cgi.FieldStorage(keep_blank_values = 1)
      self.form_values = {}
      keys =[]
      for k in form.keys():
         key = str(k)
         value = str(form.getvalue(key))
         self.form_values[key] = value

      self.book_id= self.form_values['book_id']
      self.activity= self.form_values['activity']

      self.message = ''
      
      #if the incoming activity is submit_new or update
      #send form items out to be processed by update processor
      if self.activity == 'submit_new' or self.activity == 'update':
         self.message, self.book_id =\
             self.detailProcessor.processForm(self.form_values)
         self.activity = 'view'

      #set builder variables for each possible activity page
      if self.activity == 'edit':
         self.report = Report('edit')
         self.table = self.report.buildRecordForm(book_id = self.book_id)
         self.header = 'Edit Record'
         self.page = 'edit'
         self.new_activity = 'update'
         self.button_text = 'Submit'
         self.show_blank = None
         self.cancel_button_text = 'Cancel'
         self.cancel_button_address = 'detail.py?book_id=%s&activity=view'\
             %self.book_id

      elif self.activity == 'view':
         self.report = Report('record')
         self.table = self.report.buildDetail(self.book_id)
         self.header = 'Book Record' 
         self.page = 'record'
         self.new_activity = 'edit'
         self.button_text = 'Edit'
         self.show_blank = '-'
         self.cancel_button_address = 'main.py'
         self.cancel_button_text = 'Back to Catalog'
         
      elif self.activity == 'add':
         self.report = Report('add')
         self.table = self.report.buildRecordForm()
         self.header = 'Enter New Record' 
         self.page = 'edit'
         self.new_activity = 'submit_new'
         self.button_text = 'Save'
         self.show_blank = ''
         self.cancel_button_address = 'main.py'
         self.cancel_button_text = 'Cancel'          

      else:
         raise Exception ("Unrecognized activity: %s" %self.activity)

   def buildPage(self):
      page = ''

      form_header = \
          self.htmlUtils.build_form_header('POST', 'detail.py', 'form')
      form_footer = self.htmlUtils.build_form_footer()
      html_footer = self.htmlUtils.build_html_footer()

      header = self.buildHeader()
      submit = self.buildInput()
      cancel = self.buildCancel()

      page += 'Content-Type: text/html\n'
      page += header
      page += '<br>'
      page += self.message
      page += form_header
      page += self.table
      page += '<br>'
      page += submit
      page += cancel
#      page += str(self.form_values)
      page += form_footer
      page += html_footer

      return page

   def buildHeader(self):
      '''call in dynamic js functions, add them to the header
      return header'''

      seriesHandler = self.dynamicJS.autoCSeries()
      authorHandler = self.dynamicJS.autoCAuthor()
      dateHandler = self.dynamicJS.datePicker()
      toggleAuthor = self.dynamicJS.toggle('#authorToggle', '#addAuthor')

      html_header= '''
        <html>
        <link rel="stylesheet" 
           href="//code.jquery.com/ui/1.11.1/themes/smoothness/jquery-ui.css">
           <script src="//code.jquery.com/jquery-1.10.2.js"></script>
           <script src="//code.jquery.com/ui/1.11.1/jquery-ui.js"></script>
        <script>
           %s
           %s
           %s
           %s
        </script>

        <h3>%s</h3>
        '''% (seriesHandler, authorHandler, toggleAuthor, dateHandler,\
                 self.header)

      return html_header

   def buildInput(self):
      '''build submit buttons'''

      inputValues = ''
      hidden_bookID = self.htmlUtils.getHidden('book_id' , self.book_id)
      hidden_activity = self.htmlUtils.getHidden\
          ('activity', self.new_activity)
      button = self.htmlUtils.getButton\
          (self.button_text,  'javascript:document.form.submit()')

      inputValues = hidden_bookID + hidden_activity + button
      
      return inputValues

   def buildCancel(self):
      ''' build cancel/go back buttons'''
      onClick = "location.href='%s'" %self.cancel_button_address
      cancel = self.htmlUtils.getButton(self.cancel_button_text, onClick)
      return cancel