def main(self): #Shops=self.dbExec(sql='select * from K_REPORTS_LISTSHOPS',params=(), fetch='all') #Shops['dl_shops'] = Shops['datalist'] #del Shops['datalist'] #Suppls=self.dbExec(sql='select * from K_REPORTS_LISTSUPPLIERS',params=(), fetch='all') #Suppls['dl_suppl'] = Suppls['datalist'] #del Suppls['datalist'] DStatus=self.dbExec(sql="select distinct dts.code, rs.name \ from doctypestatus dts \ left join r_status rs on rs.code = dts.code and rs.statustype='O' \ where exists(select * from doctype dt \ where dt.code in ('INCOME','INSUPPLIER','WHTOSHOP') \ and dt.doctid = dts.doctid)",params=(), fetch='all') DStatus['dl_dstatus'] = DStatus['datalist'] del DStatus['datalist'] systemid =db.dbExec(sql="select * from ENGINE_FIND_SYSTEM_BY_FULL_REF('/KURS/AMWARESSET')",params=(), fetch='one', id_system=-1)['ID_SYSTEM'] USERS=db.dbExec(sql="select * from ENGINE_GET_SYSTEM_USERS(?)",params=(systemid,), fetch='all', id_system=-1) USERS['dl_user'] = USERS['datalist'] del USERS['datalist'] #return self.drawTemplate(templ=index, data=[{'searchbar': {'visible':1, 'type':'h'}},Shops, Suppls, USERS, DStatus]) return self.drawTemplate(templ=index, data=[{'searchbar': {'visible':1, 'type':'h'}}, USERS, DStatus])
def DeleteUpdate(self, id_update): dbRes = db.dbExec(sql="select * from UPD_UPDATES up where up.id_update=?", \ params=(id_update,),\ fetch="one", id_system=-1) if (dbRes is not None): if (dbRes['DEVEL_ID'] != self.getUserVar("uid") and str(self.isXmlAdmin()) != "1"): return self.pyDumps({ "res": "0", "mess": "Нельзя удалять не свои обновления" }) else: filepath = dbRes["FILENAME"] if (filepath is not None): if (os.access(filepath, os.F_OK)): os.remove(filepath) db.dbExec(sql="delete from UPD_UPDATES where id_update=?", params=(id_update, ), fetch="none", id_system=-1) return self.pyDumps({"res": "ok"}) else: return self.pyDumps({ "res": "0", "mess": "Не удалось обнаружить обновление в базе..." })
def verifyuser(self, **kwargs): "проверка существования пользователя" mes = _( "Аккаунт с этим адресом электронной почты не найден. Повторите попытку." ) eres = {'res': '0', 'fields': [{'name': 'email', 'errmes': mes}]} usrReg = UserReg() if kwargs.has_key('email') and kwargs['email'] != '': # проверим капчу, если нужно if self.useCaptcha == 1: resc = self.checkCaptcha(**kwargs) if resc['res'] == 0: eres['res'] = 0 eres['fieldvalues'] = kwargs eres['fields'] = resc['fields'] return self.recovery(fields=eres) res, fields = usrReg.check_email_uniq(kwargs['email']) if res == 1: # если такой имейл не нашелся return self.recovery(fields=eres) # если же имейл нашелся - генерируем урл сброса пароля resethref = pu.rndm_sha() # постим пометку в бд db.dbExec(sql='execute procedure ENGINE_PSWD_RECOVERY_INS(?,?)', params=(fields['uid'], resethref), fetch='none', id_system=-1) # отправляем ссылку пользователю subject = _('Ваш пароль') + ' ' + cfg.service_name mailto = kwargs['email'] mailfrom = cfg.from_mail_addr maildata = {} maildata['service_name'] = cfg.service_name maildata['owner_name'] = cfg.owner_name maildata['owner_href'] = cfg.owner_href maildata[ 'cphref'] = cherrypy.request.base + '/ACCOUNT/rp?c=' + resethref body_text = str(reset_passwd_txt(searchList=maildata)) body_html = str(reset_passwd_html(searchList=maildata)) pu.post_mail(mailto, subject=subject, body_text=body_text, body_html=body_html) # радуем сообщением return self.drawTemplate(templ=emailrecovery, data=[{ 'mailfrom': mailfrom, 'mailto': mailto, 'baseurl': cherrypy.request.base }], draw_wo_login=True) return self.recovery(fields={})
def readCommonParamsBySystem(self, system): "Читает общие параметры по определенной системе, содержащейся в строке таблицы ENGINE_SYSTEMS" import db global systems_params # id_system IS INT!!! id_system = system['ID_SYSTEM'] # чтоб можно было вызывать функции чтения параметров в любом порядке systems_params.setdefault(id_system, {}) #system_name systems_params[id_system]['system_name'] = system['SHOW_NAME'] #system_ref systems_params[id_system]['system_ref'] = system['REF_NAME'] #system_folder folder_name = db.dbExec(sql="select FULL_FOLDER_NAME from ENGINE_GET_FULL_FOLDER_NAME(?)", params=(id_system,), fetch='one', id_system= -1) systems_params[id_system]['system_folder'] = folder_name['FULL_FOLDER_NAME'] #system_full_ref ref_name = db.dbExec(sql="select FULL_REF_NAME from ENGINE_GET_FULL_REF_NAME(?)", params=(id_system,), fetch='one', id_system= -1) systems_params[id_system]['system_full_ref'] = ref_name['FULL_REF_NAME'] #higher systems_params[id_system]['higher'] = system['HIGHER'] #top_system_name systems_params[id_system]['top_system_name'] = db.dbExec(sql="select TOP_SYSTEM_NAME FROM ENGINE_GET_TOP_SYSTEM_NAME(?)", params=(id_system,), fetch='one', id_system= -1)['TOP_SYSTEM_NAME'] #top_system_ref id_top = db.getIdSystemOfFirstParentFilledIdBase(id_system) if id_top == '-1': top_system_ref = '/ENGINE' else: top_system_ref = db.dbExec(sql="select FULL_REF_NAME from ENGINE_GET_FULL_REF_NAME(?)", params=[id_top], fetch='one', id_system= -1)['FULL_REF_NAME'] systems_params[id_system]['top_system_ref'] = top_system_ref #show_on_click if system['MODULE_NAME'] and system['CLASS_NAME']: systems_params[id_system]['show_on_click'] = True else: systems_params[id_system]['show_on_click'] = False #has_child_systems if db.dbExec(sql='select first 1 id_system FROM ENGINE_SYSTEMS where higher=?', params=(id_system,), fetch='one', id_system= -1) is not None: systems_params[id_system]['has_child_systems'] = True else: systems_params[id_system]['has_child_systems'] = False #no_map if system['NO_MAP']: systems_params[id_system]['no_map'] = True else: systems_params[id_system]['no_map'] = False
def get_user_systems(uid, higher=None, recurse=1, systems_order=None, spaces_per_level=24, use_layers=None, conEngine=None): u"""Дерево замапленных систем пользователя. Без учета прав его ролей в текущем тарифе организации пользователя, если используются слои, либо с учетом прав его ролей без использования тарифов, если слои не используются. Принимает: :param uid: ID пользователя (если None, используется uid текущего пользователя) :type uid: int :param higher: ID родительской системы, если нужно отфильтровать только какую-то ветку. None - все ветки. :type higher: int :param recurse: рекурсивный поиск дочерних узлов (любое число кроме 0 и None) либо возвращать лишь 1-й уровень вложенности (0, None) :type recurse: int :param systems_order: сортировка систем в дереве: 0 - по полям ORDERBY, SHOW_NAME таблицы ENGINE_SYSTEMS; 1 - по полю SHOW_NAME. None - значение по умолчанию из конфигурационного файла :type systems_order: int :param spaces_per_level: количество пробелов-отступов на 1 уровень :type spaces_per_level: int :param use_layers: использовать ли слои. None - использовать параметр конфигурационого файла. True - использовать слои и тарифы. False - не использовать слои и тарифы (возвращается всё дерево прав, в том числе и прав ролей) :type use_layers: int :param conEngine: объект соединения с БД Engine. Если передан, то доступ к ней происходит в его контексте и без commit'а в конце :type conEngine: объект соединения kinterbasdb Возвращает: Cписок прав, в виде: {'datalist': [{'ID_SYSTEM': ID_SYSTEM, 'HIGHER_OUT': HIGHER_OUT, 'SPACES': SPACES, 'FULL_REF_NAME': FULL_REF_NAME, 'SHOW_NAME': SHOW_NAME, 'LEVEL_OUT': LEVEL_OUT}, ... {'ID_SYSTEM': ID_SYSTEM, 'HIGHER_OUT': HIGHER_OUT, 'SPACES': SPACES, 'FULL_REF_NAME': FULL_REF_NAME, 'SHOW_NAME': SHOW_NAME, 'LEVEL_OUT': LEVEL_OUT}]}, где ID_SYSTEM - ID системы HIGHER_OUT - ID родительской системы SPACES - отступы: html-символы неразрывного пробела в количестве LEVEL_OUT*spaces_per_level FULL_REF_NAME - внутренняя полная ссылка на систему SHOW_NAME - название системы LEVEL_OUT - уровень вложенности, начиная с 0 """ if uid is None: uid = cpu.getUserVar('uid') if systems_order is None: systems_order = cfg.systems_order if use_layers is None: use_layers = layers.layersIsUse() if use_layers: return db.dbExec(sql="""select ID_SYSTEM, HIGHER_OUT, FULL_REF_NAME, FULL_FOLDER_NAME, SHOW_NAME, LEVEL_OUT, LASTDATE, lpad('', %d*level_out, ' ') SPACES from TAR_USER_SYSTEMS_GET(?,?,?,?,?)""" % spaces_per_level, params=[uid, higher, recurse, None, systems_order], fetch='all', id_system=-1, conEngine=conEngine) else: return db.dbExec(sql="""select ID_SYSTEM, HIGHER_OUT, FULL_REF_NAME, FULL_FOLDER_NAME, SHOW_NAME, LEVEL_OUT, lpad('', %d*level_out, ' ') SPACES from ENGINE_USER_GET_SYSTEMS(?,?,?,?,?)""" % spaces_per_level, params=[uid, higher, recurse, None, systems_order], fetch='all', id_system=-1, conEngine=conEngine)
def session_last_session_info(uid, fio, equip_kind): u"""Информация о последней открытой или закрытой pc-, терминальной или мобильной сессии. equip_kind - вид оборудования: 'T'-терминал, 'M'-мобильне устройство, 'P' и другое -PC """ #print "%s: session_last_session_info" % (time.strftime('%H:%M:%S',time.localtime())) # если error_msg пусто, то go_url и info должно быть заполнено, если не произошёл Exception и LAST_ID_SYSTEM is not None error_msg = '' go_url = None info = None ses_info = db.dbExec(sql="select * from EQUIP_LAST_SESSION_INFO(?,?)", params=[uid, equip_kind], fetch='one', id_system=-1) # ошибка обновления сессии if ses_info['ERROR_CODE'] != 0 and ses_info['ERROR_CODE'] != 3: from py_utils import iif error_msg = 'Ошибка получения информации о %(KIND)s сессии: %(ERROR_MSG)s. UID=%(UID)s, FIO=%(FIO)s' % \ {'KIND': iif(equip_kind=='T', 'терминальной', iif(equip_kind=='M', 'мобильной', 'PC-')), 'ERROR_MSG': ses_info['ERROR_MSG'], 'UID': uid, 'FIO': fio } else: go_url = si.get_full_ref_name_by_id_system(ses_info['LAST_ID_SYSTEM']) # м.б. None, если LAST_ID_SYSTEM is None info = ses_info return error_msg, go_url, info
def session_close(uid, fio, equip_kind, reason, closed_by=None, conEngine=None): u"""Закрытие pc-, терминальной или мобильной сессии по пользователю. Вызывается для PC- и мобильных сессий из exit, по тайм-ауту для PC-сессий, для терминальных и мобильных при скане ШК выхода либо после закрытия администратором, при использовании слоёв - скриптом, проверяющим окончание срока действия тарифа. Очищает старую историю за config.SESSION_MAX_HISTORY дней назад по переданному типу сессий equip_kind. equip_kind - вид оборудования: 'T'-терминал, 'M'-мобильне устройство, 'P' и другое -PC reason - Причина закрытия сессии: 0.Зарезервировано на будущее, 1.Выход(exit или ШК выхода), 2.Автозакрытие из веб(только для PC), 3.Открытие новой(продление)(вход с другого браузера,через index,скан ШК входа), 4.Закрыта администратором 5.Закрыта из-за окончания действия тарифа (только для PC, т.к. в случае продления тарифа для терминальных и мобильных сессий останутся незакрытые задания) """ # print "%s: session_close" % (time.strftime('%H:%M:%S',time.localtime())) error_msg = '' ses_close = db.dbExec(sql="select * from EQUIP_SESSION_CLOSE(?,?,?,?)", params=[uid, equip_kind, reason, closed_by], fetch='one', id_system=-1, con=conEngine) # ошибка закрытия сессии # ERROR_CODE = 3 - если PC-сессия очищена по тайм-ауту, а потом был нажат exit, или наоборот, то не считаем это ошибкой # ERROR_CODE = 3 - для терминальных и мобильных сессий - это ошибка if ses_close['ERROR_CODE'] not in (0, 3) and equip_kind not in ('T', 'M') \ or ses_close['ERROR_CODE'] != 0 and equip_kind in ('T', 'M'): from py_utils import iif error_msg = 'Ошибка закрытия %(KIND)s сессии: %(ERROR_MSG)s. UID=%(UID)s, FIO=%(FIO)s ' % \ {'KIND': iif(equip_kind=='T', 'терминальной', iif(equip_kind=='M', 'мобильной', 'PC-')), 'ERROR_MSG': ses_close['ERROR_MSG'], 'UID': uid, 'FIO': fio } return error_msg, ses_close['WEB_SESSION_ID']
def session_open(uid, fio, equip_kind, termnum=None): u"""Открытие pc-, терминальной или мобильной сессии. Предварительно выполняет закрытие старой сессии и очистку истории за config.SESSION_MAX_HISTORY дней назад по пользователю и виду сессий. equip_kind - вид оборудования: 'T'-терминал, 'M'-мобильне устройство, 'P' и другое -PC termnum учитывается лишь в случае терминальных и мобильных сессий. Если же он не передан и equip_kind in ('M', 'T'), (что реально не происходит), новая сессия не будет открыта, и текст сообщения об ошибке будет содержать "Сессия утеряна" (в смысле утери номера терминала). """ #print "%s: session_open" % (time.strftime('%H:%M:%S',time.localtime())) error_msg = '' old_web_session_id = None ses_open=db.dbExec(sql="select * from EQUIP_SESSION_OPEN(?,?,?,?)", params=[uid, equip_kind, termnum, session_id()], fetch='one', id_system=-1) # ошибка открытия PC-сессии if ses_open['ERROR_CODE'] != 0: from py_utils import iif error_msg = 'Ошибка открытия %(KIND)s сессии: %(ERROR_MSG)s. UID=%(UID)s, FIO=%(FIO)s' % \ {'KIND': iif(equip_kind=='T', 'терминальной', iif(equip_kind=='M', 'мобильной', 'PC-')), 'ERROR_MSG': ses_open['ERROR_MSG'], 'UID': uid, 'FIO': fio } old_web_session_id = ses_open['CLOSED_WEB_SESSION_ID'] return old_web_session_id, error_msg
def readRelatedDBParamsBySystem(self, system): "Читает параметры связанной БД по определенной системе, содержащиеся в строке таблицы ENGINE_SYSTEMS" import db global systems_params # id_system IS INT!!! id_system = system['ID_SYSTEM'] # чтоб можно было вызывать функции чтения параметров в любом порядке systems_params.setdefault(id_system, {}) idParentSystem = db.getIdSystemOfFirstParentFilledIdBase(id_system) if idParentSystem is None or idParentSystem == '-1': systems_params[id_system]['users_table_name'] = None systems_params[id_system]['users_table_id_field'] = None systems_params[id_system]['users_table_fio_field'] = None systems_params[id_system]['id_base'] = None systems_params[id_system]['db_path'] = None systems_params[id_system]['db_charset'] = None else: params = db.dbExec(sql="""select B.ID_BASE, B.DB_PATH, B.DB_CHARSET, B.USERS_TABLE_NAME, B.USERS_TABLE_ID_FIELD, B.USERS_TABLE_FIO_FIELD from ENGINE_SYSTEMS S left join ENGINE_BASES B ON S.ID_BASE=B.ID_BASE where S.ID_SYSTEM=?""", params=(int(idParentSystem),), fetch='one', id_system= -1) systems_params[id_system]['users_table_name'] = params['USERS_TABLE_NAME'] systems_params[id_system]['users_table_id_field'] = params['USERS_TABLE_ID_FIELD'] systems_params[id_system]['users_table_fio_field'] = params['USERS_TABLE_FIO_FIELD'] systems_params[id_system]['id_base'] = params['ID_BASE'] systems_params[id_system]['db_path'] = params['DB_PATH'] systems_params[id_system]['db_charset'] = params['DB_CHARSET']
def getEmployeeList(self, taskid): try: mas = [] task_info = self.dbExec( sql="select * from RBS_TASKVIEW_GETSYSTEMID(?)", params=[taskid], fetch='one') data = db.dbExec(sql="select * from RBS_TASKVIEW_ENGUSERS(?)", params=[task_info['ID_SYSTEM']], fetch='all', id_system=-1) for item in data['datalist']: print data dic = {} taskamount = self.dbExec( sql='select * from RBS_TASKVIEW_GETEMPLTASK(?,?)', params=[item['IDUSER'], task_info['TTID']], fetch="one") for key in taskamount.keys(): dic[key] = taskamount[key] for key in item.keys(): dic[key] = item[key] mas.append(dic) except Exception, exc: return self.pyDumps({'errMes': exc[1]})
def hisInsert(object_name, action, data=None): u"""Сохранить данные в истории действий по объекту и действию. Принимает: object_name - имя объекта (таблицы или виртуального объекта) action - код действия: 'i' - insert, 'u' - update, 'd' - delete data - сохраняемый сериализуемый объект. Для возможности однотипной обработки рекомендуется придерживаться формата словаря: {"olds": {"FIELD1": val1, "FIELD2": val2, ...}, "news": {"FIELD1": val1, "FIELD2": val2, ...}}, где словарик "olds" - старые значения полей (применимо для a in ('d','u')), "news" - новые значения полей (применимо для a in ('i','u')) Возвращает словарь вида: {'ID_HISTORY': ID_HISTORY, 'LASTDATE': LASTDATE}, где ID_HISTORY - ID записи в таблице истории, LASTDATE - дата/время добавленной записи """ res = db.dbExec(sql='execute procedure HIS_INSERT(?,?,?)', params=[ object_name, action, pu.decodeUStr(json.dumps(data, encoding="cp1251")) ], fetch='none', id_system=-1) return pu.kbToPy(res)
def verify_user(login, password, pwd_is_hash=False): u"""Валидация логина и пароля - возвращает объект usr, который в поле ERROR_CODE содержит код ошибки(0-успех), а ERROR_MSG содержит сообщение об ошибки (если она возникла). При успешной проверке пользователя/пароля дополнительно в полях ID_USER, FIO, EMAIL, PHONENUMBER, LAYER_ID, LANG_CODE, IS_SUPERADMIN возвращаются соответствующие данные. Вычисление кэша проводится здесь или в БД в зависимости от параметра AUTH_TYPE. """ from db import dbExec if pwd_is_hash: calc_hash_in_db = 0 else: password, calc_hash_in_db = pwd_hash(password) if getattr(cfg, 'ACCOUNT_NEED_PASSWORD_RESET', False): need_password_reset = 1 else: need_password_reset = 0 usr = dbExec(sql='select * from ENGINE_USER_VERIFY(?,?,?,?)', params=(login, password, calc_hash_in_db, need_password_reset), fetch='one', id_system=-1) return usr
def hisGet(object_name, action, datetime_from=None, datetime_to=None, format_lastdate=None): u"""Получить историю действий по объекту и действию за период: Принимает: object_name - имя объекта (таблицы или виртуального объекта) action - код действия: 'i' - insert, 'u' - update, 'd' - delete, None - без фильтра datetime_from - дата/время начала запрашиваемого периода (None - бесконечное прошлое) в cтроковом формате '%d.%m.%Y %H:%M:%S' или '%Y-%m-%d %H:%M:%S' или в mxDateTime datetime_to - дата/время конца запрашиваемого периода (None - бесконечное будущее) format_lastdate - формат поля LASTDATE (None - поле не форматируется в строку, а возвращается типа mxDateTime) Возвращает: Cписок записей в истории, отсортированный по LASTDATE, содержащий словари вида: {'ID_HISTORY': ID_HISTORY, 'ACTION_OUT': ACTION_OUT, 'DATA': DATA, 'LASTDATE': LASTDATE}, где ID_HISTORY - ID записи таблицы истории, ACTION_OUT - код действия: 'i' - insert, 'u' - update, 'd' - delete. Если action не None, то совпадает с ним. DATA - строка в json-формате '{"olds": {"FIELD1": val1, "FIELD2": val2, ...}, "news": {"FIELD1": val1, "FIELD2": val2, ...}}', где "olds" - старые значения полей (применимо для a in ('d','u')), "news" - новые значения полей (применимо для a in ('i','u')) LASTDATE - дата/время записи в истории """ res = db.dbExec(sql='select * from HIS_GET(?,?,?,?)', params=[object_name, action, datetime_from, datetime_to], fetch='all', id_system=-1) if format_lastdate: return pu.kbToPy(res, formats={'LASTDATE': format_lastdate}) else: return pu.kbToPy(res)
def index(self, id_system=None): u"""Инициализируем параметры системы, в которую вошли. """ #запрет кэширования index cherrypy.response.headers["Expires"] = "Mon, 26 Jul 1997 05:00:00 GMT" #Date in the past cherrypy.response.headers["Last-Modified"] = "Mon, 26 Jul 1997 05:00:00 GMT" #always modified cherrypy.response.headers["Cache-Control"] = "no-cache, must-revalidate" # HTTP/1.1 cherrypy.response.headers["Pragma"] = "no-cache" # HTTP/1.0 if id_system is None: id_system = getattr(self, 'id_system', None) if id_system is None: id_system = si.get_id_system() if id_system is not None: #проверяем на отключенность систему dis=db.dbExec(sql="select DISABLED " "from ENGINE_SYSTEMS " "where id_system=? ", params=(id_system,), fetch='one', id_system=-1) #print "" #print "INDEX: dis=", dis #print "" #no that system if not dis: #print "" #print "INDEX: gotoIndex. dis=", dis #print "" #return cpu.goToIndex() return cpu.goToError('Подсистема не найдена либо отключена.') if dis['DISABLED']: #print "dis['DISABLED']=", dis['DISABLED'] return cpu.goToError('Подсистема временно недоступна.') #raise cherrypy.HTTPRedirect("/exception?exception="+ # "Система временно недоступна. Попробуйте зайти сюда позже. А пока можно вернуться <a href='javascript:history.back()'>Назад</a>") #self.setSesVar("id_system",id_system) self.setIfaceVar("id_system", id_system) #обновляем сессию, если только система - не список терминальных/мобильных интерфейсов if si.get_full_ref_name_by_id_system(id_system) not in (getattr(cfg, 'TERMINAL_link', None), getattr(cfg, 'MOBILE_link', None)): error_msg = sessions.session_update(uid=self.getUserVar('uid'), fio=self.getUserVar('userfio'), equip_kind=cpu.equipKind(), ip_addr=cpu.get_remote_ip(if_proxy='client'), user_agent=cpu.getUserAgent(), id_system=id_system) # ошибка обновления сессии if error_msg: cpu.cherrypylog(error_msg, context='APP.SESSIONS') #return self.drawTemplate(templ=login_index, data=[{'mes': error_msg}, {'langs': cpu.getConfigLangs()}], draw_wo_login=True) if not cpu.isPC(): return cpu.goToError(error_msg) so.create_sys_options(self.__module__, cfg.options_instances_subdir) """d=db.dbExec(sql="select SHOW_NAME,
def readTimeFormatBySystem(self, system): "Читает формат времени по определенной системе, содержащейся в строке таблицы ENGINE_SYSTEMS" import db global systems_params # id_system IS INT!!! id_system = system['ID_SYSTEM'] # чтоб можно было вызывать функции чтения параметров в любом порядке systems_params.setdefault(id_system, {}) idParentSystem = self.getIdSystemOfFirstParentFilledTimeFormat(id_system) if idParentSystem is None: if hasattr(cfg, 'time_format'): systems_params[id_system]['time_format'] = cfg.time_format else: print print "WARNING!!! Could not find default Time format for system %s, id=%s" % (systems_params[id_system]['system_ref'], id_system) print "Time will not be formatted." print systems_params[id_system]['time_format'] = time_format #'%d.%m.%y %H:%M:%S' else: params = db.dbExec(sql="""select S.TIME_FORMAT from ENGINE_SYSTEMS S where S.ID_SYSTEM=?""", params=(idParentSystem,), fetch='one', id_system= -1) systems_params[id_system]['time_format'] = params['TIME_FORMAT']
def mapAll(self): # мэппинг страницы логина import db from systems.ENGINE.PROFILE.profile import Profile from systems.ENGINE.ACCOUNT.account import Account from syslogin import SysLogin from api.download import Download from api.metrics import Metrics self.root = SysLogin() # у корня id_system ставим -1 #self.root.id_system = -1 # мэппинг всех систем Systems = db.dbExec(sql="""select "MODULE_NAME",CLASS_NAME,FOLDER_NAME,REF_NAME,ID_SYSTEM,SHOW_NAME,DISABLED from ENGINE_SYSTEMS where higher is null and (no_map = 0 or no_map is null) order by orderby""", fetch='all', id_system= -1) for item in Systems['datalist']: self.mapSystem(self.root, item, "systems") # мэппинг систем обслуживания # Профиль пользователя #setattr(self.root, 'PROFILE', Profile()) self.root.PROFILE = Profile() self.root.ACCOUNT = Account() self.root.download = Download() # мэппинг всех метрик. К этому времени все системы должны быть запаплены, # поскольку Metrics рекурсивно просматривает список систем от root self.root.ENGINE.METRICS = Metrics(self.enginePath, self.root, self.error_file, self.root.ENGINE.METRICS.id_system) return self.root, self.cntSystems, self.cntSuccessSystems
def __init__(self): self.regaddon = 0 self.regaddon_href = '/ADDONS/REGADDON' self.regaddon_tmpls = '../systems/ADDONS/REGADDON/templates/' self.regaddoninfo = get_mapped_sysinfo(self.regaddon_href) self.required_fields = cfg.ACCOUNT_REG_REQUIRED_FIELDS self.RegAddon = None if len(self.regaddoninfo) > 0: from systems.ADDONS.REGADDON.regaddon import RegAddon self.regaddon = 1 self.RegAddon = RegAddon() self.RegAddon.regaddoninfo = self.regaddoninfo self.RegAddon.href = self.regaddon_href # расширение обязательных для заполнения полей if self.RegAddon.required_fields: self.required_fields += self.RegAddon.required_fields # проверим, нужна ли captcha при регистрации self.useCaptcha = 0 res = db.dbExec(sql='select * from CONFIG', params=(), fetch='one', id_system=-1) if res['REGCAPTCHA'] == 1: self.useCaptcha = 1 if si.password_recovery_enabled: Account.recovery.im_func.exposed = True Account.verifyuser.im_func.exposed = True Account.rp.im_func.exposed = True Account.rp_drop.im_func.exposed = True Account.get_pwd_complexity_status.im_func.exposed = True if si.regopen: Account.index.im_func.exposed = True Account.createaccount.im_func.exposed = True
def getRoles(self): try: data = db.dbExec(sql="select er.role_name, list(eur.id_user) as id_user\ from engine_roles er\ left join engine_user_roles eur on er.id_role = eur.id_role\ group by 1 order by er.role_name", params=[], fetch='all', id_system=-1) except FBExc, exc: return self.pyDumps({'errMes': exc[1]})
def getSessions(self, uid, dtbeg, dtend, wmsesid, wtype): try: data = db.dbExec(sql='select * from K_WH_CRWORKER_GETSES(?,?,?,?)', params=[uid, dtbeg, dtend, wtype], fetch='all', id_system=-1) except Exception, exc: return self.pyDumps({'errMes': exc[1]})
def GetEmployersInfo(self,userid,dtbeg,dtend,objid,wmsesid): if not objid: objid = None try: ses = db.dbExec(sql="select min(s.SES_DTBEG) as dtbeg,max(s.SES_DTEND) as dtend from K_WH_CRWORKER_GETSES(?,?,?,?) s", params=[userid,dtbeg,dtend,'t'], fetch='one', id_system=-1) data = self.dbExec(sql='select * from K_WH_CRSHIFT_SESSIONSUMS(?,?,?,?)',params=[wmsesid,ses['DTBEG'],ses['DTEND'],objid], fetch='one') except Exception, exc: return self.pyDumps({'errMes':exc[1]}) return self.pyDumps(data=data)
def getUploadFile(self, updateid): # try: updateid = int(updateid) filename = db.dbExec(sql='select FILENAME from UPD_UPDATES where id_update=?', params=(updateid,),\ fetch="one", id_system=-1)['FILENAME'] if not os.access(filename, os.F_OK): return self.pyDumps({'errMess': 'File not found on server...'}) else: return serve_file(filename, content_type='application/x-download')
def __init__(self): "Прочесть параметры систем из БД Engine" import db Systems = db.dbExec(sql="""select ID_SYSTEM, SHOW_NAME, SEND_BUG_MAIL, HIGHER, "MODULE_NAME",""" """ CLASS_NAME, REF_NAME, NO_MAP from ENGINE_SYSTEMS order by ID_SYSTEM""", fetch='all', id_system= -1) for system in Systems['datalist']: self.readAllBySystem(system)
def index(self, id_system=None): BasePage.index(self, id_system) #raise cherrypy.HTTPRedirect('users') #return self.users() - если так, то при F5 чистится сессия, т.к. вызывается self.index bases = db.dbExec( sql= 'select B.ID_BASE, B.DBALIAS, B.SHOW_NAME, S.IP from UPD_BASES B ' ' left join SERVERS S on S.ID_SERVER=B.ID_SERVER ' 'order by B.ORDERBY ', params=(), fetch='all', id_system=-1) bases['datalist_bases'] = bases['datalist'] del bases['datalist'] modules = db.dbExec( sql= 'select M.ID_MODULES, M.MALIAS, M.SHOW_NAME, S.IP from UPD_MODULES M ' ' left join SERVERS S on S.ID_SERVER=M.ID_SERVER ' 'order by M.ORDERBY ', params=(), fetch='all', id_system=-1) modules['datalist_modules'] = modules['datalist'] del modules['datalist'] bond = db.dbExec( sql='select BO.ID_BASE, BO.ID_MODULES from UPD_BOND BO ', params=(), fetch='all', id_system=-1) bond['datalist_bond'] = bond['datalist'] del bond['datalist'] userfio = self.getUserVar('userfio') userid = self.getUserVar('uid') curtime = str(time.time()) return self.drawTemplate(templ=updater_tmpl, data=[ bases, modules, bond, userfio, { "userid": userid }, { "curtime": curtime } ])
def logGet(class_name, code=None, datetime_from=None, datetime_to=None, uid=None, userfio=None): """getting log data by filter (class_name only required): ID_LOG, ID_SYSTEM, SYSTEM_DESCRIPT, CLASS_NAME, METHOD_NAME, CODE, DOC_STRING, UID, FIO, DATE_STAMP, PARAMS """ log_system = logGetLOGIdSystem() table_name = logGetTableName(class_name) return db.dbExec(sql='select * from LOG_GET(?,?,?,?,?,?,?)', params=[table_name, str(class_name), code, datetime_from, datetime_to, uid, userfio], fetch='all', id_system=log_system)
def getEmployeeId(self, dtbeg, dtend): try: ext_data = {'dtbeg': dtbeg, 'dtend': dtend} data = db.dbExec(sql='select * from K_WH_CRWORKER_GET_UID(?,?)', params=[dtbeg, dtend], fetch='all', id_system=-1) #data = self.dbExec(sql='select * from k_wh_crworker_getempl_wh1(?,?)', params=[dtbeg,dtend],fetch='all') except Exception, exc: return self.pyDumps({'errMes': exc[1]})
def get_role_users(role_name): "По имени роли вернуть список пользователей со всеми их параметрами-полями, взятыми из таблицы ENGINE_USERS" return db.dbExec(sql="""select U.* from ENGINE_ROLES R LEFT JOIN ENGINE_USER_ROLES EUR ON EUR.ID_ROLE=R.ID_ROLE JOIN ENGINE_USERS U ON EUR.ID_USER=U.ID_USER WHERE R.ROLE_NAME=? ORDER BY U.FIO""", params=[role_name], fetch='all', id_system=-1 )
def getSystems(self): try: data = db.dbExec(sql="select list(er.id_user) as id_user,es.show_name\ from ENGINE_FIND_SYSTEM_BY_FULL_REF(?) fr\ left join engine_systems es\ left join engine_rights er on es.id_system = er.id_system\ on fr.id_system = es.higher\ group by 2 order by es.show_name ", params=[cfg.TERMINAL_link], fetch='all', id_system=-1) except FBExc, exc: return self.pyDumps({'errMes': exc[1]})
def term_generate_barcode(login): "Генерирует ШК по логину и текущей дате/времени и записывает в БД" import py_utils as pu import datetime_utils as dtu import user_init as ui # 1.Получаем ШК # дополняем 36-ричное число слева нулями до 7 знаков if pu.is_x32(): UUUUUUU = numeral_systems.dec_to_any( hash(login + cfg.term_hash_salt) + 2**31, 36).rjust(7, '0').upper() else: UUUUUUU = numeral_systems.dec_to_any( hash(login + cfg.term_hash_salt) & (2**32 - 1), 36).rjust(7, '0').upper() now = datetime.datetime.now() minutes_dec = dtu.MinutesBetweenDateTimes(dtBegin=datetime.datetime( 2010, 01, 01, 0, 0), dtEnd=now) TTTTT = numeral_systems.dec_to_any(minutes_dec, 36).rjust(5, '0').upper() CCCC = (numeral_systems.dec_to_any( crc16.crc16(UUUUUUU + TTTTT + cfg.term_hash_salt), 16).rjust(4, '0')).upper() BC = UUUUUUU + TTTTT + CCCC # 2.Сохраняем ШК в БД и одновременно получаем FIO from db import dbExec dic = dbExec( sql='update ENGINE_USERS set BARCODE=? where login=? returning FIO', params=(BC, login), fetch='one', id_system=-1) if dic is None: raise Exception("Couldn't get FIO by LOGIN: %s" % login) FIO = dic['FIO'] (F, IO) = ui.get_f_io(FIO) DATETIME = now.strftime( getattr(cfg, 'TERMINAL_GEN_DATE_TIME_FORMAT', '%d.%m.%Y %H:%M')) # 3.Возвращаем для печати DATETIME, BC, FIO return (DATETIME, BC, F, IO)
def getCommonReportWhatsNew(self, datein, in_txt=None): if (str(datein) == "0"): datein = None res = db.dbExec(sql="select * from UPD_COMMON_REPORT_WHATSNEW(?)", params=(datein, ), fetch="all", id_system=-1) if (in_txt is None): return self.pyDumps(res) else: if (not os.access("../../base", os.F_OK)): os.mkdir("../../base") if (not os.access("../../base/files", os.F_OK)): os.mkdir("../../base/files", os.F_OK) if (not os.access("../../base/files/updatereports", os.F_OK)): os.mkdir("../../base/files/updatereports") filepath = "../../base/files/updatereports/" filename = "WhatsNewReport" + self.GetCurDateTime() + ".txt" f = open(filepath + filename, "wt") systems = {} for item in res['datalist']: detailStr = "\n\r\t-"+self.StrVal(item['TYPE_NAME'])+": " + \ self.StrVal(item['DESCRIPTION']) + " ("+ self.StrVal(item['DEVELOPER'])+")" if (not systems.has_key(item['SYSTEM_NAME'])): systems[item['SYSTEM_NAME']] = [detailStr] else: systems[item['SYSTEM_NAME']].append(detailStr) if datein is None: toDay = datetime.date.today() dayTitle = str(toDay.day) + "." + str(toDay.month) + "." + str( toDay.year) else: dayTitle = self.StrVal(datein) for sysitem in systems: f.write("\r\n" + self.StrVal(sysitem) + " (за " + dayTitle + "):\n\r") for item in systems[sysitem]: f.write(item) f.write("\r\n\r\n") # f.write(self.StrVal(item['ID_UPDATE'])+"\t"+self.StrVal(item['SYSTEM_NAME'])+"\t"+ # self.StrVal(item['TYPE_NAME'])+"\t"+self.StrVal(item['DESCRIPTION'])+ # "\t"+self.StrVal(item['DEVELOPER'])+"\r\n") f.close() absPath = os.path.abspath(filepath + filename) return self.pyDumps({'RES': quote(absPath)})
def __init__(self): "Прочесть конфигурационные параметры из engine_conf.py и Engine.FDB" import db global from_mail_addr, from_mail_user, from_mail_passwd, from_mail_debug_level, send_core_bug_mail, date_time_format, time_format, regopen, password_recovery_enabled from_mail_addr = getattr(cfg, 'from_mail_addr', from_mail_addr) from_mail_user = getattr(cfg, 'from_mail_user', from_mail_user) from_mail_passwd = getattr(cfg, 'from_mail_passwd', from_mail_passwd) from_mail_debug_level = getattr(cfg, 'from_mail_debug_level', from_mail_debug_level) send_core_bug_mail = getattr(cfg, 'send_core_bug_mail', send_core_bug_mail) date_time_format = getattr(cfg, 'date_time_format', date_time_format) time_format = getattr(cfg, 'time_format', time_format) regopen = bool(db.dbExec(sql='select REGOPEN from CONFIG_SEL', fetch='one', id_system= -1)['REGOPEN']) password_recovery_enabled = getattr(cfg, 'ACCOUNT_PASSWORD_RECOVERY_ENABLED', password_recovery_enabled)