奖惩表分开

This commit is contained in:
pzc-x99 2025-03-01 23:16:07 +08:00
parent bb3d03b26d
commit ca826214df
10 changed files with 358 additions and 69 deletions

2
.gitignore vendored
View File

@ -1,4 +1,4 @@
/static
/upload_file
/generate_paper
*.pyc

View File

@ -1,7 +1,7 @@
from django import forms
from .models import EcUser, ContactInfo, SchoolInfo, AcademicInfo, HealthInfo, SelfEvaluation
from .models import HobbiesInterests, SocialPractice, FamilyInfo, AwardsPunishments
from .models import HobbiesInterests, SocialPractice, FamilyInfo, AwardsInfo, PunishmentsInfo
class BaiscInfoForm(forms.ModelForm):
class Meta:
@ -105,15 +105,21 @@ class FamilyInfoForm(forms.ModelForm):
}
# AwardsPunishments 表单
class AwardsPunishmentsForm(forms.ModelForm):
class AwardsInfoForm(forms.ModelForm):
class Meta:
model = AwardsPunishments
fields = ['award_name', 'award_date', 'award_organization', 'discipline_date', 'discipline_issue', 'discipline_outcome']
model = AwardsInfo
fields = ['award_name', 'award_date', 'award_organization']
labels = {
'award_name': '奖项名称',
'award_date': '获奖日期',
'award_organization': '颁奖机构',
}
class PunishmentsInfoForm(forms.ModelForm):
class Meta:
model = PunishmentsInfo
fields = ['discipline_date', 'discipline_issue', 'discipline_outcome']
labels = {
'discipline_date': '处分日期',
'discipline_issue': '处分问题',
'discipline_outcome': '处分结果',
@ -129,7 +135,8 @@ g_models = {
'hobbies_interests': HobbiesInterests,
'social_practice': SocialPractice,
'family_info': FamilyInfo,
'awards_punishments': AwardsPunishments
'awards_info': AwardsInfo,
'punishments_info': PunishmentsInfo
}
g_form_classes = {
@ -141,5 +148,6 @@ g_form_classes = {
'hobbies_interests_form': HobbiesInterestsForm,
'social_practice_form': SocialPracticeForm,
'family_info_form': FamilyInfoForm,
'awards_punishments_form': AwardsPunishmentsForm
'awards_info_form': AwardsInfoForm,
'punishments_info_form': PunishmentsInfoForm,
}

View File

@ -0,0 +1,91 @@
# Generated by Django 4.2.19 on 2025-03-01 14:45
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('ec_user', '0015_alter_hobbiesinterests_extracurricular_activities_and_more'),
]
operations = [
migrations.CreateModel(
name='AwardsInfo',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('award_name', models.CharField(max_length=100)),
('award_date', models.DateField()),
('award_organization', models.CharField(max_length=100)),
],
),
migrations.CreateModel(
name='PunishmentsInfo',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('discipline_date', models.DateField(blank=True, null=True)),
('discipline_issue', models.CharField(blank=True, max_length=255, null=True)),
('discipline_outcome', models.CharField(blank=True, max_length=255, null=True)),
],
),
migrations.AlterField(
model_name='ecuser',
name='age',
field=models.IntegerField(blank=True, null=True, verbose_name='年龄'),
),
migrations.AlterField(
model_name='ecuser',
name='dob',
field=models.DateField(blank=True, null=True, verbose_name='出生日期'),
),
migrations.AlterField(
model_name='ecuser',
name='ethnicity',
field=models.CharField(default='Unknown', max_length=50, verbose_name='民族'),
),
migrations.AlterField(
model_name='ecuser',
name='gender',
field=models.CharField(choices=[('M', 'Male'), ('F', 'Female'), ('O', 'Other')], default='M', max_length=1, verbose_name='性别'),
),
migrations.AlterField(
model_name='ecuser',
name='id_card_number',
field=models.CharField(max_length=18, unique=True, verbose_name='身份证号'),
),
migrations.AlterField(
model_name='ecuser',
name='name',
field=models.CharField(max_length=100, verbose_name='姓名'),
),
migrations.AlterField(
model_name='ecuser',
name='political_status',
field=models.CharField(blank=True, max_length=50, null=True, verbose_name='政治面貌'),
),
migrations.AlterField(
model_name='ecuser',
name='subject_usage_count',
field=models.IntegerField(default=5, verbose_name='使用次数限制'),
),
migrations.AlterField(
model_name='ecuser',
name='subjects',
field=models.ManyToManyField(blank=True, related_name='users', to='ec_user.subject', verbose_name='开放权限的科目'),
),
migrations.DeleteModel(
name='AwardsPunishments',
),
migrations.AddField(
model_name='punishmentsinfo',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='awardsinfo',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]

View File

@ -0,0 +1,28 @@
# Generated by Django 4.2.19 on 2025-03-01 14:47
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ec_user', '0016_awardsinfo_punishmentsinfo_alter_ecuser_age_and_more'),
]
operations = [
migrations.AlterField(
model_name='awardsinfo',
name='award_date',
field=models.DateField(blank=True, null=True),
),
migrations.AlterField(
model_name='awardsinfo',
name='award_name',
field=models.CharField(blank=True, max_length=100, null=True),
),
migrations.AlterField(
model_name='awardsinfo',
name='award_organization',
field=models.CharField(blank=True, max_length=100, null=True),
),
]

View File

@ -229,16 +229,24 @@ class FamilyInfo(models.Model):
}
return f"Family Info of {self.user.name}"
# AwardsPunishments奖惩情况表
class AwardsPunishments(models.Model):
# Awards奖情况表
class AwardsInfo(models.Model):
# 定义一个与EcUser一对多关联的外键
user = models.ForeignKey(EcUser, on_delete=models.CASCADE)
award_name = models.CharField(max_length=100,null=True, blank=True)
award_date = models.DateField(null=True, blank=True)
award_organization = models.CharField(max_length=100, null=True, blank=True)
def __str__(self):
return f"Awards of {self.user.name}"
# Punishments处分情况表
class PunishmentsInfo(models.Model):
# 定义一个与EcUser一对多关联的外键
user = models.ForeignKey(EcUser, on_delete=models.CASCADE)
award_name = models.CharField(max_length=100)
award_date = models.DateField()
award_organization = models.CharField(max_length=100)
discipline_date = models.DateField(null=True, blank=True)
discipline_issue = models.CharField(max_length=255, null=True, blank=True)
discipline_outcome = models.CharField(max_length=255, null=True, blank=True)
def __str__(self):
return f"Awards and Punishments of {self.user.name}"
return f"Punishments of {self.user.name}"

View File

@ -269,17 +269,33 @@
</div>
</form>
<form method="POST" action="/ec_user/all_info_edit/{{ user.id }}/awards_punishments/" >
<!--情况 -->
<form method="POST" action="/ec_user/all_info_edit/{{ user.id }}/awards_info/" >
<!--情况 -->
<div class="form-section">
<h4>情况</h4>
{{ awards_punishments_form.management_form }}
{% for form in awards_punishments_form %}
<h4>情况</h4>
{{ awards_info_form.management_form }}
{% for form in awards_info_form %}
<div class="border p-3 mb-3">
{{ form.as_p }}
</div>
{% empty %}
<p class="empty-message">没有奖惩情况记录。</p>
<p class="empty-message">没有奖励情况记录。</p>
{% endfor %}
<button type="submit" class="btn-submit">提交</button>
</div>
</form>
<form method="POST" action="/ec_user/all_info_edit/{{ user.id }}/punishments_info/" >
<!-- 处罚情况 -->
<div class="form-section">
<h4>处罚情况</h4>
{{ punishments_info_form.management_form }}
{% for form in punishments_info_form %}
<div class="border p-3 mb-3">
{{ form.as_p }}
</div>
{% empty %}
<p class="empty-message">没有处罚情况记录。</p>
{% endfor %}
<button type="submit" class="btn-submit">提交</button>
</div>

View File

@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Test Awards and Punishments API</title>
<title>Test Awards API</title>
<style>
body {
font-family: Arial, sans-serif;
@ -18,16 +18,16 @@
</style>
</head>
<body>
<h2>Test Awards and Punishments API</h2>
<h2>Test Awards API</h2>
<h3>Get Awards and Punishments</h3>
<h3>Get Awards</h3>
<label for="user_id_get">User ID:</label>
<input type="number" id="user_id_get" min="1" placeholder="Enter user ID">
<button onclick="getAwardsPunishments()">Get Awards and Punishments</button>
<button onclick="getAwards()">Get Awards</button>
<div id="get-result" class="message"></div>
<h3>Update Awards and Punishments</h3>
<h3>Update Awards</h3>
<label for="user_id_post">User ID:</label>
<input type="number" id="user_id_post" min="1" placeholder="Enter user ID">
<br><br>
@ -39,23 +39,15 @@
<br><br>
<label for="award_organization">Award Organization:</label>
<input type="text" id="award_organization" placeholder="Enter award organization">
<br><br>
<label for="discipline_date">Discipline Date (optional):</label>
<input type="date" id="discipline_date">
<br><br>
<label for="discipline_issue">Discipline Issue (optional):</label>
<input type="text" id="discipline_issue" placeholder="Enter discipline issue">
<br><br>
<label for="discipline_outcome">Discipline Outcome (optional):</label>
<input type="text" id="discipline_outcome" placeholder="Enter discipline outcome">
<br><br>
<button onclick="updateAwardsPunishments()">Update Awards and Punishments</button>
<button onclick="updateAwards()">Update Awards</button>
<div id="post-result" class="message"></div>
<script>
// Function to get awards and punishments via GET request
function getAwardsPunishments() {
// Function to get awards via GET request
function getAwards() {
const userId = document.getElementById('user_id_get').value;
const resultDiv = document.getElementById('get-result');
@ -64,7 +56,7 @@
return;
}
fetch(`/ec_user/awards_punishments/api/`, {
fetch(`/ec_user/awards_info/api/`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
@ -84,15 +76,12 @@
});
}
// Function to update awards and punishments via POST request
function updateAwardsPunishments() {
// Function to update awards via POST request
function updateAwards() {
const userId = document.getElementById('user_id_post').value;
const awardName = document.getElementById('award_name').value;
const awardDate = document.getElementById('award_date').value;
const awardOrganization = document.getElementById('award_organization').value;
const disciplineDate = document.getElementById('discipline_date').value;
const disciplineIssue = document.getElementById('discipline_issue').value;
const disciplineOutcome = document.getElementById('discipline_outcome').value;
const resultDiv = document.getElementById('post-result');
if (!userId || !awardName || !awardDate || !awardOrganization) {
@ -104,12 +93,9 @@
award_name: awardName,
award_date: awardDate,
award_organization: awardOrganization,
discipline_date: disciplineDate || null,
discipline_issue: disciplineIssue || null,
discipline_outcome: disciplineOutcome || null
};
fetch(`/ec_user/awards_punishments/api/`, {
fetch(`/ec_user/awards_info/api/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',

View File

@ -0,0 +1,114 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Test Awards and Punishments API</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 20px;
}
.message {
margin-top: 10px;
padding: 10px;
background-color: #f4f4f4;
border: 1px solid #ddd;
}
</style>
</head>
<body>
<h2>Test Punishments API</h2>
<h3>Get Punishments</h3>
<label for="user_id_get">User ID:</label>
<input type="number" id="user_id_get" min="1" placeholder="Enter user ID">
<button onclick="getPunishments()">Get Punishments</button>
<div id="get-result" class="message"></div>
<h3>Update Punishments</h3>
<label for="user_id_post">User ID:</label>
<input type="number" id="user_id_post" min="1" placeholder="Enter user ID">
<br><br>
<label for="discipline_date">Discipline Date (optional):</label>
<input type="date" id="discipline_date">
<br><br>
<label for="discipline_issue">Discipline Issue (optional):</label>
<input type="text" id="discipline_issue" placeholder="Enter discipline issue">
<br><br>
<label for="discipline_outcome">Discipline Outcome (optional):</label>
<input type="text" id="discipline_outcome" placeholder="Enter discipline outcome">
<br><br>
<button onclick="updatePunishments()">Update Punishments</button>
<div id="post-result" class="message"></div>
<script>
// Function to get punishments via GET request
function getPunishments() {
const userId = document.getElementById('user_id_get').value;
const resultDiv = document.getElementById('get-result');
if (!userId) {
resultDiv.textContent = "Please enter a valid user ID.";
return;
}
fetch(`/ec_user/awards_info/api/`, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'token': '486ef8198bb10ba6878eba95771c064ff64db81a'
},
})
.then(response => response.json())
.then(data => {
if (data.error) {
resultDiv.textContent = `Error: ${data.error}`;
} else {
resultDiv.textContent = JSON.stringify(data, null, 2);
}
})
.catch(error => {
resultDiv.textContent = `Error: ${error.message}`;
});
}
// Function to update punishments via POST request
function updatePunishments() {
const userId = document.getElementById('user_id_post').value;
const disciplineDate = document.getElementById('discipline_date').value;
const disciplineIssue = document.getElementById('discipline_issue').value;
const disciplineOutcome = document.getElementById('discipline_outcome').value;
const resultDiv = document.getElementById('post-result');
const postData = {
discipline_date: disciplineDate || null,
discipline_issue: disciplineIssue || null,
discipline_outcome: disciplineOutcome || null
};
fetch(`/ec_user/punishments_info/api/`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'token': '486ef8198bb10ba6878eba95771c064ff64db81a'
},
body: JSON.stringify(postData)
})
.then(response => response.json())
.then(data => {
if (data.error) {
resultDiv.textContent = `Error: ${data.error}`;
} else {
resultDiv.textContent = data.message;
}
})
.catch(error => {
resultDiv.textContent = `Error: ${error.message}`;
});
}
</script>
</body>
</html>

View File

@ -7,7 +7,7 @@ from . views import MyProtectedApiContactInfo, api_contact_info_test, MyProtecte
from . views import MyProtectedApiAcademicInfo, api_academic_info_test, MyProtectedApiHealthInfo, api_health_info_test
from . views import MyProtectedApiSelfEvaluationInfo, api_self_evaluation_test, MyProtectedFamilyInfo, api_family_info_test
from . views import MyProtectedApiHobbiesInterests, api_hobbies_interests_test, MyProtectedSocialPractice, api_social_practice_test
from . views import MyProtectedAwardsPunishments, api_awards_punishments_test , MyProtectedBasicUserInfo
from . views import MyProtectedAwardsInfo, MyProtectedPunishmentsInfo, api_awards_info_test, api_punishments_info_test , MyProtectedBasicUserInfo
from . views import all_info_form, all_info_edit
@ -45,8 +45,11 @@ urlpatterns = [
path('family_info/api/', MyProtectedFamilyInfo.as_view(), name='api_family_info'),
path('api_family_info_test/', api_family_info_test, name='api_family_info_test'),
path('awards_punishments/api/', MyProtectedAwardsPunishments.as_view(), name='api_awards_punishments'),
path('api_awards_punishments_test/', api_awards_punishments_test, name='api_awards_punishments_test'),
path('awards_info/api/', MyProtectedAwardsInfo.as_view(), name='api_awards_info'),
path('api_awards_info_test/', api_awards_info_test, name='api_awards_info_test'),
path('punishments_info/api/', MyProtectedPunishmentsInfo.as_view(), name='api_punishments_info'),
path('api_punishments_info_test/', api_punishments_info_test, name='api_punishments_info_test'),
path('all_info_form/<int:user_id>/', all_info_form, name='all_info_form'),

View File

@ -11,7 +11,7 @@ from django.contrib.auth.hashers import check_password, make_password # 导入
from .models import EcUser, ContactInfo, SchoolInfo, AcademicInfo, HealthInfo, SelfEvaluation
from .models import HobbiesInterests, SocialPractice, FamilyInfo, AwardsPunishments
from .models import HobbiesInterests, SocialPractice, FamilyInfo, AwardsInfo, PunishmentsInfo
from .forms import g_models, g_form_classes
@ -83,7 +83,7 @@ def all_info_form(request, user_id):
instances = {}
for key, model in g_models.items():
if key in ['hobbies_interests', 'social_practice', 'family_info', 'awards_punishments']:
if key in ['hobbies_interests', 'social_practice', 'family_info', 'awards_info', 'punishments_info']:
instances[key] = model.objects.filter(user=user) # 处理一对多关系
else:
instance, _ = model.objects.get_or_create(user=user)
@ -93,7 +93,7 @@ def all_info_form(request, user_id):
# 初始化所有表单
forms = {}
for form_key, form_class in g_form_classes.items():
if form_key in ['hobbies_interests_form', 'social_practice_form', 'family_info_form', 'awards_punishments_form']:
if form_key in ['hobbies_interests_form', 'social_practice_form', 'family_info_form', 'awards_info_form', 'punishments_info_form']:
queryset = instances[form_key[:-5]] # 获取对应模型的查询集
# 如果查询集为空,设置 extra=1 来允许添加空表单
@ -160,7 +160,8 @@ class MyProtectedUserInfo(APIView):
"family_info": FamilyInfo.objects.filter(user=request.user).exists(),
"hobbies_interests": HobbiesInterests.objects.filter(user=request.user).exists(),
"social_practice": SocialPractice.objects.filter(user=request.user).exists(),
"awards_punishments": AwardsPunishments.objects.filter(user=request.user).exists(),
"awards_info": AwardsInfo.objects.filter(user=request.user).exists(),
"punishments_info": PunishmentsInfo.objects.filter(user=request.user).exists(),
}
})
@ -604,10 +605,13 @@ class MyProtectedFamilyInfo(APIView):
return JsonResponse({"message": "Family info updated successfully"})
def api_awards_punishments_test(req):
return render(req, 'api_awards_punishments_test.html')
def api_awards_info_test(req):
return render(req, 'api_awards_info_test.html')
class MyProtectedAwardsPunishments(APIView):
def api_punishments_info_test(req):
return render(req, 'api_punishments_info_test.html')
class MyProtectedAwardsInfo(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
@ -615,21 +619,18 @@ class MyProtectedAwardsPunishments(APIView):
user = request.user
# 获取该用户的奖惩情况记录
awards_punishments = AwardsPunishments.objects.filter(user=user)
awards_punishments = AwardsInfo.objects.filter(user=user)
if awards_punishments.exists():
response_data = [
{
"award_name": ap.award_name,
"award_date": ap.award_date,
"award_organization": ap.award_organization,
"discipline_date": ap.discipline_date,
"discipline_issue": ap.discipline_issue,
"discipline_outcome": ap.discipline_outcome
"award_organization": ap.award_organization
} for ap in awards_punishments
]
return JsonResponse(response_data, safe=False)
else:
return JsonResponse({"error": "No awards or punishments found"}, status=404)
return JsonResponse({"error": "No awards found"}, status=404)
def post(self, request):
user = request.user
@ -639,21 +640,55 @@ class MyProtectedAwardsPunishments(APIView):
award_name = data.get("award_name")
award_date = data.get("award_date")
award_organization = data.get("award_organization")
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON format"}, status=400)
awards_punishment = AwardsInfo.objects.create(
user=user,
award_name=award_name,
award_date=award_date,
award_organization=award_organization,
)
return JsonResponse({"message": "Awards info updated successfully"})
class MyProtectedPunishmentsInfo(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.user
# 获取该用户的奖惩情况记录
awards_punishments = PunishmentsInfo.objects.filter(user=user)
if awards_punishments.exists():
response_data = [
{
"discipline_date": ap.discipline_date,
"discipline_issue": ap.discipline_issue,
"discipline_outcome": ap.discipline_outcome
} for ap in awards_punishments
]
return JsonResponse(response_data, safe=False)
else:
return JsonResponse({"error": "No punishments found"}, status=404)
def post(self, request):
user = request.user
# 处理 POST 请求,创建或更新奖惩情况记录
try:
data = json.loads(request.body)
discipline_date = data.get("discipline_date")
discipline_issue = data.get("discipline_issue")
discipline_outcome = data.get("discipline_outcome")
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON format"}, status=400)
# 创建或更新 AwardsPunishments 记录
awards_punishment = AwardsPunishments.objects.create(
awards_punishment = PunishmentsInfo.objects.create(
user=user,
award_name=award_name,
award_date=award_date,
award_organization=award_organization,
discipline_date=discipline_date,
discipline_issue=discipline_issue,
discipline_outcome=discipline_outcome
)
return JsonResponse({"message": "Awards and punishments info updated successfully"})
return JsonResponse({"message": "punishments info updated successfully"})