import logging from django.utils.translation import gettext as _ from django.utils import timezone from rest_framework.response import Response from rest_framework.permissions import IsAdminUser from pingcap_sso.api.base import AdminEndpoint from pingcap_sso.api.endpoints.admin.serializers.blog import BlogTagSerializer from pingcap_sso.blog.models import ( User as BlogUser, Tag as BlogTag, ) from pingcap_sso.api.permissions import MethodPermission from pingcap_sso.forms.admin_blog import BlogUserRoleForm logger = logging.getLogger(__name__) class UserListEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.manage_blog'] } def get(self, request, *args, **kwargs): try: role_id = request.GET.get('role_id') if role_id: role_id = int(role_id) username = request.GET.get('username') cur_page = int(request.GET.get('currentPage', 1)) per_page = int(request.GET.get('perPage', 20)) except Exception: return Response({ 'detail': _('wrong params') }, 400) qs = BlogUser.objects.all() if role_id: qs = qs.filter(roles__id=role_id) if username: qs = qs.filter(username__icontains=username) total_num = qs.count() qs = qs.order_by('id') qs = qs[(cur_page - 1) * per_page:cur_page * per_page] data = [{ 'id': u.id, 'username': u.username, 'name': u.name, 'openid': u.openid, 'phone': u.phone_number, } for u in qs] return Response({ 'detail': _('success'), 'total_num': total_num, 'per_page': per_page, 'cur_page': cur_page, 'data': data }) class UserRoleEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'DELETE': ['pingcap_sso.manage_blog'], 'POST': ['pingcap_sso.manage_blog'] } def post(self, request, user_id, *args, **kwargs): data = request.data data['user_id'] = user_id form = BlogUserRoleForm(data=data) if not form.is_valid(): return Response({ 'detail': _('wrong params'), 'errors': form.errors }, 400) user = form.user role = form.role user.roles.add(role) return Response({ 'detail': _('success') }) def delete(self, request, user_id, *args, **kwargs): data = request.data data['user_id'] = user_id form = BlogUserRoleForm(data=data) if not form.is_valid(): return Response({ 'detail': _('wrong params'), 'errors': form.errors }, 400) user = form.user role = form.role user.roles.remove(role) return Response({ 'detail': _('success') }) class TagListEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'GET': ['pingcap_sso.manage_blog'], 'POST': ['pingcap_sso.manage_blog'], } def get(self, request, *args, **kwargs): return Response({ 'detail': _('success'), 'data': BlogTagSerializer( BlogTag.objects.order_by('-weight'), many=True ).data }) def post(self, request, *args, **kwargs): data = request.data serializer = BlogTagSerializer(data=data) if not serializer.is_valid(): return Response({ 'detail': _('wrong params'), 'errors': serializer.errors }, 400) serializer.save() return Response({ 'detail': _('success') }) class TagDetailEndpoint(AdminEndpoint): permission_classes = (IsAdminUser, MethodPermission) perms_map = { 'DELETE': ['pingcap_sso.manage_blog'], 'PUT': ['pingcap_sso.manage_blog'], 'GET': ['pingcap_sso.manage_blog'], } def dispatch(self, request, tag_id, *args, **kwargs): self.tag_id = tag_id try: self.tag = BlogTag.objects.get(id=tag_id) except BlogTag.DoesNotExist: return Response({ 'detail': _('tag not found') }, 404) return super().dispatch(request, *args, **kwargs) def get(self, request, *args, **kwargs): return Response({ 'detail': _('success'), 'data': BlogTagSerializer(self.tag).data }) def delete(self, request, *args, **kwargs): self.tag.deleted_at = timezone.now() self.tag.save(update_fields=['deleted_at']) return Response({ 'detail': _('success') }) def put(self, request, *args, **kwargs): data = request.data serializer = BlogTagSerializer(self.tag, data=data) if not serializer.is_valid(): return Response({ 'detail': _('wrong params'), 'errors': serializer.errors }, 400) serializer.save() return Response({ 'detail': _('success') })