diff --git a/ITShowPlatform/settings.py b/ITShowPlatform/settings.py index 75d99b5..6c7eed6 100644 --- a/ITShowPlatform/settings.py +++ b/ITShowPlatform/settings.py @@ -37,8 +37,8 @@ ALLOWED_HOSTS = ["*"] INSTALLED_APPS = [ - 'corsheaders', 'simpleui', + 'corsheaders', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', @@ -157,6 +157,8 @@ EMAIL_HOST_PASSWORD = conf.get("email","EMAIL_HOST_PASSWORD") # 密码 (注意 EMAIL_USE_SSL = conf.get("email","EMAIL_USE_SSL") # 一般都为False EMAIL_FROM = conf.get("email","EMAIL_FROM") # 邮箱来自 +SIMPLEUI_HOME_INFO = False +SIMPLEUI_ANALYSIS = False ADMINS = ( ('ladeng', '2312936963@qq.com'), diff --git a/apps/comments/apps.py b/apps/comments/apps.py index 3b304b2..1aa9029 100644 --- a/apps/comments/apps.py +++ b/apps/comments/apps.py @@ -4,3 +4,4 @@ from django.apps import AppConfig class CommentsConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.comments' + verbose_name = '弹幕管理' diff --git a/apps/comments/serializers.py b/apps/comments/serializers.py index 0231041..616e4a4 100644 --- a/apps/comments/serializers.py +++ b/apps/comments/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers from .models import * -from utils.get_msg import get_msg +from utils.util import get_msg class CommentsInfo(serializers.ModelSerializer): diff --git a/apps/comments/views.py b/apps/comments/views.py index 054bc86..8f04bf8 100644 --- a/apps/comments/views.py +++ b/apps/comments/views.py @@ -7,7 +7,7 @@ from rest_framework.response import Response from .models import * from .serializers import CommentsInfo from django.utils import timezone -from utils.get_msg import get_msg +from utils.util import get_msg from django.views.decorators.csrf import csrf_exempt # Create your views here. diff --git a/apps/enroll/apps.py b/apps/enroll/apps.py index 8c53509..fed3364 100644 --- a/apps/enroll/apps.py +++ b/apps/enroll/apps.py @@ -4,3 +4,4 @@ from django.apps import AppConfig class EnrollConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.enroll' + verbose_name = '报名管理' diff --git a/apps/enroll/email.py b/apps/enroll/email.py index eb4b7ce..5523c02 100644 --- a/apps/enroll/email.py +++ b/apps/enroll/email.py @@ -44,7 +44,7 @@ def send_code_email(email): email_title = "注册激活" # file = open("/email_body") file = open(os.path.join(BASE_DIR, "enroll", "email_body")) - email_body = str(file.read).format(code) + email_body = str(file.read()).format(code) # 发送邮件 send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email]) if not send_status: diff --git a/apps/enroll/serializers.py b/apps/enroll/serializers.py index 2edcee9..08d3ecf 100644 --- a/apps/enroll/serializers.py +++ b/apps/enroll/serializers.py @@ -3,15 +3,14 @@ from rest_framework.validators import UniqueValidator from apps.enroll.models import NewMember, EmailVerifyRecord from apps.history.models import Department import time -from utils.get_msg import get_msg +from utils.util import get_msg class DepartmentSerializer(serializers.ModelSerializer): """获取部门信息""" - class Meta: model = Department - fields = ["department_cn", "picture"] + fields = ["id","department_cn", "icon"] class NewMemberSerializer(serializers.ModelSerializer): diff --git a/apps/enroll/urls.py b/apps/enroll/urls.py index 697301c..5d1da5d 100644 --- a/apps/enroll/urls.py +++ b/apps/enroll/urls.py @@ -4,7 +4,7 @@ from . import views # from rest_framework.routers import DefaultRouter urlpatterns = [ - path("department_cn/", views.DepartmentMessageView.as_view()), + path("department/", views.DepartmentMessageView.as_view()), path("sign_up/", views.SignUpView.as_view()), path("sign_up/verification_code/", views.SendEmailView.as_view()), # path("sign_up/", views.Sign_in.as_view({"get": "get"})) diff --git a/apps/enroll/views.py b/apps/enroll/views.py index 3889091..1e24a73 100644 --- a/apps/enroll/views.py +++ b/apps/enroll/views.py @@ -8,7 +8,7 @@ from rest_framework import status from rest_framework.views import APIView from apps.enroll.email import send_code_email from django.views.decorators.csrf import csrf_exempt -from utils.get_msg import get_msg +from utils.util import get_msg import re import time @@ -21,7 +21,6 @@ class DepartmentMessageView(GenericAPIView): def get(self, request): serializer = self.get_serializer(instance=self.get_queryset(), many=True) - # print(request.query_params) if request.query_params: return Response({"code": 40000, "msg": get_msg("40000")}) return Response({"code": 20000, "msg": get_msg("20000"), "data": serializer.data}) diff --git a/apps/history/admin.py b/apps/history/admin.py index d41a0e2..08203f1 100644 --- a/apps/history/admin.py +++ b/apps/history/admin.py @@ -5,4 +5,3 @@ from .models import * admin.site.register(Department) admin.site.register(History) admin.site.register(Members) -#admin.site.register(DepartmentName) diff --git a/apps/history/apps.py b/apps/history/apps.py index 40bfd45..582a0b2 100644 --- a/apps/history/apps.py +++ b/apps/history/apps.py @@ -4,3 +4,4 @@ from django.apps import AppConfig class TodoListConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.history' + verbose_name = '历史部门管理' diff --git a/apps/history/models.py b/apps/history/models.py index a92ee31..b36ba09 100644 --- a/apps/history/models.py +++ b/apps/history/models.py @@ -1,14 +1,15 @@ from django.db import models from django.core.validators import MaxValueValidator, MinValueValidator from datetime import datetime - +from utils.ImageStorage import ImageStorage class Department(models.Model): - id = models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='部门ID') + id = models.BigAutoField(auto_created=True, primary_key=True, verbose_name='部门ID') # did = models.IntegerField("部门ID") department_cn = models.CharField("部门名称", max_length=10) # 如“程序部” department_en = models.CharField("部门英文名称", max_length=30) # 如“程序部” - picture = models.ImageField(verbose_name="部门图标", default=0) + icon = models.ImageField(verbose_name="部门图标", default=0,storage=ImageStorage()) + background = models.ImageField(verbose_name="部门图标", default=0, storage=ImageStorage()) content = models.CharField("内容", max_length=800) # 如部门介绍/部门要求 introduction = models.CharField("介绍", max_length=800) # 如部门介绍/部门要求 status = models.SmallIntegerField("部门状态", choices=[(0, "解散"), (1, "健在")], default=1) @@ -25,7 +26,7 @@ class History(models.Model): # grade = models.IntegerField("年级") years = models.IntegerField("年份", default=int(datetime.now().strftime('%Y')), validators=[ MaxValueValidator(2300), - MinValueValidator(2010) + MinValueValidator(2000) ]) # did = models.IntegerField("部门ID") # did = models.ForeignKey(Department, on_delete=models.DO_NOTHING(), related_name="history", verbose_name="部门id") @@ -37,14 +38,17 @@ class History(models.Model): verbose_name_plural = '历史表' def __str__(self): - return self.department + return self.department.department_cn class Members(models.Model): # 默认id作为成员id - avatar = models.ImageField("头像", upload_to="avatar", blank=True) + avatar = models.ImageField("头像", upload_to="avatar", blank=True,default="default/user.jpg",storage=ImageStorage()) # did = models.IntegerField("所属部门ID", default=0) - grade = models.IntegerField("年级") + years = models.IntegerField("加入社团年份", default=int(datetime.now().strftime('%Y')), validators=[ + MaxValueValidator(2300), + MinValueValidator(2000) + ]) name = models.CharField("成员姓名", max_length=10) motto = models.CharField("座右铭", max_length=30) # department_cn = models.CharField("所属部门", max_length=10) diff --git a/apps/history/serializers.py b/apps/history/serializers.py index ad69345..a34f69d 100644 --- a/apps/history/serializers.py +++ b/apps/history/serializers.py @@ -1,24 +1,29 @@ -import re +import re,os from rest_framework import serializers +from ITShowPlatform.settings import BASE_DIR from apps.history import * from apps.history.models import Department, Members, History -def validate_department(value): - reg = re.compile(r'^[\u4e00-\u9fa5A-Za-z]*$') - if not reg.match(value): - raise serializers.ValidationError("42011-部门名称中只能输入汉字或英文") - -def validate_department_en(value): - reg = re.compile(r'^[A-Za-z][A-Za-z\s]*$') - if not reg.match(value): - raise serializers.ValidationError("42010-部门英文名称中只能输入英文") -def name_validate(value): - reg = re.compile(r'^[\u4e00-\u9fa5A-Za-z]*$') - if not reg.match(value): - raise serializers.ValidationError("42012-姓名只能输入汉字或英文") +# def validate_department(value): +# reg = re.compile(r'^[\u4e00-\u9fa5A-Za-z]*$') +# if not reg.match(value): +# raise serializers.ValidationError("42011-部门名称中只能输入汉字或英文") +# +# +# def validate_department_en(value): +# reg = re.compile(r'^[A-Za-z][A-Za-z\s]*$') +# if not reg.match(value): +# raise serializers.ValidationError("42010-部门英文名称中只能输入英文") +# +# +# def name_validate(value): +# reg = re.compile(r'^[\u4e00-\u9fa5A-Za-z]*$') +# if not reg.match(value): +# raise serializers.ValidationError("42012-姓名只能输入汉字或英文") + # # def validate_avatar(value): @@ -26,91 +31,189 @@ def name_validate(value): # return s -class DepartmentSerializer(serializers.Serializer): - did = serializers.IntegerField(required=True, error_messages={"blank": '41010-部门ID不能为空', "invalid": '42020-类型错误'}) - department = serializers.CharField(max_length=10, required=True, trim_whitespace=True, - validators=[validate_department], - error_messages={"max_length": '42021-部门名称长度过长', "blank": '41011-部门名称不能为空'}) - department_en = serializers.CharField(max_length=30, required=True, trim_whitespace=True, - validators=[validate_department_en], - error_messages={"max_length": '42022-部门英文名称长度过长', - "blank": '41012-部门英文名称不能为空'}) - content = serializers.CharField(max_length=800, required=True, trim_whitespace=True, - error_messages={"max_length": '42023-内容过长', "blank": '41013-内容不能为空'}) - introduction = serializers.CharField(max_length=800, required=True, trim_whitespace=True, - error_messages={"max_length": '42024-介绍内容过长', "blank": '41014-介绍内容不能为空'}) +# class DepartmentSerializer(serializers.Serializer): +# did = serializers.IntegerField(required=True, error_messages={"blank": '41010-部门ID不能为空', "invalid": '42020-类型错误'}) +# department_cn = serializers.CharField(max_length=10, required=True, trim_whitespace=True, +# validators=[validate_department], +# error_messages={"max_length": '42021-部门名称长度过长', "blank": '41011-部门名称不能为空'}) +# department_en = serializers.CharField(max_length=30, required=True, trim_whitespace=True, +# validators=[validate_department_en], +# error_messages={"max_length": '42022-部门英文名称长度过长', +# "blank": '41012-部门英文名称不能为空'}) +# content = serializers.CharField(max_length=800, required=True, trim_whitespace=True, +# error_messages={"max_length": '42023-内容过长', "blank": '41013-内容不能为空'}) +# introduction = serializers.CharField(max_length=800, required=True, trim_whitespace=True, +# error_messages={"max_length": '42024-介绍内容过长', "blank": '41014-介绍内容不能为空'}) +# +# # class Meta: +# # model = Department +# # fields = ('did', 'department_en', 'department_cn', 'part', 'title', 'content') +# +# def create(self, validated_data): +# return Department.objects.create(**validated_data) +# +# def update(self, instance, validated_data): +# instance.content = validated_data.get("content", instance.content) +# instance.department_cn = validated_data.get("department_cn", instance.department_cn) +# instance.department_en = validated_data.get("department_en", instance.department_en) +# instance.id = validated_data.get("id", instance.id) +# instance.title = validated_data.get("title", instance.title) +# instance.part = validated_data.get("part", instance.part) +# instance.save() +# return instance - # class Meta: - # model = Department - # fields = ('did', 'department_en', 'department', 'part', 'title', 'content') +class DepartmentSerializer(serializers.ModelSerializer): + class Meta: + model = Department + fields = "__all__" - def create(self, validated_data): - return Department.objects.create(**validated_data) + extra_kwargs = { + "department_cn": { + "error_messages": { + "max_length": '42021-部门名称长度过长', + "blank": '41011-部门名称不能为空' + } + }, + "department_en": { + "error_messages": { + "max_length": '42022-部门英文名称长度过长', + "blank": '41012-部门英文名称不能为空' + } + }, + "content": { + "error_messages": { + "max_length": '42023-内容过长', + "blank": '41013-内容不能为空' + } + }, + "introduction": { + "error_messages": { + "max_length": '42024-介绍内容过长', + "blank": '41014-介绍内容不能为空' + } + } + } - def update(self, instance, validated_data): - instance.content = validated_data.get("content", instance.content) - instance.department = validated_data.get("department", instance.department) - instance.department_en = validated_data.get("department_en", instance.department_en) - instance.id = validated_data.get("id", instance.id) - instance.title = validated_data.get("title", instance.title) - instance.part = validated_data.get("part", instance.part) - instance.save() - return instance + def validate_department_cn(self, data): + reg = re.compile(r'^[\u4e00-\u9fa5A-Za-z]*$') + if not reg.match(data): + raise serializers.ValidationError("42011-部门名称中只能输入汉字或英文") + return data + + def validate_department_en(self, data): + reg = re.compile(r'^[A-Za-z][A-Za-z\s]*$') + if not reg.match(data): + raise serializers.ValidationError("42010-部门英文名称中只能输入英文") + return data + + def validate_name(self, data): + reg = re.compile(r'^[\u4e00-\u9fa5A-Za-z]*$') + if not reg.match(data): + raise serializers.ValidationError("42012-姓名只能输入汉字或英文") + return data + + def validate_id(self,data): + obj = Department.objects.filter(id=data) + if not obj: + raise serializers.ValidationError("查询的部门不存在") -class MembersSerializer(serializers.HyperlinkedModelSerializer): - - did = serializers.IntegerField(required=True, error_messages={"blank": '41010-部门ID不能为空', "invalid": '42020-类型错误'}) - department = serializers.CharField(max_length=10, required=True, trim_whitespace=True, - error_messages={"max_length": '42021-部门名称过长', "blank": '41011-部门名称不能为空'}) - grade = serializers.IntegerField(required=True, min_value=2001, max_value=2022, - error_messages={"max_value": '42025-年级数过大', "blank": "41015-年级数不能为空", - "min_value": '42026-年级数过小'}) - name = serializers.CharField(required=True, trim_whitespace=True, max_length=6, - error_messages={"blank": '41016-姓名不能为空', "max_length": '42027-姓名过长'}) - motto = serializers.CharField(required=False, trim_whitespace=True, max_length=25, validators=[name_validate], - error_messages={"max_length": '42028-座右铭过长'}) - # avatar = serializers.ImageField(validators=[validate_avatar]) +# class MembersSerializer(serializers.HyperlinkedModelSerializer): +# did = serializers.IntegerField(required=True, error_messages={"blank": '41010-部门ID不能为空', "invalid": '42020-类型错误'}) +# department = serializers.CharField(max_length=10, required=True, trim_whitespace=True, +# error_messages={"max_length": '42021-部门名称过长', "blank": '41011-部门名称不能为空'}) +# grade = serializers.IntegerField(required=True, min_value=2001, max_value=2022, +# error_messages={"max_value": '42025-年级数过大', "blank": "41015-年级数不能为空", +# "min_value": '42026-年级数过小'}) +# name = serializers.CharField(required=True, trim_whitespace=True, max_length=6, +# error_messages={"blank": '41016-姓名不能为空', "max_length": '42027-姓名过长'}) +# motto = serializers.CharField(required=False, trim_whitespace=True, max_length=25, validators=[name_validate], +# error_messages={"max_length": '42028-座右铭过长'}) +# +# # avatar = serializers.ImageField(validators=[validate_avatar]) +# +# class Meta: +# model = Members +# fields = ('did', 'department_cn', 'grade', 'name', 'motto') +# +# def create(self, validated_data): +# return Members.objects.create(**validated_data) +# +# def update(self, instance, validated_data): +# instance.did = validated_data.get("did", instance.did) +# instance.department_cn = validated_data.get("department_cn", instance.department_cn) +# instance.grade = validated_data.get("grade", instance.grade) +# instance.name = validated_data.get("name", instance.name) +# instance.motto = validated_data.get("motto", instance.motto) +# instance.avatar = validated_data.get("avatar", instance.avatar) +# instance.save() +# return instance +class MembersSerializer(serializers.ModelSerializer): + department = serializers.CharField(source="department.department_cn") class Meta: model = Members - fields = ('did', 'department', 'grade', 'name', 'motto') + fields = ("id",'department', 'years', 'name', 'motto','avatar') - def create(self, validated_data): - return Members.objects.create(**validated_data) + extra_kwargs = { + "department": { + "error_messages": { + "max_length": '42021-部门名称过长', + "blank": '41011-部门名称不能为空' + } + }, + "grade": { + "error_messages": { + "max_value": '42025-年级数过大', + "blank": "41015-年级数不能为空", + "min_value": '42026-年级数过小' + } + }, + "name": { + "error_messages": { + "blank": '41016-姓名不能为空', + "max_length": '42027-姓名过长' + } + }, + "motto": { + "error_messages": { + "max_length": '42028-座右铭过长' + } + } - def update(self, instance, validated_data): - instance.did = validated_data.get("did", instance.did) - instance.department = validated_data.get("department", instance.department) - instance.grade = validated_data.get("grade", instance.grade) - instance.name = validated_data.get("name", instance.name) - instance.motto = validated_data.get("motto", instance.motto) - instance.avatar = validated_data.get("avatar", instance.avatar) - instance.save() - return instance + } -class HistorySerializer(serializers.Serializer): - grade = serializers.IntegerField(required=True, min_value=2001, max_value=2022, - error_messages={"max_value": '42025-年级数过大', "blank": "41015-年级数不能为空", - "min_value": '42026-年级数过小'}) - did = serializers.IntegerField(required=True, error_messages={"blank": '41010-部门ID不能为空', "invalid": '42020-类型错误'}) - department = serializers.CharField(max_length=10, required=True, trim_whitespace=True, - validators=[validate_department], - error_messages={"max_length": '42021-部门名称过长', "blank": '41011-部门名称不能为空'}) - # class Meta: - # model = History - # fields = ('grade', 'did', 'department') - # - def create(self, validated_data): - return History.objects.create(**validated_data) +# class HistorySerializer(serializers.Serializer): +# grade = serializers.IntegerField(required=True, min_value=2001, max_value=2022, +# error_messages={"max_value": '42025-年级数过大', "blank": "41015-年级数不能为空", +# "min_value": '42026-年级数过小'}) +# did = serializers.IntegerField(required=True, error_messages={"blank": '41010-部门ID不能为空', "invalid": '42020-类型错误'}) +# department = serializers.CharField(max_length=10, required=True, trim_whitespace=True, +# validators=[validate_department], +# error_messages={"max_length": '42021-部门名称过长', "blank": '41011-部门名称不能为空'}) +# +# # class Meta: +# # model = History +# # fields = ('grade', 'did', 'department_cn') +# # +# +# def create(self, validated_data): +# return History.objects.create(**validated_data) +# +# def update(self, instance, validated_data): +# instance.department_cn = validated_data.get("department_cn", instance.department_cn) +# instance.grade = validated_data.get("grade", instance.grade) +# instance.did = validated_data.get("did", instance.did) +# instance.save() +# return instance - def update(self, instance, validated_data): - instance.department = validated_data.get("department", instance.department) - instance.grade = validated_data.get("grade", instance.grade) - instance.did = validated_data.get("did", instance.did) - instance.save() - return instance +class HistorySerializer(serializers.ModelSerializer): + department = serializers.CharField(source="department.department_cn") + id = serializers.IntegerField(source="department.id") + class Meta: + model = History + fields = ('id', 'department') diff --git a/apps/history/urls.py b/apps/history/urls.py index e9001a9..57cbe65 100644 --- a/apps/history/urls.py +++ b/apps/history/urls.py @@ -1,10 +1,10 @@ from django.conf.urls.static import static from ITShowPlatform import settings from django.urls import path -from apps.history.views import DepartmentViewSet, MemberViewSet, HistoryViewSet +from apps.history.views import DepartmentMessageView, MemberViewSet, HistoryViewSet urlpatterns = [ - path('department_cn/', DepartmentViewSet.as_view()), + path('department_info/', DepartmentMessageView.as_view()), path('member/', MemberViewSet.as_view()), path('history/', HistoryViewSet.as_view()), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/apps/history/views.py b/apps/history/views.py index c1d7e2e..5a8a671 100644 --- a/apps/history/views.py +++ b/apps/history/views.py @@ -1,36 +1,67 @@ +from rest_framework.generics import GenericAPIView from rest_framework.views import APIView -from apps.history import * from rest_framework.response import Response from django.db.models import Q from django.utils.decorators import method_decorator from django.views.decorators.csrf import csrf_exempt +from utils.util import get_msg from apps.history.models import Members, History, Department from apps.history.serializers import MembersSerializer, HistorySerializer, DepartmentSerializer +import configparser,os +from ITShowPlatform.settings import BASE_DIR,MEDIA_URL +conf = configparser.RawConfigParser() + +conf.read(os.path.join(BASE_DIR, "config.ini"), encoding="utf-8") + +# class DepartmentViewSet(APIView): +# # 获取部门信息 +# @method_decorator(csrf_exempt) +# def get(self, request): +# response = { +# "code": 20000, +# "msg": "成功", +# } +# obj = Department.objects.all().filter(did=request.GET.get('did')).first() # 获取符合did的DepartmentObject +# # (默认每个部门只对应一个object) +# d = {'did': obj.did, 'department_cn': obj.department_cn, 'department_en': obj.department_en, 'content': obj.content, +# 'introduction': obj.introduction} # 将其转为字典类(用于放入serializer检验) +# serializer = DepartmentSerializer(data=d) +# if serializer.is_valid(): +# response['data'] = serializer.data # 在data里返回想得到的信息 +# return Response(data=response) +# key = list(serializer.errors.keys())[0] # 得到错误信息的keys中的第一个key +# # 用一个key得到一个错误信息,一个错误信息中的错误码与detail用“-”隔开, 通过split分开 +# value = str(list(serializer.errors.get(key))[0]).split("-") +# response['code'] = int(value[0]) +# response['msg'] = value[1] +# return Response(data=response) + +class DepartmentMessageView(GenericAPIView): + """获取部门信息""" -class DepartmentViewSet(APIView): - # 获取部门信息 - @method_decorator(csrf_exempt) def get(self, request): - response = { - "code": 20000, - "msg": "成功", - } - obj = Department.objects.all().filter(did=request.GET.get('did')).first() # 获取符合did的DepartmentObject - # (默认每个部门只对应一个object) - d = {'did': obj.did, 'department_cn': obj.department_cn, 'department_en': obj.department_en, 'content': obj.content, - 'introduction': obj.introduction} # 将其转为字典类(用于放入serializer检验) - serializer = DepartmentSerializer(data=d) - if serializer.is_valid(): - response['data'] = serializer.data # 在data里返回想得到的信息 - return Response(data=response) - key = list(serializer.errors.keys())[0] # 得到错误信息的keys中的第一个key - # 用一个key得到一个错误信息,一个错误信息中的错误码与detail用“-”隔开, 通过split分开 - value = str(list(serializer.errors.get(key))[0]).split("-") - response['code'] = int(value[0]) - response['msg'] = value[1] - return Response(data=response) + queryset = Department.objects.all() + + if request.query_params: + try: + serializer = DepartmentSerializer(instance=queryset.get(id=request.query_params['id'])) + department_data = dict(serializer.data) + department_data["background"] = conf.get("Django", "Host") + department_data["background"] + department_data["icon"] = conf.get("Django", "Host") + department_data["icon"] + return Response({"code": 20000, "msg": get_msg("20000"), "data": department_data}) + except Department.DoesNotExist: + return Response({"code": 40000, "msg": "查询部门不存在"}) + # except TypeError: + # return Response({"code": 40000, "msg": "查询部门不存在"}) + else: + serializer = DepartmentSerializer(instance=queryset, many=True) + department_data = dict(serializer.data) + department_data["background"] = conf.get("Django", "Host") + department_data["background"] + department_data["icon"] = conf.get("Django", "Host") + department_data["icon"] + return Response({"code": 20000, "msg": get_msg("20000"), "data": department_data}) + # print(request.query_params) class MemberViewSet(APIView): @@ -41,32 +72,42 @@ class MemberViewSet(APIView): "code": 20000, "msg": "成功", } - grade = request.GET.get('grade') - did = request.GET.get('did') - queryset = Members.objects.all().filter(Q(did=did) & Q(grade=grade)) # 获得所有符合要求的object - l = [] # 建一个列表用于存储最终输出的data - # 对符合要求的每一个object都转为字典并通过serializer检验数据是否合法 - for x in queryset: - avatar = str(x.avatar) - if avatar == '': - avatar = "default/user.jpg" - # 将符合要求的一个object都转为字典 - d = {'id': x.id, 'did': x.did, 'grade': x.grade, 'department_cn': x.department_cn, 'motto': x.motto, - 'name': x.name, - 'avatar': avatar} # 将路径转为字符串格式 - serializer = MembersSerializer(data=d) - if serializer.is_valid(): - l.append(d) # 将合法数据存入l列表中并继续进行下一个循环 - continue - # 若出现不合法数据则将错误信息返回前端 - key = list(serializer.errors.keys())[0] # 得到错误信息的keys中的第一个key - # 用一个key得到一个错误信息,一个错误信息中的错误码与detail用“-”隔开, 通过split分开 - value = str(list(serializer.errors.get(key))[0]).split("-") - response['code'] = int(value[0]) - response['msg'] = value[1] + years = request.GET.get('years') + department_id = request.GET.get('department_id') + try: + queryset = Members.objects.all().filter(Q(department_id=department_id) & Q(years=years)) # 获得所有符合要求的object + except Members.DoesNotExist: + response["code"] = 40000 + response["msg"] = "查询部门不存在" return Response(data=response) - response['data'] = l - return Response(data=response) + + serializer = MembersSerializer(instance=queryset, many=True) + for i in serializer.data: + i["avatar"] = (conf.get("Django","Host") + i["avatar"]) + return Response({"code": 20000, "msg": get_msg("20000"), "data": serializer.data}) + # l = [] # 建一个列表用于存储最终输出的data + # 对符合要求的每一个object都转为字典并通过serializer检验数据是否合法 + # for x in queryset: + # # avatar = str(x.avatar) + # # if avatar == '': + # # avatar = "default/user.jpg" + # # 将符合要求的一个object都转为字典 + # # d = {'id': x.id, 'department_id': x.department_id, 'grade': x.grade, 'department_cn': x.department_cn, 'motto': x.motto, + # # 'name': x.name, + # # 'avatar': avatar} # 将路径转为字符串格式 + # serializer = MembersSerializer(data=x) + # #if serializer.is_valid(): + # l.append(d) # 将合法数据存入l列表中并继续进行下一个循环 + # continue + # 若出现不合法数据则将错误信息返回前端 + # key = list(serializer.errors.keys())[0] # 得到错误信息的keys中的第一个key + # # 用一个key得到一个错误信息,一个错误信息中的错误码与detail用“-”隔开, 通过split分开 + # value = str(list(serializer.errors.get(key))[0]).split("-") + # response['code'] = int(value[0]) + # response['msg'] = value[1] + # return Response(data=response) + # response['data'] = l + # return Response(data=response) class HistoryViewSet(APIView): @@ -77,32 +118,43 @@ class HistoryViewSet(APIView): "code": 20000, "msg": "成功", } - ser = History.objects.all() # 获取全部历史列表信息 - # 同上,对每一个object进行判断 - for x in ser: - d = {'did': x.did, 'grade': x.grade, 'department_cn': x.department_cn} - serializer = HistorySerializer(data=d) - if serializer.is_valid(): - continue - key = list(serializer.errors.keys())[0] # 得到错误信息的keys中的第一个key - # 用一个key得到一个错误信息,一个错误信息中的错误码与detail用“-”隔开, 通过split分开 - value = str(list(serializer.errors.get(key))[0]).split("-") - response['code'] = int(value[0]) - response['msg'] = value[1] + ser = History.objects.all().order_by("years") # 获取全部历史列表信息 + # # 同上,对每一个object进行判断 + # for x in ser: + # d = {'department_id': x.department_id, 'grade': x.grade, 'department_cn': x.department_cn} + # serializer = HistorySerializer(data=d) + # if serializer.is_valid(): + # continue + # key = list(serializer.errors.keys())[0] # 得到错误信息的keys中的第一个key + # # 用一个key得到一个错误信息,一个错误信息中的错误码与detail用“-”隔开, 通过split分开 + # value = str(list(serializer.errors.get(key))[0]).split("-") + # response['code'] = int(value[0]) + # response['msg'] = value[1] + # return Response(data=response) + # # 若数据通过判断,则在此处将数据转为要求格式 + data = [] + msg = {} + if not ser: + response["code"] = 40000 + response["msg"] = "查询部门不存在" return Response(data=response) - # 若数据通过判断,则在此处将数据转为要求格式 - info = [] - for i in range(2002, 2022): - data = {'grade': i} - y = [] - for j in range(0, 6): - try: - a = History.objects.get(Q(did=j) & Q(grade=i)) - except History.DoesNotExist: # 若为空,则继续判断下一个部门 - continue - x = {'id': a.did, 'department_name': a.department_cn} - y.append(x) - data['data'] = y - info.append(data) - response["data"] = info - return Response(data=response) + for i in range(ser.first().years, ser.last().years + 1): + msg["years"] = i + msg["data"] = HistorySerializer(instance=ser.filter(years=i), many=True).data + data.append(msg.copy()) + msg.clear() + # data[i] = HistorySerializer(instance=ser.filter(years=i), many=True).data + # y = [] + # + # for j in range(0, Department.objects.count()): + # try: + # a = History.objects.get(Q(department_id=j) & Q(years=i)) + # except History.DoesNotExist: # 若为空,则继续判断下一个部门 + # continue + # + # x = {'id': a.department_id, 'department_name': a.department_cn} + # y.append(x) + # data['data'] = y + # info.append(data) + response["data"] = data + return Response(response) diff --git a/apps/work/__init__.py b/apps/work/__init__.py index e69de29..8b13789 100644 --- a/apps/work/__init__.py +++ b/apps/work/__init__.py @@ -0,0 +1 @@ + diff --git a/apps/work/apps.py b/apps/work/apps.py index d695886..d340a35 100644 --- a/apps/work/apps.py +++ b/apps/work/apps.py @@ -4,3 +4,5 @@ from django.apps import AppConfig class WorksConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'apps.work' + verbose_name = "历史作品管理" + diff --git a/apps/work/migrations/0001_initial.py b/apps/work/migrations/0001_initial.py index 6c0655a..15269ca 100644 --- a/apps/work/migrations/0001_initial.py +++ b/apps/work/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.5 on 2022-05-07 01:48 +# Generated by Django 3.2.5 on 2022-05-11 14:01 from django.db import migrations, models diff --git a/apps/work/migrations/0002_alter_works_img.py b/apps/work/migrations/0002_alter_works_img.py index d10f54b..46d4e2e 100644 --- a/apps/work/migrations/0002_alter_works_img.py +++ b/apps/work/migrations/0002_alter_works_img.py @@ -1,6 +1,7 @@ -# Generated by Django 3.2.5 on 2022-05-05 21:57 +# Generated by Django 3.2.5 on 2022-05-15 00:27 from django.db import migrations, models +import utils.ImageStorage class Migration(migrations.Migration): @@ -13,6 +14,6 @@ class Migration(migrations.Migration): migrations.AlterField( model_name='works', name='img', - field=models.ImageField(blank=True, null=True, upload_to='image', verbose_name='图片'), + field=models.ImageField(blank=True, null=True, storage=utils.ImageStorage.ImageStorage(), upload_to='image', verbose_name='图片'), ), ] diff --git a/apps/work/models.py b/apps/work/models.py index fa4053b..a9e1bc2 100644 --- a/apps/work/models.py +++ b/apps/work/models.py @@ -1,5 +1,5 @@ from django.db import models - +from utils.ImageStorage import ImageStorage # Create your models here. @@ -10,4 +10,4 @@ class Works(models.Model): grade = models.IntegerField(verbose_name="年份") name = models.CharField(verbose_name="事件名称", max_length=30) description = models.CharField(verbose_name="事件描述", max_length=200) - img = models.ImageField(verbose_name="图片", upload_to="image", null=True, blank=True) + img = models.ImageField(verbose_name="图片", upload_to="image", null=True, blank=True,storage=ImageStorage()) diff --git a/apps/work/serializers.py b/apps/work/serializers.py index 3cfb990..a7ea98a 100644 --- a/apps/work/serializers.py +++ b/apps/work/serializers.py @@ -1,21 +1,20 @@ from rest_framework import serializers from .models import * - +from utils.util import get_msg class WorksInfoSerializer(serializers.ModelSerializer): class Meta: model = Works fields = '__all__' - grade = serializers.CharField(label="年级", required=True) - name = serializers.CharField(label="事件名称", max_length=30, required=True) - description = serializers.CharField(label="事件描述", max_length=200, required=True) - img = serializers.ImageField(label="图片", required=False) - - """用来校验传入年级是否符合规范""" - def validate_grade(self, value): - if not (2002 < value <= 2021): - raise serializers.ValidationError(code='42006', detail={'msg': get_msg(42006), - "code": '42006'}) - return value - + # grade = serializers.CharField(label="年级", required=True) + # name = serializers.CharField(label="事件名称", max_length=30, required=True) + # description = serializers.CharField(label="事件描述", max_length=200, required=True) + # img = serializers.ImageField(label="图片", required=False) + # + # """用来校验传入年级是否符合规范""" + # def validate_grade(self, value): + # if not (2002 < value <= 2021): + # raise serializers.ValidationError(code='42006', detail={'msg': get_msg(42006), + # "code": '42006'}) + # return value diff --git a/apps/work/signals.py b/apps/work/signals.py new file mode 100644 index 0000000..f9bc762 --- /dev/null +++ b/apps/work/signals.py @@ -0,0 +1,16 @@ +from django.db.models.signals import pre_save,pre_delete,post_init,post_save,pre_init +from django.dispatch import receiver + +from .models import Works + + +# 修改时,保存图片并删除旧图 +# @receiver(post_init, sender=Works) +# def file_path(sender, instance, **kwargs): +# instance._current_image = instance.image + + +@receiver(pre_save, sender=Works) +def delete_old_image(sender, instance, **kwargs): + print(instance.img) + instance.img.delete(save=True) diff --git a/apps/work/views.py b/apps/work/views.py index 7bb766d..ef64d79 100644 --- a/apps/work/views.py +++ b/apps/work/views.py @@ -6,32 +6,41 @@ from rest_framework.views import APIView from rest_framework.response import Response from .models import Works from .serializers import WorksInfoSerializer -from utils.get_msg import get_msg +from utils.util import get_msg,get_path import logging +from rest_framework.generics import GenericAPIView +import configparser,os +from ITShowPlatform.settings import BASE_DIR,MEDIA_URL +from . import signals +conf = configparser.RawConfigParser() + +conf.read(os.path.join(BASE_DIR, "config.ini"), encoding="utf-8") # Create your views here. -class Work(APIView): +class Work(GenericAPIView): """获取社团历年的作品""" def get(self, request): key = [] data = {"data": key} - for i in range(2002, 2022): + for i in range(2022,2001,-1): """temp用来存储每个年级的作品,方便区分年级""" temp = {} - try: - works_set = Works.objects.filter(grade=i) - if works_set: - serializer = WorksInfoSerializer(works_set, many=True) - temp['grade'] = i - temp['data'] = serializer.data - data['data'].append(temp) - except Exception: - """如果没有查到数据""" - pass + #try: + works_set = Works.objects.filter(grade=i) + if works_set: + serializer = WorksInfoSerializer(works_set, many=True) + temp['grade'] = i + temp['data'] = serializer.data + for i in temp['data']: + i["img"] = get_path() + i["img"] + data['data'].append(temp) + # except Exception: + # """如果没有查到数据""" + # pass if len(data['data']) == 0: """如果查找的数据为空""" data['code'] = 45005 diff --git a/media/image/180.bmp b/media/image/180.bmp deleted file mode 100644 index 6644227..0000000 Binary files a/media/image/180.bmp and /dev/null differ diff --git a/media/image/Exchange1.bmp b/media/image/Exchange1.bmp deleted file mode 100644 index 99e7af9..0000000 Binary files a/media/image/Exchange1.bmp and /dev/null differ diff --git a/utils/ImageStorage.py b/utils/ImageStorage.py new file mode 100644 index 0000000..27070cf --- /dev/null +++ b/utils/ImageStorage.py @@ -0,0 +1,16 @@ +from django.core.files.storage import FileSystemStorage +from django.conf import settings +import os, time, random,hashlib +from django.http import HttpResponse + + +class ImageStorage(FileSystemStorage): + def __init__(self, location=settings.MEDIA_ROOT, base_url=settings.MEDIA_URL): + super(ImageStorage, self).__init__(location, base_url) + def _save(self, name, content): + ext = os.path.splitext(name)[1] + d = os.path.dirname(name) + md5hash = hashlib.md5((os.path.basename(name) + str(time.time())).encode("utf-8")) + fn = md5hash.hexdigest() + name = os.path.join(d, fn + ext) + return super(ImageStorage, self)._save(name, content)