addons-server/apps/amo/__init__.py

86 строки
2.4 KiB
Python

"""
Miscellaneous helpers that make Django compatible with AMO.
"""
import re
import threading
import commonware.log
from product_details import product_details
from constants.applications import *
from constants.base import *
from constants.licenses import *
from constants.platforms import *
from constants.search import *
from .log import (LOG, LOG_BY_ID, LOG_ADMINS, LOG_EDITORS,
LOG_HIDE_DEVELOPER, LOG_KEEP, LOG_REVIEW_QUEUE,
LOG_REVIEW_EMAIL_USER, log)
logger_log = commonware.log.getLogger('z.amo')
_locals = threading.local()
_locals.user = None
def get_user():
return _locals.user
def set_user(user):
_locals.user = user
def cached_property(*args, **kw):
# Handles invocation as a direct decorator or
# with intermediate keyword arguments.
if args: # @cached_property
return CachedProperty(args[0])
else: # @cached_property(name=..., writable=...)
return lambda f: CachedProperty(f, **kw)
class CachedProperty(object):
"""
A decorator that converts a function into a lazy property. The
function wrapped is called the first time to retrieve the result
and than that calculated result is used the next time you access
the value::
class Foo(object):
@cached_property
def foo(self):
# calculate something important here
return 42
Lifted from werkzeug.
"""
def __init__(self, func, name=None, doc=None, writable=False):
self.func = func
self.writable = writable
self.__name__ = name or func.__name__
self.__doc__ = doc or func.__doc__
def __get__(self, obj, type=None):
if obj is None:
return self
_missing = object()
value = obj.__dict__.get(self.__name__, _missing)
if value is _missing:
value = self.func(obj)
obj.__dict__[self.__name__] = value
return value
def __set__(self, obj, value):
if not self.writable:
raise TypeError('read only attribute')
obj.__dict__[self.__name__] = value
# For unproven performance gains put firefox and thunderbird parsing
# here instead of constants
FIREFOX.latest_version = product_details.firefox_versions['LATEST_FIREFOX_VERSION']
THUNDERBIRD.latest_version = product_details.thunderbird_versions['LATEST_THUNDERBIRD_VERSION']
MOBILE.latest_version = FIREFOX.latest_version