diff --git a/pagure/templates/master.html b/pagure/templates/master.html
index 9866694..5ed2be1 100644
--- a/pagure/templates/master.html
+++ b/pagure/templates/master.html
@@ -83,11 +83,6 @@
url_for('ui_ns.view_user_requests', username=g.fas_user.username)
}}">My Pull Requests
-
My Stars
-
-
Log Out
diff --git a/pagure/templates/user_stars.html b/pagure/templates/user_stars.html
deleted file mode 100644
index 6916948..0000000
--- a/pagure/templates/user_stars.html
+++ /dev/null
@@ -1,41 +0,0 @@
-{% extends "master.html" %}
-
-{% block title %}{{ username }}'s starred Projects{% endblock %}
-
-{% block content %}
-
-
-
- {{ repos | length }} Projects Starred by {{ username }}
-
-
-
-
-
-{% endblock %}
diff --git a/pagure/templates/userprofile_forks.html b/pagure/templates/userprofile_forks.html
new file mode 100644
index 0000000..e9196d9
--- /dev/null
+++ b/pagure/templates/userprofile_forks.html
@@ -0,0 +1,28 @@
+{% extends "userprofile_master.html" %}
+
+{% block title %}{{user.username}} - overview{% endblock %}
+
+{% from "_render_repo.html" import pagination_link %}
+{% from "userprofile_macros.html" import render_repo_listing %}
+
+
+{% block userprofile_content %}
+
+
+
+
Forks
+ {{ forks_length }} projects
+
+ {% if forks %}
+ {{ render_repo_listing(forks)}}
+ {% if total_page_forks and total_page_forks > 1 %}
+ {{ pagination_link('forkpage', forkpage, total_page_forks) }}
+ {% endif %}
+ {% else %}
+
+ {% endif %}
+
+
+{% endblock %}
diff --git a/pagure/templates/userprofile_groups.html b/pagure/templates/userprofile_groups.html
new file mode 100644
index 0000000..1ae0d09
--- /dev/null
+++ b/pagure/templates/userprofile_groups.html
@@ -0,0 +1,44 @@
+{% extends "userprofile_master.html" %}
+
+{% from "userprofile_macros.html" import render_repo_listing %}
+
+{% block title %}{{user.username}} - groups{% endblock %}
+
+{% block userprofile_content %}
+
+
+
+
Groups
+ {{ user.groups | length }} groups
+
+
+ {% for group in groups %}
+
+ {% else %}
+
+ {% endfor %}
+
+
+
+
+{% endblock %}
diff --git a/pagure/templates/userprofile_macros.html b/pagure/templates/userprofile_macros.html
new file mode 100644
index 0000000..6da5c45
--- /dev/null
+++ b/pagure/templates/userprofile_macros.html
@@ -0,0 +1,40 @@
+{% macro render_repo_listing(repos) %}
+
+ {% for repo in repos %}
+ {% set url = url_for('ui_ns.view_repo',
+ repo=repo.name,
+ username=repo.user.username if repo.is_fork else None,
+ namespace=repo.namespace) %}
+
+ {% endfor %}
+
+{% endmacro %}
\ No newline at end of file
diff --git a/pagure/templates/userprofile_master.html b/pagure/templates/userprofile_master.html
new file mode 100644
index 0000000..59a3475
--- /dev/null
+++ b/pagure/templates/userprofile_master.html
@@ -0,0 +1,106 @@
+{% extends "master.html" %}
+
+{% block title %}User {{username}}{% endblock %}
+
+{% block header %}
+
+{% endblock %}
+
+
+{% from "_render_repo.html" import render_repos_as_card, render_activity_graph %}
+
+
+{% block content %}
+
+
+
+
+
+
+ {% block userprofile_content %}
+ {% endblock %}
+
+
+
+{% endblock %}
diff --git a/pagure/templates/userprofile_overview.html b/pagure/templates/userprofile_overview.html
new file mode 100644
index 0000000..69d5fa8
--- /dev/null
+++ b/pagure/templates/userprofile_overview.html
@@ -0,0 +1,51 @@
+{% extends "userprofile_master.html" %}
+
+{% block title %}{{user.username}} - overview{% endblock %}
+
+{% from "_render_repo.html" import render_activity_graph %}
+
+{% block userprofile_content %}
+
+
+ {% if owned_repos %}
+
Top Projects
+
+ {% for repo in owned_repos %}
+
+ {% endfor %}
+
+
+ {% endif %}
+
Activity
+
+
+
+ {{ render_activity_graph(username, _class="mx-auto") }}
+
+
+
+
+
+{% endblock %}
diff --git a/pagure/templates/userprofile_projects.html b/pagure/templates/userprofile_projects.html
new file mode 100644
index 0000000..bb3154a
--- /dev/null
+++ b/pagure/templates/userprofile_projects.html
@@ -0,0 +1,28 @@
+{% extends "userprofile_master.html" %}
+
+{% block title %}{{user.username}} - overview{% endblock %}
+
+{% from "_render_repo.html" import pagination_link %}
+{% from "userprofile_macros.html" import render_repo_listing %}
+
+
+{% block userprofile_content %}
+
+
+
+
Projects
+ {{ repos_length }} projects
+
+ {% if repos %}
+ {{ render_repo_listing(repos)}}
+ {% if total_page_repos and total_page_repos > 1 %}
+ {{ pagination_link('repopage', repopage, total_page_repos) }}
+ {% endif %}
+ {% else %}
+
+ {% endif %}
+
+
+{% endblock %}
diff --git a/pagure/templates/userprofile_starred.html b/pagure/templates/userprofile_starred.html
new file mode 100644
index 0000000..a1c99f0
--- /dev/null
+++ b/pagure/templates/userprofile_starred.html
@@ -0,0 +1,23 @@
+{% extends "userprofile_master.html" %}
+
+{% from "userprofile_macros.html" import render_repo_listing %}
+
+{% block title %}{{user.username}} - starred{% endblock %}
+
+{% block userprofile_content %}
+
+
+
+
Starred Projects
+ {{ user.stars | length }} projects
+
+ {% if repos %}
+ {{ render_repo_listing(repos)}}
+ {% else %}
+
+
No starred projects or forks
+
+ {% endif %}
+
+
+{% endblock %}
diff --git a/pagure/ui/app.py b/pagure/ui/app.py
index 80c7834..dcdd27a 100644
--- a/pagure/ui/app.py
+++ b/pagure/ui/app.py
@@ -624,6 +624,26 @@ def view_projects(pattern=None, namespace=None):
)
+def get_userprofile_common(user):
+ userprofile_counts = {}
+
+ userprofile_counts['repos_length'] = pagure.lib.search_projects(
+ flask.g.session,
+ username=user.username,
+ fork=False,
+ exclude_groups=None,
+ private=False,
+ count=True)
+
+ userprofile_counts['forks_length'] = pagure.lib.search_projects(
+ flask.g.session,
+ username=user.username,
+ fork=True,
+ private=False,
+ count=True)
+
+ return userprofile_counts
+
@UI_NS.route('/user/
/')
@UI_NS.route('/user/')
def view_user(username):
@@ -631,6 +651,127 @@ def view_user(username):
"""
user = _get_user(username=username)
+ # public profile, so never show private repos,
+ # even if the user is viewing themself
+ private = False
+
+ owned_repos = pagure.lib.list_users_projects(
+ flask.g.session,
+ username=username,
+ exclude_groups=None,
+ fork=False,
+ private=private,
+ limit=6,
+ acls=["main admin"],
+ )
+
+ userprofile_common = get_userprofile_common(user)
+
+ return flask.render_template(
+ 'userprofile_overview.html',
+ username=username,
+ user=user,
+ owned_repos=owned_repos,
+ repos_length=userprofile_common['repos_length'],
+ forks_length=userprofile_common['forks_length'],
+ select='overview',
+ )
+
+
+@UI_NS.route('/user//projects/')
+@UI_NS.route('/user//projects')
+def userprofile_projects(username):
+ """ Public Profile view of a user's projects.
+ """
+ user = _get_user(username=username)
+
+ repopage = flask.request.args.get('repopage', 1)
+ try:
+ repopage = int(repopage)
+ if repopage < 1:
+ repopage = 1
+ except ValueError:
+ repopage = 1
+
+ limit = pagure_config['ITEM_PER_PAGE']
+ repo_start = limit * (repopage - 1)
+
+ repos = pagure.lib.search_projects(
+ flask.g.session,
+ username=username,
+ fork=False,
+ exclude_groups=pagure_config.get('EXCLUDE_GROUP_INDEX'),
+ start=repo_start,
+ limit=limit,
+ private=False)
+
+ userprofile_common = get_userprofile_common(user)
+ total_page_repos = int(
+ ceil(userprofile_common['repos_length'] / float(limit)))
+
+ return flask.render_template(
+ 'userprofile_projects.html',
+ username=username,
+ user=user,
+ repos=repos,
+ total_page_repos=total_page_repos,
+ repopage=repopage,
+ repos_length=userprofile_common['repos_length'],
+ forks_length=userprofile_common['forks_length'],
+ select="projects",
+ )
+
+@UI_NS.route('/user//forks/')
+@UI_NS.route('/user//forks')
+def userprofile_forks(username):
+ """ Public Profile view of a user's forks.
+ """
+ user = _get_user(username=username)
+
+ forkpage = flask.request.args.get('forkpage', 1)
+ try:
+ forkpage = int(forkpage)
+ if forkpage < 1:
+ forkpage = 1
+ except ValueError:
+ forkpage = 1
+
+ limit = pagure_config['ITEM_PER_PAGE']
+ fork_start = limit * (forkpage - 1)
+
+ forks = pagure.lib.search_projects(
+ flask.g.session,
+ username=username,
+ fork=True,
+ start=fork_start,
+ limit=limit,
+ private=False)
+
+ userprofile_common = get_userprofile_common(user)
+ total_page_forks = int(
+ ceil(userprofile_common['forks_length'] / float(limit)))
+
+ return flask.render_template(
+ 'userprofile_forks.html',
+ username=username,
+ user=user,
+ forks=forks,
+ total_page_forks=total_page_forks,
+ forkpage=forkpage,
+ repos_length=userprofile_common['repos_length'],
+ forks_length=userprofile_common['forks_length'],
+ select="forks",
+ )
+
+
+# original view_user()
+@UI_NS.route('/user2//')
+@UI_NS.route('/user2/')
+def view_user2(username):
+ """ Front page of a specific user.
+ """
+ user = _get_user(username=username)
+
acl = flask.request.args.get('acl', '').strip().lower() or None
repopage = flask.request.args.get('repopage', 1)
@@ -696,7 +837,7 @@ def view_user(username):
total_page_forks = int(ceil(forks_length / float(limit)))
return flask.render_template(
- 'user_info.html',
+ 'userprofile_overview.html',
username=username,
user=user,
repos=repos,
@@ -754,7 +895,7 @@ def view_user_issues(username):
@UI_NS.route('/user//stars/')
@UI_NS.route('/user//stars')
-def view_user_stars(username):
+def userprofile_starred(username):
"""
Shows the starred projects of the specified user.
@@ -762,12 +903,41 @@ def view_user_stars(username):
"""
user = _get_user(username=username)
+ userprofile_common = get_userprofile_common(user)
return flask.render_template(
- 'user_stars.html',
+ 'userprofile_starred.html',
username=username,
user=user,
repos=[star.project for star in user.stars],
+ repos_length=userprofile_common['repos_length'],
+ forks_length=userprofile_common['forks_length'],
+ select="starred",
+ )
+
+@UI_NS.route('/user//groups/')
+@UI_NS.route('/user//groups')
+def userprofile_groups(username):
+ """
+ Shows the groups of a user
+ """
+
+ user = _get_user(username=username)
+ userprofile_common = get_userprofile_common(user)
+
+ groups = []
+ for groupname in user.groups:
+ groups.append(
+ pagure.lib.search_groups(flask.g.session, group_name=groupname))
+
+ return flask.render_template(
+ 'userprofile_groups.html',
+ username=username,
+ user=user,
+ groups=groups,
+ repos_length=userprofile_common['repos_length'],
+ forks_length=userprofile_common['forks_length'],
+ select="groups",
)