haha
This commit is contained in:
13
manage.py
Normal file
13
manage.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""Django 管理入口(在 boss_dp 根目录执行 python manage.py 即可)。"""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
_root = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
if _root not in sys.path:
|
||||||
|
sys.path.insert(0, _root)
|
||||||
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings")
|
||||||
|
from django.core.management import execute_from_command_line
|
||||||
|
execute_from_command_line(sys.argv)
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
"""
|
||||||
|
筛选配置:增加 position_keywords、city、salary_min、salary_max、experience
|
||||||
|
列表接口需返回:name, position_keywords, city, salary_min, salary_max, experience, education, is_active
|
||||||
|
"""
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('server', '0005_filterconfig_min_max_amount'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='filterconfig',
|
||||||
|
name='position_keywords',
|
||||||
|
field=models.CharField(blank=True, default='', max_length=512, verbose_name='岗位关键词列表'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='filterconfig',
|
||||||
|
name='city',
|
||||||
|
field=models.CharField(blank=True, default='', max_length=64, verbose_name='城市'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='filterconfig',
|
||||||
|
name='salary_min',
|
||||||
|
field=models.CharField(blank=True, default='', max_length=32, verbose_name='最低薪资(K)'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='filterconfig',
|
||||||
|
name='salary_max',
|
||||||
|
field=models.CharField(blank=True, default='', max_length=32, verbose_name='最高薪资(K)'),
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='filterconfig',
|
||||||
|
name='experience',
|
||||||
|
field=models.CharField(blank=True, default='', max_length=64, verbose_name='工作经验'),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -108,10 +108,17 @@ class AuthToken(models.Model):
|
|||||||
class FilterConfig(models.Model):
|
class FilterConfig(models.Model):
|
||||||
"""筛选条件配置表。"""
|
"""筛选条件配置表。"""
|
||||||
name = models.CharField(max_length=128, verbose_name="配置名称")
|
name = models.CharField(max_length=128, verbose_name="配置名称")
|
||||||
|
position_keywords = models.CharField(max_length=512, default="", blank=True, verbose_name="岗位关键词列表")
|
||||||
|
city = models.CharField(max_length=64, default="", blank=True, verbose_name="城市")
|
||||||
|
salary_min = models.CharField(max_length=32, default="", blank=True, verbose_name="最低薪资(K)")
|
||||||
|
salary_max = models.CharField(max_length=32, default="", blank=True, verbose_name="最高薪资(K)")
|
||||||
|
experience = models.CharField(max_length=64, default="", blank=True, verbose_name="工作经验")
|
||||||
|
education = models.CharField(max_length=32, default="不限", verbose_name="学历要求")
|
||||||
|
is_active = models.BooleanField(default=True, verbose_name="是否启用")
|
||||||
|
# 以下为兼容旧版保留字段
|
||||||
age_min = models.IntegerField(default=18, verbose_name="最小年龄")
|
age_min = models.IntegerField(default=18, verbose_name="最小年龄")
|
||||||
age_max = models.IntegerField(default=60, verbose_name="最大年龄")
|
age_max = models.IntegerField(default=60, verbose_name="最大年龄")
|
||||||
gender = models.CharField(max_length=32, default="不限", verbose_name="性别")
|
gender = models.CharField(max_length=32, default="不限", verbose_name="性别")
|
||||||
education = models.CharField(max_length=32, default="不限", verbose_name="学历要求")
|
|
||||||
activity = models.CharField(max_length=32, default="不限", verbose_name="活跃度")
|
activity = models.CharField(max_length=32, default="不限", verbose_name="活跃度")
|
||||||
positions = models.JSONField(default=list, blank=True, verbose_name="期望岗位列表")
|
positions = models.JSONField(default=list, blank=True, verbose_name="期望岗位列表")
|
||||||
greeting_min = models.IntegerField(default=5, verbose_name="打招呼最少条数/天")
|
greeting_min = models.IntegerField(default=5, verbose_name="打招呼最少条数/天")
|
||||||
@@ -122,7 +129,6 @@ class FilterConfig(models.Model):
|
|||||||
message_interval = models.IntegerField(default=30, verbose_name="打招呼间隔秒")
|
message_interval = models.IntegerField(default=30, verbose_name="打招呼间隔秒")
|
||||||
min_amount = models.IntegerField(null=True, blank=True, verbose_name="最小金额")
|
min_amount = models.IntegerField(null=True, blank=True, verbose_name="最小金额")
|
||||||
max_amount = models.IntegerField(null=True, blank=True, verbose_name="最大金额")
|
max_amount = models.IntegerField(null=True, blank=True, verbose_name="最大金额")
|
||||||
is_active = models.BooleanField(default=True, verbose_name="是否启用")
|
|
||||||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||||||
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||||
|
|
||||||
|
|||||||
@@ -101,11 +101,19 @@ FILTER_AMOUNT_ALIASES = {
|
|||||||
|
|
||||||
|
|
||||||
class FilterConfigSerializer(serializers.ModelSerializer):
|
class FilterConfigSerializer(serializers.ModelSerializer):
|
||||||
|
"""筛选配置:列表/详情返回 name, position_keywords, city, salary_min, salary_max, experience, education, is_active 等。"""
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = FilterConfig
|
model = FilterConfig
|
||||||
fields = "__all__"
|
fields = "__all__"
|
||||||
read_only_fields = ["id", "created_at", "updated_at"]
|
read_only_fields = ["id", "created_at", "updated_at"]
|
||||||
|
|
||||||
|
def to_representation(self, instance):
|
||||||
|
"""响应中 is_active 统一为字符串 "true" / "false"。"""
|
||||||
|
data = super().to_representation(instance)
|
||||||
|
data["is_active"] = "true" if instance.is_active else "false"
|
||||||
|
return data
|
||||||
|
|
||||||
def to_internal_value(self, data):
|
def to_internal_value(self, data):
|
||||||
"""请求中兼容 minAmount/maxAmount、最小金额/最大金额 等别名,统一为 min_amount/max_amount。"""
|
"""请求中兼容 minAmount/maxAmount、最小金额/最大金额 等别名,统一为 min_amount/max_amount。"""
|
||||||
if isinstance(data, dict):
|
if isinstance(data, dict):
|
||||||
@@ -113,6 +121,9 @@ class FilterConfigSerializer(serializers.ModelSerializer):
|
|||||||
for alias, canonical in FILTER_AMOUNT_ALIASES.items():
|
for alias, canonical in FILTER_AMOUNT_ALIASES.items():
|
||||||
if alias in data and canonical not in data:
|
if alias in data and canonical not in data:
|
||||||
data[canonical] = data.pop(alias)
|
data[canonical] = data.pop(alias)
|
||||||
|
# 请求里 is_active 可能是字符串 "true"/"false"
|
||||||
|
if "is_active" in data and isinstance(data["is_active"], str):
|
||||||
|
data["is_active"] = data["is_active"].lower() in ("true", "1", "yes", "是")
|
||||||
return super().to_internal_value(data)
|
return super().to_internal_value(data)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user