b3184fbdfe
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>
229 lines
8.1 KiB
Python
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
|
|
})
|