# coding: utf-8

'''
Created on 10.11.2014

@author: m.prudyvus

все активные задачи выбранного процесса
'''

import json
from common.sysfunctions import toHexForXml, getGridWidth, getGridHeight
from ru.curs.celesta.showcase.utils import XMLJSONConverter
from workflow.processUtils import ActivitiObject, parse_json
from workflow.getUserInfo import userNameClass

try:
    from ru.curs.showcase.core.jython import JythonDTO, JythonDownloadResult
except:
    from ru.curs.celesta.showcase import JythonDTO, JythonDownloadResult

from ru.curs.celesta.syscursors import RolesCursor

def getData(context, main=None, add=None, filterinfo=None, session=None, elementId=None, sortColumnList=None, firstrecord=None, pagesize=None, parentId=None):
    u'''Функция получения списка всех развернутых процессов. '''
    datapanelSettings = parse_json()
    usersClass = userNameClass(context, datapanelSettings)
    session = json.loads(session)

    session = session["sessioncontext"]

    activiti = ActivitiObject()
    if isinstance(session['urlparams']['urlparam'], list):
        for params in session['urlparams']['urlparam']:
            if params['@name'] == 'processId':
                processInstanceId = params['@value'][0]
    roles = RolesCursor(context)
    u'''получение данных из фильтра'''
    processName = ''
    if "formData" in session["related"]["xformsContext"]:
        info = session["related"]["xformsContext"]["formData"]["schema"]["info"]
        taskName = "%%%s%%" % ' '.join(info["@task"].split())
#         processName = ' '.join(info["@process"].split())
        user = ' '.join(info["@assignee"].split())
    else:
        taskName = '%'
        processName = ''
        user = ''

#     активные задачи
    tasksList = activiti.taskService.createTaskQuery().processInstanceId(processInstanceId)\
                    .taskNameLike(taskName).list()

    data = {"records":{"rec":[]}}
    _header = {"id":["~~id"],
               "schema":[u"Схема"],
               "name":[u"Название задачи"],
#                "assign":[u"Принять"],
               "process": [u"Название процесса"],
               "description": [u"Описание процесса"],
#                "document": [u"Документ"],
#                "reassign": [u"Передать задачу"],
               "userAss": [u"Назначена на"],
               "properties":[u"properties"]}

    for column in _header:
        _header[column].append(toHexForXml(_header[column][0]))

#     runtimeService = activiti.runtimeService
    taskService = activiti.taskService

#     Проходим по таблице и заполняем data
    for task in tasksList:
#         смотрим связи задачи
        identityLinks = taskService.getIdentityLinksForTask(task.id)
        taskDict = {}
#         отображается немного разное в зав-ти юзер или группа
        for link in identityLinks:
            if link.userId is not None:
                if not (link.type == 'candidate' and _header["userAss"][1] in taskDict):
                    taskDict[_header["userAss"][1]] = usersClass.getUserName(link.userId)
            else:
                if roles.tryGet(link.groupId):
                    taskDict[_header["userAss"][1]] = u"""Группа "%s\"""" % roles.description
                else:
                    taskDict[_header["userAss"][1]] = u"""Группа "%s\"""" % link.groupId
        taskDict[_header["id"][1]] = task.id
        processInstanceId = task.getProcessInstanceId()

#         картинка, по нажатию переходим на схему
        taskDict[_header["schema"][1]] = {"div":
                                            {"@align": "center",
                                             "a":
                                             {"@href": "./?userdata=%s&mode=image&processId=%s" \
                                                % (session["userdata"], processInstanceId,),
                                              "@target": "_blank",
                                              "img":
                                                {"@src": "solutions/default/resources/imagesingrid/flowblock.png"}}}}

        taskDict[_header["name"][1]] = task.name
        taskDict[_header["properties"][1]] = {"event":[]}

        if (processName == '' or processName in taskDict[_header["process"][1]]) and user in taskDict[_header["userAss"][1]]:
            data["records"]["rec"].append(taskDict)

    res = XMLJSONConverter.jsonToXml(json.dumps(data))
    return JythonDTO(res, None)
    
def getMeta(context, main=None, add=None, filterinfo=None, session=None, elementId=None): 
    u'''Функция получения списка всех развернутых процессов. '''
    datapanelSettings = parse_json()
    usersClass = userNameClass(context, datapanelSettings)
    session = json.loads(session)
    gridWidth = getGridWidth(session, 60)
    gridHeight = getGridHeight(session, 1)
    session = session["sessioncontext"]

    activiti = ActivitiObject()
    if isinstance(session['urlparams']['urlparam'], list):
        for params in session['urlparams']['urlparam']:
            if params['@name'] == 'processId':
                processInstanceId = params['@value'][0]
    roles = RolesCursor(context)
    u'''получение данных из фильтра'''
    processName = ''
    if "formData" in session["related"]["xformsContext"]:
        info = session["related"]["xformsContext"]["formData"]["schema"]["info"]
        taskName = "%%%s%%" % ' '.join(info["@task"].split())
        user = ' '.join(info["@assignee"].split())
    else:
        taskName = '%'
        processName = ''
        user = ''

#     активные задачи
    tasksList = activiti.taskService.createTaskQuery().processInstanceId(processInstanceId)\
                    .taskNameLike(taskName).list()

    _header = {"id":["~~id"],
               "schema":[u"Схема"],
               "name":[u"Название задачи"],
               "process": [u"Название процесса"],
               "description": [u"Описание процесса"],
               "userAss": [u"Назначена на"],
               "properties":[u"properties"]}

    for column in _header:
        _header[column].append(toHexForXml(_header[column][0]))

    taskService = activiti.taskService

    dataCount = 0
#     Проходим по таблице и заполняем data
    for task in tasksList:
#         смотрим связи задачи
        identityLinks = taskService.getIdentityLinksForTask(task.id)
        taskDict = {}
#         отображается немного разное в зав-ти юзер или группа
        for link in identityLinks:
            if link.userId is not None:
                if not (link.type == 'candidate' and _header["userAss"][1] in taskDict):
                    taskDict[_header["userAss"][1]] = usersClass.getUserName(link.userId)
            else:
                if roles.tryGet(link.groupId):
                    taskDict[_header["userAss"][1]] = u"""Группа "%s\"""" % roles.description
                else:
                    taskDict[_header["userAss"][1]] = u"""Группа "%s\"""" % link.groupId

        if (processName == '' or processName in taskDict[_header["process"][1]]) and user in taskDict[_header["userAss"][1]]:
            dataCount = dataCount + 1

    # Определяем список полей таблицы для отображения
    settings = {}
    settings["gridsettings"] = {"columns": {"col":[]},
                                "properties": {"@pagesize":"50",
                                               "@gridWidth": gridWidth,
                                               "@gridHeight": gridHeight,
                                               "@totalCount": dataCount,
                                               "@profile":"default.properties"}
                                }
    # Добавляем поля для отображения в gridsettings
    settings["gridsettings"]["columns"]["col"].append({"@id":_header["schema"][0],
                                                       "@width": "40px"})
    settings["gridsettings"]["columns"]["col"].append({"@id":_header["name"][0],
                                                       "@width": "215px"})
    settings["gridsettings"]["columns"]["col"].append({"@id":_header["userAss"][0],
                                                       "@width": "100px"})
    
    res = XMLJSONConverter.jsonToXml(json.dumps(settings))
    return JythonDTO(None, res)

# def gridDataAndMeta(context, main=None, add=None, filterinfo=None,
#              session=None, elementId=None, sortColumnList=[]):
#     u'''Функция получения списка всех развернутых процессов. '''
#     datapanelSettings = parse_json()
#     usersClass = userNameClass(context, datapanelSettings)
#     session = json.loads(session)
#     gridWidth = getGridWidth(session, 60)
#     gridHeight = getGridHeight(session, 1)
#     session = session["sessioncontext"]
#     sid = session["sid"]
#     activiti = ActivitiObject()
#     if isinstance(session['urlparams']['urlparam'], list):
#         for params in session['urlparams']['urlparam']:
#             if params['@name'] == 'processId':
#                 processInstanceId = params['@value'][0]
#     roles = RolesCursor(context)
#     u'''получение данных из фильтра'''
#     processName = ''
#     if "formData" in session["related"]["xformsContext"]:
#         info = session["related"]["xformsContext"]["formData"]["schema"]["info"]
#         taskName = "%%%s%%" % ' '.join(info["@task"].split())
# #         processName = ' '.join(info["@process"].split())
#         user = ' '.join(info["@assignee"].split())
#     else:
#         taskName = '%'
#         processName = ''
#         user = ''
# 
# #     активные задачи
#     tasksList = activiti.taskService.createTaskQuery().processInstanceId(processInstanceId)\
#                     .taskNameLike(taskName).list()
# 
#     data = {"records":{"rec":[]}}
#     _header = {"id":["~~id"],
#                "schema":[u"Схема"],
#                "name":[u"Название задачи"],
# #                "assign":[u"Принять"],
#                "process": [u"Название процесса"],
#                "description": [u"Описание процесса"],
# #                "document": [u"Документ"],
# #                "reassign": [u"Передать задачу"],
#                "userAss": [u"Назначена на"],
#                "properties":[u"properties"]}
# 
#     for column in _header:
#         _header[column].append(toHexForXml(_header[column][0]))
# 
#     runtimeService = activiti.runtimeService
#     taskService = activiti.taskService
# 
#     filePath = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))),
#                             'datapanelSettings.json')
#     #datapanelSettings = parse_json(context)["specialFunction"]["getUserName"]
#     #function = functionImport('.'.join([x for x in datapanelSettings.split('.') if x != 'celesta']))
# 
# #     Проходим по таблице и заполняем data
#     for task in tasksList:
# #         смотрим связи задачи
#         identityLinks = taskService.getIdentityLinksForTask(task.id)
#         taskDict = {}
# #         отображается немного разное в зав-ти юзер или группа
#         for link in identityLinks:
#             if link.userId is not None:
#                 if not (link.type == 'candidate' and _header["userAss"][1] in taskDict):
#                     taskDict[_header["userAss"][1]] = usersClass.getUserName(link.userId)
#             else:
#                 if roles.tryGet(link.groupId):
#                     taskDict[_header["userAss"][1]] = u"""Группа "%s\"""" % roles.description
#                 else:
#                     taskDict[_header["userAss"][1]] = u"""Группа "%s\"""" % link.groupId
#         taskDict[_header["id"][1]] = task.id
#         processInstanceId = task.getProcessInstanceId()
# #         procDesc = activiti.runtimeService.getVariable(processInstanceId, 'processDescription')
# #         if procDesc is not None:
# #             taskDict[_header["description"][1]] = procDesc
# #         else:
# #             taskDict[_header["description"][1]] = ''
# #         получаем процесс, чтобы потом получить его имя
#         process = activiti.repositoryService.createProcessDefinitionQuery()\
#             .processDefinitionId(task.getProcessDefinitionId()).singleResult()
#         docName = "%s. %s" % (runtimeService.getVariable(processInstanceId, 'docId'), \
#                               runtimeService.getVariable(processInstanceId, 'docName'))
# #         taskDict[_header["process"][1]] = "%s: %s" % (process.name, docName)
# #         картинка, по нажатию переходим на схему
# 
#         taskDict[_header["schema"][1]] = {"div":
#                                             {"@align": "center",
#                                              "a":
#                                              {"@href": "./?userdata=%s&mode=image&processId=%s" \
#                                                 % (session["userdata"], processInstanceId,),
#                                               "@target": "_blank",
#                                               "img":
#                                                 {"@src": "solutions/default/resources/imagesingrid/flowblock.png"}}}}
# 
#         taskDict[_header["name"][1]] = task.name
#         taskDict[_header["properties"][1]] = {"event":
#                                               []}
# #         if taskDict[_header["userAss"][1]] != logins.userName:
# #             taskDict[_header["assign"][1]] = {"div":
# #                                                 {"@align": "center",
# #                                                  "@class": "gridCellCursor",
# #                                                  "img":
# #                                                     {"@src": "solutions/default/resources/imagesingrid/ok.png"}}}
# #             taskDict[_header["properties"][1]]["event"].append({"@name":"cell_single_click",
# #                                                                 "@column": _header["assign"][0],
# #                                                                 "action":
# #                                                                     {"#sorted":
# #                                                                      [{"main_context": 'current'},
# #                                                                       {"server":
# #                                                                        {"activity":
# #                                                                         {"@id": "assign",
# #                                                                          "@name": "workflow.grid.activeTasksGrid.assign.celesta",
# #                                                                          "add_context": task.id}}},
# #                                                                       {"datapanel":
# #                                                                         {'@type':"current",
# #                                                                          '@tab':"current",
# #                                                                          'element':
# #                                                                             {'@id':'tasksGrid'}}}]}})
# #         else:
# #             taskDict[_header["assign"][1]] = ""
# #         taskDict[_header["document"][1]] = {"div":
# #                                             {"@align": "center",
# #                                              "a":
# #                                              {"@href": "./?mode=task&processId=%s&taskId=%s" % (processInstanceId, task.id),
# #                                               "@target": "_blank",
# #                                               "img":
# #                                                 {"@src": "solutions/default/resources/play.png"}}}} \
# #                                                     if taskDict[_header["userAss"][1]] == logins.userName else ""
# 
# #         if len(identityLinks) > 1:
# #             taskDict[_header["reassign"][1]] = {"div":
# #                                                 {"@align": "center",
# #                                                  "@class": "gridCellCursor",
# #                                                  "img":
# #                                                     {"@src": "solutions/default/resources/imagesingrid/user.png"}}}
# #             taskDict[_header["properties"][1]]["event"].append({"@name":"cell_single_click",
# #                                                                 "@column": _header["reassign"][0],
# #                                                                 "action":
# #                                                                     {"@show_in": "MODAL_WINDOW",
# #                                                                      "#sorted":
# #                                                                      [{"main_context": 'current'},
# #                                                                       {"modalwindow":
# #                                                                           {"@caption": "Выбор пользователя"
# #                                                                            }
# #                                                                         },
# #                                                                       {"datapanel":
# #                                                                         {'@type':"current",
# #                                                                          '@tab':"current",
# #                                                                          'element':
# #                                                                             {'@id':'reassign'}}}]}})
# #         else:
# #             taskDict[_header["reassign"][1]] = ""
# 
#         if (processName == '' or processName in taskDict[_header["process"][1]]) and user in taskDict[_header["userAss"][1]]:
#             data["records"]["rec"].append(taskDict)
# 
#     # Определяем список полей таблицы для отображения
#     settings = {}
#     settings["gridsettings"] = {"columns": {"col":[]},
#                                 "properties": {"@pagesize":"50",
#                                                "@gridWidth": gridWidth,
#                                                "@gridHeight": gridHeight,
#                                                "@totalCount": len(data["records"]["rec"]),
#                                                "@profile":"default.properties"}
#                                 }
#     # Добавляем поля для отображения в gridsettings
#     settings["gridsettings"]["columns"]["col"].append({"@id":_header["schema"][0],
#                                                        "@width": "40px"})
# #     settings["gridsettings"]["columns"]["col"].append({"@id":_header["assign"][0],
# #                                                        "@width": "60px"})
# #     settings["gridsettings"]["columns"]["col"].append({"@id":_header["reassign"][0],
# #                                                        "@width": "85px"})
# #     settings["gridsettings"]["columns"]["col"].append({"@id":_header["document"][0],
# #                                                        "@width": "60px"})
#     settings["gridsettings"]["columns"]["col"].append({"@id":_header["name"][0],
#                                                        "@width": "215px"})
# #     settings["gridsettings"]["columns"]["col"].append({"@id":_header["process"][0],
# #                                                        "@width": "500px"})
#     settings["gridsettings"]["columns"]["col"].append({"@id":_header["userAss"][0],
#                                                        "@width": "100px"})
#     gson = Gson()
#     data = gson.toJson(data)
#     settings = gson.toJson(settings)
#     return JythonDTO(XMLJSONConverter.jsonToXml(data),
#                      XMLJSONConverter.jsonToXml(settings))