return builds
+ def get_comments(self, limit=10, offset=None, user=None):
+ query = "SELECT * FROM builds_comments \
+ JOIN users ON builds_comments.user_id = users.id"
+ args = []
+
+ wheres = []
+ if user:
+ wheres.append("users.id = %s")
+ args.append(user.id)
+
+ if wheres:
+ query += " WHERE %s" % " AND ".join(wheres)
+
+ # Sort everything.
+ query += " ORDER BY time_created DESC"
+
+ # Limits.
+ if limit:
+ if offset:
+ query += " LIMIT %s,%s"
+ args.append(offset)
+ else:
+ query += " LIMIT %s"
+
+ args.append(limit)
+
+ comments = []
+ for comment in self.db.query(query, *args):
+ comment = logs.CommentLogEntry(self.pakfire, comment)
+ comments.append(comment)
+
+ return comments
+
class Build(base.Object):
def __init__(self, pakfire, id, data=None):
def credit(self):
return self.data.credit
+ @property
+ def build_id(self):
+ return self.data.build_id
+
+ @property
+ def build(self):
+ return self.pakfire.builds.get_by_id(self.build_id)
+
@property
def vote(self):
if self.credit > 0:
self.pakfire.messages.add("%s <%s>" % (self.realname, self.email), subject, message)
- def get_comments(self, limit=5):
- comments = self.db.query("""SELECT * FROM builds_comments
- WHERE user_id = %s ORDER BY time_created DESC LIMIT %s""", self.id, limit)
-
- return comments
-
- @property
- def log(self):
- return self.get_history(limit=15)
-
- def get_history(self, limit=None):
- return [] # XXX TODO
-
# Some testing code.
if __name__ == "__main__":
{% block title %}{{ _("Builds") }}{% end block %}
{% block body %}
+ <ul class="breadcrumb">
+ <li>
+ <a href="/">{{ _("Home") }}</a>
+ <span class="divider">/</span>
+ </li>
+ <li class="active">
+ <a href="/builds">{{ _("Builds") }}</a>
+ </li>
+ </ul>
+
+ <ul class="nav nav-pills pull-right">
+ <li>
+ <a href="/builds/comments">{{ _("Comments") }}</a>
+ </li>
+ <li>
+ <a href="/builds/filter">{{ _("Filter builds") }}</a>
+ </li>
+ </ul>
+
<div class="page-header">
<h2>{{ _("Builds") }}</h2>
</div>
--- /dev/null
+{% extends "../base.html" %}
+
+{% block title %}{{ _("Build comments") }}{% end block %}
+
+{% block body %}
+ <ul class="breadcrumb">
+ <li>
+ <a href="/">{{ _("Home") }}</a>
+ <span class="divider">/</span>
+ </li>
+ <li>
+ <a href="/builds">{{ _("Builds") }}</a>
+ <span class="divider">/</span>
+ </li>
+ {% if user %}
+ <li>
+ <a href="/builds/comments">{{ _("Comments") }}</a>
+ <span class="divider">/</span>
+ </li>
+ <li class="active">
+ <a href="/builds/comments/{{ user.name }}">{{ user.realname }}</a>
+ </li>
+ {% else %}
+ <li class="active">
+ <a href="/builds/comments">{{ _("Comments") }}</a>
+ </li>
+ {% end %}
+ </ul>
+
+ {% if user %}
+ <ul class="nav nav-pills pull-right">
+ <li>
+ <a href="/builds/comments">{{ _("Show all comments") }}</a>
+ </li>
+ </ul>
+ {% end %}
+
+ <div class="page-header">
+ {% if user %}
+ <h2>{{ _("%s's latest comments") % user.firstname }}</h2>
+ {% else %}
+ <h2>{{ _("Build comments") }}</h2>
+ {% end %}
+ </div>
+
+ {% if comments %}
+ <p>
+ {% if user %}
+ {{ _("This page shows %s's latest comments.") % user.firstname }}
+ {% else %}
+ {{ _("This page shows the latest comments on builds.") }}
+ {% end %}
+ {{ _("The Pakfire Build Service is all about social development and so, communicating with eath others is important. Please join.") }}
+ </p>
+
+ {% module Log(comments, show_build=True) %}
+
+ <ul class="pager">
+ {% if have_prev %}
+ <li class="previous">
+ <a href="?offset={{ offset - limit }}&limit={{ limit }}">← {{ _("Newer") }}</a>
+ </li>
+ {% else %}
+ <li class="previous disabled">
+ <a href="#">← {{ _("Newer") }}</a>
+ </li>
+ {% end %}
+
+ {% if have_next %}
+ <li class="next">
+ <a href="?offset={{ offset + limit }}&limit={{ limit }}">{{ _("Older") }} →</a>
+ </li>
+ {% else %}
+ <li class="next disabled">
+ <a href="#">{{ _("Older") }} →</a>
+ </li>
+ {% end %}
+ </ul>
+ {% elif not comments and user %}
+ <p class="muted">
+ {{ _("%s did not comment on anything, yet.") % user.firstname }}
+ </p>
+ {% end %}
+{% end block %}
{% if entry.get_message(current_user) %}
{% module Text(entry.get_message(current_user), remove_linebreaks=False) %}
{% else %}
- <p>
- <em>{{ _("No comment given.") }}</em>
+ <p class="muted">
+ {{ _("No comment given.") }}
</p>
{% end %}
{% end %}
{% else %}
<a href="/user/{{ entry.user.name }}">{{ entry.user.realname }}</a>
{% end %}
+
+ {% if show_build %}
+ <small>-
+ <a href="/build/{{ entry.build.uuid }}">{{ entry.build.name }}</a>
+ </small>
+ {% end %}
</h4>
{% end %}
{% end block %}
</li>
</ul>
+ <ul class="nav nav-pills pull-right">
+ <li>
+ <a href="/builds/comments/{{ user.name }}">
+ {{ _("View comments") }}
+ </a>
+ </li>
+ </ul>
+
<div class="page-header">
- <h1>{{ _("User") }}: {{ user.realname }}</h1>
+ <h2>{{ _("User") }}: {{ user.realname }}</h2>
</div>
<div class="row">
{% if current_user == user or current_user.is_admin() %}
<div class="row">
<div class="span6 offset2">
- <h2>{{ _("Permissions") }}</h2>
+ <h3>{{ _("Permissions") }}</h3>
{% if user.is_admin() %}
<p>
</div>
</div>
{% end %}
-
- <!-- <h2>{{ _("Links") }}</h2>
- <ul class="user-links">
- <li>
- <a href="#">{{ _("View all comments written %s.") % user.realname }}</a>
- </li>
- <li>
- <a href="#">{{ _("View all builds %s is linked to.") % user.realname }}</a>
- </li>
- </ul> -->
-
- <!-- <h2>{{ _("Log") }}</h2>
- {% module LogTable(user.log) %} -->
-
- <!-- <h2>{{ _("Comments written by %s") % user.realname }}</h2>
- {..% module CommentsTable(user.comments, show_package=True, show_user=False) %..} -->
{% end block %}
# User profiles
(r"/users", UsersHandler),
- (r"/users/comments", UsersCommentsHandler),
(r"/user/impersonate", UserImpersonateHandler),
(r"/user/(\w+)/passwd", UserPasswdHandler),
(r"/user/(\w+)/delete", UserDeleteHandler),
(r"/builds", BuildsHandler),
(r"/builds/filter", BuildFilterHandler),
(r"/builds/queue", BuildQueueHandler),
+ (r"/builds/comments", BuildsCommentsHandler),
+ (r"/builds/comments/(\w+)", BuildsCommentsHandler),
(r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", BuildDetailHandler),
(r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/bugs", BuildBugsHandler),
(r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/manage", BuildManageHandler),
self.redirect("/build/%s/bugs" % build.uuid)
+class BuildsCommentsHandler(BaseHandler):
+ def get(self, user_name=None):
+ user = None
+ if user_name:
+ user = self.pakfire.users.get_by_name(user_name)
+
+ limit = self.get_argument("limit", 10)
+ offset = self.get_argument("offset", 0)
+
+ try:
+ limit = int(limit)
+ offset = int(offset)
+ except:
+ raise tornado.web.HTTPError(400)
+
+ # Try to get one more comment than requested and check if there
+ # is a next page that it to be shown.
+ comments = self.pakfire.builds.get_comments(limit=limit + 1,
+ offset=offset, user=user)
+
+ # Set markers for next and prev pages.
+ have_next = len(comments) > limit
+ have_prev = offset > limit
+
+ # Remove the extra element from the list.
+ comments = comments[:limit]
+
+ self.render("builds/comments.html", comments=comments, limit=limit,
+ offset=offset + limit, user=user, have_prev=have_prev, have_next=have_next)
+
+
class BuildStateHandler(BaseHandler):
def get(self, uuid):
build = self.pakfire.builds.get_by_uuid(uuid)
if not user:
raise tornado.web.HTTPError(404, "User does not exist: %s" % name)
- log = user.get_history(limit=10)
- comments = user.get_comments(limit=5)
-
- self.render("user-profile.html", user=user, log=log, comments=comments)
+ self.render("user-profile.html", user=user)
class UserImpersonateHandler(BaseHandler):
self.render("user-list.html", users=users)
-class UsersCommentsHandler(BaseHandler):
- @tornado.web.authenticated
- def get(self):
- comments = self.pakfire.packages.get_comments(limit=20)
-
- self.render("user-comments.html", comments=comments)
-
-
class UsersBuildsHandler(BaseHandler):
def get(self, name=None):
if name is None:
else:
template = "modules/log-entry.html"
- return self.render_string(template, entry=entry, u=entry.user, **args)
+ return self.render_string(template, entry=entry, u=entry.user,
+ show_build=False, **args)
class LogEntryCommentModule(LogEntryModule):
- def render(self, entry, **args):
+ def render(self, entry, show_build=False, **args):
return self.render_string("modules/log-entry-comment.html",
- entry=entry, u=entry.user, **args)
+ entry=entry, u=entry.user, show_build=show_build, **args)
class MaintainerModule(UIModule):