def convertPropertyValue(self, name, str_value, property_type): """ Преобразовать значение свойства к типу указанному в спецификации. @param name: Имя свойства/аттрибута. @param str_value: Значение в строковом представлении. @param property_type: Код типа значения. Код типа значения поля таблицы справочника. """ value = None if property_type == icsqlalchemy.TEXT_FIELD_TYPE: # Текстовое поле value = str_value elif property_type == icsqlalchemy.INT_FIELD_TYPE: # Целое if str_value.strip().isdigit(): value = int(str_value.strip()) elif property_type == icsqlalchemy.FLOAT_FIELD_TYPE: # Вещественное if str_value.strip().isdigit(): value = float(str_value.strip()) elif property_type == icsqlalchemy.DATE_FIELD_TYPE: # Тестовое представление даты value = str_value elif property_type == icsqlalchemy.DATETIME_FIELD_TYPE: # Дата/время value = ic_time.strDateTimeFmt2DateTime(str_value.strip()) else: log.warning(u'Не обрабатываемый тип <%s> редактора поля' % property_type) value = str_value return value
def set_default_data(self): """ Установить данные справочника по умолчанию. Данные беруться из таблицы справочника БАЛАНС+. """ log.info(u'Start set_default_data') if not os.path.exists(SPRAV_DBF_FILENAME): log.warning( u'Отсутствует файл <%s> для импорта данных справочника типов документов' % SPRAV_DBF_FILENAME) return tab = self.get_object() # Очистить таблицу tab.clear() dbf_tab = None try: dbf_tab = dbf.icDBFFile() dbf_tab.Open(SPRAV_DBF_FILENAME) record = dbf_tab.getRecDict() while not dbf_tab.EOF(): if int(record['TYP']) in SPRAV_TYPE_CODES: typ = ic_str.limit_len_text(record['TYP'], 3, '0') if record['COD'].strip(): cod = unicode(record['COD'].strip(), DBF_DEFAULT_ENCODE) cod = ic_str.limit_len_text(ic_str.rus2lat(cod), 10, '0') else: cod = u'' name = unicode(record['NAM'], DBF_DEFAULT_ENCODE) try: log.debug('NSI [%s : %s : %s]' % (typ, cod, name)) except UnicodeDecodeError: log.debug('NSI [%s : %s]' % (typ, cod)) new_cod = typ + cod # Удаление на случай двойного описания # одного и того же в DBF файле tab.del_where(tab.c.cod == new_cod) new_rec = dict(type='NSITst', cod=new_cod, name=name) tab.add(**new_rec) dbf_tab.Next() record = dbf_tab.getRecDict() dbf_tab.Close() dbf_tab = None except: if dbf_tab: dbf_tab.Close() dbf_tab = None log.fatal( u'Ошибка импорта данных справочника типов документов БАЛАНС+')
def getSpravTabResource(self): """ Определить ресурс таблицы справочника. """ sprav = self.getSprav() if sprav is None: log.warning(u'Не определен объект справочника для редактирования') return None storage = sprav.getStorage() sprav_tab = storage.getSpravTabClass() sprav_tab_res = sprav_tab.getResource() return sprav_tab_res
def printKLADRData(): """ Просмотр данных классификатора. """ global DEFAULT_KLADR_DBF_FILENAME if not os.path.exists(DEFAULT_KLADR_DBF_FILENAME): DEFAULT_KLADR_DBF_FILENAME = os.path.join(os.path.dirname(os.getcwd()), 'db', 'KLADR.dbf') if not os.path.exists(DEFAULT_KLADR_DBF_FILENAME): log.warning('DBF file <%s> not found' % DEFAULT_KLADR_DBF_FILENAME) log.debug('--- Print KLADR data ---') log.debug('KLADR dbf file name <%s>' % DEFAULT_KLADR_DBF_FILENAME) log.debug('Start print KLADR data') try: # sprav = sprav_manager.getSpravByName('nas_punkts') kladr_dbf = dbf.icDBFFileDBFPY(DEFAULT_KLADR_DBF_FILENAME) kladr_dbf.Open() i = 0 while not kladr_dbf.EOF(): str_code = kladr_dbf.getFieldByName('CODE') code = splitKLADRCode(str_code) str_socr = unicode(kladr_dbf.getFieldByName('SOCR'), DEFAULT_DBF_ENCODE) name = unicode(kladr_dbf.getFieldByName('NAME'), DEFAULT_DBF_ENCODE) log.info('[%d] %s\t%s\t%s\t%s' % (i, str_code, name, str_socr, code)) kladr_dbf.Next() i += 1 kladr_dbf.Close() except: kladr_dbf.Close() log.error('Print KLADR data') raise log.debug('Stop print KLADR data')
def onRecordPropertyGridChanged(self, event): """ Обработчик изменения значения поля редактируемой записи """ property = event.GetProperty() if property: name = property.GetName() str_value = property.GetValueAsString() log.debug(u'Свойство [%s]. Новое значение <%s>' % (name, str_value)) field_spc = self.findSpravTabFieldSpc(name) value = self.convertPropertyValue(name, str_value, field_spc['type_val']) if self.validate(name, value) == coderror.IC_CTRL_OK: self.edit_record[name] = value else: log.warning( u'Значение <%s> свойства [%s] не прошло валидацию' % (str_value, name)) event.Skip()
def find_word_in_records(self, find_word, start_row=None, start_col=None): """ Поиск слова в текущем списке записей справочника. @param find_word: Искомое слово. @param start_row: Начальная строка для начала поиска. Если не указана, то берется первая. @param start_col: Начальная колонка для начала поиска. Если не указана, то берется первая. @return: Индекс записи, индекс поля, где найдено слово. Или None если ничего не найдено. """ if start_row is None: start_row = 0 if start_col is None: start_col = 0 find_word = find_word.lower() fields = self.get_tab_editable_fields() for i_row, row in enumerate(self._list_ctrl_dataset[start_row:]): if i_row == 0: for i_col, field in enumerate(fields[start_col:]): field_name = field['name'] value = ic_str.toUnicode(row[field_name]).lower() if find_word in value: log.debug(u'Найдено соответствие %s <%s> в <%s>' % (field_name, find_word, value)) return start_row + i_row, start_col + i_col else: for i_col, field in enumerate(fields): field_name = field['name'] value = ic_str.toUnicode(row[field_name]).lower() if find_word in value: log.debug( u'Найдено соответствие в поле %s <%s> : <%s>' % (field_name, find_word, value)) return start_row + i_row, i_col log.warning(u'Не найдено <%s> в списке. Поиск окончен.' % find_word) return None
def onAddToolClicked(self, event): """ Обработчик инструмента добавления новой записи справочника. """ # Заполнение записи значениями по умолчанию tab = self.sprav.getTable() default_record = tab.getDefaultRecDict() # Установить код по умолчанию parent_rec = self.sprav_treeCtrl.GetPyData( self.sprav_treeCtrl.GetSelection()) struct_parent_code = self.sprav.StrCode2ListCode( parent_rec['cod']) if parent_rec else list() struct_parent_code = [ sub_code for sub_code in struct_parent_code if sub_code ] level = self.sprav.getLevelByIdx(len(struct_parent_code)) struct_code = struct_parent_code if level: struct_code += ['0' * level.getCodLen()] default_record['cod'] = ''.join(struct_code) add_rec = edit_record_sprav_dlg(parent=self, nsi_sprav=self.sprav, record=default_record) if add_rec: # Контроль существующего кода if not self.sprav.isCod(add_rec['cod']): self.sprav.addRec(add_rec['cod'], add_rec) self.add_sprav_tree_item(self.sprav_treeCtrl.GetSelection(), add_rec) self.add_sprav_list_item(add_rec) else: msg = u'Код <%s> уже присутствует в справочнике <%s>' % ( add_rec['cod'], self.sprav.getDescription()) log.warning(msg) ic_dlg.icWarningBox(u'ОШИБКА', msg) event.Skip()