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_firstif '面试官' in group_names and obj.second_interviewer_user == request.user:return self.default_fieldsets_secondif '面试官' in group_names and obj.first_interviewer_user != request.user and obj.second_interviewer_user != request.user:return self.default_fieldsets_nonereturn self.default_fieldsets

2、数据集权限

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

#对于非管理员,非HR,获取自己是一面面试官或者二面面试官的候选人集合:s
def get_queryset(self, request):  # show data only owned by the userqs = 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.optsreturn 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 = Resumefields = ["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 initialdef form_valid(self, form):self.object = form.save(commit=False)self.object.applicant = self.request.userself.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_namescandidate.creator = request.user.usernamecandidate.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 = Resumetemplate_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'%s

然后将get_resume写入list_display中


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部