Exemple #1
0
 def declare_context(self, action):
     result = super(BaseProtocolParamsGridPack,
                    self).declare_context(action)
     if action is self.rows_action:
         ControllerCache.find_pack(ApplicationPack)
         result["protocol_code"] = result["app_code"] = {
             "type": "unicode",
             "default": None
         }
     return result
Exemple #2
0
    def _set_urls_from_pack(self, ppack):
        """
        Настраивает поле выбора под указанный экшенпак ppack.
        Причем в качестве аргумента может быть как сам класс пака,
        так и имя. Это связано с тем, что не во всех формах можно
        импортировать паки и может произойти кроссимпорт.
        Поиск пака производится по всем экшенконтроллерам в системе.
        Используется первый найденный, т.к. при правильном дизайне
        один и тот же пак не должен быть в нескольких
        контроллерах одновременно.
        @param ppack: Имя класса пака или класс пака.
        """
        assert isinstance(ppack, basestring) or hasattr(ppack, '__bases__'), (
            'Argument %s must be a basestring or class' % ppack)
        ppack = ControllerCache.find_pack(ppack)
        assert ppack, 'Pack %s not found in ControllerCache' % ppack
        assert isinstance(ppack, ISelectablePack), (
            'Pack %s must provide ISelectablePack interface' % ppack)
        self._pack = ppack

        # старый спосом подключения Pack теперь не действует
        # - всё должно быть в рамках интерфейса ISelectablePack

        # url формы редактирования элемента
        self.edit_url = ppack.get_edit_url()
        # url автокомплита и данных
        self.autocomplete_url = ppack.get_autocomplete_url()
        # url формы выбора
        self.url = ppack.get_select_url()
Exemple #3
0
    def __init__(self, pack, *args, **kwargs):
        """
        Конструктор
        :param pack: Имя или класс пака
        :type pack: str / Action
        :raise: DesktopException
        """
        super(DesktopShortcut, self).__init__(*args, **kwargs)
        self.pack = pack
        # Если это экшен, то получаем его адрес
        if isinstance(pack, Action):
            self.url = pack.get_absolute_url()
            if not getattr(pack, 'title', None):
                pack.title = getattr(pack.parent, 'title', '???')
        else:
            if isinstance(pack, basestring):
                # Пробуем найти как пак
                pack = ControllerCache.find_pack(pack)
                if not pack:
                    raise DesktopException(
                        'Pack %s not found in ControllerCache' % pack)

            self.url = pack.get_list_url()
            # Если не задано имя ярлыка, то название берем из справочника
            if not kwargs.get('name', None):
                self.name = pack.title
Exemple #4
0
def find_pack(pack_cls):
    u"""
    Поиск инстанса пака в кэше
    :param pack_cls:
    :return:
    """
    return ControllerCache.find_pack(pack_cls)
Exemple #5
0
    def _set_urls_from_pack(self, ppack):
        """
        Настраивает поле выбора под указанный экшенпак ppack.
        Причем в качестве аргумента может быть как сам класс пака,
        так и имя. Это связано с тем, что не во всех формах можно
        импортировать паки и может произойти кроссимпорт.
        Поиск пака производится по всем экшенконтроллерам в системе.
        Используется первый найденный, т.к. при правильном дизайне
        один и тот же пак не должен быть в нескольких
        контроллерах одновременно.
        @param ppack: Имя класса пака или класс пака.
        """
        assert isinstance(ppack, basestring) or hasattr(
            ppack, '__bases__'), ('Argument %s must be a basestring or class' %
                                  ppack)
        ppack = ControllerCache.find_pack(ppack)
        assert ppack, 'Pack %s not found in ControllerCache' % ppack
        assert isinstance(ppack, ISelectablePack), (
            'Pack %s must provide ISelectablePack interface' % ppack)
        self._pack = ppack

        # старый спосом подключения Pack теперь не действует
        # - всё должно быть в рамках интерфейса ISelectablePack

        # url формы редактирования элемента
        self.edit_url = ppack.get_edit_url()
        # url автокомплита и данных
        self.autocomplete_url = ppack.get_autocomplete_url()
        # url формы выбора
        self.url = ppack.get_select_url()
Exemple #6
0
def send_controllers_contexts():
    def get_hash(s):
        h = hashlib.md5()
        h.update(s)
        return h.hexdigest()

    assert prefix, 'Identity prefix (METRICS_PREFIX) should be specified!'

    ControllerCache.populate()
    controllers = {}

    controller_urls = sorted([c.url for c in ControllerCache._controllers])
    for url in controller_urls:
        controllers[get_hash(url)] = dict(url=url)

    all_urls = [
        url for c in ControllerCache._controllers
        for url in c._url_patterns.keys()
    ]
    urls = dict([(get_hash(u), u) for u in all_urls])

    parts = prefix.split('.')
    identity = dict(zip(['version', 'region', 'client', 'product'], parts))
    instance_id = [part for part in parts if part.startswith('instance_')]

    if instance_id:
        identity['instance'] = instance_id[0][9:]

    packet = {
        'timestamp': int(time.time()),
        'info': {
            'controller': controllers,
            'url': urls
        },
        'identity': identity
    }

    try:
        req = urllib2.Request(endpoint_url,
                              data=json.dumps(packet),
                              headers={'Content-Type': 'application/json'})
        urllib2.urlopen(req)
        logging.info('Successfully sent context information.')
    except urllib2.URLError as ue:
        logging.error("Can't send contexts to {0}: {1}".format(
            endpoint_url, ue))
 def _set_submit_action(self, value):
     """ Из переданного типа экшена пытается получить адрес для формы """
     if isinstance(value, str):
         self.form.url = ControllerCache.get_action_url(value)
     elif isinstance(value, Action):
         self.form.url = value.get_absolute_url()
     elif issubclass(value, Action):
         self.form.url = value.absolute_url()
Exemple #8
0
    def get_edit_window_params(self, params, request, context):
        params = super(ApplicationPack,
                       self).get_edit_window_params(params, request, context)

        params.update({
            "service_data":
            list(models.Service.objects.values_list("id", "name")),
            "protocol_data":
            list(models.Protocol.objects.values_list("id", "name")),
            "security_data": [(None, self.EMPTY_SECURITY)] +
            list(models.Security.objects.values_list("id", "name")),
            "InProtocol_param_pack":
            ControllerCache.find_pack(InProtocolParamsGridPack),
            "OutProtocol_param_pack":
            ControllerCache.find_pack(OutProtocolParamsGridPack),
        })
        return params
Exemple #9
0
 def pack(self, ppack):
     assert isinstance(ppack, basestring) or hasattr(ppack, '__bases__'), (
         'Argument %s must be a basestring or class' % ppack)
     ppack_class = ControllerCache.find_pack(ppack)
     assert isinstance(ppack_class, IMultiSelectablePack), (
         'Pack %s must provide IMultiSelectablePack interface' % ppack)
     self._set_urls_from_pack(ppack)
     self.url = self._pack.get_multi_select_url()
Exemple #10
0
 def _set_submit_action(self, value):
     """ Из переданного типа экшена пытается получить адрес для формы """
     if isinstance(value, str):
         self.form.url = ControllerCache.get_action_url(value)
     elif isinstance(value, Action):
         self.form.url = value.get_absolute_url()
     elif issubclass(value, Action):
         self.form.url = value.absolute_url()
Exemple #11
0
def get_pack_by_url(url):
    '''
    Возвращает набор экшенов по переданному url
    '''
    ControllerCache.populate()
    packs = collections.deque([])
    for controller in ControllerCache.get_controllers():
        packs.extend(controller.top_level_packs)

    while len(packs) > 0:
        pack = packs.popleft()
        if hasattr(pack, 'subpacks'):
            packs.extend(pack.subpacks)

        cleaned_pack = _get_instance(pack)
        if url == cleaned_pack.__class__.absolute_url():
            return cleaned_pack
    return None
Exemple #12
0
def get_pack_by_url(url):
    '''
    Возвращает набор экшенов по переданному url
    '''
    ControllerCache.populate()
    packs = collections.deque([])
    for controller in ControllerCache.get_controllers():
        packs.extend(controller.top_level_packs)

    while len(packs) > 0:
        pack = packs.popleft()
        if hasattr(pack, 'subpacks'):
            packs.extend(pack.subpacks)

        cleaned_pack = _get_instance(pack)
        if url == cleaned_pack.__class__.absolute_url():
            return cleaned_pack
    return None
Exemple #13
0
 def pack(self, ppack):
     assert isinstance(ppack, basestring) or hasattr(
         ppack, '__bases__'), ('Argument %s must be a basestring or class' %
                               ppack)
     ppack_class = ControllerCache.find_pack(ppack)
     assert isinstance(ppack_class, IMultiSelectablePack), (
         'Pack %s must provide IMultiSelectablePack interface' % ppack)
     self._set_urls_from_pack(ppack)
     self.url = self._pack.get_multi_select_url()
Exemple #14
0
    def get_edit_window_params(self, params, request, context):
        params = super(SecurityPack,
                       self).get_edit_window_params(params, request, context)

        params["security_module_values"] = (
            models.SecurityModule.objects.values_list("id", "name"))
        params["params_pack"] = ControllerCache.find_pack(
            SecurityParamsGridPack)

        return params
Exemple #15
0
def register_desktop_menu():
    metarole = app_ui.GENERIC_USER

    users_pack = ControllerCache.find_pack(UsersPack)

    DesktopLoader.add(
        metarole, DesktopLoader.TOOLBOX,
        DesktopShortcut(pack=users_pack.logout_action,
                        name=u'Выход',
                        index=256))
def register_desktop_menu():
    metarole = app_ui.GENERIC_USER
    positions_shortcut = app_ui.DesktopShortcut(
        name=u'Должности',
        pack=ControllerCache.find_pack(actions.PositionPack),
        index=10)
    app_ui.DesktopLoader.add(
        metarole, app_ui.DesktopLoader.TOPTOOLBAR, positions_shortcut)
    app_ui.DesktopLoader.add(
        metarole, app_ui.DesktopLoader.START_MENU, positions_shortcut)
def register_desktop_menu():
    metarole = app_ui.GENERIC_USER
    persons_shortcut = app_ui.DesktopShortcut(
        name=u'Физические лица',
        pack=ControllerCache.find_pack(actions.PersonPack),
        index=11)
    app_ui.DesktopLoader.add(
        metarole, app_ui.DesktopLoader.TOPTOOLBAR, persons_shortcut)
    app_ui.DesktopLoader.add(
        metarole, app_ui.DesktopLoader.START_MENU, persons_shortcut)
def register_desktop_menu():
    metarole = app_ui.GENERIC_USER
    employeess_shortcut = app_ui.DesktopShortcut(
        name=u'Сотрудники',
        pack=ControllerCache.find_pack(actions.EmployeesPack),
        index=10)
    app_ui.DesktopLoader.add(
        metarole, app_ui.DesktopLoader.TOPTOOLBAR, employeess_shortcut)
    app_ui.DesktopLoader.add(
        metarole, app_ui.DesktopLoader.START_MENU, employeess_shortcut)
Exemple #19
0
def send_controllers_contexts():
    def get_hash(s):
        h = hashlib.md5()
        h.update(s)
        return h.hexdigest()

    assert prefix, 'Identity prefix (METRICS_PREFIX) should be specified!'

    ControllerCache.populate()
    controllers = {}    
    
    controller_urls = sorted([c.url for c in ControllerCache._controllers])
    for url in controller_urls:
        controllers[get_hash(url)] = dict(url=url)

    all_urls = [url for c in ControllerCache._controllers for url in c._url_patterns.keys()]
    urls = dict([(get_hash(u), u) for u in all_urls])

    parts = prefix.split('.')
    identity = dict(zip(['version', 'region', 'client', 'product'], parts))
    instance_id = [part for part in parts if part.startswith('instance_')]

    if instance_id:
        identity['instance'] = instance_id[0][9:]

    packet = {
        'timestamp': int(time.time()),
        'info': {
            'controller': controllers,
            'url': urls
        },
        'identity': identity
    }

    try:
        req = urllib2.Request(endpoint_url,
                              data=json.dumps(packet),
                              headers={'Content-Type': 'application/json'})
        urllib2.urlopen(req)
        logging.info('Successfully sent context information.')
    except urllib2.URLError as ue:
        logging.error("Can't send contexts to {0}: {1}".format(endpoint_url, ue))
    def _get_desktop(cls, request):
        """
        Формирует элементы Рабочего Стола
        :param request: request
        :type request: Request
        """
        desktop_model = DesktopModel(request, cls.filter_factory)
        ControllerCache.populate()
        DesktopLoader._success = False
        if hasattr(request, 'user'):
            DesktopLoader.populate(request.user, desktop=desktop_model)
        else:
            DesktopLoader.populate_desktop(desktop=desktop_model)

        return {
            'desktopItems': list(desktop_model.desktop.subitems),
            'menuItems': list(desktop_model.start_menu.subitems),
            'topToolbarItems': list(desktop_model.toptoolbar.subitems),
            'toolboxItems': list(desktop_model.toolbox.subitems),
        }
Exemple #21
0
    def _get_desktop(cls, request):
        """
        Формирует элементы Рабочего Стола
        :param request: request
        :type request: Request
        """
        desktop_model = DesktopModel(request, cls.filter_factory)
        ControllerCache.populate()
        DesktopLoader._success = False
        if hasattr(request, 'user'):
            DesktopLoader.populate(request.user, desktop=desktop_model)
        else:
            DesktopLoader.populate_desktop(desktop=desktop_model)

        return {
            'desktopItems': list(desktop_model.desktop.subitems),
            'menuItems': list(desktop_model.start_menu.subitems),
            'topToolbarItems': list(desktop_model.toptoolbar.subitems),
            'toolboxItems': list(desktop_model.toolbox.subitems),
        }
Exemple #22
0
def register_desktop_menu():
    metarole = app_ui.GENERIC_USER

    users_pack = ControllerCache.find_pack(UsersPack)

    DesktopLoader.add(
        metarole,
        DesktopLoader.TOOLBOX,
        DesktopShortcut(
            pack=users_pack.logout_action,
            name=u'Выход',
            index=256
        )
    )
Exemple #23
0
def data_source_url(guid, params=None):
    from creadoc.report.actions import CreadocDataSourceActionPack

    router_pack = ControllerCache.find_pack(CreadocDataSourceActionPack)

    if params is not None:
        params_string = '&params={}'.format(json.dumps(params))
    else:
        params_string = ''

    url = '{}?guid={}{}'.format(
        router_pack.action_router.get_absolute_url(),
        guid, params_string)

    return url
Exemple #24
0
 def configure_by_dictpack(self, pack, controller=None):
     """
     Метод настройки поля выбора из справочника на основе
     переданного ActionPack работы со справочниками.
     @param pack: Имя класса или класс пака.
     @controller: Контроллер в котором будет искаться пак.
     Если не задан, то ищем во всех.
     @deprecated: 0.4
     """
     registered_pack = ControllerCache.find_pack(pack)
     if not registered_pack:
         raise Exception('Pack %s not found!' % pack)
     self.url = registered_pack.get_select_url()
     self.autocomplete_url = registered_pack.rows_action.get_absolute_url()
     # TODO: можно ли обойтись без bind_back?
     self.bind_pack = registered_pack
Exemple #25
0
 def configure_by_dictpack(self, pack, controller=None):
     """
     Метод настройки поля выбора из справочника на основе
     переданного ActionPack работы со справочниками.
     @param pack: Имя класса или класс пака.
     @controller: Контроллер в котором будет искаться пак.
     Если не задан, то ищем во всех.
     @deprecated: 0.4
     """
     registered_pack = ControllerCache.find_pack(pack)
     if not registered_pack:
         raise Exception(
             'Pack %s not found!' % pack
         )
     self.url = registered_pack.get_select_url()
     self.autocomplete_url = registered_pack.rows_action.get_absolute_url()
     # TODO: можно ли обойтись без bind_back?
     self.bind_pack = registered_pack
Exemple #26
0
def inner_name_cache_handler(for_actions=True):
    '''
    Внутренний метод обхода дерева паков и экшенов.
    Используется в хендлерах сборки кешей
    '''
    def get_shortname(obj):
        '''
        Возвращает короткое имя для экшена или пака.
        Сам объект экшена или пака передается в параметре
        obj.
        '''
        names = ['shortname', 'short_name', ]
        objects = [obj.__class__, obj]
        for o in objects:
            for name in names:
                if hasattr(o, name) and isinstance(getattr(o, name), str):
                    return getattr(o, name, '')
        return ''

    # TODO посмотреть как работает для врапнутых классов
    result = {}

    # fullpaths - словарь, который хранит соответствие объекта (контроллера,
    # пака или экшена) и полного пути до него по шортнеймам
    fullpaths = {}

    ControllerCache.populate()
    # что-то внутренность данного метода не вызывает
    # доверия, если честно

    packs = collections.deque([])

    controllers = ControllerCache.get_controllers()

    # считываем паки верхнего уровня
    for controller in controllers:
        packs.extend(controller.top_level_packs)

        # добавляем полные пути в fullpaths
        fullpaths[controller] = get_shortname(controller)
        for pack in controller.top_level_packs:
            fullpaths[pack] = '%s.%s' % (
                fullpaths.get(controller, ''),
                get_shortname(pack)
            )

    while len(packs) > 0:
        pack = packs.popleft()
        # субпаки - в очередь!
        if hasattr(pack, 'subpacks'):
            packs.extend(pack.subpacks)

            for subpack in pack.subpacks:
                fullpaths[subpack] = '%s.%s' % (
                    fullpaths.get(pack, ''),
                    get_shortname(subpack),
                )

        if for_actions and hasattr(pack, 'actions'):
            for action in pack.actions:
                keys = []
                cache_object = None
                # если имеем дело с экземпляром
                # экшена, то ключем будет его
                # полный url
                if isinstance(action, Action):
                    cleaned_action = action
                    url = cleaned_action.get_absolute_url()
                    long_class_name = (
                        cleaned_action.__class__.__module__ + '.' +
                        cleaned_action.__class__.__name__
                    )
                    # регистрируем для url и для класса
                    cache_object = (
                        cleaned_action.__class__, url, cleaned_action)
                    keys.extend([url, long_class_name])
                else:
                    # неважно что нам передали, нам нужен экземпляр класса
                    cleaned_action = _get_instance(action)
                    # TODO: здесь url может быть не
                    # правильный, т.к. мы сами создали
                    # экземпляр и у него нет ни Pack, ни
                    # Controller.
                    # TODO: поэтому берем его через
                    # absolute_url, т.к. он ищет экземпляр
                    # экшена во всех контроллерах
                    # TODO: а это работает только для единичных экземпляров
                    url = cleaned_action.__class__.absolute_url()
                    long_class_name = (
                        cleaned_action.__class__.__module__ + '.' +
                        cleaned_action.__class__.__name__
                    )
                    # регистрируем для класса
                    cache_object = (
                        cleaned_action.__class__, url, cleaned_action)
                    keys.append(long_class_name)

                # регистрируем для shortname
                shortname = get_shortname(cleaned_action)
                if shortname:
                    keys.append(shortname)
                    keys.append('%s.%s' % (fullpaths.get(pack, ''), shortname))

                # регистрируем
                for key in keys:
                    result[key] = cache_object
        else:
            cleaned_pack = _get_instance(pack)
            url = cleaned_pack.__class__.absolute_url()
            cache_object = (cleaned_pack.__class__, url, cleaned_pack)
            # регистрируем как полный класс с модулем, так и просто имя класса
            keys = [
                '%s.%s' % (
                    cleaned_pack.__class__.__module__,
                    cleaned_pack.__class__.__name__
                ),
                cleaned_pack.__class__.__name__
            ]
            # регистрируем shortname
            shortname = get_shortname(cleaned_pack)
            if shortname:
                keys.append(shortname)
                if pack in fullpaths:
                    keys.append(fullpaths[pack])
            # регистрируем
            for key in keys:
                result[key] = cache_object

    return result
Exemple #27
0
def inner_name_cache_handler(for_actions=True):
    '''
    Внутренний метод обхода дерева паков и экшенов.
    Используется в хендлерах сборки кешей
    '''
    def get_shortname(obj):
        '''
        Возвращает короткое имя для экшена или пака.
        Сам объект экшена или пака передается в параметре
        obj.
        '''
        names = [
            'shortname',
            'short_name',
        ]
        objects = [obj.__class__, obj]
        for o in objects:
            for name in names:
                if hasattr(o, name) and isinstance(getattr(o, name), str):
                    return getattr(o, name, '')
        return ''

    # TODO посмотреть как работает для врапнутых классов
    result = {}

    # fullpaths - словарь, который хранит соответствие объекта (контроллера,
    # пака или экшена) и полного пути до него по шортнеймам
    fullpaths = {}

    ControllerCache.populate()
    # что-то внутренность данного метода не вызывает
    # доверия, если честно

    packs = collections.deque([])

    controllers = ControllerCache.get_controllers()

    # считываем паки верхнего уровня
    for controller in controllers:
        packs.extend(controller.top_level_packs)

        # добавляем полные пути в fullpaths
        fullpaths[controller] = get_shortname(controller)
        for pack in controller.top_level_packs:
            fullpaths[pack] = '%s.%s' % (fullpaths.get(
                controller, ''), get_shortname(pack))

    while len(packs) > 0:
        pack = packs.popleft()
        # субпаки - в очередь!
        if hasattr(pack, 'subpacks'):
            packs.extend(pack.subpacks)

            for subpack in pack.subpacks:
                fullpaths[subpack] = '%s.%s' % (
                    fullpaths.get(pack, ''),
                    get_shortname(subpack),
                )

        if for_actions and hasattr(pack, 'actions'):
            for action in pack.actions:
                keys = []
                cache_object = None
                # если имеем дело с экземпляром
                # экшена, то ключем будет его
                # полный url
                if isinstance(action, Action):
                    cleaned_action = action
                    url = cleaned_action.get_absolute_url()
                    long_class_name = (cleaned_action.__class__.__module__ +
                                       '.' + cleaned_action.__class__.__name__)
                    # регистрируем для url и для класса
                    cache_object = (cleaned_action.__class__, url,
                                    cleaned_action)
                    keys.extend([url, long_class_name])
                else:
                    # неважно что нам передали, нам нужен экземпляр класса
                    cleaned_action = _get_instance(action)
                    # TODO: здесь url может быть не
                    # правильный, т.к. мы сами создали
                    # экземпляр и у него нет ни Pack, ни
                    # Controller.
                    # TODO: поэтому берем его через
                    # absolute_url, т.к. он ищет экземпляр
                    # экшена во всех контроллерах
                    # TODO: а это работает только для единичных экземпляров
                    url = cleaned_action.__class__.absolute_url()
                    long_class_name = (cleaned_action.__class__.__module__ +
                                       '.' + cleaned_action.__class__.__name__)
                    # регистрируем для класса
                    cache_object = (cleaned_action.__class__, url,
                                    cleaned_action)
                    keys.append(long_class_name)

                # регистрируем для shortname
                shortname = get_shortname(cleaned_action)
                if shortname:
                    keys.append(shortname)
                    keys.append('%s.%s' % (fullpaths.get(pack, ''), shortname))

                # регистрируем
                for key in keys:
                    result[key] = cache_object
        else:
            cleaned_pack = _get_instance(pack)
            url = cleaned_pack.__class__.absolute_url()
            cache_object = (cleaned_pack.__class__, url, cleaned_pack)
            # регистрируем как полный класс с модулем, так и просто имя класса
            keys = [
                '%s.%s' % (cleaned_pack.__class__.__module__,
                           cleaned_pack.__class__.__name__),
                cleaned_pack.__class__.__name__
            ]
            # регистрируем shortname
            shortname = get_shortname(cleaned_pack)
            if shortname:
                keys.append(shortname)
                if pack in fullpaths:
                    keys.append(fullpaths[pack])
            # регистрируем
            for key in keys:
                result[key] = cache_object

    return result
Exemple #28
0
 def configure_action(self, request, context):
     self.data_pack = ControllerCache.find_pack(ApiPack)
Exemple #29
0
 def handle(self, *args, **options):
     warns = ControllerCache._self_test()
     for warn in warns:
         sys.stderr.write('Self-test warning: %s\n' % warn)