diff --git a/modules/webbasket/lib/webbasket_webinterface.py b/modules/webbasket/lib/webbasket_webinterface.py index 3cb36d4cb..58cb2edaf 100644 --- a/modules/webbasket/lib/webbasket_webinterface.py +++ b/modules/webbasket/lib/webbasket_webinterface.py @@ -1,717 +1,742 @@ ## $Id$ ## ## This file is part of CDS Invenio. ## Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 CERN. ## ## CDS Invenio is free software; you can redistribute it and/or ## modify it under the terms of the GNU General Public License as ## published by the Free Software Foundation; either version 2 of the ## License, or (at your option) any later version. ## ## CDS Invenio is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ## General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with CDS Invenio; if not, write to the Free Software Foundation, Inc., ## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. """WebBasket Web Interface.""" __revision__ = "$Id$" __lastupdated__ = """$Date$""" - from mod_python import apache from invenio.config import weburl, webdir, cdslang, \ CFG_ACCESS_CONTROL_LEVEL_SITE from invenio.messages import gettext_set_language from invenio.webpage import page from invenio.webuser import getUid, page_not_authorized, isGuestUser from invenio.webbasket import * from invenio.webbasket_config import CFG_WEBBASKET_CATEGORIES, \ CFG_WEBBASKET_ACTIONS from invenio.urlutils import get_referer, redirect_to_url from invenio.webinterface_handler import wash_urlargd, WebInterfaceDirectory class WebInterfaceYourBasketsPages(WebInterfaceDirectory): """Defines the set of /yourbaskets pages.""" _exports = ['', 'display', 'display_item', 'write_comment', 'save_comment', 'delete_comment', 'add', 'delete', 'modify', 'edit', 'create_basket', 'display_public', 'list_public_baskets', 'unsubscribe', 'subscribe'] def index(self, req, form): """Index page.""" redirect_to_url(req, '%s/yourbaskets/display?%s' % (weburl, req.args)) def display(self, req, form): """Display basket""" argd = wash_urlargd(form, {'category': (str, CFG_WEBBASKET_CATEGORIES['PRIVATE']), 'topic': (int, 0), 'group': (int, 0), 'bsk_to_sort': (int, 0), 'sort_by_title': (str, ""), - 'sort_by_date': (str, "") + 'sort_by_date': (str, ""), + 'of': (str, '') }) _ = gettext_set_language(argd['ln']) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE >= 1: return page_not_authorized(req, "../yourbaskets/display", navmenuid = 'yourbaskets') (body, errors, warnings) = perform_request_display(uid, argd['category'], argd['topic'], argd['group'], argd['ln']) if isGuestUser(uid): body = create_guest_warning_box(argd['ln']) + body navtrail = '<a class="navtrail" href="%s/youraccount/display?ln=%s">'\ '%s</a>' navtrail %= (weburl, argd['ln'], _("Your Account")) navtrail_end = create_basket_navtrail(uid=uid, category=argd['category'], topic=argd['topic'], group=argd['group'], ln=argd['ln']) return page(title = _("Display baskets"), body = body, navtrail = navtrail + navtrail_end, uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd['of']) def display_item(self, req, form): """ Display basket item """ argd = wash_urlargd(form, {'bskid': (int, 0), 'recid': (int, 0), 'format': (str, "hb"), 'category': (str, CFG_WEBBASKET_CATEGORIES['PRIVATE']), 'topic': (int, 0), - 'group': (int, 0) + 'group': (int, 0), + 'of': (str, '') }) _ = gettext_set_language(argd['ln']) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE >= 1: return page_not_authorized(req, "../yourbaskets/display_item", navmenuid = 'yourbaskets') (body, errors, warnings) = perform_request_display_item( uid=uid, bskid=argd['bskid'], recid=argd['recid'], format=argd['format'], category=argd['category'], topic=argd['topic'], group_id=argd['group'], ln=argd['ln']) if isGuestUser(uid): body = create_guest_warning_box(argd['ln']) + body navtrail = '<a class="navtrail" href="%s/youraccount/display?ln=%s">'\ '%s</a>' navtrail %= (weburl, argd['ln'], _("Your Account")) navtrail_end = create_basket_navtrail(uid=uid, category=argd['category'], topic=argd['topic'], group=argd['group'], bskid=argd['bskid'], ln=argd['ln']) return page(title = _("Details and comments"), body = body, navtrail = navtrail + navtrail_end, uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd['of']) def write_comment(self, req, form): """Write a comment (just interface for writing)""" argd = wash_urlargd(form, {'bskid': (int, 0), 'recid': (int, 0), 'cmtid': (int, 0), 'category': (str, CFG_WEBBASKET_CATEGORIES['PRIVATE']), 'topic': (int, 0), - 'group': (int, 0) + 'group': (int, 0), + 'of' : (str, '') }) _ = gettext_set_language(argd['ln']) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE >= 1: return page_not_authorized(req, "../yourbaskets/write_comment", navmenuid = 'yourbaskets') (body, errors, warnings) = perform_request_write_comment( uid=uid, bskid=argd['bskid'], recid=argd['recid'], cmtid=argd['cmtid'], category=argd['category'], topic=argd['topic'], group_id=argd['group'], ln=argd['ln']) navtrail = '<a class="navtrail" href="%s/youraccount/display?ln=%s">'\ '%s</a>' navtrail %= (weburl, argd['ln'], _("Your Account")) navtrail_end = create_basket_navtrail(uid=uid, category=argd['category'], topic=argd['topic'], group=argd['group'], bskid=argd['bskid'], ln=argd['ln']) return page(title = _("Write a comment"), body = body, navtrail = navtrail + navtrail_end, uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd['of']) def save_comment(self, req, form): """Save comment on record in basket""" argd = wash_urlargd(form, {'bskid': (int, 0), 'recid': (int, 0), 'title': (str, ""), 'text': (str, ""), 'category': (str, CFG_WEBBASKET_CATEGORIES['PRIVATE']), 'topic': (int, 0), - 'group': (int, 0) + 'group': (int, 0), + 'of' : (str, '') }) _ = gettext_set_language(argd['ln']) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE >= 1: return page_not_authorized(req, "../yourbaskets/save_comment", navmenuid = 'yourbaskets') (errors_saving, infos) = perform_request_save_comment( uid=uid, bskid=argd['bskid'], recid=argd['recid'], title=argd['title'], text=argd['text'], ln=argd['ln']) (body, errors_displaying, warnings) = perform_request_display_item( uid=uid, bskid=argd['bskid'], recid=argd['recid'], format='hb', category=argd['category'], topic=argd['topic'], group_id=argd['group'], ln=argd['ln']) body = create_infobox(infos) + body errors = errors_saving.extend(errors_displaying) navtrail = '<a class="navtrail" href="%s/youraccount/display?ln=%s">'\ '%s</a>' navtrail %= (weburl, argd['ln'], _("Your Account")) navtrail_end = create_basket_navtrail(uid=uid, category=argd['category'], topic=argd['topic'], group=argd['group'], bskid=argd['bskid'], ln=argd['ln']) return page(title = _("Details and comments"), body = body, navtrail = navtrail + navtrail_end, uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd['of']) def delete_comment(self, req, form): """Delete a comment @param bskid: id of basket (int) @param recid: id of record (int) @param cmtid: id of comment (int) @param category: category (see webbasket_config) (str) @param topic: nb of topic currently displayed (int) @param group: id of group baskets currently displayed (int) @param ln: language""" argd = wash_urlargd(form, {'bskid': (int, 0), 'recid': (int, 0), 'cmtid': (int, 0), 'category': (str, CFG_WEBBASKET_CATEGORIES['PRIVATE']), 'topic': (int, 0), - 'group': (int, 0) + 'group': (int, 0), + 'of' : (str, '') }) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE >= 1: return page_not_authorized(req, "../yourbaskets/delete_comment", navmenuid = 'yourbaskets') _ = gettext_set_language(argd['ln']) url = weburl + '/yourbaskets/display_item?recid=%i&bskid=%i' % \ (argd['recid'], argd['bskid']) url += '&category=%s&topic=%i&group=%i&ln=%s' % \ (argd['category'], argd['topic'], argd['group'], argd['ln']) errors = perform_request_delete_comment(uid, argd['bskid'], argd['recid'], argd['cmtid']) if not(len(errors)): redirect_to_url(req, url) else: return page(uid = uid, title = '', body = '', language = argd['ln'], errors = errors, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd[of]) def add(self, req, form): """Add records to baskets. @param recid: list of records to add @param bskids: list of baskets to add records to. if not provided, will return a page where user can select baskets @param referer: URL of the referring page @param new_basket_name: add record to new basket @param new_topic_name: new basket goes into new topic @param create_in_topic: # of topic to put basket into @param ln: language""" argd = wash_urlargd(form, {'recid': (list, []), 'bskids': (list, []), 'referer': (str, ""), 'new_basket_name': (str, ""), 'new_topic_name': (str, ""), 'create_in_topic': (int, -1), + "of" : (str, '') }) _ = gettext_set_language(argd['ln']) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE >= 1: return page_not_authorized(req, "../yourbaskets/add", navmenuid = 'yourbaskets') if not argd['referer']: argd['referer'] = get_referer(req) (body, errors, warnings) = perform_request_add( uid=uid, recids=argd['recid'], bskids=argd['bskids'], referer=argd['referer'], new_basket_name=argd['new_basket_name'], new_topic_name=argd['new_topic_name'], create_in_topic=argd['create_in_topic'], ln=argd['ln']) if isGuestUser(uid): body = create_guest_warning_box(argd['ln']) + body if not(len(warnings)) : title = _("Your Baskets") else: title = _("Add records to baskets") navtrail = '<a class="navtrail" href="%s/youraccount/display?ln=%s">'\ '%s</a>' navtrail %= (weburl, argd['ln'], _("Your Account")) return page(title = title, body = body, navtrail = navtrail, uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd['of']) def delete(self, req, form): """Delete basket interface""" argd = wash_urlargd(form, {'bskid': (int, -1), 'confirmed': (int, 0), 'category': (str, CFG_WEBBASKET_CATEGORIES['PRIVATE']), 'topic': (int, 0), 'group': (int, 0), + 'of' : (str, '') }) _ = gettext_set_language(argd['ln']) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE >= 1: return page_not_authorized(req, "../yourbaskets/delete", navmenuid = 'yourbaskets') (body, errors, warnings)=perform_request_delete( uid=uid, bskid=argd['bskid'], confirmed=argd['confirmed'], category=argd['category'], selected_topic=argd['topic'], selected_group_id=argd['group'], ln=argd['ln']) if argd['confirmed']: url = weburl url += '/yourbaskets/display?category=%s&topic=%i&group=%i&ln=%s' %\ (argd['category'], argd['topic'], argd['group'], argd['ln']) redirect_to_url(req, url) else: navtrail = '<a class="navtrail" href="%s/youraccount/display?ln=%s">'\ '%s</a>' navtrail %= (weburl, argd['ln'], _("Your Account")) navtrail_end = create_basket_navtrail(uid=uid, category=argd['category'], topic=argd['topic'], group=argd['group'], bskid=argd['bskid'], ln=argd['ln']) if isGuestUser(uid): body = create_guest_warning_box(argd['ln']) + body return page(title = _("Delete a basket"), body = body, navtrail = navtrail + navtrail_end, uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd['of']) def modify(self, req, form): """Modify basket content interface (reorder, suppress record, etc.)""" argd = wash_urlargd(form, {'action': (str, ""), 'bskid': (int, -1), 'recid': (int, 0), 'category': (str, CFG_WEBBASKET_CATEGORIES['PRIVATE']), 'topic': (int, 0), 'group': (int, 0), + 'of' : (str, '') }) _ = gettext_set_language(argd['ln']) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE >= 1: return page_not_authorized(req, "../yourbaskets/modify", navmenuid = 'yourbaskets') url = weburl url += '/yourbaskets/display?category=%s&topic=%i&group=%i&ln=%s' %\ (argd['category'], argd['topic'], argd['group'], argd['ln']) if argd['action'] == CFG_WEBBASKET_ACTIONS['DELETE']: delete_record(uid, argd['bskid'], argd['recid']) redirect_to_url(req, url) elif argd['action'] == CFG_WEBBASKET_ACTIONS['UP']: move_record(uid, argd['bskid'], argd['recid'], argd['action']) redirect_to_url(req, url) elif argd['action'] == CFG_WEBBASKET_ACTIONS['DOWN']: move_record(uid, argd['bskid'], argd['recid'], argd['action']) redirect_to_url(req, url) elif argd['action'] == CFG_WEBBASKET_ACTIONS['COPY']: title = _("Copy record to basket") referer = get_referer(req) (body, errors, warnings) = perform_request_add(uid=uid, recids=argd['recid'], referer=referer, ln=argd['ln']) if isGuestUser(uid): body = create_guest_warning_box(argd['ln']) + body else: title = '' body = '' warnings = '' errors = [('ERR_WEBBASKET_UNDEFINED_ACTION',)] navtrail = '<a class="navtrail" href="%s/youraccount/display?ln=%s">'\ '%s</a>' navtrail %= (weburl, argd['ln'], _("Your Account")) navtrail_end = create_basket_navtrail(uid=uid, category=argd['category'], topic=argd['topic'], group=argd['group'], bskid=argd['bskid'], ln=argd['ln']) return page(title = title, body = body, navtrail = navtrail + navtrail_end, uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd['of']) def edit(self, req, form): """Edit basket interface""" argd = wash_urlargd(form, {'bskid': (int, 0), 'groups': (list, []), 'topic': (int, 0), 'add_group': (str, ""), 'group_cancel': (str, ""), 'submit': (str, ""), 'cancel': (str, ""), 'delete': (str, ""), 'new_name': (str, ""), 'new_topic': (int, -1), 'new_topic_name': (str, ""), 'new_group': (str, ""), 'external': (str, ""), + 'of' : (str, '') }) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE >= 1: return page_not_authorized(req, "../yourbaskets/edit", navmenuid = 'yourbaskets') _ = gettext_set_language(argd['ln']) if argd['cancel']: url = weburl + '/yourbaskets/display?category=%s&topic=%i&ln=%s' url %= (CFG_WEBBASKET_CATEGORIES['PRIVATE'], argd['topic'], argd['ln']) redirect_to_url(req, url) elif argd['delete']: url = weburl url += '/yourbaskets/delete?bskid=%i&category=%s&topic=%i&ln=%s' %\ (argd['bskid'], CFG_WEBBASKET_CATEGORIES['PRIVATE'], argd['topic'], argd['ln']) redirect_to_url(req, url) elif argd['add_group'] and not(argd['new_group']): body = perform_request_add_group(uid=uid, bskid=argd['bskid'], topic=argd['topic'], ln=argd['ln']) errors = [] warnings = [] elif (argd['add_group'] and argd['new_group']) or argd['group_cancel']: if argd['add_group']: perform_request_add_group(uid=uid, bskid=argd['bskid'], topic=argd['topic'], group_id=argd['new_group'], ln=argd['ln']) (body, errors, warnings) = perform_request_edit(uid=uid, bskid=argd['bskid'], topic=argd['topic'], ln=argd['ln']) elif argd['submit']: (body, errors, warnings) = perform_request_edit( uid=uid, bskid=argd['bskid'], topic=argd['topic'], new_name=argd['new_name'], new_topic=argd['new_topic'], new_topic_name=argd['new_topic_name'], groups=argd['groups'], external=argd['external'], ln=argd['ln']) if argd['new_topic'] != -1: argd['topic'] = argd['new_topic'] url = weburl + '/yourbaskets/display?category=%s&topic=%i&ln=%s' %\ (CFG_WEBBASKET_CATEGORIES['PRIVATE'], argd['topic'], argd['ln']) redirect_to_url(req, url) else: (body, errors, warnings) = perform_request_edit(uid=uid, bskid=argd['bskid'], topic=argd['topic'], ln=argd['ln']) navtrail = '<a class="navtrail" href="%s/youraccount/display?ln=%s">'\ '%s</a>' navtrail %= (weburl, argd['ln'], _("Your Account")) navtrail_end = create_basket_navtrail( uid=uid, category=CFG_WEBBASKET_CATEGORIES['PRIVATE'], topic=argd['topic'], group=0, bskid=argd['bskid'], ln=argd['ln']) if isGuestUser(uid): body = create_guest_warning_box(argd['ln']) + body return page(title = _("Edit basket"), body = body, navtrail = navtrail + navtrail_end, uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd['of']) def create_basket(self, req, form): """Create basket interface""" argd = wash_urlargd(form, {'new_basket_name': (str, ""), 'new_topic_name': (str, ""), 'create_in_topic': (int, -1), 'topic_number': (int, -1), + 'of' : (str, ''), }) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE >= 1: return page_not_authorized(req, "../yourbaskets/create_basket", navmenuid = 'yourbaskets') _ = gettext_set_language(argd['ln']) if argd['new_basket_name'] and \ (argd['new_topic_name'] or argd['create_in_topic'] != -1): topic = perform_request_create_basket( uid=uid, new_basket_name=argd['new_basket_name'], new_topic_name=argd['new_topic_name'], create_in_topic=argd['create_in_topic'], ln=argd['ln']) url = weburl + '/yourbaskets/display?category=%s&topic=%i&ln=%s' url %= (CFG_WEBBASKET_CATEGORIES['PRIVATE'], int(topic), argd['ln']) redirect_to_url(req, url) else: (body, errors, warnings) = perform_request_create_basket( uid=uid, new_basket_name=argd['new_basket_name'], new_topic_name=argd['new_topic_name'], create_in_topic=argd['create_in_topic'], topic_number=argd['topic_number'], ln=argd['ln']) navtrail = '<a class="navtrail" href="%s/youraccount/'\ 'display?ln=%s">%s</a>' navtrail %= (weburl, argd['ln'], _("Your Account")) if isGuestUser(uid): body = create_guest_warning_box(argd['ln']) + body return page(title = _("Create basket"), body = body, navtrail = navtrail, uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd['of']) def display_public(self, req, form): """Display public basket. If of is x** then output will be XML""" argd = wash_urlargd(form, {'bskid': (int, 0), 'of': (str, "hb"), }) _ = gettext_set_language(argd['ln']) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE == 2: return page_not_authorized(req, "../yourbaskets/display_public", navmenuid = 'yourbaskets') if argd['bskid'] == 0: # No given basket => display list of public baskets (body, errors, warnings) = perform_request_list_public_baskets( 0, 1, 1, argd['ln']) return page(title = _("List of public baskets"), body = body, navtrail = '', uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, - req = req) + req = req, + of = argd['of']) if len(argd['of']) and argd['of'][0]=='x': # XML output req.content_type = "text/xml" req.send_http_header() return perform_request_display_public(bskid=argd['bskid'], of=argd['of'], ln=argd['ln']) (body, errors, warnings) = perform_request_display_public( bskid=argd['bskid'], ln=argd['ln']) referer = get_referer(req) if 'list_public_basket' not in referer: referer = weburl + '/yourbaskets/list_public_baskets?ln=' + \ argd['ln'] navtrail = '<a class="navtrail" href="%s">%s</a>' % \ (referer, _("List of public baskets")) return page(title = _("Public basket"), body = body, navtrail = navtrail, uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd['of']) def list_public_baskets(self, req, form): """List of public baskets interface""" argd = wash_urlargd(form, {'inf_limit': (int, 0), 'order': (int, 1), 'asc': (int, 1), + 'of': (str, '') }) _ = gettext_set_language(argd['ln']) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE == 2: return page_not_authorized(req, "../yourbaskets/unsubscribe", navmenuid = 'yourbaskets') (body, errors, warnings) = perform_request_list_public_baskets( argd['inf_limit'], argd['order'], argd['asc'], argd['ln']) return page(title = _("List of public baskets"), body = body, navtrail = '', uid = uid, lastupdated = __lastupdated__, language = argd['ln'], errors = errors, warnings = warnings, req = req, - navmenuid = 'yourbaskets') + navmenuid = 'yourbaskets', + of = argd['of']) def unsubscribe(self, req, form): """unsubscribe to basket""" argd = wash_urlargd(form, {'bskid': (int, 0), + 'of': (str, '') }) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE == 2: return page_not_authorized(req, "../yourbaskets/unsubscribe", navmenuid = 'yourbaskets') perform_request_unsubscribe(uid, argd['bskid']) url = weburl + '/yourbaskets/display?category=%s&ln=%s' url %= (CFG_WEBBASKET_CATEGORIES['EXTERNAL'], argd['ln']) redirect_to_url(req, url) def subscribe(self, req, form): """subscribe to basket""" argd = wash_urlargd(form, {'bskid': (int, 0), + 'of': (str, '') }) uid = getUid(req) if uid == -1 or CFG_ACCESS_CONTROL_LEVEL_SITE == 2: return page_not_authorized(req, "../yourbaskets/subscribe", navmenuid = 'yourbaskets') errors = perform_request_subscribe(uid, argd['bskid']) if len(errors): return page(errors=errors, uid=uid, language=argd['ln'], body = '', title = '', req=req, navmenuid = 'yourbaskets') url = weburl + '/yourbaskets/display?category=%s&ln=%s' url %= (CFG_WEBBASKET_CATEGORIES['EXTERNAL'], argd['ln']) redirect_to_url(req, url)