- 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
<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>
<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" />
<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>
<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>
<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" />
<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>
<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>
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">
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(
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 => {
<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"
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()
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();
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,
+ ADD COLUMN creator BIGINT NOT NULL
+ REFERENCES actor.usr (id)
+ DEFERRABLE INITIALLY DEFERRED,
+ ADD COLUMN editor BIGINT NOT NULL
+ REFERENCES actor.usr (id)
+ DEFERRABLE INITIALLY DEFERRED,
+ ADD COLUMN create_time TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+ ADD COLUMN 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,
+ ADD COLUMN creator BIGINT NOT NULL
+ REFERENCES actor.usr (id)
+ DEFERRABLE INITIALLY DEFERRED,
+ ADD COLUMN editor BIGINT NOT NULL
+ REFERENCES actor.usr (id)
+ DEFERRABLE INITIALLY DEFERRED,
+ ADD COLUMN create_time TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+ ADD COLUMN edit_time TIMESTAMP WITH TIME ZONE DEFAULT NOW();
);
CREATE TABLE asset.course_module_course_users (
original_status INT REFERENCES config.copy_status,
original_circ_modifier TEXT, --REFERENCES config.circ_modifier
original_callnumber INT REFERENCES asset.call_number,
+ ADD COLUMN creator BIGINT NOT NULL
+ REFERENCES actor.usr (id)
+ DEFERRABLE INITIALLY DEFERRED,
+ ADD COLUMN editor BIGINT NOT NULL
+ REFERENCES actor.usr (id)
+ DEFERRABLE INITIALLY DEFERRED,
+ ADD COLUMN create_time TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+ ADD COLUMN edit_time TIMESTAMP WITH TIME ZONE DEFAULT NOW();
unique (course, item, record)
);
owning_lib INT REFERENCES actor.org_unit (id),
start_date TIMESTAMP WITH TIME ZONE,
end_date TIMESTAMP WITH TIME ZONE,
+ ADD COLUMN creator BIGINT NOT NULL
+ REFERENCES actor.usr (id)
+ DEFERRABLE INITIALLY DEFERRED,
+ ADD COLUMN editor BIGINT NOT NULL
+ REFERENCES actor.usr (id)
+ DEFERRABLE INITIALLY DEFERRED,
+ ADD COLUMN create_time TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
+ ADD COLUMN edit_time TIMESTAMP WITH TIME ZONE DEFAULT NOW();
CONSTRAINT cmt_once_per_owning_lib UNIQUE (owning_lib, name)
);
--- /dev/null
+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