Unique name
From OpenKM Documentation
The script generates unique document name based in metadata values each time new document is uploaded.
Description:
- Property okp:data.id store unique autoincremental value.
- Property okp:data.project.code store project code value.
- Property okp:data.customer store customer code.
- Property okp:data.description store document description.
- When a new document is uploaded user must fill all fields except okp:data.id which is automatically set by OpenKM.
- When PropertyGroup is changed - event fired - is executed automatic code which generates okp:data.id and rename document based on projectCode-autonumericId-clientCode-description.documentExtension.
Property group definition:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE property-groups PUBLIC "-//OpenKM//DTD Property Groups 2.1//EN"
"http://www.openkm.com/dtd/property-groups-2.1.dtd">
<property-groups>
<property-group label="Datos" name="okg:data">
<input label="Id" type="text" name="okp:data.id" width="200px" readonly="true"/>
<input label="Project code" type="text" name="okp:data.project.code" width="200px">
<validator type="req"/>
<validator type="num"/>
<validator type="maxlen" parameter="6"/>
<validator type="minlen" parameter="6"/>
</input>
<select label="Customer" name="okp:data.customer" type="simple"
table="customer"
optionsQuery="select $cus_id, $customer_nombre from DatabaseMetadataValue dmv where dmv.table='customer'">
<validator type="req"/>
</select>
<input label="Description" type="text" name="okp:data.description" width="200px">
<validator type="req"/>
<validator type="maxlen" parameter="150"/>
</input>
</property-group>
</property-groups>
Database metadata:
-- metadata type
DELETE FROM OKM_DB_METADATA_TYPE WHERE DMT_TABLE='customer';
INSERT INTO OKM_DB_METADATA_TYPE (DMT_TABLE, DMT_REAL_COLUMN, DMT_TYPE, DMT_VIRTUAL_COLUMN) VALUES ('customer', 'col00', 'integer', 'cli_id');
INSERT INTO OKM_DB_METADATA_TYPE (DMT_TABLE, DMT_REAL_COLUMN, DMT_TYPE, DMT_VIRTUAL_COLUMN) VALUES ('customer', 'col01', 'text', 'cli_nombre');
-- values
DELETE FROM OKM_DB_METADATA_VALUE WHERE DMV_TABLE='customer';
INSERT INTO OKM_DB_METADATA_VALUE (DMV_TABLE, DMV_COL00, DMV_COL01) VALUES ('clientes', '0001','Customer 1');
INSERT INTO OKM_DB_METADATA_VALUE (DMV_TABLE, DMV_COL00, DMV_COL01) VALUES ('clientes', '0002','Customer 2');
Code:
import com.openkm.api.OKMPropertyGroup;
import com.openkm.api.OKMRepository;
import java.util.*;
import com.openkm.dao.DatabaseMetadataDAO;
import com.openkm.api.OKMPropertyGroup;
import com.openkm.bean.form.FormElement;
import com.openkm.bean.form.Input;
import com.openkm.bean.form.Select;
import com.openkm.bean.form.Option;
import com.openkm.util.PathUtils;
import com.openkm.util.FileUtils;
import com.openkm.api.OKMDocument;
String grpName = "okg:data";
String table = "autonumber";
String sequenceName = "doc_id";
String path = OKMRepository.getInstance().getNodePath(null,uuid);
// Evaluate if already has property group
boolean add = true;
String prjCode = "";
String clientCode = "";
String docId = "";
String desc = "";
for (FormElement formElement : OKMPropertyGroup.getInstance().getProperties(null, path, grpName)) {
if (formElement.getName().equals("okp:data.id")) {
docId = ((Input) formElement).getValue();
add = docId.equals("");
} else if (formElement.getName().equals("okp:data.project.code")) {
prjCode = ((Input) formElement).getValue();
} else if (formElement.getName().equals("okp:data.description")) {
desc = ((Input) formElement).getValue();
} else if (formElement.getName().equals("okp:data.customer")) {
for (Option option: ((Select) formElement).getOptions()) {
if (option.isSelected()) {
clientCode = option.getValue();
}
}
}
}
// Setting properties
if (add) {
// add unique document id
docId = String.valueOf(DatabaseMetadataDAO.getNextSequenceValue(table, sequenceName));
switch (docId.length()) {
case 1:
docId = "0000" + docId;
break;
case 2:
docId = "000" + docId;
break;
case 3:
docId = "00" + docId;
break;
case 4:
docId = "0" + docId;
break;
}
Map map = new HashMap();
map.put("okp:data.id",docId);
OKMPropertyGroup.getInstance().setPropertiesSimple(null, path, grpName, map);
}
// rename document
String newName = prjCode + "-" + docId + "-" + clientCode + "-" + desc + "." + FileUtils.getFileExtension(PathUtils.getName(path));
OKMDocument.getInstance().rename(null, path, newName);
Example
Register property groups:
Create automation task to show property group in document wizard: