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
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}
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()
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
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
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
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
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
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
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))
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))
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))