def transfer_tasks(self, from_robot, to_robot, cnt, param=None): try: dbExecDirect( sql='execute procedure HEALTH_TRANSFER_TASKS(?,?,?,?)', params=(from_robot, to_robot, cnt, param), fetch='none', id_base=self.id_base_kurs) except Exception, exc: return self.pyDumps(ext_data={'res': '0', 'errMes': exc[1]})
def custom_changezone_get_html(self): # get xml rights CHANGEZONE system majorDb = db.getIdMajorDb() id_system_changezone = si.find_id_system_by_full_ref_name( '/KURS/CHANGEZONE') sysOptions = so.SysOptions(None, cfg.options_instances_subdir, id_system=id_system_changezone) if sysOptions.opt('grant', None, 'changezone', 'other'): resZone = db.dbExecDirect( sql= "select goi.* from K_CHANGEZONE_GET_ZONE(?) goi order by goi.name", params=[None], fetch='all', id_base=majorDb) else: category = sysOptions.opt('view', 'category', 'changezone', 'other') if category: category = sysOptions.opt('view', 'category', 'changezone', 'other') category = re.sub('[|_.+ ]', ',', category) else: category = '' resZone = db.dbExecDirect( sql="select goi.* from K_CHANGEZONE_GET_ZONE(?) goi \ join RBS_CHANGEZONE_GET_OBJ(?) go on go.objid = goi.objid \ order by goi.name", params=[category, self.custom_get_employee_zone_object()], fetch='all', id_base=majorDb) resZone['zone_datalist'] = resZone['datalist'] del resZone['datalist'] # get user zone try: user_zone = db.dbExecDirect(sql='select * from K_GET_ADDINFO(?)', params=[self.getUserVar('uid')], fetch='one', id_base=majorDb) except: user_zone = {'ZONEID': '', 'ADDINFO': ''} return self.drawTemplate(templ=changezone, data=[ resZone, { 'user_zone_id': user_zone['ZONEID'], 'user_zone_name': user_zone['ADDINFO'] } ])
def deleteaorderstat(self): if self.opt('grant', None, 'delete_aorder_stat', 'other'): id_base = find_id_base_by_code('KURS') try: dbExecDirect( sql='execute procedure HEALTH_R_QUEUE_STAT_DELETE', params=(), fetch='none', id_base=id_base) except Exception, exc: return self.pyDumps(ext_data={'res': '0', 'errMes': exc[1]}) return self.pyDumps(ext_data={'res': '1'})
def get_block_robots(self, rmode='dic', ismobile='0', param=None): dic = dbExecDirect( sql='select * from HEALTH_ROBOTS(?) order by health desc', params=[param], fetch='all', id_base=self.id_base_kurs) if rmode == 'dic': return dic return self.return_block(rmode, dic, 'ROBOTS', ismobile)
def get_devels(self, ip=None, dtBeg=None, dtEnd=None, idBase=None): #import time #time_beg=time.time() conEngine = db.getConEng() #GTT очищается при commit t = db.Trans(id_system=-1, conEngine=conEngine) try: devels = [] if ip is not None: # по каждой записи в base.k_ip_access_log (ip, access_stamp) по ip и для заданного периода в фильтре и заданной базы for access_stamp_ds in db.dbExecDirect(sql = "select access_stamp" \ " from K_IP_ACCESS_LOG where ip is not distinct from ?" \ " and access_stamp between ? and ? ", params=(ip, dtBeg, dtEnd), fetch='all', id_base=idBase, conEngine=conEngine )['datalist']: access_stamp = access_stamp_ds['ACCESS_STAMP'] # проинсертить t.dbExec( sql= "insert into GTT_IP_ACCESS_LOG(ACCESS_STAMP) values(?)", params=[access_stamp], fetch='none') for devel in t.dbExec(sql = "select devel_id, devel_fio" \ " from T_GET_DEVELS_BY_GTT(?,?)", params=(ip, idBase), fetch='all' )['datalist']: if devel['DEVEL_ID'] not in map(lambda d: d['DEVEL_ID'], devels): devels.append({ 'DEVEL_ID': devel['DEVEL_ID'], 'DEVEL_FIO': devel['DEVEL_FIO'] }) else: devels.append({ 'DEVEL_ID': -1, 'DEVEL_FIO': 'Firebird Utilites' }) t.commit() except: t.rollback() raise #print "get_devels Exec Time: ", time.time()-time_beg return devels
def custom_get_sessionid(self): majorDb = db.getIdMajorDb() employeeID = db.dbExecDirect( sql='select id_man from k_users k where k.id_user = ?', params=[self.getUserVar('uid')], fetch='one', id_base=majorDb) if employeeID: sessionid = db.dbExecDirect( sql= 'select first(1) w.sessionid from wm_session w where w.objid=? order by w.connecttime desc', params=[employeeID['ID_MAN']], fetch='one', id_base=majorDb)['SESSIONID'] else: sessionid = None return sessionid
def custom_changezone_set_zone(self, zoneid): majorDb = db.getIdMajorDb() return self.pyDumps( db.dbExecDirect(sql='select * from UR_GET_ZONE_BY_BARCODE(?,?,?)', params=[ self.custom_get_sessionid(), self.getUserVar('uid'), zoneid ], fetch='one', id_base=majorDb))
def custom_get_employee_zone_object(self): majorDb = db.getIdMajorDb() employeeID = db.dbExecDirect( sql='select id_man from k_users k where k.id_user = ?', params=[self.getUserVar('uid')], fetch='one', id_base=majorDb) if employeeID: zone = db.dbExecDirect(sql='select z.objid from employee e \ left join sitezone z on z.zoneid = e.currentzone \ where e.employeeid = ?', params=[employeeID['ID_MAN']], fetch='one', id_base=majorDb) if zone: return zone['OBJID'] else: return None else: return None
def ajaxTicketDelAll(self, perm): "Удалять можно только временные или только постоянные тикеты: если perm истинен, то постоянные, иначе - временные" tickets = [] """for dic in self.dbExec(sql="select TICKET_ID, DEVEL_ID, DEVEL_FIO, REASON, GRANT_STAMP, TICKET, DELETED_TIME, ADMIN_FIO, DB_IP, DB_NAME" \ " from T_GET(?,?,?,?,?,?,?,?) WHERE DELETED_TIME IS NULL", params=(None, None, None, mxToday(), LastTodayTime(), None, None, None), fetch='all')['datalist']:""" for dic in self.tickets_get(ticketId=None, develId=None, reason=None, dtBeg=mxToday(), dtEnd=LastTodayTime(), ticket=None, adminId=None, idBase=None, perm=self.cStrE(perm), only_no_deleted=True, ip=None)['datalist']: tickets.append(dic) dic = self.dbExec(sql="select DELETED_TIME from T_MARK_DEL_ALL(?)", params=[self.cStrE(perm)], fetch='one') if dic is not None: deleted_time = formatMxDateTime(dic['DELETED_TIME'], format='%H:%M', sformatFrom='%H:%M:%S') else: deleted_time = '' #для каждой зарегистрированной БД вызываем очистку каталогов тикетов на серверах (за сегодня) #for dic in self.dbExec(sql="select TICKETS_PATH_HOME, SERVER_IP, SERVER_USER from ENGINE_GET_BASES_INFO(NULL)", fetch='all')['datalist']: for base in db.get_bases_info()['dbs']: db.dbExecDirect(sql="delete from K_IP_CHECK where PERM is not null and PERM " + pu.iif(perm!='0', '<>0', '=0'), params=[], fetch='none', id_base=base['ID_BASE'] ) dublin.dropTodayLinks(links_path=pu.iif(perm!='0', base['TICKETS_PERM_PATH_HOME'], base['TICKETS_PATH_HOME']), user=base['SERVER_USER'], ip=base['SERVER_IP']) #по всем тикетам, попавшим в фильтр for dic in tickets: pu.send_devel_mail(subject='Тикет удалён', body='Тикет: %s\nIP/port: %s\nБД: %s\nID тикета: %s\nПерманент: %s\nВремя удаления: %s%s' \ % (dic['TICKET'], dic['DB_IP'], dic['DB_NAME'], dic['TICKET_ID'], pu.iif(dic['PERM'], 'Да', 'Нет'), deleted_time, signature), id_devel=dic['DEVEL_ID']) return self.pyDumps(ext_data={'DELETED_TIME': deleted_time})
def get_block(self, rmode='dic', refresh_block=None, ismobile='0'): if refresh_block.upper() == 'PYTHON': return self.get_block_python(rmode, ismobile) if refresh_block.upper() == 'ROBOTS': return self.get_block_robots(rmode, ismobile) dic = {} dic.update( dbExecDirect(sql='select * from HEALTH_' + refresh_block.upper(), params=(), fetch='one', id_base=self.id_base_kurs)) if rmode == 'dic': return dic return self.return_block(rmode, dic, refresh_block, ismobile)
def rbs_close_check(term_id_user): """Запрос на закрытие терминальной сессии в RBS. Возвращает сообщение об ошибке или пустую строку в случае удачи. """ # получить id_base RBS rbs_id_base = db.getIdMajorDb() # запрос на закрытие сессии в RBS close_check = db.dbExecDirect(sql="select * from %s(?)" % cfg.MAJOR_DB_USER_SESSION_CLOSE_CHECK, params=[term_id_user], fetch='one', id_base=rbs_id_base) if close_check['MES'] is None: return '' else: return close_check['MES']
def get_block_order(self, rmode='dic', refresh_block=None): dic = {} if self.opt('grant', None, 'delete_aorder_stat', 'other'): dic['can_delete_aorderstat'] = '1' else: dic['can_delete_aorderstat'] = '0' dic.update( dbExecDirect(sql='select * from HEALTH_AORDER', params=(), fetch='one', id_base=self.id_base_kurs)) if rmode == 'dic': return dic if refresh_block is None: return self.return_block(rmode, dic, refresh_block, ismobile) dic_refresh = {} for key in dic.keys(): if (key.find(refresh_block) != -1): dic_refresh[key] = dic[key] return self.return_block(rmode, dic_refresh, refresh_block, ismobile)
def conlog_details(self, dtBeg=None, dtEnd=None, idBase=None, ip=None): """ip - один из ip-адресов разработчика, на которые выдан тикет """ # 0. Обработка входных параметров dtBeg = self.cDateTime(dtBeg) if dtBeg is None: dtBeg = '01.01.2000' dtEnd = self.cStrE(dtEnd) if dtEnd is None: dtEnd = '01.01.2100' else: dtEnd = dtEnd + ' 23:59:59' dtEnd = self.cDateTime(dtEnd) idBase = self.cInt(idBase) ip = self.cStrE(ip) if ip is None: ip = '' # 1. Получить таблицу A без поля WHOS detail_lst = db.dbExecDirect(sql = "select access_stamp" \ " from K_IP_ACCESS_LOG where " + pu.iif(ip, "IP='"+ip+"'", 'IP IS NULL') + " and access_stamp between ? and ? " \ " order by 1 desc", params=(dtBeg, dtEnd), fetch='all', id_base=idBase )['datalist'] return self.drawTemplate(templ=conlog_detail, data=[{ 'detail': detail_lst }])
def ajaxTicketAdd(self, develId, idBase, reason, perm, ips): #db_info = self.dbExec(sql="select DB_IP, DB_NAME, DB_LOCATION, SERVER_IP, SERVER_USER, TICKETS_PATH_HOME from ENGINE_GET_BASES_INFO(?)", params=[self.cInt(idBase)], fetch='one') #if db_info is None: # raise TicketsException('Base with ID=%s not found!' % idBase) #dbs = db.get_bases_info(idBase)['dbs'] #if len(dbs) == 0: # raise TicketsException('Base with ID=%s not found!' % idBase) #db_info = dbs[0] #Переводим из строки в объект ips = json.loads(ips) db_info = db.get_bases_info(self.cInt(idBase)) db_location = db_info['DB_LOCATION'] server_user = db_info['SERVER_USER'] server_ip = db_info['SERVER_IP'] db_ip = db.db_ip_to_private(db_info['DB_IP']) db_name = db_info['DB_NAME'] tickets_path_home = db_info['TICKETS_PATH_HOME'] tickets_perm_path_home = db_info['TICKETS_PERM_PATH_HOME'] devel = self.dbExec(sql="select DEVEL_LOGIN, DEVEL_FIO FROM T_DEVEL WHERE DEVEL_ID=?", params=[self.cInt(develId)], fetch='one') if devel is None: raise TicketsException('Developer with ID=%s not exists' % develId) reason = pu.convToWin(reason) devel_login = devel['DEVEL_LOGIN'] devel_fio = devel['DEVEL_FIO'] ticket = dublin.createLink(db_location=db_location, links_path=pu.iif(perm!='0', tickets_perm_path_home, tickets_path_home), login=devel_login, user=server_user, ip=server_ip) #print "55555555555555" #print perm, self.cStrE(perm) #print "55555555555555" conEngine = db.getConEng() group = dbEngine.ConnectionGroup() try: conDb = db.getConDb(self.cInt(idBase)) group.add(conDb) #conEngine.commit() group.add(conEngine) group.begin() try: dic = db.dbExec(sql="select TICKET_ID, GRANT_STAMP from T_ADD(?,?,?,?,?,?)", params=(self.cInt(develId), reason, ticket, self.getUserVar('uid'), self.cInt(idBase), self.cStrE(perm) ), fetch='one', id_system=-1, con=conEngine, conEngine=conEngine ) grant_stamp = formatMxDateTime(dic['GRANT_STAMP'], '%d.%m.%Y %H:%M') for ip in ips: """ip = db.dbExec(sql="select IP from T_DEVEL_IP where ID_DEVEL_IP=?", params=[str(id_ip)], fetch='one', id_system=-1, con=conEngine, conEngine=conEngine )['IP'] """ dic_ip = db.dbExec(sql="select ID_TICKETS_IP from T_ADD_IP(?,?)", params=(dic['TICKET_ID'], str(ip) ), fetch='one', id_system=-1, con=conEngine, conEngine=conEngine ) dic_base_ip = db.dbExecDirect(sql="INSERT INTO K_IP_CHECK (IP, DEVEL_FIO, TICKET_ID, PERM) VALUES(?,?,?,?)", params=(str(ip), devel_fio, dic['TICKET_ID'], self.cStrE(perm) ), fetch='none', id_base=self.cInt(idBase), con=conDb, conEngine=conEngine ) #conEngine.savepoint('A') except: if group.count(): group.rollback() raise else: group.commit() finally: group.disband() #disband the group so that member connections can operate independently again. if dic is not None: pu.send_devel_mail(subject='Тикет выдан', body='Тикет: %s\nIP/port: %s\nБД: %s\nID тикета: %s\nПерманент: %s\nВремя выдачи: %s\nПричина: %s\nРазработчик: %s\nВыдал: %s%s' \ % (ticket, db_ip, db_name, dic['TICKET_ID'], pu.iif(perm!='0', 'Да', 'Нет'), grant_stamp, reason, devel_fio, self.getUserVar('userfio'), signature), id_devel=develId) return self.pyDumps(ext_data={'TICKET_ID': dic['TICKET_ID'], 'GRANT_STAMP': grant_stamp, #'REASON': dic['REASON'], 'DEVEL_FIO': devel_fio, 'TICKET': ticket, 'ADMIN_FIO': self.getUserVar('userfio'), 'DB_IP': db_ip, 'DB_NAME': db_name }) else: return self.pyDumps(ext_data={'TICKET': 'no'})
def draw_system_list(self, username, password, first_time=0, pwd_is_hash='0'): u"""Валидация логина и пароля и проброс вглубь дерева подсистем. Возвращает словарь {'ERROR_CODE': ERROR_CODE, 'ERROR_MSG': ERROR_MSG, 'REDIRECT_CODE': REDIRECT_CODE, 'REDIRECT_DATA': REDIRECT_DATA}, где ERROR_CODE - ERROR_MSG: '0' - null (удачно) '1' - "Не указан логин" '2' - "Пользователь не заведён в системе!" '3' - "Администратор не установил Ваш пароль!" '4' - "Неверный пароль!" '5' - "Не указан пароль!" '6' - "Пароль не переустановлен пользователем!" '100' - "Организация временно отключена" (слой отключён) '110' - "Доступ запрещён по данным СКУД" '120' - "Ошибка открытия сессии..." REDIRECT_CODE: 0 - REDIRECT_DATA содержит url для проброса (перейти в него изнутри движка так: cp_utils.HTTPRedirect(REDIRECT_DATA)) 1 - REDIRECT_DATA содержит отрисованную html-страницу авторизации со списком систем, если ERROR_CODE==0 или с ошибкой, если ERROR_CODE!=0 2 - REDIRECT_DATA содержит текст ошибки, для отображения на отдельной странице ошибки (перейти в него изнутри движка так: cp_utils.goToError(REDIRECT_DATA)) Если ERROR_CODE==0, то REDIRECT_CODE in [0, 1]. Если ERROR_CODE!=0, то REDIRECT_CODE in [1, 2]. """ # обрабатываем параметры if pwd_is_hash in ['0', '', None]: pwd_is_hash = False else: pwd_is_hash = True # инициализируем результат result = {'ERROR_CODE': 0, 'ERROR_MSG': None, 'REDIRECT_CODE': 0, 'REDIRECT_DATA': ''} #снова выставляем переменные, если пользователь попал на login минуя index #например, нажал в браузере "Обновить" на форме списка систем self.setSesVar('termiduser', None) self.setSesVar('termusername', None) self.setSesVar('termnum', None) self.setSesVar('termname', None) usr = verify_user(username, password, pwd_is_hash=pwd_is_hash) if usr['ERROR_CODE']: result['ERROR_CODE'] = usr['ERROR_CODE'] result['ERROR_MSG'] = usr['ERROR_MSG'] result['REDIRECT_CODE'] = 1 if usr['ERROR_CODE'] == 6: self.setSesVar('tmp_uid', usr['ID_USER']) self.setSesVar('tmp_login', username) result['REDIRECT_DATA'] = self.drawTemplate(templ=login_change_passwd, data=[{'username': username, 'mes': '', 'uid': self.getSesVar('tmp_uid')}, {'langs': cpu.getConfigLangs()}], draw_wo_login=True) else: result['REDIRECT_DATA'] = self.drawTemplate(templ=login_index, data=[{'username': username, 'mes': usr['ERROR_MSG']}, {'langs': cpu.getConfigLangs()}], draw_wo_login=True) return result #if password == '': # return self.drawTemplate(templ=login_index,data=[{'username':username, 'mes':'Введите пароль пож-та'}], draw_wo_login=True) # залогинились # проверяем здесь, а не в cpu.sec для ускорения ответа сервера # и не чистим SesVar('ip_addr') при выходе из Курса (exit), чтоб запомнить и вычислить пересечения сессий # за всё время хранения сессий # если бы сессии хренились в файле, то можно было бы не перевходить и продолжалось бы пересечения # и пришлось бы обрабатывать в sec # но т.к. в RAM и часто перегружается # cherrypy.session.id - есть гарантировано здесь, проверено, даже когда чистят куки, id уже сформирован к этому времени #print self.getSesVar('ip_addr'), cpu.get_remote_ip(), sessions.session_id() #if self.getSesVar('ip_addr') is None: # self.setSesVar('ip_addr', cpu.get_remote_ip()) #elif self.getSesVar('ip_addr') != cpu.get_remote_ip(): # raise CrossSessionsException( # 'Пересечение сессий! Очистите куки браузера! Ваш ip=%s пересекается с ip=%s по session_id=%s' # % (cpu.get_remote_ip(), self.getSesVar('ip_addr'), sessions.session_id())) """ Бывшая проверка пересечения сессий в УР session_ip = self.getSesVar('ip_addr') real_ip = cpu.get_remote_ip(if_proxy='client') # if_proxy='client' - чтоб если входим 2-й раз, не нажимая Выход, не выдавало пересечение сессий (если не рвался инет) if session_ip is None: self.setSesVar('ip_addr', real_ip) elif session_ip != real_ip and usr['ID_USER'] != self.getUserVar('uid') and self.getKursZoneId(usr['ID_USER']) != self.getKursZoneId(self.getUserVar('uid')): cpu.cherrypylog('---------------------CROSS SESSIONS---------------------') cpu.cherrypylog('Entering user: login=%s, uid=%d, userfio=%s' % (username, usr['ID_USER'], usr['FIO'])) cpu.cherrypylog('Request headers:\n'+self.df(cherrypy.request.headers)) cpu.cherrypylog('Existing session info:') raise CrossSessionsException( 'Пересечение сессий! Возможно, у Вас изменился ip-адрес. Очистите куки браузера, нажмите на ссылку <a href="/exit">Выход</a> и перезайдите в КУРС! Ваш ip=%s пересекается с ip=%s по session_id=%s.' % (real_ip, session_ip, sessions.session_id())) """ # активируем переменные сессии #self.setSesVar("login",username) #self.setSesVar("uid",usr['ID_USER']) #self.setSesVar("userfio",usr['FIO']) #print "draw_system_list: self.getUserVar('uid'): ", self.getUserVar("uid") #self.setSesVar("is_admin",usr['IS_ADMIN']) # рисуем админпанель #if usr['IS_ADMIN']: # self.setSesVar("granted_system_refs", ['admin']) # raise cherrypy.HTTPRedirect('/admin') if layers.layersIsUse() and not adm.userIsSuperAdmin(uid=usr['ID_USER']): li = layers.layerInfo(layer_id=usr['LAYER_ID']) layer_disabed = li['DISABLED'] if layer_disabed is not None and layer_disabed != 0: #or layers.tar_layer_expired_days_remains(layer_id=usr['LAYER_ID']) <= 0: result['ERROR_CODE'] = 100 result['ERROR_MSG'] = _('Ваша организация временно отключена. Обратитесь в службу поддержки, если считаете это необоснованным.') result['REDIRECT_CODE'] = 2 result['REDIRECT_DATA'] = result['ERROR_MSG'] return result if getattr(cfg, 'SKUD_INTEGRATION', False) and cpu.isPC() and getattr(cfg, 'SKUD_CHECK_PC', False): allow = db.dbExecDirect(sql='select ALLOW from %s(?)' % cfg.SKUD_MAJOR_DB_ACCESS_PROC, params=[usr['ID_USER']], fetch='one', id_base=db.getIdMajorDb())['ALLOW'] if not allow: result['ERROR_CODE'] = 110 result['ERROR_MSG'] = _('Доступ запрещён по данным СКУД!') result['REDIRECT_CODE'] = 2 result['REDIRECT_DATA'] = result['ERROR_MSG'] return result probros = False go_url = '' if not first_time: # заказан ли проброс для этого вида оборудования в конфиге probros = cfg.sessions_forward_to_last_iface_pc if probros: # читаем данные последней сессии error_msg, go_url, ses_info = sessions.session_last_session_info(uid=usr['ID_USER'], fio=usr['FIO'], equip_kind='P') # ошибка получения информации о последней сессии if error_msg: cpu.cherrypylog(error_msg, context='APP.SESSIONS') probros = False #открываем сессию old_web_session_id, error_msg = sessions.session_open(uid=usr['ID_USER'], fio=usr['FIO'], equip_kind='P') # ошибка открытия сессии if error_msg: cpu.cherrypylog(error_msg, context='APP.SESSIONS') result['ERROR_CODE'] = 120 result['ERROR_MSG'] = error_msg result['REDIRECT_CODE'] = 1 result['REDIRECT_DATA'] = self.drawTemplate(templ=login_index, data=[{'mes': error_msg}, {'langs': cpu.getConfigLangs()}], draw_wo_login=True) return result # удаляем старую web-сессию if old_web_session_id: sessions.session_delete_old_web_session(old_web_session_id) # заполняем переменные сессии юзера create_user_session_class(login=username, uid=usr['ID_USER'], userfio=usr['FIO'], email=usr['EMAIL'], phonenumber=usr['PHONENUMBER'], layer_id=usr['LAYER_ID'], locale=usr['LANG_CODE'] or self.getSesVar('locale'), is_superadmin=usr['IS_SUPERADMIN']) # далее реализуем проброс # проброс в зависимости от настроек конфигурации и наличия последней сохранённой сессии # после регистрации (1-й вход) не делаем проброс в последнюю систему if not first_time and probros and go_url: # если error_msg пусто, то go_url заполнено - переходим в него cpu.cherrypylog(error_msg, context='APP.SESSIONS') result['ERROR_CODE'] = 0 result['ERROR_MSG'] = None result['REDIRECT_CODE'] = 0 result['REDIRECT_DATA'] = go_url return result else: # иначе - анализируем # получаем рекурсивно доступные системы, сортируя по cfg.systems_order systems = get_user_systems(uid=self.getUserVar("uid"), higher=None, recurse=1, use_layers=None) # если юзер не имеет прав ни на одну из систем if len(systems['datalist']) == 0: result['ERROR_CODE'] = 0 result['ERROR_MSG'] = None result['REDIRECT_CODE'] = 1 result['REDIRECT_DATA'] = self.drawTemplate(templ=login_index, data=[{'mes': _('Пользователь не имеет прав ни на одну систему')}, {'langs': cpu.getConfigLangs()}], draw_wo_login=True) return result # если у юзера есть право на КУРС, то перебрасываем в него """KURS_link = '/KURS' KURS_found = False for dic in systems['datalist']: if KURS_link == dic['FULL_REF_NAME']: KURS_found = True KURS_id_system = dic['ID_SYSTEM'] break if KURS_found: raise cherrypy.HTTPRedirect(KURS_link+'/?id_system='+ str(KURS_id_system)) """ link_found = False FULL_REF_NAMES = map(lambda system: system['FULL_REF_NAME'], systems['datalist']) if first_time: # если у юзера есть право на одну из систем cfg.REDIRECT_LINKS_AFTER_REG, то пробрасываем в неё for link in cfg.REDIRECT_LINKS_AFTER_REG: if link in FULL_REF_NAMES: link_found = True break else: # если у юзера есть право на одну из систем cfg.REDIRECT_LINKS, то пробрасываем в неё for link in cfg.REDIRECT_LINKS: if link in FULL_REF_NAMES: link_found = True break if link_found: #raise cherrypy.HTTPRedirect(link+'/?id_system='+ str(link_id_system)) result['ERROR_CODE'] = 0 result['ERROR_MSG'] = None result['REDIRECT_CODE'] = 0 result['REDIRECT_DATA'] = link return result # получаем доступные системы нулевого уровня, сортируя по cfg.systems_order systems0 = get_user_systems(uid=self.getUserVar("uid"), higher=None, recurse=0, use_layers=None) # если у юзера есть права более, чем на 1 систему - рисуем список систем на выбор if len(systems0['datalist']) > 1: #return self.drawTemplate(templ=choose_your_destiny,data=[systems0]) result['ERROR_CODE'] = 0 result['ERROR_MSG'] = None result['REDIRECT_CODE'] = 1 result['REDIRECT_DATA'] = self.drawTemplate(templ=subsystem_list, data=[systems0, {'system_name': _('Выберите систему'), 'first_time': first_time}]) return result # если у юзера есть право только на одну систему, то перебрасываем в неё if len(systems0['datalist']) == 1: #self.setSesVar("id_system",systems0['datalist'][0]['ID_SYSTEM']) #raise cherrypy.HTTPRedirect(systems0['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(self.getSesVar("id_system"))) #print "if len(systems0['datalist'])==1:" #raise cherrypy.HTTPRedirect(systems0['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(systems0['datalist'][0]['ID_SYSTEM'])) result['ERROR_CODE'] = 0 result['ERROR_MSG'] = None result['REDIRECT_CODE'] = 0 result['REDIRECT_DATA'] = systems0['datalist'][0]['FULL_REF_NAME'] return result
def draw_system_list_term(self, code, termnum): # код завершения смены if code == cfg.TERMINAL_LOGOFF_BARCODE: # запрос на закрытие сессии в RBS mes = sessions.rbs_close_check(self.getSesVar('termiduser')) # не разрешено закрывать сессию if mes: return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': self.getSesVar('termusername'), 'mes': mes}], draw_wo_login=True) # получено разрешение из RBS на закрытие сессии # попытка закрыть сессию error_msg, web_session_id = sessions.session_close(uid=self.getSesVar('termiduser'), fio=self.getSesVar('termusername'), equip_kind=pu.iif(cpu.isMobile(), 'M', 'T'), reason=sessions.SES_CLOSE_REASON_EXIT, closed_by=None) # ошибка закрытия сессии if error_msg: cpu.cherrypylog(error_msg, context='APP.SESSIONS') return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': self.getSesVar('termusername'), 'mes': error_msg}], draw_wo_login=True) # сессия закрыта успешно termusername = self.getSesVar('termusername') self.exit(redirect=False) return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': '', 'mes': 'Сессия пользователя '+termusername+' закрыта'}], draw_wo_login=True) # валидация длины введённого ШК и его целостности if not term_verify_barcode(code): return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': self.getSesVar('termusername'), 'mes': 'Отсканирован не ШК пользователя'}], draw_wo_login=True) # структура ШК верна - верифицируем его и определяем пользователя usr = db.dbExec(sql='select * from ENGINE_USER_VERIFY_TERM(?)', params=[code], fetch='one', id_system=-1) if usr['ERROR_CODE']!=0: if usr['ERROR_CODE']==5: # пользователь найден, а ШК - нет # сверяем дату генерации ШК в БД и отсканированного ШК msg_check_barcode_date = check_barcode_date(code, usr['BARCODE_OUT']) if msg_check_barcode_date: return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termusername': usr['FIO'], #'termusername': self.getSesVar('termusername'), 'termname': self.getSesVar('termname'), 'mes': msg_check_barcode_date }], draw_wo_login=True) # валидация длины ШК в БД и его целостности if not term_verify_barcode(usr['BARCODE_OUT']): return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termusername':usr['FIO'], #'termusername': self.getSesVar('termusername'), 'termname': self.getSesVar('termname'), 'mes': 'Испорчен ШК в базе данных. Обратитесь в службу поддержки!'}], draw_wo_login=True) # неизвестная ошибка в ШК return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termusername':usr['FIO'], #'termusername': self.getSesVar('termusername'), 'termname': self.getSesVar('termname'), 'mes': 'Неизвестная ошибка в ШК. Обратитесь в службу поддержки!'}], draw_wo_login=True) else: #2 - 'Пользователь не заведён в системе!' или другая будущая ошибка return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': self.getSesVar('termusername'), 'mes': usr['ERROR_MSG']}], draw_wo_login=True) if getattr(cfg, 'SKUD_INTEGRATION', False) and \ (getattr(cfg, 'SKUD_CHECK_MOBILE', False) and cpu.isMobile() or getattr(cfg, 'SKUD_CHECK_TSD', False) and cpu.isTSD()): allow = db.dbExecDirect(sql='select ALLOW from %s(?)' % cfg.SKUD_MAJOR_DB_ACCESS_PROC, params=[usr['ID_USER']], fetch='one', id_base=db.getIdMajorDb())['ALLOW'] if not allow: if cpu.isTSD(): return cpu.goToError(_('Доступ запрещён по данным СКУД!')) else: return self.exception_inner(tmpl_name='exception_skud_access_mob', data={'userfio': usr['FIO']}) # заказан ли проброс для этого вида оборудования в конфиге probros = pu.iif(cpu.isMobile(), getattr(cfg, 'sessions_forward_to_last_iface_mob', None), getattr(cfg, 'sessions_forward_to_last_iface_term', None)) if probros: # читаем данные последней сессии error_msg, go_url, ses_info = sessions.session_last_session_info(uid=usr['ID_USER'], fio=usr['FIO'], equip_kind=pu.iif(cpu.isMobile(), 'M', 'T') ) # ошибка получения информации о последней сессии if error_msg: cpu.cherrypylog(error_msg, context='APP.SESSIONS') probros = False # открываем сессию old_web_session_id, error_msg = sessions.session_open(uid=usr['ID_USER'], fio=usr['FIO'], equip_kind=pu.iif(cpu.isMobile(), 'M', 'T'), termnum=termnum) # ошибка открытия сессии if error_msg: cpu.cherrypylog(error_msg, context='APP.SESSIONS') return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term), data=[{'termname': self.getSesVar('termname'), 'termusername': usr['FIO'], 'mes': error_msg}], draw_wo_login=True) # удаляем старую web-сессию, если она есть if old_web_session_id: sessions.session_delete_old_web_session(old_web_session_id) # залогинились #print "draw_system_list_term: id_user=%s, fio=%s, barcode=%s" %( usr['ID_USER'], self.df(usr['FIO']), usr['BARCODE_OUT']) # заполняем переменные сессии юзера create_user_session_class(login=usr['LOGIN'], uid=usr['ID_USER'], userfio=usr['FIO'], email=usr['EMAIL'], phonenumber=usr['PHONENUMBER'], layer_id=usr['LAYER_ID'], locale=usr['LANG_CODE'] or self.getSesVar('locale'), is_superadmin=usr['IS_SUPERADMIN']) self.setSesVar('termiduser', usr['ID_USER']) self.setSesVar('termusername', usr['FIO']) # далее реализуем проброс # проброс в зависимости от настроек конфиругации и наличия последней сохранённой сессии if probros and go_url: # если error_msg пусто, то go_url заполнено - переходим в него raise cherrypy.HTTPRedirect(go_url) else: # иначе - анализируем # получаем доступные системы нулевого уровня, сортируя по cfg.systems_order systems = get_user_systems(uid=self.getUserVar("uid"), higher=None, recurse=0, use_layers=None) # если юзер не имеет прав ни на одну из систем нулевого уровня if len(systems['datalist'])==0: return self.drawTemplate(templ=pu.iif(cpu.isMobile(), login_index_mob, login_index_term),data=[{'mes':'Пользователь не имеет прав ни на одну систему'}], draw_wo_login=True) # если у юзера есть право на KURSTERM или WMSMOBILE и список систем в нём непуст, то перебрасываем в KURSTERM или WMSMOBILE if cpu.isMobile(): # если у юзера есть право на WMSMOBILE if getattr(cfg, 'MOBILE_link', None) in self.getUserVar('granted_system_refs'): # получить id_system для системы WMSMOBILE MOBILE_id_system = si.find_id_system_by_full_ref_name(cfg.MOBILE_link) #TERMINAL_id_system=db.dbExec(sql='select ID_SYSTEM from ENGINE_FIND_SYSTEM_BY_FULL_REF(?)', # params=[cfg.TERMINAL_link], fetch='one', id_system=-1)['ID_SYSTEM'] # получить список доступных юзеру подсистем в системе WMSMOBILE mobile_subsystems = get_user_systems(uid=self.getUserVar("uid"), higher=MOBILE_id_system, recurse=0, use_layers=None) # если список доступных юзеру подсистем в системе WMSMOBILE содержит одну запись(возможно, OLDTERM), то перебрасываем в неё if len(mobile_subsystems['datalist']) == 1: #raise cherrypy.HTTPRedirect(terminal_subsystems['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(terminal_subsystems['datalist'][0]['ID_SYSTEM'])) raise cherrypy.HTTPRedirect(mobile_subsystems['datalist'][0]['FULL_REF_NAME']) # иначе перебрасываем в WMSMOBILE else: #raise cherrypy.HTTPRedirect(cfg.TERMINAL_link+'/?id_system='+ str(TERMINAL_id_system)) raise cherrypy.HTTPRedirect(cfg.MOBILE_link) else: # если у юзера есть право на KURSTERM if getattr(cfg, 'TERMINAL_link', None) in self.getUserVar('granted_system_refs'): # получить id_system для системы KURSTERM TERMINAL_id_system = si.find_id_system_by_full_ref_name(cfg.TERMINAL_link) #TERMINAL_id_system=db.dbExec(sql='select ID_SYSTEM from ENGINE_FIND_SYSTEM_BY_FULL_REF(?)', # params=[cfg.TERMINAL_link], fetch='one', id_system=-1)['ID_SYSTEM'] # получить список доступных юзеру подсистем в системе KURSTERM terminal_subsystems = get_user_systems(uid=self.getUserVar("uid"), higher=TERMINAL_id_system, recurse=0, use_layers=None) # если список доступных юзеру подсистем в системе KURSTERM содержит одну запись(возможно, OLDTERM), то перебрасываем в неё if len(terminal_subsystems['datalist']) == 1: #raise cherrypy.HTTPRedirect(terminal_subsystems['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(terminal_subsystems['datalist'][0]['ID_SYSTEM'])) raise cherrypy.HTTPRedirect(terminal_subsystems['datalist'][0]['FULL_REF_NAME']) # иначе перебрасываем в KURSTERM else: #raise cherrypy.HTTPRedirect(cfg.TERMINAL_link+'/?id_system='+ str(TERMINAL_id_system)) raise cherrypy.HTTPRedirect(cfg.TERMINAL_link) # если у юзера есть права более, чем на 1 систему - рисуем список систем на выбор if len(systems['datalist'])>1: #return self.drawTemplate(templ=choose_your_destiny,data=[systems]) return self.drawTemplate(templ=pu.iif(cpu.isMobile(), subsystem_list_mob, subsystem_list_term), data=[systems, {'system_name': _('Выберите систему')}]) # если у юзера есть право только на одну систему, то перебрасываем в неё if len(systems['datalist'])==1: #self.setSesVar("id_system",systems['datalist'][0]['ID_SYSTEM']) #raise cherrypy.HTTPRedirect(systems['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(self.getSesVar("id_system"))) #print "if len(systems['datalist'])==1:" #raise cherrypy.HTTPRedirect(systems['datalist'][0]['FULL_REF_NAME']+'/?id_system='+ str(systems['datalist'][0]['ID_SYSTEM'])) raise cherrypy.HTTPRedirect(systems['datalist'][0]['FULL_REF_NAME'])
def conlog_conlog(self, develId=None, dtBeg=None, dtEnd=None, idBase=None, ip=None): """ip - один из ip-адресов разработчика, на которые выдан тикет """ #import time #time_beg=time.time() # 0. Обработка входных параметров develId = self.cInt(develId) dtBeg = self.cDateTime(dtBeg) if dtBeg is None: dtBeg = '01.01.2000' dtEnd = self.cStrE(dtEnd) if dtEnd is None: dtEnd = '01.01.2100' else: dtEnd = dtEnd + ' 23:59:59' dtEnd = self.cDateTime(dtEnd) idBase = self.cInt(idBase) ip = self.cStrE(ip) if ip is None: ip = '' # 1. Получить таблицу A без поля WHOS conlog_lst_ro = db.dbExecDirect(sql = "select ip, max(access_stamp) last_access, count(*) cnt" \ " from K_IP_ACCESS_LOG where " + pu.iif(ip, "IP='"+ip+"'", '1=1') + " and access_stamp between ? and ? " \ " group by ip " \ " order by 3 desc ", params=(dtBeg, dtEnd), fetch='all', id_base=idBase )['datalist'] # не r/o-набор данных с заполненным полем WHOS conlog_lst = [] # По каждой записи (cur_ip) таблицы A: # Получить список devels = [{'DEVEL_ID': 1585, 'DEVEL_FIO': 'Робот'}, {...}, ...] по тикетам, которые были активны в момент коннекта for dic_ro in conlog_lst_ro: devels = [] cur_ip = dic_ro['IP'] cnt = dic_ro['cnt'] # Большие не запрашиваем if cnt > 400: #добавляем строку в conlog_lst и заполняем поле "кто" '???' #копируем текущую строку conlog_lst_ro в conlog_lst dic = {} #по столбцам for key, val in dic_ro.items(): dic[key] = val #WHOS dic['WHOS'] = "..." conlog_lst.append(dic) else: devels = self.get_devels(ip=cur_ip, dtBeg=dtBeg, dtEnd=dtEnd, idBase=idBase) # Если есть фильтр по "кто" и среди devels нет этого "кто", то исключаем строку из таблицы A if develId and develId not in map(lambda d: d['DEVEL_ID'], devels): # просто строку не включаем pass # иначе добавляем строку в conlog_lst и заполняем поле "кто" списком всех DEVEL_FIO else: #копируем текущую строку conlog_lst_ro в conlog_lst dic = {} #по столбцам for key, val in dic_ro.items(): dic[key] = val #WHOS dic['WHOS'] = reduce( lambda all_s, d: all_s + ', ' + d['DEVEL_FIO'], devels, '')[2:] conlog_lst.append(dic) conlog_lst = {'datalist': conlog_lst} #print "conlog_conlog Exec Time: ", time.time()-time_beg return self.drawTemplate(templ=conlog_master, data=[conlog_lst])
def ajaxTicketDel(self, ticketId): #Ищем idBase idBase = self.dbExec(sql="select ID_BASE from T_TICKETS where TICKET_ID=?", params=[self.cInt(ticketId)], fetch='one')['ID_BASE'] #Мультибазная транзакция conEngine = db.getConEng() group = dbEngine.ConnectionGroup() try: conDb = db.getConDb(idBase) group.add(conDb) #conEngine.commit() group.add(conEngine) group.begin() try: dic = db.dbExec(sql="select TICKET, DELETED_TIME, DEVEL_ID, ID_BASE, PERM from T_MARK_DEL(?)", params=[self.cInt(ticketId)], fetch='one', id_system=-1, con=conEngine, conEngine=conEngine ) db.dbExecDirect(sql="delete from K_IP_CHECK where TICKET_ID=?", params=[self.cInt(ticketId)], fetch='none', id_base=idBase, con=conDb, conEngine=conEngine ) except: if group.count(): group.rollback() raise else: group.commit() finally: group.disband() #disband the group so that member connections can operate independently again. if dic is not None: deleted_time = formatMxDateTime(dic['DELETED_TIME'], format='%H:%M', sformatFrom='%H:%M:%S') ticket = dic['TICKET'] idBase = dic['ID_BASE'] perm = dic['PERM'] #db_info = self.dbExec(sql="select DB_IP, DB_NAME, SERVER_IP, SERVER_USER from ENGINE_GET_BASES_INFO(?)", params=[self.cInt(idBase)], fetch='one') #if db_info is None: # raise TicketsException('Base with ID=%s not found!' % idBase) #dbs = db.get_bases_info(idBase)['dbs'] #if len(dbs) == 0: # raise TicketsException('Base with ID=%s not found!' % idBase) #db_info = dbs[0] db_info = db.get_bases_info(idBase) server_user = db_info['SERVER_USER'] server_ip = db_info['SERVER_IP'] db_ip = db.db_ip_to_private(db_info['DB_IP']) db_name = db_info['DB_NAME'] dublin.dropLink(link_location=ticket, user=server_user, ip=server_ip) pu.send_devel_mail(subject='Тикет удалён', body='Тикет: %s\nIP/port: %s\nБД: %s\nID тикета: %s\nПерманент: %s\nВремя удаления: %s%s' \ % (ticket, db_ip, db_name, ticketId, pu.iif(perm, 'Да', 'Нет'), deleted_time, signature), id_devel=dic['DEVEL_ID']) return self.pyDumps(ext_data={'TICKET': ticket, 'DELETED_TIME': deleted_time}) else: return self.pyDumps(ext_data={'TICKET': 'no', 'DELETED_TIME': 'no'})