[Tutor] suggestion on improving script

Norman Khine norman at khine.net
Sat Mar 22 12:31:09 CET 2008


Hello,

Please excuse me in advance if this post is long winded. I have the 
following nagging issue for which I have found a work around, but wanted 
a better solution.

I am using jQuery to populate tabs with some data, such as news and jobs 
posts, as can be seen at http://uk.expert.travel

In my application, I have the following structure (only partially listed):

$ tree -L 2
.
|-- expert_travel.py
|-- ui
|   `-- ui.tabs.js
...
`-- utils.py



#expert_travel.py

from utils import t1, t2, t3, t4

...

     ####################################################################
     # News - List
     ####################################################################

     def list_news(self, context):
         namespace = {}
         namespace['batch'] = ''
         #Search the catalogue, list all news items in company

...

# Set batch informations

[t1]        batch_start = int(context.get_form_value('t1', default=0))

         batch_size = 5
         batch_total = len(news_items)
         batch_fin = batch_start + batch_size
         if batch_fin > batch_total:
             batch_fin = batch_total
         news_items = news_items[batch_start:batch_fin]
         # Namespace
         if news_items:
             msgs = (u'There is one news item.',
                     u'There are ${n} news items.')

[t1]            news_batch = t1(context.uri, batch_start, batch_size,
                               batch_total, msgs=msgs)

             msg = None
         else:
             news_batch = None
             msg = u'Currently there is no news.'


     ####################################################################
     # List jobs
     list_jobs__label__ = u'List jobs'
     list_jobs__access__ = True
     def list_jobs(self, context):
...

         # Set batch informations

[t2]        batch_start = int(context.get_form_value('t2', default=0))

         batch_size = 5
         batch_total = len(jobs)
         batch_fin = batch_start + batch_size
         if batch_fin > batch_total:
             batch_fin = batch_total
         jobs = jobs[batch_start:batch_fin]
         # Namespace
         if jobs:
             msgs = (u'There is one job.',
                     u'There are ${n} jobs.')

[t2]            job_batch = t2(context.uri, batch_start, batch_size,
                               batch_total, msgs=msgs)

             msg = None
         else:
             job_table = None
             job_batch = None
             msg = u'Sorry but there are no jobs'
...



####

#utils.py

def t1(uri, start, size, total, gettext=Handler.gettext,
           msgs=(u"There is 1 object.", u"There are ${n} objects.")):

     # Plural forms
     if total == 1:
         msg1 = gettext(msgs[0])
     else:
         msg1 = gettext(msgs[1])
         msg1 = Template(msg1).substitute(n=total)
     msg1 = msg1.encode('utf-8')

     # Calculate end
     end = min(start + size, total)

     # Previous
     previous = None
     if start > 0:
         previous = max(start - size, 0)
         previous = str(previous)

[t1]        previous = uri.replace(t1=previous)

         previous = str(previous)
         previous = XMLAttribute.encode(previous)
         previous = '<a href="%s" title="%s">&lt;&lt;</a>' \
                    % (previous, gettext(u'Previous'))
     # Next
     next = None
     if end < total:
         next = str(end)

[t1]        next = uri.replace(t1=next)

         next = str(next)
         next = XMLAttribute.encode(next)
         next = '<a href="%s" title="%s">&gt;&gt;</a>' \
                % (next, gettext(u'Next'))

     # Output
     if previous is None and next is None:
         msg = msg1
     else:
         # View more
         if previous is None:
             link = next
         elif next is None:
             link = previous
         else:
             link = '%s %s' % (previous, next)

         msg2 = gettext(u"View from ${start} to ${end} (${link}):")
         msg2 = Template(msg2)
         msg2 = msg2.substitute(start=(start+1), end=end, link=link)
         msg2 = msg2.encode('utf-8')

         msg = '%s %s' % (msg1, msg2)

     # Wrap around a paragraph
     return Parser('<p class="batchcontrol">%s</p>' % msg, namespaces)


#Second TAB

def t2(uri, start, size, total, gettext=Handler.gettext,
           msgs=(u"There is 1 object.", u"There are ${n} objects.")):
     # Plural forms
...


###

I would like to alter this batch control so that I don't have to create 
a new method everytime I need a new tab.

For example, I would like to change t1, t2 ... t[n] depending on the tab 
I am at.

You can see it in action at http://uk.expert.travel/;view

If you click on the [Jobs] tab, there are 6 jobs, if you then click on 
the 'There are 6 jobs. View from 1 to 5 (>>):'

you will get a list of the last post.

Note the URI http://uk.expert.travel/;view?t2=5


If I only use one global method, the problem would be that when I 
clicked on the News tab, I will get no items displayed as can be seen here:

http://uk.expert.travel/companies/abakuc/;view

I hope this makes sense ;)

Any advice would be much appreciated.

Cheers

Norman


More information about the Tutor mailing list