{#-
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
-#}
{% set hide_left_bar = True %}
{% extends g.theme.master %}

{% block title %}{{user.username}} / Profile{% endblock %}

{% block header %}{{ user.display_name|default(user.username) }}{% endblock %}

{% block head %}
    {%  if noindex %}
    <meta name="robots" content="noindex, follow">
    {%  endif %}
  <link rel="alternate" type="application/rss+xml" title="RSS" href="feed.rss">
  <link rel="alternate" type="application/atom+xml" title="Atom" href="feed.atom">
{% endblock %}

{% block actions %}
  {{ g.icons['feed'].render(href=c.app.url + 'feed.rss', title='Follow') }}
{% endblock %}

{% block nav_menu %}
    {% if user != c.user and not c.user.is_anonymous() %}
    {{ g.icons['mail'].render(
        title='Send Message',
        show_title=True,
        rel="nofollow",
        href=c.app.url + 'send_message',
        extra_css='btn',
        id='user-message') }}
    {% endif %}
    {{super()}}
{% endblock %}

{% block top_nav %}{# disabled #}{% endblock %}

{% block content_base %}
  {% if h.is_site_admin(c.user) %}
    {# maybe could be a regular user profile "section" but would need a way to make it conditionally display #}
    <div class="profile-section tools">
        <h3 style="background: darkorange">Site Admin</h3>
        <div class="section-body">
            <ul>
                <li><a href="/nf/admin/user/{{ user.username }}">Admin details page for {{ user.username }}</a></li>
                {% if user.disabled %}
                    <li>User is <strong>DISABLED</strong>. <span style="color:darkorange">This page is only visible because you are a site admin.  Everyone else gets a 404 error page.</span></li>
                {% endif %}
            </ul>
        </div>
    </div>
  {% endif %}
  {% for section in sections %}
    {{ section.display() }}
  {% endfor %}
{% endblock %}
