예제 #1
0
 def __init__(self, mongo):
     self.mongo = mongo
     self.solution_model = solution_model(self.mongo)
     self.workflow_model = workflow_model(self.mongo)
     self.file_model = file_model(self.mongo)
     self.user_model = user_model(self.mongo)
     self.dding = Dding(self.mongo)
예제 #2
0
 def __init__(self, mongo):
     self.mongo = mongo
     self.department_model = department_model(self.mongo)
     self.user_model = user_model(self.mongo)
     self.dding = Dding(self.mongo)
     self.user_service = user_service(self.mongo)
     self.file_model = file_model(self.mongo)
예제 #3
0
class Department(object):
    """ User Service Class"""
    def __init__(self, mongo):
        self.mongo = mongo
        self.dding = Dding(self.mongo)
        self.department_model = department_model(self.mongo)
        self.user_model = user_model(self.mongo)

    def list_all(self):
        """ list all departments """
        data = self.department_model.list_all()
        return data, 0, ''

    def list_tree(self):
        """ list all tree """
        data = self.department_model.list_tree()
        return data, 0, ''

    def create(self, name, parentid, create_dept_group):
        """ create department """
        parent_result = self.department_model.find_id(parentid)
        dd_result = self.dding.create_department(name, parent_result['did'],
                                                 create_dept_group)
        if not dd_result['errcode']:
            return self.department_model.add(dd_result['id'], name,
                                             parentid), 0, ''
        else:
            return "", dd_result['errcode'], dd_result['errmsg']

    def update(self, _id, name, parentid, manager):
        """ update department """
        department = self.department_model.find_id(_id)
        parent = self.department_model.find_id(parentid)
        if manager:
            user = self.user_model.find_id(manager)
            if user:
                manager = user['userid']
        if not department:
            return "", 1, ""
        dd_result = self.dding.update_department(department['did'], name,
                                                 parent['did'], manager)
        if not dd_result['errcode']:
            return self.department_model.update(_id, name, parentid,
                                                manager), 0, ''
        else:
            return "", dd_result['errcode'], dd_result['errmsg']

    def remove(self, _id):
        """ remove department """
        department = self.department_model.find_id(_id)
        if not department:
            return "", 1, ""

        dd_result = self.dding.delete_department(department['did'])
        if not dd_result['errcode']:
            self.department_model.remove(_id)
            return "", 0, ""
        else:
            return "", dd_result['errcode'], dd_result['errmsg']
예제 #4
0
class Service(object):
    """ DDing Service Class"""
    def __init__(self, mongo):
        self.mongo = mongo
        self.dding = Dding(self.mongo)

    def get_jsapi_signature(self):
        """ Get JS-API Signature """
        result = self.dding.get_jsapi_ticket()
        if result['errcode']:
            return {"token":''}, result['errcode'], result['errmsg']
        else:
            str_sign = ""
            sign = {
                "noncestr" : "a5se512436rqwuschsew8r7t23462783",
                "jsapi_ticket" : result['ticket'],
                "timestamp" : int(time.time()),
                "url" : "//okrs.tap4fun.com/dingding",
            }

            for key, value in sorted(sign.items()):
                if str_sign:
                    str_sign += "&{}={}".format(key, value)
                else:
                    str_sign = "{}={}".format(key, value)
            result = {"signatue":hashlib.sha1(str_sign).hexdigest(),
                      "url": sign["url"],
                      "noncestr":sign["noncestr"],
                      "timestamp":sign["timestamp"]}
            return result, 0, "success"
예제 #5
0
class Workflow(object):
    """ Workflow Service Class"""
    def __init__(self, mongo):
        self.mongo = mongo
        self.solution_model = solution_model(self.mongo)
        self.workflow_model = workflow_model(self.mongo)
        self.file_model = file_model(self.mongo)
        self.user_model = user_model(self.mongo)
        self.dding = Dding(self.mongo)

    def list_all(self):
        """ list all workflow """
        data = self.solution_model.list_all()
        return data, 0, ''

    def add(self, solution_id, fields):
        now = datetime.datetime.now()
        token = request.cookies.get('token')
        creator = self.user_model.find_user_token(token)
        solution = self.solution_model.find(solution_id)
        nodes = self.flow_generator(solution['flow'], fields, '0',
                                    creator['_id'])
        copyto_users = []
        next_user = []
        for user in solution['copyto']:
            usermodel = self.user_model.find_id(user)
            copyto_users.append(usermodel['user_id'])

        usermodel = self.user_model.find_id(nodes[0])
        next_user.append(usermodel['user_id'])

        self.dding.send_link(
            copyto_users, "审批提醒",
            creator['name'] + "于" + now.strftime("%Y-%m-%d %H:%M:%S") + "发起了" +
            solution['name'] + "审批并抄送您。",
            "http://office.tap4fun.com/hrs/jump?url=" +
            quote("http://office.tap4fun.com/workflow/copyto"))

        self.dding.send_link(
            next_user, "审批提醒",
            creator['name'] + "于" + now.strftime("%Y-%m-%d %H:%M:%S") + "发起了" +
            solution['name'] + "审批,等待您的审批。",
            "http://office.tap4fun.com/hrs/jump?url=" +
            quote("http://office.tap4fun.com/workflow/pending"))

        return self.workflow_model.add(solution_id, fields, nodes,
                                       creator['_id']), 0, ''

    def flow_generator(self, flow, fields, parentNode, creator):
        current = {}
        result = []
        for node in flow:
            if node['source'] == parentNode and node['type'] == 'action':
                current = node
                break
            elif node['source'] == parentNode and node['type'] == 'condition':
                current = node
                break
        if not current:
            return []

        if current['type'] == 'action':
            result += self.user_generator(current, creator)
            result += self.flow_generator(flow, fields, current['id'], creator)

        elif current['type'] == 'condition':
            final_node = {}

            for index, node in enumerate(flow):
                if node['source'] == current['source'] and node[
                        'fieldType'] == 'select':
                    if fields[node['namespace']] in node['options']:
                        final_node = node
                        break
                if node['source'] == current['source'] and node[
                        'fieldType'] == 'number':
                    if node['operator'] == '>' and fields[
                            node['namespace']] > node['fillNumber']:
                        final_node = node
                        break
                    if node['operator'] == '=' and fields[
                            node['namespace']] == node['fillNumber']:
                        final_node = node
                        break
                    if node['operator'] == '<' and fields[
                            node['namespace']] < node['fillNumber']:
                        final_node = node
                        break
                    if node['operator'] == '>=' and fields[
                            node['namespace']] >= node['fillNumber']:
                        final_node = node
                        break
                    if node['operator'] == '<=' and fields[
                            node['namespace']] <= node['fillNumber']:
                        final_node = node
                        break
                if node['source'] == current['source'] and node[
                        'fieldType'] == 'date':
                    if fields[node['namespace']]['dateType'] == 'dateRange':
                        start = libs.str_to_utc(
                            fields[node['namespace']]['value'][0], "%Y-%m-%d")
                        end = libs.str_to_utc(
                            fields[node['namespace']]['value'][1],
                            "%Y-%m-%d") + datetime.timedelta(days=1)
                        current_minutes = (end - start).days * 24 * 60
                        if node['cycle_day'] == -1:
                            last_cycle_time_arr = flow[
                                index - 1]['cycle_time'].split(':')
                            last_cycle_minutes = flow[
                                index - 1]['cycle_day'] * 24 * 60 + int(
                                    last_cycle_time_arr[0]) * 60 + int(
                                        last_cycle_time_arr[1])
                            if current_minutes > last_cycle_minutes:
                                final_node = node
                                break
                        else:
                            cycle_time_arr = node['cycle_time'].split(':')
                            cycle_minutes = node['cycle_day'] * 24 * 60 + int(
                                cycle_time_arr[0]) * 60 + int(
                                    cycle_time_arr[1])

                            if index == 0:
                                if current_minutes > 0 and current_minutes <= cycle_minutes:
                                    final_node = node
                                    break
                            else:
                                last_cycle_time_arr = flow[
                                    index - 1]['cycle_time'].split(':')
                                last_cycle_minutes = flow[
                                    index - 1]['cycle_day'] * 24 * 60 + int(
                                        last_cycle_time_arr[0]) * 60 + int(
                                            last_cycle_time_arr[1])
                                if current_minutes > last_cycle_minutes and current_minutes <= cycle_minutes:
                                    final_node = node
                                    break
                    elif fields[node['namespace']]['dateType'] == 'timeRange':
                        start = libs.str_to_utc(
                            fields[node['namespace']]['value'][0],
                            "%Y-%m-%d %H:%M")
                        end = libs.str_to_utc(
                            fields[node['namespace']]['value'][1],
                            "%Y-%m-%d %H:%M") + datetime.timedelta(minutes=1)
                        current_minutes = (end - start).seconds / 60
                        if node['cycle_day'] == -1:
                            last_cycle_time_arr = flow[
                                index - 1]['cycle_time'].split(':')
                            last_cycle_minutes = flow[
                                index - 1]['cycle_day'] * 24 * 60 + int(
                                    last_cycle_time_arr[0]) * 60 + int(
                                        last_cycle_time_arr[1])
                            if current_minutes > last_cycle_minutes:
                                final_node = node
                                break
                        else:
                            cycle_time_arr = node['cycle_time'].split(':')
                            cycle_minutes = node['cycle_day'] * 24 * 60 + int(
                                cycle_time_arr[0]) * 60 + int(
                                    cycle_time_arr[1])

                            if index == 0:
                                if current_minutes > 0 and current_minutes <= cycle_minutes:
                                    final_node = node
                                    break
                            else:
                                last_cycle_time_arr = flow[
                                    index - 1]['cycle_time'].split(':')
                                last_cycle_minutes = flow[
                                    index - 1]['cycle_day'] * 24 * 60 + int(
                                        last_cycle_time_arr[0]) * 60 + int(
                                            last_cycle_time_arr[1])
                                if current_minutes > last_cycle_minutes and current_minutes <= cycle_minutes:
                                    final_node = node
                                    break
            result += self.flow_generator(flow, fields, final_node['id'],
                                          creator)
        return result

    def time_convert_to_minutes(self, days, time_str):
        time_str_arr = time_str.split(':')
        total = (days * 24 * 60) + int(time_str_arr[0]) * 60 + int(
            time_str_arr[1])
        return total

    def user_generator(self, node, creator):
        user = {}
        result = []
        if node['approvalWay'] == 3:
            return [node['approvalObject']['id']]

        if node['approvedObject'] == '0':
            user = self.user_model.find_id(creator)
        else:
            user = self.user_model.find_id(node['approvedObject'])
        if not user:
            return result
        users = self._user_generator(user, node['approvalWay'], [])
        if node['level'] == 1 and users:
            for index in range(len(users)):
                if node['selectLevel'] <= (len(users) - index):
                    result.append(users[index])
        elif node['level'] == 2 and users:
            for index in range(len(users)):
                if len(result) >= node['selectLevel']:
                    break
                result.append(users[index])
        elif node['level'] == 3 and users:
            if len(users) >= node['selectLevel']:
                position = len(users) - node['selectLevel']
                if position >= 0:
                    result.append(users[position])
        return result

    def _user_generator(self, currentUser, _type, users):
        if _type == 1 and currentUser['adminreport']:
            users.append(currentUser['adminreport'][0])
            user = self.user_model.find_id(currentUser['adminreport'][0])
            if user:
                users = self._user_generator(user, _type, users)
        elif _type == 2 and currentUser['workreport']:
            users.append(currentUser['workreport'][0])
            user = self.user_model.find_id(currentUser['workreport'][0])
            if user:
                users = self._user_generator(user, _type, users)
        return users

    def find_own_workflow(self, status, pagination):
        result = {}
        cursor, result['count'] = self.workflow_model.find_own_workflow(
            status, 20, pagination)
        result['list'] = []
        for item in cursor:
            users = []
            solution = self.solution_model.find(item['solution_id'])
            item['solution'] = solution
            item['next_user'] = self.user_model.find_id(item['next'])
            item['creator_user'] = self.user_model.find_id(item['creator'])
            for userid in item['member']:
                users.append(self.user_model.find_id(userid))
            item['users'] = users
            for log in item['operation_log']:
                if log['type'] == 'comment':
                    log['picture_detail'] = []
                    log['attachment_detail'] = []
                    for picture in log['picture']:
                        log['picture_detail'].append(
                            self.file_model.find(picture))
                    for attachment in log['attachment']:
                        log['attachment_detail'].append(
                            self.file_model.find(attachment))

            result['list'].append(item)
        return result, 0, ""

    def find_own_pending_workflow(self, pagination):
        result = {}
        cursor, result[
            'count'] = self.workflow_model.find_own_pending_workflow(
                20, pagination)
        result['list'] = []
        for item in cursor:
            users = []
            solution = self.solution_model.find(item['solution_id'])
            item['solution'] = solution
            item['next_user'] = self.user_model.find_id(item['next'])
            item['creator_user'] = self.user_model.find_id(item['creator'])
            for userid in item['member']:
                users.append(self.user_model.find_id(userid))
            item['users'] = users
            for log in item['operation_log']:
                if log['type'] == 'comment':
                    log['picture_detail'] = []
                    log['attachment_detail'] = []
                    for picture in log['picture']:
                        log['picture_detail'].append(
                            self.file_model.find(picture))
                    for attachment in log['attachment']:
                        log['attachment_detail'].append(
                            self.file_model.find(attachment))
            result['list'].append(item)
        return result, 0, ""

    def find_own_done_workflow(self, pagination):
        result = {}
        cursor, result['count'] = self.workflow_model.find_own_done_workflow(
            20, pagination)
        result['list'] = []
        for item in cursor:
            users = []
            solution = self.solution_model.find(item['solution_id'])
            item['solution'] = solution
            item['next_user'] = self.user_model.find_id(item['next'])
            item['creator_user'] = self.user_model.find_id(item['creator'])
            for userid in item['member']:
                users.append(self.user_model.find_id(userid))
            item['users'] = users
            for log in item['operation_log']:
                if log['type'] == 'comment':
                    log['picture_detail'] = []
                    log['attachment_detail'] = []
                    for picture in log['picture']:
                        log['picture_detail'].append(
                            self.file_model.find(picture))
                    for attachment in log['attachment']:
                        log['attachment_detail'].append(
                            self.file_model.find(attachment))
            result['list'].append(item)
        return result, 0, ""

    def find_own_copyto_workflow(self, pagination):
        result = {}
        cursor, result['count'] = self.workflow_model.find_own_copyto_workflow(
            20, pagination)
        result['list'] = []
        for item in cursor:
            users = []
            solution = self.solution_model.find(item['solution_id'])
            item['solution'] = solution
            item['next_user'] = self.user_model.find_id(item['next'])
            item['creator_user'] = self.user_model.find_id(item['creator'])
            for userid in item['member']:
                users.append(self.user_model.find_id(userid))
            item['users'] = users
            for log in item['operation_log']:
                if log['type'] == 'comment':
                    log['picture_detail'] = []
                    log['attachment_detail'] = []
                    for picture in log['picture']:
                        log['picture_detail'].append(
                            self.file_model.find(picture))
                    for attachment in log['attachment']:
                        log['attachment_detail'].append(
                            self.file_model.find(attachment))
            result['list'].append(item)
        return result, 0, ""

    def cancel(self, _id):
        result = self.workflow_model.cancel(_id)
        return result, 0, ""

    def audit(self, _id, status, content):
        now = datetime.datetime.now()
        result = self.workflow_model.audit(_id, status, content)
        creator = self.user_model.find_id(result['creator'])
        solution = self.solution_model.find(result['solution_id'])
        next_user = self.user_model.find_id(result['next'])
        if result['status'] == 0:
            self.dding.send_link(
                [next_user['user_id']], "审批提醒", creator['name'] + "于" +
                result['creation_time'].strftime("%Y-%m-%d %H:%M:%S") + "发起了" +
                solution['name'] + "审批,等待您的审批。",
                "http://office.tap4fun.com/hrs/jump?url=" +
                quote("http://office.tap4fun.com/workflow/pending"))
        elif result['status'] == 1:
            self.dding.send_link(
                [creator['user_id']], "审批提醒",
                "您发起的" + solution['name'] + "审批,已于" +
                result['end_time'].strftime("%Y-%m-%d %H:%M:%S") + "通过。",
                "http://office.tap4fun.com/hrs/jump?url=" +
                quote("http://office.tap4fun.com/workflow/history"))
        elif result['status'] == 2:
            self.dding.send_link(
                [creator['user_id']], "审批提醒",
                "您发起的" + solution['name'] + "审批,已于" +
                result['end_time'].strftime("%Y-%m-%d %H:%M:%S") + "被拒绝。",
                "http://office.tap4fun.com/hrs/jump?url=" +
                quote("http://office.tap4fun.com/workflow/history"))

        return {}, 0, ""

    def comment(self, _id, content, picture, attachment):
        item = self.workflow_model.comment(_id, content, picture, attachment)
        users = []
        solution = self.solution_model.find(item['solution_id'])
        item['solution'] = solution
        item['next_user'] = self.user_model.find_id(item['next'])
        item['creator_user'] = self.user_model.find_id(item['creator'])
        for userid in item['member']:
            users.append(self.user_model.find_id(userid))
        item['users'] = users
        for log in item['operation_log']:
            if log['type'] == 'comment':
                log['picture_detail'] = []
                log['attachment_detail'] = []
                for picture in log['picture']:
                    log['picture_detail'].append(self.file_model.find(picture))
                for attachment in log['attachment']:
                    log['attachment_detail'].append(
                        self.file_model.find(attachment))
        return item, 0, ""
예제 #6
0
class Synch(object):
    """ Organization Synch Class"""
    def __init__(self, mongo):
        self.mongo = mongo
        self.department_model = department_model(self.mongo)
        self.user_model = user_model(self.mongo)
        self.dding = Dding(self.mongo)
        self.user_service = user_service(self.mongo)
        self.file_model = file_model(self.mongo)

    def synch(self):
        """ Launch Synch """
        result = self.dding.get_department()
        self._add(result['department'], 0, 0)
        return {}, 0, "success"

    def synch_leader(self):
        result = self.department_model.list_all()

        for department in result:
            detail = self.dding.get_department_detail(department['did'])
            user = self.user_model.find_user_id(detail['deptManagerUseridList'])
            self.mongo.db.department.update(
                    {
                        "did": department['did']
                    },
                    {
                        '$set':
                        {
                            'managers':[user['_id']]
                        }
                    })


    def _add(self, departments, parentid, parentdid):
        """ add department """
        for department in departments:
            exists = False
            if 'parentid' in department.keys():
                exists = True
            if not parentid and not exists:
                result = self.department_model.add(department['id'], department['name'], parentid)
                self._add(departments, result['_id'], result['did'])
            else:
                if exists:
                    if department['parentid'] == parentdid:
                        result = self.department_model.add(department['id'],
                                                           department['name'],
                                                           parentid)
                        self._add(departments, result['_id'], department['id'])

    def synch_user(self):
        """ import """
        with open('/Users/yangyunbo/Desktop/import.csv') as f:
            f_csv = csv.reader(f)
            headers = next(f_csv)
            for row in f_csv:
                data = {}
                graduationdate = ''
                regularizationdate = ''
                birthday = ''
                entrydate = ''
                if row[18]:
                    graduationdate = libs.str_to_utc(row[18], "%Y-%m-%d")
                if row[6]:
                    regularizationdate = libs.str_to_utc(row[6], "%Y-%m-%d")
                if row[10]:
                    birthday = libs.str_to_utc(row[10], "%Y-%m-%d")
                if row[7]:
                    entrydate = libs.str_to_utc(row[7], "%Y-%m-%d")

                if row[5] == '实习生':
                    data = {
                        "_id": ObjectId(),
                        "member_id": row[1],
                        "user_id": '',
                        'login_record':[],
                        'permission':[],
                        'group':0,
                        'status':'admitted',
                        'insurance': '',
                        'taxes': '',
                        'fund': '',
                        'salary': ObjectId('58ec7a20cf30a56388401be9'),
                        'salaries':[
                            {
                                "name": "基本薪资(日薪)",
                                "value": float(row[40]),
                                "salary_id": ObjectId("58f08453cf30a55d48a2f0c8")
                            }
                        ],
                        'firstworkdate':'',
                        'major':row[16],
                        'selfie':[],
                        'adminreport':[],
                        'hukouintro':[],
                        'universitytype':row[15],
                        'joblevel':row[28],
                        'education':row[17],
                        'bankcardnumber':row[35],
                        'jobseries':row[29],
                        'depositbank':row[34],
                        'placeofpermanent':row[12],
                        'backuptel':'',
                        'contactname':row[36],
                        'department':[],
                        'type':row[5],
                        'email':row[3],
                        'idcopyfront':[],
                        'graduationdate':graduationdate,
                        'relationship':row[37],
                        'workreport':[],
                        'position_level':row[31],
                        'regularizationdate':regularizationdate,
                        'birthday':birthday,
                        'address':row[13],
                        'certificatetype':row[8],
                        'name':row[0],
                        'salary_level':row[32],
                        'entrydate':entrydate,
                        'mobilephone':row[4],
                        'gender':row[2],
                        'university':row[14],
                        'academiccertificate':[],
                        'idnumber':row[9],
                        'contacttel':row[38],
                        'subordinate_companies':row[21],
                        'marriage':row[11],
                        'workplace':row[20],
                        'jobcategory':row[26],
                        'position':row[27],
                        'degreecertificate':[],
                        'employeemanual': True
                    }
                else:
                    taxesid = ""
                    if row[5] == '普通员工':
                        taxesid = "58ec797acf30a56388401be8"
                    else:
                        taxesid = "58ec800ccf30a56388401bee"

                    data = {
                        "_id": ObjectId(),
                        "member_id": row[1],
                        "user_id": '',
                        'login_record':[],
                        'permission':[],
                        'group':"0",
                        'status':'admitted',
                        'insurance': ObjectId('58edbcdfcf30a5a72b061903'),
                        'taxes': ObjectId(taxesid),
                        'fund': ObjectId('58ec7b56cf30a56388401bec'),
                        'salary': ObjectId('58f0843dcf30a55d48a2f0c6'),
                        'salaries':[
                            {
                                "name": "基本薪资",
                                "value": float(row[40]),
                                "salary_id": ObjectId("58f0843dcf30a55d48a2f0c2")
                            },
                            {
                                "name": "岗位薪资",
                                "value": float(row[41]),
                                "salary_id": ObjectId("58f0843dcf30a55d48a2f0c3")
                            }
                        ],
                        'firstworkdate':'',
                        'major':row[16],
                        'selfie':[],
                        'adminreport':[],
                        'hukouintro':[],
                        'universitytype':row[15],
                        'joblevel':row[28],
                        'education':row[17],
                        'bankcardnumber':row[35],
                        'jobseries':row[29],
                        'depositbank':row[34],
                        'placeofpermanent':row[12],
                        'backuptel':'',
                        'contactname':row[36],
                        'department':[],
                        'type':row[5],
                        'email':row[3],
                        'idcopyfront':[],
                        'graduationdate':graduationdate,
                        'relationship':row[37],
                        'workreport':[],
                        'position_level':row[31],
                        'regularizationdate':regularizationdate,
                        'birthday':birthday,
                        'address':row[13],
                        'certificatetype':row[8],
                        'name':row[0],
                        'salary_level':row[32],
                        'entrydate':entrydate,
                        'mobilephone':row[4],
                        'gender':row[2],
                        'university':row[14],
                        'academiccertificate':[],
                        'idnumber':row[9],
                        'contacttel':row[38],
                        'subordinate_companies':row[21],
                        'marriage':row[11],
                        'workplace':row[20],
                        'jobcategory':row[26],
                        'position':row[27],
                        'degreecertificate':[],
                        'employeemanual': True
                    }
                self.mongo.db.user.insert_one(data)


    def synch_dd(self):
        departments = self.department_model.list_all()
        for department in departments:
            users = self.dding.get_users_detail(department['did'])
            for user in users['userlist']:
                self.mongo.db.user.update(
                    {
                        "name": user['name']
                    },
                    {
                        '$set':
                        {
                            'user_id':user['userid']
                        }
                    })
                self.mongo.db.user.update(
                    {
                        "name": user['name']
                    },
                    {
                        '$push':
                        {
                            'department':
                            {
                                "value": str(department['_id']),
                                "label": department['name']
                            }
                        }
                    })

    def synch_report(self):
        with open('/Users/yangyunbo/Desktop/import.csv') as f:
            f_csv = csv.reader(f)
            headers = next(f_csv)
            for row in f_csv:
                if not row[30]:
                    continue
                adminreport_result = self.mongo.db.user.find_one({"name":row[30]})
                workreport_result = self.mongo.db.user.find_one({"name":row[33]})
                print row[0]
                print row[30]
                print row[33]
                print adminreport_result
                print workreport_result
                self.mongo.db.user.update(
                    {
                        "name": row[0]
                    },
                    {
                        '$set':
                        {
                            'adminreport':[str(adminreport_result['_id'])],
                            'workreport':[str(workreport_result['_id'])]
                        }
                    })
                    
    def synch_avatar(self):
        # users = self.user_model.list_all()
        # for user in users:
        #     result = self.dding.get_user_detail(user['user_id'])
        #     if "avatar" in result.keys():
        #         file_result = self._load(result['avatar'])
        #         if not file_result:
        #             continue
        #         self.mongo.db.user.update(
        #             {
        #                 "user_id": result['userid']
        #             },
        #             {
        #                 '$set':
        #                 {
        #                     'selfie':[]
        #                 }
        #             })
        #         self.mongo.db.user.update(
        #             {
        #                 "user_id": result['userid']
        #             },
        #             {
        #                 '$push':
        #                 {
        #                     'selfie':file_result['_id']
        #                 }
        #             })
        #     else:
        #         print result
        result = self.mongo.db.file.find()
        for file in result:
            self.mongo.db.file.update(
                {
                    "_id": file['_id']
                },
                {
                    '$set':
                    {
                        'filename':file['filename'].replace('attachment/','')
                    }
                })
    def _load(self, avatar):
        """ download database """
        filename = config.disk_path+"/attachment/"+hashlib.md5(avatar).hexdigest()
        try:
            read = requests.get(avatar, stream=True)
            database = open(filename, "wb")
            for chunk in read.iter_content(chunk_size=512):
                if chunk:
                    database.write(chunk)
            database.close()
            result = self.file_model.add(filename+".jpg", ".jpg", filename)
            return result
        except Exception, err:
            print err
            return ''
예제 #7
0
class User(object):
    """ User Service Class"""
    def __init__(self, mongo):
        self.mongo = mongo
        self.department_model = department_model(self.mongo)
        self.user_model = user_model(self.mongo)
        self.module_model = module_model(self.mongo)
        self.menu_model = menu_model(self.mongo)
        self.field_model = field_model(self.mongo)
        self.file_model = file_model(self.mongo)
        self.dding = Dding(self.mongo)
        self.uac_service = uac_service(self.mongo)

    def auth(self, ticket):
        """ auth with gmail """
        result, code, message = self.uac_service.validate(ticket)
        if not code:
            token = self.user_model.authorized_email(result['email'])
            expiretime = datetime.datetime.now()
            expiretime = expiretime + datetime.timedelta(days=7)
            data = {"token": token, "expiretime": expiretime}
            return data, 0, "", "token", token, expiretime, True
        else:
            return result, 1, message, "", "", "", False

    def authorizing(self, code):
        """ authorizing user """
        result = self.dding.get_user_info(code)
        if not result['errcode']:
            token = self.user_model.authorized_user_id(result['userid'])
            expiretime = datetime.datetime.now()
            expiretime = expiretime + datetime.timedelta(days=7)
            data = {"token": token, "expiretime": expiretime}
            return data, result[
                'errcode'], "", "token", token, expiretime, True
        else:
            return {}, result['errcode'], result['errmsg'], "", "", "", False

    def verify(self):
        """ verify cookie """
        token = request.cookies.get('token')
        code = 0
        message = ""
        if not token:
            code = 1
            message = "invalid token"
        else:
            if self.user_model.verify(token):
                code = 0
                message = "valid token"
            else:
                code = 1
                message = "invalid token"

        return {}, code, message

    def get_current(self):
        """ get current user information """
        token = request.cookies.get('token')
        data = {}
        code = 0
        message = ""
        if not token:
            code = 1
            message = "invalid token"
        else:
            data = self.user_model.find_user_token(token)
            if not data:
                code = 1
                message = "invalid token"
            group_result = self.field_model.list_group()
            group_list = []
            for group in group_result:
                group_list.append(group)

            for group in group_list:
                for field in group['fields']:
                    if field['type'] == 'file':
                        files = []
                        for file in data[field['namespace']]:
                            files.append(self.file_model.find(file))
                        data[field['namespace']] = files
                    if field['type'] == 'date':
                        if field['namespace'] in data:
                            date = data[field['namespace']]
                            if date:
                                data[field['namespace']] = libs.utc_to_local(
                                    date).strftime("%Y-%m-%d")
        return data, code, message

    def list_all(self):
        """ list all users """
        data = self.user_model.list_all()
        return data, 0, ''

    def list_user(self, condition, pagination):
        """ list users """
        group_result = self.field_model.list_group()
        result = {}
        for key in condition.keys():
            if not condition[key]:
                del condition[key]
        if condition.has_key('regularizationdate'):
            if bool(int(condition['regularizationdate'])):
                condition['regularizationdate'] = {"$ne": ''}
            else:
                condition['regularizationdate'] = ""
        if condition.has_key('department'):
            temp_department = []
            for department_id in condition['department']:
                temp_department.append(
                    {"department.value": department_id['value']})
            condition['$or'] = temp_department
            del condition['department']
        user_list = self.user_model.list_user(condition, {"loginrecord": 0},
                                              40, pagination)
        result['data'] = []
        # set file default value
        group_list = []
        for group in group_result:
            group_list.append(group)
        for user in user_list:
            for group in group_list:
                for field in group['fields']:
                    if field['type'] == 'file':
                        files = []
                        for file in user[field['namespace']]:
                            files.append(self.file_model.find(file))
                        user[field['namespace']] = files
                    if field['type'] == 'date':
                        if field['namespace'] in user:
                            date = user[field['namespace']]
                            if date:
                                user[field['namespace']] = libs.utc_to_local(
                                    date).strftime("%Y-%m-%d")
            result['data'].append(user)
        result['count'] = self.user_model.count_user(condition)
        return result, 0, ''

    def list_name(self, keywords):
        """ list users """
        result = self.user_model.list_name(keywords)
        return result, 0, ''

    def update_group(self, _id, group):
        """ list all users """
        data = self.user_model.update_group(_id, group)
        self._update_permission_group(_id, group)
        return data, 0, ''

    def get_menus(self):
        """ get current user menus """
        ids = []
        token = request.cookies.get('token')
        data = {}
        menus = []
        code = 0
        message = ""
        if not token:
            code = 1
            message = "invalid token"
        else:
            data = self.user_model.find_user_token(token)
            if not data:
                code = 1
                message = "invalid token"
        if data:
            if data['group'] == '2':
                result = self.menu_model.list_all()
                for menu in result:
                    menus.append(menu)
            else:
                for permission in data['permission']:
                    if 'menus' in permission.keys():
                        for menu in permission['menus']:
                            ids.append(str(menu['menuid']))
                result = self.menu_model.list_sub_ids(ids)
                for menu in result:
                    sub_menu = []
                    for sub in menu['sub']:
                        for _id in ids:
                            if str(_id) == str(sub['_id']):
                                sub_menu.append(sub)
                    menu['sub'] = sub_menu
                    menus.append(menu)

        return menus, code, message

    def _update_permission_group(self, _id, group):
        """ update user permission by group """
        permission = []
        modules = []
        if group == '0':
            modules = self.module_model.list_permission('0')
        elif group == '1':
            modules = self.module_model.list_permission('1')
        elif group == '2':
            modules = self.module_model.list_permission('2')
        for module in modules:
            menus = self.menu_model.list(module['_id'])
            menu_permission = []
            for menu in menus:
                for sub in menu['sub']:
                    if group == '0':
                        if sub['permission'] == '0':
                            menu_permission.append({
                                "menuid": sub['_id'],
                                "permission": '0'
                            })
                    elif group == '1':
                        if sub['permission'] == '0' or sub['permission'] == '1':
                            menu_permission.append({
                                "menuid": sub['_id'],
                                "permission": '1'
                            })
                    elif group == '2':
                        menu_permission.append({
                            "menuid": sub['_id'],
                            "permission": '1'
                        })
            permission.append({
                "moduleid": module['_id'],
                "menus": menu_permission
            })
            if group == '2':
                permission = []
            self.user_model.update_permission(_id, permission)

    def update_permission(self, _id, permissions):
        """ update user permission """
        code = 0
        message = ""
        user_obj = self.user_model.find_id(_id)
        permissions = json.loads(permissions)
        if not user_obj:
            code = 1
            message = 'Invalid userid'
        for permission in permissions:
            module = self.module_model.find(permission['moduleid']['$oid'])
            permission['moduleid'] = ObjectId(permission['moduleid']['$oid'])
            if not module:
                code = 2
                message = 'Invalid module id'
            if user_obj['group'] == '0' and module['permission'] != "0":
                code = 3
                message = 'Module access denied'
            if user_obj['group'] == '1' and module['permission'] == "2":
                code = 3
                message = 'Module access denied'
            if 'menus' in permission.keys():
                for menu in permission['menus']:
                    menu_obj = self.menu_model.find_sub(menu['menuid']['$oid'])
                    menu['menuid'] = ObjectId(menu['menuid']['$oid'])
                    if not menu_obj:
                        code = 4
                        message = 'Invalid menu id'
                    if user_obj['group'] == '0' and menu_obj['sub'][0][
                            'permission'] != "0":
                        code = 5
                        message = 'Menu access denied'
                    if user_obj['group'] == '1' and menu_obj['sub'][0][
                            'permission'] == "2":
                        code = 5
                        message = 'Menu access denied'
        if not code:
            self.user_model.update_permission(_id, permissions)
        return {}, code, message

    def find_id(self, _id):
        """ find user by id """
        return self.user_model.find_id(_id), 0, ""

    def entry(self, custom_field, insurance, taxes, fund, salary, salaries):
        """ new member entry """
        code = 0
        message = ""
        status = "passed"
        field_group = self.field_model.list_group()
        fields = {}
        for group in field_group:
            for field in group['fields']:
                if field['type'] == 'input':
                    if custom_field.has_key(field['namespace']):
                        fields.update({
                            field['namespace']:
                            custom_field[field['namespace']]
                        })
                    else:
                        fields.update({field['namespace']: ""})

                elif field['type'] == 'select':
                    if custom_field.has_key(field['namespace']):
                        fields.update({
                            field['namespace']:
                            custom_field[field['namespace']]
                        })
                    else:
                        fields.update({field['namespace']: []})

                elif field['type'] == 'file':
                    if custom_field.has_key(field['namespace']):
                        file_ids = []
                        for file_id in custom_field[field['namespace']]:
                            file_ids.append(ObjectId(file_id))
                        fields.update({field['namespace']: file_ids})
                    else:
                        fields.update({field['namespace']: []})
                elif field['type'] == 'date':
                    if custom_field.has_key(field['namespace']):
                        if custom_field[field['namespace']]:
                            custom_field[field['namespace']] = libs.str_to_utc(
                                custom_field[field['namespace']], "%Y-%m-%d")
                        fields.update({
                            field['namespace']:
                            custom_field[field['namespace']]
                        })
                    else:
                        fields.update({field['namespace']: ""})

                elif field['type'] == 'department':
                    if custom_field.has_key(field['namespace']):
                        departments = custom_field[field['namespace']]
                        for department in departments:
                            if field['treeCheckStrictly']:
                                department = ObjectId(department['value'])
                            else:
                                department = ObjectId(department)
                        fields.update({field['namespace']: departments})
                    else:
                        fields.update({field['namespace']: []})

                elif field['type'] == 'member':
                    if custom_field.has_key(field['namespace']):
                        members = custom_field[field['namespace']]
                        for member in members:
                            member = ObjectId(member)
                        fields.update({field['namespace']: members})
                    else:
                        fields.update({field['namespace']: []})
        return self.user_model.add(fields, status, insurance, taxes, fund,
                                   salary, salaries), code, message

    def completed(self, custom_field):
        """ completed profile """
        current_user, code, message = self.get_current()
        status = "admitted"
        code = 0
        message = ""
        _id = str(current_user['_id'])
        field_group = self.field_model.list_group()
        fields = {}
        for group in field_group:
            for field in group['fields']:
                if field['fill']:
                    if field['type'] == 'input':
                        if custom_field.has_key(field['namespace']):
                            fields.update({
                                field['namespace']:
                                custom_field[field['namespace']]
                            })
                        else:
                            fields.update({field['namespace']: ""})

                    elif field['type'] == 'select':
                        if custom_field.has_key(field['namespace']):
                            fields.update({
                                field['namespace']:
                                custom_field[field['namespace']]
                            })
                        else:
                            fields.update({field['namespace']: []})

                    elif field['type'] == 'file':
                        if custom_field.has_key(field['namespace']):
                            file_ids = []
                            for file_id in custom_field[field['namespace']]:
                                file_ids.append(ObjectId(file_id))
                            fields.update({field['namespace']: file_ids})
                        else:
                            fields.update({field['namespace']: []})
                    elif field['type'] == 'date':
                        if custom_field.has_key(field['namespace']):
                            if custom_field[field['namespace']]:
                                custom_field[
                                    field['namespace']] = libs.str_to_utc(
                                        custom_field[field['namespace']],
                                        "%Y-%m-%d")
                            fields.update({
                                field['namespace']:
                                custom_field[field['namespace']]
                            })
                        else:
                            fields.update({field['namespace']: ""})

                    elif field['type'] == 'department':
                        if custom_field.has_key(field['namespace']):
                            departments = custom_field[field['namespace']]
                            for department in departments:
                                if field['treeCheckStrictly']:
                                    department = ObjectId(department['value'])
                                else:
                                    department = ObjectId(department)
                            fields.update({field['namespace']: departments})
                        else:
                            fields.update({field['namespace']: []})

                    elif field['type'] == 'member':
                        if custom_field.has_key(field['namespace']):
                            members = custom_field[field['namespace']]
                            for member in members:
                                member = ObjectId(member)
                            fields.update({field['namespace']: members})
                        else:
                            fields.update({field['namespace']: []})

        return self.user_model.completed(_id, status, fields), code, message

    def update(self, _id, custom_field, insurance, taxes, fund, salary,
               salaries):
        """ completed profile """
        current_user = self.user_model.find_id(_id)
        code = 0
        message = ""
        field_group = self.field_model.list_group()
        fields = {}
        for group in field_group:
            for field in group['fields']:
                if field['type'] == 'input':
                    if custom_field.has_key(field['namespace']):
                        fields.update({
                            field['namespace']:
                            custom_field[field['namespace']]
                        })
                    else:
                        fields.update({field['namespace']: ""})

                elif field['type'] == 'select':
                    if custom_field.has_key(field['namespace']):
                        fields.update({
                            field['namespace']:
                            custom_field[field['namespace']]
                        })
                    else:
                        fields.update({field['namespace']: []})

                elif field['type'] == 'file':
                    if custom_field.has_key(field['namespace']):
                        file_ids = []
                        for file_id in custom_field[field['namespace']]:
                            file_ids.append(ObjectId(file_id))
                        fields.update({field['namespace']: file_ids})
                    else:
                        fields.update({field['namespace']: []})
                elif field['type'] == 'date':
                    if custom_field.has_key(field['namespace']):
                        if custom_field[field['namespace']]:
                            custom_field[field['namespace']] = libs.str_to_utc(
                                custom_field[field['namespace']], "%Y-%m-%d")
                        fields.update({
                            field['namespace']:
                            custom_field[field['namespace']]
                        })
                    else:
                        fields.update({field['namespace']: ""})

                elif field['type'] == 'department':
                    if custom_field.has_key(field['namespace']):
                        departments = custom_field[field['namespace']]
                        for department in departments:
                            if field['treeCheckStrictly']:
                                department = ObjectId(department['value'])
                            else:
                                department = ObjectId(department)
                        fields.update({field['namespace']: departments})
                    else:
                        fields.update({field['namespace']: []})

                elif field['type'] == 'member':
                    if custom_field.has_key(field['namespace']):
                        members = custom_field[field['namespace']]
                        for member in members:
                            member = ObjectId(member)
                        fields.update({field['namespace']: members})
                    else:
                        fields.update({field['namespace']: []})

        return self.user_model.update(_id, fields, insurance, taxes, fund,
                                      salary, salaries), code, message

    def exists_custom_field(self, _id, value):
        """ new member entry """
        code = 0
        message = ""
        field_group = self.field_model.list_group()
        field_name = ""
        for group in field_group:
            for field in group['fields']:
                if str(field['_id']) == _id:
                    field_name = field['namespace']
                    break
            if field_name:
                break
        return self.user_model.exists_custom_field(field_name,
                                                   value), code, message
예제 #8
0
 def __init__(self, mongo):
     self.mongo = mongo
     self.dding = Dding(self.mongo)