diff --git a/src/main/scala/app/AccountController.scala b/src/main/scala/app/AccountController.scala
index 17fca02..1997363 100644
--- a/src/main/scala/app/AccountController.scala
+++ b/src/main/scala/app/AccountController.scala
@@ -58,10 +58,10 @@
getAccountByUserName(userName).flatMap(_.image).map { image =>
contentType = FileUtil.getMimeType(image)
new java.io.File(getUserUploadDir(userName), image)
- } getOrElse {
- contentType = "image/png"
- Thread.currentThread.getContextClassLoader.getResourceAsStream("noimage.png")
- }
+// } getOrElse {
+// contentType = "image/png"
+// Thread.currentThread.getContextClassLoader.getResourceAsStream("noimage.png")
+ } getOrElse NotFound
}
get("/:userName/_edit")(oneselfOnly {
diff --git a/src/main/scala/app/ControllerBase.scala b/src/main/scala/app/ControllerBase.scala
index a22d6cc..7d88da8 100644
--- a/src/main/scala/app/ControllerBase.scala
+++ b/src/main/scala/app/ControllerBase.scala
@@ -10,6 +10,7 @@
import model.Account
import scala.Some
import service.AccountService
+import javax.servlet.http.HttpServletRequest
/**
* Provides generic features for controller implementations.
@@ -22,7 +23,7 @@
/**
* Returns the context object for the request.
*/
- implicit def context: Context = Context(servletContext.getContextPath, LoginAccount, currentURL)
+ implicit def context: Context = Context(servletContext.getContextPath, LoginAccount, currentURL, request)
private def currentURL: String = {
val queryString = request.getQueryString
@@ -94,7 +95,7 @@
/**
* Context object for the current request.
*/
-case class Context(path: String, loginAccount: Option[Account], currentUrl: String)
+case class Context(path: String, loginAccount: Option[Account], currentUrl: String, request: HttpServletRequest)
/**
* Base trait for controllers which manages account information.
diff --git a/src/main/scala/util/StringUtil.scala b/src/main/scala/util/StringUtil.scala
index bd42fb9..bc478c7 100644
--- a/src/main/scala/util/StringUtil.scala
+++ b/src/main/scala/util/StringUtil.scala
@@ -8,4 +8,10 @@
md.digest.map(b => "%02x".format(b)).mkString
}
+ def md5(value: String): String = {
+ val md = java.security.MessageDigest.getInstance("MD5")
+ md.update(value.getBytes)
+ md.digest.map(b => "%02x".format(b)).mkString
+ }
+
}
diff --git a/src/main/scala/view/helpers.scala b/src/main/scala/view/helpers.scala
index db2d804..fdb3734 100644
--- a/src/main/scala/view/helpers.scala
+++ b/src/main/scala/view/helpers.scala
@@ -2,6 +2,8 @@
import java.util.Date
import java.text.SimpleDateFormat
import twirl.api.Html
+import util.StringUtil
+import service.AccountService
/**
* Provides helper methods for Twirl templates.
@@ -74,6 +76,29 @@
.replaceAll("(^|\\W)([a-f0-9]{40})(\\W|$)", "$1$2$3").format(context.path, repository.owner, repository.name))
/**
+ * Returns <img> which displays the avatar icon.
+ * Looks up Gravatar if avatar icon has not been configured in user settings.
+ */
+ def avatar(userName: String, size: Int, tooltip: Boolean = false)(implicit context: app.Context): Html = {
+ val account = Option(context.request.getAttribute("cache.account." + userName).asInstanceOf[model.Account]).orElse {
+ new AccountService {}.getAccountByUserName(userName).map { account =>
+ context.request.setAttribute("cache.account." + userName, account)
+ account
+ }
+ }
+ val src = account.collect { case account if(account.image.isEmpty) =>
+ s"""http://www.gravatar.com/avatar/${StringUtil.md5(account.mailAddress)}?s=${size}"""
+ } getOrElse {
+ s"""${context.path}/${userName}/_avatar"""
+ }
+ if(tooltip){
+ Html(s"""""")
+ } else {
+ Html(s"""
""")
+ }
+ }
+
+ /**
* Implicit conversion to add mkHtml() to Seq[Html].
*/
implicit def extendsHtmlSeq(seq: Seq[Html]) = new {
diff --git a/src/main/twirl/account/activity.scala.html b/src/main/twirl/account/activity.scala.html
index da65fcc..29b2982 100644
--- a/src/main/twirl/account/activity.scala.html
+++ b/src/main/twirl/account/activity.scala.html
@@ -6,7 +6,7 @@