{ "info": { "author": "Camptocamp SA, Odoo Community Association (OCA)", "author_email": "support@odoo-community.org", "bugtrack_url": null, "classifiers": [ "Framework :: Odoo", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Programming Language :: Python :: 2.7" ], "description": ".. image:: https://img.shields.io/badge/licence-lgpl--3-blue.svg\n :target: http://www.gnu.org/licenses/LGPL-3.0-standalone.html\n :alt: License: LGPL-3\n\nCMS Form\n========\n\nBasic website contents form framework. Allows to define front-end forms for every models in a simple way.\n\nIf you are tired of re-defining every time an edit form or a search form for your odoo website,\nthis is the module you are looking for.\n\nFeatures\n========\n\n* automatic form generation (create, write, search)\n* automatic route generation (create, write, search)\n* automatic machinery based on fields' type:\n * widget rendering\n * field value load (from existing instance or from request)\n * field value extraction (from request)\n * field value write (to existing instance)\n\n* highly customizable\n* works with every odoo model\n* works also without any model\n* add handy attributes to models inheriting from ``website.published.mixin``:\n * ``cms_add_url``: lead to create form view. By default ``/cms/form/create/my.model``\n * ``cms_edit_url``: lead to edit form view. By default ``/cms/form/edit/my.model/model_id``\n * ``cms_search_url``: lead to search form view. By default ``/cms/form/search/my.model``\n\nUsage\n=====\n\nCreate / Edit form\n------------------\n\nJust inherit from ``cms.form`` to add a form for your model. Quick example for partner:\n\n.. code-block:: python\n\n class PartnerForm(models.AbstractModel):\n\n _name = 'cms.form.res.partner'\n _inherit = 'cms.form'\n _form_model = 'res.partner'\n _form_model_fields = ('name', 'country_id')\n _form_required_fields = ('name', 'country_id')\n\n\nIn this case you'll have form with the following characteristics:\n\n* works with ``res.partner`` model\n* have only ``name`` and ``country_id`` fields\n* both fields are required (is not possible to submit the form w/out one of those values)\n\nHere's the result:\n\n|preview_create|\n|preview_edit|\n\nThe form will be automatically available on these routes:\n\n* ``/cms/form/create/res.partner`` to create new partners\n* ``/cms/form/edit/res.partner/1`` edit existing partners (partner id=1 in this case)\n\nNOTE: default generic routes work if the form's name is ``cms.form.`` + model name, like ``cms.form.res.partner``.\nIf you want you can easily define your own controller and give your form a different name,\nand have more elegant routes like ```/partner/edit/partner-slug-1``.\nTake a look at `cms_form_example <../cms_form_example>`_.\n\nBy default, the form is rendered as an horizontal twitter bootstrap form, but you can provide your own templates of course.\nBy default, fields are ordered by their order in the model's schema. You can tweak it using ``_form_fields_order``.\n\n\nForm with extra control fields\n------------------------------\n\nImagine you want to notify the partner after its creation but only if you really need it.\n\nThe form above can be extended with extra fields that are not part of the ``_form_model`` schema:\n\n.. code-block:: python\n\n class PartnerForm(models.AbstractModel):\n\n _name = 'cms.form.res.partner'\n _inherit = 'cms.form'\n _form_model = 'res.partner'\n _form_model_fields = ('name', 'country_id', 'email')\n _form_required_fields = ('name', 'country_id', 'email')\n\n notify_partner = fields.Boolean()\n\n def form_after_create_or_update(self, values, extra_values):\n if extra_values.get('notify_partner'):\n # do what you want here...\n\n``notify_partner`` will be included into the form but it will be discarded on create and write.\nNevertheless you can use it as a control flag before and after the record has been created or updated\nusing the hook ``form_after_create_or_update``, as you see in this example.\n\n\nSearch form\n-----------\n\nJust inherit from ``cms.form.search`` to add a form for your model. Quick example for partner:\n\n.. code-block:: python\n\n class PartnerSearchForm(models.AbstractModel):\n \"\"\"Partner model search form.\"\"\"\n\n _name = 'cms.form.search.res.partner'\n _inherit = 'cms.form.search'\n _form_model = 'res.partner'\n _form_model_fields = ('name', 'country_id', )\n _form_fields_order = ('country_id', 'name', )\n\n\n|preview_search|\n\nThe form will be automatically available at: ``/cms/form/search/res.partner``.\n\nNOTE: default generic routes work if the form's name is ```cms.form.search`` + model name, like ``cms.form.search.res.partner``.\nIf you want you can easily define your own controller and give your form a different name,\nand have more elegant routes like ``/partners``.\nTake a look at `cms_form_example <../cms_form_example>`_.\n\n\nMaster / slave fields\n---------------------\n\nA typical use case nowadays: you want to show/hide fields based on other fields' values.\nFor the simplest cases you don't have to write a single line of JS. You can do it like this:\n\n.. code-block:: python\n\n class PartnerForm(models.AbstractModel):\n\n _name = 'cms.form.res.partner'\n _inherit = 'cms.form'\n _form_model = 'res.partner'\n _form_model_fields = ('name', 'type', 'foo')\n\n def _form_master_slave_info(self):\n info = self._super._form_master_slave_info()\n info.update({\n # master field\n 'type':{\n # actions\n 'hide': {\n # slave field: action values\n 'foo': ('contact', ),\n },\n 'show': {\n 'foo': ('address', 'invoice', ),\n }\n },\n })\n return info\n\nHere we declared that:\n\n* when `type` field is equal to `contact` -> hide `foo` field\n* when `type` field is equal to `address` or `invoice` -> show `foo` field\n\n\nKnown issues / Roadmap\n======================\n\n* add more tests, especially per each widget and type of field\n* provide better widgets for image and file fields in general\n* o2m fields: to be tested at all\n* move widgets to abstract models too\n* search form: generate default search domain in a clever way\n* add easy way to switch from horizontal to vertical form\n* provide more examples\n* x2x fields: allow sub-items creation\n* handle api onchanges\n* support python expressions into master/slave rules\n\n\nBug Tracker\n===========\n\nBugs are tracked on `GitHub Issues\n`_. In case of trouble, please\ncheck there if your issue has already been reported. If you spotted it first,\nhelp us smashing it by providing a detailed and welcomed feedback.\n\nCredits\n=======\n\nSponsor\n-------\n\n* `Fluxdock.io `_.\n\nContributors\n------------\n\n* Simone Orsi \n\nMaintainer\n----------\n\n.. image:: https://odoo-community.org/logo.png\n :alt: Odoo Community Association\n :target: https://odoo-community.org\n\nThis module is maintained by the OCA.\n\nOCA, or the Odoo Community Association, is a nonprofit organization whose\nmission is to support the collaborative development of Odoo features and\npromote its widespread use.\n\nTo contribute to this module, please visit https://odoo-community.org.\n\n.. |preview_create| image:: ./images/cms_form_example_create_partner.png\n.. |preview_edit| image:: ./images/cms_form_example_edit_partner.png\n.. |preview_search| image:: ./images/cms_form_example_search.png", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "LGPL-3", "maintainer": "", "maintainer_email": "", "name": "odoo9-addon-cms-form", "package_url": "https://pypi.org/project/odoo9-addon-cms-form/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/odoo9-addon-cms-form/", "project_urls": null, "release_url": "https://pypi.org/project/odoo9-addon-cms-form/9.0.1.0.0/", "requires_dist": [ "odoo (<9.1a,>=9.0a)", "odoo9-addon-cms-status-message" ], "requires_python": "", "summary": "Basic content type form", "version": "9.0.1.0.0" }, "last_serial": 3499736, "releases": { "9.0.1.0.0": [ { "comment_text": "", "digests": { "md5": "fb9111e8f558f5b2747af62d3be5c5f6", "sha256": "fd06c7730486cacef276ee8b11a9e58c2ce83478903c9e10c5a5f2291614eb67" }, "downloads": -1, "filename": "odoo9_addon_cms_form-9.0.1.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "fb9111e8f558f5b2747af62d3be5c5f6", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 91927, "upload_time": "2017-05-30T04:33:12", "url": "https://files.pythonhosted.org/packages/a2/50/c957d071c50557f43d7a9e40aa30aff9eb3f47cc8d7bbf5802519b87f7b0/odoo9_addon_cms_form-9.0.1.0.0-py2-none-any.whl" } ], "9.0.1.0.0.99.dev1": [ { "comment_text": "", "digests": { "md5": "8398211c9f1d57a9961670a38a691a85", "sha256": "fcd6dcc3e50b9b51ee86a58eec63e5312f603c532946bfe49e9b230e0d7c1f9d" }, "downloads": -1, "filename": "odoo9_addon_cms_form-9.0.1.0.0.99.dev1-py2-none-any.whl", "has_sig": false, "md5_digest": "8398211c9f1d57a9961670a38a691a85", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 92463, "upload_time": "2017-06-04T04:36:35", "url": "https://files.pythonhosted.org/packages/42/38/01c2a0e282fd7fe2892de746e4672affd5e5f3a1cee0456625c029297123/odoo9_addon_cms_form-9.0.1.0.0.99.dev1-py2-none-any.whl" } ], "9.0.1.0.0.99.dev2": [ { "comment_text": "", "digests": { "md5": "604c1ca7c72c20fc4c83875af1a3d6c0", "sha256": "513873e0ce63219b8cc1b64ca16b8f098d7798c1e650e69b524ccddc0286aed0" }, "downloads": -1, "filename": "odoo9_addon_cms_form-9.0.1.0.0.99.dev2-py2-none-any.whl", "has_sig": false, "md5_digest": "604c1ca7c72c20fc4c83875af1a3d6c0", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 94169, "upload_time": "2017-08-06T04:32:11", "url": "https://files.pythonhosted.org/packages/32/9a/f112704d6d8c9ba1a597f309e5e463064ec668d72de2afb4f7f11dc81676/odoo9_addon_cms_form-9.0.1.0.0.99.dev2-py2-none-any.whl" } ], "9.0.1.0.0.99.dev4": [ { "comment_text": "", "digests": { "md5": "85e8fe6779addb06114c404fa8373f75", "sha256": "aff8b4249fb2585cc5129d1f860798b06d8d61c657cfe34485221c783b5e8d01" }, "downloads": -1, "filename": "odoo9_addon_cms_form-9.0.1.0.0.99.dev4-py2-none-any.whl", "has_sig": false, "md5_digest": "85e8fe6779addb06114c404fa8373f75", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 94142, "upload_time": "2017-10-04T04:31:10", "url": "https://files.pythonhosted.org/packages/22/06/294de7646be22846ec179bfaf074a779f93a90161548c736210ce0bf5d32/odoo9_addon_cms_form-9.0.1.0.0.99.dev4-py2-none-any.whl" } ], "9.0.1.0.0.99.dev5": [ { "comment_text": "", "digests": { "md5": "2d047916a0c89cd650607d53a479fdc4", "sha256": "c885b781f5dd2e21358b4058d2419c741062c4cf648c0a038e4882751f77aae9" }, "downloads": -1, "filename": "odoo9_addon_cms_form-9.0.1.0.0.99.dev5-py2-none-any.whl", "has_sig": false, "md5_digest": "2d047916a0c89cd650607d53a479fdc4", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": "~=2.7", "size": 96114, "upload_time": "2018-01-18T05:33:30", "url": "https://files.pythonhosted.org/packages/d4/b6/b64176a63a8dd09fd62c9ff1455d420ca3e7766c9c5364b35079c8c92f0b/odoo9_addon_cms_form-9.0.1.0.0.99.dev5-py2-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "fb9111e8f558f5b2747af62d3be5c5f6", "sha256": "fd06c7730486cacef276ee8b11a9e58c2ce83478903c9e10c5a5f2291614eb67" }, "downloads": -1, "filename": "odoo9_addon_cms_form-9.0.1.0.0-py2-none-any.whl", "has_sig": false, "md5_digest": "fb9111e8f558f5b2747af62d3be5c5f6", "packagetype": "bdist_wheel", "python_version": "py2", "requires_python": null, "size": 91927, "upload_time": "2017-05-30T04:33:12", "url": "https://files.pythonhosted.org/packages/a2/50/c957d071c50557f43d7a9e40aa30aff9eb3f47cc8d7bbf5802519b87f7b0/odoo9_addon_cms_form-9.0.1.0.0-py2-none-any.whl" } ] }