diagnose-backend/ec_user/views.py
2025-03-01 23:16:07 +08:00

694 lines
28 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from django.http import JsonResponse, HttpResponse
from django.contrib.auth import authenticate, login, logout
from django.shortcuts import render, redirect
from django.forms import modelformset_factory
from rest_framework.authtoken.models import Token # 导入 Token 模型
import json
from datetime import timedelta
from django.utils import timezone
from authentication.models import CustomToken
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, AwardsInfo, PunishmentsInfo
from .forms import g_models, g_form_classes
from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from authentication.authentication import CustomTokenAuthentication
def index_test(request):
return render(request, 'index.html')
def ec_login(request):
if request.method != 'POST':
return render(request, 'testlogin.html')
try:
data = json.loads(request.body)
username = data.get('username')
password = data.get('password')
except json.JSONDecodeError:
return JsonResponse({'error': 'Invalid JSON'}, status=400)
if not username or not password:
return JsonResponse({'error': 'Missing username or password'}, status=400)
user = authenticate(username=username, password=password)
if user is not None:
login(request, user)
# 生成 Token你可以选择使用自定义的 CustomToken
# token, created = Token.objects.get_or_create(user=user) # 使用 DRF 提供的 Token 模型
# 如果你使用的是自定义的 CustomToken
token, created = CustomToken.objects.get_or_create(user=user, defaults={'extra_info': 'your_value', 'expiration_date': timezone.now() + timedelta(days=7)})
if not created:
token.expiration_date = timezone.now() + timedelta(days=7)
token.save()
return JsonResponse({'message': 'Login Success!', 'token': token.key}) # 返回 token
else:
return JsonResponse({'error': 'Login Failed!'}, status=401)
class MyProtectedUserLogout(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.user
if user.is_authenticated:
# 删除与当前用户相关的 Token
CustomToken.objects.filter(user=user).delete()
# 进行登出操作
logout(request)
return JsonResponse({'message': 'Logout Successful'}, status=200)
else:
return JsonResponse({'error': 'User not authenticated'}, status=400)
def all_info_form(request, user_id):
try:
user = EcUser.objects.get(id=user_id)
except EcUser.DoesNotExist:
return render(request, 'error.html', {"message": "User not found"})
instances = {}
for key, model in g_models.items():
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)
instances[key] = instance
if request.method == 'GET':
# 初始化所有表单
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_info_form', 'punishments_info_form']:
queryset = instances[form_key[:-5]] # 获取对应模型的查询集
# 如果查询集为空,设置 extra=1 来允许添加空表单
if queryset.exists():
formset_class = modelformset_factory(queryset.model, form=form_class, extra=0)
else:
formset_class = modelformset_factory(queryset.model, form=form_class, extra=1)
# 使用 formset 渲染表单
forms[form_key] = formset_class(queryset=queryset)
else:
forms[form_key] = form_class(instance=instances[form_key[:-5]])
return render(request, 'all_info_form.html', {'user': user, **forms})
else:
return HttpResponse("Not implemented")
def all_info_edit(request, user_id, model_name):
try:
user = EcUser.objects.get(id=user_id)
except EcUser.DoesNotExist:
return render(request, 'error.html', {"message": "User not found"})
instances = g_models[model_name].objects.filter(user=user) # 处理一对多关系
print(instances)
formset_class = modelformset_factory(model=g_models[model_name], form=g_form_classes[model_name + '_form'], extra=0)
formset = formset_class(request.POST, queryset=instances)
print(instances)
if formset.is_valid():
instances = formset.save(commit=False)
instances[0].user = user
formset.save()
else:
return render(request, 'all_info_result.html', {'user': user, "model_name": model_name, "formset": formset})
return render(request, 'all_info_result.html', {'user': user, "model_name": model_name, "formset": None})
# ================= API 接口 =================
# +++++++++++++++++++++++++++++++++++++++++++=
class MyProtectedUserInfo(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
# 返回用户的 ID、用户名、剩余次数和主题列表
return JsonResponse({"user_id": request.user.id,
"name": request.user.name,
"username": request.user.username,
"remain_count": request.user.subject_usage_count,
"subject": list(request.user.subjects.values_list('name', flat=True)),
"fill_status":
{
"contact_info": ContactInfo.objects.filter(user=request.user).exists(),
"scholar_info": SchoolInfo.objects.filter(user=request.user).exists(),
"academic_info": AcademicInfo.objects.filter(user=request.user).exists(),
"health_info": HealthInfo.objects.filter(user=request.user).exists(),
"self_evaluation": SelfEvaluation.objects.filter(user=request.user).exists(),
"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_info": AwardsInfo.objects.filter(user=request.user).exists(),
"punishments_info": PunishmentsInfo.objects.filter(user=request.user).exists(),
}
})
class MyProtectedBasicUserInfo(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.user
# 获取用户信息并返回 JSON 格式
user_info = EcUser.objects.filter(id=user.id).first()
if user_info:
response_data = {
"name": user_info.name,
"gender": user_info.get_gender_display(),
"age": user_info.age,
"ethnicity": user_info.ethnicity,
"dob": user_info.dob,
"id_card_number": user_info.id_card_number,
"political_status": user_info.political_status
}
return JsonResponse(response_data)
else:
return JsonResponse({"error": "No user info found"}, status=404)
def post(self, request):
user = request.user
# 处理 POST 请求,更新用户信息
try:
data = json.loads(request.body)
name = data.get("name")
gender = data.get("gender")
age = data.get("age")
ethnicity = data.get("ethnicity")
dob = data.get("dob")
id_card_number = data.get("id_card_number")
political_status = data.get("political_status")
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON format"}, status=400)
# 查找或创建 EcUser
try:
user_info = EcUser.objects.get(id=user.id)
except EcUser.DoesNotExist:
return JsonResponse({"error": "User not found"}, status=404)
# 更新用户信息
user_info.name = name
user_info.gender = gender
user_info.age = age
user_info.ethnicity = ethnicity
user_info.dob = dob
user_info.id_card_number = id_card_number
user_info.political_status = political_status
user_info.save()
return JsonResponse({"message": "User info updated successfully"})
def api_contact_info_test(req):
return render(req, 'api_contact_info_test.html')
class MyProtectedApiContactInfo(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.user
# 获取联系信息并返回 JSON 格式
contact_info = ContactInfo.objects.filter(user=user).first()
if contact_info:
response_data = {
"home_address": contact_info.home_address,
"parent_contact": contact_info.parent_contact,
"student_contact": contact_info.student_contact,
"email": contact_info.email
}
return JsonResponse(response_data)
else:
return JsonResponse({"error": "No contact info found"}, status=404)
def post(self, request):
user = request.user
# 处理 POST 请求,更新用户的联系信息
try:
data = json.loads(request.body)
home_address = data.get("home_address")
parent_contact = data.get("parent_contact")
student_contact = data.get("student_contact")
email = data.get("email")
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON format"}, status=400)
# 查找或创建 ContactInfo
contact_info, created = ContactInfo.objects.get_or_create(user=user)
contact_info.home_address = home_address
contact_info.parent_contact = parent_contact
contact_info.student_contact = student_contact
contact_info.email = email
contact_info.save()
return JsonResponse({"message": "Contact info updated successfully"})
def api_school_info_test(req):
return render(req, 'api_school_info_test.html')
class MyProtectedApiSchoolInfo(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.user
# 获取学校信息并返回 JSON 格式
school_info = SchoolInfo.objects.filter(user=user).first()
if school_info:
response_data = {
"school_name": school_info.school_name,
"grade": school_info.grade,
"class_name": school_info.class_name,
"admission_date": school_info.admission_date,
"expected_graduation_date": school_info.expected_graduation_date
}
return JsonResponse(response_data)
else:
return JsonResponse({"error": "No school info found"}, status=404)
def post(self, request):
user = request.user
# 处理 POST 请求,更新学校信息
try:
data = json.loads(request.body)
school_name = data.get("school_name")
grade = data.get("grade")
class_name = data.get("class_name")
admission_date = data.get("admission_date")
expected_graduation_date = data.get("expected_graduation_date")
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON format"}, status=400)
# 查找或创建 SchoolInfo
school_info, created = SchoolInfo.objects.get_or_create(user=user)
school_info.school_name = school_name
school_info.grade = grade
school_info.class_name = class_name
school_info.admission_date = admission_date
school_info.expected_graduation_date = expected_graduation_date
school_info.save()
return JsonResponse({"message": "School info updated successfully"})
def api_academic_info_test(req):
return render(req, 'api_academic_info_test.html')
class MyProtectedApiAcademicInfo(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.user
# 获取学习情况信息并返回 JSON 格式
academic_info = AcademicInfo.objects.filter(user=user).first()
if academic_info:
response_data = {
"last_semester_score": str(academic_info.last_semester_score),
"this_semester_score": str(academic_info.this_semester_score),
"class_ranking": academic_info.class_ranking,
"strong_subject": academic_info.strong_subject,
"weak_subject": academic_info.weak_subject
}
return JsonResponse(response_data)
else:
return JsonResponse({"error": "No academic info found"}, status=404)
def post(self, request):
user = request.user
# 处理 POST 请求,更新用户的学习情况信息
try:
data = json.loads(request.body)
last_semester_score = data.get("last_semester_score")
this_semester_score = data.get("this_semester_score")
class_ranking = data.get("class_ranking")
strong_subject = data.get("strong_subject")
weak_subject = data.get("weak_subject")
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON format"}, status=400)
# 查找或创建 AcademicInfo
academic_info, created = AcademicInfo.objects.get_or_create(user=user)
academic_info.last_semester_score = last_semester_score
academic_info.this_semester_score = this_semester_score
academic_info.class_ranking = class_ranking
academic_info.strong_subject = strong_subject
academic_info.weak_subject = weak_subject
academic_info.save()
return JsonResponse({"message": "Academic info updated successfully"})
def api_health_info_test(req):
return render(req, 'api_health_info_test.html')
class MyProtectedApiHealthInfo(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.user
# 获取健康信息并返回 JSON 格式
health_info = HealthInfo.objects.filter(user=user).first()
if health_info:
response_data = {
"height": str(health_info.height),
"weight": str(health_info.weight),
"blood_type": health_info.blood_type,
"medical_history": health_info.medical_history,
"disability_status": health_info.disability_status,
"disability_category": health_info.disability_category,
"disability_grade": health_info.disability_grade
}
return JsonResponse(response_data)
else:
return JsonResponse({"error": "No health info found"}, status=404)
def post(self, request):
user = request.user
# 处理 POST 请求,更新用户的健康信息
try:
data = json.loads(request.body)
height = data.get("height")
weight = data.get("weight")
blood_type = data.get("blood_type")
medical_history = data.get("medical_history")
disability_status = data.get("disability_status")
disability_category = data.get("disability_category")
disability_grade = data.get("disability_grade")
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON format"}, status=400)
# 查找或创建 HealthInfo
health_info, created = HealthInfo.objects.get_or_create(user=user)
health_info.height = height
health_info.weight = weight
health_info.blood_type = blood_type
health_info.medical_history = medical_history
health_info.disability_status = disability_status
health_info.disability_category = disability_category
health_info.disability_grade = disability_grade
health_info.save()
return JsonResponse({"message": "Health info updated successfully"})
def api_self_evaluation_test(req):
return render(req, 'api_self_evaluation_test.html')
class MyProtectedApiSelfEvaluationInfo(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.user
# 获取自我评价信息并返回 JSON 格式
self_evaluation = SelfEvaluation.objects.filter(user=user).first()
if self_evaluation:
response_data = {
"strengths": self_evaluation.strengths,
"weaknesses": self_evaluation.weaknesses,
"study_attitude": self_evaluation.study_attitude,
"future_plans": self_evaluation.future_plans
}
return JsonResponse(response_data)
else:
return JsonResponse({"error": "No self evaluation found"}, status=404)
def post(self, request):
user = request.user
# 处理 POST 请求,更新用户的自我评价信息
try:
data = json.loads(request.body)
strengths = data.get("strengths")
weaknesses = data.get("weaknesses")
study_attitude = data.get("study_attitude")
future_plans = data.get("future_plans")
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON format"}, status=400)
# 查找或创建 SelfEvaluation
self_evaluation, created = SelfEvaluation.objects.get_or_create(user=user)
self_evaluation.strengths = strengths
self_evaluation.weaknesses = weaknesses
self_evaluation.study_attitude = study_attitude
self_evaluation.future_plans = future_plans
self_evaluation.save()
return JsonResponse({"message": "Self evaluation updated successfully"})
# =================== 以下字段是 一对多 ===================
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
def api_hobbies_interests_test(req):
return render(req, 'api_hobbies_interests_test.html')
class MyProtectedApiHobbiesInterests(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.user
# 获取该用户的所有兴趣爱好信息
hobbies_interests = HobbiesInterests.objects.filter(user=user)
if hobbies_interests.exists():
response_data = []
for entry in hobbies_interests:
response_data.append({
"interests": entry.interests,
"extracurricular_activities": entry.extracurricular_activities
})
return JsonResponse(response_data, safe=False)
else:
return JsonResponse({"error": "No hobbies and interests found"}, status=404)
def post(self, request):
user = request.user
# 处理 POST 请求,创建新的兴趣爱好记录
try:
data = json.loads(request.body)
interests = data.get("interests")
extracurricular_activities = data.get("extracurricular_activities")
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON format"}, status=400)
# 创建新的 HobbiesInterests 记录
new_entry = HobbiesInterests.objects.create(
user=user,
interests=interests,
extracurricular_activities=extracurricular_activities
)
return JsonResponse({"message": "Hobbies and interests added successfully"})
def api_social_practice_test(req):
return render(req, 'api_social_practice_test.html')
class MyProtectedSocialPractice(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.user
# 获取该用户的所有社会实践记录
social_practices = SocialPractice.objects.filter(user=user)
if social_practices.exists():
response_data = []
for entry in social_practices:
response_data.append({
"activity_name": entry.activity_name,
"activity_date": entry.activity_date,
"activity_location": entry.activity_location,
"activity_description": entry.activity_description,
"activity_outcome": entry.activity_outcome
})
return JsonResponse(response_data, safe=False)
else:
return JsonResponse({"error": "No social practice records found"}, status=404)
def post(self, request):
user = request.user
# 处理 POST 请求,创建新的社会实践记录
try:
data = json.loads(request.body)
activity_name = data.get("activity_name")
activity_date = data.get("activity_date")
activity_location = data.get("activity_location")
activity_description = data.get("activity_description")
activity_outcome = data.get("activity_outcome")
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON format"}, status=400)
# 创建新的 SocialPractice 记录
new_entry = SocialPractice.objects.create(
user=user,
activity_name=activity_name,
activity_date=activity_date,
activity_location=activity_location,
activity_description=activity_description,
activity_outcome=activity_outcome
)
return JsonResponse({"message": "Social practice record added successfully"})
def api_family_info_test(req):
return render(req, 'api_family_info_test.html')
class MyProtectedFamilyInfo(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.user
# 获取该用户的家庭情况记录
family_info = FamilyInfo.objects.filter(user=user).first()
if family_info:
response_data = {
"family_member": family_info.family_member,
"economic_status": family_info.economic_status
}
return JsonResponse(response_data)
else:
return JsonResponse({"error": "No family info found"}, status=404)
def post(self, request):
user = request.user
# 处理 POST 请求,创建或更新家庭情况记录
try:
data = json.loads(request.body)
family_member = data.get("family_member")
economic_status = data.get("economic_status")
except json.JSONDecodeError:
return JsonResponse({"error": "Invalid JSON format"}, status=400)
# 创建或更新 FamilyInfo 记录
family_info, created = FamilyInfo.objects.get_or_create(user=user)
family_info.family_member = family_member
family_info.economic_status = economic_status
family_info.save()
return JsonResponse({"message": "Family info updated successfully"})
def api_awards_info_test(req):
return render(req, 'api_awards_info_test.html')
def api_punishments_info_test(req):
return render(req, 'api_punishments_info_test.html')
class MyProtectedAwardsInfo(APIView):
authentication_classes = [CustomTokenAuthentication] # 使用自定义的 Token 认证
permission_classes = [IsAuthenticated] # 需要用户认证才能访问
def get(self, request):
user = request.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
} for ap in awards_punishments
]
return JsonResponse(response_data, safe=False)
else:
return JsonResponse({"error": "No awards found"}, status=404)
def post(self, request):
user = request.user
# 处理 POST 请求,创建或更新奖惩情况记录
try:
data = json.loads(request.body)
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)
awards_punishment = PunishmentsInfo.objects.create(
user=user,
discipline_date=discipline_date,
discipline_issue=discipline_issue,
discipline_outcome=discipline_outcome
)
return JsonResponse({"message": "punishments info updated successfully"})