Skip to content
Snippets Groups Projects
Select Git revision
  • d06f25701b639f40314e72947a70e4e6a3f66e1d
  • main default protected
  • feature/export-filtering
  • feature/clear-schedule-button
  • fix/responsive-cols-in-polls
  • feature/preference-polling-form
  • feature/json-export-via-rest-framework
  • feature/json-schedule-import-tests
  • fix/add-room-import-only-once
  • ak-import
  • renovate/django-simple-history-3.x
  • renovate/django-debug-toolbar-4.x
  • renovate/django-5.x
  • renovate/mysqlclient-2.x
14 results

admin.py

Blame
  • Forked from KIF / AKPlanning
    Source project has a limited visibility.
    Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    team_page.py 7.09 KiB
    from datetime import datetime
    from tools import clean_filename
    
    def get_team_page_html(self, team_name, team_data, team_competitions):
        html_content = f"""<!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <meta name="description" content="Overview of the elo history of {team_name}">
            <meta name="viewport" content="width=device-width, initial-scale=1.0">
            <title>{team_name} - Elo Profile</title>
            {self.header_snippet}
            <style>
                body {{
                    font-family: Arial, sans-serif;
                    line-height: 1.6;
                    margin: 0;
                    padding: 20px;
                    max-width: 1200px;
                    margin: 0 auto;
                }}
                h1, h2 {{
                    color: #333;
                    animation: fadeInUp 0.5s ease-out forwards;
                }}
                table {{
                    border-collapse: collapse;
                    width: 100%;
                    margin-top: 20px;
                    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
                    border-radius: 5px;
                    overflow: hidden;
                    animation: fadeInUp 0.5s ease-out forwards;
                    opacity: 0;
                }}
    
                th, td {{
                    padding: 12px 15px;
                    text-align: left;
                }}
    
                th {{
                    background-color: #f2f2f2;
                    color: #333;
                    font-weight: bold;
                    text-transform: uppercase;
                    border-bottom: 2px solid {self.BORDER_COLOR};
                }}
    
                tr {{
                    background-color: white;
                    transition: background-color 0.3s ease;
                }}
    
                tr:nth-child(even) {{
                    background-color: #f9f9f9;
                }}
    
                tr:hover {{
                    background-color: #f5f5f5;
                }}
                p {{
                    animation: fadeInUp 0.5s ease-out forwards;
                }}
                .chart-container {{
                    margin-top: 30px;
                    display: flex;
                    justify-content: center;
                    width: 100%;
                    animation: fadeInUp 0.5s ease-out forwards;
                    opacity: 0;
                    box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);
                    border-radius: 5px;
                    overflow: hidden;
                    background-color: white;
                    padding: 20px;
                    box-sizing: border-box;
                }}
                .chart-container img {{
                    max-width: 100%;
                    height: auto;
                }}
                a {{
                    color: {self.LINK_COLOR};
                    text-decoration: none;
                    transition: color 0.3s ease;
                }}
                a:hover {{
                    color: {self.LINK_COLOR_HOVER};
                    text-decoration: none;
                }}
                .summary-stats {{
                    display: flex;
                    justify-content: space-around;
                    margin: 20px 0;
                    flex-wrap: wrap;
                    animation: fadeInUp 0.5s ease-out forwards;
                }}
                .stat-box {{
                    padding: 15px;
                    border: 1px solid #ddd;
                    border-radius: 5px;
                    margin: 10px;
                    flex: 1;
                    min-width: 150px;
                    text-align: center;
                    background-color: #f9f9f9;
                }}
                .stat-value {{
                    font-size: 24px;
                    font-weight: bold;
                    color: #333;
                }}
                .stat-label {{
                    font-size: 14px;
                    color: #666;
                }}
                .positive {{
                    color: green;
                }}
                .negative {{
                    color: red;
                }}
                @keyframes fadeInUp {{
                    from {{
                        opacity: 0;
                        transform: translateY(20px);
                    }}
                    to {{
                        opacity: 1;
                        transform: translateY(0);
                    }}
                }}
            </style>
        </head>
        <body>
            <h1>{team_name} - Elo Profile</h1>
            <p><a href="../index.html">← Back to World Ranking</a></p>
    
            <div class="summary-stats">
                <div class="stat-box">
                    <div class="stat-value">{int(team_data['elo'])}</div>
                    <div class="stat-label">Current Elo</div>
                </div>
                <div class="stat-box">
                    <div class="stat-value">{team_data['competitions']}</div>
                    <div class="stat-label">Competitions</div>
                </div>
        """
    
        # Calculate average ranking if available
        if team_competitions:
            avg_rank = sum(comp['placement'] for comp in team_competitions) / len(team_competitions)
            best_rank = min(comp['placement'] for comp in team_competitions)
    
            html_content += f"""
                <div class="stat-box">
                    <div class="stat-value">{avg_rank:.1f}</div>
                    <div class="stat-label">Avg. Placement</div>
                </div>
                <div class="stat-box">
                    <div class="stat-value">{best_rank}</div>
                    <div class="stat-label">Best Placement</div>
                </div>
        """
    
        html_content += f"""
            </div>
    
            <div class="chart-container">
                <img src="../images/{clean_filename(team_name)}_history.{self.IMAGE_FORMAT}" alt="{team_name} Elo History">
            </div>
    
            <h2>Competition History</h2>
            <p>Rank includes legacy teams</p>
            <div style="overflow-x: scroll;">
                <table>
                    <tr>
                        <th>Comp</th>
                        <th>Placement</th>
                        <th>Rank Before</th>
                        <th>Rank After</th>
                        <th>Rank Change</th>
                        <th>Elo Before</th>
                        <th>Elo After</th>
                        <th>Elo Change</th>
                    </tr>
        """
    
        # Add rows for each competition
        for comp in team_competitions:
            elo_change = comp['elo_change']
            elo_change_class = "positive" if elo_change > 0 else "negative" if elo_change < 0 else ""
            rank_change = comp['rank_change']
            rank_change_class = "positive" if rank_change < 0 else "negative" if rank_change > 0 else ""
    
            html_content += f"""
                <tr>
                    <td><a href=../comp/{comp['competition_id']}.html>{comp['competition']} {comp['date'][2:4]}</a></td>
                    <td>{comp['placement']} / {comp['participants']}</td>
                    <td>{comp['old_rank']}</td>
                    <td>{comp['new_rank']}</td>
                    <td class="{rank_change_class}">{'+' if rank_change > 0 else ''}{comp['rank_change']}</td>
                    <td>{int(comp['previous_elo'])}</td>
                    <td>{int(comp['new_elo'])}</td>
                    <td class="{elo_change_class}">{'+' if elo_change > 0 else ''}{elo_change:.1f}</td>
                </tr>"""
    
        html_content += """
                </table>
            </div>
    
            <p><small>Generated on {}</small></p>
        </body>
        </html>
        """.format(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
    
        return html_content