dormitory.views 源代码

from django.db import transaction
from rest_framework import viewsets

# TODO: Leaky dependency
from utils.marker import fix_me
from generic.models import User
from app.models import NaturalPerson
from app.view.base import ProfileTemplateView
from dormitory.models import Dormitory, DormitoryAssignment, Agreement
from dormitory.serializers import (
    DormitoryAssignmentSerializer, DormitorySerializer,
    AgreementSerializerFixme, AgreementSerializer)
from questionnaire.models import AnswerSheet, AnswerText, Survey
from semester.api import next_semester


[文档] class DormitoryViewSet(viewsets.ReadOnlyModelViewSet): queryset = Dormitory.objects.all() serializer_class = DormitorySerializer
[文档] class DormitoryAssignmentViewSet(viewsets.ReadOnlyModelViewSet): queryset = DormitoryAssignment.objects.all() serializer_class = DormitoryAssignmentSerializer
[文档] class DormitoryAgreementViewSetFixme(viewsets.ReadOnlyModelViewSet): serializer_class = AgreementSerializerFixme
[文档] def get_queryset(self): # Only active students need to sign the agreement require_agreement = User.objects.filter(active=True, utype=User.Type.STUDENT).contains(self.request.user) if require_agreement: return Agreement.objects.filter(user=self.request.user) # A hack to return something, so that the frontend won't redirect official_user = User.objects.get(username='zz00000') Agreement.objects.get_or_create(user=official_user) return Agreement.objects.filter(user=official_user)
[文档] class DormitoryAgreementViewSet(viewsets.ReadOnlyModelViewSet): queryset = Agreement.objects.all() serializer_class = AgreementSerializer
[文档] class DormitoryRoutineQAView(ProfileTemplateView): template_name = 'dormitory/routine_QA.html' page_name = '生活习惯调研' need_prepare = False
[文档] def get_survey(self): return Survey.objects.get(title=f'宿舍生活习惯调研-{next_semester().year}')
[文档] def get(self): survey = self.get_survey() if AnswerSheet.objects.filter(creator=self.request.user, survey=survey).exists(): return self.render(submitted=True) return self.render(survey_iter=[ (question, question.choices.order_by('order')) for question in survey.questions.order_by('order') ])
[文档] def post(self): survey = self.get_survey() assert not AnswerSheet.objects.filter(creator=self.request.user, survey=survey).exists() with transaction.atomic(): sheet = AnswerSheet.objects.create(creator=self.request.user, survey=survey) for question in survey.questions.order_by('order'): answer = self.request.POST.get(str(question.order)) if answer is None: assert not question.required, f"必填题{question.order}未作答" continue AnswerText.objects.create(question=question, answersheet=sheet, body=answer) return self.render(submitted=True)
[文档] class DormitoryAssignResultView(ProfileTemplateView): template_name = 'dormitory/assign_result.html' page_name = '宿舍分配结果' http_method_names = ['get'] need_prepare = False
[文档] def get(self): self.show_dorm_assign() return self.render()
[文档] def show_dorm_assign(self): user = self.request.user try: assignment = DormitoryAssignmentViewSet.queryset.get(user=user) dorm_assignment = DormitoryAssignmentViewSet.queryset.filter( dormitory=assignment.dormitory) roommates = [NaturalPerson.objects.get_by_user(assign.user) for assign in dorm_assignment.exclude(user=user)] self.extra_context.update( dorm_assigned=True, name=user.get_full_name(), dorm_id=assignment.dormitory.id, bed_id=assignment.bed_id, roommates=roommates, ) except DormitoryAssignment.DoesNotExist: self.extra_context.update(dorm_assigned=False)
[文档] class AgreementView(ProfileTemplateView): template_name = 'dormitory/agreement.html' page_name = '住宿协议' need_prepare = False
[文档] def get(self): return self.render()
[文档] @fix_me def post(self): Agreement.objects.get_or_create(user=self.request.user) from django.shortcuts import redirect return redirect("/welcome")