def cardDataSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None): u'''Функция сохранения карточки редактирования содержимого справочника типов разрешений. ''' permissionsTypes = customPermsTypesCursor(context) content = json.loads(xformsdata)["schema"]["type"] permissionsTypes.name=content["@name"] permissionsTypes.description=content["@description"] if add == 'add' and permissionsTypes.canInsert() and permissionsTypes.canModify(): if not permissionsTypes.tryInsert(): permissionsTypesOld = customPermsTypesCursor(context) permissionsTypesOld.get(content["@name"]) permissionsTypes.recversion = permissionsTypesOld.recversion permissionsTypes.update() elif add == 'add' and permissionsTypes.canInsert(): permissionsTypes.insert() elif add == 'edit' and permissionsTypes.canModify(): permissionsTypesOld = customPermsTypesCursor(context) currId = json.loads(session)['sessioncontext']['related']['gridContext']['currentRecordId'] permissionsTypesOld.get(currId) if permissionsTypesOld.name==permissionsTypes.name: permissionsTypes.recversion = permissionsTypesOld.recversion permissionsTypes.update() elif permissionsTypes.canInsert(): permissionsTypes.insert() permissionsTypesOld.delete() else: raise CelestaException(u"Недостаточно прав для данной операции!") else: raise CelestaException(u"Недостаточно прав для данной операции!")
def cardDataSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None): u'''Функция сохранения карточки редактирования содержимого справочника разрешений. ''' permissions = PermissionsCursor(context) content = json.loads(xformsdata)["schema"] # for field in permissions.meta().getColumns(): # permissions.__setattr__(field, content[field]) permissions.roleid = content["roleid"] permissions.grainid = content["grainid"] permissions.tablename = content["tablename"] permissions.r = content["r"] == "true" permissions.i = content["i"] == "true" permissions.m = content["m"] == "true" permissions.d = content["d"] == "true" if add == 'add' and permissions.canInsert() and permissions.canModify(): if not permissions.tryInsert(): permissionsOld = PermissionsCursor(context) permissionsOld.get(content["roleid"], content["grainid"], content["tablename"]) permissionsOld.r = content["r"] == "true" permissionsOld.i = content["i"] == "true" permissionsOld.m = content["m"] == "true" permissionsOld.d = content["d"] == "true" permissionsOld.update() elif add == 'add' and permissions.canInsert(): permissions.insert() elif add == 'edit' and permissions.canModify(): permissionsOld = PermissionsCursor(context) currIdEncoded = json.loads(session)['sessioncontext']['related'][ 'gridContext']['currentRecordId'] currId = json.loads(base64.b64decode(currIdEncoded)) permissionsOld.get(*currId) if permissionsOld.roleid==permissions.roleid and \ permissionsOld.grainid==permissions.grainid and \ permissionsOld.tablename==permissions.tablename: permissions.recversion = permissionsOld.recversion permissions.update() elif permissions.canInsert(): permissions.insert() permissionsOld.delete() else: raise CelestaException(u"Недостаточно прав для данной операции!") else: raise CelestaException(u"Недостаточно прав для данной операции!")
def cardDataSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None): u'''Функция сохранения карточки редактирования содержимого справочника разрешений. ''' numbersSeries = numbersSeriesCursor(context) content = json.loads(xformsdata)["schema"]["numbersSeries"] #raise Exception(permissions.meta().getColumns()) # for field in permissions.meta().getColumns(): # permissions.__setattr__(field, content[field]) numbersSeries.id = content["@id"] numbersSeries.description = content["@description"] if add == 'add' and numbersSeries.canInsert() and numbersSeries.canModify(): if not numbersSeries.tryInsert(): numbersSeriesOld = numbersSeriesCursor(context) numbersSeriesOld.get(content["@id"]) numbersSeries.recversion = numbersSeriesOld.recversion numbersSeries.update() elif add == 'add' and numbersSeries.canInsert(): numbersSeries.insert() elif add == 'edit' and numbersSeries.canModify(): numbersSeriesOld = numbersSeriesCursor(context) numberSeriesTemp = numbersSeriesCursor(context) currId = json.loads(session)['sessioncontext']['related']['gridContext']['currentRecordId'] numbersSeriesOld.get(currId) if numbersSeriesOld.id==numbersSeries.id: numbersSeries.recversion = numbersSeriesOld.recversion numbersSeries.update() elif numberSeriesTemp.tryGet(content["@id"]): context.error(u'Серия номеров с данным ID уже существует. Данные не сохранены!') elif numbersSeries.canInsert(): linesOfNumbersSeries = linesOfNumbersSeriesCursor(context) linesOfNumbersSeriesTemp = linesOfNumbersSeriesCursor(context) linesOfNumbersSeries.setRange('seriesId', numbersSeriesOld.id) numbersSeries.insert() if linesOfNumbersSeriesTemp.canInsert(): for linesOfNumbersSeries in linesOfNumbersSeries.iterate(): linesOfNumbersSeriesTemp.get(linesOfNumbersSeries.seriesId, linesOfNumbersSeries.numberOfLine) linesOfNumbersSeriesTemp.seriesId = numbersSeries.id linesOfNumbersSeriesTemp.insert() else: raise CelestaException(u"Недостаточно прав для данной операции!") linesOfNumbersSeries.deleteAll() numbersSeriesOld.delete() else: raise CelestaException(u"Недостаточно прав для данной операции!") else: raise CelestaException(u"Недостаточно прав для данной операции!")
def _createReader(self, path, value, xmlWriter): u'''функция создания ридера для чтения файла настроек, с учетом указанного пути''' pathList = list() name = r"[a-zA-Z_][a-zA-Z_0-9]+" elementPatern = regexp.compile(r"""(%s)(?:\[(?:@(%s)=(?:'([^']+)'|\"([^\"]+)\")|([0-9]+))\])?(?:/@(%s))?""" % (name, name, name), regexp.UNICODE) lastEnd = -1 for a in elementPatern.finditer(unicode(path)): if lastEnd + 1 != a.start(0) or (lastEnd > 0 and path[lastEnd]not in ('/', '\\')): raise CelestaException('Bad XPath expression') pathList.append(NodeProperties(a.groups())) lastEnd = a.end(0) parser = XMLReaderFactory.createXMLReader() handler = WriteSettings(pathList, xmlWriter, value) parser.setContentHandler(handler) parser.setErrorHandler(handler) parser.setFeature("http://xml.org/sax/features/namespace-prefixes", True) parser.setProperty("http://xml.org/sax/properties/lexical-handler", handler) stream = FileInputStream(self._getUserSettingsFilePath()) parser.parse(InputSource(stream)) stream.close() if not handler.result: stream = FileInputStream(self._getSettingsFilePath()) parser.parse(InputSource(stream)) stream.close() return handler.result
def cardDataSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None): u'''Функция сохранения карточки редактирования содержимого справочника ролей. ''' subjects = subjectsCursor(context) content = json.loads(xformsdata)["schema"]["subject"] subjects.name = content["@name"] subjects.sid = content["@sid"] if add == 'add' and subjects.canInsert() and subjects.canModify(): if not subjects.tryInsert(): subjectsOld = subjectsCursor(context) subjectsOld.get(content["@sid"]) subjects.recversion = subjectsOld.recversion subjects.update() elif add == 'add' and subjects.canInsert(): subjects.insert() elif add == 'edit' and subjects.canModify(): currId = json.loads(session)['sessioncontext']['related'][ 'gridContext']['currentRecordId'] subjectsOld = subjectsCursor(context) subjectsOld.get(currId) subjectsOld.name = content["@name"] subjectsOld.sid = content["@sid"] subjectsOld.update() else: raise CelestaException(u"Недостаточно прав для данной операции!")
def cardDataSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None): u'''Функция сохранения карточки редактирования содержимого справочника ролей. ''' rolesUsers = UserRolesCursor(context) currId = json.loads(session)['sessioncontext']['related']['gridContext']['currentRecordId'] rolesUsersOld = UserRolesCursor(context) rolesUsers.setRange("roleid", currId) rolesUsers.deleteAll() content = json.loads(xformsdata)["schema"]["users"] if content != "": content=content["user"] if isinstance(content["user"], list) else [content["user"]] for user in content: rolesUsers.userid=user["@sid"] rolesUsers.roleid=currId if rolesUsers.canInsert() and rolesUsers.canModify(): if not rolesUsers.tryInsert(): rolesUsersOld.get(user["@sid"], currId) rolesUsers.recversion = rolesUsersOld.recversion rolesUsers.update() elif rolesUsers.canInsert(): rolesUsers.tryInsert() elif rolesUsers.canModify(): rolesUsersOld.get(user["@sid"], currId) rolesUsers.recversion = rolesUsersOld.recversion rolesUsers.update() else: raise CelestaException(u"Недостаточно прав для данной операции!")
def shiftNodeToOtherLevelInHierarchy(context, cursorInstance, numberField, sortField, parentNumber=None, isOneHierarchy=False): u'''Функция перемещает куст на уровень @parentNumber''' currentNumber = getattr(cursorInstance, numberField) numberList = currentNumber.split('.') parentNumberList = [] # Создаем клон основного курсора и копируем в него фильтры cursorInstanceClone = cursorInstance.__class__(context) if not isOneHierarchy: cursorInstanceClone.copyFiltersFrom(cursorInstance) cursorInstanceClone.limit(0, 0) # Находим правильное место вставки if parentNumber: parentNumberList = parentNumber.split('.') cursorInstanceClone.setFilter( numberField, '''('%s.'%%)&(!'%s.'%%'.'%%)''' % (parentNumber, parentNumber)) else: cursorInstanceClone.setFilter(numberField, '''(!%'.'%)''') level = len(numberList) if numberList == parentNumberList[:level]: raise CelestaException( u'''Невозможно сделать узел потомком себя и своих потомков''') elif numberList[:-1] == parentNumberList: return parentNumberList.append(unicode(cursorInstanceClone.count() + 1)) # Перемещаем все узлы текущего куста кроме корня cursorInstanceClone.setFilter(numberField, '''('%s.'%%)''' % currentNumber) for cursorInstanceClone in cursorInstanceClone.iterate(): numberListChild = getattr(cursorInstanceClone, numberField).split('.') cursorInstanceClone.__setattr__( numberField, '.'.join(parentNumberList + numberListChild[level:])) cursorInstanceClone.update() # Перемещаем корень текущего куста на правильную позицию currentSort = getattr(cursorInstance, sortField) cursorInstance.__setattr__(numberField, '.'.join(parentNumberList)) cursorInstance.update() # Перемещаем все нижестоящие кусты относительно текущего на одну позицию вверх if '.' in currentNumber: sqlPattern = '''('%s.'%%)&(!'%s.'%%'.'%%)''' % ('.'.join( numberList[:-1]), '.'.join(numberList[:-1])) else: sqlPattern = '''(!%'.'%)''' cursorInstanceClone.setFilter(numberField, sqlPattern) cursorInstanceClone.setFilter(sortField, '''>'%s' ''' % currentSort) cursorInstanceClone.orderBy(sortField) for cursorInstanceClone in cursorInstanceClone.iterate(): numberListChild = getattr(cursorInstanceClone, numberField).split('.') moveNodeInHierarchy(context, cursorInstanceClone, numberField, int(numberListChild[-1]) - 1) cursorInstanceClone.close()
def cardDataSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None): u'''Функция сохранения карточки редактирования содержимого справочника ролей. ''' roles = RolesCursor(context) #raise Exception(xformsdata) content = json.loads(xformsdata)["schema"]["role"] roles.id = content["id"] if content["description"] == '': roles.description = content["id"] else: roles.description = content["description"] if add == 'add' and roles.canInsert() and roles.canModify(): if not roles.tryInsert(): rolesOld = RolesCursor(context) rolesOld.get(content["id"]) roles.recversion = rolesOld.recversion roles.update() rolesReadPermission(roles) elif add == 'add' and roles.canInsert(): roles.insert() rolesReadPermission(roles) elif add == 'edit' and roles.canModify(): rolesOld = RolesCursor(context) currId = json.loads(session)['sessioncontext']['related'][ 'gridContext']['currentRecordId'] rolesOld.get(currId) if rolesOld.id == roles.id: roles.recversion = rolesOld.recversion roles.update() rolesReadPermission(roles) else: raise CelestaException(u"Недостаточно прав для данной операции!") else: raise CelestaException(u"Недостаточно прав для данной операции!")
def generateSortValue(number, rankList=[3]): u'''Функция формирует сортировочное значение из номера иерархии Дьюи. @number - номер иерархии Дьюи типа 1.1.1 @rankList - список отвечающий за количество разрядов на каждом уровне rankList[0] количество по умолчанию Данный параметр не обязателен по умолчанию равен [3] Пример: generateSortValue('1.2.3.4', [3,1,2,3])='102003004' ''' if not (isinstance(number, (str, unicode)) and isinstance(rankList, list)): raise CelestaException( u'Неверный формат аргументов. аргументы должны иметь вид (строка,список)' ) lenRankList = len(rankList) # убираем пустые строки numberList = filter(bool, number.split('.')) sortVal = [] for idx, val in enumerate(numberList): rank = rankList[idx + 1] if idx + 1 < lenRankList else rankList[0] sortVal.append(val.zfill(rank)) return ''.join(sortVal)
def getNextNum(self): """Finding next num""" if not self.lastUsed: return unicode(self.startNum) elif self.lastUsed < self.endNum: nextNum = unicode(self.lastUsed + self.incr) if int(nextNum) > self.endNum: raise Exception( 'Next number value is greater than max value for series %s' % self.seriesId) if self.isFixedLength: nextNum = '0' * (len(unicode(self.endNum)) - len(nextNum)) + nextNum """If nextNum == '2' but it should be like '0002' """ else: raise CelestaException( 'Last used value is greater than max value for series %s' % self.seriesId) return nextNum
def cardDataSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None): u'''Функция сохранения карточки редактирования содержимого справочника ролей. ''' rolesUsers = UserrolesCursor(context) logins = loginsCursor(context) currId = json.loads( session)['sessioncontext']['related']['gridContext']['currentRecordId'] settings = Settings() if settings.isUseAuthServer() and settings.loginIsSubject(): currId = json.loads(currId)[0] logins.get(currId) rolesUsers.setRange("userid", logins.subjectId) rolesUsers.deleteAll() if json.loads(xformsdata)["schema"]["roles"] <> '': content = json.loads(xformsdata)["schema"]["roles"]["role"] content = content if isinstance(content, list) else [content] rolesUsersOld = UserrolesCursor(context) for role in content: rolesUsers.roleid = role["@id"] rolesUsers.userid = logins.subjectId if rolesUsers.canInsert() and rolesUsers.canModify(): if not rolesUsers.tryInsert(): rolesUsersOld.get(logins.subjectId, role["@id"]) rolesUsers.recversion = rolesUsersOld.recversion rolesUsers.update() elif rolesUsers.canInsert(): rolesUsers.tryInsert() elif rolesUsers.canModify(): rolesUsersOld.get(logins.subjectId, role["@id"]) rolesUsers.recversion = rolesUsersOld.recversion rolesUsers.update() else: raise CelestaException( u"Недостаточно прав для данной операции!")
def getNextNoOfSeries(context, seriesId, linesOfNumbersSeries=None, updateNum=True): lonsFlag = False if linesOfNumbersSeries is None: linesOfNumbersSeries = linesOfNumbersSeriesCursor(context) lonsFlag = True linesOfNumbersSeries.setRange('seriesId', seriesId) linesOfNumbersSeries.setRange('isOpened', True) linesOfNumbersSeries.setRange('startingDate', datetime.strptime('1900-01-01', '%Y-%m-%d'), datetime.today()) if linesOfNumbersSeries.count() > 1: raise Exception( "There is more than one opened line in the series '%s'" % seriesId) if linesOfNumbersSeries.tryFindSet(): seriesObject = GettingNextNumberOfSeries( seriesId, linesOfNumbersSeries.lastUsedNumber, linesOfNumbersSeries.startingNumber, linesOfNumbersSeries.endingNumber, linesOfNumbersSeries.incrimentByNumber, linesOfNumbersSeries.isFixedLength) nextNum = seriesObject.getNextNum() linesOfNumbersSeries.lastUsedNumber = int(nextNum) linesOfNumbersSeries.lastUsedDate = datetime.today() if updateNum: linesOfNumbersSeries.update() prefix = linesOfNumbersSeries.prefix postfix = linesOfNumbersSeries.postfix if lonsFlag: linesOfNumbersSeries.close() return '%s%s%s' % (prefix, nextNum, postfix) else: CelestaException( "There are no available opened lines in the series '%s'!" % seriesId)
def startElement(self, namespaceURI, lname, qname, attrs): if self.parentTag == 'field': if self.flag == 0: self.stringWriter = StringWriter() self.xmlWriter = XMLOutputFactory.newInstance( ).createXMLStreamWriter(self.stringWriter, "UTF-8") self.flag += 1 self.xmlWriter.writeStartElement(qname) for i in range(0, attrs.getLength()): self.xmlWriter.writeAttribute(attrs.getQName(i), attrs.getValue(i)) elif qname == 'table' and self.flag == 0: if self.parentTag is not None: raise CelestaException(u"Неверный формат файла") self.parentTag = qname if not attrs.getValue('name'): raise CelestaException( u"Атрибут 'name' отсутствует в теге 'table'") elif attrs.getValue('name') != self.tableInstance.meta().getName(): raise CelestaException( u"Имя таблицы %s не соответствует значению атрибута 'name'" % self.tableInstance.meta().getName()) elif qname == 'row' and self.flag == 0: if self.parentTag != 'table': raise CelestaException(u"Неверный формат файла") self.parentTag = qname elif qname == 'field' and self.flag == 0: if self.parentTag != 'row': raise CelestaException(u"Неверный формат файла") self.currentEncoding = attrs.getValue('encoding') or u"utf8" self.currentCell = attrs.getValue('name') self.parentTag = qname self.currentString = u'' else: raise CelestaException(u"Неверный формат файла")
def cardDataSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None): u'''Функция сохранения карточки редактирования содержимого справочника разрешений. ''' linesOfNumbersSeries = linesOfNumbersSeriesCursor(context) content = json.loads(xformsdata)["schema"]["numberSeries"] #raise Exception(xformsdata) sdf = SimpleDateFormat("yyyy-MM-dd") linesOfNumbersSeries.seriesId = content["@seriesId"] linesOfNumbersSeries.numberOfLine = int(content["@numberOfLine"]) if content["@startingDate"] == '': linesOfNumbersSeries.startingDate = sdf.parse( datetime.datetime.fromtimestamp(time.time()).strftime("%Y-%m-%d")) else: linesOfNumbersSeries.startingDate = sdf.parse(content["@startingDate"]) linesOfNumbersSeries.startingNumber = content["@startingNumber"] linesOfNumbersSeries.endingNumber = content["@endingNumber"] linesOfNumbersSeries.incrimentByNumber = content["@incrimentByNumber"] linesOfNumbersSeries.isOpened = content["@isOpened"] == "true" if content["@lastUsedDate"] <> '': linesOfNumbersSeries.lastUsedDate = sdf.parse(content["@lastUsedDate"]) linesOfNumbersSeries.prefix = content["@prefix"] linesOfNumbersSeries.postfix = content["@postfix"] linesOfNumbersSeries.isFixedLength = content["@isFixedLength"] == "true" if add == 'add' and linesOfNumbersSeries.canInsert( ) and linesOfNumbersSeries.canModify(): if content["@lastUsedNumber"] == '': linesOfNumbersSeries.lastUsedNumber = int( content["@startingNumber"]) else: linesOfNumbersSeries.lastUsedNumber = int( content["@lastUsedNumber"]) if not linesOfNumbersSeries.tryInsert(): linesOfNumbersSeriesOld = linesOfNumbersSeriesCursor(context) linesOfNumbersSeriesOld.get(content["@seriesId"], int(content["@numberOfLine"])) linesOfNumbersSeries.recversion = linesOfNumbersSeriesOld.recversion linesOfNumbersSeries.update() elif add == 'add' and linesOfNumbersSeries.canInsert(): if content["@lastUsedNumber"] == '': linesOfNumbersSeries.lastUsedNumber = int( content["@startingNumber"]) else: linesOfNumbersSeries.lastUsedNumber = int( content["@lastUsedNumber"]) linesOfNumbersSeries.insert() elif add == 'edit' and linesOfNumbersSeries.canModify(): linesOfNumbersSeriesOld = linesOfNumbersSeriesCursor(context) linesOfNumberSeriesTest = linesOfNumbersSeriesCursor(context) gridContext = json.loads( session)['sessioncontext']['related']['gridContext'] gridContext = gridContext if isinstance(gridContext, list) else [gridContext] currentId = {} for gc in gridContext: if "currentRecordId" in gc.keys(): currentId[gc["@id"]] = gc["currentRecordId"] linesOfNumbersSeriesOld.get(currentId["numbersSeriesGrid"], int(currentId["linesNumbersSeriesGrid"])) if content["@lastUsedNumber"] == '': linesOfNumbersSeries.lastUsedNumber = linesOfNumbersSeriesOld.lastUsedNumber else: linesOfNumbersSeries.lastUsedNumber = int( content["@lastUsedNumber"]) if linesOfNumbersSeriesOld.numberOfLine == linesOfNumbersSeries.numberOfLine: #linesOfNumbersSeriesOld.seriesId==linesOfNumbersSeries.seriesId and \ linesOfNumbersSeries.recversion = linesOfNumbersSeriesOld.recversion linesOfNumbersSeries.update() elif linesOfNumberSeriesTest.tryGet( linesOfNumbersSeries.seriesId, int(linesOfNumbersSeries.numberOfLine)): context.error(u'Серия с данным номером уже существует.') elif linesOfNumbersSeries.canInsert(): linesOfNumbersSeriesOld.delete() linesOfNumbersSeries.insert() else: raise CelestaException(u"Недостаточно прав для данной операции!") else: raise CelestaException(u"Недостаточно прав для данной операции!")
def cardDataSave(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None): u'''Функция сохранения карточки редактирования содержимого справочника ролей. ''' settings = Settings() logins = loginsCursor(context) subject = subjectsCursor(context) content = json.loads(xformsdata)["schema"]["user"] if not settings.isUseAuthServer(): # пользователи берутся из logins if add == 'edit' and content["@password"] == '': # если пароль при редактировании не заполнен, сохраняем в курсоре старый пароль из базы loginsOld = loginsCursor(context) currId = json.loads(session)['sessioncontext']['related'][ 'gridContext']['currentRecordId'] loginsOld.get(currId) logins.password = loginsOld.password else: # иначе зашифровываем пароль из карточки pass_hash = hashlib.sha1() # Объект типа hash pass_hash.update(content["@password"] ) # Записываем в него текущий пароль из карточки logins.password = pass_hash.hexdigest( ) # Выполняем hash функцию, записываем результат в курсор. logins.userName = content["@userName"] if content[ "@subjectId"] == "": # если subjectId из карточки пуст, записываем в базу null logins.subjectId = None else: logins.subjectId = content["@subjectId"] if settings.loginIsSubject(): # если loginIsSubject, cохраняем сначала subject, потом login subject.sid = content["@subjectId"] subject.name = content["@userName"] if content[ "@employeeId"] == '': # если employeeId из карточки пуст (сотрудник не выбран), записываем в базу null subject.employeeId = None else: subject.employeeId = content["@employeeId"] # сохранение subject if add == 'add' and subject.canInsert() and subject.canModify(): if not subject.tryInsert(): subjectOld = subjectsCursor(context) subjectOld.get(content["@subjectId"]) subject.recversion = subjectOld.recversion subject.update() elif add == 'add' and logins.canInsert(): subject.insert() elif add == 'edit' and subject.canModify(): subjectOld = subjectsCursor(context) subjectOld.get(content["@subjectId"]) subject.recversion = subjectOld.recversion subject.update() else: raise CelestaException( u"Недостаточно прав для данной операции!") # сохранение login if add == 'add' and logins.canInsert() and logins.canModify(): if not logins.tryInsert(): logins.update() elif add == 'add' and logins.canInsert(): logins.insert() elif add == 'edit' and logins.canModify(): loginsOld = loginsCursor(context) loginsOld.get(content["@userName"]) logins.recversion = loginsOld.recversion logins.update() else: raise CelestaException(u"Недостаточно прав для данной операции!") else: # пользователи берутся из mellophone if logins.tryGet(content["@userName"]): # если запись с данным userName уже есть в таблице logins (Подробнее см. ниже) if settings.loginIsSubject(): # если логины и субъекты тождественны if not subject.tryGet(logins.subjectId): subject.sid = content["@sid"] if content["@employeeId"] == '': subject.employeeId = None else: subject.employeeId = content["@employeeId"] subject.name = content["@userName"] logins.subjectId = subject.sid # сохранение subject. Запись в logins уже есть if subject.canInsert() and subject.canModify(): if not subject.tryInsert(): subjectOld = subjectsCursor(context) subjectOld.get(content["@subjectId"]) subject.recversion = subjectOld.recversion subject.update() elif subject.canModify(): subjectOld = subjectsCursor(context) subjectOld.get(content["@subjectId"]) subject.recversion = subjectOld.recversion subject.update() else: raise CelestaException( u"Недостаточно прав для данной операции!") else: # Если субъекты тождественны сотрудникам, записываем subjectId в logins.subjectId # то есть, просто привязываем logins к subjects if content["@subjectId"] == "": logins.subjectId = None else: logins.subjectId = content["@subjectId"] # обновление logins if logins.canModify(): logins.update() else: raise CelestaException( u"Недостаточно прав для данной операции!") else: # пользователя нет в logins if settings.loginIsSubject(): # если loginIsSubject, cохраняем сначала subject, потом login if content["@employeeId"] == '': logins.subjectId = None else: subject.employeeId = content["@employeeId"] subject.sid = content["@sid"] subject.name = content["@userName"] logins.subjectId = subject.sid if subject.canInsert() and subject.canModify(): if not subject.tryInsert(): subjectOld = subjectsCursor(context) subjectOld.get(content["@subjectId"]) subject.recversion = subjectOld.recversion subject.update() elif subject.canInsert(): subject.insert() else: raise CelestaException( u"Недостаточно прав для данной операции!") else: if content["@subjectId"] == "": logins.subjectId = None else: logins.subjectId = content["@subjectId"] # В случае, когда пользователи берутся из mellophone, и к пользователю делается привязка, # (<employees> к logins-subjects или <employees>-subjects к logins) # делается запись в logins logins.userName = content["@userName"] logins.password = "" if logins.canInsert(): logins.insert() else: raise CelestaException( u"Недостаточно прав для данной операции!")
def endElement(self, uri, lname, qname): if qname == 'table' and self.flag == 0: self.parentTag = None elif qname == 'row' and self.flag == 0: # обновляем или вставляем записи self.funcAction(self.tableInstance) self.tableInstance.clear() self.parentTag = 'table' elif qname == 'field' and self.flag == 0: # Вставка данных в поле таблицы, отдельно рассмотрен случай если данные в формате XML if hasattr(self, 'stringWriter') and self.stringWriter: self.xmlWriter.close() # Вставка данных в поле типа blob if self.tableInstance.meta().columns[ self.currentCell].getCelestaType() == 'BLOB': getattr(self.tableInstance, "calc%s" % self.currentCell)() blobField = self.tableInstance.__dict__[ self.currentCell].getOutStream() blobField.write(self.stringWriter.strip()) else: self.tableInstance.__setattr__( self.currentCell, self.stringWriter.toString()) self.stringWriter.flush() self.stringWriter = None self.xmlWriter = None else: # проверка на None if self.currentString.strip() != 'None': self.currentString = self.currentString.strip() # Вставка данных в поле типа blob if self.tableInstance.meta().columns[ self.currentCell].getCelestaType() == 'BLOB': getattr(self.tableInstance, "calc%s" % self.currentCell)() blobField = self.tableInstance.__dict__[ self.currentCell].getOutStream() if self.currentEncoding == u"utf8": blobField.write(self.currentString) elif self.currentEncoding == u"base64": blobField.write( base64.b64decode(self.currentString)) else: raise CelestaException(u"Неверная кодировка") elif self.tableInstance.meta().columns[ self.currentCell].getCelestaType() == 'DATETIME': sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") self.tableInstance.__setattr__( self.currentCell, sdf.parse(self.currentString)) elif self.tableInstance.meta().columns[ self.currentCell].getCelestaType() == 'BIT': self.tableInstance.__setattr__( self.currentCell, self.currentString.lower() == "true") else: if self.currentCell == 'prefix': pass self.tableInstance.__setattr__(self.currentCell, self.currentString) self.parentTag = 'row' self.currentCell = None self.currentString = None elif self.parentTag == 'field': self.xmlWriter.writeEndElement() self.flag -= 1