Files
NightSpire/home/views/players.py
T
Inna b3184fbdfe Divide home/views.py en el paquete home/views/ por secciones
El módulo monolítico (~3200 líneas) se convierte en un paquete cuyo
__init__.py re-exporta todas las vistas, de modo que `views.X`,
`from home.views import X` y la cadena 'home.views.not_found' (handler404)
siguen funcionando sin tocar urls.py.

Módulos por sección: _base (imports comunes + require_paid_stripe), auth,
pages, account, recruit, characters, store, points, guild, history,
players y payments. Cada submódulo hereda los imports con
`from ._base import *`; las dependencias entre secciones se resuelven con
imports explícitos (guild->auth, recruit/history->account).

Se eliminan dos definiciones duplicadas que quedaban muertas al cargar:
- get_character_image (primera copia, idéntica a la efectiva)
- store_novawow_success_view (stub sin SOAP, pisado por la versión real)

Validado con `manage.py check` (0 issues), resolución de las 100 rutas y
un chequeo estático de nombres no definidos por módulo.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-12 19:09:40 +00:00

229 lines
8.1 KiB
Python

from ._base import *
def get_race_icon(race):
race_icons = {
1: "human-male",
2: "orc-male",
3: "dwarf-male",
4: "night-elf-male",
5: "undead-male",
6: "tauren-male",
7: "gnome-male",
8: "troll-male",
9: "goblin-male",
10: "blood-elf-male",
11: "draenei-male"
}
return race_icons.get(race, "unknown")
def get_race_iconss(race):
race_iconss = {
1: "human",
2: "orc",
3: "dwarf",
4: "night-elf",
5: "undead",
6: "tauren",
7: "gnome",
8: "troll",
9: "goblin",
10: "blood-elf",
11: "draenei"
}
return race_iconss.get(race, "unknown")
def get_class_icon(char_class):
class_icons = {
1: "warrior",
2: "paladin",
3: "hunter",
4: "rogue",
5: "priest",
6: "death-knight",
7: "shaman",
8: "mage",
9: "warlock",
11: "druid"
}
return class_icons.get(char_class, "unknown")
def get_class_name(char_class):
names = {
1: "Guerrero",
2: "Paladín",
3: "Cazador",
4: "Pícaro",
5: "Sacerdote",
6: "Caballero de la Muerte",
7: "Chamán",
8: "Mago",
9: "Brujo",
11: "Druida"
}
return names.get(char_class, "Desconocido")
def get_achievement_name(achievement_id):
achievement_names = {
457: "¡Primero del reino! Nivel 80",
458: "¡Primero del reino! Pícaro nivel 80",
463: "¡Primero del reino! Brujo nivel 80",
461: "¡Primero del reino! Caballero de la Muerte nivel 80",
462: "¡Primero del reino! Cazador nivel 80",
467: "¡Primero del reino! Chamán nivel 80",
466: "¡Primero del reino! Druida nivel 80",
459: "¡Primero del reino! Guerrero nivel 80",
460: "¡Primero del reino! Mago nivel 80",
465: "¡Primero del reino! Paladín nivel 80",
464: "¡Primero del reino! Sacerdote nivel 80",
1408: "¡Primero del reino! Humano nivel 80",
1407: "¡Primero del reino! Enano nivel 80",
1409: "¡Primero del reino! Elfo de la noche nivel 80",
1404: "¡Primero del reino! Gnomo nivel 80",
1406: "¡Primero del reino! Draenei nivel 80",
1410: "¡Primero del reino! Orco nivel 80",
1413: "¡Primero del reino! Renegado nivel 80",
1411: "¡Primero del reino! Tauren nivel 80",
1412: "¡Primero del reino! Trol nivel 80",
1405: "¡Primero del reino! Elfo de sangre nivel 80"
}
return achievement_names.get(achievement_id, "Logro Desconocido")
def novawow_players_view(request):
# Verificar si el usuario está logueado
if 'username' not in request.session:
return redirect('index')
# Obtener las 5 hermandades con más miembros
with connections['acore_characters'].cursor() as cursor:
guild_query = """
SELECT g.name, c.name AS leader,
CASE WHEN c.race IN (1, 3, 4, 7, 11) THEN 'alliance' ELSE 'horde' END AS faction,
COUNT(gm.guid) AS members,
g.createdate
FROM guild g
JOIN characters c ON c.guid = g.leaderguid
LEFT JOIN guild_member gm ON gm.guildid = g.guildid
GROUP BY g.guildid
ORDER BY members DESC
LIMIT 5
"""
cursor.execute(guild_query)
guilds = cursor.fetchall()
formatted_guilds = [
(name, leader, faction, members, datetime.fromtimestamp(createdate).strftime('%d-%m-%Y'))
for name, leader, faction, members, createdate in guilds
]
# Obtener el top 10 de jugadores con más muertes con honor
with connections['acore_characters'].cursor() as cursor:
kills_query = """
SELECT name, race, class, totalKills, todayKills
FROM characters
ORDER BY totalKills DESC
LIMIT 10
"""
cursor.execute(kills_query)
top_kills = cursor.fetchall()
players_with_kills = [
{
'name': name,
'race_icon': f"big-{get_race_icon(race)}",
'class_icon': f"{get_class_icon(char_class)}-medium",
'total_kills': total_kills,
'today_kills': today_kills
}
for name, race, char_class, total_kills, today_kills in top_kills
]
# Obtener personajes por clase y facción
with connections['acore_characters'].cursor() as cursor:
class_faction_query = """
SELECT class,
SUM(CASE WHEN race IN (1, 3, 4, 7, 11) THEN 1 ELSE 0 END) AS alliance_count,
SUM(CASE WHEN race IN (2, 5, 6, 8, 10) THEN 1 ELSE 0 END) AS horde_count,
COUNT(*) AS total_count
FROM characters
GROUP BY class
"""
cursor.execute(class_faction_query)
class_faction_data = cursor.fetchall()
classes_data = [
{
'class_icon': f"{get_class_icon(char_class)}-chest",
'class_name': get_class_name(char_class),
'total': total_count,
'alliance': alliance_count,
'horde': horde_count
}
for char_class, alliance_count, horde_count, total_count in class_faction_data
]
# Obtener el top 10 de jugadores con más logros
with connections['acore_characters'].cursor() as cursor:
achievements_query = """
SELECT c.name, c.race, c.class, MAX(cap.counter) AS achievement_points
FROM character_achievement_progress cap
JOIN characters c ON cap.guid = c.guid
GROUP BY c.guid
ORDER BY achievement_points DESC
LIMIT 10
"""
cursor.execute(achievements_query)
top_achievements = cursor.fetchall()
players_with_achievements = [
{
'name': name,
'race_icon': f"big-{get_race_icon(race)}",
'class_icon': f"{get_class_icon(char_class)}-medium",
'achievement_points': achievement_points
}
for name, race, char_class, achievement_points in top_achievements
]
# Obtener logros "Primeros del Reino"
with connections['acore_characters'].cursor() as cursor:
first_realm_query = """
SELECT ca.achievement, c.name, c.race, c.class, c.gender, ca.date
FROM character_achievement ca
JOIN characters c ON ca.guid = c.guid
WHERE ca.achievement IN (
457, 458, 463, 461, 462, 467, 466, 459, 460, 465, 464,
1408, 1407, 1409, 1404, 1406, 1410, 1413, 1411, 1412, 1405
)
ORDER BY ca.date ASC
"""
cursor.execute(first_realm_query)
first_realm_achievements = cursor.fetchall()
first_realm_data = []
for achievement in first_realm_achievements:
achievement_id, name, race, char_class, gender, date = achievement
formatted_date = datetime.fromtimestamp(date).strftime('%H:%M:%S %d-%m-%Y')
# Determinar el ícono correcto basado en el logro
if achievement_id == 457:
icon_url = f"{settings.URL_PRINCIPAL}/static/nw-themes/nw-ryu/nw-images/nw-icons/achievement-level-80.jpg"
elif achievement_id in [1408, 1407, 1409, 1404, 1406, 1410, 1413, 1411, 1412, 1405]:
race_iconss = get_race_iconss(race)
gender_suffix = "male" if gender == 0 else "female"
icon_url = f"{settings.URL_PRINCIPAL}/static/nw-themes/nw-ryu/nw-images/nw-races/big-{race_iconss}-{gender_suffix}.webp"
else:
icon_url = f"{settings.URL_PRINCIPAL}/static/nw-themes/nw-ryu/nw-images/nw-classes/{get_class_icon(char_class)}-medium.jpg"
first_realm_data.append({
'achievement_name': get_achievement_name(achievement_id),
'name': name,
'race_iconss': f"big-{get_race_iconss(race)}",
'icon_url': icon_url,
'date': formatted_date
})
# Renderizar la plantilla con los datos obtenidos
return render(request, 'realms/novawow_players.html', {
'guilds': formatted_guilds,
'players_with_kills': players_with_kills,
'players_with_achievements': players_with_achievements,
'classes_data': classes_data,
'first_realm_data': first_realm_data
})