aboutsummaryrefslogtreecommitdiff
path: root/user_profile/views.py
blob: fb320e180724e670bffb67b786aaeae687c890b7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import json
from django.shortcuts import render
from django.http import JsonResponse
import requests
from user_profile.models import UserPreferences
from authentication.utils import get_mal_redirect_uri, get_single_anime_mal, get_user_mal_list

def user_profile(request):
    category = request.GET.get("category", "preferences")

    supported_categories = ["preferences", "anime_list", "update"]
    if category not in supported_categories:
        category = "preferences"


    context = {
        "req_category": category
    }

    if not request.user.mal_access_token:
        mal_auth_uri, code_challenge = get_mal_redirect_uri()
        context["mal_auth_uri"] = mal_auth_uri
    else:
        if category == "anime_list":
            offset = request.GET.get("offset", 0)
            filters_supported = ["watching", "completed", "on_hold", "dropped", "plan_to_watch"]
            filter = request.GET.get("filter", "")
            if filter not in filters_supported:
                filter = ""
            mal_list, prev, next = get_user_mal_list(request.user.mal_access_token, limit=24, offset=offset, filter=filter)
            context["mal_list"] = mal_list
            if prev:
                context["prev_offset"] = prev.split("offset=")[1].split("&")[0]
            if next:
                context["next_offset"] = next.split("offset=")[1].split("&")[0]
            if filter:
                context["filter"] = filter
        
        if category == "update":
            mal_id = request.GET.get("mal_id")
            if mal_id:
                mal_data = get_single_anime_mal(request.user.mal_access_token, mal_id)
                if mal_data:
                    mal_data["average_episode_duration"] = mal_data["average_episode_duration"] // 60 + 1
                    context["mal_data"] = mal_data
                    context["mal_episode_range"] = range(1, mal_data["num_episodes"] + 1)

    return render(request, "user_profile/user_profile.html", context)


def update_user_mal_list(request):
    if request.method != "POST":
        return JsonResponse({"error": "Invalid request method"}, status=400)
    
    user = request.user
    data = json.loads(request.body)
    mal_id = data.get("mal_id")
    status = data.get("status")
    score = data.get("score")
    num_watched_episodes = data.get("episodes")
    
    if status not in ["watching", "completed", "on_hold", "dropped", "plan_to_watch", "add_to_list"]:
        return JsonResponse({"error": "Invalid status"}, status=400)

    if not user.mal_access_token:
        return JsonResponse({"error": "User has not connected their MAL account"}, status=400)
    
    base_url = f"https://api.myanimelist.net/v2/anime/{mal_id}/my_list_status"
    headers = {"Authorization": f"Bearer {user.mal_access_token}", "Content-Type": "application/x-www-form-urlencoded"}
    formdata = {
        "score": int(score),
        "num_watched_episodes": num_watched_episodes
    }

    if status != "add_to_list":
        formdata["status"] = status

    response = requests.put(base_url, headers=headers, data=formdata)
    if response.status_code == 200:
        return JsonResponse({"success": "MAL list updated"}, status=200)
    else:
        return JsonResponse({"error": "Failed to update MAL list"}, status=500)


def save_user_preferences(request):
    if request.method != "POST":
        return JsonResponse({"error": "Invalid request method"}, status=400)
    
    user = request.user

    data = json.loads(request.body)
    accent_colour = data.get("accentColour")
    card_layout = data.get("cardLayout")
    title_language = data.get("titleLanguage")
    character_name_language = data.get("characterNameLanguage")
    default_language = data.get("defaultLanguage")
    default_provider = data.get("defaultProvider")
    default_watch_page = data.get("defaultWatchPage")
    show_history_on_home = data.get("showHistoryOnHome")
    auto_skip_intro = data.get("autoSkipIntro")
    auto_play_video = data.get("autoPlayVideo")
    auto_next_episode = data.get("autoNextEpisode")
    ingrain_sub_subtitles_in_dub = data.get("ingrainSubSubtitlesInDub")
    display_guild_name_instead_of_username = data.get("displayGuildNameInsteadOfUsername")
    smart_mal_sync = data.get("smartMALSync")

    user_preferences, created = UserPreferences.objects.get_or_create(user=user)
    user_preferences.accent_colour = accent_colour
    user_preferences.card_layout = card_layout
    user_preferences.title_language = title_language
    user_preferences.character_name_language = character_name_language
    user_preferences.default_language = default_language
    user_preferences.default_provider = default_provider
    user_preferences.default_watch_page = default_watch_page
    user_preferences.show_history_on_home = show_history_on_home
    user_preferences.auto_skip_intro = auto_skip_intro
    user_preferences.auto_play_video = auto_play_video
    user_preferences.auto_next_episode = auto_next_episode
    user_preferences.ingrain_sub_subtitles_in_dub = ingrain_sub_subtitles_in_dub
    user_preferences.display_guild_name_instead_of_username = display_guild_name_instead_of_username
    user_preferences.smart_mal_sync = smart_mal_sync

    try:
        user_preferences.save()
        return JsonResponse({"success": "User preferences saved"}, status=200)
    except Exception as e:
        print(e)
        return JsonResponse({"error": "Failed to save user preferences"}, status=500)