You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
370 lines
13 KiB
370 lines
13 KiB
6 months ago
|
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"})
|
||
|
|