src/main/scala/fis/pm/model/Task.scala
author Tomas Zeman <tzeman@volny.cz>
Tue, 05 Jun 2012 15:40:44 +0200
changeset 103 6a2a19785cd8
parent 101 b6a00fd29998
permissions -rw-r--r--
977f2e215a04b181 Task report
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
81
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
/*
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
 * Copyright 2012 Tomas Zeman <tzeman@volny.cz>
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
 *
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
 * Licensed under the Apache License, Version 2.0 (the "License");
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
 * you may not use this file except in compliance with the License.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
 * You may obtain a copy of the License at
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
 *
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
 *     http://www.apache.org/licenses/LICENSE-2.0
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
 *
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
 * Unless required by applicable law or agreed to in writing, software
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
 * distributed under the License is distributed on an "AS IS" BASIS,
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
 * See the License for the specific language governing permissions and
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    14
 * limitations under the License.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
 */
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
package fis.pm.model
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
import fis.aaa.model._
101
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    19
import fis.base.model.{Entity, ReadOnlyField}
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    20
import fis.db.PgsqlSequencer
81
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    21
import fis.cl.model._
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    22
import net.liftweb.common._
101
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    23
import net.liftweb.record.{LifecycleCallbacks, MetaRecord, Record}
81
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    24
import net.liftweb.record.field._
103
6a2a19785cd8 977f2e215a04b181 Task report
Tomas Zeman <tzeman@volny.cz>
parents: 101
diff changeset
    25
import net.liftweb.squerylrecord.RecordTypeMode._
81
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    26
import net.liftweb.util._
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    27
import net.tz.lift.model._
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    28
import net.tz.lift.model.{FieldLabel => FL}
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    29
import org.squeryl.annotations.Column
103
6a2a19785cd8 977f2e215a04b181 Task report
Tomas Zeman <tzeman@volny.cz>
parents: 101
diff changeset
    30
import org.squeryl.dsl.QueryDsl
6a2a19785cd8 977f2e215a04b181 Task report
Tomas Zeman <tzeman@volny.cz>
parents: 101
diff changeset
    31
import org.squeryl.dsl.ast.LogicalBoolean
81
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    32
import scala.xml.Text
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
class Task private() extends Record[Task] with Entity[Task] {
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
  def meta = Task
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    36
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    37
  @Column("project_id")
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    38
  val project = new LongField(this) with ProjectField with FL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    39
  val deadline = new JodaDateMidnightField(this) with FL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    40
  val taskType = new OptionalCodeListItemField(this, 'task_type) with FL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    41
  val responsible = new UserField(this, meta.users, getUserVendor) with
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    42
    DefaultCurUser with FL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    43
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    44
  @Column("state")
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    45
  protected[pm] val stateFld = new CodeListItemField(this,
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    46
    CodeList('task_state), _.i1.toString, { v => Text(v.i1.toString)}) with FL
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    47
101
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    48
  @Column("num")
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    49
  protected val numFld = new TaskNumber(this)
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    50
  lazy val ident = ReadOnlyField(numFld)
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    51
  def number = (numFld.year, numFld.get)
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    52
  def numberStr = numFld.toString
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    53
81
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    54
  def state: TaskState =
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    55
    stateFld.item.map { TaskState(_) } openOr EmptyTaskState
103
6a2a19785cd8 977f2e215a04b181 Task report
Tomas Zeman <tzeman@volny.cz>
parents: 101
diff changeset
    56
6a2a19785cd8 977f2e215a04b181 Task report
Tomas Zeman <tzeman@volny.cz>
parents: 101
diff changeset
    57
  def delayed = !state.complete &&
6a2a19785cd8 977f2e215a04b181 Task report
Tomas Zeman <tzeman@volny.cz>
parents: 101
diff changeset
    58
    deadline.date.plusDays(1).isBefore(null) // null means now
81
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    59
}
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    60
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    61
object Task extends Task with MetaRecord[Task] with SimpleInjector {
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    62
  object users extends Inject[Iterable[User]](() => Nil)
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    63
}
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    64
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    65
abstract sealed class TaskState {
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    66
  def id: Long
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    67
  def finishedPercent: Int
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    68
  def complete: Boolean
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    69
}
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    70
case class TaskStateItem(id: Long, finishedPercent: Int, complete: Boolean)
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    71
  extends TaskState
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    72
case object EmptyTaskState extends TaskState {
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    73
  def id = 0
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    74
  def finishedPercent = 0
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    75
  def complete = false
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    76
}
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    77
object TaskState {
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    78
  def apply(i: CodeListItem): TaskState =
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    79
    TaskStateItem(i.id, i.i1.get, i.i1.get == 100)
103
6a2a19785cd8 977f2e215a04b181 Task report
Tomas Zeman <tzeman@volny.cz>
parents: 101
diff changeset
    80
6a2a19785cd8 977f2e215a04b181 Task report
Tomas Zeman <tzeman@volny.cz>
parents: 101
diff changeset
    81
  def unfinishedClause[T](i: CodeListItem)(implicit dsl: QueryDsl):
6a2a19785cd8 977f2e215a04b181 Task report
Tomas Zeman <tzeman@volny.cz>
parents: 101
diff changeset
    82
    LogicalBoolean = (i.i1 <> 100)
81
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    83
}
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    84
101
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    85
private[model] class TaskNumber(t: Task) extends IntField[Task](t) with
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    86
  LifecycleCallbacks with FL {
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    87
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    88
  def year = t.createdAt.dateTime.getYear
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    89
  override def beforeCreate {
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    90
    val sequencer = PgsqlSequencer("task_%d".format(year))
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    91
    set(sequencer.next.toInt)
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    92
  }
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    93
  override def toString = "%d/%03d".format(year, get)
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    94
  override def asHtml = Text(toString)
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    95
}
b6a00fd29998 934f1febd6c5104c Task number
Tomas Zeman <tzeman@volny.cz>
parents: 81
diff changeset
    96
81
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    97
// vim: set ts=2 sw=2 et: