-
Notifications
You must be signed in to change notification settings - Fork 1
/
views.py
247 lines (198 loc) · 10.3 KB
/
views.py
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
import random
from allauth.account.views import LoginView, logout
from django.contrib import auth
from django.contrib.auth import logout
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse
from django.shortcuts import redirect
from django.shortcuts import render
from django.views.generic import View
from .flairparsing import *
from .models import FlairsAwarded, FlairType
from .redditflair import *
def sort_flairtype_by_order(elem):
return elem.order
def sort_awarded_flairs_by_order(elem):
return elem.flair_id.order
def wiki(request):
wiki_flairs = list(FlairType.objects.filter(wiki_display=True))
wiki_flairs.sort(key=sort_flairtype_by_order)
return render(request, 'flair/wiki.html', {
'wiki_flairs': wiki_flairs,
})
class FlairLoginView(LoginView):
template_name = 'account/login.html'
class FlairLogoutView(View):
def post(self, request, *args, **kwargs):
logout(request)
return redirect(request.POST['next'])
def LogLogin(username, user_agent):
logItem = ActionLogging(
action='set_flair_url',
reddit_name=username,
user_agent=user_agent
)
logItem.save()
@login_required()
def set_flair_url(request):
if not setup_status:
setup_reddit_once()
# username = request.user #Lazyload issue potential
username = auth.get_user(request).username
# TODO: Decide if this should be toggleable off by the admin
LogLogin(username, request.META.get('HTTP_USER_AGENT', ''))
if check_user_exists(username):
current_flair = get_flair(username).get("flair_text")
current_emoji_flair_list = parse_flair_types(current_flair)
set_current_assigned_flairs(username, current_emoji_flair_list)
stripped_flair = colon_emoji_strip(current_flair)
stripped_flair_url = make_url_of_flair_text(stripped_flair)
tracker_name = tracker_type(current_flair)
tracker_user_account_name = strip_flair_to_tracker_account_name(current_flair)
# Include dummy None flair if they want to clear their general choice
none_type = FlairType()
none_type.id = 0
none_type.display_name = "None"
general_flairs = list(FlairType.objects.filter(flair_type__exact="general").order_by("anime__title_en"))
custom_flairs = list(FlairsAwarded.objects.filter(display_name__iexact=username).filter(flair_id__flair_type="custom").order_by("flair_id__anime__title_en"))
# Temporary: pick a present flair if they exist.
_pick_present_flair(username, custom_flairs, current_emoji_flair_list)
general_flairs = [none_type] + [custom_flair.flair_id for custom_flair in custom_flairs] + general_flairs
find_already_set_general_flairs(general_flairs, current_emoji_flair_list) # Adds 'checked' status to objects
awarded_flairs = list(FlairsAwarded.objects.filter(display_name__iexact=username).filter(flair_id__flair_type="achievement")) # __iexact to be case insensitive
awarded_flairs.sort(key=sort_awarded_flairs_by_order)
awarded_flairs = check_awarded_flairs_overrides(awarded_flairs) # Applies any overrides
awarded_flairs = remove_duplicate_awarded_flairs(awarded_flairs)
find_already_set_award_flairs(awarded_flairs, current_emoji_flair_list) # Adds 'checked' status to objects
# Fix up 'Flair Preview' section with overrides, also if a user has multiple wins (x2,x3,x4...):
current_emoji_flair_list = apply_awarded_flairs_overrides(awarded_flairs, current_emoji_flair_list)
tracker_flairs = list(FlairType.objects.filter(flair_type__exact="list"))
tracker_flairs.sort(key=sort_flairtype_by_order)
return render(request, 'flair/setflair.html', {
'username': username,
'general_flairs': general_flairs,
'allowed_flairs': awarded_flairs,
'current_flair_text': stripped_flair,
'current_flair_url': stripped_flair_url,
'current_emoji_flair_list': current_emoji_flair_list,
'tracker_name': tracker_name,
'tracker_user_account_name': tracker_user_account_name,
'tracker_flairs': tracker_flairs,
})
else:
return HttpResponse('No reddit account is attached to this login. (Shadowbanned or Site-Administrator)')
def _pick_present_flair(username, custom_flairs, current_flairs):
present_flair_name = "??????"
# If they have one assigned (set), compare against what they have awarded (available).
for assigned_flair in current_flairs:
if assigned_flair.display_name != present_flair_name:
continue
# They have one assigned, compare against awarded.
for flair_type in custom_flairs:
if flair_type.flair_id.display_name != present_flair_name:
continue
# Found an awarded flair that is a present, change to the assigned one.
if flair_type.flair_id != assigned_flair:
flair_type.flair_id = assigned_flair
flair_type.save()
return
# They *don't* have one awarded, so award the assigned one now.
awarded = FlairsAwarded.objects.create(flair_id=assigned_flair, display_name=username)
custom_flairs.append(awarded)
return
# Don't do anything if they already have one awarded.
for flair_type in custom_flairs:
if flair_type.flair_id.display_name == present_flair_name:
return
present_flairs = list(FlairType.objects.filter(flair_type__exact="custom").filter(display_name__exact=present_flair_name))
if not present_flairs:
return
# Select one at random, award it, and add it to their custom flair list.
selected_flair = random.choice(present_flairs)
awarded = FlairsAwarded.objects.create(flair_id=selected_flair, display_name=username)
custom_flairs.append(awarded)
setup_status = False
def setup_reddit_once():
reddit_setup()
global setup_status # for scope
print('Reddit object initialized')
setup_status = True
@login_required
def submit(request):
"""A view saving a user's response as their flair. Records a log in database, and redirecting them back to the index. Requires the user being logged in."""
# username = request.user #Lazyload issue potential
username = auth.get_user(request).username
# should reddit be setup here or somewhere else one single time?
if not setup_status:
setup_reddit_once()
if 'flair_reset_request' in request.POST:
delete_flair(username)
return redirect('/set') # returns user back to /set page
# Get allowed award flairs from the database and check only those (Server-side validation)
awarded_flairs = list(FlairsAwarded.objects.filter(display_name__iexact=username)) # __iexact to be case insensitive
# Sorts flairs by database flairtype 'order' value
awarded_flairs = check_awarded_flairs_overrides(awarded_flairs)
awarded_flairs = remove_duplicate_awarded_flairs(awarded_flairs)
awarded_flairs.sort(key=sort_awarded_flairs_by_order)
flair_general_emoji_to_set = ""
flair_award_emoji_to_set = ""
flair_tracker_emoji_to_set = ""
flair_tracker_text_to_set = ""
flair_tracker_user_account = ""
flair_template_to_set = ""
# Backend check to enforce that no more than X (hardcoded currently as 2) award_flairs are set
flaircap = 2
for flair_award in awarded_flairs:
flair_check_name = "flairtype_" + flair_award.flair_id.display_name
if flair_check_name in request.POST:
if flaircap > 0:
flaircap -= 1
flair_award_emoji_to_set = flair_award_emoji_to_set + get_award_flair_emoji_text(flair_award)
# General/custom flairs
custom_flairs_available = [awarded.flair_id for awarded in awarded_flairs if awarded.flair_id.flair_type == "custom"]
general_flairs = list(FlairType.objects.filter(flair_type="general"))
requested_flair_id = None
if "generalflair" in request.POST:
try:
requested_flair_id = int(request.POST["generalflair"])
except (ValueError, TypeError):
pass
if requested_flair_id:
for flair_type in custom_flairs_available:
if flair_type.id == requested_flair_id:
flair_general_emoji_to_set = flair_type.reddit_flair_emoji
break
else: # Didn't find their selection in custom flair so check general flairs next.
for flair_type in general_flairs:
if flair_type.id == requested_flair_id:
flair_general_emoji_to_set = flair_type.reddit_flair_emoji
break
# Sort out 'list' flair section
if "trackerflair" in request.POST:
if request.POST["trackerflair"] == "notracker":
# print("notracker")
pass
elif "trackerAccountName" in request.POST:
# print(request.POST) # Debugging
tracker_flairs = list(FlairType.objects.filter(flair_type__iexact="list"))
for flairtype in tracker_flairs:
# print(flairtype.display_name)
# Look for through database flairs to find what they have
if request.POST["trackerflair"] == flairtype.display_name:
# Set both tracker icon and entered tracker name/id
flair_tracker_emoji_to_set = flairtype.reddit_flair_emoji
flair_tracker_text_to_set = flairtype.reddit_flair_text
flair_tracker_user_account = request.POST["trackerAccountName"]
flair_template_to_set = flairtype.reddit_flair_template_id
break
# Build the flair text that will then be set
final_flair_to_set = flair_length_builder(flair_general_emoji_to_set, flair_award_emoji_to_set, flair_tracker_emoji_to_set,
flair_tracker_text_to_set, flair_tracker_user_account)
final_flair_list = parse_flair_types(final_flair_to_set)
set_current_assigned_flairs(username, final_flair_list)
# Finally set the flair on the subreddit, use the template way if one is set
if flair_template_to_set == "":
set_flair(username, final_flair_to_set, "")
else:
set_flair_with_template(username, final_flair_to_set, flair_template_to_set)
return redirect('/set') # returns user back to /set page