{ "info": { "author": "Mikhail Korobov", "author_email": "kmike84@gmail.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Environment :: Web Environment", "Framework :: Django", "Intended Audience :: Developers", "License :: OSI Approved :: MIT License", "Natural Language :: Russian", "Programming Language :: Python", "Topic :: Software Development :: Libraries :: Python Modules" ], "description": "=========================\ndjango-vkontakte-merchant\n=========================\n\ndjango-vkontakte-merchant - \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0442\u0435\u0436\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n\u0412\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u0435 (Merchant API) \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043d\u0430 Django.\n\n\u0414\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439\n\u043f\u043e Merchant API (http://vkontakte.ru/developers.php?id=-1_12904887&s=1).\n\n\n\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n=========\n\n::\n\n $ pip install -U django-vkontakte-merchant vkontakte\n\n\u041f\u043e\u0442\u043e\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c 'merchant_api' \u0432 INSTALLED_APPS \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c ::\n\n $ python manage.py syncdb\n\n\u0438\u043b\u0438, \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f South, ::\n\n $ python manage.py migrate\n\n\n\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\n=========\n\n\u0412 settings.py \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438:\n\n* MERCHANT_API_SHOP_ID - id \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\n* MERCHANT_API_SHOP_SECRET_KEY - \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\n* MERCHANT_API_ORDER_FORMS - (\u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e) \u043c\u043e\u0434\u0443\u043b\u044c \u0441 \u0444\u043e\u0440\u043c\u043e\u0439 \u0434\u043b\u044f\n \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043a\u0430\u0437\u0430\n\n\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\n=============\n\n\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043b\u043e\u0433\u0438\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043a\u0430\u0437\u0430\n---------------------------------\n\ndjango-vkontakte-merchant \u043d\u0435 \u0431\u0435\u0440\u0435\u0442 \u043d\u0430 \u0441\u0435\u0431\u044f \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u0437\u0430 \u043b\u043e\u0433\u0438\u043a\u0443\n\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043a\u0430\u0437\u0430, \u0442.\u043a. \u044d\u0442\u0430 \u043b\u043e\u0433\u0438\u043a\u0430 \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0441\u0430\u0439\u0442\u0430 \u043a \u0441\u0430\u0439\u0442\u0443.\n\u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0432 \u0441\u0432\u043e\u044e \u0444\u043e\u0440\u043c\u0443\n\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 (\u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0432 \u0435\u0435 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430\n\u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u043f\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445).\n\n\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043b\u043e\u0433\u0438\u043a\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043c\u043e\u0434\u0443\u043b\u044c \u0441\n\u0444\u043e\u0440\u043c\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0437\u0430\u043a\u0430\u0437\u0430 \u0432 settings.py::\n\n # settings.py\n MERCHANT_API_ORDER_FORMS = 'orders.forms'\n\n\u0412 \u043c\u043e\u0434\u0443\u043b\u0435 orders.forms \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u0444\u043e\u0440\u043c\u0430 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c OrderForm. \u0415\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\n\u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c \u043e\u0442 merchant_api.forms.OrderForm. \u041f\u0440\u0438\u043c\u0435\u0440::\n\n # coding: utf-8\n # my_project/orders/forms.py\n\n from django import forms\n from merchant_api.forms import OrderForm as MerchantOrderForm\n from goods.models import Product, Purchase\n\n class OrderForm(MerchantOrderForm):\n\n def clean_currency(self):\n # \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u0430\u0433\u0430\u0437\u0438\u043d \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0443\u0431\u043b\u0438\n currency = self.cleaned_data['currency']\n if currency != '643':\n raise forms.ValidationError('Currencies other than RUR are not supported')\n return currency\n\n def clean_notification_type(self):\n # \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u0430\u0433\u0430\u0437\u0438\u043d, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\n # \u0442\u0438\u043f\u0430 \"\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u0437\u0430\u043a\u0430\u0437\u0430\"\n tp = self.cleaned_data['notification_type']\n if not tp.startswith('order-state-change'):\n raise forms.ValidationError('This notification type is not supported.')\n return tp\n\n def clean_item(self, item):\n # \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u043c\u0435\u0442\u043e\u0434, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u0437\u0430\u043a\u0430\u0437\u0430\u043d\u044b\n # \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u043e \u043d\u0443\u0436\u043d\u043e\u0439 \u0446\u0435\u043d\u0435\n try:\n product = Product.objects.get(pk = item['item_id'])\n if product.price != int(item['price']):\n raise forms.ValidationError(\"Price is invalid\", 22)\n if not product.have_enough(int(item['quantity'])):\n raise forms.ValidationError(\"Can't buy so many\", 24)\n except Product.DoesNotExist:\n raise forms.ValidationError(\"Invalid product id.\")\n\n def save(self, *args, **kwargs):\n # \u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0434\u043e\u043f. \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0437\u0430\u043a\u0430\u0437\u0430\n vk_order = super(OrderForm, self).save(*args, **kwargs)\n for item in vk_order.items.all():\n for x in range(0, item.quantity):\n Purchase.objects.create(\n product_id = item.item_id,\n order = vk_order,\n user = vk_order.django_user\n )\n return vk_order\n\n\nurls.py\n-------\n\n\u0414\u043b\u044f \u043f\u0440\u0438\u0435\u043c\u0430 \u043f\u043b\u0430\u0442\u0435\u0436\u0435\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c merchant_api.urls::\n\n urlpatterns = patterns('',\n #...\n url(r'^merchant/', include('merchant_api.urls')),\n #...\n )\n\n\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0430\u0434\u0440\u0435\u0441 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0433\u043e \u0432\u044b\u0437\u043e\u0432\u0430 \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\n(``http://<\u0434\u043e\u043c\u0435\u043d>/merchant/callback`` \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435).\n\n\n\u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c\n----------------\n\n\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0432 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439\n\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e Merchant API\n( http://vkontakte.ru/developers.php?id=-1_12904887&s=1 )", "description_content_type": null, "docs_url": null, "download_url": "http://bitbucket.org/kmike/django-vkontakte-merchant/get/tip.gz", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "http://bitbucket.org/kmike/django-vkontakte-merchant/", "keywords": null, "license": "MIT license", "maintainer": null, "maintainer_email": null, "name": "django-vkontakte-merchant", "package_url": "https://pypi.org/project/django-vkontakte-merchant/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/django-vkontakte-merchant/", "project_urls": { "Download": "http://bitbucket.org/kmike/django-vkontakte-merchant/get/tip.gz", "Homepage": "http://bitbucket.org/kmike/django-vkontakte-merchant/" }, "release_url": "https://pypi.org/project/django-vkontakte-merchant/0.1/", "requires_dist": null, "requires_python": null, "summary": "Vkontakte Merchant API django app", "version": "0.1" }, "last_serial": 654611, "releases": { "0.1": [ { "comment_text": "", "digests": { "md5": "00acfd77b5b1bf6a25149bfcfcd51ab9", "sha256": "02f1045ce00d955a6f01c0fa3fde1163d32dba8b082db70b61c30602eec2f7f1" }, "downloads": -1, "filename": "django-vkontakte-merchant-0.1.tar.gz", "has_sig": false, "md5_digest": "00acfd77b5b1bf6a25149bfcfcd51ab9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13117, "upload_time": "2010-10-31T00:11:21", "url": "https://files.pythonhosted.org/packages/a0/b6/f571b88eae9cccdcc7f11de5ae4e141bbcc4004da6ede40f2a06e26284ee/django-vkontakte-merchant-0.1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "00acfd77b5b1bf6a25149bfcfcd51ab9", "sha256": "02f1045ce00d955a6f01c0fa3fde1163d32dba8b082db70b61c30602eec2f7f1" }, "downloads": -1, "filename": "django-vkontakte-merchant-0.1.tar.gz", "has_sig": false, "md5_digest": "00acfd77b5b1bf6a25149bfcfcd51ab9", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 13117, "upload_time": "2010-10-31T00:11:21", "url": "https://files.pythonhosted.org/packages/a0/b6/f571b88eae9cccdcc7f11de5ae4e141bbcc4004da6ede40f2a06e26284ee/django-vkontakte-merchant-0.1.tar.gz" } ] }