web/request.py
author Julien Cristau <julien.cristau@logilab.fr>
Tue, 22 Jul 2014 17:45:38 +0200
changeset 9913 a74e9e43806a
parent 9884 5ad1c3a9c4a1
child 9897 fa44db7da2dc
permissions -rw-r--r--
[hooks/syncsession] try to remove cnx vs session confusion
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9229
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
     1
# copyright 2003-2013 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     2
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     3
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     4
# This file is part of CubicWeb.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     5
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     6
# CubicWeb is free software: you can redistribute it and/or modify it under the
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     7
# terms of the GNU Lesser General Public License as published by the Free
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     8
# Software Foundation, either version 2.1 of the License, or (at your option)
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
     9
# any later version.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    10
#
5424
8ecbcbff9777 replace logilab-common by CubicWeb in disclaimer
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5421
diff changeset
    11
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
5421
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    12
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    13
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    14
# details.
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    15
#
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    16
# You should have received a copy of the GNU Lesser General Public License along
8167de96c523 proper licensing information (LGPL-2.1). Hope I get it right this time.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5389
diff changeset
    17
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
5423
e15abfdcce38 backport default into stable: stable is now cw 3.8
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5408 5421
diff changeset
    18
"""abstract class for http request"""
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    19
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    20
__docformat__ = "restructuredtext en"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    21
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    22
import time
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    23
import random
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    24
import base64
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8480
diff changeset
    25
import urllib
8752
e19f4bba89cd Add CubicWebRequestBase.content (closes #2742453)
Julien Cristau <julien.cristau@logilab.fr>
parents: 8732
diff changeset
    26
from StringIO import StringIO
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7872
diff changeset
    27
from hashlib import sha1 # pylint: disable=E0611
7855
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
    28
from Cookie import SimpleCookie
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
    29
from calendar import timegm
8314
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
    30
from datetime import date, datetime
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    31
from urlparse import urlsplit
8316
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
    32
import httplib
6078
c08e74b0609e fix missing import in web.request
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 6064
diff changeset
    33
from warnings import warn
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    34
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    35
from rql.utils import rqlvar_maker
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    36
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    37
from logilab.common.decorators import cached
2613
5e19c2bb370e R [all] logilab.common 0.44 provides only deprecated
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 2559
diff changeset
    38
from logilab.common.deprecation import deprecated
2312
af4d8f75c5db use xml_escape
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2258
diff changeset
    39
from logilab.mtconverter import xml_escape
1801
672acc730ce5 ajax_replace_url becomes obsolete, req.build_ajax_replace_url should be used instead
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1718
diff changeset
    40
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
    41
from cubicweb.req import RequestSessionBase
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    42
from cubicweb.dbapi import DBAPIRequest
6063
17a53f6dea42 [request] js is defined in uilib, not utils
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6062
diff changeset
    43
from cubicweb.uilib import remove_html_tags, js
17a53f6dea42 [request] js is defined in uilib, not utils
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6062
diff changeset
    44
from cubicweb.utils import SizeConstrainedList, HTMLHead, make_uid
8941
7b26fe71404f drop xhtml content-type support (closes #2065651)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8889
diff changeset
    45
from cubicweb.view import TRANSITIONAL_DOCTYPE_NOEXT
1801
672acc730ce5 ajax_replace_url becomes obsolete, req.build_ajax_replace_url should be used instead
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1718
diff changeset
    46
from cubicweb.web import (INTERNAL_FIELD_VALUE, LOGGER, NothingToEdit,
5940
0e3ae19b181a [uilib] refactor json_dumps code organization
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5890
diff changeset
    47
                          RequestError, StatusResponse)
8316
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
    48
from cubicweb.web.httpcache import GMTOFFSET, get_validators
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
    49
from cubicweb.web.http_headers import Headers, Cookie, parseDateTime
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    50
662
6f867ab70e3d move _MARKER from appobject to web.request
sylvain.thenault@logilab.fr
parents: 610
diff changeset
    51
_MARKER = object()
6f867ab70e3d move _MARKER from appobject to web.request
sylvain.thenault@logilab.fr
parents: 610
diff changeset
    52
6564
ff9f7c566464 [request] fix ajax_replace_url which breaks if the url contains some quotes (that will be properly quoted but unquoted by the browser, breaking the js expression) by using a separated js function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6543
diff changeset
    53
def build_cb_uid(seed):
7879
9aae456abab5 [pylint] fix pylint detected errors and tweak it so that pylint -E will be much less verbose next time (+ update some copyrights on the way)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7872
diff changeset
    54
    sha = sha1('%s%s%s' % (time.time(), seed, random.random()))
6564
ff9f7c566464 [request] fix ajax_replace_url which breaks if the url contains some quotes (that will be properly quoted but unquoted by the browser, breaking the js expression) by using a separated js function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6543
diff changeset
    55
    return 'cb_%s' % (sha.hexdigest())
ff9f7c566464 [request] fix ajax_replace_url which breaks if the url contains some quotes (that will be properly quoted but unquoted by the browser, breaking the js expression) by using a separated js function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6543
diff changeset
    56
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    57
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    58
def list_form_param(form, param, pop=False):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    59
    """get param from form parameters and return its value as a list,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    60
    skipping internal markers if any
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    61
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    62
    * if the parameter isn't defined, return an empty list
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    63
    * if the parameter is a single (unicode) value, return a list
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    64
      containing that value
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    65
    * if the parameter is already a list or tuple, just skip internal
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    66
      markers
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    67
8238
087bb529035c [spelling] fix dictionnary -> dictionary typo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8177
diff changeset
    68
    if pop is True, the parameter is removed from the form dictionary
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    69
    """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    70
    if pop:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    71
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    72
            value = form.pop(param)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    73
        except KeyError:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    74
            return []
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    75
    else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    76
        value = form.get(param, ())
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    77
    if value is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    78
        value = ()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    79
    elif not isinstance(value, (list, tuple)):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    80
        value = [value]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    81
    return [v for v in value if v != INTERNAL_FIELD_VALUE]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    82
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
    83
9884
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    84
class Counter(object):
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    85
    """A picklable counter object, usable for e.g. page tab index count"""
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    86
    __slots__ = ('value',)
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    87
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    88
    def __init__(self, initialvalue=0):
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    89
        self.value = initialvalue
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    90
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    91
    def __call__(self):
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    92
        value = self.value
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    93
        self.value += 1
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    94
        return value
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    95
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    96
    def __getstate__(self):
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    97
        return {'value': self.value}
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    98
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
    99
    def __setstate__(self, state):
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
   100
        self.value = state['value']
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
   101
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   102
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
   103
class _CubicWebRequestBase(RequestSessionBase):
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   104
    """abstract HTTP request, should be extended according to the HTTP backend
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   105
    Immutable attributes that describe the received query and generic configuration
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   106
    """
8128
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8082
diff changeset
   107
    ajax_request = False # to be set to True by ajax controllers
1421
77ee26df178f doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents: 1173
diff changeset
   108
9549
a1f94c2d2a39 [web] Avoid using an empty dict as default parameter of 'CubicWebRequestBase'.
Damien Garaud <damien.garaud@logilab.fr>
parents: 9469
diff changeset
   109
    def __init__(self, vreg, https=False, form=None, headers=None):
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   110
        """
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   111
        :vreg: Vregistry,
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   112
        :https: boolean, s this a https request
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   113
        :form: Forms value
9549
a1f94c2d2a39 [web] Avoid using an empty dict as default parameter of 'CubicWebRequestBase'.
Damien Garaud <damien.garaud@logilab.fr>
parents: 9469
diff changeset
   114
        :headers: dict, request header
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   115
        """
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
   116
        super(_CubicWebRequestBase, self).__init__(vreg)
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   117
        #: (Boolean) Is this an https request.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   118
        self.https = https
8480
086cff6a306a [book] fix build warnings/errors. Closes #2430042
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8316
diff changeset
   119
        #: User interface property (vary with https) (see :ref:`uiprops`)
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   120
        self.uiprops = None
8480
086cff6a306a [book] fix build warnings/errors. Closes #2430042
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8316
diff changeset
   121
        #: url for serving datadir (vary with https) (see :ref:`resources`)
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   122
        self.datadir_url = None
8869
a46197b1696f [webconfig] fallback to default configs if https ones are not defined
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8732
diff changeset
   123
        if https and vreg.config.https_uiprops is not None:
5467
57372dbfd114 [https] fix resource urls in https version of a site: should use the https version as well to avoid warnings from the nrowser
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   124
            self.uiprops = vreg.config.https_uiprops
8869
a46197b1696f [webconfig] fallback to default configs if https ones are not defined
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8732
diff changeset
   125
        else:
a46197b1696f [webconfig] fallback to default configs if https ones are not defined
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8732
diff changeset
   126
            self.uiprops = vreg.config.uiprops
a46197b1696f [webconfig] fallback to default configs if https ones are not defined
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8732
diff changeset
   127
        if https and vreg.config.https_datadir_url is not None:
5467
57372dbfd114 [https] fix resource urls in https version of a site: should use the https version as well to avoid warnings from the nrowser
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   128
            self.datadir_url = vreg.config.https_datadir_url
57372dbfd114 [https] fix resource urls in https version of a site: should use the https version as well to avoid warnings from the nrowser
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   129
        else:
57372dbfd114 [https] fix resource urls in https version of a site: should use the https version as well to avoid warnings from the nrowser
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5444
diff changeset
   130
            self.datadir_url = vreg.config.datadir_url
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   131
        #: raw html headers that can be added from any view
7762
a3f9ba4d44eb [web] add option to make resources-concat optional (implements #1910615)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7660
diff changeset
   132
        self.html_headers = HTMLHead(self)
8314
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   133
        #: received headers
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   134
        self._headers_in = Headers()
9549
a1f94c2d2a39 [web] Avoid using an empty dict as default parameter of 'CubicWebRequestBase'.
Damien Garaud <damien.garaud@logilab.fr>
parents: 9469
diff changeset
   135
        if headers is not None:
a1f94c2d2a39 [web] Avoid using an empty dict as default parameter of 'CubicWebRequestBase'.
Damien Garaud <damien.garaud@logilab.fr>
parents: 9469
diff changeset
   136
            for k, v in headers.iteritems():
a1f94c2d2a39 [web] Avoid using an empty dict as default parameter of 'CubicWebRequestBase'.
Damien Garaud <damien.garaud@logilab.fr>
parents: 9469
diff changeset
   137
                self._headers_in.addRawHeader(k, v)
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   138
        #: form parameters
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   139
        self.setup_params(form)
8752
e19f4bba89cd Add CubicWebRequestBase.content (closes #2742453)
Julien Cristau <julien.cristau@logilab.fr>
parents: 8732
diff changeset
   140
        #: received body
e19f4bba89cd Add CubicWebRequestBase.content (closes #2742453)
Julien Cristau <julien.cristau@logilab.fr>
parents: 8732
diff changeset
   141
        self.content = StringIO()
9601
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
   142
        # set up language based on request headers or site default (we don't
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
   143
        # have a user yet, and might not get one)
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
   144
        self.set_user_language(None)
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   145
        #: dictionary that may be used to store request data that has to be
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   146
        #: shared among various components used to publish the request (views,
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   147
        #: controller, application...)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   148
        self.data = {}
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   149
        #:  search state: 'normal' or 'linksearch' (eg searching for an object
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   150
        #:  to create a relation with another)
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   151
        self.search_state = ('normal',)
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   152
        #: page id, set by htmlheader template
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   153
        self.pageid = None
3816
37b376bb4088 [web] set pageid at request instanciation rather than in htmlheader template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3275
diff changeset
   154
        self._set_pageid()
5155
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   155
        # prepare output header
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   156
        #: Header used for the final response
5155
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   157
        self.headers_out = Headers()
8312
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8309
diff changeset
   158
        #: HTTP status use by the final response
6c2119509fac [web] Move request handling logic into cubicweb application. (closes #2200684)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8309
diff changeset
   159
        self.status_out  = 200
3816
37b376bb4088 [web] set pageid at request instanciation rather than in htmlheader template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3275
diff changeset
   160
37b376bb4088 [web] set pageid at request instanciation rather than in htmlheader template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3275
diff changeset
   161
    def _set_pageid(self):
37b376bb4088 [web] set pageid at request instanciation rather than in htmlheader template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3275
diff changeset
   162
        """initialize self.pageid
37b376bb4088 [web] set pageid at request instanciation rather than in htmlheader template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3275
diff changeset
   163
        if req.form provides a specific pageid, use it, otherwise build a
37b376bb4088 [web] set pageid at request instanciation rather than in htmlheader template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3275
diff changeset
   164
        new one.
37b376bb4088 [web] set pageid at request instanciation rather than in htmlheader template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3275
diff changeset
   165
        """
37b376bb4088 [web] set pageid at request instanciation rather than in htmlheader template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3275
diff changeset
   166
        pid = self.form.get('pageid')
37b376bb4088 [web] set pageid at request instanciation rather than in htmlheader template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3275
diff changeset
   167
        if pid is None:
37b376bb4088 [web] set pageid at request instanciation rather than in htmlheader template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3275
diff changeset
   168
            pid = make_uid(id(self))
7374
3c9850d929e5 [web request] don't define pageid js variable when one is found in form parameters (eg, page ajax call)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7268
diff changeset
   169
            self.html_headers.define_var('pageid', pid, override=False)
3816
37b376bb4088 [web] set pageid at request instanciation rather than in htmlheader template
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 3275
diff changeset
   170
        self.pageid = pid
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   171
8155
c075950cc929 [bw compat] json_request setter is necessary for some cubes which has json_request (eg preview)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
   172
    def _get_json_request(self):
8128
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8082
diff changeset
   173
        warn('[3.15] self._cw.json_request is deprecated, use self._cw.ajax_request instead',
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8082
diff changeset
   174
             DeprecationWarning, stacklevel=2)
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8082
diff changeset
   175
        return self.ajax_request
8155
c075950cc929 [bw compat] json_request setter is necessary for some cubes which has json_request (eg preview)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
   176
    def _set_json_request(self, value):
c075950cc929 [bw compat] json_request setter is necessary for some cubes which has json_request (eg preview)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
   177
        warn('[3.15] self._cw.json_request is deprecated, use self._cw.ajax_request instead',
c075950cc929 [bw compat] json_request setter is necessary for some cubes which has json_request (eg preview)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
   178
             DeprecationWarning, stacklevel=2)
c075950cc929 [bw compat] json_request setter is necessary for some cubes which has json_request (eg preview)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
   179
        self.ajax_request = value
c075950cc929 [bw compat] json_request setter is necessary for some cubes which has json_request (eg preview)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8128
diff changeset
   180
    json_request = property(_get_json_request, _set_json_request)
8128
0a927fe4541b [controllers] deprecate JSonController and implement AjaxController / ajax-func registry (closes #2110265)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8082
diff changeset
   181
8309
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   182
    def base_url(self, secure=None):
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   183
        """return the root url of the instance
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   184
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   185
        secure = False -> base-url
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   186
        secure = None  -> https-url if req.https
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   187
        secure = True  -> https if it exist
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   188
        """
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   189
        if secure is None:
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   190
            secure = self.https
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   191
        base_url = None
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   192
        if secure:
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   193
            base_url = self.vreg.config.get('https-url')
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   194
        if base_url is None:
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
   195
            base_url = super(_CubicWebRequestBase, self).base_url()
8309
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   196
        return base_url
48ef505aa9f9 [request] gather all base_url logic in a single place (closes #2200756)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8271
diff changeset
   197
2792
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   198
    @property
6581
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6564
diff changeset
   199
    def authmode(self):
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   200
        """Authentification mode of the instance
8480
086cff6a306a [book] fix build warnings/errors. Closes #2430042
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8316
diff changeset
   201
        (see :ref:`WebServerConfig`)"""
6581
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6564
diff changeset
   202
        return self.vreg.config['auth-mode']
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6564
diff changeset
   203
8271
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   204
    # Various variable generator.
3bd9b317b1d8 [req, doc] add some documentation of CubicWebRequestBase attributes
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8239
diff changeset
   205
6581
4a3b264589dc [dbapi] enhanced web compatible request when using dbapi
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6564
diff changeset
   206
    @property
2801
7ef4c1c9266b fix syntax error
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2792
diff changeset
   207
    def varmaker(self):
4366
d51f28ba9399 fif inlined relation forms pb w/ new ajax forms.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4277
diff changeset
   208
        """the rql varmaker is exposed both as a property and as the
d51f28ba9399 fif inlined relation forms pb w/ new ajax forms.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4277
diff changeset
   209
        set_varmaker function since we've two use cases:
d51f28ba9399 fif inlined relation forms pb w/ new ajax forms.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4277
diff changeset
   210
d51f28ba9399 fif inlined relation forms pb w/ new ajax forms.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4277
diff changeset
   211
        * accessing the req.varmaker property to get a new variable name
d51f28ba9399 fif inlined relation forms pb w/ new ajax forms.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4277
diff changeset
   212
d51f28ba9399 fif inlined relation forms pb w/ new ajax forms.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4277
diff changeset
   213
        * calling req.set_varmaker() to ensure a varmaker is set for later ajax
d51f28ba9399 fif inlined relation forms pb w/ new ajax forms.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4277
diff changeset
   214
          calls sharing our .pageid
d51f28ba9399 fif inlined relation forms pb w/ new ajax forms.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4277
diff changeset
   215
        """
d51f28ba9399 fif inlined relation forms pb w/ new ajax forms.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4277
diff changeset
   216
        return self.set_varmaker()
d51f28ba9399 fif inlined relation forms pb w/ new ajax forms.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4277
diff changeset
   217
7266
f625097d1e99 [request] don't init tabindex unnecessarily, since it's added to page data which will makes an ajax call to unload_page_data necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7070
diff changeset
   218
    def next_tabindex(self):
6259
c3d98e4bee12 [request] memoize tabindex across ajax calls (on pageid) to avoid ui confusion
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6108
diff changeset
   219
        nextfunc = self.get_page_data('nexttabfunc')
c3d98e4bee12 [request] memoize tabindex across ajax calls (on pageid) to avoid ui confusion
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6108
diff changeset
   220
        if nextfunc is None:
9884
5ad1c3a9c4a1 [web/request] use a picklable Counter object for tab index counters
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9774
diff changeset
   221
            nextfunc = Counter(1)
6259
c3d98e4bee12 [request] memoize tabindex across ajax calls (on pageid) to avoid ui confusion
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6108
diff changeset
   222
            self.set_page_data('nexttabfunc', nextfunc)
7266
f625097d1e99 [request] don't init tabindex unnecessarily, since it's added to page data which will makes an ajax call to unload_page_data necessary
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7070
diff changeset
   223
        return nextfunc()
6259
c3d98e4bee12 [request] memoize tabindex across ajax calls (on pageid) to avoid ui confusion
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 6108
diff changeset
   224
4366
d51f28ba9399 fif inlined relation forms pb w/ new ajax forms.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4277
diff changeset
   225
    def set_varmaker(self):
2792
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   226
        varmaker = self.get_page_data('rql_varmaker')
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   227
        if varmaker is None:
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   228
            varmaker = rqlvar_maker()
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   229
            self.set_page_data('rql_varmaker', varmaker)
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   230
        return varmaker
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   231
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   232
    # input form parameters management ########################################
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   233
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   234
    # common form parameters which should be protected against html values
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   235
    # XXX can't add 'eid' for instance since it may be multivalued
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   236
    # dont put rql as well, if query contains < and > it will be corrupted!
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   237
    no_script_form_params = set(('vid',
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   238
                                 'etype',
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   239
                                 'vtitle', 'title',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   240
                                 '__message',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   241
                                 '__redirectvid', '__redirectrql'))
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   242
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   243
    def setup_params(self, params):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   244
        """WARNING: we're intentionaly leaving INTERNAL_FIELD_VALUE here
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   245
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   246
        subclasses should overrides to
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   247
        """
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   248
        self.form = {}
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   249
        if params is None:
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   250
            return
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   251
        encoding = self.encoding
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   252
        for param, val in params.iteritems():
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   253
            if isinstance(val, (tuple, list)):
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   254
                val = [unicode(x, encoding) for x in val]
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   255
                if len(val) == 1:
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   256
                    val = val[0]
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   257
            elif isinstance(val, str):
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   258
                val = unicode(val, encoding)
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   259
            if param in self.no_script_form_params and val:
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   260
                val = self.no_script_form_param(param, val)
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   261
            if param == '_cwmsgid':
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   262
                self.set_message_id(val)
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   263
            elif param == '__message':
7432
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   264
                warn('[3.13] __message in request parameter is deprecated (may '
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   265
                     'only be given to .build_url). Seeing this message usualy '
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   266
                     'means your application hold some <form> where you should '
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   267
                     'replace use of __message hidden input by form.set_message, '
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   268
                     'so new _cwmsgid mechanism is properly used',
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   269
                     DeprecationWarning)
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   270
                self.set_message(val)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   271
            else:
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   272
                self.form[param] = val
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   273
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   274
    def no_script_form_param(self, param, value):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   275
        """ensure there is no script in a user form param
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   276
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   277
        by default return a cleaned string instead of raising a security
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   278
        exception
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   279
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   280
        this method should be called on every user input (form at least) fields
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   281
        that are at some point inserted in a generated html page to protect
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   282
        against script kiddies
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   283
        """
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   284
        # safety belt for strange urls like http://...?vtitle=yo&vtitle=yo
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   285
        if isinstance(value, (list, tuple)):
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   286
            self.error('no_script_form_param got a list (%s). Who generated the URL ?',
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   287
                       repr(value))
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   288
            value = value[0]
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   289
        return remove_html_tags(value)
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   290
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   291
    def list_form_param(self, param, form=None, pop=False):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   292
        """get param from form parameters and return its value as a list,
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   293
        skipping internal markers if any
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   294
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   295
        * if the parameter isn't defined, return an empty list
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   296
        * if the parameter is a single (unicode) value, return a list
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   297
          containing that value
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   298
        * if the parameter is already a list or tuple, just skip internal
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   299
          markers
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   300
8238
087bb529035c [spelling] fix dictionnary -> dictionary typo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8177
diff changeset
   301
        if pop is True, the parameter is removed from the form dictionary
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   302
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   303
        if form is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   304
            form = self.form
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   305
        return list_form_param(form, param, pop)
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   306
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   307
    def reset_headers(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   308
        """used by AutomaticWebTest to clear html headers between tests on
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   309
        the same resultset
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   310
        """
7762
a3f9ba4d44eb [web] add option to make resources-concat optional (implements #1910615)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7660
diff changeset
   311
        self.html_headers = HTMLHead(self)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   312
        return self
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   313
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   314
    # web state helpers #######################################################
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   315
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   316
    @property
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   317
    def message(self):
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   318
        try:
7432
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   319
            return self.session.data.pop(self._msgid, u'')
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   320
        except AttributeError:
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   321
            try:
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   322
                return self._msg
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   323
            except AttributeError:
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   324
                return None
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   325
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   326
    def set_message(self, msg):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   327
        assert isinstance(msg, unicode)
9561
3bdf85279c67 [request] Make sure set_message() actually displays its given message (closes #3003425)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9549
diff changeset
   328
        self.reset_message()
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   329
        self._msg = msg
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   330
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   331
    def set_message_id(self, msgid):
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   332
        self._msgid = msgid
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   333
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   334
    @cached
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   335
    def redirect_message_id(self):
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   336
        return make_uid()
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   337
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   338
    def set_redirect_message(self, msg):
7432
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   339
        # TODO - this should probably be merged with append_to_redirect_message
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   340
        assert isinstance(msg, unicode)
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   341
        msgid = self.redirect_message_id()
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   342
        self.session.data[msgid] = msg
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   343
        return msgid
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   344
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   345
    def append_to_redirect_message(self, msg):
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   346
        msgid = self.redirect_message_id()
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   347
        currentmsg = self.session.data.get(msgid)
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   348
        if currentmsg is not None:
7432
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   349
            currentmsg = u'%s %s' % (currentmsg, msg)
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   350
        else:
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   351
            currentmsg = msg
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   352
        self.session.data[msgid] = currentmsg
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   353
        return msgid
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   354
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   355
    def reset_message(self):
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   356
        if hasattr(self, '_msg'):
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   357
            del self._msg
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   358
        if hasattr(self, '_msgid'):
9561
3bdf85279c67 [request] Make sure set_message() actually displays its given message (closes #3003425)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 9549
diff changeset
   359
            self.session.data.pop(self._msgid, u'')
4897
e402e0b32075 [web] start a new message system based on id of message stored in session's data
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4851
diff changeset
   360
            del self._msgid
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   361
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   362
    def update_search_state(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   363
        """update the current search state"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   364
        searchstate = self.form.get('__mode')
8541
5b6bc27ece6e [web] search state doesn't need cnx, remove useless test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8538
diff changeset
   365
        if not searchstate:
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   366
            searchstate = self.session.data.get('search_state', 'normal')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   367
        self.set_search_state(searchstate)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   368
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   369
    def set_search_state(self, searchstate):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   370
        """set a new search state"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   371
        if searchstate is None or searchstate == 'normal':
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   372
            self.search_state = (searchstate or 'normal',)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   373
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   374
            self.search_state = ('linksearch', searchstate.split(':'))
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   375
            assert len(self.search_state[-1]) == 4
8541
5b6bc27ece6e [web] search state doesn't need cnx, remove useless test
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8538
diff changeset
   376
        self.session.data['search_state'] = searchstate
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   377
1173
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   378
    def match_search_state(self, rset):
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   379
        """when searching an entity to create a relation, return True if entities in
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   380
        the given rset may be used as relation end
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   381
        """
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   382
        try:
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   383
            searchedtype = self.search_state[1][-1]
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   384
        except IndexError:
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   385
            return False # no searching for association
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   386
        for etype in rset.column_types(0):
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   387
            if etype != searchedtype:
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   388
                return False
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   389
        return True
8f123fd081f4 forgot to add that expected method (was a function in view.__init__)
sylvain.thenault@logilab.fr
parents: 1013
diff changeset
   390
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   391
    def update_breadcrumbs(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   392
        """stores the last visisted page in session data"""
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   393
        searchstate = self.session.data.get('search_state')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   394
        if searchstate == 'normal':
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   395
            breadcrumbs = self.session.data.get('breadcrumbs')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   396
            if breadcrumbs is None:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   397
                breadcrumbs = SizeConstrainedList(10)
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   398
                self.session.data['breadcrumbs'] = breadcrumbs
4864
e77d3e95872d [web req] check latest url in breadcrumbs is not the same as the current one to keep more valuable information
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   399
                breadcrumbs.append(self.url())
e77d3e95872d [web req] check latest url in breadcrumbs is not the same as the current one to keep more valuable information
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   400
            else:
e77d3e95872d [web req] check latest url in breadcrumbs is not the same as the current one to keep more valuable information
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   401
                url = self.url()
4974
025a491bad0c take care to empty breadcrumbs
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4868
diff changeset
   402
                if breadcrumbs and breadcrumbs[-1] != url:
4864
e77d3e95872d [web req] check latest url in breadcrumbs is not the same as the current one to keep more valuable information
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   403
                    breadcrumbs.append(url)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   404
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   405
    def last_visited_page(self):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   406
        breadcrumbs = self.session.data.get('breadcrumbs')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   407
        if breadcrumbs:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   408
            return breadcrumbs.pop()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   409
        return self.base_url()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   410
6062
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   411
    def user_rql_callback(self, rqlargs, *args, **kwargs):
7793
8a330017ca4d [doc] add some documentation in cubicweb.web.action
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7660
diff changeset
   412
        """register a user callback to execute some rql query, and return a URL
8a330017ca4d [doc] add some documentation in cubicweb.web.action
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7660
diff changeset
   413
        to call that callback which can be inserted in an HTML view.
6062
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   414
7793
8a330017ca4d [doc] add some documentation in cubicweb.web.action
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7660
diff changeset
   415
        `rqlargs` should be a tuple containing argument to give to the execute function.
8a330017ca4d [doc] add some documentation in cubicweb.web.action
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7660
diff changeset
   416
8a330017ca4d [doc] add some documentation in cubicweb.web.action
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7660
diff changeset
   417
        The first argument following rqlargs must be the message to be
8a330017ca4d [doc] add some documentation in cubicweb.web.action
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7660
diff changeset
   418
        displayed after the callback is called.
6062
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   419
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   420
        For other allowed arguments, see :meth:`user_callback` method
2792
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   421
        """
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   422
        def rqlexec(req, rql, args=None, key=None):
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   423
            req.execute(rql, args, key)
6062
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   424
        return self.user_callback(rqlexec, rqlargs, *args, **kwargs)
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   425
9568
e8b9a3d23ad9 [web/request] deprecate user_callback
Julien Cristau <julien.cristau@logilab.fr>
parents: 9561
diff changeset
   426
    @deprecated('[3.19] use a traditional ajaxfunc / controller')
6062
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   427
    def user_callback(self, cb, cbargs, *args, **kwargs):
7793
8a330017ca4d [doc] add some documentation in cubicweb.web.action
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7660
diff changeset
   428
        """register the given user callback and return a URL which can
8a330017ca4d [doc] add some documentation in cubicweb.web.action
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7660
diff changeset
   429
        be inserted in an HTML view. When the URL is accessed, the
8032
bcb87336c7d2 [doc] fix most of ReST compilation errors and warnings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7990
diff changeset
   430
        callback function will be called (as 'cb(req, \*cbargs)', and a
7793
8a330017ca4d [doc] add some documentation in cubicweb.web.action
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7660
diff changeset
   431
        message will be displayed in the web interface. The third
8a330017ca4d [doc] add some documentation in cubicweb.web.action
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 7660
diff changeset
   432
        positional argument must be 'msg', containing the message.
2792
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   433
6062
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   434
        You can specify the underlying js function to call using a 'jsfunc'
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   435
        named args, to one of :func:`userCallback`,
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   436
        ':func:`userCallbackThenUpdateUI`, ':func:`userCallbackThenReloadPage`
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   437
        (the default). Take care arguments may vary according to the used
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   438
        function.
2792
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   439
        """
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   440
        self.add_js('cubicweb.ajax.js')
6062
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   441
        jsfunc = kwargs.pop('jsfunc', 'userCallbackThenReloadPage')
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   442
        if 'msg' in kwargs:
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   443
            warn('[3.10] msg should be given as positional argument',
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   444
                 DeprecationWarning, stacklevel=2)
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   445
            args = (kwargs.pop('msg'),) + args
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   446
        assert not kwargs, 'dunno what to do with remaining kwargs: %s' % kwargs
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   447
        cbname = self.register_onetime_callback(cb, *cbargs)
f1a550102f5c [request] enhanced user[_rql]_callback method, allowing to call other js variant, eg one of userCallback, userCallbackThenUpdateUI, userCallbackThenReloadPage (the default). Also benefit from the new magic js object.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5940
diff changeset
   448
        return "javascript: %s" % getattr(js, jsfunc)(cbname, *args)
2792
135580d15d42 rename and move cw.RequestSessionMixIn to cw.req.RequestSessionBase; move some appobjects methods where they actually belong to
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2788
diff changeset
   449
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   450
    def register_onetime_callback(self, func, *args):
6564
ff9f7c566464 [request] fix ajax_replace_url which breaks if the url contains some quotes (that will be properly quoted but unquoted by the browser, breaking the js expression) by using a separated js function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6543
diff changeset
   451
        cbname = build_cb_uid(func.__name__)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   452
        def _cb(req):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   453
            try:
7990
a673d1d9a738 [diet] drop pre 3.6 API compatibility (but attempt to keep data cmopatibility). Closes #2017916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7894
diff changeset
   454
                return func(req, *args)
a673d1d9a738 [diet] drop pre 3.6 API compatibility (but attempt to keep data cmopatibility). Closes #2017916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7894
diff changeset
   455
            finally:
a673d1d9a738 [diet] drop pre 3.6 API compatibility (but attempt to keep data cmopatibility). Closes #2017916
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7894
diff changeset
   456
                self.unregister_callback(self.pageid, cbname)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   457
        self.set_page_data(cbname, _cb)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   458
        return cbname
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   459
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   460
    def unregister_callback(self, pageid, cbname):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   461
        assert pageid is not None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   462
        assert cbname.startswith('cb_')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   463
        self.info('unregistering callback %s for pageid %s', cbname, pageid)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   464
        self.del_page_data(cbname)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   465
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   466
    def clear_user_callbacks(self):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   467
        if self.session is not None: # XXX
8696
0bb18407c053 [toward py3k] rewrite dict.keys() and dict.values() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8695
diff changeset
   468
            for key in list(self.session.data):
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   469
                if key.startswith('cb_'):
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   470
                    del self.session.data[key]
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   471
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   472
    # web edition helpers #####################################################
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   473
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   474
    @cached # so it's writed only once
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   475
    def fckeditor_config(self):
7277
acd7f0e9f276 [etwist] Generates apache's mod_concat-like urls for js and css
Quentin Roquefort <roquefort.quentin@gmail.com>
parents: 7273
diff changeset
   476
        fckeditor_url = self.build_url('fckeditor/fckeditor.js')
acd7f0e9f276 [etwist] Generates apache's mod_concat-like urls for js and css
Quentin Roquefort <roquefort.quentin@gmail.com>
parents: 7273
diff changeset
   477
        self.add_js(fckeditor_url, localfile=False)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   478
        self.html_headers.define_var('fcklang', self.lang)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   479
        self.html_headers.define_var('fckconfigpath',
7070
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6581
diff changeset
   480
                                     self.data_url('cubicweb.fckcwconfig.js'))
1013
948a3882c94a add a use_fckeditor method on http request
sylvain.thenault@logilab.fr
parents: 940
diff changeset
   481
    def use_fckeditor(self):
948a3882c94a add a use_fckeditor method on http request
sylvain.thenault@logilab.fr
parents: 940
diff changeset
   482
        return self.vreg.config.fckeditor_installed() and self.property_value('ui.fckeditor')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   483
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   484
    def edited_eids(self, withtype=False):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   485
        """return a list of edited eids"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   486
        yielded = False
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   487
        # warning: use .keys since the caller may change `form`
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   488
        form = self.form
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   489
        try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   490
            eids = form['eid']
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   491
        except KeyError:
4155
80cc9c6ddcf0 NothingToEdit is not a ValidationError, simplify
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4154
diff changeset
   492
            raise NothingToEdit(self._('no selected entities'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   493
        if isinstance(eids, basestring):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   494
            eids = (eids,)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   495
        for peid in eids:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   496
            if withtype:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   497
                typekey = '__type:%s' % peid
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   498
                assert typekey in form, 'no entity type specified'
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   499
                yield peid, form[typekey]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   500
            else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   501
                yield peid
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   502
            yielded = True
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   503
        if not yielded:
4155
80cc9c6ddcf0 NothingToEdit is not a ValidationError, simplify
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4154
diff changeset
   504
            raise NothingToEdit(self._('no selected entities'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   505
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   506
    # minparams=3 by default: at least eid, __type, and some params to change
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   507
    def extract_entity_params(self, eid, minparams=3):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   508
        """extract form parameters relative to the given eid"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   509
        params = {}
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   510
        eid = str(eid)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   511
        form = self.form
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   512
        for param in form:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   513
            try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   514
                name, peid = param.split(':', 1)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   515
            except ValueError:
7639
5c9e94a09e97 [web form] avoid mis-formated warning for _cw_fields
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7536
diff changeset
   516
                if not param.startswith('__') and param not in ('eid', '_cw_fields'):
6079
bd7e3042791e fix the fix
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 6078
diff changeset
   517
                    self.warning('param %s mis-formatted', param)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   518
                continue
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   519
            if peid == eid:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   520
                value = form[param]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   521
                if value == INTERNAL_FIELD_VALUE:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   522
                    value = None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   523
                params[name] = value
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   524
        params['eid'] = eid
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   525
        if len(params) < minparams:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   526
            raise RequestError(self._('missing parameters for entity %s') % eid)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   527
        return params
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   528
4277
35cd057339b2 turn all the stuff used to handle 'generic relations' in forms into proper
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4252
diff changeset
   529
    # XXX this should go to the GenericRelationsField. missing edition cancel protocol.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   530
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   531
    def remove_pending_operations(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   532
        """shortcut to clear req's pending_{delete,insert} entries
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   533
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   534
        This is needed when the edition is completed (whether it's validated
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   535
        or cancelled)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   536
        """
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   537
        self.session.data.pop('pending_insert', None)
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   538
        self.session.data.pop('pending_delete', None)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   539
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   540
    def cancel_edition(self, errorurl):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   541
        """remove pending operations and `errorurl`'s specific stored data
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   542
        """
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   543
        self.session.data.pop(errorurl, None)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   544
        self.remove_pending_operations()
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   545
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   546
    # high level methods for HTTP headers management ##########################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   547
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   548
    # must be cached since login/password are popped from the form dictionary
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   549
    # and this method may be called multiple times during authentication
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   550
    @cached
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   551
    def get_authorization(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   552
        """Parse and return the Authorization header"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   553
        if self.authmode == "cookie":
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   554
            try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   555
                user = self.form.pop("__login")
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   556
                passwd = self.form.pop("__password", '')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   557
                return user, passwd.encode('UTF8')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   558
            except KeyError:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   559
                self.debug('no login/password in form params')
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   560
                return None, None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   561
        else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   562
            return self.header_authorization()
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   563
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   564
    def get_cookie(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   565
        """retrieve request cookies, returns an empty cookie if not found"""
7855
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   566
        # XXX use http_headers implementation
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   567
        try:
7855
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   568
            return SimpleCookie(self.get_header('Cookie'))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   569
        except KeyError:
7855
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   570
            return SimpleCookie()
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   571
7855
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   572
    def set_cookie(self, name, value, maxage=300, expires=None, secure=False):
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   573
        """set / update a cookie
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   574
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   575
        by default, cookie will be available for the next 5 minutes.
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   576
        Give maxage = None to have a "session" cookie expiring when the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   577
        client close its browser
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   578
        """
7855
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   579
        if isinstance(name, SimpleCookie):
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   580
            warn('[3.13] set_cookie now takes name and value as two first '
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   581
                 'argument, not anymore cookie object and name',
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   582
                 DeprecationWarning, stacklevel=2)
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   583
            secure = name[value]['secure']
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   584
            name, value = value, name[value].value
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   585
        if maxage: # don't check is None, 0 may be specified
7858
f91255a3b2c2 [web request] fix stupid error that gone through the review
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7855
diff changeset
   586
            assert expires is None, 'both max age and expires cant be specified'
7855
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   587
            expires = maxage + time.time()
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   588
        elif expires:
8176
eff4fe02ec64 [req cookie] fix remove_cookie expires which was leading to expires computed to 0 in set_cookie and the Cookie class interpret that has no expires. Closes #2154654
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8081
diff changeset
   589
            # we don't want to handle times before the EPOCH (cause bug on
eff4fe02ec64 [req cookie] fix remove_cookie expires which was leading to expires computed to 0 in set_cookie and the Cookie class interpret that has no expires. Closes #2154654
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8081
diff changeset
   590
            # windows). Also use > and not >= else expires == 0 and Cookie think
eff4fe02ec64 [req cookie] fix remove_cookie expires which was leading to expires computed to 0 in set_cookie and the Cookie class interpret that has no expires. Closes #2154654
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8081
diff changeset
   591
            # that means no expire...
eff4fe02ec64 [req cookie] fix remove_cookie expires which was leading to expires computed to 0 in set_cookie and the Cookie class interpret that has no expires. Closes #2154654
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8081
diff changeset
   592
            assert expires + GMTOFFSET > date(1970, 1, 1)
7855
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   593
            expires = timegm((expires + GMTOFFSET).timetuple())
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   594
        else:
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   595
            expires = None
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   596
        # make sure cookie is set on the correct path
7870
1a1e04163cde [test] unicode name/value in cookie makes tests failing (SimpleCookie then suppose it's a dict...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7858
diff changeset
   597
        cookie = Cookie(str(name), str(value), self.base_url_path(),
1a1e04163cde [test] unicode name/value in cookie makes tests failing (SimpleCookie then suppose it's a dict...)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7858
diff changeset
   598
                        expires=expires, secure=secure)
7855
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   599
        self.headers_out.addHeader('Set-cookie', cookie)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   600
7855
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   601
    def remove_cookie(self, name, bwcompat=None):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   602
        """remove a cookie by expiring it"""
7855
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   603
        if bwcompat is not None:
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   604
            warn('[3.13] remove_cookie now take only a name as argument',
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   605
                 DeprecationWarning, stacklevel=2)
54283a5b7afc [web request] fix cookie 'expires' formating (closes #1953945)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7793
diff changeset
   606
            name = bwcompat
8176
eff4fe02ec64 [req cookie] fix remove_cookie expires which was leading to expires computed to 0 in set_cookie and the Cookie class interpret that has no expires. Closes #2154654
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8081
diff changeset
   607
        self.set_cookie(name, '', maxage=0, expires=date(2000, 1, 1))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   608
8611
51068fe1e39a [web] allow configuration of the Content-disposition value
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8610
diff changeset
   609
    def set_content_type(self, content_type, filename=None, encoding=None,
8612
3bb96935a6b9 [web] use `inline` `Content-Disposition` by default (closes #2535734)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8611
diff changeset
   610
                         disposition='inline'):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   611
        """set output content type for this request. An optional filename
8611
51068fe1e39a [web] allow configuration of the Content-disposition value
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8610
diff changeset
   612
        may be given.
51068fe1e39a [web] allow configuration of the Content-disposition value
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8610
diff changeset
   613
51068fe1e39a [web] allow configuration of the Content-disposition value
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8610
diff changeset
   614
        The disposition argument may be `attachement` or `inline` as specified
51068fe1e39a [web] allow configuration of the Content-disposition value
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8610
diff changeset
   615
        for the Content-disposition HTTP header. The disposition parameter have
51068fe1e39a [web] allow configuration of the Content-disposition value
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8610
diff changeset
   616
        no effect if no filename are specified.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   617
        """
6353
b622602f8e9d don't add another encoding if already present in content-type
Alexandre Fayolle <alexandre.fayolle@logilab.fr>
parents: 6259
diff changeset
   618
        if content_type.startswith('text/') and ';charset=' not in content_type:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   619
            content_type += ';charset=' + (encoding or self.encoding)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   620
        self.set_header('content-type', content_type)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   621
        if filename:
8611
51068fe1e39a [web] allow configuration of the Content-disposition value
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8610
diff changeset
   622
            header = [disposition]
8610
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   623
            unicode_filename = None
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8480
diff changeset
   624
            try:
8610
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   625
                ascii_filename = filename.encode('ascii')
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8480
diff changeset
   626
            except UnicodeEncodeError:
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8480
diff changeset
   627
                # fallback filename for very old browser
8610
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   628
                unicode_filename = filename
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   629
                ascii_filename = filename.encode('ascii', 'ignore')
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   630
            # escape " and \
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   631
            # see http://greenbytes.de/tech/tc2231/#attwithfilenameandextparamescaped
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   632
            ascii_filename = ascii_filename.replace('\x5c', r'\\').replace('"', r'\"')
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   633
            header.append('filename="%s"' % ascii_filename)
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   634
            if unicode_filename is not None:
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8480
diff changeset
   635
                # encoded filename according RFC5987
8610
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   636
                urlquoted_filename = urllib.quote(unicode_filename.encode('utf-8'), '')
b1145ad53999 [downloadable] fix filename HTTP header for simple name with space (closes #2535715)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8600
diff changeset
   637
                header.append("filename*=utf-8''" + urlquoted_filename)
8600
d74addac92bb [downloadable] fix filename in HTTP header (closes #2522325, #2522324)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8480
diff changeset
   638
            self.set_header('content-disposition', ';'.join(header))
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   639
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   640
    # high level methods for HTML headers management ##########################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   641
2258
79bc598c6411 when request is a json request, bind on 'ajax-loaded' instead of document.ready()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2255
diff changeset
   642
    def add_onload(self, jscode):
4851
e55bdd10421e remove deprecation warning introduced by add_onload api change
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 4719
diff changeset
   643
        self.html_headers.add_onload(jscode)
2258
79bc598c6411 when request is a json request, bind on 'ajax-loaded' instead of document.ready()
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2255
diff changeset
   644
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   645
    def add_js(self, jsfiles, localfile=True):
8032
bcb87336c7d2 [doc] fix most of ReST compilation errors and warnings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7990
diff changeset
   646
        """specify a list of JS files to include in the HTML headers.
bcb87336c7d2 [doc] fix most of ReST compilation errors and warnings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7990
diff changeset
   647
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   648
        :param jsfiles: a JS filename or a list of JS filenames
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   649
        :param localfile: if True, the default data dir prefix is added to the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   650
                          JS filename
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   651
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   652
        if isinstance(jsfiles, basestring):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   653
            jsfiles = (jsfiles,)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   654
        for jsfile in jsfiles:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   655
            if localfile:
7070
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6581
diff changeset
   656
                jsfile = self.data_url(jsfile)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   657
            self.html_headers.add_js(jsfile)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   658
4860
cedb6afdb7da [web] fix #736332: iespec functionality for add_css
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4719
diff changeset
   659
    def add_css(self, cssfiles, media=u'all', localfile=True, ieonly=False,
cedb6afdb7da [web] fix #736332: iespec functionality for add_css
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4719
diff changeset
   660
                iespec=u'[if lt IE 8]'):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   661
        """specify a CSS file to include in the HTML headers
5290
15846058378b [doc/book] fix a bit the request chapter, add autodoc
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4984
diff changeset
   662
8032
bcb87336c7d2 [doc] fix most of ReST compilation errors and warnings
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7990
diff changeset
   663
        :param cssfiles: a CSS filename or a list of CSS filenames.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   664
        :param media: the CSS's media if necessary
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   665
        :param localfile: if True, the default data dir prefix is added to the
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   666
                          CSS filename
4860
cedb6afdb7da [web] fix #736332: iespec functionality for add_css
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4719
diff changeset
   667
        :param ieonly: True if this css is specific to IE
cedb6afdb7da [web] fix #736332: iespec functionality for add_css
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4719
diff changeset
   668
        :param iespec: conditional expression that will be used around
cedb6afdb7da [web] fix #736332: iespec functionality for add_css
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4719
diff changeset
   669
                       the css inclusion. cf:
cedb6afdb7da [web] fix #736332: iespec functionality for add_css
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4719
diff changeset
   670
                       http://msdn.microsoft.com/en-us/library/ms537512(VS.85).aspx
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   671
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   672
        if isinstance(cssfiles, basestring):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   673
            cssfiles = (cssfiles,)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   674
        if ieonly:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   675
            if self.ie_browser():
4860
cedb6afdb7da [web] fix #736332: iespec functionality for add_css
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4719
diff changeset
   676
                extraargs = [iespec]
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   677
                add_css = self.html_headers.add_ie_css
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   678
            else:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   679
                return # no need to do anything on non IE browsers
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   680
        else:
4860
cedb6afdb7da [web] fix #736332: iespec functionality for add_css
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4719
diff changeset
   681
            extraargs = []
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   682
            add_css = self.html_headers.add_css
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   683
        for cssfile in cssfiles:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   684
            if localfile:
7070
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6581
diff changeset
   685
                cssfile = self.data_url(cssfile)
4860
cedb6afdb7da [web] fix #736332: iespec functionality for add_css
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 4719
diff changeset
   686
            add_css(cssfile, media, *extraargs)
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   687
5713
605f571198eb [web] ajax_replace_url superseed build_ajax_replace_url, more generic and relying on the json controller (closes #750090)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5685
diff changeset
   688
    def ajax_replace_url(self, nodeid, replacemode='replace', **extraparams):
5290
15846058378b [doc/book] fix a bit the request chapter, add autodoc
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4984
diff changeset
   689
        """builds an ajax url that will replace nodeid's content
15846058378b [doc/book] fix a bit the request chapter, add autodoc
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4984
diff changeset
   690
1801
672acc730ce5 ajax_replace_url becomes obsolete, req.build_ajax_replace_url should be used instead
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1718
diff changeset
   691
        :param nodeid: the dom id of the node to replace
672acc730ce5 ajax_replace_url becomes obsolete, req.build_ajax_replace_url should be used instead
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1718
diff changeset
   692
        :param replacemode: defines how the replacement should be done.
5290
15846058378b [doc/book] fix a bit the request chapter, add autodoc
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 4984
diff changeset
   693
5713
605f571198eb [web] ajax_replace_url superseed build_ajax_replace_url, more generic and relying on the json controller (closes #750090)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5685
diff changeset
   694
          Possible values are :
605f571198eb [web] ajax_replace_url superseed build_ajax_replace_url, more generic and relying on the json controller (closes #750090)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5685
diff changeset
   695
          - 'replace' to replace the node's content with the generated HTML
605f571198eb [web] ajax_replace_url superseed build_ajax_replace_url, more generic and relying on the json controller (closes #750090)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5685
diff changeset
   696
          - 'swap' to replace the node itself with the generated HTML
605f571198eb [web] ajax_replace_url superseed build_ajax_replace_url, more generic and relying on the json controller (closes #750090)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5685
diff changeset
   697
          - 'append' to append the generated HTML to the node's content
605f571198eb [web] ajax_replace_url superseed build_ajax_replace_url, more generic and relying on the json controller (closes #750090)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5685
diff changeset
   698
605f571198eb [web] ajax_replace_url superseed build_ajax_replace_url, more generic and relying on the json controller (closes #750090)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5685
diff changeset
   699
        Arbitrary extra named arguments may be given, they will be included as
605f571198eb [web] ajax_replace_url superseed build_ajax_replace_url, more generic and relying on the json controller (closes #750090)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5685
diff changeset
   700
        parameters of the generated url.
1801
672acc730ce5 ajax_replace_url becomes obsolete, req.build_ajax_replace_url should be used instead
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1718
diff changeset
   701
        """
6564
ff9f7c566464 [request] fix ajax_replace_url which breaks if the url contains some quotes (that will be properly quoted but unquoted by the browser, breaking the js expression) by using a separated js function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6543
diff changeset
   702
        # define a function in headers and use it in the link to avoid url
ff9f7c566464 [request] fix ajax_replace_url which breaks if the url contains some quotes (that will be properly quoted but unquoted by the browser, breaking the js expression) by using a separated js function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6543
diff changeset
   703
        # unescaping pb: browsers give the js expression to the interpreter
ff9f7c566464 [request] fix ajax_replace_url which breaks if the url contains some quotes (that will be properly quoted but unquoted by the browser, breaking the js expression) by using a separated js function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6543
diff changeset
   704
        # after having url unescaping the content. This may make appear some
ff9f7c566464 [request] fix ajax_replace_url which breaks if the url contains some quotes (that will be properly quoted but unquoted by the browser, breaking the js expression) by using a separated js function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6543
diff changeset
   705
        # quote or other special characters that will break the js expression.
5713
605f571198eb [web] ajax_replace_url superseed build_ajax_replace_url, more generic and relying on the json controller (closes #750090)
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5685
diff changeset
   706
        extraparams.setdefault('fname', 'view')
8730
d4d9f33fd01b [web/request] Prune extraneous 'pageid' from generated ajax URL parameters (closes #2758130)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 8728
diff changeset
   707
        # remove pageid from the generated URL as it's forced as a parameter
d4d9f33fd01b [web/request] Prune extraneous 'pageid' from generated ajax URL parameters (closes #2758130)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 8728
diff changeset
   708
        # to the loadxhtml call below.
d4d9f33fd01b [web/request] Prune extraneous 'pageid' from generated ajax URL parameters (closes #2758130)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 8728
diff changeset
   709
        extraparams.pop('pageid', None)
8728
75be9de9d68e [web] Use the new '/ajax' URL path to access the AjaxController (closes #2758254)
Rémi Cardona <remi.cardona@logilab.fr>
parents: 8612
diff changeset
   710
        url = self.build_url('ajax', **extraparams)
6564
ff9f7c566464 [request] fix ajax_replace_url which breaks if the url contains some quotes (that will be properly quoted but unquoted by the browser, breaking the js expression) by using a separated js function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6543
diff changeset
   711
        cbname = build_cb_uid(url[:50])
7515
e1ba23fdcf2d closes #1484510: ajax_replace_url should propagate page id (until an underlying api does it automatically
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7411
diff changeset
   712
        # think to propagate pageid. XXX see https://www.cubicweb.org/ticket/1753121
7660
a1506b5306cc closes #1826543: error on some ajax_replace_url call
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7639
diff changeset
   713
        jscode = u'function %s() { $("#%s").%s; }' % (
7515
e1ba23fdcf2d closes #1484510: ajax_replace_url should propagate page id (until an underlying api does it automatically
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7411
diff changeset
   714
            cbname, nodeid, js.loadxhtml(url, {'pageid': self.pageid},
e1ba23fdcf2d closes #1484510: ajax_replace_url should propagate page id (until an underlying api does it automatically
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 7411
diff changeset
   715
                                         'get', replacemode))
6564
ff9f7c566464 [request] fix ajax_replace_url which breaks if the url contains some quotes (that will be properly quoted but unquoted by the browser, breaking the js expression) by using a separated js function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6543
diff changeset
   716
        self.html_headers.add_post_inline_script(jscode)
ff9f7c566464 [request] fix ajax_replace_url which breaks if the url contains some quotes (that will be properly quoted but unquoted by the browser, breaking the js expression) by using a separated js function
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 6543
diff changeset
   717
        return "javascript: %s()" % cbname
1801
672acc730ce5 ajax_replace_url becomes obsolete, req.build_ajax_replace_url should be used instead
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 1718
diff changeset
   718
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   719
    # urls/path management ####################################################
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   720
7432
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   721
    def build_url(self, *args, **kwargs):
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   722
        """return an absolute URL using params dictionary key/values as URL
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   723
        parameters. Values are automatically URL quoted, and the
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   724
        publishing method to use may be specified or will be guessed.
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   725
        """
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   726
        if '__message' in kwargs:
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   727
            msg = kwargs.pop('__message')
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   728
            kwargs['_cwmsgid'] = self.set_redirect_message(msg)
9022
a1cee6915ea3 [req] drop from_controller on non WebRequest object (Closes #2901079)
pierre-yves
parents: 8974
diff changeset
   729
        if not args:
a1cee6915ea3 [req] drop from_controller on non WebRequest object (Closes #2901079)
pierre-yves
parents: 8974
diff changeset
   730
            method = 'view'
a1cee6915ea3 [req] drop from_controller on non WebRequest object (Closes #2901079)
pierre-yves
parents: 8974
diff changeset
   731
            if (self.from_controller() == 'view'
a1cee6915ea3 [req] drop from_controller on non WebRequest object (Closes #2901079)
pierre-yves
parents: 8974
diff changeset
   732
                and not '_restpath' in kwargs):
a1cee6915ea3 [req] drop from_controller on non WebRequest object (Closes #2901079)
pierre-yves
parents: 8974
diff changeset
   733
                method = self.relative_path(includeparams=False) or 'view'
a1cee6915ea3 [req] drop from_controller on non WebRequest object (Closes #2901079)
pierre-yves
parents: 8974
diff changeset
   734
            args = (method,)
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
   735
        return super(_CubicWebRequestBase, self).build_url(*args, **kwargs)
7432
cab99ccdb774 [ui messages, xss] Start migration towards use of _msgid instead of __message (prone to XSS injection) closes #1698245
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 7412
diff changeset
   736
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   737
    def url(self, includeparams=True):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   738
        """return currently accessed url"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   739
        return self.base_url() + self.relative_path(includeparams)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   740
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   741
    def selected(self, url):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   742
        """return True if the url is equivalent to currently accessed url"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   743
        reqpath = self.relative_path().lower()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   744
        baselen = len(self.base_url())
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   745
        return (reqpath == url[baselen:].lower())
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   746
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   747
    def base_url_prepend_host(self, hostname):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   748
        protocol, roothost = urlsplit(self.base_url())[:2]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   749
        if roothost.startswith('www.'):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   750
            roothost = roothost[4:]
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   751
        return '%s://%s.%s' % (protocol, hostname, roothost)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   752
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   753
    def base_url_path(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   754
        """returns the absolute path of the base url"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   755
        return urlsplit(self.base_url())[2]
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   756
7070
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6581
diff changeset
   757
    def data_url(self, relpath):
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6581
diff changeset
   758
        """returns the absolute path for a data resouce"""
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6581
diff changeset
   759
        return self.datadir_url + relpath
5f8e52d722c5 [web] provide a data_url() method on req and get_rid of explicit datadir_url usage (#1438736)
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 6581
diff changeset
   760
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   761
    @cached
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   762
    def from_controller(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   763
        """return the id (string) of the controller issuing the request"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   764
        controller = self.relative_path(False).split('/', 1)[0]
8696
0bb18407c053 [toward py3k] rewrite dict.keys() and dict.values() (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8695
diff changeset
   765
        if controller in self.vreg['controllers']:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   766
            return controller
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   767
        return 'view'
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   768
9229
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   769
    def is_client_cache_valid(self):
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   770
        """check if a client cached page exists (as specified in request
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   771
        headers) and is still usable.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   772
9229
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   773
        Return False if the page has to be calculated, else True.
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   774
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   775
        Some response cache headers may be set by this method.
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   776
        """
8316
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   777
        modified = True
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   778
        if self.get_header('Cache-Control') not in ('max-age=0', 'no-cache'):
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   779
            # Here, we search for any invalid 'not modified' condition
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   780
            # see http://www.w3.org/Protocols/rfc2616/rfc2616-sec13.html#sec13.3
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   781
            validators = get_validators(self._headers_in)
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   782
            if validators: # if we have no
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   783
                modified = any(func(val, self.headers_out) for func, val in validators)
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   784
        # Forge expected response
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   785
        if modified:
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   786
            if 'Expires' not in self.headers_out:
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   787
                # Expires header seems to be required by IE7 -- Are you sure ?
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   788
                self.add_header('Expires', 'Sat, 01 Jan 2000 00:00:00 GMT')
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   789
            if self.http_method() == 'HEAD':
9229
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   790
                self.status_out = 200
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   791
                # XXX replace by True once validate_cache bw compat method is dropped
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   792
                return 200
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   793
            # /!\ no raise, the function returns and we keep processing the request
8316
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   794
        else:
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   795
            # overwrite headers_out to forge a brand new not-modified response
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   796
            self.headers_out = self._forge_cached_headers()
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   797
            if self.http_method() in ('HEAD', 'GET'):
9229
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   798
                self.status_out = httplib.NOT_MODIFIED
8316
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   799
            else:
9229
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   800
                self.status_out = httplib.PRECONDITION_FAILED
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   801
            # XXX replace by True once validate_cache bw compat method is dropped
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   802
            return self.status_out
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   803
        # XXX replace by False once validate_cache bw compat method is dropped
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   804
        return None
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   805
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   806
    @deprecated('[3.18] use .is_client_cache_valid() method instead')
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   807
    def validate_cache(self):
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   808
        """raise a `StatusResponse` exception if a cached page along the way
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   809
        exists and is still usable.
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   810
        """
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   811
        status_code = self.is_client_cache_valid()
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   812
        if status_code is not None:
739ae5366bed [web] stop using deprecated StatusResponse. Closes #3098215
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9138
diff changeset
   813
            raise StatusResponse(status_code)
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   814
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   815
    # abstract methods to override according to the web front-end #############
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   816
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   817
    def http_method(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   818
        """returns 'POST', 'GET', 'HEAD', etc."""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   819
        raise NotImplementedError()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   820
8316
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   821
    def _forge_cached_headers(self):
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   822
        # overwrite headers_out to forge a brand new not-modified response
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   823
        headers = Headers()
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   824
        for header in (
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   825
            # Required from sec 10.3.5:
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   826
            'date', 'etag', 'content-location', 'expires',
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   827
            'cache-control', 'vary',
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   828
            # Others:
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   829
            'server', 'proxy-authenticate', 'www-authenticate', 'warning'):
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   830
            value = self._headers_in.getRawHeaders(header)
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   831
            if value is not None:
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   832
                headers.setRawHeaders(header, value)
d5b1b75805dd [cache] factorize _validate_cache() logic implemented in wsgi and twisted handlers
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 8314
diff changeset
   833
        return headers
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   834
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   835
    def relative_path(self, includeparams=True):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   836
        """return the normalized path of the request (ie at least relative
2476
1294a6bdf3bf application -> instance where it makes sense
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2315
diff changeset
   837
        to the instance's root, but some other normalization may be needed
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   838
        so that the returned path may be used to compare to generated urls
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   839
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   840
        :param includeparams:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   841
           boolean indicating if GET form parameters should be kept in the path
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   842
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   843
        raise NotImplementedError()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   844
8314
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   845
    # http headers ############################################################
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   846
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   847
    ### incoming headers
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   848
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   849
    def get_header(self, header, default=None, raw=True):
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   850
        """return the value associated with the given input header, raise
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   851
        KeyError if the header is not set
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   852
        """
8314
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   853
        if raw:
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   854
            return self._headers_in.getRawHeaders(header, [default])[0]
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   855
        return self._headers_in.getHeader(header, default)
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   856
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   857
    def header_accept_language(self):
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   858
        """returns an ordered list of preferred languages"""
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   859
        acceptedlangs = self.get_header('Accept-Language', raw=False) or {}
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   860
        for lang, _ in sorted(acceptedlangs.iteritems(), key=lambda x: x[1],
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   861
                              reverse=True):
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   862
            lang = lang.split('-')[0]
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   863
            yield lang
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   864
8314
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   865
    def header_if_modified_since(self):
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   866
        """If the HTTP header If-modified-since is set, return the equivalent
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   867
        date time value (GMT), else return None
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   868
        """
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   869
        mtime = self.get_header('If-modified-since', raw=False)
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   870
        if mtime:
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   871
            # :/ twisted is returned a localized time stamp
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   872
            return datetime.fromtimestamp(mtime) + GMTOFFSET
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   873
        return None
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   874
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   875
    ### outcoming headers
5155
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   876
    def set_header(self, header, value, raw=True):
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   877
        """set an output HTTP header"""
5155
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   878
        if raw:
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   879
            # adding encoded header is important, else page content
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   880
            # will be reconverted back to unicode and apart unefficiency, this
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   881
            # may cause decoding problem (e.g. when downloading a file)
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   882
            self.headers_out.setRawHeaders(header, [str(value)])
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   883
        else:
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   884
            self.headers_out.setHeader(header, value)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   885
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   886
    def add_header(self, header, value):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   887
        """add an output HTTP header"""
5155
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   888
        # adding encoded header is important, else page content
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   889
        # will be reconverted back to unicode and apart unefficiency, this
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   890
        # may cause decoding problem (e.g. when downloading a file)
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   891
        self.headers_out.addRawHeader(header, str(value))
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   892
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   893
    def remove_header(self, header):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   894
        """remove an output HTTP header"""
5155
1dea6e0fdfc1 Switched from TwistedWeb2 to TwistedWeb
Adrien Chauve <adrien.chauve@logilab.fr>
parents: 4984
diff changeset
   895
        self.headers_out.removeHeader(header)
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   896
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   897
    def header_authorization(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   898
        """returns a couple (auth-type, auth-value)"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   899
        auth = self.get_header("Authorization", None)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   900
        if auth:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   901
            scheme, rest = auth.split(' ', 1)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   902
            scheme = scheme.lower()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   903
            try:
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   904
                assert scheme == "basic"
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   905
                user, passwd = base64.decodestring(rest).split(":", 1)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   906
                # XXX HTTP header encoding: use email.Header?
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   907
                return user.decode('UTF8'), passwd
8695
358d8bed9626 [toward-py3k] rewrite to "except AnException as exc:" (part of #2711624)
Nicolas Chauvat <nicolas.chauvat@logilab.fr>
parents: 8645
diff changeset
   908
            except Exception as ex:
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   909
                self.debug('bad authorization %s (%s: %s)',
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   910
                           auth, ex.__class__.__name__, ex)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   911
        return None, None
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   912
1716
b12d9e22bac3 basic support for http Accept header (untested)
sylvain.thenault@logilab.fr
parents: 1560
diff changeset
   913
    def parse_accept_header(self, header):
7164
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
   914
        """returns an ordered list of accepted values"""
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
   915
        try:
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
   916
            value_parser, value_sort_key = ACCEPT_HEADER_PARSER[header.lower()]
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
   917
        except KeyError:
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
   918
            value_parser = value_sort_key = None
1716
b12d9e22bac3 basic support for http Accept header (untested)
sylvain.thenault@logilab.fr
parents: 1560
diff changeset
   919
        accepteds = self.get_header(header, '')
7164
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
   920
        values = _parse_accept_header(accepteds, value_parser, value_sort_key)
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
   921
        return (raw_value for (raw_value, parsed_value, score) in values)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   922
8941
7b26fe71404f drop xhtml content-type support (closes #2065651)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8889
diff changeset
   923
    @deprecated('[3.17] demote_to_html is deprecated as we always serve html')
3094
978ed8c2c0e4 [googlemap] #344872 set request content-type to text/html
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2650
diff changeset
   924
    def demote_to_html(self):
978ed8c2c0e4 [googlemap] #344872 set request content-type to text/html
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2650
diff changeset
   925
        """helper method to dynamically set request content type to text/html
978ed8c2c0e4 [googlemap] #344872 set request content-type to text/html
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2650
diff changeset
   926
978ed8c2c0e4 [googlemap] #344872 set request content-type to text/html
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2650
diff changeset
   927
        The global doctype and xmldec must also be changed otherwise the browser
978ed8c2c0e4 [googlemap] #344872 set request content-type to text/html
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2650
diff changeset
   928
        will display '<[' at the beginning of the page
978ed8c2c0e4 [googlemap] #344872 set request content-type to text/html
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2650
diff changeset
   929
        """
8941
7b26fe71404f drop xhtml content-type support (closes #2065651)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8889
diff changeset
   930
        pass
7b26fe71404f drop xhtml content-type support (closes #2065651)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8889
diff changeset
   931
7187
496f51b92154 [views] extend HTMLStream API to be able to change doctype / xmldecl
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7164
diff changeset
   932
8314
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   933
    # xml doctype #############################################################
cfd6ab461849 [Web-Request] Use rich header (closes #2204164)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 8312
diff changeset
   934
8941
7b26fe71404f drop xhtml content-type support (closes #2065651)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8889
diff changeset
   935
    def set_doctype(self, doctype, reset_xmldecl=None):
7187
496f51b92154 [views] extend HTMLStream API to be able to change doctype / xmldecl
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7164
diff changeset
   936
        """helper method to dynamically change page doctype
496f51b92154 [views] extend HTMLStream API to be able to change doctype / xmldecl
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7164
diff changeset
   937
496f51b92154 [views] extend HTMLStream API to be able to change doctype / xmldecl
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7164
diff changeset
   938
        :param doctype: the new doctype, e.g. '<!DOCTYPE html>'
496f51b92154 [views] extend HTMLStream API to be able to change doctype / xmldecl
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7164
diff changeset
   939
        """
8941
7b26fe71404f drop xhtml content-type support (closes #2065651)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8889
diff changeset
   940
        if reset_xmldecl is not None:
7b26fe71404f drop xhtml content-type support (closes #2065651)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8889
diff changeset
   941
            warn('[3.17] reset_xmldecl is deprecated as we only serve html',
7b26fe71404f drop xhtml content-type support (closes #2065651)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8889
diff changeset
   942
                 DeprecationWarning, stacklevel=2)
9138
bc6e25dbfd04 [web doctype] don't give through reset_xmldecl to avoid double deprecation warning
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 8974
diff changeset
   943
        self.main_stream.set_doctype(doctype)
3094
978ed8c2c0e4 [googlemap] #344872 set request content-type to text/html
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 2650
diff changeset
   944
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   945
    # page data management ####################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   946
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   947
    def get_page_data(self, key, default=None):
5683
ca2badf54858 [request] fix typo
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5505
diff changeset
   948
        """return value associated to `key` in current page data"""
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   949
        page_data = self.session.data.get(self.pageid)
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   950
        if page_data is None:
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   951
            return default
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   952
        return page_data.get(key, default)
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   953
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   954
    def set_page_data(self, key, value):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   955
        """set value associated to `key` in current page data"""
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   956
        self.html_headers.add_unload_pagedata()
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   957
        page_data = self.session.data.setdefault(self.pageid, {})
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   958
        page_data[key] = value
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   959
        self.session.data[self.pageid] = page_data
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   960
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   961
    def del_page_data(self, key=None):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   962
        """remove value associated to `key` in current page data
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   963
        if `key` is None, all page data will be cleared
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   964
        """
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   965
        if key is None:
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   966
            self.session.data.pop(self.pageid, None)
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   967
        else:
5223
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   968
            try:
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   969
                del self.session.data[self.pageid][key]
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   970
            except KeyError:
6abd6e3599f4 #773448: refactor session and 'no connection' handling, by introducing proper web session. We should now be able to see page even when no anon is configured, and be redirected to the login form as soon as one tries to do a query.
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5155
diff changeset
   971
                pass
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   972
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   973
    # user-agent detection ####################################################
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   974
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   975
    @cached
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   976
    def useragent(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   977
        return self.get_header('User-Agent', None)
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   978
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   979
    def ie_browser(self):
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   980
        useragent = self.useragent()
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   981
        return useragent and 'MSIE' in useragent
1426
379261551578 remove trailing spaces
sylvain.thenault@logilab.fr
parents: 1421
diff changeset
   982
8941
7b26fe71404f drop xhtml content-type support (closes #2065651)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8889
diff changeset
   983
    @deprecated('[3.17] xhtml_browser is deprecated (xhtml is no longer served)')
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   984
    def xhtml_browser(self):
2558
81c8b5312f9c move test on force-html-content-type to xhtml_browser method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2556
diff changeset
   985
        """return True if the browser is considered as xhtml compatible.
81c8b5312f9c move test on force-html-content-type to xhtml_browser method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2556
diff changeset
   986
81c8b5312f9c move test on force-html-content-type to xhtml_browser method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2556
diff changeset
   987
        If the instance is configured to always return text/html and not
81c8b5312f9c move test on force-html-content-type to xhtml_browser method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2556
diff changeset
   988
        application/xhtml+xml, this method will always return False, even though
81c8b5312f9c move test on force-html-content-type to xhtml_browser method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2556
diff changeset
   989
        this is semantically different
81c8b5312f9c move test on force-html-content-type to xhtml_browser method
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 2556
diff changeset
   990
        """
8941
7b26fe71404f drop xhtml content-type support (closes #2065651)
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 8889
diff changeset
   991
        return False
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
   992
1421
77ee26df178f doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents: 1173
diff changeset
   993
    def html_content_type(self):
77ee26df178f doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents: 1173
diff changeset
   994
        return 'text/html'
77ee26df178f doc type handling refactoring: do the ext substitution at the module level
sylvain.thenault@logilab.fr
parents: 1173
diff changeset
   995
9601
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
   996
    def set_user_language(self, user):
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
   997
        vreg = self.vreg
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
   998
        if user is not None:
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
   999
            try:
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1000
                # 1. user-specified language
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1001
                lang = vreg.typed_value('ui.language', user.properties['ui.language'])
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1002
                self.set_language(lang)
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1003
                return
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1004
            except KeyError:
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1005
                pass
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1006
        if vreg.config.get('language-negociation', False):
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1007
            # 2. http accept-language
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1008
            for lang in self.header_accept_language():
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1009
                if lang in self.translations:
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1010
                    self.set_language(lang)
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1011
                    return
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1012
        # 3. site's default language
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1013
        self.set_default_language(vreg)
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1014
7164
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1015
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1016
class DBAPICubicWebRequestBase(_CubicWebRequestBase, DBAPIRequest):
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1017
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1018
    def set_session(self, session):
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1019
        """method called by the session handler when the user is authenticated
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1020
        or an anonymous connection is open
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1021
        """
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1022
        super(CubicWebRequestBase, self).set_session(session)
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1023
        # set request language
9601
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1024
        self.set_user_language(session.user)
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1025
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1026
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1027
def _cnx_func(name):
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1028
    def proxy(req, *args, **kwargs):
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1029
        return getattr(req.cnx, name)(*args, **kwargs)
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1030
    return proxy
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1031
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1032
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1033
class ConnectionCubicWebRequestBase(_CubicWebRequestBase):
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1034
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1035
    def __init__(self, vreg, https=False, form=None, headers={}):
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1036
        """"""
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1037
        self.cnx = None
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1038
        self.session = None
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1039
        self.vreg = vreg
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1040
        try:
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1041
            # no vreg or config which doesn't handle translations
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1042
            self.translations = vreg.config.translations
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1043
        except AttributeError:
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1044
            self.translations = {}
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1045
        super(ConnectionCubicWebRequestBase, self).__init__(vreg, https=https,
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1046
                                                       form=form, headers=headers)
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1047
        from cubicweb.dbapi import DBAPISession, _NeedAuthAccessMock
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1048
        self.session = DBAPISession(None)
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1049
        self.cnx = self.user = _NeedAuthAccessMock()
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1050
9774
b7b71be569cf deprecate get/set_shared_data API
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9601
diff changeset
  1051
    @property
b7b71be569cf deprecate get/set_shared_data API
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9601
diff changeset
  1052
    def transaction_data(self):
b7b71be569cf deprecate get/set_shared_data API
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9601
diff changeset
  1053
        return self.cnx.transaction_data
b7b71be569cf deprecate get/set_shared_data API
Aurelien Campeas <aurelien.campeas@logilab.fr>
parents: 9601
diff changeset
  1054
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1055
    def set_cnx(self, cnx):
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1056
        self.cnx = cnx
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1057
        self.session = cnx._session
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1058
        self._set_user(cnx.user)
9601
e5a80bd337e8 [web] fix language negotiation
Julien Cristau <julien.cristau@logilab.fr>
parents: 9582
diff changeset
  1059
        self.set_user_language(cnx.user)
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1060
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1061
    def execute(self, *args, **kwargs):
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1062
        rset = self.cnx.execute(*args, **kwargs)
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1063
        rset.req = self
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1064
        return rset
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1065
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1066
    def set_default_language(self, vreg):
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1067
        # XXX copy from dbapi
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1068
        try:
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1069
            lang = vreg.property_value('ui.language')
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1070
        except Exception: # property may not be registered
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1071
            lang = 'en'
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1072
        try:
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1073
            self.set_language(lang)
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1074
        except KeyError:
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1075
            # this occurs usually during test execution
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1076
            self._ = self.__ = unicode
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1077
            self.pgettext = lambda x, y: unicode(y)
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1078
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9402
diff changeset
  1079
    entity_metas = _cnx_func('entity_metas')
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1080
    source_defs = _cnx_func('source_defs')
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1081
    get_shared_data = _cnx_func('get_shared_data')
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1082
    set_shared_data = _cnx_func('set_shared_data')
9469
032825bbacab [multi-sources-removal] Drop entities.source column
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 9402
diff changeset
  1083
    describe = _cnx_func('describe') # deprecated XXX
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1084
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1085
    # server-side service call #################################################
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1086
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1087
    def call_service(self, regid, **kwargs):
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1088
        return self.cnx.call_service(regid, **kwargs)
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1089
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1090
    # entities cache management ###############################################
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1091
9582
46ed25d38fe2 Move entity cache from web.request.ConnectionCubicWebRequestBase to repoapi.ClientConnection
Julien Cristau <julien.cristau@logilab.fr>
parents: 9568
diff changeset
  1092
    entity_cache = _cnx_func('entity_cache')
46ed25d38fe2 Move entity cache from web.request.ConnectionCubicWebRequestBase to repoapi.ClientConnection
Julien Cristau <julien.cristau@logilab.fr>
parents: 9568
diff changeset
  1093
    set_entity_cache = _cnx_func('set_entity_cache')
46ed25d38fe2 Move entity cache from web.request.ConnectionCubicWebRequestBase to repoapi.ClientConnection
Julien Cristau <julien.cristau@logilab.fr>
parents: 9568
diff changeset
  1094
    cached_entities = _cnx_func('cached_entities')
46ed25d38fe2 Move entity cache from web.request.ConnectionCubicWebRequestBase to repoapi.ClientConnection
Julien Cristau <julien.cristau@logilab.fr>
parents: 9568
diff changeset
  1095
    drop_entity_cache = _cnx_func('drop_entity_cache')
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1096
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1097
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1098
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1099
9071
46885bfa4150 Use new repoapi for the web stack
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9063
diff changeset
  1100
CubicWebRequestBase = ConnectionCubicWebRequestBase
5444
f7fdb5dd82f6 [webconfig] introduce property sheets. Use them to replace external_resources
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 5426
diff changeset
  1101
7164
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1102
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1103
## HTTP-accept parsers / utilies ##############################################
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1104
def _mimetype_sort_key(accept_info):
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1105
    """accepted mimetypes must be sorted by :
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1106
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1107
    1/ highest score first
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1108
    2/ most specific mimetype first, e.g. :
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1109
       - 'text/html level=1' is more specific 'text/html'
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1110
       - 'text/html' is more specific than 'text/*'
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1111
       - 'text/*' itself more specific than '*/*'
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1112
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1113
    """
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1114
    raw_value, (media_type, media_subtype, media_type_params), score = accept_info
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1115
    # FIXME: handle '+' in media_subtype ? (should xhtml+xml have a
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1116
    # higher precedence than xml ?)
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1117
    if media_subtype == '*':
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1118
        score -= 0.0001
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1119
    if media_type == '*':
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1120
        score -= 0.0001
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1121
    return 1./score, media_type, media_subtype, 1./(1+len(media_type_params))
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1122
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1123
def _charset_sort_key(accept_info):
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1124
    """accepted mimetypes must be sorted by :
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1125
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1126
    1/ highest score first
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1127
    2/ most specific charset first, e.g. :
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1128
       - 'utf-8' is more specific than '*'
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1129
    """
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1130
    raw_value, value, score = accept_info
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1131
    if value == '*':
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1132
        score -= 0.0001
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1133
    return 1./score, value
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1134
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1135
def _parse_accept_header(raw_header, value_parser=None, value_sort_key=None):
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1136
    """returns an ordered list accepted types
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1137
7273
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1138
    :param value_parser: a function to parse a raw accept chunk. If None
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1139
    is provided, the function defaults to identity. If a function is provided,
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1140
    it must accept 2 parameters ``value`` and ``other_params``. ``value`` is
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1141
    the value found before the first ';', `other_params` is a dictionary
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1142
    built from all other chunks after this first ';'
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1143
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1144
    :param value_sort_key: a key function to sort values found in the accept
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1145
    header. This function will be passed a 3-tuple
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1146
    (raw_value, parsed_value, score). If None is provided, the default
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1147
    sort_key is 1./score
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1148
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1149
    :return: a list of 3-tuple (raw_value, parsed_value, score),
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1150
    ordered by score. ``parsed_value`` will be the return value of
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1151
    ``value_parser(raw_value)``
7164
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1152
    """
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1153
    if value_sort_key is None:
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1154
        value_sort_key = lambda infos: 1./infos[-1]
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1155
    values = []
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1156
    for info in raw_header.split(','):
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1157
        score = 1.0
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1158
        other_params = {}
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1159
        try:
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1160
            value, infodef = info.split(';', 1)
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1161
        except ValueError:
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1162
            value = info
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1163
        else:
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1164
            for info in infodef.split(';'):
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1165
                try:
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1166
                    infokey, infoval = info.split('=')
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1167
                    if infokey == 'q': # XXX 'level'
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1168
                        score = float(infoval)
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1169
                        continue
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1170
                except ValueError:
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1171
                    continue
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1172
                other_params[infokey] = infoval
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1173
        parsed_value = value_parser(value, other_params) if value_parser else value
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1174
        values.append( (value.strip(), parsed_value, score) )
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1175
    values.sort(key=value_sort_key)
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1176
    return values
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1177
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1178
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1179
def _mimetype_parser(value, other_params):
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1180
    """return a 3-tuple
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1181
    (type, subtype, type_params) corresponding to the mimetype definition
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1182
    e.g. : for 'text/*', `mimetypeinfo` will be ('text', '*', {}), for
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1183
    'text/html;level=1', `mimetypeinfo` will be ('text', '*', {'level': '1'})
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1184
    """
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1185
    try:
7273
a949fc438029 [etwist] refactor child resources management
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7187
diff changeset
  1186
        media_type, media_subtype = value.strip().split('/', 1)
7164
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1187
    except ValueError: # safety belt : '/' should always be present
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1188
        media_type = value.strip()
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1189
        media_subtype = '*'
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1190
    return (media_type, media_subtype, other_params)
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1191
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1192
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1193
ACCEPT_HEADER_PARSER = {
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1194
    'accept': (_mimetype_parser, _mimetype_sort_key),
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1195
    'accept-charset': (None, _charset_sort_key),
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1196
    }
93a19c1831aa [http] implement 1587305: provide better implementation of Accept header parsing + tests
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents: 7070
diff changeset
  1197
0
b97547f5f1fa Showtime !
Adrien Di Mascio <Adrien.DiMascio@logilab.fr>
parents:
diff changeset
  1198
from cubicweb import set_log_methods
9063
383d45cf61fa [webrequest] introduce an alternative implementation using the repoapi
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 9041
diff changeset
  1199
set_log_methods(_CubicWebRequestBase, LOGGER)