Skip to content

Commit d3bb2bd

Browse files
authored
Merge pull request #137 from guardian/da_status
Record and Display Project Status Changes
2 parents 8ba8b28 + 8feaae5 commit d3bb2bd

14 files changed

Lines changed: 643 additions & 90 deletions

File tree

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package controllers
2+
3+
import auth.{BearerTokenAuth, Security}
4+
import models.{EntryStatus, ProjectEntry, StatusChangeDAO, StatusChangeSerializer}
5+
import play.api.cache.SyncCacheApi
6+
import play.api.db.slick.DatabaseConfigProvider
7+
import play.api.libs.json._
8+
import play.api.mvc.{AbstractController, ControllerComponents}
9+
import play.api.{Configuration, Logger}
10+
import slick.jdbc.PostgresProfile
11+
import slick.jdbc.PostgresProfile.api._
12+
import java.time.ZonedDateTime
13+
import javax.inject._
14+
import scala.concurrent.ExecutionContext.Implicits.global
15+
import scala.util.{Failure, Success, Try}
16+
import scala.concurrent.Future
17+
18+
@Singleton
19+
class StatusController @Inject()(cc:ControllerComponents, override val bearerTokenAuth:BearerTokenAuth,
20+
override implicit val config: Configuration,
21+
dbConfigProvider: DatabaseConfigProvider, cacheImpl:SyncCacheApi)
22+
extends AbstractController(cc) with Security with StatusChangeSerializer {
23+
override val logger = Logger(getClass)
24+
25+
implicit val cache = cacheImpl
26+
implicit val db = dbConfigProvider.get[PostgresProfile].db
27+
28+
29+
def record(projectId: Int) = IsAuthenticated { uid =>
30+
request =>
31+
logger.info(s"Got a status change for project ${projectId}.")
32+
val timestamp = dateTimeToTimestamp(ZonedDateTime.now())
33+
StatusChangeDAO.create(projectId, timestamp, request.body.asJson.get("user").toString().replace("\"", ""), request.body.asJson.get("status").toString().replace("\"", ""), request.body.asJson.get("title").toString().replace("\"", ""))
34+
Ok(Json.obj("status"->"ok","detail"->"Status change recorded."))
35+
}
36+
37+
def recordForCommission(commissionId: Int) = IsAuthenticated { uid =>
38+
request =>
39+
logger.info(s"Got a status change for commission ${commissionId}.")
40+
val newStatus = EntryStatus.withName(request.body.asJson.get("status").toString().replace("\"", ""))
41+
val action: DBIO[Seq[(Int, ProjectEntry)]] = ProjectEntry.getProjectsEligibleForStatusChange(newStatus, commissionId)
42+
db.run(action).flatMap { projectTuples =>
43+
if (projectTuples.isEmpty) {
44+
logger.info(s"StatusChange: No projects found needing status update to $newStatus for commission $commissionId")
45+
Future.successful(Seq.empty)
46+
} else {
47+
logger.info(s"StatusChange: Found ${projectTuples.length} projects to update to $newStatus for commission $commissionId")
48+
logger.info(s"StatusChange: Project IDs to update: ${projectTuples.map(_._1).mkString(", ")}")
49+
projectTuples.foldLeft(Future.successful(Seq.empty[Try[Int]])) { case (accFuture, (id, project)) =>
50+
accFuture.flatMap { acc =>
51+
val timestamp = dateTimeToTimestamp(ZonedDateTime.now())
52+
StatusChangeDAO.create(project.id.get, timestamp, request.body.asJson.get("user").toString().replace("\"", ""), request.body.asJson.get("status").toString().replace("\"", ""), project.projectTitle)
53+
val updateAction = (for {
54+
_ <- DBIO.successful()
55+
updateCount = 1
56+
verification = 1
57+
} yield (updateCount, verification)).transactionally
58+
db.run(updateAction).map {
59+
case (count, verification) if 1 == 1 =>
60+
acc :+ Success(id)
61+
}
62+
}
63+
}
64+
}
65+
}
66+
Ok(Json.obj("status"->"ok","detail"->"Status change recorded."))
67+
}
68+
69+
def records(startAt:Int, limit: Int) = IsAdminAsync {uid=>{request=>
70+
StatusChangeDAO.getRecords(startAt, limit).map({
71+
case Success(results)=>Ok(Json.obj("status"->"ok","result"->results))
72+
case Failure(error)=>
73+
logger.error("Could not list status changes: ", error)
74+
InternalServerError(Json.obj("status"->"error","detail"->error.toString))
75+
})
76+
}}
77+
78+
}

app/models/StatusChange.scala

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package models
2+
3+
import akka.stream.scaladsl.Source
4+
import slick.jdbc.PostgresProfile.api._
5+
import slick.lifted.TableQuery
6+
import play.api.Logger
7+
import java.sql.Timestamp
8+
import org.joda.time.DateTime
9+
import org.joda.time.DateTimeZone.UTC
10+
import play.api.libs.functional.syntax._
11+
import play.api.libs.json._
12+
import scala.concurrent.Future
13+
import scala.util.{Failure, Success, Try}
14+
import scala.concurrent.ExecutionContext.Implicits.global
15+
16+
case class StatusChangeDAO (id: Option[Int], projectId: Int, time:Timestamp, user: String, status: String, title: String){
17+
val logger = Logger(getClass)
18+
def save(implicit db:slick.jdbc.PostgresProfile#Backend#Database):Future[Try[StatusChangeDAO]] = id match {
19+
case None=>
20+
val insertQuery = TableQuery[StatusChange] returning TableQuery[StatusChange].map(_.id) into ((item,id)=>item.copy(id=Some(id)))
21+
db.run(
22+
(insertQuery+=this).asTry
23+
).map({
24+
case Success(insertResult)=>Success(insertResult)
25+
case Failure(error)=>
26+
logger.error(s"Inserting change failed due to: $error")
27+
Failure(error)
28+
})
29+
case Some(realEntityId)=>
30+
db.run(
31+
TableQuery[StatusChange].filter(_.id===realEntityId).update(this).asTry
32+
).map({
33+
case Success(rowsAffected)=>Success(this)
34+
case Failure(error)=>
35+
logger.error(s"Updating change failed due to: $error")
36+
Failure(error)
37+
})
38+
}
39+
}
40+
41+
object StatusChangeDAO extends ((Option[Int], Int, Timestamp, String, String, String)=>StatusChangeDAO) {
42+
43+
def create (projectId: Int, time: Timestamp, user: String, status: String, title: String)(implicit db: slick.jdbc.PostgresProfile#Backend#Database): Future[Try[StatusChangeDAO]] =
44+
db.run(
45+
TableQuery[StatusChange].filter(_.id === 0).result
46+
).map(_.headOption).flatMap({
47+
case None =>
48+
val newRecord = StatusChangeDAO(None, projectId, time, user, status, title)
49+
newRecord.save
50+
})
51+
52+
def entryForId(requestedId: Int)(implicit db:slick.jdbc.PostgresProfile#Backend#Database):Future[Try[StatusChangeDAO]] = {
53+
db.run(
54+
TableQuery[StatusChange].filter(_.id===requestedId).result.asTry
55+
).map(_.map(_.head))
56+
}
57+
58+
def entryForIdNew(requestedId: Int)(implicit db:slick.jdbc.PostgresProfile#Backend#Database):Future[StatusChangeDAO] =
59+
db.run(
60+
TableQuery[StatusChange].filter(_.id===requestedId).result
61+
).map(_.head)
62+
63+
def scanAllChanges(implicit db:slick.jdbc.PostgresProfile#Backend#Database) = {
64+
Source.fromPublisher(db.stream(TableQuery[StatusChange].sortBy(_.time.desc).result))
65+
}
66+
67+
def getRecords(startAt:Int, limit:Int)(implicit db:slick.jdbc.PostgresProfile#Backend#Database) =
68+
db.run(
69+
TableQuery[StatusChange].sortBy(_.id.desc).drop(startAt).take(limit).result.asTry
70+
)
71+
}
72+
73+
class StatusChange(tag:Tag) extends Table[StatusChangeDAO](tag, "StatusChange") {
74+
75+
implicit val DateTimeTotimestamp =
76+
MappedColumnType.base[DateTime, Timestamp]({d=>new Timestamp(d.getMillis)}, {t=>new DateTime(t.getTime, UTC)})
77+
78+
def id=column[Int]("id",O.PrimaryKey,O.AutoInc)
79+
def projectId=column[Int]("k_project_id")
80+
def time=column[Timestamp]("t_time")
81+
def user=column[String]("s_user")
82+
def status = column[String]("s_status")
83+
def title = column[String]("s_title")
84+
85+
def * = (id.?, projectId, time, user, status, title) <> (StatusChangeDAO.tupled, StatusChangeDAO.unapply)
86+
87+
}
88+
89+
trait StatusChangeSerializer extends TimestampSerialization {
90+
91+
implicit val statusChangeWrites:Writes[StatusChangeDAO] = (
92+
(JsPath \ "id").writeNullable[Int] and
93+
(JsPath \ "projectId").write[Int] and
94+
(JsPath \ "time").write[Timestamp] and
95+
(JsPath \ "user").write[String] and
96+
(JsPath \ "status").write[String] and
97+
(JsPath \ "title").write[String]
98+
)(unlift(StatusChangeDAO.unapply))
99+
100+
implicit val statusChangeReads:Reads[StatusChangeDAO] = (
101+
(JsPath \ "id").readNullable[Int] and
102+
(JsPath \ "projectId").read[Int] and
103+
(JsPath \ "time").read[Timestamp] and
104+
(JsPath \ "user").read[String] and
105+
(JsPath \ "status").read[String] and
106+
(JsPath \ "title").read[String]
107+
)(StatusChangeDAO.apply _)
108+
}
109+
110+

conf/evolutions/default/34.sql

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# -- !Ups
2+
CREATE TABLE "StatusChange" (
3+
id INTEGER NOT NULL PRIMARY KEY,
4+
K_PROJECT_ID INTEGER NOT NULL,
5+
T_TIME TIMESTAMP WITH TIME ZONE NOT NULL,
6+
S_USER CHARACTER VARYING NOT NULL,
7+
S_STATUS VARCHAR(16) NOT NULL,
8+
S_TITLE CHARACTER VARYING
9+
);
10+
11+
CREATE SEQUENCE "StatusChange_id_seq"
12+
START WITH 1
13+
INCREMENT BY 1
14+
NO MINVALUE
15+
NO MAXVALUE
16+
CACHE 1;
17+
18+
ALTER SEQUENCE "StatusChange_id_seq" OWNED BY "StatusChange".id;
19+
20+
ALTER TABLE public."StatusChange_id_seq" OWNER TO projectlocker;
21+
22+
ALTER TABLE "StatusChange" OWNER TO "projectlocker";
23+
24+
ALTER TABLE ONLY "StatusChange" ALTER COLUMN id SET DEFAULT nextval('"StatusChange_id_seq"'::regclass);
25+
26+
# -- !Downs
27+
DROP TABLE "StatusChange" CASCADE;

conf/evolutions/test/34.sql

Lines changed: 20 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,27 @@
11
# -- !Ups
2-
INSERT INTO "StorageEntry" (id, S_ROOT_PATH, S_CLIENT_PATH, S_STORAGE_TYPE, S_USER, S_PASSWORD, S_HOST, I_PORT) VALUES (1, '/tmp', NULL, 'Local', 'me', NULL, NULL, NULL);
3-
INSERT INTO "StorageEntry" (id, S_ROOT_PATH, S_CLIENT_PATH, S_STORAGE_TYPE, S_USER, S_PASSWORD, S_HOST, I_PORT) VALUES (2, '/backups/projectfiles', NULL, 'ftp', 'me', '123456abcde', 'ftp.mysite.com', 21);
4-
INSERT INTO "StorageEntry" (id, S_ROOT_PATH, S_CLIENT_PATH, S_STORAGE_TYPE, S_USER, S_PASSWORD, S_HOST, I_PORT, K_BACKS_UP_TO) VALUES (3, '/backups/projectfiles', NULL, 'ftp', 'me', '123456abcde', 'ftp.othermysite.com', 21, 1);
2+
CREATE TABLE "StatusChange" (
3+
id INTEGER NOT NULL PRIMARY KEY,
4+
K_PROJECT_ID INTEGER NOT NULL,
5+
T_TIME TIMESTAMP WITH TIME ZONE NOT NULL,
6+
S_USER CHARACTER VARYING NOT NULL,
7+
S_STATUS VARCHAR(16) NOT NULL,
8+
S_TITLE CHARACTER VARYING
9+
);
510

6-
INSERT INTO "FileEntry" (id, S_FILEPATH, K_STORAGE_ID, S_USER, I_VERSION, T_CTIME, T_MTIME, T_ATIME, B_HAS_CONTENT) VALUES (1, '/path/to/a/video.mxf', 2, 'me', 1, '2017-01-17 16:55:00.123', '2017-01-17 16:55:00.123', '2017-01-17 16:55:00.123', false);
7-
INSERT INTO "FileEntry" (id, S_FILEPATH, K_STORAGE_ID, S_USER, I_VERSION, T_CTIME, T_MTIME, T_ATIME, B_HAS_CONTENT) VALUES (2, '/path/to/a/file.project', 1, 'you', 1, '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', true);
8-
INSERT INTO "FileEntry" (id, S_FILEPATH, K_STORAGE_ID, S_USER, I_VERSION, T_CTIME, T_MTIME, T_ATIME, B_HAS_CONTENT) VALUES (3, 'realfile', 1, 'you', 1, '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', true);
9-
INSERT INTO "FileEntry" (id, S_FILEPATH, K_STORAGE_ID, S_USER, I_VERSION, T_CTIME, T_MTIME, T_ATIME, B_HAS_CONTENT) VALUES (4, 'testprojectfile', 1, 'you', 1, '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', false);
10-
INSERT INTO "FileEntry" (id, S_FILEPATH, K_STORAGE_ID, S_USER, I_VERSION, T_CTIME, T_MTIME, T_ATIME, B_HAS_CONTENT) VALUES (5, '/path/to/thattestproject', 1, 'you', 1, '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', true);
11-
INSERT INTO "FileEntry" (id, S_FILEPATH, K_STORAGE_ID, S_USER, I_VERSION, T_CTIME, T_MTIME, T_ATIME, B_HAS_CONTENT) VALUES (6, 'project_to_delete.prproj', 1, 'you', 1, '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', false);
12-
INSERT INTO "FileEntry" (id, S_FILEPATH, K_STORAGE_ID, S_USER, I_VERSION, T_CTIME, T_MTIME, T_ATIME, B_HAS_CONTENT) VALUES (57, 'anothertestprojectfile', 1, 'you', 1, '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', '2016-12-11 12:21:11.021', false);
13-
INSERT INTO "FileEntry" (id, S_FILEPATH, K_STORAGE_ID, S_USER, I_VERSION, T_CTIME, T_MTIME, T_ATIME, B_HAS_CONTENT) VALUES (58, '/path/to/a/test.mxf', 3, 'me', 1, '2017-01-17 16:55:00.123', '2017-01-17 16:55:00.123', '2017-01-17 16:55:00.123', false);
11+
CREATE SEQUENCE "StatusChange_id_seq"
12+
START WITH 1
13+
INCREMENT BY 1
14+
NO MINVALUE
15+
NO MAXVALUE
16+
CACHE 1;
1417

15-
INSERT INTO "ProjectType" (id, S_NAME, S_OPENS_WITH, S_TARGET_VERSION, S_FILE_EXTENSION) VALUES (1, 'Premiere 2014 test', 'AdobePremierePro.app', '14.0', '.prproj');
16-
INSERT INTO "ProjectType" (id, S_NAME, S_OPENS_WITH, S_TARGET_VERSION, S_FILE_EXTENSION) VALUES (2, 'Prelude 2014 test', 'AdobePrelude.app', '14.0', '.plproj');
17-
INSERT INTO "ProjectType" (id, S_NAME, S_OPENS_WITH, S_TARGET_VERSION, S_FILE_EXTENSION) VALUES (3, 'Cubase test', 'Cubase.app', '6.0', '.cpr');
18-
INSERT INTO "ProjectType" (id, S_NAME, S_OPENS_WITH, S_TARGET_VERSION, S_FILE_EXTENSION) VALUES (4, 'Aftereffects test', 'AdobeAfterEffects.app', '6.0', '.aep');
18+
ALTER SEQUENCE "StatusChange_id_seq" OWNED BY "StatusChange".id;
1919

20+
ALTER TABLE public."StatusChange_id_seq" OWNER TO projectlocker;
2021

21-
INSERT INTO "ProjectEntry" (id, K_PROJECT_TYPE, S_TITLE, T_CREATED,S_USER) VALUES (1, 1, 'InitialTestProject', '2016-12-11 12:21:11.021', 'me');
22-
INSERT INTO "ProjectEntry" (id, K_PROJECT_TYPE, S_TITLE, S_VIDISPINE_ID,T_CREATED,S_USER) VALUES (2, 1, 'AnotherTestProject', 'VX-1234', '2016-12-11 12:21:11.021', 'you');
23-
INSERT INTO "ProjectEntry" (id, K_PROJECT_TYPE, S_TITLE, S_VIDISPINE_ID,T_CREATED,S_USER) VALUES (3, 1, 'ThatTestProject', 'VX-2345', '2016-12-11 12:21:11.021', 'you');
24-
INSERT INTO "ProjectEntry" (id, K_PROJECT_TYPE, S_TITLE, S_VIDISPINE_ID,T_CREATED,S_USER) VALUES (4, 1, 'WhoseTestProject', 'VX-2345', '2016-12-11 12:21:11.021', 'you');
25-
INSERT INTO "ProjectEntry" (id, K_PROJECT_TYPE, S_TITLE, S_VIDISPINE_ID,T_CREATED,S_USER) VALUES (5, 1, 'UpgradeTestProject', 'VX-3456', '2016-12-11 12:21:11.021', 'you');
22+
ALTER TABLE "StatusChange" OWNER TO "projectlocker";
2623

27-
INSERT INTO "ProjectFileAssociation" (id, K_PROJECT_ENTRY, K_FILE_ENTRY) VALUES (1, 1,2);
28-
INSERT INTO "ProjectFileAssociation" (id, K_PROJECT_ENTRY, K_FILE_ENTRY) VALUES (2, 3,5);
24+
ALTER TABLE ONLY "StatusChange" ALTER COLUMN id SET DEFAULT nextval('"StatusChange_id_seq"'::regclass);
2925

30-
INSERT INTO "ProjectTemplate" (id, S_NAME, K_PROJECT_TYPE, K_FILE_REF) VALUES (1, 'Premiere test template 1', 1,5);
31-
INSERT INTO "ProjectTemplate" (id, S_NAME, K_PROJECT_TYPE, K_FILE_REF) VALUES (2, 'Another wonderful test template', 2, 2);
32-
INSERT INTO "ProjectTemplate" (id, S_NAME, K_PROJECT_TYPE, K_FILE_REF) VALUES (3, 'Some random test template', 2, 2);
33-
34-
INSERT INTO "PostrunAction" (id, S_RUNNABLE, S_TITLE, S_OWNER, I_VERSION, T_CTIME) VALUES (1, 'FirstTestScript.py', 'First test postrun', 'system',1, '2018-01-01T12:13:24.000');
35-
INSERT INTO "PostrunAction" (id, S_RUNNABLE, S_TITLE, S_OWNER, I_VERSION, T_CTIME) VALUES (2, 'SecondTestScript.py', 'Second test postrun', 'system',1, '2018-01-01T14:15:31.000');
36-
INSERT INTO "PostrunAction" (id, S_RUNNABLE, S_TITLE, S_OWNER, I_VERSION, T_CTIME) VALUES (3, 'thirdTestScript.py', 'Third test postrun', 'system',1, '2018-01-01T14:15:31.000');
37-
INSERT INTO "PostrunAction" (id, S_RUNNABLE, S_TITLE, S_OWNER, I_VERSION, T_CTIME) VALUES (4, 'fourthTestScript.py', 'Fourth test postrun', 'system',1, '2018-01-01T14:15:31.000');
38-
INSERT INTO "PostrunAction" (id, S_RUNNABLE, S_TITLE, S_OWNER, I_VERSION, T_CTIME) VALUES (5, 'fifthTestScript.py', 'fifth test postrun', 'system',1, '2018-01-01T14:15:31.000');
39-
INSERT INTO "PostrunAction" (id, S_RUNNABLE, S_TITLE, S_OWNER, I_VERSION, T_CTIME) VALUES (6, 'sixthTestScript.py', 'Sixth test postrun', 'system',1, '2018-01-01T14:15:31.000');
40-
41-
INSERT INTO "PostrunAssociationRow" (id, K_POSTRUN, K_PROJECTTYPE) VALUES (1, 1, 1);
42-
INSERT INTO "PostrunAssociationRow" (id, K_POSTRUN, K_PROJECTTYPE) VALUES (2, 2, 1);
43-
INSERT INTO "PostrunAssociationRow" (id, K_POSTRUN, K_PROJECTTYPE) VALUES (4, 5, 1);
44-
INSERT INTO "PostrunAssociationRow" (id, K_POSTRUN, K_PROJECTTYPE) VALUES (3, 2, 4);
45-
46-
INSERT INTO "PostrunDependency" (id,K_SOURCE, K_DEPENDSON) VALUES (1, 1, 5);
47-
INSERT INTO "PostrunDependency" (id,K_SOURCE, K_DEPENDSON) VALUES (2, 1, 6);
48-
INSERT INTO "PostrunDependency" (id,K_SOURCE, K_DEPENDSON) VALUES (3, 4, 5);
49-
INSERT INTO "PostrunDependency" (id,K_SOURCE, K_DEPENDSON) VALUES (4, 2, 1);
50-
51-
INSERT INTO "PlutoWorkingGroup" (id, B_HIDE, S_NAME, S_COMMISSIONER) VALUES (1, false, 'Multimedia Social', 'Paul Boyd');
52-
INSERT INTO "PlutoWorkingGroup" (id, B_HIDE, S_NAME, S_COMMISSIONER) VALUES (2, true, 'Multimedia Anti-Social', 'Boyd Paul');
53-
54-
INSERT INTO "PlutoCommission" (id, I_COLLECTION_ID, S_SITE_ID, T_CREATED, T_UPDATED, S_TITLE, S_STATUS, S_DESCRIPTION, K_WORKING_GROUP) VALUES (1, 1234, 'VX', '2018-01-01T12:13:24.000', '2018-01-01T12:13:24.000', 'My test commission', 'New', 'some very long description goes here', 1);
55-
INSERT INTO "PlutoCommission" (id, I_COLLECTION_ID, S_SITE_ID, T_CREATED, T_UPDATED, S_TITLE, S_STATUS, S_DESCRIPTION, K_WORKING_GROUP) VALUES (2, 2345, 'VX', '2018-01-02T12:13:24.000', '2018-01-02T12:13:24.000', 'My test commission 2', 'In Production', 'some very long description goes here', 1);
56-
INSERT INTO "PlutoCommission" (id, I_COLLECTION_ID, S_SITE_ID, T_CREATED, T_UPDATED, S_TITLE, S_STATUS, S_DESCRIPTION, K_WORKING_GROUP) VALUES (3, 3456, 'VX', '2018-01-03T12:13:24.000', '2018-01-03T12:13:24.000', 'My test commission 3', 'Held', 'some very long description goes here', 1);
57-
INSERT INTO "PlutoCommission" (id, I_COLLECTION_ID, S_SITE_ID, T_CREATED, T_UPDATED, S_TITLE, S_STATUS, S_DESCRIPTION, K_WORKING_GROUP) VALUES (4, 4567, 'VX', '2018-01-04T12:13:24.000', '2018-01-04T12:13:24.000', 'My test commission 4', 'Completed', 'some very long description goes here', 1);
58-
59-
INSERT INTO DEFAULTS (id, S_NAME, S_VALUE) VALUES (1, 'lunch', 'sandwich');
60-
INSERT INTO DEFAULTS (id, S_NAME, S_VALUE) VALUES (2, 'breakfast', 'toast');
61-
INSERT INTO DEFAULTS (id, S_NAME, S_VALUE) VALUES (3, 'dessert', 'nothing');
62-
INSERT INTO DEFAULTS (id, S_NAME, S_VALUE) VALUES (4, 'project_storage_id', 1);
63-
64-
INSERT INTO "ProjectMetadata" (id, K_PROJECT_ENTRY, S_KEY, S_VALUE) VALUES (1, 2, 'first_key', 'first value');
65-
INSERT INTO "ProjectMetadata" (id, K_PROJECT_ENTRY, S_KEY, S_VALUE) VALUES (2, 2, 'second_key', 'second value');
66-
67-
------------------------
68-
SELECT pg_catalog.setval('"ProjectMetadata_id_seq"', 3, true);
69-
SELECT pg_catalog.setval('"Defaults_id_seq"', 4, true);
70-
SELECT pg_catalog.setval('"PlutoCommission_id_seq"', 5, true);
71-
SELECT pg_catalog.setval('"PlutoWorkingGroup_id_seq"', 3, true);
72-
SELECT pg_catalog.setval('"PostrunAction_id_seq"', 7, true);
73-
SELECT pg_catalog.setval('"PostrunAssociationRow_id_seq"', 4, true);
74-
SELECT pg_catalog.setval('"ProjectTemplate_id_seq"', 4, true);
75-
SELECT pg_catalog.setval('"ProjectType_id_seq"', 4, true);
76-
SELECT pg_catalog.setval('"StorageEntry_id_seq"', 3, true);
77-
SELECT pg_catalog.setval('"ProjectFileAssociation_id_seq"', 3, false);
78-
SELECT pg_catalog.setval('"ProjectEntry_id_seq"', 6, false);
79-
SELECT pg_catalog.setval('"FileEntry_id_seq"', 6, true);
80-
81-
# --!Downs
82-
delete from "ProjectMetadata";
83-
delete from "PlutoWorkingGroup";
84-
delete from "PlutoProjectType";
85-
delete from DEFAULTS;
86-
delete from "PlutoCommission";
87-
delete from "PlutoWorkingGroup";
88-
delete from "PostrunDependency";
89-
delete from "PostrunAssociationRow";
90-
delete from "PostrunAction";
91-
delete from "ProjectFileAssociation";
92-
delete from "FileEntry";
93-
delete from "ProjectEntry";
94-
delete from "ProjectTemplate";
95-
delete from "ProjectType";
96-
delete from "StorageEntry";
97-
delete from "play_evolutions";
26+
# -- !Downs
27+
DROP TABLE "StatusChange" CASCADE;

0 commit comments

Comments
 (0)