--- 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>