def get_profile(request, username: str = None): is_anonymous = False if username: user = get_object_or_404(User.objects.select_related('profile'), username=username) else: user = request.user is_anonymous = not request.user.is_authenticated() if is_anonymous or username is None: is_shared = True elif user == request.user: is_shared = True else: is_shared = user.profile.is_shared can_see = is_shared or user == request.user algo_name = request.GET.get('algo', None) member_time = (datetime.date.today() - user.date_joined.date() if (can_see and not is_anonymous) else None) is_me = request.user == user context = { 'meta': { 'debug_vue': settings.DEBUG_VUE_JS, 'mal': { 'is_available': client.is_available and (redis_pool is not None), 'pending_import': None if (not is_me) or is_anonymous else get_current_mal_import(request.user), }, 'config': VANILLA_UI_CONFIG_FOR_RATINGS, 'can_see': can_see, 'username': request.user.username, 'is_shared': is_shared, 'is_me': is_me, 'is_anonymous': is_anonymous, 'ratings_disabled': request.user != user and not is_anonymous, 'algo_name': algo_name }, 'profile': { 'avatar_url': user.profile.avatar_url if (not is_anonymous and can_see) else None, 'member_days': member_time.days if member_time else None, 'username': user.username }, } return user, context
def import_from_mal(request: Request, mal_username: str) -> Response: if client.is_available: pending_import = get_current_mal_import(request.user) if not pending_import: result = import_mal.s(mal_username, request.user.username).apply_async() task_id = result.task_id else: task_id = pending_import.task_id return Response({ 'task_id': task_id, 'message': 'Already importing' if pending_import else 'Import is starting' }) else: raise MALImportUnavailable()
def get_profile(request, username: str = None, category: str = None, status: str = None): if username is None and request.user.is_authenticated(): return redirect('profile', request.user.username, category or 'anime', status or 'seen', permanent=True) is_anonymous = False if username: user = get_object_or_404(User.objects.select_related('profile'), username=username) else: user = request.user is_anonymous = not request.user.is_authenticated() if is_anonymous or username is None: is_shared = True elif user == request.user: is_shared = True else: is_shared = user.profile.is_shared if category is None or status is None: if user.username: return redirect('profile', user.username, category or 'anime', status or 'seen', permanent=True) else: return redirect('my-profile', category or 'anime', status or 'seen', permanent=True) can_see = is_shared or user == request.user seen_works = status == "seen" algo_name = request.GET.get('algo', None) categories = ('anime', 'manga', 'album') # FIXME: We should move natural sorting on the database-side. # This way, we can keep a queryset until the end. # Eventually, we pass it as-is to the paginator, so we have better performance and less memory consumption. # Currently, we load the *entire set* of ratings for a (seen/willsee|wontsee) category of works. ratings, counts = get_profile_ratings(request, category, seen_works, can_see, is_anonymous, user) compare_function = build_profile_compare_function(algo_name, ratings, user) rating_list = natsorted(ratings, key=compare_function) if category == 'recommendation': received_recommendation_list, sent_recommendation_list = get_profile_recommendations( is_anonymous, can_see, user ) else: received_recommendation_list = sent_recommendation_list = [] if can_see and not is_anonymous and not received_recommendation_list: reco_count = Recommendation.objects.filter(target_user=user).count() else: reco_count = len(received_recommendation_list) member_time = (datetime.date.today() - user.date_joined.date() if (can_see and not is_anonymous) else None) user_events = get_profile_events(user) if (can_see and not is_anonymous) else [] paginator = Paginator(rating_list, RATINGS_PER_PAGE) page = request.GET.get('page') try: ratings = paginator.page(page) except PageNotAnInteger: ratings = paginator.page(1) except EmptyPage: ratings = paginator.page(paginator.num_pages) is_me = request.user == user data = { 'meta': { 'debug_vue': settings.DEBUG_VUE_JS, 'mal': { 'is_available': client.is_available and (redis_pool is not None), 'pending_import': None if (not is_me) or is_anonymous else get_current_mal_import(request.user), }, 'config': VANILLA_UI_CONFIG_FOR_RATINGS, 'can_see': can_see, 'username': request.user.username, 'is_shared': is_shared, 'is_me': is_me, 'category': category, 'seen': seen_works, 'is_anonymous': is_anonymous, 'ratings_disabled': request.user != user and not is_anonymous, 'algo_name': algo_name }, 'profile': { 'avatar_url': user.profile.avatar_url if (not is_anonymous and can_see) else None, 'member_days': member_time.days if member_time else None, 'seen_anime_count': counts['seen_anime'], 'seen_manga_count': counts['seen_manga'], 'unseen_anime_count': counts['unseen_anime'], 'unseen_manga_count': counts['unseen_manga'], 'reco_count': reco_count, 'username': user.username }, 'ratings': ratings, 'recommendations': { 'received': received_recommendation_list, 'sent': sent_recommendation_list }, 'events': user_events } return render(request, 'profile.html', data)