【Django | 开发】面试招聘信息网站(划分面试官权限&集成钉钉消息)

简介: 【Django | 开发】面试招聘信息网站(划分面试官权限&集成钉钉消息)

文章目录

一、设置面试官权限

图片.png

1)数据权限

  • 通过get_list_fieldsets控制admin选项option中的fieldsets 实现

预期效果

  1. hr 和超级用户 可以看到全部信息
  2. 一面面试官只能看到自己负责的一面面试信息
  3. 二面面试官只能看到自己负责二面面试信息
  4. 普通管理员(还未被指定一面或者二面面试官)只能修改候选人信息

代码实现(核心代码)

  # 定义集合的字段列表
  default_fieldsets = (
    # 第一个元素表示分组展现的名字,第二元素是一个map
    ·······
  )
  default_fieldsets_hr = (·······)
  # 定义集合的字段列表
  default_fieldsets_second = (·······)
  # 定义集合的字段列表
  default_fieldsets_first = (·······)
  def get_fieldsets(self, request, obj=None):
    group_name = self.get_group_name(request.user)
    # obj 是对应修改对象,和action方法queryset一样
    if 'interviewer' in group_name and request.user == obj.first_interviewer_user: # 判断是否对应一面面试官
      logger.info("The interviewer is the first interviewer for user %s"% obj.user_name)
      return default_fieldsets_first
    elif 'interviewer' in group_name and request.user == obj.second_interviewer_user:
      logger.info("The interviewer is the second interviewer for user %s" % obj.user_name)
      return default_fieldsets_second
    elif request.user.is_superuser or 'HR' in group_name:
      logger.info("The interviewer is the HR  for user %s or superuser" % obj.user_name)
      return default_fieldsets_hr
    return default_fieldsets
  def get_group_name(self, user):
    group_name = []
    for g in user.groups.all():  # 循环groups对象列表
      group_name.append(g.name)  # 附加对象的名字
    return group_name
  • 由于fieldset代码过长,我们将设置的fieldset放到脚本candidate_fieldset脚本文件中,直接引入进来。图片.png

HR 和超级用户

图片.png

一面面试官

图片.png

二面面试官

图片.png

2) 数据集的权限控制

  • 通过重写 get_queryset进行条件判断,并借助Q对象对数据库SQL语句进行or and组合实现需求
from django.db.models import Q
  # 列表页显示默认先运行get_queryset,没有重写则全部显示
  # 此时显示的数据集是对于Candidate模型的,不影响其他模型
  def get_queryset(self, request):
    qs = super(CandidateAdmin, self).get_queryset(request)
    group_name = self.get_group_name(request.user)
    # hr or superuser
    if 'HR' in group_name or request.user.is_superuser:
      return qs
    # interviewer
    return Candidate.objects.filter(  # Q对象 可进行and or 配合位或运算符
      Q(first_interviewer_user=request.user) | Q(second_interviewer_user=request.user))

成功实现

图片.png

图片.png

3) action行为权限

在添加群组时我们为interviewer群组添加了增删改查应聘者的权限,这里再为普通面试官添加不可导出为csv action行为 的权限以及不可删除对象delete_selected)的权限

  1. 方法一:添加权限实现(为Candidate模型Meta 为其设置自定义权限(元组))
  2. 方法二:有条件的启用或禁用行为(get_actions
  3. 方法三:全局禁用,局部使用
    https://docs.djangoproject.com/zh-hans/4.0/ref/contrib/admin/actions/ (各种方法文档都有例子)
  • 方法一:添加权限实现(为Candidate模型Meta 为其设置自定义权限(元组))
·······
  class Meta:
    db_table = 'candidate'
    verbose_name = '应聘者'
    verbose_name_plural = '应聘者'  # 复数形式
    permissions = (
      ('export_as_csv_or_excel', "Can export candidate list"),
      ('notify_interviewer', "Can notify interviewer")
    )
······
  • action装饰器ModelAdmin类加上权限设置( permissions 的值必须是一个 列表或元组!传一个字符串会拆成各个字符
# 注册为 action       permissions 的值必须是一个 列表或元组!传一个字符串会拆成各个字符
@admin.action(description='导出为csv文件', permissions=('export_as_csv_or_excel'))
def export_model_as_csv(modeladmin, request, queryset):
  ·······
# 注册为 action
@admin.action(description='导出为excel文件', permissions=('export_as_csv_or_excel'))
def export_model_as_excel(modeladmin, request, queryset):
  ······

官方文档modeladmin配置

You can specify any other value as long as you implement a corresponding has_[value]_permission(self, request) method on the ModelAdmin.(注意:这里的value就是你设置的权限)

  • admin代码

总体代码思想,先在model模型添加Meta信息,数据库同步则会添加在群组权限设置中,

然后对action行为添加permission权限,接着还必须要在modeladmin添加函数has_value_permission判断登录user是否has_perm(拥有权限),返回值为boolean, 我们可以看看permission 模型代码

图片.png

# 全局禁用删除对象,需要使用需要在modeladmin加上该action
# admin.site.disable_action('delete_selected') 不建议使用,可以通过权限设置
@admin.register(Candidate)
class CandidateAdmin(admin.ModelAdmin):
  # import actions to use
  actions = [export_model_as_csv, export_model_as_excel, 'delete_selected']
  def has_export_as_csv_or_excel_permission(self, request):
    """Does the user have the export permission?"""
    opts = self.opts
    # return a boolean           判断是否权限            模型所在应用  权限名
    return request.user.has_perm("%s.%s" % (opts.app_label, "export_as_csv_or_excel"))  # 是否有对应权限
  ······
  • 这里的opts参数其实就是对应modelMeta
    图片.png
  • 效果
    图片.png图片.png
  • 现在还无法看到权限,因为model模型Meta信息还没有同步到数据库(如果数据库auth用户验证模块没有这个定义,这里是不显示的)
    图片.png
  • 数据迁移两把斧运行

图片.png

成功

图片.png

二、 钉钉群消息集成

图片.png

1)简单shell测试

图片.png

  • 在应用interview创建脚本dingtalk.py
# coding=utf-8
# 引入聊天机器人
from dingtalkchatbot.chatbot import DingtalkChatbot
from django.conf import settings
def send(message, at_mobiles=[]):
  # 引用settings 中配置钉钉群中配置消息通知的WEB hook
  webhook = settings.DINGTALK_WEB_HOOK
  # 初始化机器人小丁 方法一
  xiaoding = DingtalkChatbot(webhook)
  # 方法二
  # xiaoding = DingtalkChatbot(webhook,secret=secret)
  # Text消息 @所有人
  xiaoding.send_text(msg=('面试通知:%s' % message), at_mobiles=at_mobiles)
  • 创建群聊,选择自定义
    图片.png图片.png

图片.png

  • 将Webhook 卸载setting中
    图片.png
  • 使用shell 测试
In [2]: import interview.dingtalk
In [3]: interview.dingtalk.send("通知!请哈利波速速救急")

图片.png

也可以@面试官

In [6]: interview.dingtalk.send("通知!请哈利波速速救急",['1343187782'])

图片.png

2)在admin后台添加通知面试官action

在实际中,我们希望直接通知最近需要面试候选人得面试官,所以我们为应聘者添加一个action,被选中得应聘者可以直接发送到对应一面或二面面试官。

  • admin.py
# 导入发送消息
from .dingtalk import send
# 注册为 action
@admin.action(description='钉钉通知面试官', permissions=('notify_interviewer',))
def notify_interviewer(modeladmin, request, queryset):
  # 面试官对象
  candidates = ""
  interviewer = []
  at_mobiles = []
  for candidate in queryset:
    candidates = candidate.user_name + ',' + candidates
    if candidate.first_interviewer_user is not None:
      interviewer.append(candidate.first_interviewer_user)
    if candidate.second_interviewer_user is not None:
      interviewer.append(candidate.second_interviewer_user)
  # 集合去重
  interviewer = set(interviewer)
  for mobile in interviewer:
    at_mobiles.append(mobile.profile.tel)
  logger.info("%s interviewer have been notice" % len(interviewer))
  logger.info(at_mobiles)
  logger.info(interviewer)
  send("%s 准备面试,以下面试官请准备面试工作" % candidates, at_mobiles=at_mobiles)
@admin.register(Candidate)
class CandidateAdmin(admin.ModelAdmin):
  ·······
  # import actions to use
  actions = [export_model_as_csv, export_model_as_excel, notify_interviewer]
  def has_notify_interviewer_permission(self, request):
    """Does the user have the export permission?"""
    opts = self.opts
    # return a boolean           判断是否权限            模型所在应用  权限名
    return request.user.has_perm("%s.%s" % (opts.app_label, "notify_interviewer"))  # 是否有对应权限
  • 效果55.gif
🤞到这里,如果还有什么疑问🤞
    🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
      🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳



相关文章
|
11天前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
141 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
1月前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
87 11
|
3月前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
66 2
|
3月前
|
传感器 前端开发 Android开发
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求
在 Flutter 开发中,插件开发与集成至关重要,它能扩展应用功能,满足复杂业务需求。本文深入探讨了插件开发的基本概念、流程、集成方法、常见类型及开发实例,如相机插件的开发步骤,同时强调了版本兼容性、性能优化等注意事项,并展望了插件开发的未来趋势。
74 2
|
4月前
|
JavaScript 前端开发 持续交付
Prettier 高级应用:集成 CI/CD 流水线与插件开发
【10月更文挑战第18天】Prettier 是一款流行的代码格式化工具,它能够自动将代码格式化成一致的风格,从而提高代码的可读性和维护性。对于希望进一步发挥 Prettier 潜力的高级用户而言,将 Prettier 集成到持续集成(CI)和持续部署(CD)流程中,确保每次提交的代码都符合团队标准,是非常重要的。此外,通过开发自定义插件来支持更多语言或扩展 Prettier 的功能也是值得探索的方向。本文将详细介绍这两方面的内容。
78 2
|
4月前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
114 0
|
4月前
|
开发框架 监控 搜索推荐
GoFly快速开发框架集成ZincSearch全文搜索引擎 - Elasticsearch轻量级替代为ZincSearch全文搜索引擎
本文介绍了在项目开发中使用ZincSearch作为全文搜索引擎的优势,包括其轻量级、易于安装和使用、资源占用低等特点,以及如何在GoFly快速开发框架中集成和使用ZincSearch,提供了详细的开发文档和实例代码,帮助开发者高效地实现搜索功能。
299 0
|
4月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
282 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
5月前
|
并行计算 关系型数据库 分布式数据库
朗坤智慧科技「LiEMS企业管理信息系统」通过PolarDB产品生态集成认证!
近日,朗坤智慧科技股份有限公司「LiEMS企业管理信息系统软件」通过PolarDB产品生态集成认证!
|
5月前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
201 0

热门文章

最新文章