{#-
       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.
-#}
{% extends "allura.ext.user_profile:templates/profile_section_base.html" %}
{% import 'allura:templates/jinja_master/lib.html' as lib with context %}
{% import 'forgeactivity:templates/macros.html' as am with context %}

{% block title %}
    User Activity
{% endblock %}

{% block actions %}
    {% if c.user and not c.user.is_anonymous() and c.user != user %}
        {{follow_toggle.display(following=following, action=activity_app.url+'follow')}}
    {% endif %}
    {{ g.icons['feed'].render(href='feed.rss', title='RSS', rel='nofollow') }}
{% endblock %}

{% block section_class %}activity{% endblock %}

{% block content %}
    {{ am.timeline_section(timeline, activity_app) }}
{% endblock %}
