diff -r 9c7769850195 -r 6db2527b67cf handlers.py --- a/handlers.py Sun Sep 13 00:49:55 2009 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,292 +0,0 @@ -""" - Our URL action handlers -""" - -import datetime, calendar, pytz - -from qmsk.web import http, template - -import urls, channels, helpers -import preferences as prefs -from preferences import preferences -import config, log_search - -# load templates from here -templates = template.TemplateLoader("templates", - _helper_class = helpers.Helpers, - urls = urls, - channel_list = config.LOG_CHANNELS, - config = config, -) - -# return a http.Response for the given text in the given format -def _render_type (request, channel, lines, type, full_timestamps=False) : - """ - Render the given LogLines as a http.Response in the given format, which is one of: - html - XXX: not supported - txt - Plaintext - png - PNG image - rss - RSS feed - """ - - # load related preferences - formatter = request.prefs['formatter'] - - kwargs = dict( - full_timestamps = full_timestamps - ) - - # we can render in various modes... - if type in ('html', None) : - xxx - - elif type == 'txt' : - # plaintext - lines = formatter.format_txt(lines, **kwargs) - - # build data - data = '\n'.join(data for line, data in lines) - - return http.Response(data, 'text/plain') - - elif type == 'png' : - # PNG image - png_data = formatter.format_png(lines, **kwargs) - - return http.Response(png_data, 'image/png', charset=None) - - elif type == 'rss' : - # RSS feed - rss_data = formatter.format_rss(lines, **kwargs) - - # XXX: fix to render as unicode? - return http.Response(rss_data, 'application/rss+xml', charset=None) - - else : - raise http.ResponseError("Unrecognized type: %r" % (type, )) - -def _render_date (request, channel, date, lines, type, count, page, max) : - """ - Render the given LogLines as a http.Response for channel_date - """ - - # type? - if type : - # special type - return _render_type(request, channel, lines, type) - - else : - # format HTML - lines = request.prefs['formatter'].format_html(lines) - - # render - return templates.render_to_response("channel_date", - req = request, - prefs = request.prefs, - channel = channel, - date = date, - count = count, - page = page, - max = max, - lines = lines, - - # for prev/next date - date_next = channel.source.get_next_date(date), - date_prev = channel.source.get_prev_date(date), - ) - -@preferences.handler() -def index (request) : - """ - The topmost index page, display a list of available channels, perhaps some general stats - """ - - return templates.render_to_response("index", - req = request, - prefs = request.prefs, - ) - -# XXX: fix this namespace crap -@preferences.handler() -def preferences_ (request) : - """ - Preferences editor - """ - - # POST? - if request.is_post() : - # update any modified preferences - for pref in preferences.pref_list : - # get the POST'd value, default = None - post_value = request.get_post(pref.name, None) - - # skip non-specified values - # XXX: this is to not clobber timezone_offset to None - if post_value is None : - continue - - # parse the POST'd value, None -> default - new_value = request.prefs.parse(pref, post_value) - - # update if given and changed - if new_value != request.prefs[pref] : - request.prefs.set(pref.name, new_value) - - # render - return templates.render_to_response("preferences", - req = request, - prefs = request.prefs, - preferences = prefs, - ) - -def channel_select (request, channel) : - """ - Redirect to the appropriate channel_view - """ - - return http.Redirect(urls.channel.build(request, channel=channel)) - -@preferences.handler(prefs.formatter) -def channel_last (request, channel, count, formatter, type=None) : - """ - The main channel view page, displaying the most recent lines - """ - - # get latest events - lines = channel.source.get_latest(count) - - # type? - if type : - # other format - return _render_type(request, channel, lines, type) - - else : - # format HTML - lines = formatter.format_html(lines) - - # render page - return templates.render_to_response("channel_last", - req = request, - prefs = request.prefs, - channel = channel, - count = count, - lines = lines, - ) - -@preferences.handler(prefs.formatter, prefs.timezone, prefs.count) -def channel_link (request, channel, timestamp, formatter, timezone, count, type=None) : - """ - Display channel_date for specific UTC timestamp - """ - - # convert timestamp to user's timezone - timestamp = timestamp.astimezone(timezone) - - # get correct day's correct page of lines - page, max, lines = channel.source.get_date_paged(timestamp, count) - - # render channel_date - return _render_date (request, channel, timestamp, lines, type, count, page, max) - -@preferences.handler(prefs.timezone) -def channel_calendar (request, channel, year, month, timezone) : - """ - Display a list of avilable logs for some month - """ - - # current date as default - now = timezone.localize(datetime.datetime.now()) - - # target year/month - target = timezone.localize(datetime.datetime( - year = year if year else now.year, - month = month if month else now.month, - day = 1 - )) - - # display calendar - return templates.render_to_response("channel_calendar", - req = request, - prefs = request.prefs, - channel = channel, - month = target, - ) - -@preferences.handler(prefs.count, prefs.timezone) -def channel_date (request, channel, date, count, timezone, page=1, type=None) : - """ - Display all log data for the given date - """ - - # convert date to user's timezone - date = timezone.localize(date) - -# print -# print "channel_date: date=%s" % date - - # get that day's events, either paged or not - if page : - page, max, lines = channel.source.get_date_paged(date, count, page) - - else : - lines = channel.source.get_date(date) - max = None - - # render channel_date - return _render_date (request, channel, date, lines, type, count, page, max) - -@preferences.handler(prefs.formatter, prefs.count) -def channel_search (request, channel, formatter, count, q=None, page=1, max=1, type=None, t=None) : - """ - Display the search form for the channel for GET, or do the search for POST. - """ - - # calculate skip offset from page/count - skip = (page - 1) * count - - # got a search query? - if q : - # attribute targets - targets = dict(('search_%s' % target, True) for target in t if target in ('msg', 'nick')) if t else {} - - try : - # do search - lines = log_search.get_index().search_simple(channel, q, count, skip, **targets) - - # update max? - if max and page > max : - max = page - - except log_search.NoResultsFound : - # no results - lines = None - - else : - # just display the search form - lines = None - - # type? - if type and lines : - # special type - return _render_type(request, channel, lines, type, full_timestamps=True) - - else : - # format lines to HTML if any - if lines : - # format - lines = formatter.format_html(lines, full_timestamps=True) - - # render page - return templates.render_to_response("channel_search", - req = request, - prefs = request.prefs, - channel = channel, - search_query = q, - search_targets = t, - count = count, - page = page, - skip = skip, - max = max, - lines = lines, - ) -