From 292a9931f6e3ced624d964750f3e751fa3b86cf9 Mon Sep 17 00:00:00 2001 From: Bachurin Sergey Date: Tue, 8 Jul 2014 16:29:44 +0300 Subject: [PATCH] robokassa --- .../0010_auto__add_field_license_deleted.py | 181 ++++++++++++++++++ project/customer/models.py | 2 +- project/customer/urls.py | 3 + project/customer/views/license.py | 88 +++++++++ project/settings.py | 6 + .../templates/customer/profile/end_order.html | 22 +++ 6 files changed, 301 insertions(+), 1 deletion(-) create mode 100644 project/customer/migrations/0010_auto__add_field_license_deleted.py create mode 100755 project/templates/customer/profile/end_order.html diff --git a/project/customer/migrations/0010_auto__add_field_license_deleted.py b/project/customer/migrations/0010_auto__add_field_license_deleted.py new file mode 100644 index 0000000..7191044 --- /dev/null +++ b/project/customer/migrations/0010_auto__add_field_license_deleted.py @@ -0,0 +1,181 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding field 'License.deleted' + db.add_column(u'customer_license', 'deleted', + self.gf('django.db.models.fields.BooleanField')(default=False), + keep_default=False) + + + def backwards(self, orm): + # Deleting field 'License.deleted' + db.delete_column(u'customer_license', 'deleted') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'customer.bankaccount': { + 'Meta': {'ordering': "['-created_at']", 'object_name': 'BankAccount'}, + 'account': ('django.db.models.fields.CharField', [], {'max_length': '20'}), + 'address': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'bik': ('django.db.models.fields.CharField', [], {'max_length': '10'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_main': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'korr_account': ('django.db.models.fields.CharField', [], {'max_length': '20'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'bank_accounts'", 'to': u"orm['auth.User']"}) + }, + u'customer.client': { + 'Meta': {'ordering': "['name', '-created_at']", 'object_name': 'Client'}, + 'address': ('django.db.models.fields.CharField', [], {'max_length': '256'}), + 'bank_account': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20', 'blank': 'True'}), + 'bank_address': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'bank_bik': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '10', 'blank': 'True'}), + 'bank_korr_account': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20', 'blank': 'True'}), + 'bank_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'contact_email': ('django.db.models.fields.EmailField', [], {'default': "''", 'max_length': '50', 'blank': 'True'}), + 'contact_icq': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20', 'blank': 'True'}), + 'contact_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '50', 'blank': 'True'}), + 'contact_other': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'contact_phone': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '50', 'blank': 'True'}), + 'contact_skype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20', 'blank': 'True'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'inn': ('django.db.models.fields.CharField', [], {'max_length': '12'}), + 'kpp': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '9', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '256', 'db_index': 'True'}), + 'okpo': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '10', 'blank': 'True'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'clients'", 'to': u"orm['auth.User']"}) + }, + u'customer.license': { + 'Meta': {'object_name': 'License'}, + 'date_from': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'date_to': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'deleted': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'order_date': ('django.db.models.fields.DateField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'paid_date': ('django.db.models.fields.DateField', [], {'null': 'True'}), + 'pay_sum': ('django.db.models.fields.IntegerField', [], {}), + 'payform': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'status': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'term': ('django.db.models.fields.IntegerField', [], {}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'licenses'", 'to': u"orm['auth.User']"}) + }, + u'customer.licenseprice': { + 'Meta': {'object_name': 'LicensePrice'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'price': ('django.db.models.fields.IntegerField', [], {}), + 'term': ('django.db.models.fields.IntegerField', [], {}) + }, + u'customer.userprofile': { + 'Meta': {'object_name': 'UserProfile'}, + 'active': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'address': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256'}), + 'boss_midname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30'}), + 'boss_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30'}), + 'boss_sign': ('django.db.models.fields.files.ImageField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'boss_surname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30'}), + 'boss_title': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'confirmed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'default': "''", 'max_length': '75', 'blank': 'True'}), + 'fax': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20', 'blank': 'True'}), + 'fax_code': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '10', 'blank': 'True'}), + 'full_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'glavbuh_midname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30', 'blank': 'True'}), + 'glavbuh_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30', 'blank': 'True'}), + 'glavbuh_sign': ('django.db.models.fields.files.ImageField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'glavbuh_surname': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '30', 'blank': 'True'}), + 'inn': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '12'}), + 'ip_reg_date': ('django.db.models.fields.DateField', [], {'null': 'True', 'blank': 'True'}), + 'jur_address': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'kpp': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '9'}), + 'logo': ('django.db.models.fields.files.ImageField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'na_osnovanii': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256'}), + 'ogrn': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '15'}), + 'okpo': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '10', 'blank': 'True'}), + 'phone': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '20', 'blank': 'True'}), + 'phone_code': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '10', 'blank': 'True'}), + 'profile_type': ('django.db.models.fields.PositiveSmallIntegerField', [], {}), + 'real_address': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'site': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'stamp': ('django.db.models.fields.files.ImageField', [], {'default': "''", 'max_length': '100', 'blank': 'True'}), + 'svid_gos_reg': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '256', 'blank': 'True'}), + 'updated_at': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'profile'", 'unique': 'True', 'primary_key': 'True', 'to': u"orm['auth.User']"}) + }, + u'customer.userprofilefilters': { + 'Meta': {'object_name': 'UserProfileFilters'}, + 'bank_account': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'+'", 'null': 'True', 'blank': 'True', 'to': u"orm['customer.BankAccount']"}), + 'show_bank_account': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_contact_info': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_email': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_fax': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_full_name': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_glavbuh': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_inn': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_ip_boss_fio': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_ip_reg_date': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_jur_address': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_kpp': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_na_osnovanii': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_name': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_ogrn': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_okpo': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_org_boss_title_and_fio': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_phone': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_profile_type': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_real_address': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_site': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'show_svid_gos_reg': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'profile_filters'", 'unique': 'True', 'primary_key': 'True', 'to': u"orm['auth.User']"}) + } + } + + complete_apps = ['customer'] \ No newline at end of file diff --git a/project/customer/models.py b/project/customer/models.py index cc80dd2..6af77f3 100644 --- a/project/customer/models.py +++ b/project/customer/models.py @@ -358,7 +358,7 @@ class License(models.Model): order_date = models.DateField(verbose_name=u'дата заказа', auto_now_add=True) paid_date = models.DateField(verbose_name=u'дата оплаты', null=True) pay_sum= models.IntegerField(verbose_name=u'сумма оплаты') - #active = models.BooleanField(u'активный', default=False) + deleted = models.BooleanField(u'удалено', default=False) def __init__(self, *args, **kwargs): super(License, self).__init__(*args, **kwargs) diff --git a/project/customer/urls.py b/project/customer/urls.py index 6295b10..795318c 100644 --- a/project/customer/urls.py +++ b/project/customer/urls.py @@ -16,6 +16,9 @@ urlpatterns = patterns('', url(r'^profile/edit/$', profile.profile_edit, name='customer_profile_edit'), url(r'^profile/email/$', profile.profile_email, name='customer_profile_email'), url(r'^license/$', license.order_license, name='customer_order_license'), + url(r'^robokassa/result/$', license.payment_result, name='robokassa_result'), + url(r'^robokassa/success/$', license.payment_success, name='robokassa_success'), + url(r'^robokassa/fail/$', license.payment_fail, name='robokassa_fail'), url(r'^license_list/$', license.license_list, name='customer_license_list'), url(r'^paid_list/$', license.paid_list, name='customer_paid_list'), diff --git a/project/customer/views/license.py b/project/customer/views/license.py index 2556683..3433d19 100644 --- a/project/customer/views/license.py +++ b/project/customer/views/license.py @@ -1,6 +1,13 @@ # -*- coding: utf-8 -*- +import hashlib + from django.shortcuts import render, redirect +from django.http import Http404 +from django.conf import settings +from django.views.decorators.csrf import csrf_exempt +from django.utils.http import urlquote from django.contrib.auth.decorators import login_required +from django.template.response import TemplateResponse from django.core.urlresolvers import reverse from django.views.decorators.csrf import csrf_protect @@ -28,11 +35,27 @@ def order_license(request): pay_sum=form.cleaned_data['term'].price, ) new_license.save() + print form.cleaned_data['payform'] + if form.cleaned_data['payform'] == '1': + print 222222 + sMerchantLogin = settings.ROBOKASSA_LOGIN + nOutSum = form.cleaned_data['term'].price + nInvId = new_license.id + sInvDesc = u"Оплата лицензии Документор.ру" + sign_str = u"%s:%s:%s:%s" % (sMerchantLogin, nOutSum, nInvId, settings.ROBOKASSA_PASSWORD1) + sSignatureValue = hashlib.md5(sign_str).hexdigest() + print sign_str, sSignatureValue + sEmail = request.user.email + + robokassa = 'http://test.robokassa.ru/Index.aspx?MrchLogin=%s&OutSum=%s&InvId=%s&Desc=%s&SignatureValue=%s&Email=%s&Culture=ru&Encoding=utf-8' % (sMerchantLogin, nOutSum, nInvId, urlquote(sInvDesc), sSignatureValue, sEmail) + print robokassa + return redirect(robokassa) return redirect(reverse('customer_license_list')) return render(request, template_name, dictionary) +@login_required def license_list(request): """Список счетов на лицензии """ @@ -44,6 +67,7 @@ def license_list(request): return render(request, template_name, dictionary) +@login_required def paid_list(request): """Оплаченные лицензии """ @@ -53,3 +77,67 @@ def paid_list(request): 'licenses': licenses, } return render(request, template_name, dictionary) + + +@login_required +def delete_license(request, pk): + template_name = 'customer/profile/delete_license.html' + try: + license = License.objects.get(pk=pk) + except: + raise Http404 + dictionary = {'license': license} + return render(request, template_name, dictionary) + + +@csrf_exempt +def payment_result(request): + if request.method == 'POST': + try: + nInvId = request.POST.get('InvId') + + nOutSum = request.POST.get('OutSum') + sSignatureValue = request.POST.get('SignatureValue') + SignatureValue = hashlib.md5('%s:%s:%s' % (nOutSum, nInvId, settings.ROBOKASSA_PASSWORD2)).hexdigest() + if sSignatureValue.upper() == SignatureValue.upper(): + license = License.objects.get(pk=nInvId) + license.status = 1 + license.save() + return HttpResponse('OK%s' % nInvId) + else: + return HttpResponse('bad sign') + except License.DoesNotExist: + return HttpResponseForbidden() + else: + return HttpResponseForbidden() + + +@csrf_exempt +def payment_success(request): + if request.method == 'POST': + print request.POST + try: + nInvId = request.POST.get('InvId') + order = License.objects.get(pk=nInvId) + + context = {'success': True, 'order_num': nInvId} + return TemplateResponse(request, 'customer/profile/end_order.html', context) + except License.DoesNotExist: + return HttpResponseForbidden() + else: + return HttpResponseForbidden() + + +@csrf_exempt +def payment_fail(request): + if request.method == 'POST': + try: + nInvId = request.POST.get('InvId') + + message = u"Возникла проблема. Ваш Заказ не оплачен. Попробуйте оформить заявку снова, или позвоните по номеру." + + return TemplateResponse(request, 'customer/profile/end_order.html', {'message': message, 'success': False}) + except Order.DoesNotExist: + return HttpResponseForbidden() + else: + return HttpResponseForbidden() diff --git a/project/settings.py b/project/settings.py index e99aa54..4ec9d90 100644 --- a/project/settings.py +++ b/project/settings.py @@ -161,6 +161,7 @@ INSTALLED_APPS = ( 'mptt', # utilities for implementing a modified pre-order traversal tree 'menus', # helper for model independent hierarchical website navigation 'sekizai', # for javascript and css management + 'robokassa', 'djangocms_admin_style', # for the admin skin. You **must** add 'djangocms_admin_style' in the list before 'django.contrib.admin'. 'django.contrib.messages', # to enable messages framework (see :ref:`Enable messages `) @@ -235,6 +236,11 @@ BROKER_PASSWORD = "pass" BROKER_VHOST = "dok" CELERY_TIMEZONE = 'Europe/Moscow' +ROBOKASSA_LOGIN = 'test_shop123456' +ROBOKASSA_PASSWORD1 = 'password123456' +ROBOKASSA_PASSWORD2 = 'password987654' +ROBOKASSA_TEST_MODE = True + from datetime import timedelta CELERYBEAT_SCHEDULE = { diff --git a/project/templates/customer/profile/end_order.html b/project/templates/customer/profile/end_order.html new file mode 100755 index 0000000..9ce586c --- /dev/null +++ b/project/templates/customer/profile/end_order.html @@ -0,0 +1,22 @@ +{% extends "base.html" %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block right-column %}{% endblock %} +{% block content %} +
+ {% if success %} +

Спасибо!

+ Ваш заказ № {{ order_num }} принят!
+ Наш менеджер свяжется с Вами в ближайшее время.
+ {% else %} + {{ message }} + {% endif %} +
+{% endblock %} +