import logging import smtplib import datetime from chunked_upload.views import ChunkedUploadView, ChunkedUploadCompleteView from django.conf import settings from django.contrib import messages from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout from django.http import JsonResponse from django.shortcuts import * from django.template.loader import render_to_string from django.views import generic from django.views.decorators.http import require_http_methods from django.views.generic import TemplateView from comment.models import Comment from helpers import get_page_list, AdminUserRequiredMixin, ajax_required, SuperUserRequiredMixin, send_html_email from users.models import User, Feedback from video.models import Video, Classification from .forms import UserLoginForm, VideoPublishForm, VideoEditForm, UserAddForm, UserEditForm, ClassificationAddForm, \ ClassificationEditForm from .models import MyChunkedUpload logger = logging.getLogger('my_logger') def login(request): if request.method == 'POST': form = UserLoginForm(request=request, data=request.POST) if form.is_valid(): username = form.cleaned_data.get('username') password = form.cleaned_data.get('password') user = authenticate(username=username, password=password) if user is not None and user.is_staff: auth_login(request, user) return redirect('myadmin:index') else: form.add_error('', '请输入管理员账号') else: form = UserLoginForm() return render(request, 'myadmin/login.html', {'form': form}) def logout(request): auth_logout(request) return redirect('myadmin:login') class IndexView(AdminUserRequiredMixin, generic.View): """ 总览数据 """ def get(self, request): video_count = Video.objects.get_count() video_has_published_count = Video.objects.get_published_count() video_not_published_count = Video.objects.get_not_published_count() user_count = User.objects.count() user_today_count = User.objects.exclude(date_joined__lt=datetime.date.today()).count() comment_count = Comment.objects.get_count() comment_today_count = Comment.objects.get_today_count() data = {"video_count": video_count, "video_has_published_count": video_has_published_count, "video_not_published_count": video_not_published_count, "user_count": user_count, "user_today_count": user_today_count, "comment_count": comment_count, "comment_today_count": comment_today_count} return render(self.request, 'myadmin/index.html', data) class AddVideoView(SuperUserRequiredMixin, TemplateView): template_name = 'myadmin/video_add.html' class MyChunkedUploadView(ChunkedUploadView): model = MyChunkedUpload field_name = 'the_file' class MyChunkedUploadCompleteView(ChunkedUploadCompleteView): model = MyChunkedUpload def on_completion(self, uploaded_file, request): print('uploaded--->', uploaded_file.name) pass def get_response_data(self, chunked_upload, request): video = Video.objects.create(file=chunked_upload.file) return {'code': 0, 'video_id': video.id, 'msg': 'success'} class VideoPublishView(SuperUserRequiredMixin, generic.UpdateView): model = Video form_class = VideoPublishForm template_name = 'myadmin/video_publish.html' def get_context_data(self, **kwargs): context = super(VideoPublishView, self).get_context_data(**kwargs) clf_list = Classification.objects.all().values() clf_data = {'clf_list':clf_list} context.update(clf_data) return context def get_success_url(self): return reverse('myadmin:video_publish_success') class VideoPublishSuccessView(generic.TemplateView): template_name = 'myadmin/video_publish_success.html' class VideoEditView(SuperUserRequiredMixin, generic.UpdateView): model = Video form_class = VideoEditForm template_name = 'myadmin/video_edit.html' def get_context_data(self, **kwargs): context = super(VideoEditView, self).get_context_data(**kwargs) clf_list = Classification.objects.all().values() clf_data = {'clf_list':clf_list} context.update(clf_data) return context def get_success_url(self): messages.success(self.request, "保存成功") return reverse('myadmin:video_edit', kwargs={'pk': self.kwargs['pk']}) @ajax_required @require_http_methods(["POST"]) def video_delete(request): if not request.user.is_superuser: return JsonResponse({"code": 1, "msg": "无删除权限"}) video_id = request.POST['video_id'] instance = Video.objects.get(id=video_id) instance.delete() return JsonResponse({"code": 0, "msg": "success"}) class VideoListView(AdminUserRequiredMixin, generic.ListView): model = Video template_name = 'myadmin/video_list.html' context_object_name = 'video_list' paginate_by = 10 q = '' def get_context_data(self, *, object_list=None, **kwargs): context = super(VideoListView, self).get_context_data(**kwargs) paginator = context.get('paginator') page = context.get('page_obj') page_list = get_page_list(paginator, page) context['page_list'] = page_list context['q'] = self.q return context def get_queryset(self): self.q = self.request.GET.get("q", "") return Video.objects.get_search_list(self.q) class ClassificationListView(AdminUserRequiredMixin, generic.ListView): model = Classification template_name = 'myadmin/classification_list.html' context_object_name = 'classification_list' paginate_by = 10 q = '' def get_context_data(self, *, object_list=None, **kwargs): context = super(ClassificationListView, self).get_context_data(**kwargs) paginator = context.get('paginator') page = context.get('page_obj') page_list = get_page_list(paginator, page) context['page_list'] = page_list context['q'] = self.q return context def get_queryset(self): self.q = self.request.GET.get("q", "") return Classification.objects.filter(title__contains=self.q) class ClassificationAddView(SuperUserRequiredMixin, generic.View): def get(self, request): form = ClassificationAddForm() return render(self.request, 'myadmin/classification_add.html', {'form': form}) def post(self, request): form = ClassificationAddForm(data=request.POST) if form.is_valid(): form.save(commit=True) return render(self.request, 'myadmin/classification_add_success.html') return render(self.request, 'myadmin/classification_add.html', {'form': form}) @ajax_required @require_http_methods(["POST"]) def classification_delete(request): if not request.user.is_superuser: return JsonResponse({"code": 1, "msg": "无删除权限"}) classification_id = request.POST['classification_id'] instance = Classification.objects.get(id=classification_id) instance.delete() return JsonResponse({"code": 0, "msg": "success"}) class ClassificationEditView(SuperUserRequiredMixin, generic.UpdateView): model = Classification form_class = ClassificationEditForm template_name = 'myadmin/classification_edit.html' def get_success_url(self): messages.success(self.request, "保存成功") return reverse('myadmin:classification_edit', kwargs={'pk': self.kwargs['pk']}) class CommentListView(AdminUserRequiredMixin, generic.ListView): model = Comment template_name = 'myadmin/comment_list.html' context_object_name = 'comment_list' paginate_by = 10 q = '' def get_context_data(self, *, object_list=None, **kwargs): context = super(CommentListView, self).get_context_data(**kwargs) paginator = context.get('paginator') page = context.get('page_obj') page_list = get_page_list(paginator, page) context['page_list'] = page_list context['q'] = self.q return context def get_queryset(self): self.q = self.request.GET.get("q", "") return Comment.objects.filter(content__contains=self.q).order_by('-timestamp') @ajax_required @require_http_methods(["POST"]) def comment_delete(request): if not request.user.is_superuser: return JsonResponse({"code": 1, "msg": "无删除权限"}) comment_id = request.POST['comment_id'] instance = Comment.objects.get(id=comment_id) instance.delete() return JsonResponse({"code": 0, "msg": "success"}) class UserListView(AdminUserRequiredMixin, generic.ListView): model = User template_name = 'myadmin/user_list.html' context_object_name = 'user_list' paginate_by = 10 q = '' def get_context_data(self, *, object_list=None, **kwargs): context = super(UserListView, self).get_context_data(**kwargs) paginator = context.get('paginator') page = context.get('page_obj') page_list = get_page_list(paginator, page) context['page_list'] = page_list context['q'] = self.q return context def get_queryset(self): self.q = self.request.GET.get("q", "") return User.objects.filter(username__contains=self.q).order_by('-date_joined') class UserAddView(SuperUserRequiredMixin, generic.View): def get(self, request): form = UserAddForm() return render(self.request, 'myadmin/user_add.html', {'form': form}) def post(self, request): form = UserAddForm(data=request.POST) if form.is_valid(): user = form.save(commit=False) password = form.cleaned_data.get('password') user.set_password(password) user.save() return render(self.request, 'myadmin/user_add_success.html') return render(self.request, 'myadmin/user_add.html', {'form': form}) class UserEditView(SuperUserRequiredMixin, generic.UpdateView): model = User form_class = UserEditForm template_name = 'myadmin/user_edit.html' def get_success_url(self): messages.success(self.request, "保存成功") return reverse('myadmin:user_edit', kwargs={'pk': self.kwargs['pk']}) @ajax_required @require_http_methods(["POST"]) def user_delete(request): if not request.user.is_superuser: return JsonResponse({"code": 1, "msg": "无删除权限"}) user_id = request.POST['user_id'] instance = User.objects.get(id=user_id) if instance.is_superuser: return JsonResponse({"code": 1, "msg": "不能删除管理员"}) instance.delete() return JsonResponse({"code": 0, "msg": "success"}) class SubscribeView(SuperUserRequiredMixin, generic.View): def get(self, request): video_list = Video.objects.get_published_list() return render(request, "myadmin/subscribe.html" ,{'video_list':video_list}) def post(self, request): if not request.user.is_superuser: return JsonResponse({"code": 1, "msg": "无权限"}) video_id = request.POST['video_id'] video = Video.objects.get(id=video_id) subject = video.title context = {'video': video,'site_url':settings.SITE_URL} html_message = render_to_string('myadmin/mail_template.html', context) email_list = User.objects.filter(subscribe=True).values_list('email',flat=True) # 分组 email_list = [email_list[i:i + 2] for i in range(0, len(email_list), 2)] if email_list: for to_list in email_list: try: send_html_email(subject, html_message, to_list) except smtplib.SMTPException as e: logger.error(e) return JsonResponse({"code": 1, "msg": "发送失败"}) return JsonResponse({"code": 0, "msg": "success"}) else: return JsonResponse({"code": 1, "msg": "邮件列表为空"}) class FeedbackListView(AdminUserRequiredMixin, generic.ListView): model = Feedback template_name = 'myadmin/feedback_list.html' context_object_name = 'feedback_list' paginate_by = 10 q = '' def get_context_data(self, *, object_list=None, **kwargs): context = super(FeedbackListView, self).get_context_data(**kwargs) paginator = context.get('paginator') page = context.get('page_obj') page_list = get_page_list(paginator, page) context['page_list'] = page_list context['q'] = self.q return context def get_queryset(self): self.q = self.request.GET.get("q", "") return Feedback.objects.filter(content__contains=self.q).order_by('-timestamp') @ajax_required @require_http_methods(["POST"]) def feedback_delete(request): if not request.user.is_superuser: return JsonResponse({"code": 1, "msg": "无删除权限"}) feedback_id = request.POST['feedback_id'] instance = Feedback.objects.get(id=feedback_id) instance.delete() return JsonResponse({"code": 0, "msg": "success"})