【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
🤞到这里,如果还有什么疑问🤞
    🎩欢迎私信博主问题哦,博主会尽自己能力为你解答疑惑的!🎩
      🥳如果对你有帮助,你的赞是对博主最大的支持!!🥳



相关文章
|
5月前
|
XML 测试技术 API
利用C#开发ONVIF客户端和集成RTSP播放功能
利用C#开发ONVIF客户端和集成RTSP播放功能
2820 123
|
7月前
|
数据采集 运维 DataWorks
DataWorks 千万级任务调度与全链路集成开发治理赋能智能驾驶技术突破
智能驾驶数据预处理面临数据孤岛、任务爆炸与开发运维一体化三大挑战。DataWorks提供一站式的解决方案,支持千万级任务调度、多源数据集成及全链路数据开发,助力智能驾驶模型数据处理与模型训练高效落地。
|
10月前
|
监控 Java API
1K star!这个开源项目让短信集成简单到离谱,开发效率直接翻倍!
SMS4J 是一款由国内技术团队打造的短信聚合框架,专为解决多短信服务商接入难题而生。它就像短信界的"瑞士军刀",目前已整合21家主流短信服务商,从阿里云、腾讯云到中国移动云MAS,开发者只需通过简单配置即可实现多平台无缝切换。
701 4
|
6月前
|
SQL 前端开发 JavaScript
基于python+django开发的在线求职招聘网站-网上招聘管理系统
该系统是基于python+django的求职招聘网站、网上招聘管理系统、网上人才招聘系统、毕业生求职招聘系统、大学生求职招聘系统、校园招聘系统、企业招聘系统。系统适合场景:大学生、课程作业、毕业设计。这是一个前后端分离的项目,需要同学们学习django技术和vue技术。
478 3
|
8月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
1720 0
|
10月前
|
人工智能 程序员 测试技术
通义灵码与魔搭 Notebook 深度集成:在线编码开箱即用,开发效率倍增
通义灵码 2.0 AI 程序员 2025 年 1 月正式上线,目前已经服务百万开发者,成为国内开发者最受欢迎的智能编码助手。
|
API 数据库 Python
|
8月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
387 1
|
设计模式 前端开发 数据库
Python Web开发:Django框架下的全栈开发实战
【10月更文挑战第27天】本文介绍了Django框架在Python Web开发中的应用,涵盖了Django与Flask等框架的比较、项目结构、模型、视图、模板和URL配置等内容,并展示了实际代码示例,帮助读者快速掌握Django全栈开发的核心技术。
792 45
|
机器学习/深度学习 人工智能 算法
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面
植物病害识别系统。本系统使用Python作为主要编程语言,通过收集水稻常见的四种叶片病害图片('细菌性叶枯病', '稻瘟病', '褐斑病', '稻瘟条纹病毒病')作为后面模型训练用到的数据集。然后使用TensorFlow搭建卷积神经网络算法模型,并进行多轮迭代训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地模型文件。再使用Django搭建Web网页平台操作界面,实现用户上传一张测试图片识别其名称。
620 22
植物病害识别系统Python+卷积神经网络算法+图像识别+人工智能项目+深度学习项目+计算机课设项目+Django网页界面