Exemple #1
0
    def readTags(self, *tags):
        """
        Прочитать список тегов.
        @param tags: Список объектов тегов.
        @return: True/False.
        """
        if not tags:
            log.warning(u'Не определен список тегов для чтения')
            return False

        # Контроль что все теги соответствуют узлу
        is_my_tags_list = [tag.getNode().GetPassport() == self.GetPassport() for tag in tags]
        is_my_tags = all(is_my_tags_list)
        if not is_my_tags:
            not_my_tags = [tags[i].name for i, is_my_tag in enumerate(is_my_tags_list) if not is_my_tag]
            log.error(u'Не соответствие читаемых тегов %s Memory источнику данных' % not_my_tags)
            return False

        for tag in tags:
            # Все теги Memory узла являются вычисляемыми.
            # Выражение для вычисления записывается в 'address'
            expression = tag.GetResource().get('address', None)
            if not expression:
                log.warning(u'Не определена функция вычисляемого тега <%s> для определения значения' % tag.getName())
                value = None
            else:
                self.setEnv(TAG=tag)
                # log.debug(u'Обработка вычисляемого тега <%s>. Выражение <%s>' % (tag.getName(), expression))
                value = self.read_value(expression)
            tag.setCurValue(value)
        return True
Exemple #2
0
 def _add_values(self, prj_res_ctrl=None):
     """
     Добавить в таблицу значения перечислений.
     @param prj_res_ctrl: Контроллер управления ресурсом проекта.
     """
     tab_name = self._get_enum_tabname(prj_res_ctrl)
     if prj_res_ctrl.isRes(tab_name, 'tab'):
         tab = ic.getKernel().CreateObj(tab_name, tab_name, 'tab')
         if tab:
             name_lat = ic_str.rus2lat(self.name)
             len_code = self._get_enum_spravlevel_len()
             code_fmt = '%%0%dd' % len_code
             # Сначала удалить все данные представления
             tab.del_where(tab.c.type == name_lat)
             # Затем добавить значения
             values = self.children[0].children
             for i, value in enumerate(values):
                 code = code_fmt % (i + 1)
                 tab.add(type=name_lat,
                         cod=code,
                         name=value.description,
                         s1=value.name,
                         uid1c=value.uid)
         else:
             log.warning(
                 u'Ошибка создания объекта таблицы хранения перечислений 1С <%s>'
                 % tab_name)
     else:
         log.warning(
             u'Не найден ресурс таблицы хранения перечислений 1С <%s>' %
             tab_name)
    def _find_and_goto_func(self,
                            tree,
                            ide,
                            res_editor,
                            property_value,
                            signature='GetManager'):
        """
        Найти и перейти к функции...
        @return: True - Перешли, False - функция не найдена.
        """
        signature = '%s().' % signature
        len_signature = len(signature)

        n1 = property_value.find(signature)
        n2 = property_value.find('(', n1 + len_signature)
        if 0 <= n1 < n2:
            func_name = property_value[n1 + len_signature:n2]
            path_filename, ext = os.path.splitext(res_editor.file)
            py_filename = res_editor.file if ext == '.py' else path_filename + '_' + ext[
                1:] + '.py'
            # log.debug(u'Поиск функции <%s> в модуле <%s>' % (func_name, py_filename))
            if tree and ide:
                bSel = ide.SelectFile(py_filename)
                if bSel:
                    # log.debug(u'Переход к функции')
                    ide.GoToFunc(func_name)
                    return True
                else:
                    log.warning(u'Модуль Python <%s> не выбран в IDE' %
                                py_filename)
            else:
                log.warning(u'Не определена IDE')
        return False
 def get_sort_field_idx(self, sort_column='name'):
     """
     Определить индекс поля сортировки по указанию имени/индексу 
     колонки сортировки.
     @param sort_column: Указание имени/индекса колонки сортировки.
     @return: Индекс поля сортировки.
         Или None в случае ошибки.
     """
     sort_field_idx = None
     if isinstance(sort_column, int):
         # ВНИМАНИЕ! Увеличение на 1 сделано для того чтобы учесть
         # первую колонку с индексом 0. Т.к. -0 нет.
         #                         V
         return abs(sort_column) - 1
     elif isinstance(sort_column, str) or isinstance(sort_column, unicode):
         if sort_column.startswith(SORT_REVERSE_SIGN):
             sort_field = sort_column[1:]
         else:
             sort_field = sort_column
         if sort_field in self.sprav_field_names:
             sort_field_idx = self.sprav_field_names.index(sort_field)
         else:
             log.warning(u'Сортировка.Поле <%s> не найдено среди %s.' % (sort_field, self.sprav_field_names))
             sort_field_idx = None
     else:
         log.warning(u'Ошибка типа поля/колонки сортировки <%s>' % type(sort_column))
     return sort_field_idx
Exemple #5
0
 def _signal_loop(self, *warg):
     """
     Диспетчер сигналов.
     """
     while True:
         # Обрабатываем очередь
         if not self._eventLoopLst.isSet():
             # Ждем 5 сек, если очередь занята
             self._eventLoopLst.wait(0.5)
             if not self._eventLoopLst.isSet():
                 log.warning(
                     u'Диспетчер ядра не может получить доступ к очереди сигналов.'
                 )
             else:
                 #   Если установлен признак остановки, то выходим из цикла
                 if self.__stop:
                     break
                 self._parse_signal_lst()
         else:
             #   Если установлен признак остановки, то выходим из цикла
             if self.__stop:
                 break
             self._parse_signal_lst()
         try:
             time.sleep(0.001)
         except:
             log.error(u'*** EXCEPTION time.sleep(0.001) ***')
             break
Exemple #6
0
def getParamNamesINI(sINIFileName, sSection):
    """
    Имена параметров в секции.
    @type sINIFileName: C{string}
    @param sINIFileName: Полное имя файла настроек.
    @type sSection: C{string}
    @param sSection: Имя секции.
    @return: Возвращает список имен параметров в секции или None в случае ошибки.
    """
    ini_file = None
    try:
        if not os.path.isfile(sINIFileName):
            log.warning(u'INI file <%s> not exists' % sINIFileName)
            return None

        # Создать объект конфигурации
        ini_parser = ConfigParser.ConfigParser()
        ini_file = open(sINIFileName, 'r')
        ini_parser.readfp(ini_file)
        ini_file.close()

        # Если такой секции нет
        if not ini_parser.has_section(sSection):
            log.warning(u'Section [%s] not exists in file <%s>' %
                        (sSection, sINIFileName))
            return []
        # Количество параметров в секции
        return ini_parser.options(sSection)
    except:
        if ini_file:
            ini_file.close()
        log.fatal(u'INI file <%s> Get param names in section [%s]' %
                  (sINIFileName, sSection))
    return None
    def init_columns(self, *fields):
        """
        Инициализация колонок контрола дерева справочника.
        @param fields: Список имен полей справочника, которые
            необходимо отобразить в контроле дерева.
            Если поля не указываются, то отображаются только 
            <Код> и <Наименование>.
        """
        field_names = ['cod', 'name']
        if fields:
            field_names += fields
        self.sprav_field_names = field_names
            
        if self.sprav is None:
            log.warning(u'Не определен справочник для выбора кода')
            return
        
        tab = self.sprav.getTable()
        # Словарь спецификаций полей таблицы справочника
        field_dict = dict([(field['name'], field) for field in tab.getResource()['child']])
        
        for field_name in field_names:
            field = field_dict.get(field_name, None)
            if field:
                column_label = self.get_field_label(field)
                self.sprav_treeListCtrl.AddColumn(column_label)
            else:
                log.warning(u'Не найдено поле <%s> в описании таблицы <%s>' % (field_name, tab.name))

        # Обновить отсортированные колонки
        self.refreshSortColumn(self.sort_column)
Exemple #8
0
def sequence_list_dlg(parent=None, sequence_data=None, label_column=0):
    """
    Вызов диалогового окна для редактирования последовательностью записей.
    @param parent: Родительское окно.
        Если не определено, то берется лавное окно программы.
    @param sequence_data: Список-последовательность записей.
    @param label_column: Имя колонки - наименования записи.
    @return: Отредактированный список-пследовательность или
        None в случае ошибки/нажата <Отмена>.
    """
    if parent is None:
        parent = ic.getMainWin()

    if not sequence_data:
        log.warning(u'Не определена последовательность')
        sequence_data = list()

    dlg = icSequenceListDlg(parent=parent)
    dlg.sequence_control.setSequenceData(sequence_data)
    dlg.sequence_control.setLabelColumn(label_column)
    dlg.sequence_control.refreshSequence()
    result = dlg.ShowModal()

    if result == wx.ID_OK:
        return dlg.sequence_control.getSequenceData()

    return None
Exemple #9
0
def load_xml_content(xml_filename, is_change_keys=True):
    """
    Загрузить содержимое XML файла в словарно списковую структуру.
    @param xml_filename: Полное имя XML файла.
    @param is_change_keys: Произвести автоматическую замену ключей на короткие.
    @return: Словарно-списковая структура содержания XML файла.
        Или None в случае ошибки.
    """
    if not os.path.exists(xml_filename):
        log.warning(u'XML файл <%s> не найден' % xml_filename)
        return None

    xml_file = None
    try:
        xml_file = open(xml_filename, 'r')
        xml_txt = xml_file.read()
        xml_file.close()
    except:
        if xml_file:
            xml_file.close()
        log.fatal(u'Ошибка загрузки содержимого XML файла <%s>' % xml_filename)
        return None

    data = xmltodict.parse(xml_txt)
    if is_change_keys:
        data = change_keys_doc(data)
    return data
Exemple #10
0
    def remove_to(self,
                  dst_doc,
                  doc_uuid=None,
                  doc_num=None,
                  requisite_replace=None,
                  ask_del=False):
        """
        Переместить документ из одной структуры документа в другую.
        Функция является примером архивирования документа.
        @param dst_doc: Объект документа-приемника.
        @param doc_uuid: UIID переносимого документа.
            Переносимый документ может задаваться как номером так и UUID.
        @param doc_num: Номер переносимого документа.
            Если номер не определен, то перенос производиться по UUID документа.
        @param requisite_replace: Словарь замены имен реквизитов.
            Формат:
            {'Имя реквизита в документе-приемнике': 'Имя реквизита в документе-источнике'}
        @param ask_del: Спрашивать об удалении документа из источника?
        @return: True/False.
        """
        if doc_num:
            doc_uuid = self.getDocUUID(doc_num)

        if doc_uuid is None:
            log.warning(u'Не определен UUID документа для перемещения')
            return False

        return docfunc.document_remove_to(doc_uuid, self, dst_doc,
                                          requisite_replace, ask_del)
Exemple #11
0
    def _get_edit_dlg(self, attr, value, pos=wx.DefaultPosition, size=wx.DefaultSize,
                      style=0, propEdt=None, *arg, **kwarg):
        """
        Диалог редактирования свойства/атрибута.
        @type parent: C{wx.Window}
        @param parent: Указатель на родительское окно.
        @type attr: C{string}
        @param attr: Имя текущего атрибута.
        @type value: C{string}
        @param value: Текущее значение.
        @type pos: C{wx.Point}
        @param pos: Позиция окна.
        @type size: C{wx.Size}
        @param size: Размер диалогового окна.
        @type style: C{int}
        @param style: Стиль диалога.
        @param propEdt: Указатель на редактор свойств.
        @return: Возвращает отредактированное значение.
        """
        if propEdt is None:
            propEdt = self.property_edit_manager

        if propEdt and propEdt.getResTree():
            typRes = propEdt.getResource()['type']
            modl = propEdt.getResTree().GetTypeModule(typRes)
            try:
                edtFunc = getattr(modl, 'get_user_property_editor')
                value = edtFunc(attr, value, pos, size,
                                style, propEdt, *arg, **kwarg)
                return str(value)
            except:
                log.fatal(u'Ошибка вызова пользовательского редактора свойства <%s>' % attr)
        else:
            log.warning(u'Не определен объект редактора свойств')
        return ''
 def getBoxListRecords(self):
     """
     Список описаний ящиков/паллет. 
     @return: 
     """
     records = list()
     board = self.truck_constructor.truck_load_constructor.getBoard()
     if board:
         tags = board.getShapeTags()
         for i, tag in enumerate(tags):
             if tag:
                 try:
                     n = str(i + 1)
                     label = tag['nomenklature']['label'] if tag[
                         'nomenklature'][
                             'label'] is not None else DEFAULT_BOX_LABEL
                     row_value = tag['row']['value']
                     made_date = str(tag['made_date']['value'])
                     weight = str(tag['weight']['value'])
                     row = [n, label, row_value, made_date, weight]
                     records.append(row)
                 except:
                     log.fatal(u'Ошибка добавления строки. Индекс [%d]' % i)
                     # Добавить пустую строку
                     records.append([str(i + 1), u'', u'', u'', u''])
             else:
                 log.warning(
                     u'Нет прикрепленного тега у фигуры размещения. Индекс [%d]'
                     % i)
                 # Если тег не прикреплен, то добавить пустую строку
                 records.append([str(i + 1), u'', u'', u'', u''])
     return records
Exemple #13
0
    def _gen_registry(self, prj_res_ctrl=None):
        """
        Генерация ресурса регистра накопления 1С.
        @param prj_res_ctrl: Контроллер управления ресурсом проекта.
        @return: True/False.
        """
        if prj_res_ctrl is None:
            log.warning(
                u'Не определен контроллер управления ресурсом проекта. Генерация ресурса 1С не взможна.'
            )
            return False

        reg_res = self._gen_registry_res(prj_res_ctrl,
                                         name=self.name,
                                         description=self.description,
                                         uuid=self.uid)

        res_name = ic_str.rus2lat(self.name)

        if prj_res_ctrl.isRes(res_name, 'mtd'):
            prj_res_ctrl.delRes(res_name, 'mtd')

        # Сохранить ресурс
        prj_res_ctrl.saveRes(res_name, 'mtd', reg_res)
        return True
Exemple #14
0
def icOctHexString(String_, Code_):
    """
    Закодировать строку в восьмеричном/шестнадцатеричном виде.
    Символы с кодом < 128 не кодируются.
    @param String_:
    @param Code_: Кодировка 'OCT'-восьмеричное представление.
                            'HEX'-шестнадцатеричное представление.
    @return: Возвращает закодированную строку.
    """
    try:
        if Code_.upper() == 'OCT':
            fmt = '\\%o'
        elif Code_.upper() == 'HEX':
            fmt = '\\x%x'
        else:
            # Ошибка аргументов
            log.warning('Argument error in icOctHexString.')
            return None
        # Перебор строки по символам
        ret_str = ''
        for char in String_:
            code_char = ord(char)
            # Символы с кодом < 128 не кодируются.
            if code_char > 128:
                ret_str += fmt % code_char
            else:
                ret_str += char
        return ret_str
    except:
        log.fatal()
        return None
Exemple #15
0
    def ChoiceSprav(self,
                    SpravName_,
                    ParentForm_=None,
                    default_selected_code=None):
        """
        Вызов выбора значения справочника по имени.
        @param SpravName_: Имя справочника.
        @param ParentForm_: Родительское окно для формы редактирования справочника.
        @param default_selected_code: Выбранный код по умолчанию.
            Если None, то ничего не выбирается.
        @return: Функция возвращает выбранный код справочника
            или None в случае ошибки или если нажата кнопка <Отмена>.
        """
        if ParentForm_ is None:
            ParentForm_ = ic_user.icGetMainWin()

        choice_sprav = self.getSpravByName(SpravName_)
        if choice_sprav:
            result = choice_sprav.Choice(
                parentForm=ParentForm_,
                default_selected_code=default_selected_code)
            if result[0] == coderror.IC_CTRL_OK:
                return result[1]
        else:
            log.warning(u'Справочник <%s> не найден в менеджере <%s>' %
                        (SpravName_, self.name))
        return None
Exemple #16
0
    def do_replacement(self, res, replacement_dct=None):
        """
        Произвести замены в ресурсе.
        @param res: Ресурс объекта.
        @param replacement_dct: Словарь замен.
        @return: Ресурс с произведенными заменами
        """
        if not res:
            log.warning(u'Не определен ресурс')
            return res

        if replacement_dct is None:
            # Если словарь замен не определен, то замены производить не надо
            return res

        # Если определен словарь замен используем его
        for attr_name, value in replacement_dct.items():
            # ВНИМАНИЕ! Типы объектов подменять нельзя
            if attr_name != 'type' and not attr_name.startswith('_'):
                if attr_name in res:
                    res[attr_name] = value
                else:
                    # Если нет такого атрибута, значит это замена атрибутов дочернего объекта
                    if isinstance(value, dict):
                        res = resource.update_child_resource(
                            attr_name, res, value)
                    else:
                        log.warning(
                            u'Не поддерживаемый тип %s замены ресурса дочернего объекта <%s>'
                            % (type(value), attr_name))
        return res
Exemple #17
0
def icInputDate(parent, day=None, month=None, year=None):
    """
    Функция позволяет вводить дату. В качестве параметров передается дата, на которую будет установлен
    календарь. Если параметры даты не передаются, то установится текщая дата.

    @type parent: C{wx.Windows}
    @param parent: Родительское окно.
    @type day: C{integer}
    @param day: День недели.
    @type month: C{integer}
    @param month: Месяц.
    @type year: C{integer}
    @param year: Год.
    @rtype: C{List}
    @return: Возвращает выбранную дату либо None.
    """
    if parent is None:
        MsgBox(None, u'Для данного отображения календаря необходимо родительское окно !')
        return None

    dlg = icCalendarDialog(parent, day, month, year)
    dlg.result = [day, month, year]

    dlg.CenterOnScreen()

    if dlg.ShowModal() == wx.ID_OK:
        str_date = dlg.getStrDate()
        return str_date
    else:
        log.warning(u'No Date Selected')

    return None
Exemple #18
0
    def get_replacement_dct(self, res=None):
        """
        Получить словарь замен ресурса перед сборкой связанного объекта.
        @param res: Ресурс.
        @return: Словарь замен.
        """
        if res is None:
            res = self.GetResource()

        replacement_dct = dict()
        # ВНИМАНИЕ! Самое главное надо подменить имя ссылаемого объекта
        replacement_dct['name'] = self.name

        for key, val in res.items():
            if key in ('border', 'flag', 'position', 'proportion', 'size',
                       'span'):
                replacement_dct[key] = val
        # Словарь замен может быть расширен
        # при помощи атрибута res_replace
        if self.isICAttrValue('res_replace'):
            res_replace = self.getICAttr('res_replace')
            if isinstance(res_replace, dict):
                replacement_dct.update(res_replace)
            else:
                log.warning(
                    u'Не поддерживаемый тип %s замены значений ресурса при сборке объекта <%s> '
                    % (type(res_replace), self.getName()))
        return replacement_dct
Exemple #19
0
 def setTierCount(self, tier_count=1, box_layout_scheme=None):
     """
     Установить количество ярусов со схемой погрузки паллет.
     @param tier_count: Количество ярусов.
     @param box_layout_scheme: Схема погрузки.
     Схема задается по позициям.
     @return: True/False.
     """
     if box_layout_scheme and tier_count > 0:
         for i in range(tier_count):
             # Сначала подготовить доски для каждого яруса
             y_offset = DEFAULT_Y_OFFSET + i * DEFAULT_HEIGHT_STEP
             scheme = layout_scheme.init_cell_points(
                 box_layout_scheme, DEFAULT_X_OFFSET, y_offset)
             self.truck_load_constructor.appendBoard(
                 scheme,
                 left=DEFAULT_X_OFFSET,
                 top=y_offset,
                 width=DEFAULT_BOARD_WIDTH,
                 height=DEFAULT_BOARD_HEIGHT)
         return True
     else:
         log.warning(
             u'Инициализация ярусов. Не корректные входные значения.')
     return False
Exemple #20
0
def convert_xml_file2dict(xml_filename, codepage='utf-8'):
    """
    Простая конвертация XML файла в словарь.
    @param xml_filename: Полное наименование XML файла
    @param codepage: Кодовая страница XML файла.
    @return: Словарь, соотыветствующий XML файлу.
    """
    if not os.path.exists(xml_filename):
        log.warning(u'XML файл не найден <%s>' % xml_filename)
        return dict()

    body_xml = ic_extend.load_file_text(xml_filename, 'utf-8')

    # Перекодировать текст, если надо
    src_codepage = ic_str.get_codepage(body_xml)
    if src_codepage and src_codepage.lower() != codepage:
        log.info(u'Перекодировка XML файла <%s> из <%s> в <%s> кодировку' %
                 (xml_filename, src_codepage, codepage))
        body_xml = ic_str.recode_text(body_xml, src_codepage, codepage)
    elif not src_codepage:
        log.warning(u'Не возможно определить кодовую страницу XML файла <%s>' %
                    xml_filename)
        return dict()

    return convert_xml_text2dict(body_xml, codepage)
    def init_search(self, *search_fields):
        """
        Инициализация контролов выбора поиска по полям справочника.
        @param search_fields: Поля по которым производиться поиск.
        """
        # По умолчанию делаем поиск по наименованию
        field_names = ['name', 'cod']
        if search_fields:
            field_names += search_fields
        self.sprav_search_field_names = field_names

        if self.sprav is None:
            log.warning(u'Не определен справочник для выбора кода')
            return

        tab = self.sprav.getTable()
        # Словарь спецификаций полей таблицы справочника
        field_dict = dict([(field['name'], field) for field in tab.getResource()['child']])

        choices = list()
        for field_name in field_names:
            field = field_dict.get(field_name, None)
            if field:
                choice_label = self.get_field_label(field)
                choices.append(choice_label)
            else:
                log.warning(u'Не найдено поле <%s> в описании таблицы <%s>' % (field_name, tab.name))
        self.search_field_choice.Clear()
        self.search_field_choice.AppendItems(choices)
        self.search_field_choice.Select(0)
Exemple #22
0
 def register_custom_editor(self, *editor_classes):
     """
     Регистрация пользовательских редакторов свойств.
     @param editors_classes: Список классов пользовательских редакторов.
     """
     if not editor_classes:
         editor_classes = CUSTOM_PROPERTY_EDITORS
     #
     # Let's use some simple custom editor
     #
     # NOTE: Editor must be registered *before* adding a property that
     # uses it.
     if not getattr(sys, '_PropGridEditorsRegistered', False):
         for editor_class in editor_classes:
             if editor_class:
                 log.debug(
                     u'Регистрация пользовательского редактора свойства <%s>'
                     % editor_class.__name__)
                 editor_class.setPropertyEditManager(self)
                 self.RegisterEditor(editor_class)
             else:
                 log.warning(
                     u'Не определен пользовательский редактор свойства в редакторе ресурса'
                 )
         # ensure we only do it once
         sys._PropGridEditorsRegistered = True
Exemple #23
0
    def _runPrjCmd(self, AppDir_, PrjPath_, username=None):
        """
        Запуск проекта на исполнение.
        @param AppDir_: Папка приложения.
        @param PrjPath_: Папка проекта.
        @param username: Имя пользователя, запускающего проект.
            Если не указано (None), то производиться выбор из списка пользователей,
            присутствующих в проекте.
        """
        import ic.utils.ic_exec as ic_exec

        ic_exec.CreateRunApp(AppDir_)

        # Коммандная строка
        dbg_mode_cmd = ''

        if username is None:
            username = self.choiceUsernameDlg()

        if username is None:
            log.warning(u'Не определен пользователь запуска проекта')
            return

        if self.debug_mode:
            dbg_mode_cmd = '-dbg'

        if ic_util.isOSWindowsPlatform():
            cmd = '\"%s/python.exe\" \"%s/run.py\" -run %s \"%s/\" -s %s' % (
                sys.prefix, AppDir_, dbg_mode_cmd, PrjPath_, username)
        else:
            cmd = '%s %s/run.py -run %s %s/ -s %s' % (
                sys.executable, AppDir_, dbg_mode_cmd, PrjPath_, username)

        log.info(u'RUN PROJECT: <%s>' % cmd)
        ic_exec.RunTask(cmd)
Exemple #24
0
 def addFormRequisite(self, name_requisite, type_requisite, *args,
                      **kwargs):
     """
     Добавить реквизит формы. Обычная форма.
     @param name_requisite: Имя реквизита формы.
     @param type_requisite: Тип реквизита формы.
     """
     res_filename_requisite = os.path.join(self.getCFDir(), self.uid + '.0')
     if os.path.exists(res_filename_requisite) and os.path.isfile(
             res_filename_requisite):
         return self._addFormRequisiteCtrl(res_filename_requisite,
                                           name_requisite, type_requisite,
                                           *args, **kwargs)
     else:
         res_filename_requisite = os.path.join(res_filename_requisite,
                                               'form')
         if os.path.exists(res_filename_requisite) and os.path.isfile(
                 res_filename_requisite):
             return self._addFormRequisiteStd(res_filename_requisite,
                                              name_requisite,
                                              type_requisite, *args,
                                              **kwargs)
     log.warning(u'ERROR! Form %s (UID: %s) resource file not found!' %
                 (self.name, self.uid))
     return None
Exemple #25
0
    def gen_resource(self):
        """
        Генерация ресурса, соответстствующего объеку 1С.
        @return: True/False.
        """
        # Открыть проект
        prj_res_ctrl = ic.getKernel().getProjectResController()
        if prj_res_ctrl is None:
            log.warning(
                u'Не определен контроллер управления ресурсом проекта. Генерация ресурса таблицы хранения перечислений 1С не взможна.'
            )
            return False
        else:
            log.debug(u'Контроллер управления ресурсом проекта <%s>' %
                      prj_res_ctrl)
        prj_res_ctrl.openPrj()

        # Создать необходимые ресурсные файлы
        self._gen_enum_tab(prj_res_ctrl)
        self._gen_enum_spravmanager(prj_res_ctrl)
        self._gen_enum_sprav(prj_res_ctrl)

        # Добавить в таблицу значения перечислений
        self._add_values(prj_res_ctrl)

        return True
Exemple #26
0
    def set_choices(self, table_data=None, is_empty=True):
        """
        Установка списка выбора.
        @param table_data: Табличные данные.
        @param is_empty: Присутствует в списке пустая строка?
        @return: True/False.
        """
        if table_data is None:
            table_data = self.getTableData()

        if table_data is not None:
            # Сначала удалим все элементы
            self.Clear()

            # Затем заполним
            try:
                if is_empty:
                    self.Append(u'')

                for record in table_data.get('__data__', []):
                    label = self.get_label(record, table_data)
                    self.Append(label)

                self.SetSelection(0)
                return True
            except:
                log.fatal(u'Ошибка заполнения списка выбора данными')
        else:
            log.warning(u'Не определены табличные данные в компоненте <%s>' %
                        self.name)
        return False
Exemple #27
0
    def _gen_enum_sprav(self, prj_res_ctrl=None):
        """
        Генерация ресурса справочника перечисления 1С.
        @param prj_res_ctrl: Контроллер управления ресурсом проекта.
        @return: True/False.
        """
        if prj_res_ctrl is None:
            log.warning(
                u'Не определен контроллер управления ресурсом проекта. Генерация ресурса таблицы хранения перечислений 1С не взможна.'
            )
            return False

        sprav_res = self._gen_enum_sprav_res(prj_res_ctrl,
                                             name=self.name,
                                             description=self.description,
                                             uuid=self.uid)

        res_name = DEFAULT_ENUM_RES
        # Загрузить ресурс
        res = prj_res_ctrl.loadRes(res_name, 'mtd')

        child_names = [child['name'] for child in res['child']]
        if sprav_res['name'] in child_names:
            del res['child'][child_names.index(sprav_res['name'])]
        res['child'].append(sprav_res)

        # Сохранить ресурс
        prj_res_ctrl.saveRes(res_name, 'mtd', res)
        return True
Exemple #28
0
    def setCode(self, code):
        """
        Выбранный код. Определяется по подовому полю.
        """
        if code is None:
            # Да пустое значение тоже можно
            # устанавливать в контроле
            self._selected_code = None
            self.SetValue(u'')
            return True

        if self._src_data is not None:
            record = self._src_data.find_record(
                normal_data=self.getTableData(),
                field_name=self.getCodeField(),
                value=code)
            if record:
                self._selected_code = code
                label = record.get(self.getLabelField(), u'')
                self.SetValue(label)
                return True
        else:
            log.warning(
                u'Не определен табличный источник данных в контроле icTableChoiceCtrl <%s>'
                % self.name)
        return False
    def find_on_event(self, property, property_name=None, property_value=None):
        """
        Открыть модуль менеджера ресурса и промотать до функции - обработчика.
        @param property: Объект редактируемого свойства.
        @param property_name: Наименование свойства.
        @param property_value: Значение свойства.
        @return: True/False.
        """
        if self.property_edit_manager is None:
            log.warning(u'Не определен менеджер редактора свойств')
            return False

        if self.property_edit_manager.res_tree is None:
            log.warning(u'Не определен объект дерева ресурса')
            return False

        # Основные управляющие объекты
        tree = self.property_edit_manager.res_tree
        res_editor = tree.GetResEditor()
        ide = res_editor.GetIDEInterface()

        # Пытаемся найти обработчик в коде
        result = self._find_and_goto_func(tree,
                                          ide,
                                          res_editor,
                                          property_value,
                                          signature='GetManager')
        if not result:
            result = self._find_and_goto_func(tree,
                                              ide,
                                              res_editor,
                                              property_value,
                                              signature='GetWrapper')

        return result
Exemple #30
0
    def doExpression(self, expression, environment=None):
        """
        Выполнить выражение.
        ВНИМАНИЕ! Все блоки кода вычисляемых тегов выполняются в контексте
        Memory узла. Поэтому все функции расчетов необходимо расмолагать
        в менеджере Memory Node.
        @param expression: Выполняемое выражение.
        @param environment: Дополнительное окружение выполнения выражения.
            Если не определено, то берется автоматически заполняемое при
            помощи getEnv().
        @return: Результат выполнения выражения или None в случае ошибки.
        """
        if environment is None:
            environment = self.getEnv()
        context = self.GetContext()
        context.update(environment)

        tag = context.get('TAG', None)
        tag_name = tag.getName() if tag else 'default'

        # ВНИМАНИЕ! Чтобы привязать обработчики к конкретному тегу
        # необходимо указывать имя тега для выражения.
        # В данном случае функция-обработчик будет идентифицироваться по имени тега
        #                                      V
        result = self.eval_expr(expression, tag_name)

        if result[0] == coderror.IC_EVAL_OK:
            return result[1]
        else:
            log.warning(u'''ВНИМАНИЕ! Все блоки кода вычисляемых тегов выполняются в контексте
        Memory узла. Поэтому все функции расчетов необходимо расмолагать
        в менеджере Memory Node.''')
        return None