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):
|
||||
"""筛选条件配置表。"""
|
||||
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_max = models.IntegerField(default=60, 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="活跃度")
|
||||
positions = models.JSONField(default=list, blank=True, 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="打招呼间隔秒")
|
||||
min_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="创建时间")
|
||||
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||||
|
||||
|
||||
@@ -101,11 +101,19 @@ FILTER_AMOUNT_ALIASES = {
|
||||
|
||||
|
||||
class FilterConfigSerializer(serializers.ModelSerializer):
|
||||
"""筛选配置:列表/详情返回 name, position_keywords, city, salary_min, salary_max, experience, education, is_active 等。"""
|
||||
|
||||
class Meta:
|
||||
model = FilterConfig
|
||||
fields = "__all__"
|
||||
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):
|
||||
"""请求中兼容 minAmount/maxAmount、最小金额/最大金额 等别名,统一为 min_amount/max_amount。"""
|
||||
if isinstance(data, dict):
|
||||
@@ -113,6 +121,9 @@ class FilterConfigSerializer(serializers.ModelSerializer):
|
||||
for alias, canonical in FILTER_AMOUNT_ALIASES.items():
|
||||
if alias in data and canonical not in data:
|
||||
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)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user