2018-01-16 06:09:17 +00:00
|
|
|
const frappe = require('frappejs');
|
2018-01-12 12:25:07 +00:00
|
|
|
|
2018-01-24 11:52:05 +00:00
|
|
|
module.exports = class BaseDocument {
|
2018-01-12 12:25:07 +00:00
|
|
|
constructor(data) {
|
|
|
|
this.handlers = {};
|
|
|
|
this.setup();
|
|
|
|
Object.assign(this, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
setup() {
|
|
|
|
// add handlers
|
|
|
|
}
|
|
|
|
|
|
|
|
clear_handlers() {
|
|
|
|
this.handlers = {};
|
|
|
|
}
|
|
|
|
|
|
|
|
add_handler(key, method) {
|
|
|
|
if (!this.handlers[key]) {
|
|
|
|
this.handlers[key] = [];
|
|
|
|
}
|
|
|
|
this.handlers[key].push(method || key);
|
|
|
|
}
|
|
|
|
|
2018-01-25 10:04:48 +00:00
|
|
|
get(fieldname) {
|
|
|
|
return this[fieldname];
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
|
|
|
|
2018-01-25 10:04:48 +00:00
|
|
|
// set value and trigger change
|
|
|
|
async set(fieldname, value) {
|
|
|
|
this[fieldname] = await this.validate_field(fieldname, value);
|
2018-01-31 13:04:46 +00:00
|
|
|
await this.trigger('change', { doc: this, fieldname: fieldname, value: value });
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
set_name() {
|
|
|
|
// assign a random name by default
|
|
|
|
// override this to set a name
|
|
|
|
if (!this.name) {
|
2018-02-08 06:46:38 +00:00
|
|
|
this.name = frappe.getRandomName();
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
set_keywords() {
|
|
|
|
let keywords = [];
|
2018-02-08 06:46:38 +00:00
|
|
|
for (let fieldname of this.meta.getKeywordFields()) {
|
2018-01-12 12:25:07 +00:00
|
|
|
keywords.push(this[fieldname]);
|
|
|
|
}
|
|
|
|
this.keywords = keywords.join(', ');
|
|
|
|
}
|
|
|
|
|
|
|
|
get meta() {
|
|
|
|
if (!this._meta) {
|
2018-02-08 06:46:38 +00:00
|
|
|
this._meta = frappe.getMeta(this.doctype);
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
|
|
|
return this._meta;
|
|
|
|
}
|
|
|
|
|
|
|
|
append(key, document) {
|
|
|
|
if (!this[key]) {
|
|
|
|
this[key] = [];
|
|
|
|
}
|
|
|
|
this[key].push(this.init_doc(document));
|
|
|
|
}
|
|
|
|
|
|
|
|
init_doc(data) {
|
|
|
|
if (data.prototype instanceof Document) {
|
|
|
|
return data;
|
|
|
|
} else {
|
2018-02-01 09:29:25 +00:00
|
|
|
return new Document(data);
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-31 13:04:46 +00:00
|
|
|
async validate_field(key, value) {
|
2018-01-31 12:56:21 +00:00
|
|
|
let field = this.meta.get_field(key);
|
2018-01-31 13:04:46 +00:00
|
|
|
if (field && field.fieldtype == 'Select') {
|
2018-01-31 12:56:21 +00:00
|
|
|
return this.meta.validate_select(field, value);
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
2018-01-25 10:04:48 +00:00
|
|
|
return value;
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
get_valid_dict() {
|
2018-02-01 11:07:36 +00:00
|
|
|
let data = {};
|
2018-02-08 06:46:38 +00:00
|
|
|
for (let field of this.meta.getValidFields()) {
|
2018-02-01 11:07:36 +00:00
|
|
|
data[field.fieldname] = this[field.fieldname];
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
2018-02-01 11:07:36 +00:00
|
|
|
return data;
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
set_standard_values() {
|
|
|
|
let now = new Date();
|
|
|
|
if (this.docstatus === null || this.docstatus === undefined) {
|
|
|
|
this.docstatus = 0;
|
|
|
|
}
|
|
|
|
if (!this.owner) {
|
|
|
|
this.owner = frappe.session.user;
|
|
|
|
this.creation = now;
|
|
|
|
}
|
|
|
|
this.modified_by = frappe.session.user;
|
|
|
|
this.modified = now;
|
|
|
|
}
|
|
|
|
|
|
|
|
async load() {
|
2018-01-15 11:55:31 +00:00
|
|
|
let data = await frappe.db.get(this.doctype, this.name);
|
|
|
|
if (data.name) {
|
2018-02-01 11:07:36 +00:00
|
|
|
this.sync_values(data);
|
2018-01-15 11:55:31 +00:00
|
|
|
} else {
|
|
|
|
throw new frappe.errors.NotFound(`Not Found: ${this.doctype} ${this.name}`);
|
|
|
|
}
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
|
|
|
|
2018-02-01 11:07:36 +00:00
|
|
|
sync_values(data) {
|
|
|
|
this.clear_values();
|
|
|
|
Object.assign(this, data);
|
|
|
|
}
|
|
|
|
|
|
|
|
clear_values() {
|
2018-02-08 06:46:38 +00:00
|
|
|
for (let field of this.meta.getValidFields()) {
|
2018-02-01 11:07:36 +00:00
|
|
|
if(this[field.fieldname]) {
|
|
|
|
delete this[field.fieldname];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-07 13:23:52 +00:00
|
|
|
set_child_idx() {
|
|
|
|
// renumber children
|
2018-02-08 06:46:38 +00:00
|
|
|
for (let field of this.meta.getValidFields()) {
|
2018-02-07 13:23:52 +00:00
|
|
|
if (field.fieldtype==='Table') {
|
|
|
|
for(let i=0; i < (this[field.fieldname] || []).length; i++) {
|
|
|
|
this[field.fieldname][i].idx = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async commit() {
|
|
|
|
// re-run triggers
|
2018-01-12 12:25:07 +00:00
|
|
|
this.set_name();
|
|
|
|
this.set_standard_values();
|
|
|
|
this.set_keywords();
|
2018-02-07 13:23:52 +00:00
|
|
|
this.set_child_idx();
|
2018-01-25 10:04:48 +00:00
|
|
|
await this.trigger('validate');
|
2018-02-07 13:23:52 +00:00
|
|
|
await this.trigger('commit');
|
|
|
|
}
|
|
|
|
|
|
|
|
async insert() {
|
|
|
|
await this.commit();
|
2018-01-25 10:04:48 +00:00
|
|
|
await this.trigger('before_insert');
|
2018-02-01 11:07:36 +00:00
|
|
|
this.sync_values(await frappe.db.insert(this.doctype, this.get_valid_dict()));
|
2018-01-25 10:04:48 +00:00
|
|
|
await this.trigger('after_insert');
|
|
|
|
await this.trigger('after_save');
|
2018-02-01 11:07:36 +00:00
|
|
|
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2018-02-07 13:23:52 +00:00
|
|
|
async update() {
|
|
|
|
await this.commit();
|
2018-02-01 11:07:36 +00:00
|
|
|
await this.trigger('before_update');
|
|
|
|
this.sync_values(await frappe.db.update(this.doctype, this.get_valid_dict()));
|
|
|
|
await this.trigger('after_update');
|
|
|
|
await this.trigger('after_save');
|
|
|
|
|
|
|
|
return this;
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
async delete() {
|
|
|
|
await this.trigger('before_delete');
|
|
|
|
await frappe.db.delete(this.doctype, this.name);
|
|
|
|
await this.trigger('after_delete');
|
|
|
|
}
|
|
|
|
|
2018-01-25 10:04:48 +00:00
|
|
|
async trigger(key, params) {
|
|
|
|
if (this.handlers[key]) {
|
|
|
|
for (let method of this.handlers[key]) {
|
|
|
|
if (typeof method === 'string') {
|
|
|
|
await this[method](params);
|
|
|
|
} else {
|
|
|
|
await method(params);
|
2018-01-12 12:25:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-01-24 11:52:05 +00:00
|
|
|
};
|