专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

从0到1开发自动化运维平台用户模块管理

  公共模型
  新建文件commonextendsmodels。py,将cmdbmodels。py里定义的TimeAbstract、CommonParent移到这里fromdjango。dbimportmodelsclassTimeAbstract(models。Model):updatetimemodels。DateTimeField(autonowTrue,nullTrue,blankTrue,verbosename更新时间)createdtimemodels。DateTimeField(autonowaddTrue,nullTrue,blankTrue,verbosename创建时间)classExtMeta:relatedFalsedashboardFalseclassMeta:abstractTrueordering〔id〕classCommonParent(models。Model):parentmodels。ForeignKey(self,nullTrue,blankTrue,ondeletemodels。SETNULL,relatednamechildren)classMeta:abstractTrue创建用户模块
  新建用户中心模块(venv)ydevopsbackenddjangoadminstartappucenter(venv)ydevopsbackendmvucenterapps
  编写用户组织架构及rbac模型fromdjango。dbimportmodelsfromdjango。contrib。auth。modelsimportAbstractUserfromcommon。extends。modelsimportTimeAbstract,CommonParentCreateyourmodelshere。deforgextradata():return{leaderuserid:,存储部门领导IDdn:,存储ldapdn}defuserextradata():return{dinguserid:,钉钉用户IDfeishuuserid:,飞书UserIDfeishuunionid:,飞书UnionIDfeishuopenid:,飞书OpenIDleaderuserid:,直属领导IDdn:,ldapdn}classMenu(TimeAbstract,CommonParent):菜单模型namemodels。CharField(maxlength30,uniqueTrue,verbosename菜单名)titlemodels。CharField(maxlength30,nullTrue,blankTrue,verbosename菜单显示名)iconmodels。CharField(maxlength50,nullTrue,blankTrue,verbosename图标)pathmodels。CharField(maxlength158,nullTrue,blankTrue,verbosename路由地址)redirectmodels。CharField(maxlength200,nullTrue,blankTrue,verbosename跳转地址)isframemodels。BooleanField(defaultFalse,verbosename外部菜单)hiddenmodels。BooleanField(defaultFalse,verbosename是否隐藏)spreadmodels。BooleanField(defaultFalse,verbosename是否默认展开)sortmodels。IntegerField(default0,verbosename排序标记)componentmodels。CharField(maxlength200,defaultLayout,verbosename组件)affixmodels。BooleanField(defaultFalse,verbosename固定标签)singlemodels。BooleanField(defaultFalse,verbosename标签单开)activeMenumodels。CharField(maxlength128,blankTrue,nullTrue,verbosename激活菜单)defstr(self):returnself。nameclassMeta:defaultpermissions()verbosename菜单verbosenamepluralverbosename管理ordering〔sort,name〕classPermission(TimeAbstract,CommonParent):权限模型namemodels。CharField(maxlength30,uniqueTrue,verbosename权限名)methodmodels。CharField(maxlength50,nullTrue,blankTrue,verbosename方法)defstr(self):returnself。nameclassMeta:defaultpermissions()verbosename权限verbosenamepluralverbosename管理classRole(TimeAbstract):角色模型namemodels。CharField(maxlength32,uniqueTrue,verbosename角色)permissionsmodels。ManyToManyField(Permission,blankTrue,relatednamerolepermission,verbosename权限)menusmodels。ManyToManyField(Menu,blankTrue,verbosename菜单)descmodels。CharField(maxlength50,blankTrue,nullTrue,verbosename描述)defstr(self):returnself。nameclassMeta:defaultpermissions()verbosename角色verbosenamepluralverbosename管理classOrganization(TimeAbstract,CommonParent):组织架构organizationtypechoices((company,公司),(department,部门))deptidmodels。CharField(maxlength32,uniqueTrue,verbosename部门ID)namemodels。CharField(maxlength60,verbosename名称)typemodels。CharField(maxlength20,choicesorganizationtypechoices,defaultdepartment,verbosename类型)extradatamodels。JSONField(defaultorgextradata,verbosename其它数据,helptextf数据格式:{orgextradata()})propertydeffull(self):l〔〕self。getparents(l)returnldefgetparents(self,parentresult:list):ifnotparentresult:parentresult。append(self)parentobjself。parentifparentobj:parentresult。append(parentobj)parentobj。getparents(parentresult)defstr(self):returnself。nameclassExtMeta:relatedTruedashboardFalseclassMeta:defaultpermissions()verbosename组织架构verbosenamepluralverbosename管理classUserProfile(TimeAbstract,AbstractUser):用户信息mobilemodels。CharField(maxlength11,nullTrue,blankTrue,verbosename手机号码)avatarmodels。ImageField(uploadtostaticYm,defaultimagedefault。png,maxlength250,nullTrue,blankTrue)departmentmodels。ManyToManyField(Organization,relatednameorguser,verbosename部门)职能:根据职能授权positionmodels。CharField(maxlength50,nullTrue,blankTrue,verbosename职能)职位:仅展示用户title信息titlemodels。CharField(maxlength50,nullTrue,blankTrue,verbosename职位)rolesmodels。ManyToManyField(Role,verbosename角色,relatednameuserrole,blankTrue)extradatamodels。JSONField(defaultuserextradata,verbosename其它数据,helptextf数据格式:{userextradata()})isldapmodels。BooleanField(defaultFalse,verbosename是否ldap用户)propertydefname(self):ifself。firstname:returnself。firstnamereturnself。usernamedefstr(self):returnself。nameclassExtMeta:relatedTruedashboardFalseiconpeoplesclassMeta:defaultpermissions()verbosename用户信息verbosenamepluralverbosename管理ordering〔id〕
  安装依赖pipinstallpillow
  添加模块到settings。py及配置自定义的用户认证模型INSTALLEDAPPS〔。。。ucenter。apps。UcenterConfig,〕。。。AUTHUSERMODELucenter。UserProfileCMDB模型更新
  调整cmdb模块里的模型注释原有用户模型,替换为自定义的模型fromdjango。contrib。auth。modelsimportUserfromucenter。modelsimportUserProfileasUserfrom。modelassetsimportIdc,Region从common里导入TimeAbstract,CommonParentfromcommon。extends。modelsimportTimeAbstract,CommonParent迁移数据(venv)ydevopsbackendpythonmanage。pymakemigrationsMigrationsforucenter:appsucentermigrations0001initial。pyCreatemodelMenuCreatemodelPermissionCreatemodelRoleCreatemodelOrganizationCreatemodelUserProfile
  此时创建表时会有异常(venv)ydevopsbackendpythonmanage。pymigrate。。。django。db。migrations。exceptions。InconsistentMigrationHistory:Migrationadmin。0001initialisappliedbeforeitsdependencyucenter。0001initialondatabasedefault。
  我们现在开发阶段,最省事的就是直接把database删除,重新生成rmdb。sqlite3pythonmanage。pymakemigrationspythonmanage。pymigrate
  当然,如果想尝试解决,我们按如下步骤注释settings。pyINSTAALLLEDAPPS里的django。contrib。admin;注释urls。pyurlpatterns里的path(admin,admin。site。urls)。admin是django自带的管理后台,我们可以不用这个,直接删除也行。。。。。。删除cmdb里的迁移文件appscmdbmigrations0。py创建ucenterpythonmanage。pymigrateucenter重新生成迁移文件pythonmanage。pymakemigrations查看迁移,确保所有文件已执行完成pythonmanage。pyshowmigrations
  由于我们使用了自定义的用户模型,需要重新创建用户(venv)ydevopsbackendpythonmanage。pycreatesuperuser编写序列化器classUserProfileListSerializers(serializers。ModelSerializer):userdepartmentserializers。SerializerMethodField()userdirectorserializers。SerializerMethodField()defgetuserdepartment(self,instance):return〔{orgid:i。id,orgname:i。name}foriininstance。department。all()〕defgetuserdirector(self,instance):leaderou〔i。extradata〔leaderuserid〕foriininstance。department。all()ifi。extradata。get(leaderuserid,None)〕leadersUserProfile。objects。filter(extradatafeishuopenidinleaderou)return〔〔{id:i。id,name:i。name}foriinleaders〕〕classMeta:modelUserProfileexclude(password,dn)classUserProfileDetailSerializers(UserProfileListSerializers):userrolesserializers。SerializerMethodField()routersserializers。SerializerMethodField()permissionsserializers。SerializerMethodField()defgetuserroles(self,instance):try:qsinstance。roles。all()return〔{id:i。id,name:i。name,desc:i。desc}foriinqs〕exceptBaseExceptionase:return〔〕defgetpermissions(self,instance):permsinstance。roles。values(permissionsmethod,)。distinct()ifinstance。issuperuser:return〔admin〕return〔p〔permissionsmethod〕forpinpermsifp〔permissionsmethod〕〕defgetrouters(self,instance):qs〔〕ifinstance。issuperuseroradminin〔p〔permissionsmethod〕forpininstance。roles。values(permissionsmethod)〕:qsMenu。objects。filter(parentisnullTrue)serializerMenuListSerializers(instanceqs,manyTrue)treedataserializer。dataelse:〔qs。extend(i。menus。all())foriininstance。roles。all()〕serializerUserMenuSerializers(instanceqs,manyTrue)组织用户拥有的菜单列表treedict{}treedata〔〕try:foriteminserializer。data:treedict〔item〔id〕〕itemforiintreedict:iftreedict〔i〕〔parent〕:pidtreedict〔i〕〔parent〕parenttreedict〔pid〕parent。setdefault(children,〔〕)。append(treedict〔i〕)else:treedata。append(treedict〔i〕)except:treedataserializer。datareturntreedataclassMeta:modelUserProfileexclude(avatar,)classUserProfileSerializers(serializers。ModelSerializer):classMeta:modelUserProfileexclude(avatar,)defcreate(self,validateddata):rolesvalidateddata。pop(roles)departmentsvalidateddata。pop(department)instanceUserProfile。objects。create(validateddata)instance。setpassword(validateddata〔password〕)instance。save()instance。department。set(departments)instance。roles。set(roles)returninstance用户管理视图importshortuuidfromdjango。db。modelsimportQfromdjango。core。cacheimportcachefromconfigimportUSERAUTHBACKENDimportloggingloggerlogging。getLogger(name)USERSYNCKEY{feishu:celeryjob:feishuusersync,同步飞书组织架构任务keyldap:celeryjob:ldapusersync,LDAP用户同步任务KEY}classUserViewSet(AutoModelViewSet):用户管理视图用户管理权限{:(userall,用户管理)},{get:(userlist,查看用户)},{post:(usercreate,创建用户)},{put:(useredit,编辑用户)},{patch:(useredit,编辑用户)},{delete:(userdelete,删除用户)}permsmap({:(admin,管理员)},{:(userall,用户管理)},{get:(userlist,查看用户)},{post:(usercreate,创建用户)},{put:(useredit,编辑用户)},{patch:(useredit,编辑用户)},{delete:(userdelete,删除用户)})querysetUserProfile。objects。exclude(Q(usernamethirdparty)Q(isactiveFalse))serializerclassUserProfileSerializersserializerlistclassUserProfileListSerializersdefgetserializerclass(self):ifself。actionin〔detail,retrieve〕:returnUserProfileDetailSerializersreturnsuper()。getserializerclass()defcreate(self,request,args,kwargs):ifself。queryset。filter(usernamerequest。data〔username〕):returnopsresponse({},successFalse,errorCode40300,errorMessages账号已存在!request。data〔username〕)passwordshortuuid。ShortUUID()。random(length8)request。data〔password〕passwordserializerself。getserializer(datarequest。data)serializer。isvalid(raiseexceptionTrue)self。performcreate(serializer)dataserializer。datadata〔password〕passworddata〔status〕successdata〔code〕20000returnopsresponse(data)defperformdestroy(self,instance):禁用用户instance。isactiveFalseinstance。save()action(methods〔POST〕,urlpathpasswordreset,detailFalse)defpasswordreset(self,request):重置用户密码重置用户密码dataself。request。datauserself。queryset。get(pkdata〔uid〕)ifuser。issuperuser:returnopsresponse({},successFalse,errorCode40300,errorMessage禁止修改管理员密码!)user。setpassword(data〔password〕)user。save()returnopsresponse(密码已更新。)action(methods〔GET〕,urlpathdetail,detailFalse)defdetailinfo(self,request,pkNone,args,kwargs):用户详细列表获取用户详细信息,用户管理模块returnsuper()。list(request,pk,args,kwargs)action(methods〔POST〕,urlpathsync,detailFalse)defusersync(self,request):用户同步传递参数:sync:1syncrequest。data。get(sync,0)isjobexistcache。get(USERSYNCKEY〔USERAUTHBACKEND〕)ifisjobexist:returnopsresponse({},successFalse,errorCode40300,errorMessage已经有组织架构同步任务在运行中。。。请稍后刷新页面查看)ifsync:同步任务,后面再实现taskidNone限制只能有一个同步任务在跑cache。set(USERSYNCKEY〔USERAUTHBACKEND〕,taskid,timeout300)returnopsresponse(正在同步组织架构信息。。。)添加路由
  加用户管理的路由加到devopsbackendurls。py。。。router。register(users,UserViewSet)运行项目
  访问http:localhost:9000apidoc,输入users过滤可以看到用户模块接口

久违!中国女排2大奥运冠军同框亮相,轻装上阵指导技术动作中国女排首期集训仍在如火如荼的进行着,蔡斌正率领爱徒们开展体能,力量和技战术等多个层面的训练。按照原定的计划,姑娘们参加完北仑集训之后,还要在1个多月后转战漳州基地,针对世联赛的每马龙退赛国际乒联官宣,国乒5位世界冠军决战日乒,张本难夺冠最近国乒已经正式出发印度参加球星挑战赛,然而让很多球迷非常难过的是,就在这一次的比赛即将到来,国乒很多主力却因为伤病或者生病的原因没有办法参加比赛。比如就在最近,国乒教练组李隼已经冠军!闽将林雨薇创国内九年来最好成绩25日,在2023年全国室内田径邀请赛第三站(成都犀浦站)的比赛中,来自福建的林雨薇以8秒08率先撞线,获得女子60米栏冠军。这一成绩不仅刷新了林雨薇的个人最好成绩,也创造了九年来华沙欧洲柔道公开赛中国女队再添四枚奖牌新华社华沙2月26日电(记者陈琛张章)在26日华沙欧洲柔道公开赛最后一个比赛日的较量中,中国选手徐仕妍和宿欣分别获得女子78公斤以上级银牌和铜牌。25岁的徐仕妍在半决赛中击败队友宿20击败纽卡斯尔曼联夺得近6年来首个冠军中新网2月27日电北京时间27日凌晨,202223赛季英格兰联赛杯决赛举行。曼联以20击败纽卡斯尔,夺得冠军。这也是曼联足球俱乐部近6年来的首个冠军。图片来源曼联足球俱乐部官方微博3万亿元回血包已打开,你还不出手?如果你曾经的买买买,能见到回头钱了,这未尝不是一次投资机遇。近日,有报告预计,到2025年,中国的闲置物品交易有望突破3万亿元。二手经济,真有那么香?侃财君跟您说一说。二手经济有多迪丽热巴最新黑色羽绒服机场照的一些小细节最近终于见到了新鲜的迪丽热巴,还是她之前的保暖风格,哈哈哈。不得不说她在保暖这块从不含糊?奶乎乎的热巴太可爱了吧,这组照片还有很多小细节!还有一个小爱心!好可爱!真的是又甜又飒!近哭笑不得!肖战卷进奢牌待遇纷争压制影响力,竟误伤川菜前言米兰时装周的后劲太猛了,比正片精彩的永远是戏外,能看到很多不一样的一幕。但不成想最不该卷次此次奢牌待遇纷争的肖战,竟然也被带进了这个瓜场,显得格格不入,虽迟但到的小表格,一张接香港知名女星甜美笑容似少女!月敷60次面膜,身家3亿至今单身本文编辑剧透社issac未经授权严禁转载,发现抄袭者将进行全网投诉不知道如今再提及香港知名女星TVB前艺人张玉珊,各位小伙伴对于她还有什么特别的印象呢?张玉珊已淡出娱乐圈多年,并且扒皮烟酰胺短期美白扛把子?烟酰胺最擅长短期美白,而且成本低廉性价比高,因此成为很多品牌和消费者的心头好。但是除了白得明显这个特点以外,烟酰胺还有一个特点很多人不知道,就是烟酰胺停用后可能反黑。1烟酰胺会降低老江湖才懂得川藏线四大江湖暗号众所周知,每到每年七月份到八月份的时候,是西藏旅游的高峰期,在这一段时间里,由于当地的天气气候没有像冬天那么寒冷干燥,所以是一年中去西藏最适合旅游的时间。因此很多人总是会选择在这一
佩恩说锡安没体育精神,CJ不想看我们扣篮就回防啊鹈鹕128117击败太阳取得6连胜,坐稳西部第一。最后时刻,锡安威廉姆森在胜负已分的情况下表演了360转身扣篮,引发两队冲突。赛后卡梅隆佩恩说比赛基本结束了,他们还继续打。感觉有点12月10日读报卡塔尔世界杯第一组半决赛对阵产生京报体育记者卓然打卡世界杯2022世界杯特别报道卡塔尔世界杯第一组半决赛对阵产生,克罗地亚队将对阵阿根廷队。北京时间12月10日凌晨,在两场世界杯四分之一决赛中,克罗地亚队通过点球食品饮料强势反弹,能否成为跨年行情的主线?随着广州重庆等地防疫政策的率先优化,叠加疫情防控二十条新十条的连续发布,多地陆续取消核酸检测,至12月,央媒发文称抗疫最困难的时期已经走过,联防联控最新消息进一步放开跨区人口流动的孩子爱吃的7款儿童家常菜,营养全面我家孩子也不例外啊,也会有些挑食和偏食的问题,像是一些蔬菜不太喜欢吃,喜欢吃肉食。但是成长中的孩子光吃肉那行啊,蔬菜也要天天吃,才能保证营养均衡,全面发展。今天给妈妈们介绍一下我家先别慌!万一阳了,建议照这个方法居家隔离,让娃少受很多罪万一感染新冠,可以选择居家隔离了!就在前两天,国务院联防联控机制发布了关于进一步优化落实新冠肺炎疫情防控措施的通知,其中明确提到具备居家隔离条件的无症状感染者和轻型病例一般采取居家腺样体肥大娃两周半的时候,发现他睡觉打鼾,夜里睡觉经常会惊醒,睡眠很浅,一直不能睡整觉,抖音上很多腺样体肥大的视频,感觉很像腺样体肥大的症状,带娃去当地儿童医院看,网上挂号预约,但还是100宝宝耳朵进水了,该怎么办?2022育儿季导读前段时间,有位宝妈向小编提到一件事情自己的宝宝游泳回来之后就一直在哭闹,而且在挠自己的耳朵,怎么哄都哄不好,后来才知道原来是宝宝在游泳馆的时候,被旁边的孩子的水枪美国人不惯毛病,她有世界最美的脸蛋,却给了她七次金酸梅奖詹妮麦卡锡,1972年出生于美国,伊利诺伊州,美国模特喜剧演员女演员作家和编剧。1996年,她被人物杂志评为年度世界五十大最漂亮的明星之一。但她的演技最差,从1999年至2009年ampampquot翻车ampampquot金晨玩头巾梗被指侮辱女性,拿捏张继科当脱衣吓坏沈腾戴头巾模仿卡塔尔王子表情包金晨究竟该不该骂?随着卡塔尔王子的爆火热爱上网冲浪的金晨也赶来凑一波热闹发微博晒出戴头巾模仿遮脸的表情包一开始还有人调侃她是毫无偶像包袱的玩梗但之后越来越雍正王朝连载01邬思道是上天给胤禛开的最大金手指首播于1999年的电视连续剧雍正王朝讲述的是雍正在跌宕起伏惊心动魄的九子夺嫡中胜出后,继承皇位,励精图治开拓进取的故事,是一场涉及人性博弈职场争斗的教科书,多年来一直被观众津津乐道狠人赵丽颖火爆全网离婚后,她把自己活成了一个传奇前几天,赵丽颖在微博晒出一张双手照,右边明显比左边大一圈。打人打的。这条微博起因于正在热播的电视剧风吹半夏。赵丽颖在其中饰演将红唇大波浪半永久的企业家,在90年代改革浪潮中怀抱壮志
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网