| {#- |
| 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 stats{% endblock %} |
| |
| {% block header %} |
| Statistics about {{user.display_name}}'s contribution |
| {% if category %} |
| in projects of category {{category.fullname}} |
| {% endif %} |
| {% endblock %} |
| |
| {% block content %} |
| {% if user and (user.stats.visible or (c.user == user)) %} |
| |
| {% if category %} |
| <ul> |
| <li><a href="{{c.project.url()}}userstats">Go back to general statistics</a></li> |
| </ul> |
| {% endif %} |
| <h2>General statistics</h2> |
| <table> |
| <thead> |
| <tr> |
| <th>Parameter</th> |
| <th>Date</th> |
| <th>Time interval</th> |
| </tr> |
| </thead> |
| <tbody> |
| <tr> |
| <td>Registration date</td> |
| <td>{{registration_date.strftime("%d %b %Y, %H:%M:%S (UTC)")}}</td> |
| <td>{{days}} day{% if days != 1 %}s{% endif %} ago</td> |
| </tr> |
| {% if last_login %} |
| <tr> |
| <td>Last login</td> |
| <td>{{last_login.strftime("%d %b %Y, %H:%M:%S (UTC)")}}</td> |
| <td>{{last_login_days}} day{% if last_login_days != 1 %}s{% endif %} ago</td> |
| </tr> |
| {% endif %} |
| </tbody> |
| </table> |
| |
| <h2>Contribution statistics</h2> |
| |
| <table> |
| <thead> |
| <tr> |
| <th>Parameter</th> |
| <th>Total value</th> |
| <th>Average per-month value</th> |
| <th>Last 30 days</th> |
| {% if days >= 30 %} |
| <th>Trend</th> |
| {% endif %} |
| </tr> |
| </thead> |
| <tbody> |
| {% if not category %} |
| <tr> |
| <td>Logins</td> |
| <td>{{totlogins}}</td> |
| <td>{{permonthlogins}}</td> |
| <td>{{lastmonth_logins}}</td> |
| {% if days >= 30 %} |
| <td style="text-align:center;"> |
| {% if lastmonth_logins > permonthlogins %} |
| <img src="{{g.forge_static('images/up.png')}}"/> |
| {% elif lastmonth_logins == permonthlogins %} |
| <img src="{{g.forge_static('images/equal.png')}}"/> |
| {% else %} |
| <img src="{{g.forge_static('images/down.png')}}"/> |
| {%endif%} |
| </td> |
| {% endif %} |
| </tr> |
| {% endif %} |
| <tr> |
| <td> |
| {% if totcommits.number > 0 %} |
| <a href="{{c.project.url()}}userstats/commits/">Commits number</a> |
| {% else %} |
| Commits number |
| {% endif %} |
| </td> |
| <td>{{totcommits.number}}</td> |
| <td>{{permonthcommits.number}}</td> |
| <td>{{lastmonthcommits.number}}</td> |
| {% if days >= 30 %} |
| <td style="text-align:center;"> |
| {% if lastmonthcommits.number > permonthcommits.number %} |
| <img src="{{g.forge_static('images/up.png')}}"/> |
| {% elif lastmonthcommits.number == permonthcommits.number %} |
| <img src="{{g.forge_static('images/equal.png')}}"/> |
| {% else %} |
| <img src="{{g.forge_static('images/down.png')}}"/> |
| {%endif%} |
| </td> |
| {% endif %} |
| </tr> |
| <tr> |
| <td> |
| {% if totcommits.lines > 0 %} |
| <a href="{{c.project.url()}}userstats/commits/">Added/modified LOCs</a> |
| {% else %} |
| Added/modified LOCs |
| {% endif %} |
| </td> |
| <td>{{totcommits.lines}}</td> |
| <td>{{permonthcommits.lines}}</td> |
| <td>{{lastmonthcommits.lines}}</td> |
| {% if days >= 30 %} |
| <td style="text-align:center;"> |
| {% if lastmonthcommits.lines > permonthcommits.lines %} |
| <img src="{{g.forge_static('images/up.png')}}"/> |
| {% elif lastmonthcommits.lines == permonthcommits.lines %} |
| <img src="{{g.forge_static('images/equal.png')}}"/> |
| {% else %} |
| <img src="{{g.forge_static('images/down.png')}}"/> |
| {%endif%} |
| </td> |
| {% endif %} |
| </tr> |
| <tr> |
| <td> |
| {% if totartifacts.created > 0 %} |
| <a href="{{c.project.url()}}userstats/artifacts/">Total number of created artifacts</a> |
| {% else %} |
| Total number of created artifacts |
| {% endif %} |
| </td> |
| <td>{{totartifacts.created}}</td> |
| <td>{{permonthartifacts.created}}</td> |
| <td>{{lastmonthartifacts.created}}</td> |
| {% if days >= 30 %} |
| <td style="text-align:center;"> |
| {% if lastmonthartifacts.created > permonthartifacts.created %} |
| <img src="{{g.forge_static('images/up.png')}}"/> |
| {% elif lastmonthartifacts.created == permonthartifacts.created %} |
| <img src="{{g.forge_static('images/equal.png')}}"/> |
| {% else %} |
| <img src="{{g.forge_static('images/down.png')}}"/> |
| {%endif%} |
| </td> |
| {% endif %} |
| </tr> |
| <tr> |
| <td> |
| {% if totartifacts.modified > 0 %} |
| <a href="{{c.project.url()}}userstats/artifacts/">Total number of edited artifacts</a> |
| {% else %} |
| Total number of edited artifacts |
| {% endif %} |
| </td> |
| <td>{{totartifacts.modified}}</td> |
| <td>{{permonthartifacts.modified}}</td> |
| <td>{{lastmonthartifacts.modified}}</td> |
| {% if days >= 30 %} |
| <td style="text-align:center;"> |
| {% if lastmonthartifacts.modified > permonthartifacts.modified %} |
| <img src="{{g.forge_static('images/up.png')}}"/> |
| {% elif lastmonthartifacts.modified == permonthartifacts.modified %} |
| <img src="{{g.forge_static('images/equal.png')}}"/> |
| {% else %} |
| <img src="{{g.forge_static('images/down.png')}}"/> |
| {%endif%} |
| </td> |
| {% endif %} |
| </tr> |
| |
| {% for key, value in artifacts_by_type.items() %} |
| <tr> |
| <td> |
| {% if value.created > 0 %} |
| <a href="{{c.project.url()}}userstats/artifacts/">Created {{key}} artifacts</a> |
| {% else %} |
| Created {{key}} artifacts |
| {% endif %} |
| </td> |
| <td>{{value.created}}</td> |
| <td>{{value.pmcreated}}</td> |
| <td> |
| {% if lastmonth_artifacts_by_type.get(key) %} |
| {{lastmonth_artifacts_by_type[key].created}} |
| {% else %} |
| 0 |
| {% endif %} |
| </td> |
| {% if days >= 30 %} |
| <td style="text-align:center;"> |
| {% if lastmonth_artifacts_by_type.get(key) %} |
| {% if lastmonth_artifacts_by_type[key].created > value.pmcreated %} |
| <img src="{{g.forge_static('images/up.png')}}"/> |
| {% elif lastmonth_artifacts_by_type[key].created == value.pmcreated %} |
| <img src="{{g.forge_static('images/equal.png')}}"/> |
| {% else %} |
| <img src="{{g.forge_static('images/down.png')}}"/> |
| {%endif%} |
| {%else%} <img src="{{g.forge_static('images/down.png')}}"/> {%endif%} |
| </td> |
| {% endif %} |
| </tr> |
| <tr> |
| <td> |
| {% if value.modified > 0 %} |
| <a href="{{c.project.url()}}userstats/artifacts/">Edited {{key}} artifacts</a> |
| {% else %} |
| Edited {{key}} artifacts |
| {% endif %} |
| </td> |
| <td>{{value.modified}}</td> |
| <td>{{value.pmmodified}}</td> |
| <td> |
| {% if lastmonth_artifacts_by_type.get(key) %} |
| {{lastmonth_artifacts_by_type[key].modified}} |
| {% else %} |
| 0 |
| {% endif %} |
| </td> |
| {% if days >= 30 %} |
| <td style="text-align:center;"> |
| {% if lastmonth_artifacts_by_type.get(key) %} |
| {% if lastmonth_artifacts_by_type[key].modified > value.pmmodified %} |
| <img src="{{g.forge_static('images/up.png')}}"/> |
| {% elif lastmonth_artifacts_by_type[key].modified == value.pmmodified %} |
| <img src="{{g.forge_static('images/equal.png')}}"/> |
| {% else %} |
| <img src="{{g.forge_static('images/down.png')}}"/> |
| {%endif%} |
| {%else%} <img src="{{g.forge_static('images/down.png')}}"/> {%endif%} |
| </td> |
| {% endif %} |
| </tr> |
| {% endfor %} |
| |
| <tr> |
| <td> |
| {% if tottickets.assigned > 0 %} |
| <a href="{{c.project.url()}}userstats/tickets/">Assigned tickets</a> |
| {% else %} |
| Assigned tickets |
| {% endif %} |
| </td> |
| <td>{{tottickets.assigned}}</td> |
| <td>{{permonthtickets.assigned}}</td> |
| <td>{{lastmonthtickets.assigned}}</td> |
| {% if days >= 30 %} |
| <td style="text-align:center;"> |
| {% if lastmonthtickets.assigned > permonthtickets.assigned %} |
| <img src="{{g.forge_static('images/up.png')}}"/> |
| {% elif lastmonthtickets.assigned == permonthtickets.assigned %} |
| <img src="{{g.forge_static('images/equal.png')}}"/> |
| {% else %} |
| <img src="{{g.forge_static('images/down.png')}}"/> |
| {%endif%} |
| </td> |
| {% endif %} |
| </tr> |
| <tr> |
| <td> |
| {% if tottickets.revoked > 0 %} |
| <a href="{{c.project.url()}}userstats/tickets/">Revoked tickets</a> |
| {% else %} |
| Revoked tickets |
| {% endif %} |
| </td> |
| <td>{{tottickets.revoked}}</td> |
| <td>{{permonthtickets.revoked}}</td> |
| <td>{{lastmonthtickets.revoked}}</td> |
| {% if days >= 30 %} |
| <td style="text-align:center;"> |
| {% if lastmonthtickets.revoked > permonthtickets.revoked %} |
| <img src="{{g.forge_static('images/up.png')}}"/> |
| {% elif lastmonthtickets.revoked == permonthtickets.revoked %} |
| <img src="{{g.forge_static('images/equal.png')}}"/> |
| {% else %} |
| <img src="{{g.forge_static('images/down.png')}}"/> |
| {%endif%} |
| </td> |
| {% endif %} |
| </tr> |
| <tr> |
| <td> |
| {% if tottickets.solved > 0 %} |
| <a href="{{c.project.url()}}userstats/tickets/">Solved tickets</a> |
| {% else %} |
| Solved tickets |
| {% endif %} |
| </td> |
| <td>{{tottickets.solved}}</td> |
| <td>{{permonthtickets.solved}}</td> |
| <td>{{lastmonthtickets.solved}}</td> |
| {% if days >= 30 %} |
| <td style="text-align:center;"> |
| {% if lastmonthtickets.solved > permonthtickets.solved %} |
| <img src="{{g.forge_static('images/up.png')}}"/> |
| {% elif lastmonthtickets.solved == permonthtickets.solved %} |
| <img src="{{g.forge_static('images/equal.png')}}"/> |
| {% else %} |
| <img src="{{g.forge_static('images/down.png')}}"/> |
| {%endif%} |
| </td> |
| {% endif %} |
| </tr> |
| <tr> |
| <td> |
| {% if tottickets.averagesolvingtime > 0 %} |
| <a href="{{c.project.url()}}userstats/tickets/">Average tickets solving time</a> |
| {% else %} |
| Average tickets solving time |
| {% endif %} |
| </td> |
| <td> |
| {% if tottickets.averagesolvingtime %} |
| {{tottickets.averagesolvingtime.days}} days, |
| {{tottickets.averagesolvingtime.hours}} hours, |
| {{tottickets.averagesolvingtime.minutes}} min |
| {% else %}n/a{% endif %} |
| </td> |
| <td>n/a</td> |
| <td> |
| {% if lastmonthtickets.averagesolvingtime %} |
| {{lastmonthtickets.averagesolvingtime.days}} days, |
| {{lastmonthtickets.averagesolvingtime.hours}} hours, |
| {{lastmonthtickets.averagesolvingtime.minutes}} min |
| {% else %}n/a{% endif %} |
| </td> |
| {% if days >= 30 %} |
| <td style="text-align:center;"> |
| {% if lastmonthtickets.averagesolvingtime > tottickets.averagesolvingtime %} |
| <img src="{{g.forge_static('images/up.png')}}"/> |
| {% elif lastmonthtickets.averagesolvingtime == tottickets.averagesolvingtime %} |
| <img src="{{g.forge_static('images/equal.png')}}"/> |
| {% else %} |
| <img src="{{g.forge_static('images/down.png')}}"/> |
| {%endif%} |
| </td> |
| {% endif %} |
| </tr> |
| </tbody> |
| </table> |
| |
| {% if categories %} |
| <h2>Preferred categories</h2> |
| <p> |
| The following table shows the number projects tagged as belonging to each single category in which this user is involved. |
| </p> |
| <table> |
| <thead> |
| <tr> |
| <th>Category name</th> |
| <th>Number of projects</th> |
| </tr> |
| </thead> |
| <tbody> |
| {% for cat, count in categories %} |
| <tr> |
| <td><a href="{{c.project.url()}}userstats/category/{{cat.shortname}}">{{cat.fullname}}</a></td> |
| <td>{{count}}</td> |
| </tr> |
| {% endfor %} |
| </tbody> |
| </table> |
| {% endif %} |
| {% else %} |
| {% if user %} |
| <h2>Statistics not available</h2> |
| <div class="grid-20"> |
| This user has set his or her preferences so that personal statistics are not visible |
| to other users of the forge. |
| </div> |
| {% else %} |
| <h2>Invalid user</h2> |
| <div class="grid-20"> |
| You are looking for personal statistics of a user which doesn't exist on this forge. Check your url. |
| </div> |
| {% endif %} |
| {% endif %} |
| |
| {% endblock %} |