You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@esme.apache.org by es...@apache.org on 2010/07/23 19:23:39 UTC
svn commit: r967172 - in
/incubator/esme/branches/tagandconversationfollow/src/main:
scala/bootstrap/liftweb/ scala/org/apache/esme/lib/
scala/org/apache/esme/model/ scala/org/apache/esme/snippet/ webapp/info_view/
Author: esjewett
Date: Fri Jul 23 17:23:38 2010
New Revision: 967172
URL: http://svn.apache.org/viewvc?rev=967172&view=rev
Log:
[ESME-256] Add tag following mechanism - note: this just records the tag follow/unfollow - it does not yet deliver all messages with the tag to the user
Added:
incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/UserTagFollow.scala
Modified:
incubator/esme/branches/tagandconversationfollow/src/main/scala/bootstrap/liftweb/Boot.scala
incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/lib/ProfileMgr.scala
incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/Tag.scala
incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/User.scala
incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/snippet/TagDisplay.scala
incubator/esme/branches/tagandconversationfollow/src/main/webapp/info_view/tag.html
Modified: incubator/esme/branches/tagandconversationfollow/src/main/scala/bootstrap/liftweb/Boot.scala
URL: http://svn.apache.org/viewvc/incubator/esme/branches/tagandconversationfollow/src/main/scala/bootstrap/liftweb/Boot.scala?rev=967172&r1=967171&r2=967172&view=diff
==============================================================================
--- incubator/esme/branches/tagandconversationfollow/src/main/scala/bootstrap/liftweb/Boot.scala (original)
+++ incubator/esme/branches/tagandconversationfollow/src/main/scala/bootstrap/liftweb/Boot.scala Fri Jul 23 17:23:38 2010
@@ -83,7 +83,7 @@ class Boot {
if (Props.mode == Props.RunModes.Test) {
Schemifier.destroyTables_!!(Log.infoF _, User, ExtSession,
- Message, Mailbox, Tag,
+ Message, Mailbox, Tag, UserTagFollow,
Relationship, MessageTag,
AuthToken, UrlStore, Tracking,
Action, AccessPool,
@@ -91,7 +91,7 @@ class Boot {
}
Schemifier.schemify(true, Log.infoF _, User, ExtSession, Message,
- Mailbox, Tag,
+ Mailbox, Tag, UserTagFollow,
Relationship, MessageTag, AuthToken,
UrlStore, Tracking, Action,
AccessPool, Privilege, UserAuth, UserCryptoSig)
Modified: incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/lib/ProfileMgr.scala
URL: http://svn.apache.org/viewvc/incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/lib/ProfileMgr.scala?rev=967172&r1=967171&r2=967172&view=diff
==============================================================================
--- incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/lib/ProfileMgr.scala (original)
+++ incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/lib/ProfileMgr.scala Fri Jul 23 17:23:38 2010
@@ -140,7 +140,7 @@ object ProfileMgr {
"password" -%> password(pwd, p => pwd = p.trim),
"confirm" -%> password(pwd, p => checkEmailPassword(p.trim)),
"openid" -%> text(openIdUrl, registerOpenID(_)),
- "save" -%> submit("Save", user.save))
+ "save" -%> submit("Save", user.save _))
}).getOrElse(NodeSeq.Empty)
}
Modified: incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/Tag.scala
URL: http://svn.apache.org/viewvc/incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/Tag.scala?rev=967172&r1=967171&r2=967172&view=diff
==============================================================================
--- incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/Tag.scala (original)
+++ incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/Tag.scala Fri Jul 23 17:23:38 2010
@@ -61,12 +61,14 @@ object Tag extends Tag with MetaProtoTag
}
-class Tag extends ProtoTag[Tag] {
- def getSingleton = Tag // what's the "meta" server
+class Tag extends ProtoTag[Tag] with ManyToMany {
+ def getSingleton = Tag // what's the "meta" server
def findMessages(): List[Message] =
Message.findAndPrime(In.fk(MessageTag.message, By(MessageTag.tag, this)),
OrderBy(Message.id, Descending))
- override def toXml = <tag id={id.is.toString} name={name.is}>{"#" + name.is}</tag>
-}
+ override def toXml = <tag id={id.is.toString} name={name.is}>{"#" + name.is}</tag>
+
+ object followers extends MappedManyToMany(UserTagFollow, UserTagFollow.tag, UserTagFollow.user, User)
+}
Modified: incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/User.scala
URL: http://svn.apache.org/viewvc/incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/User.scala?rev=967172&r1=967171&r2=967172&view=diff
==============================================================================
--- incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/User.scala (original)
+++ incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/User.scala Fri Jul 23 17:23:38 2010
@@ -198,7 +198,7 @@ object User extends User with KeyedMetaM
/**
* An O-R mapped "User" class that includes first name, last name, password
*/
-class User extends KeyedMapper[Long, User] with UserIdAsString {// OpenIDProtoUser[User] {
+class User extends KeyedMapper[Long, User] with UserIdAsString with ManyToMany {// OpenIDProtoUser[User] {
import S._
def getSingleton = User // what's the "meta" server
@@ -400,5 +400,7 @@ class User extends KeyedMapper[Long, Use
def timezoneDisplayName = S.?("base_user_ui_timezone")
- def localeDisplayName = S.?("base_user_ui_locale")
+ def localeDisplayName = S.?("base_user_ui_locale")
+
+ object tagsfollowing extends MappedManyToMany(UserTagFollow, UserTagFollow.user, UserTagFollow.tag, Tag)
}
Added: incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/UserTagFollow.scala
URL: http://svn.apache.org/viewvc/incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/UserTagFollow.scala?rev=967172&view=auto
==============================================================================
--- incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/UserTagFollow.scala (added)
+++ incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/model/UserTagFollow.scala Fri Jul 23 17:23:38 2010
@@ -0,0 +1,37 @@
+package org.apache.esme.model
+
+/**
+ * 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.
+ */
+
+import net.liftweb._
+//import http._
+import mapper._
+//import util._
+//import actor._
+//import common._
+//import Helpers._
+
+object UserTagFollow extends UserTagFollow with LongKeyedMetaMapper[UserTagFollow]
+
+class UserTagFollow extends LongKeyedMapper[UserTagFollow] with IdPK {
+ def getSingleton = UserTagFollow
+
+ object user extends LongMappedMapper(this, User)
+ object tag extends LongMappedMapper(this, Tag)
+}
\ No newline at end of file
Modified: incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/snippet/TagDisplay.scala
URL: http://svn.apache.org/viewvc/incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/snippet/TagDisplay.scala?rev=967172&r1=967171&r2=967172&view=diff
==============================================================================
--- incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/snippet/TagDisplay.scala (original)
+++ incubator/esme/branches/tagandconversationfollow/src/main/scala/org/apache/esme/snippet/TagDisplay.scala Fri Jul 23 17:23:38 2010
@@ -82,17 +82,47 @@ object TagDisplay {
"date" -> Text(new Date(m.when.is).toString))
}
- def display(in: NodeSeq): NodeSeq = {
- val name = (S.param("tag") openOr "N/A").trim
+ def display(in: NodeSeq): NodeSeq = {
+
+ val name = (S.param("tag") openOr "N/A").trim
+
+ val tag = Tag.findAll(By(Tag.name, name))
+ val user = User.currentUser
val tagList: List[Message] =
for {
- tag <- Tag.findAll(By(Tag.name, name))
- item <- tag.findMessages()
- } yield item
+ t <- tag
+ item <- t.findMessages()
+ } yield item
+
+ def followOrUnfollow: NodeSeq = {
+ val ret: Box[NodeSeq] = for {
+ u <- user
+ t = tag.first
+ } yield {
+ if (!t.followers.contains(u)) {
+ ajaxButton("Follow tag", () => {
+ t.followers += u
+ t.save
+ updateFollow
+ })
+ } else {
+ ajaxButton("Unfollow tag", () => {
+ t.followers -= u
+ t.save
+ updateFollow
+ })
+ }
+ }
+
+ ret.open_!
+ }
+
+ def updateFollow: JsCmd = SetHtml("following", followOrUnfollow)
bind("tag", in, "name" -> name,
- "each" -> bindTag(tagList) _)
+ "each" -> bindTag(tagList) _,
+ "followButton" -> followOrUnfollow )
}
}
Modified: incubator/esme/branches/tagandconversationfollow/src/main/webapp/info_view/tag.html
URL: http://svn.apache.org/viewvc/incubator/esme/branches/tagandconversationfollow/src/main/webapp/info_view/tag.html?rev=967172&r1=967171&r2=967172&view=diff
==============================================================================
--- incubator/esme/branches/tagandconversationfollow/src/main/webapp/info_view/tag.html (original)
+++ incubator/esme/branches/tagandconversationfollow/src/main/webapp/info_view/tag.html Fri Jul 23 17:23:38 2010
@@ -22,7 +22,8 @@
<lift:tag_display>
<div id="back-header">
<h1><lift:loc>ui_tag_title</lift:loc><i> '<tag:name/>'</i></h1>
-<div class="container-settings">
+<div class="container-settings">
+ <span id="following"><tag:followButton/></span>
<table id="esme-table" class="tablesorter">
<thead>