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



相关文章
|
30天前
|
JavaScript 前端开发 应用服务中间件
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
这篇文章分析了Vue项目在服务器部署后出现404错误的原因,主要是由于history路由模式下服务器缺少对单页应用的支持,并提供了通过修改nginx配置使用`try_files`指令重定向所有请求到`index.html`的解决方案。
【Vue面试题三十】、vue项目本地开发完成后部署到服务器后报404是什么原因呢?
|
19天前
|
图形学 iOS开发 Android开发
从Unity开发到移动平台制胜攻略:全面解析iOS与Android应用发布流程,助你轻松掌握跨平台发布技巧,打造爆款手游不是梦——性能优化、广告集成与内购设置全包含
【8月更文挑战第31天】本书详细介绍了如何在Unity中设置项目以适应移动设备,涵盖性能优化、集成广告及内购功能等关键步骤。通过具体示例和代码片段,指导读者完成iOS和Android应用的打包与发布,确保应用顺利上线并获得成功。无论是性能调整还是平台特定的操作,本书均提供了全面的解决方案。
79 0
|
19天前
|
开发者 存储 API
Xamarin 云服务集成竟然如此强大,简化后端开发不再是梦,数据存储、用户认证、推送通知全搞定!
【8月更文挑战第31天】Xamarin 是一款强大的跨平台移动应用开发工具,通过与云服务集成,显著简化了后端开发。开发者无需自行搭建服务器,即可利用云服务提供的数据存储、用户认证、推送通知等功能,大幅减少数据库设计、服务器配置及 API 开发的时间成本。借助 Azure Mobile Apps 等云服务,Xamarin 可轻松实现数据存取操作,同时增强应用安全性与用户参与度,使开发者更专注于业务逻辑和用户体验,提升开发效率并降低成本。这种方式在快速发展的移动应用领域极具价值。
41 0
|
19天前
|
数据库 开发者 Java
颠覆传统开发:Hibernate与Spring Boot的集成,让你的开发效率飞跃式提升!
【8月更文挑战第31天】在 Java 开发中,Spring Boot 和 Hibernate 已成为许多开发者的首选技术栈。Spring Boot 简化了配置和部署过程,而 Hibernate 则是一个强大的 ORM 框架,用于管理数据库交互。将两者结合使用,可以极大提升开发效率并构建高性能的现代 Java 应用。本文将通过代码示例展示如何在 Spring Boot 项目中集成 Hibernate,并实现基本的数据库操作,包括添加依赖、配置数据源、创建实体类和仓库接口,以及在服务层和控制器中处理 HTTP 请求。这种组合不仅简化了配置,还提供了一套强大的工具来快速开发现代 Java 应用程序。
29 0
|
19天前
|
前端开发 Java UED
JSF遇上Material Design:一场视觉革命,如何让传统Java Web应用焕发新生?
【8月更文挑战第31天】在当前的Web开发领域,用户体验和界面美观性至关重要。Google推出的Material Design凭借其独特的动画、鲜艳的颜色和简洁的布局广受好评。将其应用于JavaServer Faces(JSF)项目,能显著提升应用的现代感和用户交互体验。本文介绍如何通过PrimeFaces等组件库在JSF应用中实现Material Design风格,包括添加依赖、使用组件及响应式布局等步骤,为用户提供美观且功能丰富的界面。
30 0
|
19天前
|
持续交付 测试技术 jenkins
JSF 邂逅持续集成,紧跟技术热点潮流,开启高效开发之旅,引发开发者强烈情感共鸣
【8月更文挑战第31天】在快速发展的软件开发领域,JavaServer Faces(JSF)这一强大的Java Web应用框架与持续集成(CI)结合,可显著提升开发效率及软件质量。持续集成通过频繁的代码集成及自动化构建测试,实现快速反馈、高质量代码、加强团队协作及简化部署流程。以Jenkins为例,配合Maven或Gradle,可轻松搭建JSF项目的CI环境,通过JUnit和Selenium编写自动化测试,确保每次构建的稳定性和正确性。
42 0
|
19天前
|
前端开发 Devops 持续交付
【前端自动化新高度】Angular与Azure DevOps完美结合:从零构建持续集成与持续部署的全自动流水线,提升开发效率与软件交付质量!
【8月更文挑战第31天】Angular作为领先的前端框架,以强大功能和灵活性深受开发者喜爱。Azure DevOps提供一站式DevOps服务,涵盖源码管理、持续集成(CI)及持续部署(CD)。本文将指导你如何在Azure DevOps中搭建Angular项目的CI/CD流程,并通过具体示例代码展示整个过程。首先,我们将创建一个Angular项目并初始化Git仓库;然后,在Azure DevOps中设置CI流水线,定义YAML文件以自动化构建和部署流程。最终实现每次提交代码后自动构建并部署至Azure Web App,极大提升了开发效率和软件交付速度,使团队更专注于创新。
14 0
|
24天前
|
消息中间件 NoSQL 调度
Django后端架构开发:Django 与 Celery 的深度集成
Django后端架构开发:Django 与 Celery 的深度集成
77 0
|
26天前
|
Java 编译器 开发工具
JDK vs JRE:面试大揭秘,一文让你彻底解锁Java开发和运行的秘密!
【8月更文挑战第24天】JDK(Java Development Kit)与JRE(Java Runtime Environment)是Java环境中两个核心概念。JDK作为开发工具包,不仅包含JRE,还提供编译器等开发工具,支持Java程序的开发与编译;而JRE仅包含运行Java程序所需的组件如JVM和核心类库。一个简单的"Hello, World!"示例展示了两者用途:需借助JDK编译程序,再利用JRE或JDK中的运行环境执行。因此,开发者应基于实际需求选择安装JDK或JRE。
38 0
|
1月前
|
jenkins 持续交付 开发工具
自动化开发之旅:Docker携手Jenkins,与Git和Tomcat共舞持续集成
【8月更文挑战第13天】在软件开发中,持续集成(CI)通过自动化构建、测试与部署提升效率与稳定性。Docker、Jenkins、Git和Tomcat构成CI的黄金组合:`git push`触发Jenkins作业,利用Docker确保环境一致性,最终将应用部署至Tomcat。首先配置Git Webhooks以触发Jenkins;接着在Jenkins中创建作业并使用Docker插件模拟真实环境;通过Maven构建项目;最后部署至Tomcat。这套流程减少人为错误,提高开发效率,展示了技术的力量与流程的革新。
52 0

热门文章

最新文章