|
|
from helpers import AuthorRequiredMixin, get_page_list
|
|
|
from django.contrib import messages
|
|
|
from django.contrib.auth import authenticate, login as auth_login, logout as auth_logout
|
|
|
from django.contrib.auth import get_user_model
|
|
|
from django.contrib.auth import update_session_auth_hash
|
|
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
|
|
from django.shortcuts import *
|
|
|
from django.views import generic
|
|
|
from ratelimit.decorators import ratelimit
|
|
|
|
|
|
|
|
|
from .models import Feedback
|
|
|
|
|
|
from .forms import ProfileForm, SignUpForm, UserLoginForm, ChangePwdForm, SubscribeForm, FeedbackForm
|
|
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
def login(request):
|
|
|
if request.method == 'POST':
|
|
|
next = request.POST.get('next', '/')
|
|
|
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:
|
|
|
auth_login(request, user)
|
|
|
# return redirect('home')
|
|
|
return redirect(next)
|
|
|
else:
|
|
|
print(form.errors)
|
|
|
else:
|
|
|
next = request.GET.get('next', '/')
|
|
|
form = UserLoginForm()
|
|
|
print(next)
|
|
|
return render(request, 'registration/login.html', {'form': form, 'next':next})
|
|
|
|
|
|
def signup(request):
|
|
|
if request.method == 'POST':
|
|
|
form = SignUpForm(request.POST)
|
|
|
if form.is_valid():
|
|
|
form.save()
|
|
|
username = form.cleaned_data.get('username')
|
|
|
raw_password1 = form.cleaned_data.get('password1')
|
|
|
user = authenticate(username=username, password=raw_password1)
|
|
|
auth_login(request, user)
|
|
|
return redirect('home')
|
|
|
else:
|
|
|
print(form.errors)
|
|
|
else:
|
|
|
form = SignUpForm()
|
|
|
return render(request, 'registration/signup.html', {'form': form})
|
|
|
|
|
|
|
|
|
def logout(request):
|
|
|
auth_logout(request)
|
|
|
return redirect('home')
|
|
|
|
|
|
|
|
|
def change_password(request):
|
|
|
if request.method == 'POST':
|
|
|
form = ChangePwdForm(request.user, request.POST)
|
|
|
if form.is_valid():
|
|
|
user = form.save(commit=False)
|
|
|
if not user.is_staff and not user.is_superuser:
|
|
|
user.save()
|
|
|
update_session_auth_hash(request, user) # 更新session 非常重要!
|
|
|
messages.success(request, '修改成功')
|
|
|
return redirect('users:change_password')
|
|
|
else:
|
|
|
messages.warning(request, '无权修改管理员密码')
|
|
|
return redirect('users:change_password')
|
|
|
else:
|
|
|
print(form.errors)
|
|
|
else:
|
|
|
form = ChangePwdForm(request.user)
|
|
|
return render(request, 'registration/change_password.html', {
|
|
|
'form': form
|
|
|
})
|
|
|
|
|
|
|
|
|
class ProfileView(LoginRequiredMixin,AuthorRequiredMixin, generic.UpdateView):
|
|
|
model = User
|
|
|
form_class = ProfileForm
|
|
|
template_name = 'users/profile.html'
|
|
|
|
|
|
def get_success_url(self):
|
|
|
messages.success(self.request, "保存成功")
|
|
|
return reverse('users:profile', kwargs={'pk': self.request.user.pk})
|
|
|
|
|
|
|
|
|
class SubscribeView(LoginRequiredMixin,AuthorRequiredMixin, generic.UpdateView):
|
|
|
model = User
|
|
|
form_class = SubscribeForm
|
|
|
template_name = 'users/subscribe.html'
|
|
|
|
|
|
def get_success_url(self):
|
|
|
messages.success(self.request, "保存成功")
|
|
|
return reverse('users:subscribe', kwargs={'pk': self.request.user.pk})
|
|
|
|
|
|
class FeedbackView(LoginRequiredMixin, generic.CreateView):
|
|
|
|
|
|
model = Feedback
|
|
|
form_class = FeedbackForm
|
|
|
template_name = 'users/feedback.html'
|
|
|
|
|
|
@ratelimit(key='ip', rate='2/m')
|
|
|
def post(self, request, *args, **kwargs):
|
|
|
was_limited = getattr(request, 'limited', False)
|
|
|
if was_limited:
|
|
|
messages.warning(self.request, "操作太频繁了,请1分钟后再试")
|
|
|
return render(request, 'users/feedback.html', {'form': FeedbackForm()})
|
|
|
return super().post(request, *args, **kwargs)
|
|
|
|
|
|
def get_success_url(self):
|
|
|
messages.success(self.request, "提交成功")
|
|
|
return reverse('users:feedback')
|
|
|
|
|
|
class CollectListView(generic.ListView):
|
|
|
model = User
|
|
|
template_name = 'users/collect_videos.html'
|
|
|
context_object_name = 'video_list'
|
|
|
paginate_by = 10
|
|
|
|
|
|
def get_context_data(self, *, object_list=None, **kwargs):
|
|
|
context = super(CollectListView, 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
|
|
|
return context
|
|
|
def get_queryset(self):
|
|
|
user = get_object_or_404(User, pk=self.kwargs.get('pk'))
|
|
|
videos = user.collected_videos.all()
|
|
|
return videos
|
|
|
|
|
|
|
|
|
class LikeListView(generic.ListView):
|
|
|
model = User
|
|
|
template_name = 'users/like_videos.html'
|
|
|
context_object_name = 'video_list'
|
|
|
paginate_by = 10
|
|
|
|
|
|
def get_context_data(self, *, object_list=None, **kwargs):
|
|
|
context = super(LikeListView, 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
|
|
|
return context
|
|
|
|
|
|
def get_queryset(self):
|
|
|
user = get_object_or_404(User, pk=self.kwargs.get('pk'))
|
|
|
videos = user.liked_videos.all()
|
|
|
return videos |