背景:
以前需求方產生需求,需要找相關人員溝通,溝通後需要郵箱通知,還會詢問郵件格式怎麼寫,
(有些需求可能會使用gitlab存放,讓相關人員按格式抄送,反正大家都煩悶,效率奇低).
需求:
0.日常運維工作表單流程化歸類,具備審覈執行回滾分派功能,便於前期協調處理和後期統計分析.
1.流程和任務結構實現,能夠增刪改查等操作.
2.分用戶顯示,實現待處理、已處理、我發起等列表
3.工單狀態化,支持"提交->審覈->執行->結束",加入回滾工單的效果,相關分派和郵件觸發報警(重點).
4.流程工單內容需求不同,導致表單字段動態生成,根據狀態禁止某些字段只讀.
益處:
開發需要創建機器資源,通過表單填寫即可,運維執行通過,直接對接到ucloud api接口直接創建.(提高自動化水平)
工單需求信息知會,需求是否已經產生,當前狀態步驟.
量化運維工作內容,通過統計分析歸類,提高工作效率非常有幫助(最近處理事務,如何更好提高效率).
後期開發方向:
一鍵接單, 未處理工單爲Open, 通過設置一鍵接單, 可以顯示用戶正在處理, 處理需要時間較長工單.
監控告警以工單形式發出,讓運維人員以工單工作流方式處理.
進行日常工作分析歸類,需要完成大量工單測試數據.
大衆點評公司樣例, 歸類大多數日常工作.
###########################################################################################
###########################################################################################
##-----------------------------------------------------------------------------------------
#workflow模塊關係圖(models相關模塊說明)
##-----------------------------------------------------------------------------------------
##-----------------------------------------------------------------------------------------
#工單創建過程和狀態化說明
##-----------------------------------------------------------------------------------------
通過頁面直接創建某個工單任務.
獲取相關流程描述,不同流程步驟不一致.
工單任務創建, 注意此部分由固定字段和動態字段組成. 注意下面的'提交'和'保存'操作, 通向不同Step.
分用戶顯示, 待處理工單key爲undone, 再傳遞userid和訂單狀態,獲取需要操作的工單.
if key == "undone/":
qset = (Q(order_people=u1)&Q(step__in=Step.objects.exclude(tag="end")))
實現部分字段只讀狀態, 只允許修改部分字段.
前面處理步驟爲'VM虛擬機創建_vmcreate-approval', 此處爲'VM虛擬機創建_vmcreate-exec', 工單狀態化.
流程步驟說明
流程流轉步驟說明:
##-----------------------------------------------------------------------------------------
#動態定義表單說明:
##-----------------------------------------------------------------------------------------
存放相關流程動態定義字段和默認設置.
用戶創建任務時,通過使用以下代碼進行組裝處理.
#通過傳入流程ID進行內容組裝(process固定字段+parameter變動字段) def getParameterForm(id): pobj = Process.SearchOne(int(id)) form = CreateOrderForm(initial={"process":id,"step":pobj.begin}) if pobj: palameterlist = pobj.parameter_process.select_related().order_by("sorting") if len(palameterlist) == 0: print "不需要進行封裝處理" for item in palameterlist: form.fields['parameter-'+str(item.id)] = forms.ChoiceField(label=item.title,widget=forms.Select(),choices=(eval(item.optional_item)),initial=item.initial_value,required=True,) return form
#In a Django form, how do I make a field readonly (or disabled) so that it cannot be edited? #links https://stackoverflow.com/questions/324477/in-a-django-form-how-do-i-make-a-field-readonly-or-disabled-so-that-it-cannot #使用以下共用表單模塊. class ReadOnlyFieldsMixin(object): readonly_fields =() #print "這是最終要處理的字段", readonly_fields def __init__(self, *args, **kwargs): super(ReadOnlyFieldsMixin, self).__init__(*args, **kwargs) for field in (field for name, field in self.fields.iteritems() if name in self.readonly_fields): field.widget.attrs['disabled'] = 'true' field.required = False def clean(self): cleaned_data = super(ReadOnlyFieldsMixin,self).clean() for field in self.readonly_fields: cleaned_data[field] = getattr(self.instance, field) return cleaned_data #Usage, just define which ones must be read only: #調用處理方法. #class MyFormWithReadOnlyFields(ReadOnlyFieldsMixin, CreateOrderForm): # readonly_fields = ("name","desc","process","step","expire_time")
技術鏈接:
loonapp先生的<利用django實現工作流>
數據來源於http://www.loonapp.com/blog/27/和https://github.com/bbaobelief/workflow
當然是直接抄他的構思, 以此爲基礎進行二次開發.
糯米糊糊先生的<Django:我是怎麼做到使用django動態定義表單(form)>
數據來源於http://blog.csdn.net/huyoo/article/details/6627967(),
此動態表單技術暫時用於workflow項目.