When using CRUDify, how do I make sure that when a record is saved, the 'owner' field of the record is automatically set to be the logged-in user?
Given the model below, I would like the CRUDify methods to set the 'owner' field to be equal to the id (primary key) of the logged-in user. I am using Lift's MegaProtoUser.
What would I have to override, and how would I do so?
class Mytable extends LongKeyedMapper[Mytable] with IdPK {
def getSingleton = Myclass
object owner extends MappedLongForeignKey(this, User)
object description extends MappedString(this, 140)
object name extends MappedString(this, 140)
object status extends MappedInt(this)
object entry_number extends MappedInt(this)
object quantity extends MappedDecimal(this, MathContext.DECIMAL64, 2)
}
object Mytable extends Mytable with LongKeyedMetaMapper[Mytable] with CRUDify[Long, Mytable] {
override def editMenuLoc:Box[Menu] = Empty
override def deleteMenuLoc:Box[Menu] = Empty
override def viewMenuLoc:Box[Menu] = Empty
override def createMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in"))
override def showAllMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in"))
override def findForList(start: Long, cnt: Int): List[Mytable] =
findAll(StartAt(start), MaxRows(cnt), By(owner, User.currentUser))
override def findForParam(in: String): Box[Mytable] =
for {
user <- User.currentUser
id <- Helpers.asLong(in)
mytable <- find(By(this.id, id), By(owner, user))
} yield mytable
}
I managed to find a solution here. I just needed to override the defaultValue for the owner field as follows:
object owner extends MappedLongForeignKey(this, User) {
override def defaultValue = User.currentUser match {case Full(x) => x.id.get; case _ => 0}
}