934f1febd6c5104c Task number
authorTomas Zeman <tzeman@volny.cz>
Tue, 05 Jun 2012 15:40:43 +0200
changeset 101 b6a00fd29998
parent 100 1fcbeae1f9da
child 102 c92afc825464
934f1febd6c5104c Task number
src/main/resources/db/db-schema.sql
src/main/resources/db/schema-changes-0.2-0.3.sql
src/main/scala/fis/pm/model/Task.scala
src/main/scala/fis/pm/ui/TaskForm.scala
src/main/scala/fis/pm/ui/TaskSnippet.scala
src/main/scala/fis/pm/ui/TaskTable.scala
src/main/webapp/templates-hidden/_resources.html
src/main/webapp/templates-hidden/_resources_cs.html
--- a/src/main/resources/db/db-schema.sql	Wed May 30 22:51:02 2012 +0200
+++ b/src/main/resources/db/db-schema.sql	Tue Jun 05 15:40:43 2012 +0200
@@ -192,6 +192,7 @@
 create table "task" (
     "id" bigint primary key not null,
     "name" varchar(100) not null,
+    "num" integer not null,
     "project_id" bigint not null,
     "responsible" bigint not null,
     "deadline" timestamp not null,
--- a/src/main/resources/db/schema-changes-0.2-0.3.sql	Wed May 30 22:51:02 2012 +0200
+++ b/src/main/resources/db/schema-changes-0.2-0.3.sql	Tue Jun 05 15:40:43 2012 +0200
@@ -69,3 +69,21 @@
 alter table "task_attachment" add foreign key ("attachment") references "attachment"("id") on delete cascade;
 alter table "project_attachment" add unique("project","attachment");
 alter table "task_attachment" add unique("task","attachment");
+
+-- task number
+create sequence task_2012;
+create sequence task_2013;
+create sequence task_2014;
+create sequence task_2015;
+create sequence task_2016;
+create sequence task_2017;
+create sequence task_2018;
+create sequence task_2019;
+create sequence task_2020;
+ALTER TABLE task ADD num integer;
+CREATE VIEW vtask AS SELECT * FROM task ORDER BY id;
+CREATE RULE rtask AS ON UPDATE TO vtask DO INSTEAD UPDATE task SET num = NEW.num WHERE id = NEW.id;
+UPDATE vtask SET num = nextval('task_2012');
+DROP RULE rtask ON vtask;
+DROP VIEW vtask;
+ALTER TABLE task ALTER COLUMN num SET NOT NULL;
--- a/src/main/scala/fis/pm/model/Task.scala	Wed May 30 22:51:02 2012 +0200
+++ b/src/main/scala/fis/pm/model/Task.scala	Tue Jun 05 15:40:43 2012 +0200
@@ -16,10 +16,11 @@
 package fis.pm.model
 
 import fis.aaa.model._
-import fis.base.model.Entity
+import fis.base.model.{Entity, ReadOnlyField}
+import fis.db.PgsqlSequencer
 import fis.cl.model._
 import net.liftweb.common._
-import net.liftweb.record.{MetaRecord, Record}
+import net.liftweb.record.{LifecycleCallbacks, MetaRecord, Record}
 import net.liftweb.record.field._
 import net.liftweb.util._
 import net.tz.lift.model._
@@ -41,6 +42,12 @@
   protected[pm] val stateFld = new CodeListItemField(this,
     CodeList('task_state), _.i1.toString, { v => Text(v.i1.toString)}) with FL
 
+  @Column("num")
+  protected val numFld = new TaskNumber(this)
+  lazy val ident = ReadOnlyField(numFld)
+  def number = (numFld.year, numFld.get)
+  def numberStr = numFld.toString
+
   def state: TaskState =
     stateFld.item.map { TaskState(_) } openOr EmptyTaskState
 }
@@ -66,4 +73,16 @@
     TaskStateItem(i.id, i.i1.get, i.i1.get == 100)
 }
 
+private[model] class TaskNumber(t: Task) extends IntField[Task](t) with
+  LifecycleCallbacks with FL {
+
+  def year = t.createdAt.dateTime.getYear
+  override def beforeCreate {
+    val sequencer = PgsqlSequencer("task_%d".format(year))
+    set(sequencer.next.toInt)
+  }
+  override def toString = "%d/%03d".format(year, get)
+  override def asHtml = Text(toString)
+}
+
 // vim: set ts=2 sw=2 et:
--- a/src/main/scala/fis/pm/ui/TaskForm.scala	Wed May 30 22:51:02 2012 +0200
+++ b/src/main/scala/fis/pm/ui/TaskForm.scala	Tue Jun 05 15:40:43 2012 +0200
@@ -26,8 +26,10 @@
 
   protected object task extends ScreenVar[Task](Task.createRecord)
 
-  protected def fields(t: Task): List[BaseField] = List(t.name, t.project,
-    t.taskType, t.stateFld, t.deadline, t.responsible, t.note)
+  protected def fields(t: Task): List[BaseField] =
+    (t.id != t.idField.defaultValue).box(t.ident).toList ++
+    List(t.name, t.project, t.taskType, t.stateFld, t.deadline, t.responsible,
+    t.note)
 
   override def screenFields = fields(task)
 
--- a/src/main/scala/fis/pm/ui/TaskSnippet.scala	Wed May 30 22:51:02 2012 +0200
+++ b/src/main/scala/fis/pm/ui/TaskSnippet.scala	Tue Jun 05 15:40:43 2012 +0200
@@ -89,8 +89,8 @@
     def view: Task => Box[String] = (viewLoc.calcHref _) andThen (Box !! _)
   }
 
-  private def fields(t: Task) = List(t.name, t.project, t.taskType, t.stateFld,
-    t.createdBy, t.createdAt, t.deadline, t.responsible, t.note)
+  private def fields(t: Task) = List(t.ident, t.name, t.project, t.taskType,
+    t.stateFld, t.createdBy, t.createdAt, t.deadline, t.responsible, t.note)
 
   private case class TaskLink(t: Task) extends EntityLink[Task](t, url.view)
 
--- a/src/main/scala/fis/pm/ui/TaskTable.scala	Wed May 30 22:51:02 2012 +0200
+++ b/src/main/scala/fis/pm/ui/TaskTable.scala	Tue Jun 05 15:40:43 2012 +0200
@@ -15,13 +15,20 @@
  */
 package fis.pm.ui
 
+import fis.base.model._
+import fis.base.ui._
 import fis.pm.model._
-import fis.base.ui._
+import net.liftweb.common._
+import net.tz.lift.snippet._
 
-object TaskTable extends FieldTable[Task] {
-  def fields(t: Task) = EntityLink(t) ++ Seq(t.deadline, t.responsible,
-    t.note)
+trait TaskTable extends FieldTable[Task] {
+  protected def identField(t: Task) = new ReadOnlyField(t.ident.name, t.ident.displayName,
+    a(TaskSnippet.url.view(t))(t.ident.asHtml), Empty)
+  def fields(t: Task) = Seq(identField(t)) ++ EntityLink(t) ++ Seq(t.deadline,
+    t.responsible, t.note)
   def apply(l: Iterable[Task]) = build(Task, l)
 }
 
+object TaskTable extends TaskTable
+
 // vim: set ts=2 sw=2 et:
--- a/src/main/webapp/templates-hidden/_resources.html	Wed May 30 22:51:02 2012 +0200
+++ b/src/main/webapp/templates-hidden/_resources.html	Tue Jun 05 15:40:43 2012 +0200
@@ -249,6 +249,7 @@
   <res name="task.project" lang="en" default="true">Project</res>
   <res name="task.taskType" lang="en" default="true">Type</res>
   <res name="task.deadline" lang="en" default="true">Deadline</res>
+  <res name="task.numFld" lang="en" default="true">Number</res>
   <res name="task.responsible" lang="en" default="true">Responsible</res>
   <res name="task.stateFld" lang="en" default="true">State [%%]</res>
   <res name="task.comments" lang="en" default="true">Comments</res>
--- a/src/main/webapp/templates-hidden/_resources_cs.html	Wed May 30 22:51:02 2012 +0200
+++ b/src/main/webapp/templates-hidden/_resources_cs.html	Tue Jun 05 15:40:43 2012 +0200
@@ -235,6 +235,7 @@
   <res name="task.project" lang="cs">Projekt</res>
   <res name="task.taskType" lang="cs">Typ úkolu</res>
   <res name="task.deadline" lang="cs">Termín</res>
+  <res name="task.numFld" lang="cs">Číslo</res>
   <res name="task.responsible" lang="cs">Odpovědný</res>
   <res name="task.stateFld" lang="cs">Stav [%%]</res>
   <res name="task.comments" lang="cs">Komentáře</res>