{ "info": { "author": "Kamil Kujawinski", "author_email": "kamil@kujawinski.net", "bugtrack_url": null, "classifiers": [ "Framework :: Django", "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", "Programming Language :: Python", "Programming Language :: Python :: 2.6", "Programming Language :: Python :: 2.7", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3.2", "Programming Language :: Python :: 3.3", "Programming Language :: Python :: 3.4" ], "description": "=================\r\nDjango OfferMaker\r\n=================\r\n\r\n``django-offermaker`` library is a solution for Django applications, which allows\r\nto create *multi variant offers* and use them on your site.\r\n\r\n*Multi variant offer* is a structure which defines dependencies between values for\r\ngiven set of fields.\r\n\r\nEg. for the fields **credit contribution** and **number of instalments** we\r\nhave the following dependencies:\r\n\r\n * for **0%** credit contribution, it is required to have maximum **12**\r\n instalments,\r\n * for **10%+** contribution, it is allowed to have **12-24** instalments,\r\n * and for **20%+** contribution, it is allowed to have **12-36** instalments.\r\n\r\nFunctions of ``django-offermaker``\r\n----------------------------------\r\n\r\n * Create and edit *multi variant offer* by using **Offermaker Admin Editor**.\r\n * Display *multi variant offer* in tabular way by using **Offermaker Template\r\n Tag**.\r\n * Display form which dynamically adjusts to user filled values based on\r\n *multi variant offer* by using **OfferMakerFormView Generic View**.\r\n * Make decision which variant of *multi variant offer* is suitable for\r\n given parameters by using **decide helper**.\r\n\r\n\r\nChangelog\r\n---------\r\n\r\n* 0.9.8\r\n\r\n * Selenium test for offermaker admin editor and offermaker form and bug fixes\r\n in supported Django and Python versions.\r\n\r\n* 0.9.7\r\n\r\n * Added Class Based View for offermaker form\r\n * Added decide() method\r\n\r\n* 0.9.5\r\n\r\n * Small bug fixes\r\n\r\n* 0.9.4\r\n\r\n * Django 1.7 support\r\n * Python 3 support\r\n\r\n\r\n\r\nSupport\r\n-------\r\n\r\n* Environments: Python 2.6, Python 2.7, Python 3.2, Python 3.3, Python 3.4, PyPy,\r\n* Django versions: Django 1.5, Django 1.6, Django 1.7 (Python 2.6 is not supported),\r\n\r\n\r\nDemo application\r\n----------------\r\n\r\n1. You can check it online http://offermaker.kjw.pt\r\n\r\n2. Or checkout and install locally::\r\n\r\n git clone git@github.com:kkujawinski/django-offermaker-demo.git\r\n\r\n\r\nQuick start\r\n-----------\r\n1. Install django-offermaker ::\r\n\r\n pip install django-offermaker\r\n\r\n2. Site configuration in settings.py ::\r\n\r\n INSTALLED_APPS = (\r\n ...\r\n 'offermaker',\r\n )\r\n\r\n3. Create Django form with needed fields::\r\n\r\n from django import forms\r\n\r\n class MyForm(forms.Form):\r\n product = forms.ChoiceField(\r\n label='Product',\r\n choices=(\r\n ('', '---'), ('PROD1', 'Product X'), ('PROD2', 'Product Y'), ('PROD3', 'Product Z'),\r\n ),\r\n required=False)\r\n crediting_period = forms.ChoiceField(\r\n label='Crediting period',\r\n choices=(('', '---'), ('12', '12'), ('24', '24'), ('36', '36'), ('48', '48')))\r\n interest_rate = forms.FloatField(label='Interest rate', min_value=1, max_value=5)\r\n contribution = forms.FloatField(label='Contribution', min_value=0)\r\n\r\n # # Uncomment for Django 1.5\r\n # def __init__(self, *args, **kwargs):\r\n # super(MyForm, self).__init__(*args, **kwargs)\r\n # self.fields['interest_rate'].widget.attrs['data-om-type'] = 'number'\r\n # self.fields['interest_rate'].widget.attrs['data-om-min'] = 1\r\n # self.fields['interest_rate'].widget.attrs['data-om-max'] = 5\r\n # self.fields['contribution'].widget.attrs['data-om-type'] = 'number'\r\n # self.fields['contribution'].widget.attrs['data-om-min'] = 0\r\n\r\n4. Define your offer (in case you do not store it in database)::\r\n\r\n offer = {\r\n 'params': {},\r\n 'variants': [[\r\n {\r\n 'params': {\r\n 'crediting_period': ['24'],\r\n 'product': ['PROD1']\r\n }\r\n }, {\r\n 'params': {\r\n 'crediting_period': ['12', '36', '48'],\r\n 'product': ['PROD2']\r\n }\r\n }, {\r\n 'params': {\r\n 'product': ['PROD3']\r\n }\r\n }\r\n ], [\r\n {\r\n 'params': {\r\n 'contribution': [[10, 20]],\r\n 'interest_rate': [[2, 2]],\r\n 'product': ['PROD1']\r\n }\r\n }, {\r\n 'params': {\r\n 'contribution': [[30, 40]],\r\n 'interest_rate': [[4, 4]],\r\n 'product': ['PROD1']\r\n }\r\n }, {\r\n 'params': {\r\n 'contribution': [[30, 70]],\r\n 'interest_rate': [[5, 5]],\r\n 'product': ['PROD2', 'PROD3']\r\n }\r\n }\r\n ]]\r\n }\r\n\r\n5. Offer form:\r\n\r\na) Use dispatcher code in Django view ::\r\n\r\n import offermaker\r\n\r\n class MyOfferFormView(offermaker.OfferMakerFormView):\r\n form_class = MyForm\r\n offermaker_offer = offer\r\n template_name = 'my_offer_form_view.html'\r\n\r\n my_offer_form_view = MyOfferFormView.as_view()\r\n\r\n\r\nb) Initialize offerform in template ::\r\n\r\n
\r\n {% load offermaker %}\r\n \r\n {% offermaker_javascript %}\r\n \r\n\r\n \r\n\r\n \r\n\r\n\r\n \r\n\r\n6. Offer preview with Offermaker Template Tag\r\n\r\na) Pass offer form object from view to template::\r\n\r\n class MyOfferPreviewView(TemplateView):\r\n template_name = 'offer_preview.html'\r\n\r\n def get_context_data(self):\r\n output = super(MyOfferPreviewView, self).get_context_data()\r\n output['offer'] = offermaker.OfferMakerCore(MyForm, offer)\r\n return output\r\n\r\n\r\nb) Use proper template tag in template to print table::\r\n\r\n {% load offermaker %}\r\n\r\n {% offermaker_preview offer %}\r\n\r\n\r\n7. Offermaker Admin Editor:\r\n\r\na) Use OfferJSONField field in your model. Remember to pass your django form created in 3.::\r\n\r\n import offermaker\r\n\r\n class MyOfferMakerField(offermaker.OfferJSONField):\r\n form_object = MyForm()\r\n\r\n class MyOffer(models.Model):\r\n id = models.AutoField(primary_key=True)\r\n name = models.CharField(max_length=30)\r\n offer = MyOfferMakerField()\r\n\r\nb) Create your own Admin Site for model::\r\n\r\n import models\r\n\r\n class OfferAdmin(admin.ModelAdmin):\r\n list_display = ('name',)\r\n search_fields = ('name', 'user')\r\n fields = ('name', 'offer')\r\n\r\n # # Uncomment for Django 1.5\r\n # class Media:\r\n # js = ('//code.jquery.com/jquery-1.11.0.min.js',)\r\n\r\n\r\n admin.site.register(models.Offer, OfferAdmin)\r\n\r\n7. Decide helper::\r\n\r\n core_object = offermaker.OfferMakerCore(MyForm, offer)\r\n\r\n result = core_object.decide({'crediting_period': 24})\r\n print(result['product'].items)\r\n # frozenset({'PROD1', 'PROD3'})\r\n print(result['interest_rate'].ranges)\r\n # frozenset({(4, 4), (5, 5), (2, 2)})\r\n print(result['contribution'].ranges)\r\n # frozenset({(10, 20), (30, 70)})\r\n\r\n result = core_object.decide({'crediting_period': 24, 'interest_rate': 2})\r\n print(result['product'].fixed)\r\n # PROD1\r\n\r\n\r\n\r\nBasic customization\r\n-------------------\r\n\r\n1. Using offers stored in database:\r\n\r\na) you need to pass proper offer object to Offermaker in form/preview view::\r\n\r\n offer = MyOffer.objects.filter(id=request.GET['id']).first()\r\n core_object = offermaker.OfferMakerCore(MyForm, offer.offer)\r\n\r\nb) and configure proper params to be used in ajax requests::\r\n\r\n $('#offer_form').offer_form({\r\n ajax_extra_params: function(params) {\r\n return { id: {{ request.GET.id }} };\r\n },\r\n });\r\n\r\n\r\n2. Substituting builtin formatters for infotip and error alerts::\r\n\r\n $('#offer_form').offer_form({\r\n error_alert_factory: function (msg) {\r\n var $error = $('' + msg + '
');\r\n $('.alert-placeholder', $form).append($error);\r\n return $error;\r\n },\r\n tooltip_factory: function ($field, msg) {\r\n var $tooltip = $('' + msg + '
');\r\n $field.parent().append($tooltip);\r\n return $tooltip;\r\n }\r\n });\r\n\r\n3. Use builtin formatters for Twitter Bootstap3::\r\n\r\n (function() {\r\n $('#offer_form').offer_form({\r\n bootstrap3: true,\r\n });\r\n })();\r\n\r\n4. Customizing messages::\r\n\r\n (function() {\r\n $('#offer_form').offer_form({\r\n msgs: {\r\n 'NO_VARIANTS': 'No matching variants',\r\n 'INFO_ITEMS': 'Available values are: %s.',\r\n 'INFO_FIXED': 'Only available value is %s.',\r\n 'RANGE_left': 'to %2$s',\r\n 'RANGE_right': 'from %1$s',\r\n 'RANGE_both': 'from %1$s to %2$s',\r\n 'AND': ' and '\r\n },\r\n iteration_str: function (items) {\r\n return items.slice(0, -2).concat(items.slice(-2).join(msgs.AND)).join(', ');\r\n }\r\n });\r\n })();\r\n\r\n5. Creating preview table for certain fields::\r\n\r\n {% offermaker_preview offer fields='product, crediting_period' %}\r\n\r\n\r\n6. Add html attributes to generated preview table::\r\n\r\n {% offermaker_preview offer class='table table-bordered' %}", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://offermaker.kjw.pt", "keywords": "", "license": "LGPL", "maintainer": "", "maintainer_email": "", "name": "django-offermaker", "package_url": "https://pypi.org/project/django-offermaker/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/django-offermaker/", "project_urls": { "Download": "UNKNOWN", "Homepage": "http://offermaker.kjw.pt" }, "release_url": "https://pypi.org/project/django-offermaker/0.9.8/", "requires_dist": null, "requires_python": null, "summary": "Django library to create dynamic forms with configurable variantable restrictions.", "version": "0.9.8" }, "last_serial": 1419417, "releases": { "0.9.0": [ { "comment_text": "", "digests": { "md5": "17a671827677700e0b3cfd20ce0b4d4f", "sha256": "c2677950def14d8ba7fe849b9031649cb3d03c9d1eea909b664877f9a06829ab" }, "downloads": -1, "filename": "django-offermaker-0.9.0.tar.gz", "has_sig": false, "md5_digest": "17a671827677700e0b3cfd20ce0b4d4f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 106698, "upload_time": "2014-02-09T21:43:38", "url": "https://files.pythonhosted.org/packages/a0/6e/e993b7ad36b46ab992de233abf11402d526ae480e3ef97ea9f9f9eb24d14/django-offermaker-0.9.0.tar.gz" } ], "0.9.1": [ { "comment_text": "", "digests": { "md5": "f9061b7b4232236ea662af7687f6881d", "sha256": "eee2322d2c602efe4c2426eaf2b440b7e2620253e1c01d8db16f59c7a168c97e" }, "downloads": -1, "filename": "django-offermaker-0.9.1.tar.gz", "has_sig": false, "md5_digest": "f9061b7b4232236ea662af7687f6881d", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 106927, "upload_time": "2014-02-10T22:14:34", "url": "https://files.pythonhosted.org/packages/3a/87/65640a9fa04f26bb2c81e782b2b0dc138b5ba7eec3cedc56019caabcb600/django-offermaker-0.9.1.tar.gz" } ], "0.9.2": [ { "comment_text": "", "digests": { "md5": "01beb00e28bc7ad07e523abafc916935", "sha256": "d8c42808e005ac147027019574e58fb9af01ab81ffb1e3c50e9f7fd3b80a0bdb" }, "downloads": -1, "filename": "django-offermaker-0.9.2.tar.gz", "has_sig": false, "md5_digest": "01beb00e28bc7ad07e523abafc916935", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 107875, "upload_time": "2014-09-08T20:59:55", "url": "https://files.pythonhosted.org/packages/59/be/6d6e6cea5062f0fcec7ff8468d297fcf326578f9a3a82541d06d17fc82eb/django-offermaker-0.9.2.tar.gz" } ], "0.9.3": [ { "comment_text": "", "digests": { "md5": "bda9d3eb6fa247edf8469be29d662a3c", "sha256": "f8306851305b24541486cc754da8d4d5dc23d7eb8ef74c5f7d4698b2918e45e6" }, "downloads": -1, "filename": "django-offermaker-0.9.3.tar.gz", "has_sig": false, "md5_digest": "bda9d3eb6fa247edf8469be29d662a3c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 108288, "upload_time": "2014-09-11T13:23:50", "url": "https://files.pythonhosted.org/packages/80/84/b0fa355ce632ee89aabcb44f22f10c0c0ed00c47fb99c6faeeecbbbf8843/django-offermaker-0.9.3.tar.gz" } ], "0.9.8": [ { "comment_text": "", "digests": { "md5": "575ed7618bfa45a87996cc5822059b19", "sha256": "9eafe05ba73323dd3fbcc284d5d28c188a6e4a2431f633815cac038b8af817c5" }, "downloads": -1, "filename": "django-offermaker-0.9.8.tar.gz", "has_sig": false, "md5_digest": "575ed7618bfa45a87996cc5822059b19", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 116176, "upload_time": "2015-02-08T20:52:56", "url": "https://files.pythonhosted.org/packages/a2/f8/68d1e7448177ec1dbb8d0299c987de77e11f1baebb6dc836921d2c214f54/django-offermaker-0.9.8.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "575ed7618bfa45a87996cc5822059b19", "sha256": "9eafe05ba73323dd3fbcc284d5d28c188a6e4a2431f633815cac038b8af817c5" }, "downloads": -1, "filename": "django-offermaker-0.9.8.tar.gz", "has_sig": false, "md5_digest": "575ed7618bfa45a87996cc5822059b19", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 116176, "upload_time": "2015-02-08T20:52:56", "url": "https://files.pythonhosted.org/packages/a2/f8/68d1e7448177ec1dbb8d0299c987de77e11f1baebb6dc836921d2c214f54/django-offermaker-0.9.8.tar.gz" } ] }