Norman Khine wrote: > 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. >
The reason http://uk.expert.travel/companies/abakuc/;view?batchstart=5 fails while http://uk.expert.travel/;view?t2=5 succeeds does not have to do with using a global method. t2=5 tells the CGI program which tab was clicked, whereas batchstart=5 does not. You only need one "t" function as long as you use the t2=5 approach (or some other way to communicate WHICH tab and WHERE to start (e.g. ?tab=2,batchstart=5. Also - 99% of list_news, list_jobs, et. al. can be factored out into common code. Does this make sense? Would you like more help or can you start figuring it out yourself? > 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"><<</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">>></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 > _______________________________________________ > Tutor maillist - Tutor@python.org > http://mail.python.org/mailman/listinfo/tutor > > -- Bob Gailer 919-636-4239 Chapel Hill, NC _______________________________________________ Tutor maillist - Tutor@python.org http://mail.python.org/mailman/listinfo/tutor