Beispiel #1
0
 def deleteModel(self, policy_id):
     while self.running:
         pass
     self.running = True
     try:
         #function variable
         file_data = ""
         result = True
         model_name = 'OmPolicy_' + str(policy_id)
         model_start = "#<" + model_name + " start>"
         model_end = "#<" + model_name + " end>"
         get_model_start_line = False
         change_complete = False
         with open(self.file_path, "r", encoding="utf-8") as f:
             for line in f:
                 if change_complete:
                     pass
                 elif get_model_start_line:
                     if model_end in line:
                         get_model_start_line = False
                         change_complete = True
                     line = ""
                 else:
                     if model_start in line:
                         get_model_start_line = True
                         line = ""
                 file_data += line
         with open(self.file_path, "w", encoding="utf-8") as f:
             f.write(file_data)
     except Exception as e:
         debug('delete model error: %s' % e.__str__())
         result = False
     finally:
         self.running = False
         return result
Beispiel #2
0
def getRootPosition(group_id, position_name):
    '''
    取得同系角色
    '''
    try:
        user_id = None
        get_user = False
        group_id = str(group_id)
        dept_dict = GlobalObject.__OrganizationObj__['dept']
        role_dict = GlobalObject.__OrganizationObj__['role']
        people_dict = GlobalObject.__OrganizationObj__['people']
        source_dict = GlobalObject.__OrganizationObj__['line']['source']
        #取得起點部門的item id
        if re.match(r'FITEM_.+', group_id):
            g_item_id = group_id
        else:
            g_item_id = dept_dict.get(group_id,'')
        if g_item_id:
            #取得該部門的下層物件陣列
            target_list = source_dict.get(g_item_id,'')
            if target_list:
                #將物件陣列依照id由小至大排序,並迴圈取得role物件
                target_list.sort(key=lambda x: int(x[6:]))
                for t_id in target_list:
                    r_item_name = role_dict.get(t_id,'')
                    #確認物件是否為目標role物件
                    if r_item_name == position_name:
                        #找該物件的下層物件陣列
                        role_target_list = source_dict.get(t_id,'')
                        if role_target_list:
                            #排序陣列並取第一個物件id
                            target_list.sort(key=lambda x: int(x[6:]))
                            #取得使用者id
                            user_id = people_dict.get(role_target_list[0])
                        #只要找到role物件,無論是否找到使用者,都不會繼續找下去
                        get_user = True
                        break
            #如果該部門下層並無此職位,往上層物件找尋
            if not get_user:
                target_dict = GlobalObject.__OrganizationObj__['line']['target']
                #取得上層物件列表
                source_list = target_dict.get(g_item_id,'')
                if source_list:
                    #將物件陣列依照id由小至大排序,並迴圈取得dept物件
                    source_list.sort(key=lambda x: int(x[6:]))
                    for new_g_item_id in source_list:
                        #呼叫自己並把dept物件id帶入
                        grp_res = getRootPosition(new_g_item_id, position_name)
                        #找到物件後脫離迴圈
                        if grp_res['get_user']:
                            user_id = grp_res['user_id']
                            get_user = grp_res['get_user']
                            break
    except Exception as e:
        debug(e.__str__())
    finally:
        return {'user_id':user_id, 'get_user':get_user}
Beispiel #3
0
def loadWorkinfoAjax(request):
    '''
    show workinfo
    input: request
    return: json
    author: Kolin Hsu
    '''
    if settings.OMFLOW_TYPE == 'collector':
        node = 1
    else:
        node = 0
    #get new workinfo data
    messages = 0  #request.user.messagebox_set.filter(read=0).count()
    #mission
    #取得我(群組)曾經處理過的任務
    mission_list = list(
        Missions.objects.filter(
            Q(update_user_id=request.user.username) & Q(history=True)
            & Q(closed=False) & Q(is_active=True)
            & Q(deploy_flag=True)).values('flow_uuid', 'data_no'))
    #將查詢結果分為兩個list  建立對照的dict--(以flow_uuid為KEY,該流程的單號組成list為VALUE)
    flow_uuid_list = []
    data_no_list = []
    mapping_dict = {}
    for i in mission_list:
        mapping_data_no_list = mapping_dict.get(i['flow_uuid'], [])
        mapping_data_no_list.append(i['data_no'])
        if len(mapping_data_no_list) == 1:
            mapping_dict[i['flow_uuid']] = mapping_data_no_list
        if i['flow_uuid'] not in flow_uuid_list:
            flow_uuid_list.append(i['flow_uuid'])
        if i['data_no'] not in data_no_list:
            data_no_list.append(i['data_no'])
    #將所有flow_uuid_list、data_no_list組合的max id查出來
    try:
        max_mission_list = list(
            Missions.objects.filter(flow_uuid__in=flow_uuid_list,
                                    data_no__in=data_no_list).values(
                                        'flow_uuid',
                                        'data_no').annotate(max_id=Max('id')))
        #透過對照dict找出真正該撈出來的max id
        max_id_list = []
        for m in max_mission_list:
            mapping_no_list = mapping_dict.get(m['flow_uuid'], None)
            if m['data_no'] in mapping_no_list:
                max_id_list.append(m['max_id'])
        missions = Missions.objects.filter(id__in=max_id_list).count()
    except:
        missions = '999+'
    result = {'messages': messages, 'missions': missions, 'node': node}
    debug('%s load workinfo success.' % request.user.username, request)
    return ResponseAjax(statusEnum.success, _('更新成功。'), result).returnJSON()
Beispiel #4
0
def setOrgToGlobal(org):
    '''
    拆解organization物件並放至global
    '''
    try:
        #function variable
        
        line_source = {}
        line_target = {}
        people_dict = {}
        role_dict = {}
        dept_dict = {}
        status = True
        if org and isinstance(org, str):
            org = json.loads(org)
        items = org['items']
        for item in items:
            item_type = item['type']
            if item_type == 'line':
                source_item = item['config']['source_item']
                target_item = item['config']['target_item']
                #用來找下層
                if line_source.get(source_item,''):
                    line_source[source_item].append(target_item)
                else:
                    targets = [target_item]
                    line_source[source_item] = targets
                #用來找上層
                if line_target.get(target_item,''):
                    line_target[target_item].append(source_item)
                else:
                    sources = [source_item]
                    line_target[target_item] = sources
            elif item_type == 'dept':
                dept_dict[item['config']['noid']] = item['id']
            elif item_type == 'role':
                role_dict[item['id']] = item['text']
            elif item_type == 'people':
                people_dict[item['id']] = item['config']['noid']
        line_dict = {'source':line_source, 'target':line_target}
        GlobalObject.__OrganizationObj__['dept'] = dept_dict
        GlobalObject.__OrganizationObj__['role'] = role_dict
        GlobalObject.__OrganizationObj__['people'] = people_dict
        GlobalObject.__OrganizationObj__['line'] = line_dict
    except Exception as e:
        debug(e.__str__())
        status = False
    finally:
        return status
Beispiel #5
0
def deleteMission(flow_uuid, data_no):
    '''
    create mission.
    input: param
    return: json
    author: Kolin Hsu
    '''
    try:
        status = True
        Missions.objects.filter(flow_uuid=flow_uuid, data_no=data_no).delete()
    except Exception as e:
        debug('set mission error:     %s' % e.__str__())
        status = False
    finally:
        return status
Beispiel #6
0
def setMission(action, flow_uuid, data_no, data_id, update_user):
    '''
    create mission.
    input: param
    return: json
    author: Kolin Hsu
    '''
    try:
        status = True
        if action == 'history':
            m = Missions.objects.get(flow_uuid=flow_uuid, data_id=data_id)
            m.history = True
            m.update_user_id = update_user
            m.save()
        elif action == 'closed':
            Missions.objects.filter(flow_uuid=flow_uuid,
                                    data_no=data_no).update(closed=True)
        elif action in ['active', 'inactive']:
            if flow_uuid:
                active_map = {'active': True, 'inactive': False}
                is_active = active_map[action]
                if isinstance(flow_uuid, list):
                    Missions.objects.filter(flow_uuid__in=flow_uuid).update(
                        is_active=is_active)
                else:
                    Missions.objects.filter(flow_uuid=flow_uuid).update(
                        is_active=is_active)
        elif action in ['deploy', 'undeploy']:
            if flow_uuid:
                deploy_map = {'deploy': True, 'undeploy': False}
                deploy_flag = deploy_map[action]
                if isinstance(flow_uuid, list):
                    Missions.objects.filter(flow_uuid__in=flow_uuid).update(
                        deploy_flag=deploy_flag)
                else:
                    Missions.objects.filter(flow_uuid=flow_uuid).update(
                        deploy_flag=deploy_flag)
    except Exception as e:
        debug('set mission error:     %s' % e.__str__())
        status = False
    finally:
        return status
Beispiel #7
0
def createMission(param):
    '''
    create mission.
    input: param
    return: json
    author: Kolin Hsu
    '''
    try:
        status = True
        if isinstance(param, dict):
            new_param = param
        elif isinstance(param, str):
            new_param = json.loads(param)
        new_param['attachment'] = Missions.objects.filter(
            flow_uuid=new_param['flow_uuid'],
            data_no=new_param['data_no'],
            attachment=True).exists()
        Missions.objects.create(**new_param)
    except Exception as e:
        debug('create mission error:     %s' % e.__str__())
        status = False
    finally:
        return status
Beispiel #8
0
    def deployModel(self, policy_id, policy_name, variable_list):
        '''
        input: policy_id, policy_name, variable_item_counter
        return: True, False
        author: Kolin Hsu
        '''
        def createModel(file_path, file_content):
            '''
            create new model
            input: file_content
            return: None
            author: Kolin Hsu
            '''
            #function variable
            file_data = ""
            #write model
            with open(file_path, "r", encoding="utf-8") as f:
                for line in f:
                    if "#<new here>" in line:
                        line = line.replace("#<new here>", "")
                    file_data += line
            file_data += "\n" + file_content
            with open(file_path, "w", encoding="utf-8") as f:
                f.write(file_data)

        def updateModel(file_path, model_name, variable_list):
            '''
            update model
            input: file_content
            return: None
            author: Kolin Hsu
            '''
            #function variable
            file_data = ""
            add_location = "#" + model_name + " add field here"
            with open(file_path, "r", encoding="utf-8") as f:
                for line in f:
                    if add_location in line:
                        for variable_name in variable_list:
                            file_data += "    " + variable_name + " = models.TextField(null=True,blank=True)\n"
                    file_data += line
            with open(file_path, "w", encoding="utf-8") as f:
                f.write(file_data)

        def getDefaultModel(model_name, policy_name, variable_list):
            '''
            create default model class
            input: model_name, form_item_counter
            return: file_content
            author: Kolin Hsu
            '''
            file_content = ""
            file_content += "class " + model_name + "(models.Model):\n"
            code_space = "    "
            file_content += code_space + "table_name = _('" + policy_name + "')\n"
            file_content += code_space + "collector = models.ForeignKey('ommonitor.Collector', on_delete=models.CASCADE)\n"
            file_content += code_space + "error = models.BooleanField(verbose_name = _('是否異常'), default=False)\n"
            file_content += code_space + "createtime = models.DateTimeField(verbose_name = _('建立時間'), auto_now_add=True)\n"
            file_content += code_space + "error_message = models.TextField(verbose_name = _('錯誤訊息'), null=True,blank=True)\n"
            for variable_name in variable_list:
                file_content += code_space + variable_name + " = models.TextField(null=True,blank=True)\n"
            file_content += code_space + "#" + model_name + " add field here\n"
            file_content += code_space + "objects = FormatManager()\n"
            file_content += code_space + "class Meta:\n"
            code_space += "    "
            file_content += code_space + "default_permissions = ()\n"
            code_space = code_space.replace("    ", "", 1)
            code_space = code_space.replace("    ", "", 1)
            file_content += "#<new here>\n"
            return file_content

        def addModelClass(model_name, policy_name, variable_list):
            class Meta:
                default_permissions = ()

            #add model to memory
            attrs = {'__module__': 'ompolicymodel.models', 'Meta': Meta}
            attrs['table_name'] = policy_name
            attrs['collector'] = models.ForeignKey('ommonitor.Collector',
                                                   on_delete=models.CASCADE)
            attrs['error'] = models.BooleanField(verbose_name=_('是否異常'),
                                                 default=False)
            attrs['createtime'] = models.DateTimeField(verbose_name=_('建立時間'),
                                                       auto_now_add=True)
            attrs['error_message'] = models.TextField(verbose_name=_('錯誤訊息'),
                                                      null=True,
                                                      blank=True)
            for variable_name in variable_list:
                attrs[variable_name] = models.TextField(null=True, blank=True)
            attrs['objects'] = FormatManager()
            type(model_name, (models.Model, ), attrs)
            call_command('makemigrations', 'ompolicymodel')
            call_command('migrate', app_label='ompolicymodel')

        while self.running:
            pass
        self.running = True
        result = True
        model_name = 'OmPolicy_' + str(policy_id)
        try:
            model = getModel('ompolicymodel', model_name)
            if model:
                filed_list = list(f.name for f in model._meta.fields)
                update_variable_list = list(
                    set(variable_list) - set(filed_list))
                if update_variable_list:
                    updateModel(self.file_path, model_name, variable_list)
                    all_variable_list = filed_list + update_variable_list
                    addModelClass(model_name, policy_name, all_variable_list)
            else:
                file_content = getDefaultModel(model_name, policy_name,
                                               variable_list)
                createModel(self.file_path, file_content)
                addModelClass(model_name, policy_name, variable_list)
        except Exception as e:
            debug('deploy model error: %s' % e.__str__())
            result = False
        finally:
            self.running = False
            return result
Beispiel #9
0
    def deployModel(self, flow_uuid, flow_name, form_item_counter):
        '''
        input: flow_uuid, form_item_counter
        return: True, False
        author: Kolin Hsu
        '''
        def createModel(file_path, file_content):
            '''
            create new model
            input: file_content
            return: None
            author: Kolin Hsu
            '''
            #function variable
            file_data = ""
            #write model
            with open(file_path, "r", encoding="utf-8") as f:
                for line in f:
                    if "#<new here>" in line:
                        line = line.replace("#<new here>", "")
                    file_data += line
            file_data += "\n" + file_content
            with open(file_path, "w", encoding="utf-8") as f:
                f.write(file_data)

        def updateModel(file_path, model_name, form_item_counter):
            '''
            update model
            input: file_path, model_name, form_item_counter
            return: None
            author: Kolin Hsu
            '''
            #function variable
            file_data = ""
            model_start = "#<" + model_name + " start>"
            get_model_start_line = False
            next_line_is_json = False
            change = True
            with open(file_path, "r", encoding="utf-8") as f:
                for line in f:
                    #搜尋這個model的第一行
                    if get_model_start_line:
                        #model的第二行是max form_item_count
                        if next_line_is_json:
                            max_item_count = int(line[1:])
                            next_line_is_json = False
                            #if new version's item counter less than max item counter, do nothing
                            if max_item_count >= form_item_counter:
                                change = False
                                break
                            #or set new max item counter to 2nd line
                            else:
                                file_data += "#<" + model_name + " start>\n"
                                line = "#" + str(form_item_counter) + "\n"
                        elif max_item_count == 0:
                            if 'init_data = ' in line:
                                file_data += line
                                while max_item_count < form_item_counter:
                                    max_item_count += 1
                                    file_data += "    " + "formitm_" + str(
                                        max_item_count
                                    ) + " = models.TextField(null=True,blank=True)\n"
                                line = ""
                                get_model_start_line = False
                        else:
                            #find max field
                            field = 'formitm_' + str(max_item_count)
                            if field in line:
                                file_data += line
                                while max_item_count < form_item_counter:
                                    max_item_count += 1
                                    file_data += "    " + "formitm_" + str(
                                        max_item_count
                                    ) + " = models.TextField(null=True,blank=True)\n"
                                line = ""
                                get_model_start_line = False
                        file_data += line
                    else:
                        if model_start in line:
                            line = ""
                            get_model_start_line = True
                            next_line_is_json = True
                        file_data += line
            if change:
                with open(file_path, "w", encoding="utf-8") as f:
                    f.write(file_data)
            return change

        def getDefaultModel(model_name, flow_name, form_item_counter,
                            flow_uuid):
            '''
            create default model class
            input: model_name, form_item_counter
            return: file_content
            author: Kolin Hsu
            '''
            file_content = ""
            file_content += "#<" + model_name + " start>\n"
            file_content += "#" + str(form_item_counter) + "\n"
            file_content += "class " + model_name + "(models.Model):\n"
            code_space = "    "
            file_content += code_space + "table_name = _('" + flow_name + "')\n"
            file_content += code_space + "flow_uuid = models.UUIDField(verbose_name= _('流程編號'), null=True, blank=True)\n"
            file_content += code_space + "dataid_header = models.CharField(verbose_name= _('資料代碼'), max_length=3)\n"
            file_content += code_space + "data_no = models.IntegerField(verbose_name = _('資料編號'), null=True, blank=True)\n"
            file_content += code_space + "history = models.BooleanField(verbose_name = _('歷史資料'), default=False)\n"
            file_content += code_space + "status = models.CharField(verbose_name= _('狀態'), max_length=200,null=True, blank=True)\n"
            file_content += code_space + "title = models.CharField(verbose_name= _('標題'), max_length=200,null=True, blank=True)\n"
            file_content += code_space + "level = models.CharField(verbose_name= _('燈號'), max_length=200,null=True, blank=True)\n"
            file_content += code_space + "group = models.CharField(verbose_name= _('受派群組'), max_length=500,null=True, blank=True)\n"
            file_content += code_space + "closed = models.BooleanField(verbose_name = _('關閉標記'), default=False)\n"
            file_content += code_space + "stop_uuid = models.TextField(verbose_name = _('關卡'), blank=True, null=True)\n"
            file_content += code_space + "stop_chart_type = models.TextField(verbose_name = _('關卡類型'), blank=True, null=True)\n"
            file_content += code_space + "stop_chart_text = models.TextField(verbose_name = _('關卡名稱'), blank=True, null=True)\n"
            file_content += code_space + "running = models.BooleanField(verbose_name = _('執行標記'), default=False)\n"
            file_content += code_space + "error = models.BooleanField(verbose_name = _('是否異常'), default=False)\n"
            file_content += code_space + "createtime = models.DateTimeField(verbose_name = _('建立時間'), auto_now_add=True)\n"
            file_content += code_space + "updatetime = models.DateTimeField(verbose_name = _('更新時間'), auto_now=True)\n"
            file_content += code_space + "stoptime = models.DateTimeField(verbose_name = _('停止時間'), null=True,blank=True)\n"
            file_content += code_space + "create_user = models.ForeignKey('omuser.OmUser', verbose_name = _('開單人員'), to_field='username', on_delete=models.SET_NULL, blank=True, null=True, related_name='create_" + flow_uuid + "')\n"
            file_content += code_space + "update_user = models.ForeignKey('omuser.OmUser', verbose_name = _('更新人員'), to_field='username', on_delete=models.SET_NULL, blank=True, null=True, related_name='update_" + flow_uuid + "')\n"
            file_content += code_space + "data_param = models.TextField(verbose_name = _('流程參數'), null=True,blank=True)\n"
            file_content += code_space + "error_message = models.TextField(verbose_name = _('錯誤訊息'), null=True,blank=True)\n"
            file_content += code_space + "init_data = models.ForeignKey('self', blank=True, null=True, related_name='extra_data', verbose_name = _('初始資料'), on_delete=models.CASCADE)\n"
            file_content += code_space + "is_child = models.BooleanField(verbose_name = _('子單'), default=False)\n"
            for i in range(form_item_counter):
                file_content += code_space + "formitm_" + str(
                    i + 1) + " = models.TextField(null=True,blank=True)\n"
            file_content += code_space + "objects = FormatManager()\n"
            file_content += code_space + "class Meta:\n"
            code_space += "    "
            file_content += code_space + "default_permissions = ()\n"
            file_content += code_space + "permissions = (\n"
            file_content += code_space + "    ('" + model_name + "_Add', _('新增" + flow_name + "')),\n"
            file_content += code_space + "    ('" + model_name + "_Modify', _('修改" + flow_name + "')),\n"
            file_content += code_space + "    ('" + model_name + "_View', _('檢視" + flow_name + "')),\n"
            file_content += code_space + "    ('" + model_name + "_Delete', _('刪除" + flow_name + "')),\n"
            file_content += code_space + ")\n"
            code_space = code_space.replace("    ", "", 1)
            code_space = code_space.replace("    ", "", 1)
            file_content += code_space + "\n"
            file_content += "class " + model_name + "_ValueHistory(models.Model):\n"
            code_space = "    "
            file_content += code_space + "flow_uuid = models.UUIDField(verbose_name= _('流程編號'), null=True, blank=True)\n"
            file_content += code_space + "data_no = models.IntegerField(verbose_name = _('資料編號'), null=True, blank=True)\n"
            file_content += code_space + "data_id = models.IntegerField(verbose_name = _('多重資料編號'), blank=True, null=True)\n"
            file_content += code_space + "chart_id = models.CharField(verbose_name= _('功能點'), max_length=500,null=True, blank=True)\n"
            file_content += code_space + "stop_chart_type = models.TextField(verbose_name = _('關卡類型'), blank=True, null=True)\n"
            file_content += code_space + "stop_chart_text = models.TextField(verbose_name = _('關卡名稱'), blank=True, null=True)\n"
            file_content += code_space + "input_data = models.TextField(verbose_name= _('輸入參數'),null=True, blank=True)\n"
            file_content += code_space + "output_data = models.TextField(verbose_name= _('輸出參數'),null=True, blank=True)\n"
            file_content += code_space + "createtime = models.DateTimeField(verbose_name = _('建立時間'), auto_now_add=True)\n"
            file_content += code_space + "updatetime = models.DateTimeField(verbose_name = _('更新時間'), auto_now=True)\n"
            file_content += code_space + "error = models.BooleanField(verbose_name = _('異常標記'), default=False)\n"
            file_content += code_space + "objects = FormatManager()\n"
            file_content += code_space + "class Meta:\n"
            code_space += "    "
            file_content += code_space + "default_permissions = ()\n"
            code_space = code_space.replace("    ", "", 1)
            code_space = code_space.replace("    ", "", 1)
            file_content += code_space + "\n"
            file_content += "class " + model_name + "_DataNo(models.Model):\n"
            code_space = "    "
            file_content += code_space + "createtime = models.DateTimeField(verbose_name = _('建立時間'), auto_now_add=True)\n"
            file_content += code_space + "objects = FormatManager()\n"
            file_content += code_space + "class Meta:\n"
            code_space += "    "
            file_content += code_space + "default_permissions = ()\n"
            code_space = code_space.replace("    ", "", 1)
            code_space = code_space.replace("    ", "", 1)
            file_content += "#<" + model_name + " end>\n"
            file_content += "#<new here>\n"
            return file_content

        def addModelClass(model_name, flow_name, form_item_counter, flow_uuid):
            class Meta:
                default_permissions = ()
                permissions = (
                    (model_name + "_Add", _('新增') + flow_name),
                    (model_name + "_Modify", _('修改') + flow_name),
                    (model_name + "_View", _('檢視') + flow_name),
                    (model_name + "_Delete", _('刪除') + flow_name),
                )

            class Meta2:
                default_permissions = ()

            #add model to memory
            attrs = {'__module__': 'omformmodel.models', 'Meta': Meta}
            attrs['table_name'] = flow_name
            attrs['flow_uuid'] = models.UUIDField(verbose_name=_('流程編號'),
                                                  null=True,
                                                  blank=True)
            attrs['dataid_header'] = models.CharField(verbose_name=_('資料代碼'),
                                                      max_length=3)
            attrs['data_no'] = models.IntegerField(verbose_name=_('資料編號'),
                                                   null=True,
                                                   blank=True)
            attrs['history'] = models.BooleanField(verbose_name=_('歷史資料'),
                                                   default=False)
            attrs['status'] = models.CharField(verbose_name=_('狀態'),
                                               max_length=200,
                                               null=True,
                                               blank=True)
            attrs['title'] = models.CharField(verbose_name=_('標題'),
                                              max_length=200,
                                              null=True,
                                              blank=True)
            attrs['level'] = models.CharField(verbose_name=_('燈號'),
                                              max_length=200,
                                              null=True,
                                              blank=True)
            attrs['group'] = models.CharField(verbose_name=_('受派群組'),
                                              max_length=500,
                                              null=True,
                                              blank=True)
            attrs['closed'] = models.BooleanField(verbose_name=_('關閉標記'),
                                                  default=False)
            attrs['stop_uuid'] = models.TextField(verbose_name=_('關卡'),
                                                  blank=True,
                                                  null=True)
            attrs['stop_chart_type'] = models.TextField(verbose_name=_('關卡類型'),
                                                        blank=True,
                                                        null=True)
            attrs['stop_chart_text'] = models.TextField(verbose_name=_('關卡名稱'),
                                                        blank=True,
                                                        null=True)
            attrs['running'] = models.BooleanField(verbose_name=_('執行標記'),
                                                   default=False)
            attrs['error'] = models.BooleanField(verbose_name=_('是否異常'),
                                                 default=False)
            attrs['createtime'] = models.DateTimeField(verbose_name=_('建立時間'),
                                                       auto_now_add=True)
            attrs['updatetime'] = models.DateTimeField(verbose_name=_('更新時間'),
                                                       auto_now=True)
            attrs['stoptime'] = models.DateTimeField(verbose_name=_('停止時間'),
                                                     null=True,
                                                     blank=True)
            attrs['create_user'] = models.ForeignKey('omuser.OmUser',
                                                     verbose_name=_('開單人員'),
                                                     to_field='username',
                                                     on_delete=models.SET_NULL,
                                                     blank=True,
                                                     null=True,
                                                     related_name='create_' +
                                                     flow_uuid)
            attrs['update_user'] = models.ForeignKey('omuser.OmUser',
                                                     verbose_name=_('更新人員'),
                                                     to_field='username',
                                                     on_delete=models.SET_NULL,
                                                     blank=True,
                                                     null=True,
                                                     related_name='update_' +
                                                     flow_uuid)
            attrs['data_param'] = models.TextField(verbose_name=_('流程參數'),
                                                   null=True,
                                                   blank=True)
            attrs['error_message'] = models.TextField(verbose_name=_('錯誤訊息'),
                                                      null=True,
                                                      blank=True)
            attrs['init_data'] = models.ForeignKey('self',
                                                   blank=True,
                                                   null=True,
                                                   related_name='extra_data',
                                                   verbose_name=_('初始資料'),
                                                   on_delete=models.CASCADE)
            attrs['is_child'] = models.BooleanField(verbose_name=_('子單'),
                                                    default=False)
            for i in range(form_item_counter):
                attrs['formitm_' + str(i + 1)] = models.TextField(null=True,
                                                                  blank=True)
            attrs['objects'] = FormatManager()
            type(model_name, (models.Model, ), attrs)
            #flow value history
            attrs_vh = {'__module__': 'omformmodel.models', 'Meta': Meta2}
            attrs_vh['flow_uuid'] = models.UUIDField(verbose_name=_('流程編號'),
                                                     null=True,
                                                     blank=True)
            attrs_vh['data_no'] = models.IntegerField(verbose_name=_('資料編號'),
                                                      null=True,
                                                      blank=True)
            attrs_vh['data_id'] = models.IntegerField(verbose_name=_('多重資料編號'),
                                                      blank=True,
                                                      null=True)
            attrs_vh['chart_id'] = models.CharField(verbose_name=_('功能點'),
                                                    max_length=500,
                                                    null=True,
                                                    blank=True)
            attrs_vh['stop_chart_type'] = models.TextField(
                verbose_name=_('關卡類型'), blank=True, null=True)
            attrs_vh['stop_chart_text'] = models.TextField(
                verbose_name=_('關卡名稱'), blank=True, null=True)
            attrs_vh['input_data'] = models.TextField(verbose_name=_('輸入參數'),
                                                      null=True,
                                                      blank=True)
            attrs_vh['output_data'] = models.TextField(verbose_name=_('輸出參數'),
                                                       null=True,
                                                       blank=True)
            attrs_vh['error'] = models.BooleanField(verbose_name=_('異常標記'),
                                                    default=False)
            attrs_vh['createtime'] = models.DateTimeField(
                verbose_name=_('建立時間'), auto_now_add=True)
            attrs_vh['updatetime'] = models.DateTimeField(
                verbose_name=_('更新時間'), auto_now=True)
            attrs_vh['objects'] = FormatManager()
            model_name_vh = model_name + '_ValueHistory'
            type(model_name_vh, (models.Model, ), attrs_vh)
            #flow data no
            attrs_no = {'__module__': 'omformmodel.models', 'Meta': Meta2}
            attrs_no['createtime'] = models.DateTimeField(
                verbose_name=_('建立時間'), auto_now_add=True)
            attrs_no['objects'] = FormatManager()
            model_name_no = model_name + '_DataNo'
            type(model_name_no, (models.Model, ), attrs_no)
            call_command('makemigrations', 'omformmodel')
            call_command('migrate', app_label='omformmodel')

        while self.running:
            pass
        self.running = True
        result = True
        model_name = 'Omdata_' + flow_uuid
        try:
            apps.get_registered_model('omformmodel', model_name)
            update_result = updateModel(self.file_path, model_name,
                                        form_item_counter)
            if update_result:
                addModelClass(model_name, flow_name, form_item_counter,
                              flow_uuid)
        except LookupError:
            file_content = getDefaultModel(model_name, flow_name,
                                           form_item_counter, flow_uuid)
            createModel(self.file_path, file_content)
            addModelClass(model_name, flow_name, form_item_counter, flow_uuid)
        except Exception as e:
            debug('deploy model error: %s' % e.__str__())
            result = False
        finally:
            self.running = False
            return result
Beispiel #10
0
def mapping_group_user(ldap_client_server,ldap_client_server_port,ldap_base_dn,ldap_bind_user,ldap_bind_user_password):
    '''
    use ldap3 mapping group and user
    input: connect LDAP objectClass=user
    return: mapping time
    author: Jia Liu
    ''' 
    start = time.time()
    server = Server(host=ldap_client_server,port=int(ldap_client_server_port), get_info=ALL,connect_timeout=2)
    conn = Connection(server, ldap_bind_user, ldap_bind_user_password, auto_bind=True,receive_timeout=2)
    conn.search(ldap_base_dn, '(&(objectCategory=person)(objectClass=user))', attributes=['distinguishedName','sAMAccountName','cn','userPrincipalName','userAccountControl'])
    result = conn.entries
    dict_OU_Group = {}
    dict_Omuser_Group = {}
    #Get AD List ,exclude group CN=Users and None.
    AD_List = list(filter(lambda x: not "CN=Users"  in str(x['distinguishedName']).split(','), result))
    #Get OmGroupList from LDAP created.
    OmGroupstr_List = list(OmGroup.objects.filter(ad_flag=True).values_list('name',flat=True))
    #Exclude same username in ad_flag = False in user list.
    OmUserNonADList = list(OmUser.objects.filter(ad_flag=False).values_list('username',flat=True))
    AD_Exclude_Duplicate_User_List = list(filter(lambda x: not x['sAMAccountName'][0] in OmUserNonADList, AD_List))
    #Count LDAP groups_id from Omuser_group.
    Omuser_Groups_count  = OmUser.objects.filter(ad_flag=True).values('id').aggregate(count = Count('groups'))
    OmGroup_List = []
    #string type list to list type.
    for GroupList in OmGroupstr_List:
        OmGroup_List.append(ast.literal_eval(GroupList))

    for groupnameList in OmGroup_List:
        #dictionaries value set list type.
        dict_OU_Group[str(groupnameList)] = []
        dict_Omuser_Group[str(groupnameList)] = []
        #Get LDAP group id and append to dictionaries from Omuser_Groups.
        OmuserGroups_id_List = list(OmUser.objects.filter(ad_flag=True,groups__name=groupnameList).values_list('id',flat = True))
        dict_Omuser_Group[str(groupnameList)].extend(OmuserGroups_id_List)
        dict_Omuser_Group[str(groupnameList)].sort()
        #Get group name from sublist in AD_List.
        AD_Group_User_List = list(filter(lambda x: ','.join(groupnameList)  in x['distinguishedName'][0], AD_Exclude_Duplicate_User_List))
        #Get LDAP group id and append to dictionaries from AD_Group_User_List.
        for AD_user in AD_Group_User_List:
            user = AD_user['sAMAccountName'][0]
            omuserid = OmUser.objects.get(username=user).id
            dict_OU_Group[str(groupnameList)].append(omuserid)
        dict_OU_Group[str(groupnameList)].sort()

    #Compare two dictionaries,get add_group_dict and delete_group_dict.
    addGroupDict    = dict( (key, list(set(dict_OU_Group[key])- set(dict_Omuser_Group[key])))
                        for key in (set(dict_OU_Group) & set(dict_Omuser_Group))
                            if dict_OU_Group[key] != dict_Omuser_Group[key])
  
    deleteGroupDict = dict( (key, list(set(dict_Omuser_Group[key]) -set(dict_OU_Group[key])))
                        for key in (set(dict_Omuser_Group) & set(dict_OU_Group))
                            if dict_Omuser_Group[key] != dict_OU_Group[key])
    if Omuser_Groups_count['count'] == 0:   
        for groupname_OU_List in OmGroup_List:
            omgroup = OmGroup.objects.get(name=groupname_OU_List)
            omgroup.user_set.add(*dict_OU_Group[str(groupname_OU_List)])
    if addGroupDict != {}:
        for key,value in addGroupDict.items():
            omgroup = OmGroup.objects.get(name=str(key))
            omgroup.user_set.add(*value)
    if deleteGroupDict != {}:
        for key,value in deleteGroupDict.items():
            omgroup = OmGroup.objects.get(name=str(key))
            omgroup.user_set.remove(*value)
    debug("dict_OU_Group: %s" % dict_OU_Group)
    debug("addGroupDict: %s" % addGroupDict)
    debug("deleteGroupDict: %s" % deleteGroupDict)
    conn.unbind()
    end = time.time()
    execute_time = end-start
    return info("mapping_group_user is successful,execute time: %.4f second." % (execute_time))
Beispiel #11
0
def create_LDAP_user(ldap_client_server,ldap_client_server_port,ldap_base_dn,ldap_bind_user,ldap_bind_user_password):
    '''
    use ldap3 create user
    input: connect LDAP objectClass=user
    return: create user time
    author: Jia Liu
    ''' 
    start = time.time()
    server = Server(host=ldap_client_server,port=int(ldap_client_server_port),get_info=ALL,connect_timeout=2)
    conn = Connection(server, ldap_bind_user, ldap_bind_user_password, auto_bind=True,receive_timeout=2)
    conn.search(ldap_base_dn, '(&(objectCategory=person)(objectClass=user))', attributes=['distinguishedName','sAMAccountName','cn','userPrincipalName','userAccountControl','objectSID'])
    result = conn.entries
    AD_List = list(filter(lambda x: not "CN=Users"  in str(x['distinguishedName']).split(','), result))
    DN_User_List = []
    AD_User_List= []
    AD_User_SID = []
    Disable_User_List = []
    Enable_User_List = []
    diffAddUserList = []
    diffDeleteUserList = []
    ADduplicateUserList = []
    ad_flag = True
    #Get user DN, user account, user user Account to lists.
    for ldap in AD_List:
        ldapJson = json.loads(ldap.entry_to_json())
        getUserList = ldapJson
        getUsername = ldapJson['attributes']['sAMAccountName']
        disableUser = ldapJson['attributes']['userAccountControl']
        getUserSID = ldapJson['attributes']['objectSid']
        AD_User_List.extend(getUsername)
        DN_User_List.append(getUserList)
        AD_User_SID.extend(getUserSID)
        if disableUser[0] == 514:
            Disable_User_List.extend(getUsername)
        else:
            Enable_User_List.extend(getUsername)
  
    #Get OmUserList from LDAP created.
    OmUserList = list(OmUser.objects.filter(ad_flag=ad_flag).values_list('ad_sid',flat=True))
    OmUserNonADList = list(OmUser.objects.filter(ad_flag=False).values_list('username',flat=True))
    duplicateUserList = list(set(AD_User_List) & set(OmUserNonADList))
    AD_Exclude_Duplicate_User_List = list(filter(lambda x: not x['attributes']['sAMAccountName'][0] in duplicateUserList, DN_User_List))
    AD_Duplicate_User_List = list(filter(lambda x: x['attributes']['sAMAccountName'][0] in duplicateUserList, DN_User_List))
    
    for ADduplicateUserdict in AD_Duplicate_User_List:
        User_sid =  ADduplicateUserdict['attributes']['objectSid']
        ADduplicateUserList.extend(User_sid)
    if len(OmUserList) == 0:
        OmUser.objects.bulk_create([
            OmUser(
                username = userList['attributes']['sAMAccountName'][0],
                nick_name = userList['attributes']['cn'][0],
                email = userList['attributes']['userPrincipalName'][0],
                ad_sid = userList['attributes']['objectSid'][0],
                ad_flag = ad_flag,
                is_active = False,
                ) for userList in AD_Exclude_Duplicate_User_List])
        diffAddUserList = ["all users are created."]
    elif OmUserList == AD_User_SID:
        pass
    elif OmUserList != AD_User_SID:
        diffAddUserList = list(set(AD_User_SID).difference(set(OmUserList)))
        diffDeleteUserList = list(set(OmUserList).difference(set(AD_User_SID)))
        excludeDuplicateAddUserList = list(set(diffAddUserList).difference(set(ADduplicateUserList)))
        excludeDuplicateDeleteUserList = list(set(diffDeleteUserList).difference(set(ADduplicateUserList)))
        if len(diffAddUserList) > 0 :
            try:
                #From AD_User_List get user account name,if user account name is equal to diffAddUserList,create AddUser from AddUserList.
                OmUser.objects.bulk_create([
                    OmUser(
                        username = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['sAMAccountName'][0],
                        nick_name = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['cn'][0],
                        email = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['userPrincipalName'][0],
                        ad_sid = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['objectSid'][0],
                        ad_flag = ad_flag,
                    ) for add_user in excludeDuplicateAddUserList])
            except Exception as e:
                for add_user in excludeDuplicateAddUserList:
                    username_ad = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['sAMAccountName'][0]
                    try:
                        user_get = OmUser.objects.get(username = username_ad)
                        user_get.username = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['sAMAccountName'][0]
                        user_get.nick_name = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['cn'][0]
                        user_get.email = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['userPrincipalName'][0]
                        user_get.ad_sid = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['objectSid'][0]
                        user_get.is_active = False
                        user_get.delete = False
                        user_get.ad_flag = ad_flag
                        user_get.save()
                    except:
                        add_username = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['sAMAccountName'][0]
                        add_nick_name = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['cn'][0]
                        add_email = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['userPrincipalName'][0]
                        add_ad_sid = list(filter(lambda user: user['attributes']['objectSid'][0] == add_user, DN_User_List))[0]['attributes']['objectSid'][0]
                        add_ad_flag = ad_flag
                        add_ad_is_active = False
                        OmUser.objects.create(username=add_username,nick_name=add_nick_name,email=add_email,ad_sid=add_ad_sid,ad_flag=add_ad_flag,is_active=add_ad_is_active)  
            debug("excludeDuplicateAddUserList: %s" % excludeDuplicateAddUserList)
        if len(diffDeleteUserList) > 0:
            OmUser.objects.filter(ad_sid__in=excludeDuplicateDeleteUserList).update(is_active=False,delete=True)
            debug("excludeDuplicateDeleteUserList: %s" % excludeDuplicateDeleteUserList)
    #execute enable user action.
    license_user_num = getUsers()
    now_users_num = OmUser.objects.filter(delete=False,is_active=True).exclude(username='******').count()
    now_users_list = list(OmUser.objects.filter(delete=False,is_active=True).exclude(username='******').values_list('username',flat=True))
    excludeDuplicateEnableUserList = list(set(Enable_User_List).difference(set(OmUserNonADList)))
    excludeDuplicateEnableUserList.sort()
#     if now_users_num < license_user_num:
    for pop_user in now_users_list:
        try:
            pop_index = excludeDuplicateEnableUserList.index(pop_user)
            excludeDuplicateEnableUserList.pop(pop_index)
        except Exception as e:
            pass
    enableusercount = license_user_num - now_users_num
    OmUser.objects.filter(username__in=excludeDuplicateEnableUserList[0:enableusercount]).update(is_active=True)
    OmUser.objects.filter(username__in=excludeDuplicateEnableUserList[enableusercount:]).update(is_active=False)
    #execute disable user action.
    excludeDuplicateDisableUserList = list(set(Disable_User_List).difference(set(OmUserNonADList)))
    OmUser.objects.filter(username__in=excludeDuplicateDisableUserList).update(is_active=False,delete=False)
   
    debug("excludeDuplicateDisableUserList: %s" % excludeDuplicateDisableUserList)
    debug("excludeDuplicateEnableUserList: %s" % excludeDuplicateEnableUserList)
    conn.unbind()
    end = time.time()
    execute_time = end-start
    return info("User create successful,execute time: %.4f second." % (execute_time))
Beispiel #12
0
def create_LDAP_group(ldap_client_server,ldap_client_server_port,ldap_base_dn,ldap_bind_user,ldap_bind_user_password):
    '''
    use ldap3 create group
    input: connect LDAP organization unit
    return: create group time
    author: Jia Liu
    ''' 
    start = time.time()
    # search LDAP organization unit return all result
    server = Server(host=ldap_client_server,port=int(ldap_client_server_port), get_info=ALL,connect_timeout=2)
    conn = Connection(server, ldap_bind_user, ldap_bind_user_password, auto_bind=True,receive_timeout=2)
    conn.search(ldap_base_dn, '(objectCategory=organizationalUnit)', attributes=['OU','distinguishedName'])
    result = conn.entries
    #Set default need parameter
    AD_OU_List = []
    diffAddTupleList = []
    diffdeleteTupleList = []
    functional_flag = False
    ad_flag = True
    OmGroupstr_List = list(OmGroup.objects.filter(ad_flag=ad_flag).values_list('name',flat=True))
    OmGroup_List = []
    #string type list to list type.
    for GroupList in OmGroupstr_List:
        OmGroup_List.append(ast.literal_eval(GroupList))
    #Get list[0] value,and value combine to OU list,append to AD_OU_List.
    for ldap in result:
        ldapJson = json.loads(ldap.entry_to_json())
        getOU = ldapJson['attributes']['distinguishedName'][0].split(',')
        AD_OU_List.append(getOU)
        #OmGroupList length is 0,create all group from LDAP AD_OU_List.
    if len(OmGroup_List) == 0:
        for oulist in AD_OU_List:
            group_name = str(oulist[0]).replace("OU=",'')
            #check OU count in list.
            oucount = sum('OU=' in count for count in oulist)
            #count = 1 is head group.
            if oucount == 1:
                OmGroup.objects.create(name=oulist,parent_group=None,functional_flag=functional_flag,display_name=group_name,ad_flag=ad_flag)
            #count > 1 is child group.
            elif oucount > 1:
                if oulist != AD_OU_List[0]:
                    parent_groupname = []
                    parent_groupname.extend(oulist)
                    parent_groupname.pop(0)
                    parent_group_name= parent_groupname
                    parent_group = OmGroup.objects.get(name=parent_group_name)
                    OmGroup.objects.create(name=oulist,parent_group=parent_group,functional_flag=functional_flag,display_name=group_name,ad_flag=ad_flag)
                else:
                    OmGroup.objects.create(name=oulist,parent_group=None,functional_flag=functional_flag,display_name=group_name,ad_flag=ad_flag)
                       
        diffAddTupleList = ["all organization units are created."]
    elif OmGroup_List == AD_OU_List:
        pass
    #Compare two lists,if true, execute add or delete group.
    elif OmGroup_List != AD_OU_List:
        set_AD_OU_List = set(map(tuple, AD_OU_List))
        set_OmGroup_List = set(map(tuple, OmGroup_List))
        intersectionTupleList = list(set(set_OmGroup_List).intersection(set(set_AD_OU_List)))
        diffAddTupleList = list(set_AD_OU_List.difference(set_OmGroup_List))
        diffdeleteTupleList = list(set_OmGroup_List.difference(set_AD_OU_List))
        diffAddTupleList.sort(key=len)
        diffdeleteTupleList.sort(key=len,reverse=True)
        intersectionTupleList.sort(key=len)
        if diffdeleteTupleList != []:
            for deletegroupTuple in diffdeleteTupleList:
                deletegroupList = list(deletegroupTuple)
                group = OmGroup.objects.get(name=deletegroupList)
                group.delete()
        if diffAddTupleList != []:
            for addgroupTuple in diffAddTupleList:
                addgroupList = list(addgroupTuple)
                group_name = str(addgroupList[0]).replace("OU=",'')
                oucount = sum('OU=' in count for count in addgroupList)
                if OmGroup.objects.filter(name=addgroupList).exists():
                    pass
                elif oucount == 1:
                    OmGroup.objects.create(name=addgroupList,parent_group=None,functional_flag=functional_flag,display_name=group_name,ad_flag=ad_flag)
                elif oucount > 1:
                    if addgroupTuple != diffAddTupleList[0]:
                        parent_groupname = []
                        parent_groupname.extend(addgroupList)
                        parent_groupname.pop(0)
                        parent_group_name= parent_groupname
                        parent_group = OmGroup.objects.get(name=parent_group_name)
                        OmGroup.objects.create(name=addgroupList,parent_group=parent_group,functional_flag=functional_flag,display_name=group_name,ad_flag=ad_flag)
                    else:
                        OmGroup.objects.create(name=addgroupList,parent_group=None,functional_flag=functional_flag,display_name=group_name,ad_flag=ad_flag)
        if intersectionTupleList != []:
            for intersectionGroupTuple in intersectionTupleList:
                intersectionGroupList = list(intersectionGroupTuple)
                oucount = sum('OU=' in count for count in intersectionGroupList)
                if oucount == 1:
                    pass
                elif oucount > 1:
                    if OmGroup.objects.filter(name=intersectionGroupList).exists():
                        group_name = OmGroup.objects.get(name=intersectionGroupList)
                        parent_groupname = []
                        parent_groupname.extend(intersectionGroupList)
                        parent_groupname.pop(0)
                        parent_group_name= parent_groupname
                        if OmGroup.objects.filter(name=parent_group_name).exists():
                            parent_group = OmGroup.objects.get(name=parent_group_name)
                            group_name.parent_group = parent_group
                            group_name.save()
                    else:
                        group_name = str(intersectionGroupList[0]).replace("OU=",'')
                        if intersectionGroupTuple != intersectionTupleList[0]:
                            parent_groupname = []
                            parent_groupname.extend(intersectionGroupList)
                            parent_groupname.pop(0)
                            parent_group_name= parent_groupname
                            parent_group = OmGroup.objects.get(name=parent_group_name)
                            OmGroup.objects.create(name=intersectionGroupList,parent_group=parent_group,functional_flag=functional_flag,display_name=group_name,ad_flag=ad_flag)
                        else:
                            OmGroup.objects.create(name=intersectionGroupList,parent_group=None,functional_flag=functional_flag,display_name=group_name,ad_flag=ad_flag)
    debug("diffAddTupleList: %s" % diffAddTupleList)
    debug("diffdeleteTupleList: %s" % diffdeleteTupleList)
    conn.unbind()
    end = time.time()
    execute_time = end-start
    return info("Group create successful,execute time: %.4f second." % (execute_time))