diff --git a/core/doctype/custom_field/custom_field.txt b/core/doctype/custom_field/custom_field.txt index 9cfdee552e..7c35ac0c22 100644 --- a/core/doctype/custom_field/custom_field.txt +++ b/core/doctype/custom_field/custom_field.txt @@ -2,26 +2,17 @@ { "owner": "Administrator", "docstatus": 0, - "creation": "2012-05-25 14:30:53", + "creation": "2012-09-10 14:50:29", "modified_by": "Administrator", - "modified": "2012-09-10 12:14:04" + "modified": "2012-12-28 11:54:12" }, { - "section_style": "Simple", + "autoname": "eval:doc.dt+\"-\"+doc.fieldname", "description": "Adds a custom field to a DocType", - "tag_fields": "dt,fieldtype", "search_fields": "dt,label,fieldtype,options", "module": "Core", "doctype": "DocType", - "allow_trash": 1, - "server_code_error": " ", - "subject": "%(label)s (%(fieldtype)s) on %(dt)s", - "autoname": "eval:doc.dt+\"-\"+doc.fieldname", - "name": "__common__", - "colour": "White:FFF", - "_last_update": "1305789385", - "show_in_menu": 0, - "version": 1 + "name": "__common__" }, { "name": "__common__", @@ -43,37 +34,7 @@ "doctype": "DocType" }, { - "create": 1, - "doctype": "DocPerm", - "write": 1, - "role": "Administrator", - "cancel": 1, - "permlevel": 0 - }, - { - "role": "Administrator", - "permlevel": 1, - "doctype": "DocPerm" - }, - { - "role": "Administrator", - "permlevel": 2, - "doctype": "DocPerm" - }, - { - "create": 1, - "doctype": "DocPerm", - "write": 1, - "role": "System Manager", - "cancel": 1, - "permlevel": 0 - }, - { - "role": "System Manager", - "permlevel": 1, - "doctype": "DocPerm" - }, - { + "print_width": "50%", "oldfieldtype": "Column Break", "doctype": "DocField", "label": "Details", @@ -84,13 +45,13 @@ }, { "no_copy": 0, - "search_index": 0, + "oldfieldtype": "Small Text", "doctype": "DocField", "label": "Trash Reason", "oldfieldname": "trash_reason", "fieldname": "trash_reason", "fieldtype": "Small Text", - "oldfieldtype": "Small Text", + "search_index": 0, "permlevel": 1 }, { @@ -100,7 +61,6 @@ "label": "Document", "oldfieldname": "dt", "permlevel": 0, - "trigger": "Client", "fieldname": "dt", "fieldtype": "Link", "search_index": 1, @@ -110,13 +70,13 @@ }, { "no_copy": 1, - "search_index": 0, + "oldfieldtype": "Data", "doctype": "DocField", "label": "Label", "oldfieldname": "label", "fieldname": "label", "fieldtype": "Data", - "oldfieldtype": "Data", + "search_index": 0, "reqd": 1, "permlevel": 0, "in_filter": 1 @@ -132,12 +92,10 @@ { "no_copy": 0, "oldfieldtype": "Select", - "colour": "White:FFF", "doctype": "DocField", "label": "Field Type", "oldfieldname": "fieldtype", "permlevel": 0, - "trigger": "Client", "fieldname": "fieldtype", "fieldtype": "Select", "search_index": 0, @@ -155,28 +113,30 @@ }, { "no_copy": 0, - "search_index": 0, + "oldfieldtype": "Text", "doctype": "DocField", "label": "Options", "oldfieldname": "options", "fieldname": "options", "fieldtype": "Text", - "oldfieldtype": "Text", + "search_index": 0, "permlevel": 0 }, { + "print_width": "300px", "no_copy": 0, - "search_index": 0, + "oldfieldtype": "Text", "doctype": "DocField", "label": "Field Description", "oldfieldname": "description", "width": "300px", "fieldname": "description", "fieldtype": "Text", - "oldfieldtype": "Text", + "search_index": 0, "permlevel": 0 }, { + "print_width": "50%", "oldfieldtype": "Column Break", "doctype": "DocField", "label": "Properties", @@ -188,126 +148,169 @@ { "description": "Select the label after which you want to insert new field.", "no_copy": 1, - "search_index": 0, - "colour": "White:FFF", + "oldfieldtype": "Select", "doctype": "DocField", "label": "Insert After", "oldfieldname": "insert_after", - "trigger": "Client", "fieldname": "insert_after", "fieldtype": "Select", - "oldfieldtype": "Select", + "search_index": 0, "permlevel": 0 }, { "no_copy": 0, - "search_index": 0, + "oldfieldtype": "Text", "doctype": "DocField", "label": "Default Value", "oldfieldname": "default", "fieldname": "default", "fieldtype": "Text", - "oldfieldtype": "Text", + "search_index": 0, "permlevel": 0 }, { "no_copy": 1, - "search_index": 0, + "oldfieldtype": "Data", "doctype": "DocField", "label": "Fieldname", "oldfieldname": "fieldname", "fieldname": "fieldname", "fieldtype": "Data", - "oldfieldtype": "Data", + "search_index": 0, "permlevel": 2 }, { "no_copy": 0, - "search_index": 0, + "oldfieldtype": "Data", "doctype": "DocField", "label": "Width", "oldfieldname": "width", "fieldname": "width", "fieldtype": "Data", - "oldfieldtype": "Data", + "search_index": 0, "permlevel": 0 }, { "no_copy": 0, - "search_index": 0, + "oldfieldtype": "Check", "doctype": "DocField", "label": "Is Mandatory Field", "oldfieldname": "reqd", "fieldname": "reqd", "fieldtype": "Check", - "oldfieldtype": "Check", + "search_index": 0, "permlevel": 0 }, { "no_copy": 0, - "search_index": 0, + "oldfieldtype": "Check", "doctype": "DocField", "label": "In Report Filter", "oldfieldname": "in_filter", "fieldname": "in_filter", "fieldtype": "Check", - "oldfieldtype": "Check", + "search_index": 0, "permlevel": 0 }, { "no_copy": 0, - "search_index": 0, + "oldfieldtype": "Check", "doctype": "DocField", "label": "No Copy", "oldfieldname": "no_copy", "fieldname": "no_copy", "fieldtype": "Check", - "oldfieldtype": "Check", + "search_index": 0, + "permlevel": 0 + }, + { + "doctype": "DocField", + "label": "Read Only", + "fieldname": "read_only", + "fieldtype": "Check", + "permlevel": 0 + }, + { + "doctype": "DocField", + "label": "Hidden", + "fieldname": "hidden", + "fieldtype": "Check", "permlevel": 0 }, { "no_copy": 0, - "search_index": 0, + "oldfieldtype": "Check", "doctype": "DocField", "label": "Print Hide", "oldfieldname": "print_hide", "fieldname": "print_hide", "fieldtype": "Check", - "oldfieldtype": "Check", + "search_index": 0, "permlevel": 0 }, { "no_copy": 0, - "search_index": 0, + "oldfieldtype": "Check", "doctype": "DocField", "label": "Report Hide", "oldfieldname": "report_hide", "fieldname": "report_hide", "fieldtype": "Check", - "oldfieldtype": "Check", + "search_index": 0, "permlevel": 0 }, { "no_copy": 0, - "search_index": 0, + "oldfieldtype": "Check", "doctype": "DocField", "label": "Allow on Submit", "oldfieldname": "allow_on_submit", "fieldname": "allow_on_submit", "fieldtype": "Check", - "oldfieldtype": "Check", + "search_index": 0, "permlevel": 0 }, { - "no_copy": 0, - "search_index": 0, + "default": "0", + "oldfieldtype": "Int", "doctype": "DocField", "label": "Permission Level", "oldfieldname": "permlevel", - "default": "0", + "no_copy": 0, "fieldname": "permlevel", "fieldtype": "Int", - "oldfieldtype": "Int", + "search_index": 0, "permlevel": 0 + }, + { + "create": 1, + "doctype": "DocPerm", + "write": 1, + "role": "Administrator", + "cancel": 1, + "permlevel": 0 + }, + { + "doctype": "DocPerm", + "role": "Administrator", + "permlevel": 1 + }, + { + "doctype": "DocPerm", + "role": "Administrator", + "permlevel": 2 + }, + { + "create": 1, + "doctype": "DocPerm", + "write": 1, + "role": "System Manager", + "cancel": 1, + "permlevel": 0 + }, + { + "doctype": "DocPerm", + "role": "System Manager", + "permlevel": 1 } ] \ No newline at end of file diff --git a/core/doctype/docfield/docfield.txt b/core/doctype/docfield/docfield.txt index e07413a45b..d767332ecb 100644 --- a/core/doctype/docfield/docfield.txt +++ b/core/doctype/docfield/docfield.txt @@ -2,9 +2,9 @@ { "owner": "Administrator", "docstatus": 0, - "creation": "2012-12-20 17:16:52", + "creation": "2012-12-28 10:34:30", "modified_by": "Administrator", - "modified": "2012-12-28 10:32:57" + "modified": "2012-12-28 11:21:09" }, { "istable": 1, @@ -49,6 +49,7 @@ "doctype": "DocType" }, { + "print_width": "163", "oldfieldtype": "Data", "doctype": "DocField", "label": "Label", @@ -96,6 +97,20 @@ "hidden": 0 }, { + "print_width": "50px", + "oldfieldtype": "Check", + "doctype": "DocField", + "label": "Mandatory", + "oldfieldname": "reqd", + "width": "50px", + "fieldname": "reqd", + "fieldtype": "Check", + "search_index": 0, + "reqd": 0, + "hidden": 0 + }, + { + "print_width": "50px", "default": "0", "oldfieldtype": "Int", "doctype": "DocField", @@ -109,6 +124,7 @@ "hidden": 0 }, { + "print_width": "50px", "doctype": "DocField", "label": "Read Only", "width": "50px", @@ -116,6 +132,7 @@ "fieldtype": "Check" }, { + "print_width": "50px", "oldfieldtype": "Data", "doctype": "DocField", "label": "Width", @@ -127,18 +144,6 @@ "reqd": 0, "hidden": 0 }, - { - "oldfieldtype": "Check", - "doctype": "DocField", - "label": "Reqd", - "oldfieldname": "reqd", - "width": "50px", - "fieldname": "reqd", - "fieldtype": "Check", - "search_index": 0, - "reqd": 0, - "hidden": 0 - }, { "oldfieldtype": "Text", "doctype": "DocField", @@ -151,6 +156,7 @@ "hidden": 0 }, { + "print_width": "50px", "oldfieldtype": "Check", "doctype": "DocField", "label": "Hidden", @@ -171,6 +177,7 @@ "fieldtype": "Data" }, { + "print_width": "50px", "oldfieldtype": "Check", "doctype": "DocField", "label": "Print Hide", @@ -189,6 +196,7 @@ "fieldtype": "Data" }, { + "print_width": "50px", "oldfieldtype": "Check", "doctype": "DocField", "label": "No Copy", @@ -198,6 +206,7 @@ "fieldtype": "Check" }, { + "print_width": "50px", "oldfieldtype": "Check", "doctype": "DocField", "label": "Allow on Submit", @@ -207,6 +216,7 @@ "fieldtype": "Check" }, { + "print_width": "50px", "oldfieldtype": "Check", "doctype": "DocField", "label": "In Filter", @@ -216,6 +226,7 @@ "fieldtype": "Check" }, { + "print_width": "50px", "oldfieldtype": "Check", "doctype": "DocField", "label": "Report Hide", @@ -225,6 +236,7 @@ "fieldtype": "Check" }, { + "print_width": "50px", "oldfieldtype": "Check", "doctype": "DocField", "label": "Index", @@ -237,6 +249,7 @@ "hidden": 0 }, { + "print_width": "300px", "oldfieldtype": "Text", "doctype": "DocField", "label": "Description", diff --git a/core/doctype/workflow/__init__.py b/core/doctype/workflow/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core/doctype/workflow/workflow.js b/core/doctype/workflow/workflow.js new file mode 100644 index 0000000000..c0ec3f72f9 --- /dev/null +++ b/core/doctype/workflow/workflow.js @@ -0,0 +1,20 @@ +wn.provide("wn.core") + +wn.core.Workflow = wn.ui.form.Controller.extend({ + refresh: function(doc) { + this.frm.set_intro(""); + if(doc.is_custom=="No" && !in_list(user_roles, 'Administrator')) { + // make the document read-only + this.frm.perm[0][WRITE] = 0; + + this.frm.set_intro('Standard Workflow editable by Administrator only. \ + To edit workflow, copy this and create a new Custom workflow for this Document Type') + } else { + if(doc.is_active) { + this.frm.set_intro("This Workflow is active."); + } + } + } +}); + +cur_frm.cscript = new wn.core.Workflow({frm:cur_frm}); \ No newline at end of file diff --git a/core/doctype/workflow/workflow.py b/core/doctype/workflow/workflow.py new file mode 100644 index 0000000000..2de2375da6 --- /dev/null +++ b/core/doctype/workflow/workflow.py @@ -0,0 +1,59 @@ +# Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com) +# +# MIT License (MIT) +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +from __future__ import unicode_literals +import webnotes + +class DocType: + def __init__(self, d, dl): + self.doc, self.doclist = d, dl + + def validate(self): + self.set_active() + self.create_custom_field_for_workflow_state() + + def create_custom_field_for_workflow_state(self): + doctypeobj = webnotes.get_doctype(self.doc.document_type) + if not doctypeobj.get({"doctype":"DocField", + "fieldname":self.doc.workflow_state_field}): + + # create custom field + webnotes.model_wrapper([{ + "doctype":"Custom Field", + "dt": self.doc.document_type, + "__islocal": 1, + "fieldname": self.doc.workflow_state_field, + "label": self.doc.workflow_state_field.replace("_", " ").title(), + "hidden": 1, + "fieldtype": "Link", + "options": "Workflow State", + "insert_after": doctypeobj.get({"doctype":"DocField"})[-1].label + }]).save() + + webnotes.msgprint("Created Custom Field '%s' in '%s'" % (self.doc.workflow_state_field, + self.doc.document_type)) + + def set_active(self): + if int(self.doc.is_active or 0): + # clear all other + webnotes.conn.sql("""update tabWorkflow set is_active=0 + where document_type=%s""", + self.doc.document_type) diff --git a/core/doctype/workflow/workflow.txt b/core/doctype/workflow/workflow.txt new file mode 100644 index 0000000000..d7dc7f4a86 --- /dev/null +++ b/core/doctype/workflow/workflow.txt @@ -0,0 +1,109 @@ +[ + { + "owner": "Administrator", + "docstatus": 0, + "creation": "2012-12-28 10:49:55", + "modified_by": "Administrator", + "modified": "2012-12-28 11:26:45" + }, + { + "autoname": "field:workflow_name", + "description": "Defines workflow states and rules for a document.", + "doctype": "DocType", + "module": "Core", + "document_type": "Transaction", + "name": "__common__" + }, + { + "name": "__common__", + "parent": "Workflow", + "doctype": "DocField", + "parenttype": "DocType", + "permlevel": 0, + "parentfield": "fields" + }, + { + "parent": "Workflow", + "read": 1, + "cancel": 1, + "name": "__common__", + "create": 1, + "doctype": "DocPerm", + "write": 1, + "parenttype": "DocType", + "role": "System Manager", + "permlevel": 0, + "parentfield": "permissions" + }, + { + "name": "Workflow", + "doctype": "DocType" + }, + { + "read_only": 0, + "doctype": "DocField", + "label": "Workflow Name", + "fieldname": "workflow_name", + "fieldtype": "Data", + "reqd": 1 + }, + { + "description": "DocType on which this Workflow is applicable.", + "doctype": "DocField", + "label": "Document Type", + "fieldname": "document_type", + "fieldtype": "Link", + "reqd": 1, + "options": "DocType" + }, + { + "description": "If checked, all other workflows become inactive.", + "doctype": "DocField", + "label": "Is Active", + "fieldname": "is_active", + "fieldtype": "Check" + }, + { + "description": "Different \"States\" this document can exist in. Like \"Open\", \"Pending Approval\" etc.", + "doctype": "DocField", + "label": "States", + "fieldname": "states", + "fieldtype": "Section Break" + }, + { + "description": "All possible Workflow States and roles of the workflow.
Docstatus Options: 0 is\"Saved\", 1 is \"Submitted\" and 2 is \"Cancelled\"", + "doctype": "DocField", + "label": "Workflow Document States", + "fieldname": "workflow_document_states", + "fieldtype": "Table", + "reqd": 1, + "options": "Workflow Document State" + }, + { + "description": "Rules for how states are transitions, like next state and which role is allowed to change state etc.", + "doctype": "DocField", + "label": "Transition Rules", + "fieldname": "transition_rules", + "fieldtype": "Section Break" + }, + { + "description": "Rules defining transition of state in the workflow.", + "doctype": "DocField", + "label": "Workflow Transitions", + "fieldname": "workflow_transitions", + "fieldtype": "Table", + "reqd": 1, + "options": "Workflow Transition" + }, + { + "description": "Field that represents the Workflow State of the transaction (if field is not present, a new hidden Custom Field will be created)", + "default": "workflow_state", + "doctype": "DocField", + "label": "Workflow State Field", + "fieldname": "workflow_state_field", + "fieldtype": "Data" + }, + { + "doctype": "DocPerm" + } +] \ No newline at end of file diff --git a/core/doctype/workflow_action/__init__.py b/core/doctype/workflow_action/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core/doctype/workflow_action/workflow_action.py b/core/doctype/workflow_action/workflow_action.py new file mode 100644 index 0000000000..e669908514 --- /dev/null +++ b/core/doctype/workflow_action/workflow_action.py @@ -0,0 +1,27 @@ +# Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com) +# +# MIT License (MIT) +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +from __future__ import unicode_literals +import webnotes + +class DocType: + def __init__(self, d, dl): + self.doc, self.doclist = d, dl \ No newline at end of file diff --git a/core/doctype/workflow_action/workflow_action.txt b/core/doctype/workflow_action/workflow_action.txt new file mode 100644 index 0000000000..eef2f35ed2 --- /dev/null +++ b/core/doctype/workflow_action/workflow_action.txt @@ -0,0 +1,51 @@ +[ + { + "owner": "Administrator", + "docstatus": 0, + "creation": "2012-12-28 10:49:56", + "modified_by": "Administrator", + "modified": "2012-12-28 11:34:48" + }, + { + "autoname": "field:workflow_action_name", + "description": "Workflow Action Master", + "doctype": "DocType", + "module": "Core", + "name": "__common__" + }, + { + "parent": "Workflow Action", + "doctype": "DocField", + "reqd": 1, + "name": "__common__", + "label": "Workflow Action Name", + "parenttype": "DocType", + "fieldname": "workflow_action_name", + "fieldtype": "Data", + "permlevel": 0, + "parentfield": "fields" + }, + { + "parent": "Workflow Action", + "read": 1, + "cancel": 1, + "name": "__common__", + "create": 1, + "doctype": "DocPerm", + "write": 1, + "parenttype": "DocType", + "role": "System Manager", + "permlevel": 0, + "parentfield": "permissions" + }, + { + "name": "Workflow Action", + "doctype": "DocType" + }, + { + "doctype": "DocField" + }, + { + "doctype": "DocPerm" + } +] \ No newline at end of file diff --git a/core/doctype/workflow_document_state/__init__.py b/core/doctype/workflow_document_state/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core/doctype/workflow_document_state/workflow_document_state.py b/core/doctype/workflow_document_state/workflow_document_state.py new file mode 100644 index 0000000000..e669908514 --- /dev/null +++ b/core/doctype/workflow_document_state/workflow_document_state.py @@ -0,0 +1,27 @@ +# Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com) +# +# MIT License (MIT) +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +from __future__ import unicode_literals +import webnotes + +class DocType: + def __init__(self, d, dl): + self.doc, self.doclist = d, dl \ No newline at end of file diff --git a/core/doctype/workflow_document_state/workflow_document_state.txt b/core/doctype/workflow_document_state/workflow_document_state.txt new file mode 100644 index 0000000000..8d7d57c1bc --- /dev/null +++ b/core/doctype/workflow_document_state/workflow_document_state.txt @@ -0,0 +1,60 @@ +[ + { + "owner": "Administrator", + "docstatus": 0, + "creation": "2012-12-28 10:49:56", + "modified_by": "Administrator", + "modified": "2012-12-28 11:37:31" + }, + { + "istable": 1, + "description": "Represents the states allowed in one document and role assigned to change the state.", + "doctype": "DocType", + "module": "Core", + "document_type": "Master", + "name": "__common__" + }, + { + "name": "__common__", + "parent": "Workflow Document State", + "doctype": "DocField", + "width": "200px", + "parenttype": "DocType", + "permlevel": 0, + "parentfield": "fields" + }, + { + "name": "Workflow Document State", + "doctype": "DocType" + }, + { + "doctype": "DocField", + "label": "State", + "fieldname": "state", + "fieldtype": "Link", + "reqd": 1, + "options": "Workflow State" + }, + { + "doctype": "DocField", + "label": "Allow Edit", + "fieldname": "allow_edit", + "fieldtype": "Link", + "reqd": 0, + "options": "Role" + }, + { + "doctype": "DocField", + "label": "Doc Status", + "fieldname": "doc_status", + "fieldtype": "Select", + "options": "0\n1\n2" + }, + { + "doctype": "DocField", + "label": "Message", + "fieldname": "message", + "fieldtype": "Text", + "reqd": 0 + } +] \ No newline at end of file diff --git a/core/doctype/workflow_state/__init__.py b/core/doctype/workflow_state/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core/doctype/workflow_state/workflow_state.py b/core/doctype/workflow_state/workflow_state.py new file mode 100644 index 0000000000..e669908514 --- /dev/null +++ b/core/doctype/workflow_state/workflow_state.py @@ -0,0 +1,27 @@ +# Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com) +# +# MIT License (MIT) +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +from __future__ import unicode_literals +import webnotes + +class DocType: + def __init__(self, d, dl): + self.doc, self.doclist = d, dl \ No newline at end of file diff --git a/core/doctype/workflow_state/workflow_state.txt b/core/doctype/workflow_state/workflow_state.txt new file mode 100644 index 0000000000..ea2100eac5 --- /dev/null +++ b/core/doctype/workflow_state/workflow_state.txt @@ -0,0 +1,70 @@ +[ + { + "owner": "Administrator", + "docstatus": 0, + "creation": "2012-12-28 10:49:56", + "modified_by": "Administrator", + "modified": "2012-12-28 11:30:26" + }, + { + "autoname": "field:workflow_state_name", + "description": "Workflow state represents the current state of a document.", + "doctype": "DocType", + "module": "Core", + "document_type": "Master", + "name": "__common__" + }, + { + "name": "__common__", + "parent": "Workflow State", + "doctype": "DocField", + "parenttype": "DocType", + "permlevel": 0, + "parentfield": "fields" + }, + { + "parent": "Workflow State", + "read": 1, + "cancel": 1, + "name": "__common__", + "create": 1, + "doctype": "DocPerm", + "write": 1, + "parenttype": "DocType", + "role": "System Manager", + "permlevel": 0, + "parentfield": "permissions" + }, + { + "name": "Workflow State", + "doctype": "DocType" + }, + { + "doctype": "DocField", + "label": "Workflow State Name", + "fieldname": "workflow_state_name", + "fieldtype": "Data", + "reqd": 1 + }, + { + "description": "Icon will appear on the button", + "doctype": "DocField", + "label": "Icon", + "fieldname": "icon", + "fieldtype": "Select", + "reqd": 0, + "options": "\nglass\nmusic\nsearch\nenvelope\nheart\nstar\nstar-empty\nuser\nfilm\nth-large\nth\nth-list\nok\nremove\nzoom-in\nzoom-out\noff\nsignal\ncog\ntrash\nhome\nfile\ntime\nroad\ndownload-alt\ndownload\nupload\ninbox\nplay-circle\nrepeat\nrefresh\nlist-alt\nlock\nflag\nheadphones\nvolume-off\nvolume-down\nvolume-up\nqrcode\nbarcode\ntag\ntags\nbook\nbookmark\nprint\ncamera\nfont\nbold\nitalic\ntext-height\ntext-width\nalign-left\nalign-center\nalign-right\nalign-justify\nlist\nindent-left\nindent-right\nfacetime-video\npicture\npencil\nmap-marker\nadjust\ntint\nedit\nshare\ncheck\nmove\nstep-backward\nfast-backward\nbackward\nplay\npause\nstop\nforward\nfast-forward\nstep-forward\neject\nchevron-left\nchevron-right\nplus-sign\nminus-sign\nremove-sign\nok-sign\nquestion-sign\ninfo-sign\nscreenshot\nremove-circle\nok-circle\nban-circle\narrow-left\narrow-right\narrow-up\narrow-down\nshare-alt\nresize-full\nresize-small\nplus\nminus\nasterisk\nexclamation-sign\ngift\nleaf\nfire\neye-open\neye-close\nwarning-sign\nplane\ncalendar\nrandom\ncomment\nmagnet\nchevron-up\nchevron-down\nretweet\nshopping-cart\nfolder-close\nfolder-open\nresize-vertical\nresize-horizontal\nhdd\nbullhorn\nbell\ncertificate\nthumbs-up\nthumbs-down\nhand-right\nhand-left\nhand-up\nhand-down\ncircle-arrow-right\ncircle-arrow-left\ncircle-arrow-up\ncircle-arrow-down\nglobe\nwrench\ntasks\nfilter\nbriefcase\nfullscreen" + }, + { + "description": "Style represents the button color: Success - Green, Danger - Red, Inverse - Black, Primary - Dark Blue, Info - Light Blue, Warning - Orange", + "doctype": "DocField", + "label": "Style", + "fieldname": "style", + "fieldtype": "Select", + "reqd": 0, + "options": "\nPrimary\nInfo\nSuccess\nWarning\nDanger\nInverse" + }, + { + "doctype": "DocPerm" + } +] \ No newline at end of file diff --git a/core/doctype/workflow_transition/__init__.py b/core/doctype/workflow_transition/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/core/doctype/workflow_transition/workflow_transition.py b/core/doctype/workflow_transition/workflow_transition.py new file mode 100644 index 0000000000..e669908514 --- /dev/null +++ b/core/doctype/workflow_transition/workflow_transition.py @@ -0,0 +1,27 @@ +# Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com) +# +# MIT License (MIT) +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +from __future__ import unicode_literals +import webnotes + +class DocType: + def __init__(self, d, dl): + self.doc, self.doclist = d, dl \ No newline at end of file diff --git a/core/doctype/workflow_transition/workflow_transition.txt b/core/doctype/workflow_transition/workflow_transition.txt new file mode 100644 index 0000000000..ac710e1a24 --- /dev/null +++ b/core/doctype/workflow_transition/workflow_transition.txt @@ -0,0 +1,55 @@ +[ + { + "owner": "Administrator", + "docstatus": 0, + "creation": "2012-12-28 10:49:56", + "modified_by": "Administrator", + "modified": "2012-12-28 11:25:03" + }, + { + "istable": 1, + "description": "Defines actions on states and the next step and allowed roles.", + "doctype": "DocType", + "module": "Core", + "name": "__common__" + }, + { + "name": "__common__", + "parent": "Workflow Transition", + "doctype": "DocField", + "width": "200px", + "parenttype": "DocType", + "fieldtype": "Link", + "reqd": 1, + "permlevel": 0, + "parentfield": "fields" + }, + { + "name": "Workflow Transition", + "doctype": "DocType" + }, + { + "doctype": "DocField", + "label": "State", + "fieldname": "state", + "options": "Workflow State" + }, + { + "doctype": "DocField", + "label": "Action", + "fieldname": "action", + "options": "Workflow Action" + }, + { + "doctype": "DocField", + "label": "Next State", + "fieldname": "next_state", + "options": "Workflow State" + }, + { + "doctype": "DocField", + "label": "Allowed", + "fieldname": "allowed", + "options": "Role" + } +] \ No newline at end of file diff --git a/public/css/legacy/grid.css b/public/css/legacy/grid.css index f8d6aff522..0efb718280 100644 --- a/public/css/legacy/grid.css +++ b/public/css/legacy/grid.css @@ -109,7 +109,7 @@ div.grid_tbarlinks { border: 3px solid #abf; height:200px; width: 300px; - z-index: 10; + z-index: 1; position:absolute; } diff --git a/webnotes/client.py b/webnotes/client.py index 847d4f0646..f96ab0f854 100644 --- a/webnotes/client.py +++ b/webnotes/client.py @@ -37,13 +37,11 @@ def save(doclist): """insert or update from form query""" if isinstance(doclist, basestring): doclist = json.loads(doclist) - - from webnotes.model.wrapper import ModelWrapper - + if not webnotes.has_permission(doclist[0]["doctype"], "write"): webnotes.msgprint("No Write Permission", raise_exception=True) - doclistobj = ModelWrapper(doclist) + doclistobj = webnotes.model_wrapper(doclist) doclistobj.save() return [d.fields for d in doclist] diff --git a/webnotes/model/doctype.py b/webnotes/model/doctype.py index ae07959559..e8196a6db8 100644 --- a/webnotes/model/doctype.py +++ b/webnotes/model/doctype.py @@ -66,7 +66,7 @@ def get(doctype, processed=False, cached=True): add_print_formats(doclist) add_search_fields(doclist) add_linked_with(doclist) - #add_workflows(doclist) + add_workflows(doclist) #update_language(doclist) # add validators diff --git a/webnotes/model/workflow.py b/webnotes/model/workflow.py new file mode 100644 index 0000000000..4ca0ff22bd --- /dev/null +++ b/webnotes/model/workflow.py @@ -0,0 +1,49 @@ +# Copyright (c) 2012 Web Notes Technologies Pvt Ltd (http://erpnext.com) +# +# MIT License (MIT) +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF +# CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE +# OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# + +from __future__ import unicode_literals +import webnotes + +workflow_names = {} +def get_workflow_name(doctype): + global workflow_names + if not doctype in workflow_names: + workflow_name = webnotes.conn.get_value("Workflow", {"document_type": doctype, + "is_active": "1"}, "name") + + # no active? get default workflow + if not workflow_name: + workflow_name = webnotes.conn.get_value("Workflow", {"document_type": doctype, + "is_custom": "No"}, "name") + + workflow_names[doctype] = workflow_name + + return workflow_names[doctype] + +def get_default_state(doctype): + workflow_name = get_workflow_name(doctype) + return webnotes.conn.get_value("Workflow Document State", {"parent":doctype, + "idx":1}, "state") + +def get_state_fieldname(doctype): + workflow_name = get_workflow_name(doctype) + return webnotes.conn.get_value("Workflow", workflow_name, "workflow_state_field") diff --git a/webnotes/widgets/form/load.py b/webnotes/widgets/form/load.py index 3f1e270284..9a99d38ffc 100644 --- a/webnotes/widgets/form/load.py +++ b/webnotes/widgets/form/load.py @@ -87,6 +87,9 @@ def load_single_doc(dt, dn, user): if not dn: dn = dt + if not webnotes.conn.exists(dt, dn): + return None + try: dl = webnotes.model_wrapper(dt, dn).doclist except Exception, e: