/** @todo this method implementation is not generic enough and not extendible by subclasses. */ PyObject* ResourceSkill::create(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { try { // Pick up the skill PyObject* skill = PyDict_GetItemString(kwds,"skill"); if (!PyObject_TypeCheck(skill, Skill::metadata->pythonClass)) throw DataException("resourceskill skill must be of type skill"); // Pick up the resource PyObject* res = PyDict_GetItemString(kwds,"resource"); if (!PyObject_TypeCheck(res, Resource::metadata->pythonClass)) throw DataException("resourceskill resource must be of type resource"); // Pick up the priority PyObject* q1 = PyDict_GetItemString(kwds,"priority"); int q2 = q1 ? PythonObject(q1).getInt() : 1; // Pick up the effective dates DateRange eff; PyObject* eff_start = PyDict_GetItemString(kwds,"effective_start"); if (eff_start) { PythonObject d(eff_start); eff.setStart(d.getDate()); } PyObject* eff_end = PyDict_GetItemString(kwds,"effective_end"); if (eff_end) { PythonObject d(eff_end); eff.setEnd(d.getDate()); } // Create the load ResourceSkill *l = new ResourceSkill( static_cast<Skill*>(skill), static_cast<Resource*>(res), q2, eff ); // Return the object Py_INCREF(l); return static_cast<PyObject*>(l); } catch (...) { PythonType::evalException(); return NULL; } }
PyObject* Flow::create(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { try { // Pick up the operation PyObject* oper = PyDict_GetItemString(kwds, "operation"); if (!oper) throw DataException("missing operation on Flow"); if (!PyObject_TypeCheck(oper, Operation::metadata->pythonClass)) throw DataException("flow operation must be of type operation"); else if (!static_cast<Operation*>(oper)->getLocation()) throw DataException("operation location is unspecified"); // Pick up the item PyObject* item = PyDict_GetItemString(kwds, "item"); if (!item) throw DataException("missing item on Flow"); if (!PyObject_TypeCheck(item, Item::metadata->pythonClass)) throw DataException("flow item must be of type item"); // Pick up the quantity PyObject* q1 = PyDict_GetItemString(kwds, "quantity"); double q2 = q1 ? PythonData(q1).getDouble() : 1.0; // Pick up the effectivity dates DateRange eff; PyObject* eff_start = PyDict_GetItemString(kwds, "effective_start"); if (eff_start) { PythonData d(eff_start); eff.setStart(d.getDate()); } PyObject* eff_end = PyDict_GetItemString(kwds, "effective_end"); if (eff_end) { PythonData d(eff_end); eff.setEnd(d.getDate()); } // Find or create a buffer for the item at the operation location Buffer* buf = Buffer::findOrCreate( static_cast<Item*>(item), static_cast<Operation*>(oper)->getLocation() ); // Pick up the type and create the flow Flow *l; PyObject* t = PyDict_GetItemString(kwds, "type"); if (t) { PythonData d(t); if (d.getString() == "flow_end") l = new FlowEnd( static_cast<Operation*>(oper), static_cast<Buffer*>(buf), q2 ); else if (d.getString() == "flow_transfer_batch") l = new FlowTransferBatch( static_cast<Operation*>(oper), static_cast<Buffer*>(buf), q2 ); else l = new FlowStart( static_cast<Operation*>(oper), static_cast<Buffer*>(buf), q2 ); } else l = new FlowStart( static_cast<Operation*>(oper), static_cast<Buffer*>(buf), q2 ); // Iterate over extra keywords, and set attributes. @todo move this responsibility to the readers... if (l) { l->setEffective(eff); PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(kwds, &pos, &key, &value)) { PythonData field(value); PyObject* key_utf8 = PyUnicode_AsUTF8String(key); DataKeyword attr(PyBytes_AsString(key_utf8)); Py_DECREF(key_utf8); if (!attr.isA(Tags::effective_end) && !attr.isA(Tags::effective_start) && !attr.isA(Tags::operation) && !attr.isA(Tags::buffer) && !attr.isA(Tags::quantity) && !attr.isA(Tags::type) && !attr.isA(Tags::action)) { const MetaFieldBase* fmeta = l->getType().findField(attr.getHash()); if (!fmeta && l->getType().category) fmeta = l->getType().category->findField(attr.getHash()); if (fmeta) // Update the attribute fmeta->setField(l, field); else l->setProperty(attr.getName(), value); } }; } // Return the object Py_INCREF(l); return static_cast<PyObject*>(l); } catch (...) { PythonType::evalException(); return nullptr; } }
PyObject* Load::create(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { try { // Pick up the operation PyObject* oper = PyDict_GetItemString(kwds,"operation"); if (!oper) throw DataException("missing operation on Load"); if (!PyObject_TypeCheck(oper, Operation::metadata->pythonClass)) throw DataException("load operation must be of type operation"); // Pick up the resource PyObject* res = PyDict_GetItemString(kwds,"resource"); if (!res) throw DataException("missing resource on Load"); if (!PyObject_TypeCheck(res, Resource::metadata->pythonClass)) throw DataException("load resource must be of type resource"); // Pick up the quantity PyObject* q1 = PyDict_GetItemString(kwds,"quantity"); double q2 = q1 ? PythonData(q1).getDouble() : 1.0; // Pick up the effective dates DateRange eff; PyObject* eff_start = PyDict_GetItemString(kwds,"effective_start"); if (eff_start) { PythonData d(eff_start); eff.setStart(d.getDate()); } PyObject* eff_end = PyDict_GetItemString(kwds,"effective_end"); if (eff_end) { PythonData d(eff_end); eff.setEnd(d.getDate()); } // Create the load Load *l = new LoadDefault( static_cast<Operation*>(oper), static_cast<Resource*>(res), q2, eff ); // Iterate over extra keywords, and set attributes. @todo move this responsibility to the readers... if (l) { PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(kwds, &pos, &key, &value)) { PythonData field(value); PyObject* key_utf8 = PyUnicode_AsUTF8String(key); DataKeyword attr(PyBytes_AsString(key_utf8)); Py_DECREF(key_utf8); if (!attr.isA(Tags::effective_end) && !attr.isA(Tags::effective_start) && !attr.isA(Tags::operation) && !attr.isA(Tags::resource) && !attr.isA(Tags::quantity) && !attr.isA(Tags::type) && !attr.isA(Tags::action)) { const MetaFieldBase* fmeta = l->getType().findField(attr.getHash()); if (!fmeta && l->getType().category) fmeta = l->getType().category->findField(attr.getHash()); if (fmeta) // Update the attribute fmeta->setField(l, field); else l->setProperty(attr.getName(), value);; } }; } // Return the object Py_INCREF(l); return static_cast<PyObject*>(l); } catch (...) { PythonType::evalException(); return NULL; } }
PyObject* ItemSupplier::create(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { try { // Pick up the supplier PyObject* sup = PyDict_GetItemString(kwds,"supplier"); if (!sup) throw DataException("missing supplier on ItemSupplier"); if (!PyObject_TypeCheck(sup, Supplier::metadata->pythonClass)) throw DataException("ItemSupplier supplier must be of type supplier"); // Pick up the item PyObject* it = PyDict_GetItemString(kwds,"item"); if (!it) throw DataException("missing item on ItemSupplier"); if (!PyObject_TypeCheck(it, Item::metadata->pythonClass)) throw DataException("ItemSupplier item must be of type item"); // Pick up the priority PyObject* q1 = PyDict_GetItemString(kwds,"priority"); int q2 = q1 ? PythonData(q1).getInt() : 1; // Pick up the effective dates DateRange eff; PyObject* eff_start = PyDict_GetItemString(kwds,"effective_start"); if (eff_start) { PythonData d(eff_start); eff.setStart(d.getDate()); } PyObject* eff_end = PyDict_GetItemString(kwds,"effective_end"); if (eff_end) { PythonData d(eff_end); eff.setEnd(d.getDate()); } // Create the ItemSupplier ItemSupplier *l = new ItemSupplier( static_cast<Supplier*>(sup), static_cast<Item*>(it), q2, eff ); // Iterate over extra keywords, and set attributes. @todo move this responsibility to the readers... if (l) { PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(kwds, &pos, &key, &value)) { PythonData field(value); PyObject* key_utf8 = PyUnicode_AsUTF8String(key); DataKeyword attr(PyBytes_AsString(key_utf8)); Py_DECREF(key_utf8); if (!attr.isA(Tags::effective_end) && !attr.isA(Tags::effective_start) && !attr.isA(Tags::supplier) && !attr.isA(Tags::item) && !attr.isA(Tags::type) && !attr.isA(Tags::priority) && !attr.isA(Tags::action)) { const MetaFieldBase* fmeta = l->getType().findField(attr.getHash()); if (!fmeta && l->getType().category) fmeta = l->getType().category->findField(attr.getHash()); if (fmeta) // Update the attribute fmeta->setField(l, field); else l->setProperty(attr.getName(), value); } }; } // Return the object Py_INCREF(l); return static_cast<PyObject*>(l); } catch (...) { PythonType::evalException(); return nullptr; } }
PyObject* Flow::create(PyTypeObject* pytype, PyObject* args, PyObject* kwds) { try { // Pick up the operation PyObject* oper = PyDict_GetItemString(kwds, "operation"); if (!oper) throw DataException("missing operation on Flow"); if (!PyObject_TypeCheck(oper, Operation::metadata->pythonClass)) throw DataException("flow operation must be of type operation"); // Pick up the buffer PyObject* buf = PyDict_GetItemString(kwds, "buffer"); if (!buf) throw DataException("missing buffer on Flow"); if (!PyObject_TypeCheck(buf, Buffer::metadata->pythonClass)) throw DataException("flow buffer must be of type buffer"); // Pick up the quantity PyObject* q1 = PyDict_GetItemString(kwds, "quantity"); double q2 = q1 ? PythonData(q1).getDouble() : 1.0; // Pick up the effectivity dates DateRange eff; PyObject* eff_start = PyDict_GetItemString(kwds, "effective_start"); if (eff_start) { PythonData d(eff_start); eff.setStart(d.getDate()); } PyObject* eff_end = PyDict_GetItemString(kwds, "effective_end"); if (eff_end) { PythonData d(eff_end); eff.setEnd(d.getDate()); } // Pick up the type and create the flow Flow *l; PyObject* t = PyDict_GetItemString(kwds, "type"); if (t) { PythonData d(t); if (d.getString() == "flow_end") l = new FlowEnd( static_cast<Operation*>(oper), static_cast<Buffer*>(buf), q2 ); else if (d.getString() == "flow_fixed_end") l = new FlowFixedEnd( static_cast<Operation*>(oper), static_cast<Buffer*>(buf), q2 ); else if (d.getString() == "flow_fixed_start") l = new FlowFixedStart( static_cast<Operation*>(oper), static_cast<Buffer*>(buf), q2 ); else l = new FlowStart( static_cast<Operation*>(oper), static_cast<Buffer*>(buf), q2 ); } else l = new FlowStart( static_cast<Operation*>(oper), static_cast<Buffer*>(buf), q2 ); // Iterate over extra keywords, and set attributes. @todo move this responsibility to the readers... if (l) { l->setEffective(eff); PyObject *key, *value; Py_ssize_t pos = 0; while (PyDict_Next(kwds, &pos, &key, &value)) { PythonData field(value); PyObject* key_utf8 = PyUnicode_AsUTF8String(key); DataKeyword attr(PyBytes_AsString(key_utf8)); Py_DECREF(key_utf8); if (!attr.isA(Tags::effective_end) && !attr.isA(Tags::effective_start) && !attr.isA(Tags::operation) && !attr.isA(Tags::buffer) && !attr.isA(Tags::quantity) && !attr.isA(Tags::type) && !attr.isA(Tags::action)) { const MetaFieldBase* fmeta = l->getType().findField(attr.getHash()); if (!fmeta && l->getType().category) fmeta = l->getType().category->findField(attr.getHash()); if (fmeta) // Update the attribute fmeta->setField(l, field); else PyErr_Format(PyExc_AttributeError, "attribute '%S' on '%s' can't be updated", key, Py_TYPE(l)->tp_name); } }; } // Return the object Py_INCREF(l); return static_cast<PyObject*>(l); } catch (...) { PythonType::evalException(); return NULL; } }