Django笔记——04 简历投递和面试流程闭环

1、制作更美化的页面

django-grappelli、bootstrap、swift、Xadmin、tailwind
安装django-grappelli风格:

pip install django-grappelli

在settings.py中的配置:

INSTALLED_APPS = ('grappelli', 'django.contrib.admin')

urls.py 中添加URL映射:

urlpatterns = [
	path('grappelli/', include('grappelli.urls')),
	#path('admin/', admin.site.urls)
]

2、定制面试官权限

数据权限:

  • 专业面试官仅能评估自己负责的环节

数据集权限:

  • 专业面试官只能看到分到自己的候选人

功能权限:

  • 数据导出权限仅次HR和超级管理员可用

1、数据权限:

用get_fieldsets函数确定用户点击详情页时所能看到和操作的信息,返回的是控制fieldsets的内容:

def get_fieldsets(self, request, obj=None):
    group_names = self.get_group_names(request.user)

    if '面试官' in group_names and obj.first_interviewer_user == request.user:
        return self.default_fieldsets_first
    if '面试官' in group_names and obj.second_interviewer_user == request.user:
        return self.default_fieldsets_second
    if '面试官' in group_names and obj.first_interviewer_user != request.user and obj.second_interviewer_user != request.user:
        return self.default_fieldsets_none
    return self.default_fieldsets

2、数据集权限

get_queryset定义数据集权限,列表页展示的时候回默认调用这个方法

#对于非管理员,非HR,获取自己是一面面试官或者二面面试官的候选人集合:s
def get_queryset(self, request):  # show data only owned by the user
    qs = super(CandidateAdmin, self).get_queryset(request)

    group_names = self.get_group_names(request.user)
    if request.user.is_superuser or 'hr' in group_names:
        return qs   # 返回的是所有的数据集
    return Candidate.objects.filter(Q(first_interviewer_user=request.user) | Q(second_interviewer_user=request.user))

django里面有一个Q表达式,可以用来去做or的查询,到数据库里面做or或and或or和and的复杂查询


3、功能权限

普通用户没有导出csv文件的功能

在model的Meta里面可以定义权限,权限的定义需要同步到数据库中

permissions = [
    ("export", "Can export candidate list"), # 导出权限,可以导出候选人列表
    ("notify", "notify interviewer for candidate review"), # 通知权限,可以通知面试官准备做面试
]

定义权限之后可以在admin里面设置谁有权限,谁没有权限

# 导出按钮的权限,如果用户有export的权限,则运行调用allowed_permissions这个方法,则菜单会展示出来
export_model_as_csv.allowed_permissions = ('export', )

CandidateAdmin中定义方法检测当前用户有无导出权限

# 当前用户是否有导出权限:
def has_export_permission(self, request):
    opts = self.opts
    return request.user.has_perm('%s.%s' % (opts.app_label, "export"))  # 用户有无权限用user.has_perm判断,opts.app_label取得candidate,看的是candidate.export

3、允许候选人注册登陆——继承Registration

用allauth也有类似的效果

原先定义的base.html也是Registration里面的一个模板文件,所以自定义的base.html覆盖了原始的模板文件,若想要修改页面样式,也是需要将HTML文件复制到项目中来

在这里插入图片描述

在settings的配置:

LOGIN_REDIRECT_URL = '/' # 登陆成功后跳转的链接
SIMPLE_BACKEND_REDIRECT_URL = '/accounts/login/' # 注册成功后跳转的链接

4、创建建立model

  • 创建model
  • 注册model到admin中,设置展示字段
  • 同步数据库
  • 授予管理权限到HR

5、候选人可以在线投递简历

目标:

  • 注册用户可以提交简历
  • 简历跟当前用户关联
  • 能够追溯到谁投递的简历

步骤:

  • 定义简历创建View(继承自通用的CreateView)
  • 定义简历创建页面的表单模板
  • 关联“申请职位”按钮的点击事件到简历提交页
  • 进一步完善,可以带参数跳转&&关联登陆用户到简历

view中定义类视图:

class ResumeCreateView(LoginRequiredMixin, CreateView): # Mixin达到让一个类能够继承多个类的目的
    """    简历职位页面  """
    template_name = 'resume_form.html'
    success_url = '/joblist/'
    model = Resume
    fields = ["username", "city", "phone",
        "email", "apply_position", "gender",
        "bachelor_school", "master_school", "major", "degree",
        "candidate_introduction", "work_experience", "project_experience"]


    ### 从 URL 请求参数带入默认值
    def get_initial(self):
        initial = {}
        for x in self.request.GET:
            initial[x] = self.request.GET[x]
        return initial

    def form_valid(self, form):
        self.object = form.save(commit=False)
        self.object.applicant = self.request.user
        self.object.save()
        return HttpResponseRedirect(self.get_success_url())

urls.py:

path('resume/add/', views.ResumeCreateView.as_view(), name='resume-add'),

6、用bootstrap定制页面样式

{# Load the tag library #}
{% load bootstrap4 %}

{# Load CSS and JavaScript #}
{% bootstrap_css %}
{% bootstrap_javascript jquery='full' %}

{# Display django.contrib.messages as Bootstrap alerts #}
{% bootstrap_messages %}

7、简历评估和安排一面面试官

  • 目标:打通简历投递与面试流程,让简历实体(Resume)流转到候选人实体(Candidate)

  • 添加一个数据操作菜单“进入面试流程”

  • 定义enter_interview_process方法
    def enter_interview_process(model, request, queryset)
    方法逻辑:拷贝Resume对象中的属性到Candidate,保存Candidate,消息提示成功保存

  • 注册到modeladmin中
    actions = (export_model_as_csv, notify,_interviewer, enter_interview_process,)

# 进入面试流程,就是将简历的信息添加到候选人中
def enter_interview_process(modeladmin, request, queryset):
    candidate_names = ""
    for resume in queryset:
        candidate = Candidate()
        # 把 obj 对象中的所有属性拷贝到 candidate 对象中:
        candidate.__dict__.update(resume.__dict__)
        candidate.created_date = datetime.now()
        candidate.modified_date = datetime.now()
        candidate_names = candidate.username + "," + candidate_names
        candidate.creator = request.user.username
        candidate.save()
    messages.add_message(request, messages.INFO, '候选人: %s 已成功进入面试流程' % (candidate_names) )

enter_interview_process.short_description = u"进入面试流程"

8、定制列表查看简历详情

  • 添加 ResumeDetailView 的详情页视图,使用 Django的通用视图,继承自 DetailView
  • 添加 Detail 页模板: resume_detail.html
  • 候选人列表页, 对于每一行来自简历投递的数据,添加一个“查看简历”的链接:
    • 列表页,使用 函数名称 作为 list_display 中的字段
    • 定义一个函数, 获取 简历详情页链接

定义简历的详情页,继承DetailView,DetailView是详情页的视图

class ResumeDetailView(DetailView):
    """   简历详情页    """
    model = Resume
    template_name = 'resume_detail.html'

interview/admin.py

# 列表页查看简历
def get_resume(self, obj): # obj是当前候选人的实体
    if not obj.phone:
        return ""
    resumes = Resume.objects.filter(phone=obj.phone)
    if resumes and len(resumes) > 0:
        return mark_safe(u'<a href="/resume/%s" target="_blank">%s</a' % (resumes[0].id, "查看简历"))
    return ""
get_resume.short_description = '查看简历'  # 列名
get_resume.allow_tags = True
   

然后将get_resume写入list_display中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值