app/soc/modules/core.py
author Mario Ferraro <fadinlight@gmail.com>
Sun, 15 Nov 2009 22:12:20 +0100
changeset 3093 d1be59b6b627
parent 2963 e03e203130a6
permissions -rw-r--r--
GMaps related JS changed to use new google namespace. Google is going to change permanently in the future the way to load its services, so better stay safe. Also this commit shows uses of the new melange.js module. Fixes Issue 634.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
     1
# Copyright 2009 the Melange authors.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
     2
#
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
     3
# Licensed under the Apache License, Version 2.0 (the "License");
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
     4
# you may not use this file except in compliance with the License.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
     5
# You may obtain a copy of the License at
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
     6
#
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
     7
#     http://www.apache.org/licenses/LICENSE-2.0
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
     8
#
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
     9
# Unless required by applicable law or agreed to in writing, software
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    10
# distributed under the License is distributed on an "AS IS" BASIS,
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    11
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    12
# See the License for the specific language governing permissions and
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    13
# limitations under the License.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    14
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    15
"""The Melange Core module.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    16
"""
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    17
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    18
__authors__ = [
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    19
  '"Sverre Rabbelier" <sverre@rabbelier.nl>',
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    20
  '"Lennard de Rijk" <ljvderijk@gmail.com>',
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    21
  ]
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    22
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    23
2833
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
    24
import logging
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
    25
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    26
from django.conf.urls import defaults
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    27
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    28
import settings
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    29
import soc.cache.sidebar
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    30
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    31
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    32
class Error(Exception):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    33
  """Error class for the callback module.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    34
  """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    35
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    36
  pass
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    37
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    38
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    39
class APIVersionMismatch(Error):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    40
  """Error raised when API version mismatches.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    41
  """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    42
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    43
  MISMATCH_MSG_FMT = "API mismatch, expected '%d', got '%d'."
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    44
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    45
  def __init__(self, expected, actual):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    46
    """Instantiates a new exception with a customized message.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    47
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    48
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    49
    msg = self.MISMATCH_MSG_FMT % (expected, actual)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    50
    super(APIVersionMismatch, self).__init__(msg)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    51
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    52
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    53
class MissingService(Error):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    54
  """Error raised when a required service is missing.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    55
  """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    56
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    57
  MISSING_SERVICE_FMT = "Required service '%s' is not registered, known: %s"
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    58
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    59
  def __init__(self, service, services):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    60
    """Instantiates a new exception with a customized message.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    61
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    62
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    63
    msg = self.MISSING_SERVICE_FMT % (service, services)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    64
    super(MissingService, self).__init__(msg)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    65
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    66
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    67
class MissingCapability(Error):
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    68
  """Error raised when a required capability is missing.
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    69
  """
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    70
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    71
  MISSING_CAPABILITY_FMT = "Required capability '%s' " + \
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    72
      "is not registered, known: %s"
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    73
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    74
  def __init__(self, capability, capabilities):
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    75
    """Instantiates a new exception with a customized message.
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    76
    """
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    77
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    78
    msg = self.MISSING_CAPABILITY_FMT % (capability, capabilities)
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    79
    super(MissingCapability, self).__init__(msg)
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    80
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    81
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    82
class NonUniqueService(Error):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    83
  """Error raised when a required service is missing.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    84
  """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    85
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
    86
  NON_UNIQUE_SERVICE_FMT = "Unique service '%s' called a 2nd time, known: %s."
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    87
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    88
  def __init__(self, service, services):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    89
    """Instantiates a new exception with a customized message.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    90
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    91
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    92
    msg = self.NON_UNIQUE_SERVICE_FMT % (service, services)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    93
    super(NonUniqueService, self).__init__(msg)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    94
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
    95
2962
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
    96
class AlreadyRegisteredRight(Error):
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
    97
  """Error raised when a right is registrated a second time
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
    98
  """
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
    99
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   100
  ALREADY_REGISTERED_RIGHT_FMT = "Tried to register right '%s' a second time."
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   101
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   102
  def __init__(self, right):
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   103
    """Instantiates a new exception with a customized message.
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   104
    """
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   105
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   106
    msg = self.ALREADY_REGISTERED_RIGHT_FMT % right
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   107
    super(AlreadyRegisteredRight, self).__init__(msg)
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   108
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   109
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   110
class Core(object):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   111
  """The core handler that controls the Melange API.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   112
  """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   113
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   114
  def __init__(self):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   115
    """Creates a new instance of the Core.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   116
    """
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   117
    
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   118
    # pylint: disable-msg=C0103
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   119
    self.API_VERSION = 1
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   120
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   121
    self.registered_callbacks = []
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   122
    self.capabilities = []
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   123
    self.services = []
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   124
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   125
    self.sitemap = []
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   126
    self.sidebar = []
2833
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   127
    self.per_request_cache = {}
2849
c0462a1d3958 Add self.in_request to Core and verify correct state
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2833
diff changeset
   128
    self.in_request = False
2955
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   129
    self.rights = {}
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   130
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   131
  ##
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   132
  ## internal
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   133
  ##
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   134
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   135
  def getService(self, callback, service):
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   136
    """Retrieves the specified service from the callback if supported.
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   137
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   138
    Args:
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   139
     callback: the callback to retrieve the capability from
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   140
     service: the service to retrieve
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   141
    """
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   142
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   143
    if not hasattr(callback, service):
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   144
      return False
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   145
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   146
    func = getattr(callback, service)
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   147
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   148
    if not callable(func):
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   149
      return False
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   150
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   151
    return func
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   152
2954
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   153
  def callService(self, service, unique, *args, **kwargs):
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   154
    """Calls the specified service on all callbacks.
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   155
    """
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   156
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   157
    if unique and (service in self.services):
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   158
      return
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   159
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   160
    results = []
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   161
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   162
    for callback in self.registered_callbacks:
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   163
      func = self.getService(callback, service)
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   164
      if not func:
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   165
        continue
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   166
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   167
      result = func(*args, **kwargs)
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   168
      results.append(result)
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   169
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   170
    self.services.append(service)
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   171
    return results
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   172
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   173
  ##
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   174
  ## Core code
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   175
  ##
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   176
2833
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   177
  def getRequestValue(self, key, default=None):
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   178
    """Gets a per-request value.
2908
391d57b91615 Document value store methods
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2849
diff changeset
   179
391d57b91615 Document value store methods
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2849
diff changeset
   180
    Args:
391d57b91615 Document value store methods
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2849
diff changeset
   181
      key: the key of the to be retrieved value
391d57b91615 Document value store methods
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2849
diff changeset
   182
      default: the default value (returned if no value is set)
2833
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   183
    """
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   184
2849
c0462a1d3958 Add self.in_request to Core and verify correct state
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2833
diff changeset
   185
    assert self.in_request
2833
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   186
    return self.per_request_value.get(key, default)
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   187
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   188
  def setRequestValue(self, key, value):
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   189
    """Sets a per-request value.
2908
391d57b91615 Document value store methods
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2849
diff changeset
   190
391d57b91615 Document value store methods
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2849
diff changeset
   191
    Args:
391d57b91615 Document value store methods
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2849
diff changeset
   192
      key: the key of the to be set value
391d57b91615 Document value store methods
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2849
diff changeset
   193
      value: the value that should be set
2833
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   194
    """
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   195
2849
c0462a1d3958 Add self.in_request to Core and verify correct state
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2833
diff changeset
   196
    assert self.in_request
2833
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   197
    self.per_request_value[key] = value
5aa891de5aa5 Add a new per-request value store to Core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2404
diff changeset
   198
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   199
  def getPatterns(self):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   200
    """Returns the Django patterns for this site.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   201
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   202
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   203
    self.callService('registerWithSitemap', True)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   204
    return defaults.patterns(None, *self.sitemap)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   205
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   206
  @soc.cache.sidebar.cache
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   207
  def getSidebar(self, id, user):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   208
    """Constructs a sidebar for the current user.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   209
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   210
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   211
    self.callService('registerWithSidebar', True)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   212
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   213
    sidebar = []
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   214
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   215
    for i in self.sidebar:
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   216
      menus = i(id, user)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   217
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   218
      for menu in (menus if menus else []):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   219
        sidebar.append(menu)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   220
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   221
    return sorted(sidebar, key=lambda x: x.get('group'))
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   222
2955
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   223
  def getRightsChecker(self, prefix):
2963
e03e203130a6 Fixed a typo in getRightsChecker docstring
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2962
diff changeset
   224
    """Returns a rights checker for the specified prefix.
2955
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   225
    """
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   226
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   227
    from soc.logic import rights as rights_logic
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   228
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   229
    self.callService('registerRights', True)
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   230
    return rights_logic.Checker(self.rights, prefix)
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   231
2954
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   232
  ###
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   233
  ### Core control code
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   234
  ###
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   235
  ### Called by other setup code to get the Core in a desired state.
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   236
  ###
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   237
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   238
  def startNewRequest(self, request):
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   239
    """Prepares core to handle a new request.
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   240
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   241
    Args:
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   242
      request: a Django HttpRequest object
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   243
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   244
2954
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   245
    self.in_request = True
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   246
    self.per_request_value = {}
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   247
    self.setRequestValue('request', request)
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   248
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   249
  def endRequest(self, request, optional):
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   250
    """Performs cleanup after current request.
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   251
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   252
    Args:
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   253
      request: a Django HttpRequest object
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   254
      optional: whether to noop when not in a request
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   255
    """
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   256
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   257
    # already cleaned up, as expected
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   258
    if optional and not self.in_request:
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   259
      return
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   260
2954
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   261
    old_request = self.getRequestValue('request')
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   262
    self.per_request_value = {}
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   263
    self.in_request = False
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   264
2954
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   265
    if id(old_request) != id(request):
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   266
      logging.error("ending request: \n'%s'\n != \n'%s'\n" % (
9ea3b04d929c Move around Core methods into more relevant sections
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2909
diff changeset
   267
          old_request, request))
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   268
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   269
  def registerModuleCallbacks(self):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   270
    """Retrieves all callbacks for the modules of this site.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   271
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   272
    Callbacks for modules without a version number or the wrong API_VERSION
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   273
    number are dropped.  They won't be called.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   274
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   275
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   276
    fmt = settings.MODULE_FMT
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   277
    modules = ['soc_core'] + settings.MODULES
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   278
    modules = [__import__(fmt % i, fromlist=['']) for i in modules]
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   279
2404
4f87bab3c6b3 Remove getCallback indirection in modules
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 2359
diff changeset
   280
    for callback_class in [i.Callback for i in modules]:
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   281
      if callback_class.API_VERSION != self.API_VERSION:
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   282
        raise APIVersionMismatch(self.API_VERSION,
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   283
                                 callback_class.API_VERSION)
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   284
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   285
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   286
      callback = callback_class(self)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   287
      self.registered_callbacks.append(callback)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   288
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   289
    return True
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   290
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   291
  ##
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   292
  ## Module code
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   293
  ##
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   294
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   295
  def registerCapability(self, capability):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   296
    """Registers the specified capability.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   297
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   298
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   299
    self.capabilities.append(capability)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   300
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   301
  def requireCapability(self, capability):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   302
    """Requires that the specified capability is present.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   303
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   304
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   305
    if capability in self.capabilities:
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   306
      return True
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   307
2359
d4de17ab9a1f Style and variable names fixes in soc.modules.core module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2333
diff changeset
   308
    raise MissingCapability(capability, self.capabilities)
2333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   309
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   310
  def requireService(self, service):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   311
    """Requires that the specified service has been called.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   312
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   313
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   314
    if service in self.services:
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   315
      return True
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   316
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   317
    raise MissingService(service, self.services)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   318
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   319
  def requireUniqueService(self, service):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   320
    """Requires that the specified service is called exactly once.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   321
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   322
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   323
    if service not in self.services:
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   324
      return True
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   325
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   326
    raise NonUniqueService(service, self.services)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   327
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   328
  def registerSitemapEntry(self, entries):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   329
    """Registers the specified entries with the sitemap.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   330
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   331
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   332
    self.sitemap.extend(entries)
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   333
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   334
  def registerSidebarEntry(self, entry):
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   335
    """Registers the specified entry with the sidebar.
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   336
    """
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   337
221482a54238 First step in the module design
Sverre Rabbelier <sverre@rabbelier.nl>
parents:
diff changeset
   338
    self.sidebar.append(entry)
2955
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   339
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   340
  def registerRight(self, key, value):
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   341
    """Registers the specified right.
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   342
    """
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   343
2962
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   344
    if key in self.rights:
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   345
      raise AlreadyRegisteredRight(key)
05014496b8f9 Throw an exception when registering an already registered right
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2955
diff changeset
   346
2955
b799af27440e Add document rights registration to core
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2954
diff changeset
   347
    self.rights[key] = value