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
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()
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
def find_pack(pack_cls): u""" Поиск инстанса пака в кэше :param pack_cls: :return: """ return ControllerCache.find_pack(pack_cls)
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()
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()
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
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()
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
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()
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
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)
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), }
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 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 = '¶ms={}'.format(json.dumps(params)) else: params_string = '' url = '{}?guid={}{}'.format( router_pack.action_router.get_absolute_url(), guid, params_string) return url
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
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
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
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
def configure_action(self, request, context): self.data_pack = ControllerCache.find_pack(ApiPack)
def handle(self, *args, **options): warns = ControllerCache._self_test() for warn in warns: sys.stderr.write('Self-test warning: %s\n' % warn)