# coding: utf-8 u''' Основной грид реестра ФЛ (медработников). ''' from java.text import SimpleDateFormat import json from com.jayway.jsonpath import JsonPath from common.sysfunctions import toHexForXml, getGridHeight from nci._nci_orm import personCursor from ru.curs.celesta.showcase.utils import XMLJSONConverter from security.functions import userHasPermission from nci.functions.persons import normalizeSnils, createAccount, changePassword,\ getFRMRPersonData from security._security_orm import subjectsCursor, loginsCursor try: from ru.curs.showcase.core.jython import JythonDTO from ru.curs.showcase.app.api import MessageType, UserMessage except: from ru.curs.celesta.showcase import JythonDTO def gridData(context, main, add=None, filterinfo=None, session=None, elementId=None, sortColumnList=None, firstrecord=None, pagesize=None): person = personCursor(context) # сортировка if sortColumnList: sortName = toHexForXml(sortColumnList[0].id) sortType = unicode(sortColumnList[0].sorting).lower() else: sortName = None # фильтрация externalFilter(person, main, session) person.orderBy('fullname') # Заголовки _header = { 'uid': ['~~id'], 'surname': [u'Фамилия'], 'name': [u'Имя'], 'patronymic': [u'Отчество'], 'snils': [u'СНИЛС'], 'email': [u'E-mail'], 'birthDate': [u'Дата рождения'], 'phone': [u'Телефон'], 'phoneExtra': [u'Доп. телефон'], 'in_frmr': [u'Наличие в ФРМР'], 'properties': [u'properties'] } for column in _header: _header[column].append(toHexForXml(_header[column][0])) if sortName == _header[column][1]: person.orderBy("%s %s" % (column, sortType)) person.limit(firstrecord - 1, pagesize) grid_data = { 'records': { 'rec':[] } } event_base = { 'event': { '@name': 'row_single_click', 'action': { '#sorted': [ { 'main_context': 'current' }, { 'datapanel': { '@type': 'current', '@tab': 'current', "element": {"@id": "personEduOrganizationGrid", "add_context": ""} } } ] } } } for person in person.iterate(): currentrow = {} currentrow[_header['uid'][1]] = person.uid currentrow[_header['in_frmr'][1]] = '%s.png' % str(person.in_frmr).lower() currentrow[_header['surname'][1]] = person.surname currentrow[_header['name'][1]] = person.name currentrow[_header['patronymic'][1]] = person.patronymic currentrow[_header['snils'][1]] = person.snils currentrow[_header['email'][1]] = person.email currentrow[_header['phone'][1]] = person.phone currentrow[_header['phoneExtra'][1]] = person.phoneExtra currentrow[_header['birthDate'][1]] = SimpleDateFormat("dd.MM.yyyy").format(person.birthDate) if person.birthDate else "" currentrow[_header['properties'][1]] = event_base grid_data['records']['rec'].append(currentrow) return JythonDTO(XMLJSONConverter.jsonToXml(json.dumps(grid_data)), None) def gridMeta(context, main=None, add=None, filterinfo=None, session=None, elementId=None, sortColumnList=None): person = personCursor(context) # фильтрация externalFilter(person, main, session) # Заголовки _header = { 'uid': ['~~id'], 'surname': [u'Фамилия'], 'name': [u'Имя'], 'patronymic': [u'Отчество'], 'snils': [u'СНИЛС'], 'email': [u'E-mail'], 'birthDate': [u'Дата рождения'], 'phone': [u'Телефон'], 'phoneExtra': [u'Доп. телефон'], 'in_frmr': [u'Наличие в ФРМР'], 'properties': [u'properties'] } # в зависимости от контекста разный хэдер if main == 'full': header_text = {'b':'Физические лица'} elif main == 'strict': header_text = {'b':'Физические лица. Чтобы отобразить записи о физических лицах заполните фильтр и нажмите Найти.'} else: header_text = {'b':'Физические лица'} grid_settings = {} grid_settings['gridsettings'] = { 'labels': { 'header': header_text }, 'columns': { 'col': [] }, 'properties': { '@pagesize': 50, '@gridWidth': '100%', '@gridHeight': getGridHeight(session, numberOfGrids=2, gridHeaderHeight=55, delta=59), '@totalCount': person.count(), '@profile': 'default.properties' }, } # Добавляем поля для отображения в gridsettingss grid_settings['gridsettings']['columns']['col'].append({'@id': _header['in_frmr'][0], '@type': 'IMAGE', '@width': '50px'}) grid_settings['gridsettings']['columns']['col'].append({'@id': _header['surname'][0]}) grid_settings['gridsettings']['columns']['col'].append({'@id': _header['name'][0]}) grid_settings['gridsettings']['columns']['col'].append({'@id': _header['patronymic'][0]}) grid_settings['gridsettings']['columns']['col'].append({'@id': _header['birthDate'][0], '@width': '60px'}) grid_settings['gridsettings']['columns']['col'].append({'@id': _header['snils'][0], '@width': '100px'}) grid_settings['gridsettings']['columns']['col'].append({'@id': _header['email'][0], '@width': '150px'}) grid_settings['gridsettings']['columns']['col'].append({'@id': _header['phone'][0], '@width': '100px'}) grid_settings['gridsettings']['columns']['col'].append({'@id': _header['phoneExtra'][0], '@width': '100px'}) return JythonDTO(None, XMLJSONConverter.jsonToXml(json.dumps(grid_settings))) def gridToolBar(context, main=None, add=None, filterinfo=None, session=None, elementId=None): session_json = json.loads(session)['sessioncontext'] grid_context = session_json['related']['gridContext'] string_bool = lambda x: x and 'true' or 'false' # добавление ФЛ if userHasPermission(context, session_json['sid'], 'addPerson'): add_style = string_bool(False) else: add_style = string_bool(True) # редактирование ФЛ if userHasPermission(context, session_json['sid'], 'editPerson'): edit_style = (string_bool(False) if 'currentRecordId' in grid_context else string_bool(True)) else: edit_style = string_bool(True) # удаление ФЛ if userHasPermission(context, session_json['sid'], 'delPerson'): delete_style = edit_style else: delete_style = string_bool(True) # создание аккаунта ФЛ if userHasPermission(context, session_json['sid'], 'createPersonAccount'): account_style = (string_bool(False) if 'currentRecordId' in grid_context else string_bool(True)) else: account_style = string_bool(True) # смена пароля ФЛ if userHasPermission(context, session_json['sid'], 'changeAccountPassword'): pass_style = (string_bool(False) if 'currentRecordId' in grid_context else string_bool(True)) else: pass_style = string_bool(True) # проверка ФЛ в ФРМР if userHasPermission(context, session_json['sid'], 'checkPersonInFRMR'): check_frmr_style = (string_bool(False) if 'currentRecordId' in grid_context else string_bool(True)) else: check_frmr_style = string_bool(True) add_button = { 'item': { '@text': u'Добавить', '@hint': u'Добавить ФЛ', '@disable': add_style, 'action': { '@show_in': 'MODAL_WINDOW', '#sorted': [ { 'main_context': 'current' }, { 'modalwindow': { '@caption': u'Добавить запись о физическом лице', '@height': '500', '@width': '700' } }, { 'datapanel': { '@type': 'current', '@tab': 'current', 'element': { '@id': 'personCard', 'add_context': 'add' } } } ] } } } edit_button = { 'item': { '@text': u'Редактировать', '@hint': u'Редактировать ФЛ', '@disable': edit_style, 'action': { '@show_in': 'MODAL_WINDOW', '#sorted': [ { 'main_context': 'current' }, { 'modalwindow': { '@caption': u'Редактировать запись о физическом лице', '@height': '500', '@width': '700' } }, { 'datapanel': { '@type': 'current', '@tab': 'current', 'element': { '@id': 'personCard', 'add_context': 'edit' } } } ] } } } del_button = { 'item': { '@text': u'Удалить', '@hint': u'Удалить ФЛ', '@disable': delete_style, 'action': { '@show_in': 'MODAL_WINDOW', '#sorted': [ { 'main_context': 'current' }, { 'modalwindow': { '@caption': 'Удалить данные о физическом лице', '@height': '140', '@width': '400' } }, { 'datapanel': { '@type': 'current', '@tab': 'current', 'element': { '@id': 'personDeleteCard', 'add_context': '' } } } ] } } } account_button = { 'item': { '@text': u'Создать аккаунт', '@hint': u'Создать аккаунт для ФЛ', '@disable': account_style, 'action': { '#sorted': [ { 'main_context': 'current' }, {"server": {"activity": {"@id": "createAccount", "@name": "nci.grid.personGrid.createPersonAccount.celesta", "add_context": "" } } } ] } } } pass_button = { 'item': { '@text': u'Сменить пароль', '@hint': u'Сменить пароль аккаунта данного ФЛ', '@disable': pass_style, 'action': { '#sorted': [ { 'main_context': 'current' }, {"server": {"activity": {"@id": "changePassword", "@name": "nci.grid.personGrid.changePersonPassword.celesta", "add_context": "" } } } ] } } } check_frmr_button = { 'item': { '@text': u'Проверить в ФРМР', '@hint': u'Проверить в ФРМР', '@disable': check_frmr_style, 'action': { '#sorted': [ { 'main_context': 'current' }, {"server": {"activity": {"@id": "changePassword", "@name": "nci.grid.personGrid.checkPersonInFRMR.celesta", "add_context": "" } } } ] } } } grid_toolbar = { 'gridtoolbar': { '#sorted': [] } } # добавляем кнопки grid_toolbar['gridtoolbar']['#sorted'].append(add_button) grid_toolbar['gridtoolbar']['#sorted'].append(edit_button) grid_toolbar['gridtoolbar']['#sorted'].append(del_button) grid_toolbar['gridtoolbar']['#sorted'].append(account_button) grid_toolbar['gridtoolbar']['#sorted'].append(pass_button) grid_toolbar['gridtoolbar']['#sorted'].append(check_frmr_button) return XMLJSONConverter.jsonToXml(json.dumps(grid_toolbar)) def createPersonAccount(context, main=None, add=None, filterinfo=None, session=None, person_id=None, login=None, password=None, show_message=True): u'''Создание аккаунта для ФЛ с проверкой существования аккаунта.''' if not person_id: person_id = JsonPath.read(session, "$.sessioncontext.related.gridContext.currentRecordId") subjects = subjectsCursor(context) subjects.setRange('employeeId', person_id) message = u'' if subjects.count() == 0: # можно создать createAccount(context, person_id, password, login, roles=['medstaff', 'address']) message = u'Аккаунт создан успешно.' else: # нельзя создать message = u'У данного ФЛ уже существует аккаунт!' if show_message: context.message(message) return message def changePersonPassword(context, main=None, add=None, filterinfo=None, session=None, password=None): u'''Смена пароля.''' person_id = JsonPath.read(session, "$.sessioncontext.related.gridContext.currentRecordId") changePassword(context, person_id, password) def checkPersonInFRMR(context, main=None, add=None, filterinfo=None, session=None): u'''Проверка, есть ли данное ФЛ в ФРМР.''' person_id = JsonPath.read(session, "$.sessioncontext.related.gridContext.currentRecordId") person = personCursor(context) person.get(person_id) person_data = getFRMRPersonData(person.snils) if person_data and isinstance(person_data, dict) and 'Employee' in person_data: person.in_frmr = True person.update() context.message(u'Данное ФЛ найдено в ФРМР') elif person_data and isinstance(person_data, Exception): context.error(repr(person_data)) else: context.message(u'Данное ФЛ не найдено в ФРМР') def externalFilter(cursor, main, session): u'''Внешний фильтр. ''' filter_data = JsonPath.read(session, "$.sessioncontext.related.xformsContext.formData.schema.record") if filter_data['surname']!='': cursor.setFilter('surname', "@%%'%s'%%" % filter_data['surname']) if filter_data['name']!='': cursor.setFilter('name', "@%%'%s'%%" % filter_data['name']) if filter_data['patronymic']!='': cursor.setFilter('patronymic', "@%%'%s'%%" % filter_data['patronymic']) if filter_data['birthDate']!='': cursor.setRange('birthDate', SimpleDateFormat("yyyy-MM-dd").parse(filter_data['birthDate'])) if filter_data['email']!='': cursor.setFilter('email', "@'%s'" % filter_data['email']) if filter_data['phone']!='': cursor.setFilter('phone', "@%%'%s'%%" % filter_data['phone']) if filter_data['phoneExtra']!='': cursor.setFilter('phoneExtra', "@%%'%s'%%" % filter_data['phoneExtra']) if filter_data['sex']!='-': cursor.setRange('sex', filter_data['sex']) if filter_data['in_frmr']!='-': cursor.setRange('in_frmr', True if filter_data['in_frmr'] == 'true' else False) if filter_data['snils']!='': # преобразуем СНИЛС cursor.setRange('snils', normalizeSnils(filter_data['snils'])) # обрабатываем main, в котором задается режим if main=='strict' and filter_data['snils']=='' and filter_data['surname']=='': cursor.setFilter('uid', "null")