Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions scripts/queries.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
from django.db import connection


# Returns a dictionary with character IDs as keys and the number of scripts containing that character as the value
# Characters which are not present in any scripts will not be in the result
def get_all_script_character_counts(queryset):
with connection.cursor() as cursor:
cursor.execute(f"""
SELECT character_instance->>'id' AS character, COUNT(1) AS count
FROM "scripts_scriptversion"
CROSS JOIN LATERAL jsonb_array_elements(content) character_instance
WHERE character_instance->>'id' != '_meta'
AND scripts_scriptversion.id IN ({queryset.values("id").query})
GROUP BY character_instance->>'id'
ORDER BY count DESC
""")
return dict(cursor.fetchall())
9 changes: 5 additions & 4 deletions scripts/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
cache,
constants,
filters,
queries,
forms,
models,
script_json,
Expand Down Expand Up @@ -635,7 +636,7 @@ def get_context_data(self, **kwargs: Any) -> Dict[str, Any]:
pass

context["total"] = queryset.count()
if queryset.count() == 0:
if context["total"] == 0:
return context

character_count = {}
Expand All @@ -644,14 +645,14 @@ def get_context_data(self, **kwargs: Any) -> Dict[str, Any]:
character_count[type.value] = Counter()
num_count[type.value] = Counter()

character_counts = queries.get_all_script_character_counts(queryset)

for character in models.ClocktowerCharacter.objects.all():
# If we're on a Character Statistics page, don't include this character in the count.
if character == stats_character:
continue

character_count[character.character_type][character] = queryset.filter(
content__contains=[{"id": character.character_id}]
).count()
character_count[character.character_type][character] = character_counts.get(character.character_id, 0)

for type in models.CharacterType:
context[type.value] = character_count[type.value].most_common(characters_to_display)
Expand Down