lp1915556 Course Material Trace Editing
authorKyle Huckins <khuckins@catalyte.io>
Sun, 13 Mar 2022 01:54:33 +0000 (01:54 +0000)
committerKyle Huckins <khuckins@catalyte.io>
Sun, 13 Mar 2022 04:58:03 +0000 (04:58 +0000)
- Add Creator, Editor, Create_Time, and Edit_Time fields to Course_Module Course, Course Materials, Term, and Role tables and IDL
- Cursory handling within EG2 to prevent setting and editing the above fields directly in EG2

Signed-off-by: Kyle Huckins <khuckins@catalyte.io>
 Changes to be committed:
modified:   Open-ILS/examples/fm_IDL.xml
modified:   Open-ILS/src/eg2/src/app/staff/admin/local/course-reserves/course-associate-material.component.html
modified:   Open-ILS/src/eg2/src/app/staff/admin/local/course-reserves/course-list.component.html
modified:   Open-ILS/src/eg2/src/app/staff/admin/local/course-reserves/course-list.component.ts
modified:   Open-ILS/src/eg2/src/app/staff/admin/local/course-reserves/course-page.component.html
modified:   Open-ILS/src/eg2/src/app/staff/share/course.service.ts
modified:   Open-ILS/src/sql/Pg/040.schema.asset.sql
new file:   Open-ILS/src/sql/Pg/upgrade/XXXX.scheme.lp1915556-course-material-trace-editing-history.sql

Open-ILS/examples/fm_IDL.xml
Open-ILS/src/eg2/src/app/staff/admin/local/course-reserves/course-associate-material.component.html
Open-ILS/src/eg2/src/app/staff/admin/local/course-reserves/course-list.component.html
Open-ILS/src/eg2/src/app/staff/admin/local/course-reserves/course-list.component.ts
Open-ILS/src/eg2/src/app/staff/admin/local/course-reserves/course-page.component.html
Open-ILS/src/eg2/src/app/staff/share/course.service.ts
Open-ILS/src/sql/Pg/040.schema.asset.sql
Open-ILS/src/sql/Pg/upgrade/XXXX.scheme.lp1915556-course-material-trace-editing-history.sql [new file with mode: 0644]

index 6d8199f..6712059 100644 (file)
@@ -3257,12 +3257,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
             <field reporter:label="Course Materials" name="materials" oils_persist:virtual="true" reporter:datatype="link" />
             <field reporter:label="Is Archived?" name="is_archived" reporter:datatype="bool" />
                        <field reporter:label="Terms Taught" name="terms_map" oils_persist:virtual="true" reporter:datatype="link" config_field="true" />
+                       <field reporter:label="Creating User" name="creator" reporter:datatype="link"/>
+                       <field reporter:label="Editing User" name="editor" reporter:datatype="link"/>
+                       <field reporter:label="Create Time" name="create_time" reporter:datatype="timestamp"/>
+                       <field reporter:label="Edit Time" name="edit_time" reporter:datatype="timestamp"/>
         </fields>
         <links>
             <link field="owning_lib" reltype="has_a" key="id" map="" class="aou" />
             <link field="members" reltype="has_many" key="course" map="" class="acmcu" />
             <link field="materials" reltype="has_many" key="course" map="" class="acmcm" />
                        <link field="terms_map" reltype="has_many" key="course" map="" class="acmtcm" />
+                       <link field="creator" reltype="has_a" key="id" map="" class="au"/>
+                       <link field="editor" reltype="has_a" key="id" map="" class="au"/>
         </links>
         <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
             <actions>
@@ -3312,6 +3318,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
             <field reporter:label="Original Circ Modifier" name="original_circ_modifier" reporter:datatype="link" />
             <field reporter:label="Original Shelving Location" name="original_location" reporter:datatype="link" />
             <field reporter:label="Original Callnumber" name="original_callnumber" reporter:datatype="link" />
+                       <field reporter:label="Creating User" name="creator" reporter:datatype="link"/>
+                       <field reporter:label="Editing User" name="editor" reporter:datatype="link"/>
+                       <field reporter:label="Create Time" name="create_time" reporter:datatype="timestamp"/>
+                       <field reporter:label="Edit Time" name="edit_time" reporter:datatype="timestamp"/>
         </fields>
         <links>
             <link field="course" reltype="has_a" key="id" map="" class="acmc" />
@@ -3321,6 +3331,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
             <link field="original_status" reltype="has_a" key="id" map="" class="ccs" />
             <link field="original_circ_modifier" reltype="has_a" key="code" map="" class="ccm" />
             <link field="original_location" reltype="has_a" key="id" map="" class="acpl" />
+                       <link field="creator" reltype="has_a" key="id" map="" class="au"/>
+                       <link field="editor" reltype="has_a" key="id" map="" class="au"/>
         </links>
         <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
             <actions>
@@ -3346,11 +3358,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field reporter:label="End Date" name="end_date" reporter:datatype="timestamp"/>
                        <field reporter:label="Courses" name="courses" reporter:datatype="link" oils_persist:virtual="true"/>
                        <field reporter:label="Course Maps" name="maps" reporter:datatype="link" oils_persist:virtual="true"/>
+                       <field reporter:label="Creating User" name="creator" reporter:datatype="link"/>
+                       <field reporter:label="Editing User" name="editor" reporter:datatype="link"/>
+                       <field reporter:label="Create Time" name="create_time" reporter:datatype="timestamp"/>
+                       <field reporter:label="Edit Time" name="edit_time" reporter:datatype="timestamp"/>
                </fields>
                <links>
             <link field="owning_lib" reltype="has_a" key="id" map="" class="aou" />
                        <link field="courses" reltype="has_many" key="term" map="course" class="acmtcm"/>
                        <link field="maps" reltype="has_many" key="term" map="" class="acmtcm"/>
+                       <link field="creator" reltype="has_a" key="id" map="" class="au"/>
+                       <link field="editor" reltype="has_a" key="id" map="" class="au"/>
                </links>
                <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
                        <actions>
@@ -3391,7 +3409,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field reporter:label="Role ID" name="id" reporter:datatype="id" reporter:selector="name"/>
                        <field reporter:label="Name" name="name" reporter:datatype="text" oils_persist:i18n="true" oils_obj:required="true"/>
             <field reporter:label="OPAC Viewable?" name="is_public" reporter:datatype="bool" />
+                       <field reporter:label="Creating User" name="creator" reporter:datatype="link"/>
+                       <field reporter:label="Editing User" name="editor" reporter:datatype="link"/>
+                       <field reporter:label="Create Time" name="create_time" reporter:datatype="timestamp"/>
+                       <field reporter:label="Edit Time" name="edit_time" reporter:datatype="timestamp"/>
                </fields>
+        <links>
+                       <link field="creator" reltype="has_a" key="id" map="" class="au"/>
+                       <link field="editor" reltype="has_a" key="id" map="" class="au"/>
+        </links>
                <permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
                        <actions>
                                <create permission="MANAGE_RESERVES" global_required="true" />
index aec9838..4581028 100644 (file)
           <eg-grid-column path="original_location.name" [hidden]="true" label="Original Shelving Location" i18n-label></eg-grid-column>
           <eg-grid-column path="original_status.name" [hidden]="true" label="Original Item Status" i18n-label></eg-grid-column>
           <eg-grid-column path="relationship" label="Relationship" i18n-label></eg-grid-column>
+          <eg-grid-column path="create_time" label="Create Time" [hidden]="true" datatype="timestamp" i18n-label></eg-grid-column>
+          <eg-grid-column path="edit_time" label="Edit Time" [hidden]="true" datatype="timestamp" i18n-label></eg-grid-column>
+          <eg-grid-column path="creator" label="Creator" [hidden]="true" i18n-label></eg-grid-column>
+          <eg-grid-column path="editor" label="Editor" [hidden]="true" i18n-label></eg-grid-column>
         </eg-grid>
       </div>
     </div>
 
 <eg-fm-record-editor #editDialog idlClass='acmcm' [fieldOptions]="{course: {customTemplate:{template:acmcTemplate}}}"
   [preloadLinkedValues]="true"
-  hiddenFields="id,item,original_callnumber,original_status,original_location,original_circ_modifier,record,temporary_record">
+  hiddenFields="id,item,original_callnumber,original_status,original_location,original_circ_modifier,record,temporary_record,editor,create_time,edit_time">
 </eg-fm-record-editor>
index 6fb0972..c3cda51 100644 (file)
   <li ngbNavItem>
     <a ngbNavLink i18n>Terms</a>
     <ng-template ngbNavContent>
-      <eg-admin-page idlClass="acmt" [defaultNewRecord]="defaultTerm" fieldOrder="name,owning_lib,start_date,end_date"></eg-admin-page>
+      <eg-admin-page idlClass="acmt" [defaultNewRecord]="defaultTerm" fieldOrder="name,owning_lib,start_date,end_date"
+      readonlyFields="id,is_archived,creator,editor,create_time,edit_time">></eg-admin-page>
     </ng-template>
   </li>
   <li ngbNavItem>
     <a ngbNavLink i18n>Course roles</a>
     <ng-template ngbNavContent>
-      <eg-admin-page idlClass="acmr"></eg-admin-page>
+      <eg-admin-page idlClass="acmr"
+        readonlyFields="id,is_archived,creator,editor,create_time,edit_time">></eg-admin-page>
     </ng-template>
   </li>
 </ul>
@@ -67,7 +69,7 @@
   idlClass="acmc"
   fieldOrder="course_number,name,owning_lib,section_number"
   [preloadLinkedValues]="true"
-  hiddenFields="id,is_archived">
+  hiddenFields="id,is_archived,creator,editor,create_time,edit_time">
 </eg-fm-record-editor>
 
 <ng-template #termMapLink let-row="row">
index 2ba9d40..ef3cf36 100644 (file)
@@ -131,6 +131,8 @@ export class CourseListComponent implements OnInit, AfterViewInit {
         this.editDialog.mode = 'create';
         const course_module_course = this.idl.create('acmc');
         course_module_course.owning_lib(this.auth.user().ws_ou());
+        course_module_course.creator(this.auth.user().id());
+        course_module_course.editor(course_module_course.creator());
         this.editDialog.recordId = null;
         this.editDialog.record = course_module_course;
         this.editDialog.open({size: this.dialog_size}).subscribe(
@@ -165,6 +167,8 @@ export class CourseListComponent implements OnInit, AfterViewInit {
         this.courseSvc.disassociateMaterials(course).then(res => {
             course.forEach(courseToArchive => {
                 courseToArchive.is_archived(true);
+                courseToArchive.editor(this.auth.user().id());
+                courseToArchive.edit_time(new Date());
             });
             this.pcrud.update(course).subscribe(
                 val => {
index 4936a97..ea4f4be 100644 (file)
@@ -31,7 +31,7 @@
         <div class="col-lg-6 mt-3">
           <eg-fm-record-editor displayMode="inline"
             mode="update"
-            hiddenFieldsList="id,is_archived"
+            hiddenFieldsList="id,is_archived,editor,creator,edit_time,create_time"
             idlClass="acmc"
             fieldOrder="course_number,name,owning_lib,section_number"
             [preloadLinkedValues]="true"
index 080626b..14a3acc 100644 (file)
@@ -127,6 +127,8 @@ export class CourseService {
         if (args.isModifyingCallNumber) {
             material.original_callnumber(item.call_number());
         }
+        material.creator(this.auth.user().id());
+        material.editor(material.creator());
         const response = {
             item: item,
             material: this.pcrud.create(material).toPromise()
@@ -219,6 +221,8 @@ export class CourseService {
     updateItem(item: IdlObject, courseLib, callNumber, updatingVolume) {
         return new Promise((resolve, reject) => {
             this.pcrud.update(item).subscribe(() => {
+                item.editor(this.auth.user().id());
+                item.edit_time(new Date());
                 if (updatingVolume) {
                     const cn = item.call_number();
                     const callNumberLibrary = this.org.canHaveVolumes(courseLib) ? courseLib.id() : cn.owning_lib();
index e269238..1b827bd 100644 (file)
@@ -1100,13 +1100,29 @@ CREATE TABLE asset.course_module_course (
     course_number   TEXT NOT NULL,
     section_number  TEXT,
     owning_lib      INT REFERENCES actor.org_unit (id),
-    is_archived        BOOLEAN DEFAULT false
+    is_archived        BOOLEAN DEFAULT false,
+       creator        BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED,
+       editor         BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED,
+       create_time    TIMESTAMP WITH TIME ZONE    DEFAULT NOW(),
+       edit_time      TIMESTAMP WITH TIME ZONE    DEFAULT NOW();
 );
 
 CREATE TABLE asset.course_module_role (
     id              SERIAL  PRIMARY KEY,
     name            TEXT    UNIQUE NOT NULL,
-    is_public       BOOLEAN NOT NULL DEFAULT false
+    is_public       BOOLEAN NOT NULL DEFAULT false,
+       creator        BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED,
+       editor         BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED,
+       create_time    TIMESTAMP WITH TIME ZONE    DEFAULT NOW(),
+       edit_time      TIMESTAMP WITH TIME ZONE    DEFAULT NOW();
 );
 
 CREATE TABLE asset.course_module_course_users (
@@ -1127,6 +1143,14 @@ CREATE TABLE asset.course_module_course_materials (
     original_status        INT REFERENCES config.copy_status,
     original_circ_modifier TEXT, --REFERENCES config.circ_modifier
     original_callnumber    INT REFERENCES asset.call_number,
+       creator        BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED,
+       editor         BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED,
+       create_time    TIMESTAMP WITH TIME ZONE    DEFAULT NOW(),
+       edit_time      TIMESTAMP WITH TIME ZONE    DEFAULT NOW();
     unique (course, item, record)
 );
 
@@ -1136,6 +1160,14 @@ CREATE TABLE asset.course_module_term (
     owning_lib      INT REFERENCES actor.org_unit (id),
        start_date      TIMESTAMP WITH TIME ZONE,
        end_date        TIMESTAMP WITH TIME ZONE,
+       creator        BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED,
+       editor         BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED,
+       create_time    TIMESTAMP WITH TIME ZONE    DEFAULT NOW(),
+       edit_time      TIMESTAMP WITH TIME ZONE    DEFAULT NOW();
     CONSTRAINT cmt_once_per_owning_lib UNIQUE (owning_lib, name)
 );
 
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.scheme.lp1915556-course-material-trace-editing-history.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.scheme.lp1915556-course-material-trace-editing-history.sql
new file mode 100644 (file)
index 0000000..c7e5498
--- /dev/null
@@ -0,0 +1,47 @@
+BEGIN;
+
+SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version);
+
+ALTER TABLE asset.course_module_course
+       ADD COLUMN creator        BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED  DEFAULT 1,
+       ADD COLUMN editor         BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED DEFAULT 1,
+       ADD COLUMN create_time    TIMESTAMP WITH TIME ZONE    DEFAULT NOW(),
+       ADD COLUMN edit_time      TIMESTAMP WITH TIME ZONE    DEFAULT NOW();
+
+ALTER TABLE asset.course_module_course_materials
+       ADD COLUMN creator        BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED  DEFAULT 1,
+       ADD COLUMN editor         BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED DEFAULT 1,
+       ADD COLUMN create_time    TIMESTAMP WITH TIME ZONE    DEFAULT NOW(),
+       ADD COLUMN edit_time      TIMESTAMP WITH TIME ZONE    DEFAULT NOW();
+
+
+ALTER TABLE asset.course_module_term
+       ADD COLUMN creator        BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED  DEFAULT 1,
+       ADD COLUMN editor         BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED DEFAULT 1,
+       ADD COLUMN create_time    TIMESTAMP WITH TIME ZONE    DEFAULT NOW(),
+       ADD COLUMN edit_time      TIMESTAMP WITH TIME ZONE    DEFAULT NOW();
+
+
+ALTER TABLE asset.course_module_role
+       ADD COLUMN creator        BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED  DEFAULT 1,
+       ADD COLUMN editor         BIGINT   NOT NULL
+                               REFERENCES actor.usr (id)
+                               DEFERRABLE INITIALLY DEFERRED DEFAULT 1,
+       ADD COLUMN create_time    TIMESTAMP WITH TIME ZONE    DEFAULT NOW(),
+       ADD COLUMN edit_time      TIMESTAMP WITH TIME ZONE    DEFAULT NOW();
+    
+COMMIT;
\ No newline at end of file