django消息实时推送,django消息通知
总体思路:
1、自定义框架命令行功能(参考:https://blog . csdn . net/Xu Jin 0/article/details/88056620)
2、通过djaongo命令行,启动监听格里特事件流服务,根据相应类型提取字段,入库
1、自定义框架命令行从姜戈.核心.管理导入基础命令,命令错误
从订阅. gerrit.Factory导入CreatePatchSetFactory、ChangeAbandoneFactory、ChangeMergeFactory、ChangeRestoreFactory、TopicChangeFactory
类命令(BaseCommand):
帮助=订阅格里特流-事件:
定义add_arguments(自身,解析器):
parser.add_argument(name ,help=要监听哪个事件流\ n所有:全部\ n批集-已创建:创建补丁集时\ n更改-合并:合入补丁集时\ n更改-已放弃:废弃补丁集时\ n更改-已还原:恢复补丁集时\ n主题-已更改:主题更改时)
# parser.add_argument(-s ,- subscribe ,help=可选参数,-s是简写,-订阅是全拼)
定义句柄(self,*args,**options):
# 1 .获取参数
g_event=options[name]
support _ events=[修补程序集-已创建,更改-合并,更改-放弃,更改-恢复,主题-更改]
# 2 .检查参数是否受支持
如果g _事件不在支持事件中:
引发命令错误(参数错误,支持为:% s“%支持事件”
if g_event==all :
CP factory=CreatePatchSetFactory()
cpfactory.get_stream_event()
cabfactory=ChangeAbandoneFactory()
cabfactory.get_stream_event()
cmfactory=ChangeMergeFactory()
cmfactory.get_stream_event()
crfactory=ChangeRestoreFactory()
crfactory.get_stream_event()
tpfactory=TopicChangeFactory()
tpfactory.get_stream_event()
elif g_event==patchset-created :
CP factory=CreatePatchSetFactory()
cpfactory.get_stream_event()
elif g_event==change-merged :
cmfactory=ChangeMergeFactory()
cmfactory.get_stream_event()
elif g_event==更改-放弃:
cabfactory=ChangeAbandoneFactory()
cabfactory.get_stream_event()
elif g_event==change-restored :
crfactory=ChangeRestoreFactory()
crfactory.get_stream_event()
否则:
tpfactory=TopicChangeFactory()
tpfactory.get_stream_event()2、处理各个类型事件流数据逻辑从cmback.settings导入格里特主机名、GERRIT URL、GERRIT端口、G用户名、G密码
从格里特导入GerritClient
从cmapp.models导入饭桶
从cmapp.serializers导入GitSerializer
从字母表导入抽象方法
从django.db导入关闭旧连接
导入系统
导入简单讲解及作业需求
导入操作系统
导入日志记录
导入数据
导入日期时间
进口是
类GerritFactory(对象):
订阅格里特流事件,保存到本地数据库实时显示
https://Gerrit-文档存储谷歌APIcom/Documentation/34 .1/cmd-流-事件超文本标记语言
https://Gerrit-文档存储谷歌APIcom/Documentation/34 .1/JSON超文本标记语言
使用:
"变更-放弃"
更改-合并
更改-恢复
主题-已更改
补丁程序集-已创建
未使用:
受分配人-已更改
标签-已更改
参考-更新
审阅者-已添加
审阅者-已删除
注释-已添加
项目-已创建
更改-删除
__元类__=ABCMeta
def __init__(self):
self.hostname=GERRIT_HOSTNAME
self.gerriturl=GERRIT_URL
self.port=GERRIT_PORT
self.username=G _用户名
self.passwd=G_PASSWORD
self.client=paramiko .SSHClient()
自我客户set _ missing _ host _ key _ policy(paramiko .AutoAddPolicy())
自我logger=日志记录获取记录器(“订阅”)
@抽象方法
def获取流事件(自身):
及格
def connectGerrit(self):
尝试:
files=os.listdir( ./subscribe/gerrit/)
对于文件中的文件:
if file.endswith(rsa ):
自我客户连接(主机名=自身主机名,端口=自我.端口,用户名=自我.用户名,pkey=paramiko .RSAKey(文件名=/subscribe/Gerrit/% s“% file”)
自我渠道=自己客户get _ transport().open_session(timeout=5)
self.logger.info(连接到Gerrit ok’)
破裂
例外情况为e:
self.logger.error(连接格里特失败,% s“% e”)
系统退出(1)
定义获取问题(自身,数据):
tmplist=re.findall(Issue:(.*)?,数据)
如果len(tmplist)==1且len(tmplist[0]) 16:
返回tmplist[0].拆分("")
否则:
返回tmplist
def getChangeLines(self,changeid):
g client=GerritClient(base _ URL=selfgerriturl,用户名=self.username,密码=self.passwd,ssl_verify=False)
RES=g客户端变化获取(changeid).get _ revision( current )文件投票()
change_line=0
对于以表示留数表示的值:
如果值get( path )==/COMMIT _ MSG :
继续
插入=值get( lines _ inserted )if值get( lines _ inserted )not other 0
如果value.get(lines_deleted )不是没有其他0,则删除=值get( lines _ deleted )
change_line=max(插入,删除)
返回更改_行
类CreatePatchSetFactory(GerritFactory):
def获取流事件(自身):
# 1 .联系
self.connectGerrit()
# 2 .倾听
尝试:
自我渠道exec _ command( Gerrit流-事件-补丁程序集-已创建)
虽然正确:
如果自我渠道退出状态就绪():
破裂
流数据=自身渠道收入(1024000)
data=json.loads(streamdata)
自我伐木工信息(修补程序集-已创建:\ n % s %数据
changeid=data[change][id]
numberid=data[ change ][ number ]
new _ revision=data[修补程序集][修订版]
repo=data[变更][项目]
branch=data[ change ][ branch ]
parent= if len(data[修补程序集][父项])==0 else data[修补程序集][父项][0]
主题=数据[更改][主题]
topic=data[change].获取(主题,无)
状态=数据[更改][状态]
commit _ message=data[更改][提交消息]
问题列表=自身getissues(commit _ message)
issue _ list=JSON转储(问题列表)
作者=数据[更改][所有者][用户名]
提交日期=日期时间日期时间从时间戳(数据[更改][创建不]).strftime(%Y-%m-%d %H:%M:%S )
更新日期=日期时间日期时间从时间戳(数据[ eventCreatedOn ])开始.strftime(%Y-%m-%d %H:%M:%S )
change _ line=selfgetchangelines(changeid)
# 1 .检查号码编号是否存在?
close_old_connections()
numstatus=git对象filter(numberid=numberid).存在()
如果数字状态:
#更新
up obj=git对象get(numberid=numberid)
向上的物体新版本=新版本
upobj.subject=主题
upobj.update_date=更新日期
向上的物体提交消息=提交消息
upobj.status=状态
upobj.issue_list=issue_list
upobj.change_line=change_line
upobj.save()
自我伐木工信息(修补程序集-已创建-数据库:% s % s更新成功 %(numberid,changeid))
否则:
#创建
new_data={
changeid: changeid,
numberid: numberid,
新版本:新版本,
回购:回购,
分支:分支,
父:父,
主题:主题,
主题:主题,
旧主题: xxxxx
x ,
状态:状态,
提交人:
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。