[docs]classProfileDetail(generics.RetrieveAPIView):"""API endpoint that retrieves an Ion profile. /api/profile: retrieve your profile /api/profile/<pk>: retrieve the profile of the user with id <pk> /api/profile/<username>: retrieve the profile of the user with username <username> """serializer_class=UserSerializerpermission_classes=(IsAuthenticated,)defretrieve(self,request,*args,**kwargs):if"pk"inkwargs:user=get_user_model().objects.get(pk=kwargs["pk"])elif"username"inkwargs:user=get_user_model().objects.get(username__iexact=kwargs["username"])else:user=request.userifnotrequest.user.oauth_and_api_accessanduser!=request.user:returnResponse({"detail":"You do not have permission to perform this action."},status=403)ifrequest.user.is_restrictedanduser!=request.user:raiseget_user_model().DoesNotExist# Remove sensitive informationdata=self.get_serializer(user).datafields_to_remove=["middle_name","absences","address","emails","phones","websites","is_announcements_admin",]ifnot(request.user.is_teacherorrequest.user.is_eighth_admin):fields_to_remove.append("student_id")forfieldinfields_to_remove:data.pop(field)returnResponse(data)
[docs]classProfilePictureDetail(generics.RetrieveAPIView):"""API endpoint that retrieves an Ion profile picture. /api/profile/<pk>/picture: retrieve default profile picture /api/profile/<pk>/picture/<photo_year>: retrieve profile picture for year <photo_year> """serializer_class=UserSerializerpermission_classes=(DenyRestrictedPermission,)renderer_classes=(JPEGRenderer,)defretrieve(self,request,*args,**kwargs):if"pk"inkwargs:user=get_user_model().objects.get(pk=kwargs["pk"])elif"username"inkwargs:user=get_user_model().objects.get(username=kwargs["username"])else:user=request.userbinary=Noneif"photo_year"inkwargs:photo_year=kwargs["photo_year"]ifphoto_yearinGrade.names:grade_number=Grade.number_from_name(photo_year)ifuser.photos.filter(grade_number=grade_number).exists():binary=user.photos.filter(grade_number=grade_number).first().binaryelse:binary=Noneelse:binary=user.default_photoifbinaryisNone:default_image_path=os.path.join(settings.PROJECT_ROOT,"static/img/default_profile_pic.png")withopen(default_image_path,mode="rb")asf:binary=f.read()returnResponse(binary,content_type="image/jpeg")
[docs]classSearch(generics.RetrieveAPIView):"""API endpoint that retrieves the results of a search for Ion users. Paginated using ?page=<page> """permission_classes=(ApiAndOauthPermission,)queryset=get_user_model().objects.all()defretrieve(self,request,*args,**kwargs):query=kwargs["query"]user_ids=[]query=query.replace("+"," ")_,results=get_search_results(query)forunserialized_userinresults:user_ids.append(unserialized_user.id)queryset=get_user_model().objects.filter(pk__in=user_ids).order_by("pk")users=self.paginate_queryset(queryset)response=[]foruserinusers:ifuser.is_student:response.append(StudentSerializer(user,context={"request":request}).data)else:response.append(CounselorTeacherSerializer(user,context={"request":request}).data)returnself.get_paginated_response(response)