Merge branch 'master' of github.com:Gluejar/regluit into tastypie2
commit
0ffa43b870
|
@ -4,3 +4,4 @@
|
|||
settings/me.*
|
||||
*.dot
|
||||
reports
|
||||
ENV
|
||||
|
|
43
README.md
43
README.md
|
@ -16,7 +16,7 @@ Here are some instructions for setting up regluit for development on
|
|||
an Ubuntu system. If you are on OS X see notes below
|
||||
to install python-setuptools in step 1:
|
||||
|
||||
1. `aptitude install python-setuptools`
|
||||
1. `aptitude install python-setuptools git`
|
||||
1. `sudo easy_install virtualenv virtualenvwrapper`
|
||||
1. `git clone git@github.com:Gluejar/regluit.git`
|
||||
1. `cd regluit`
|
||||
|
@ -32,9 +32,44 @@ to install python-setuptools in step 1:
|
|||
1. `django-admin.py runserver 0.0.0.0:8000` (you can change the port number from the default value of 8000)
|
||||
1. point your browser at http://localhost:8000/
|
||||
|
||||
OS X
|
||||
-------
|
||||
You should have XCode installed
|
||||
Production Deployment
|
||||
---------------------
|
||||
|
||||
Below are the steps for getting regluit running on EC2 with Apache and mod_wsgi, and talking to an Amazon Relational Data Store instance.
|
||||
|
||||
1. create an ubuntu natty ec2 instance using ami-1aad5273
|
||||
1. `sudo aptitude update`
|
||||
1. `sudo aptitude upgrade`
|
||||
1. `sudo aptitude install git apache libapache2-mod-wsgi mysql-client libmysqlclient-dev python-virtualenv python-dev`
|
||||
1. `sudo mkdir /opt/regluit`
|
||||
1. `sudo chown ubuntu:ubuntu /opt/regluit`
|
||||
1. `cd /opt`
|
||||
1. `git config --global user.name "Ed Summers"`
|
||||
1. `git config --global user.email "ehs@pobox.com"`
|
||||
1. `ssh-keygen`
|
||||
1. add `~/.ssh/id_rsa.pub` as a deploy key on github
|
||||
1. `git clone git@github.com:Gluejar/regluit.git`
|
||||
1. `cd /opt/regluit`
|
||||
1. `cp settings/dev.py settings/prod.py`
|
||||
1. create an Amazon RDS instance
|
||||
1. connect to it, e.g. `mysql -u root -h gluejardb.cboagmr25pjs.us-east-1.rds.amazonaws.com -p`
|
||||
1. `CREATE DATABASE unglueit CHARSET utf8;`
|
||||
1. `GRANT ALL ON unglueit.* TO ‘unglueit’@’ip-10-244-250-168.ec2.internal’ IDENTIFIED BY 'unglueit' REQUIRE SSL`
|
||||
1. update settings/prod.py with database credentials
|
||||
1. `virtualenv --no-site-packages ENV`
|
||||
1. `source ENV/bin/activate`
|
||||
1. `pip install -r requirements.pip`
|
||||
1. `echo "/opt/" > ENV/lib/python2.7/site-packages/regluit.pth`
|
||||
1. `django-admin.py syncdb --migrate --settings regluit.settings.prod`
|
||||
1. `sudo ln -s /opt/regluit/deploy/regluit.conf /etc/apache2/sites-available/regluit`
|
||||
1. `sudo a2ensite regluit`
|
||||
1. `sudo /etc/init.d/apache2 restart`
|
||||
|
||||
|
||||
OS X Develper Notes
|
||||
-------------------
|
||||
|
||||
To run regluit on OS X you should have XCode installed
|
||||
|
||||
Install virtualenvwrapper according
|
||||
to the process at http://blog.praveengollakota.com/47430655:
|
||||
|
|
|
@ -9,7 +9,7 @@ class Migration(SchemaMigration):
|
|||
def forwards(self, orm):
|
||||
|
||||
# Changing field 'Author.edition'
|
||||
db.alter_column('core_author', 'edition_id', self.gf('django.db.models.fields.related.ForeignKey')(default='', to=orm['core.Edition']))
|
||||
db.alter_column('core_author', 'edition_id', self.gf('django.db.models.fields.related.ForeignKey')(default=1, to=orm['core.Edition']))
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
|
|
@ -0,0 +1,132 @@
|
|||
# encoding: 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):
|
||||
|
||||
# Changing field 'Campaign.target'
|
||||
db.alter_column('core_campaign', 'target', self.gf('django.db.models.fields.DecimalField')(max_digits=14, decimal_places=2))
|
||||
|
||||
# Changing field 'UserProfile.user'
|
||||
db.alter_column('core_userprofile', 'user_id', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True))
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Changing field 'Campaign.target'
|
||||
db.alter_column('core_campaign', 'target', self.gf('django.db.models.fields.FloatField')())
|
||||
|
||||
# Changing field 'UserProfile.user'
|
||||
db.alter_column('core_userprofile', 'user_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], unique=True))
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'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': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'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'}),
|
||||
'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'})
|
||||
},
|
||||
'core.author': {
|
||||
'Meta': {'object_name': 'Author'},
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
|
||||
'openlibrary_id': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True'}),
|
||||
'works': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'authors'", 'symmetrical': 'False', 'to': "orm['core.Work']"})
|
||||
},
|
||||
'core.campaign': {
|
||||
'Meta': {'object_name': 'Campaign'},
|
||||
'amazon_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'deadline': ('django.db.models.fields.DateTimeField', [], {}),
|
||||
'description': ('django.db.models.fields.CharField', [], {'max_length': '10000'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
|
||||
'paypal_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
|
||||
'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '14', 'decimal_places': '2'}),
|
||||
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'campaigns'", 'to': "orm['core.Work']"})
|
||||
},
|
||||
'core.edition': {
|
||||
'Meta': {'object_name': 'Edition'},
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'default': "''", 'null': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'isbn_10': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True'}),
|
||||
'isbn_13': ('django.db.models.fields.CharField', [], {'max_length': '13', 'null': 'True'}),
|
||||
'openlibrary_id': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True'}),
|
||||
'publication_date': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
|
||||
'publisher': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
|
||||
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'editions'", 'null': 'True', 'to': "orm['core.Work']"})
|
||||
},
|
||||
'core.editioncover': {
|
||||
'Meta': {'object_name': 'EditionCover'},
|
||||
'edition': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'covers'", 'to': "orm['core.Edition']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'openlibrary_id': ('django.db.models.fields.IntegerField', [], {})
|
||||
},
|
||||
'core.subject': {
|
||||
'Meta': {'object_name': 'Subject'},
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
|
||||
'works': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'subjects'", 'symmetrical': 'False', 'to': "orm['core.Work']"})
|
||||
},
|
||||
'core.userprofile': {
|
||||
'Meta': {'object_name': 'UserProfile'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'tagline': ('django.db.models.fields.CharField', [], {'max_length': '140', 'blank': 'True'}),
|
||||
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
|
||||
},
|
||||
'core.wishlist': {
|
||||
'Meta': {'object_name': 'Wishlist'},
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'wishlist'", 'unique': 'True', 'to': "orm['auth.User']"}),
|
||||
'works': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'wishlists'", 'symmetrical': 'False', 'to': "orm['core.Work']"})
|
||||
},
|
||||
'core.work': {
|
||||
'Meta': {'object_name': 'Work'},
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'openlibrary_id': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['core']
|
|
@ -1,13 +1,13 @@
|
|||
from django.db import models
|
||||
from django.db.models import Q
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
from decimal import Decimal
|
||||
|
||||
class Campaign(models.Model):
|
||||
created = models.DateTimeField(auto_now_add=True)
|
||||
name = models.CharField(max_length=500, null=False)
|
||||
description = models.CharField(max_length=10000, null=False)
|
||||
target = models.FloatField(null=False)
|
||||
target = models.DecimalField(max_digits=14, decimal_places=2)
|
||||
deadline = models.DateTimeField(null=False)
|
||||
paypal_receiver = models.CharField(max_length=100, null=True)
|
||||
amazon_receiver = models.CharField(max_length=100, null=True)
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
WSGIPythonHome /opt/regluit/ENV
|
||||
WSGISocketPrefix /opt/regluit
|
||||
WSGIDaemonProcess regluit-wsgi-app processes=4 threads=4 python-eggs=/tmp/regluit-python-eggs
|
||||
WSGIScriptAlias / /opt/regluit/deploy/regluit.wsgi
|
||||
|
||||
<Directory /opt/regluit/static>
|
||||
Options Indexes FollowSymLinks
|
||||
AllowOverride None
|
||||
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
</Directory>
|
||||
|
||||
Alias /static /opt/regluit/static
|
|
@ -1,10 +1,8 @@
|
|||
#!/usr/bin/env python
|
||||
|
||||
import os
|
||||
import socket
|
||||
|
||||
import django.core.handlers.wsgi
|
||||
|
||||
hostname = socket.gethostname()
|
||||
os.environ['DJANGO_SETTING_MODULE'] = 'regluit.settings_%s' % hostname
|
||||
application = django.core.handlers.wsgi.WSGIHander()
|
||||
os.environ['DJANGO_SETTINGS_MODULE'] = 'regluit.settings.prod'
|
||||
application = django.core.handlers.wsgi.WSGIHandler()
|
||||
|
|
|
@ -5,6 +5,10 @@ from regluit.payment.parameters import *
|
|||
from regluit.payment.paypal import Pay, IPN, IPN_TYPE_PAYMENT, IPN_TYPE_PREAPPROVAL, IPN_TYPE_ADJUSTMENT, Preapproval, IPN_PAY_STATUS_COMPLETED, CancelPreapproval, IPN_SENDER_STATUS_COMPLETED
|
||||
import uuid
|
||||
import traceback
|
||||
import logging
|
||||
from decimal import Decimal as D
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class PaymentManager( object ):
|
||||
|
||||
|
@ -23,7 +27,7 @@ class PaymentManager( object ):
|
|||
ipn = IPN(request)
|
||||
|
||||
if ipn.success():
|
||||
print "Valid IPN"
|
||||
logger.info("Valid IPN")
|
||||
|
||||
|
||||
if ipn.transaction_type == IPN_TYPE_PAYMENT:
|
||||
|
@ -40,7 +44,7 @@ class PaymentManager( object ):
|
|||
|
||||
try:
|
||||
r = Receiver.objects.get(transaction=t, email=item['receiver'])
|
||||
print item
|
||||
logger.info(item)
|
||||
# one of the IPN_SENDER_STATUS codes defined in paypal.py
|
||||
r.status = item['status_for_sender_txn']
|
||||
r.txn_id = item['id_for_sender_txn']
|
||||
|
@ -73,15 +77,15 @@ class PaymentManager( object ):
|
|||
# The status is always one of the IPN_PREAPPROVAL_STATUS codes defined in paypal.py
|
||||
t.status = ipn.status
|
||||
t.save()
|
||||
print "IPN: Preapproval transaction: " + str(t.id) + " Status: " + ipn.status
|
||||
logger.info("IPN: Preapproval transaction: " + str(t.id) + " Status: " + ipn.status)
|
||||
|
||||
else:
|
||||
print "IPN: Unknown Transaction Type: " + ipn.transaction_type
|
||||
logger.info("IPN: Unknown Transaction Type: " + ipn.transaction_type)
|
||||
|
||||
|
||||
else:
|
||||
print "ERROR: INVALID IPN"
|
||||
print ipn.error
|
||||
logger.info("ERROR: INVALID IPN")
|
||||
logger.info(ipn.error)
|
||||
|
||||
except:
|
||||
traceback.print_exc()
|
||||
|
@ -228,12 +232,12 @@ class PaymentManager( object ):
|
|||
# We will update our transaction status when we receive the IPN
|
||||
|
||||
if p.status() == IPN_PAY_STATUS_COMPLETED:
|
||||
print "Execute Success"
|
||||
logger.info("Execute Success")
|
||||
return True
|
||||
|
||||
else:
|
||||
transaction.error = p.error()
|
||||
print "Execute Error: " + p.error()
|
||||
logger.info("Execute Error: " + p.error())
|
||||
return False
|
||||
|
||||
'''
|
||||
|
@ -248,11 +252,11 @@ class PaymentManager( object ):
|
|||
p = CancelPreapproval(transaction)
|
||||
|
||||
if p.success():
|
||||
print "Cancel Transaction " + str(transaction.id) + " Completed"
|
||||
logger.info("Cancel Transaction " + str(transaction.id) + " Completed")
|
||||
return True
|
||||
|
||||
else:
|
||||
print "Cancel Transaction " + str(transaction.id) + " Failed with error: " + p.error()
|
||||
logger.info("Cancel Transaction " + str(transaction.id) + " Failed with error: " + p.error())
|
||||
transaction.error = p.error()
|
||||
return False
|
||||
|
||||
|
@ -291,13 +295,13 @@ class PaymentManager( object ):
|
|||
if p.status() == 'Success':
|
||||
t.reference = p.paykey()
|
||||
t.save()
|
||||
print "Authorize Success: " + p.next_url()
|
||||
logger.info("Authorize Success: " + p.next_url())
|
||||
return t, p.next_url()
|
||||
|
||||
else:
|
||||
t.error = p.error()
|
||||
t.save()
|
||||
print "Authorize Error: " + p.error()
|
||||
logger.info("Authorize Error: " + p.error())
|
||||
return t, None
|
||||
|
||||
|
||||
|
@ -325,10 +329,10 @@ class PaymentManager( object ):
|
|||
'''
|
||||
def pledge(self, currency, target, receiver_list, campaign=None, list=None, user=None):
|
||||
|
||||
amount = 0.0
|
||||
amount = D('0.00')
|
||||
|
||||
# for chained payments, first amount is the total amount
|
||||
amount = receiver_list[0]['amount']
|
||||
amount = D(receiver_list[0]['amount'])
|
||||
|
||||
t = Transaction.objects.create(amount=amount,
|
||||
type=PAYMENT_TYPE_INSTANT,
|
||||
|
@ -348,13 +352,13 @@ class PaymentManager( object ):
|
|||
if p.status() == 'CREATED':
|
||||
t.reference = p.paykey()
|
||||
t.save()
|
||||
print "Pledge Success: " + p.next_url()
|
||||
logger.info("Pledge Success: " + p.next_url())
|
||||
return t, p.next_url()
|
||||
|
||||
else:
|
||||
t.error = p.error()
|
||||
t.save()
|
||||
print "Pledge Error: " + p.error()
|
||||
logger.info("Pledge Error: " + p.error())
|
||||
return t, None
|
||||
|
||||
|
|
@ -0,0 +1,158 @@
|
|||
# encoding: 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 model 'Transaction'
|
||||
db.create_table('payment_transaction', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('type', self.gf('django.db.models.fields.IntegerField')(default=0)),
|
||||
('target', self.gf('django.db.models.fields.IntegerField')(default=0)),
|
||||
('status', self.gf('django.db.models.fields.CharField')(default='NONE', max_length=32)),
|
||||
('amount', self.gf('django.db.models.fields.IntegerField')(default=0.0)),
|
||||
('currency', self.gf('django.db.models.fields.CharField')(default='USD', max_length=10, null=True)),
|
||||
('secret', self.gf('django.db.models.fields.CharField')(max_length=64, null=True)),
|
||||
('reference', self.gf('django.db.models.fields.CharField')(max_length=128, null=True)),
|
||||
('receipt', self.gf('django.db.models.fields.CharField')(max_length=256, null=True)),
|
||||
('error', self.gf('django.db.models.fields.CharField')(max_length=256, null=True)),
|
||||
('reason', self.gf('django.db.models.fields.CharField')(max_length=64, null=True)),
|
||||
('date_created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
|
||||
('date_modified', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
|
||||
('date_payment', self.gf('django.db.models.fields.DateTimeField')(null=True)),
|
||||
('date_authorized', self.gf('django.db.models.fields.DateTimeField')(null=True)),
|
||||
('date_expired', self.gf('django.db.models.fields.DateTimeField')(null=True)),
|
||||
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True)),
|
||||
('campaign', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['core.Campaign'], null=True)),
|
||||
('list', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['core.Wishlist'], null=True)),
|
||||
))
|
||||
db.send_create_signal('payment', ['Transaction'])
|
||||
|
||||
# Adding model 'Receiver'
|
||||
db.create_table('payment_receiver', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('email', self.gf('django.db.models.fields.CharField')(max_length=64)),
|
||||
('amount', self.gf('django.db.models.fields.FloatField')()),
|
||||
('currency', self.gf('django.db.models.fields.CharField')(max_length=10)),
|
||||
('status', self.gf('django.db.models.fields.CharField')(max_length=64)),
|
||||
('reason', self.gf('django.db.models.fields.CharField')(max_length=64)),
|
||||
('primary', self.gf('django.db.models.fields.BooleanField')(default=False)),
|
||||
('txn_id', self.gf('django.db.models.fields.CharField')(max_length=64)),
|
||||
('transaction', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['payment.Transaction'])),
|
||||
))
|
||||
db.send_create_signal('payment', ['Receiver'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting model 'Transaction'
|
||||
db.delete_table('payment_transaction')
|
||||
|
||||
# Deleting model 'Receiver'
|
||||
db.delete_table('payment_receiver')
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'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': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'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'}),
|
||||
'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'})
|
||||
},
|
||||
'core.campaign': {
|
||||
'Meta': {'object_name': 'Campaign'},
|
||||
'amazon_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'deadline': ('django.db.models.fields.DateTimeField', [], {}),
|
||||
'description': ('django.db.models.fields.CharField', [], {'max_length': '10000'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
|
||||
'paypal_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
|
||||
'target': ('django.db.models.fields.FloatField', [], {}),
|
||||
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'campaigns'", 'to': "orm['core.Work']"})
|
||||
},
|
||||
'core.wishlist': {
|
||||
'Meta': {'object_name': 'Wishlist'},
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'wishlist'", 'unique': 'True', 'to': "orm['auth.User']"}),
|
||||
'works': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'wishlists'", 'symmetrical': 'False', 'to': "orm['core.Work']"})
|
||||
},
|
||||
'core.work': {
|
||||
'Meta': {'object_name': 'Work'},
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'openlibrary_id': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000'})
|
||||
},
|
||||
'payment.receiver': {
|
||||
'Meta': {'object_name': 'Receiver'},
|
||||
'amount': ('django.db.models.fields.FloatField', [], {}),
|
||||
'currency': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
|
||||
'email': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'primary': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'reason': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
|
||||
'status': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
|
||||
'transaction': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['payment.Transaction']"}),
|
||||
'txn_id': ('django.db.models.fields.CharField', [], {'max_length': '64'})
|
||||
},
|
||||
'payment.transaction': {
|
||||
'Meta': {'object_name': 'Transaction'},
|
||||
'amount': ('django.db.models.fields.IntegerField', [], {'default': '0.0'}),
|
||||
'campaign': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Campaign']", 'null': 'True'}),
|
||||
'currency': ('django.db.models.fields.CharField', [], {'default': "'USD'", 'max_length': '10', 'null': 'True'}),
|
||||
'date_authorized': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'date_expired': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'date_payment': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'error': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Wishlist']", 'null': 'True'}),
|
||||
'reason': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
|
||||
'receipt': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True'}),
|
||||
'reference': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
|
||||
'secret': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
|
||||
'status': ('django.db.models.fields.CharField', [], {'default': "'NONE'", 'max_length': '32'}),
|
||||
'target': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||
'type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['payment']
|
|
@ -0,0 +1,126 @@
|
|||
# encoding: 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):
|
||||
|
||||
# Changing field 'Transaction.amount'
|
||||
db.alter_column('payment_transaction', 'amount', self.gf('django.db.models.fields.DecimalField')(max_digits=14, decimal_places=2))
|
||||
|
||||
# Changing field 'Receiver.amount'
|
||||
db.alter_column('payment_receiver', 'amount', self.gf('django.db.models.fields.DecimalField')(max_digits=14, decimal_places=2))
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Changing field 'Transaction.amount'
|
||||
db.alter_column('payment_transaction', 'amount', self.gf('django.db.models.fields.IntegerField')())
|
||||
|
||||
# Changing field 'Receiver.amount'
|
||||
db.alter_column('payment_receiver', 'amount', self.gf('django.db.models.fields.FloatField')())
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'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': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'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': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'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'}),
|
||||
'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'})
|
||||
},
|
||||
'core.campaign': {
|
||||
'Meta': {'object_name': 'Campaign'},
|
||||
'amazon_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'deadline': ('django.db.models.fields.DateTimeField', [], {}),
|
||||
'description': ('django.db.models.fields.CharField', [], {'max_length': '10000'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
|
||||
'paypal_receiver': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'}),
|
||||
'target': ('django.db.models.fields.DecimalField', [], {'max_digits': '14', 'decimal_places': '2'}),
|
||||
'work': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'campaigns'", 'to': "orm['core.Work']"})
|
||||
},
|
||||
'core.wishlist': {
|
||||
'Meta': {'object_name': 'Wishlist'},
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.OneToOneField', [], {'related_name': "'wishlist'", 'unique': 'True', 'to': "orm['auth.User']"}),
|
||||
'works': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'wishlists'", 'symmetrical': 'False', 'to': "orm['core.Work']"})
|
||||
},
|
||||
'core.work': {
|
||||
'Meta': {'object_name': 'Work'},
|
||||
'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'openlibrary_id': ('django.db.models.fields.CharField', [], {'max_length': '50', 'null': 'True'}),
|
||||
'title': ('django.db.models.fields.CharField', [], {'max_length': '1000'})
|
||||
},
|
||||
'payment.receiver': {
|
||||
'Meta': {'object_name': 'Receiver'},
|
||||
'amount': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '14', 'decimal_places': '2'}),
|
||||
'currency': ('django.db.models.fields.CharField', [], {'max_length': '10'}),
|
||||
'email': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'primary': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'reason': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
|
||||
'status': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
|
||||
'transaction': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['payment.Transaction']"}),
|
||||
'txn_id': ('django.db.models.fields.CharField', [], {'max_length': '64'})
|
||||
},
|
||||
'payment.transaction': {
|
||||
'Meta': {'object_name': 'Transaction'},
|
||||
'amount': ('django.db.models.fields.DecimalField', [], {'default': "'0.00'", 'max_digits': '14', 'decimal_places': '2'}),
|
||||
'campaign': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Campaign']", 'null': 'True'}),
|
||||
'currency': ('django.db.models.fields.CharField', [], {'default': "'USD'", 'max_length': '10', 'null': 'True'}),
|
||||
'date_authorized': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'date_expired': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'date_payment': ('django.db.models.fields.DateTimeField', [], {'null': 'True'}),
|
||||
'error': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'list': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['core.Wishlist']", 'null': 'True'}),
|
||||
'reason': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
|
||||
'receipt': ('django.db.models.fields.CharField', [], {'max_length': '256', 'null': 'True'}),
|
||||
'reference': ('django.db.models.fields.CharField', [], {'max_length': '128', 'null': 'True'}),
|
||||
'secret': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True'}),
|
||||
'status': ('django.db.models.fields.CharField', [], {'default': "'NONE'", 'max_length': '32'}),
|
||||
'target': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||
'type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['payment']
|
|
@ -2,13 +2,14 @@ from django.db import models
|
|||
from django.contrib.auth.models import User
|
||||
from regluit.core.models import Campaign, Wishlist
|
||||
from regluit.payment.parameters import *
|
||||
from decimal import Decimal
|
||||
|
||||
class Transaction(models.Model):
|
||||
|
||||
type = models.IntegerField(default=PAYMENT_TYPE_NONE, null=False)
|
||||
target = models.IntegerField(default=TARGET_TYPE_NONE, null=False)
|
||||
status = models.CharField(max_length=32, default='NONE', null=False)
|
||||
amount = models.IntegerField(default=0.0, null=False)
|
||||
amount = models.DecimalField(default=Decimal('0.00'), max_digits=14, decimal_places=2) # max 999,999,999,999.99
|
||||
currency = models.CharField(max_length=10, default='USD', null=True)
|
||||
secret = models.CharField(max_length=64, null=True)
|
||||
reference = models.CharField(max_length=128, null=True)
|
||||
|
@ -38,7 +39,7 @@ class Transaction(models.Model):
|
|||
class Receiver(models.Model):
|
||||
|
||||
email = models.CharField(max_length=64)
|
||||
amount = models.FloatField()
|
||||
amount = models.DecimalField(default=Decimal('0.00'), max_digits=14, decimal_places=2) # max 999,999,999,999.99
|
||||
currency = models.CharField(max_length=10)
|
||||
status = models.CharField(max_length=64)
|
||||
reason = models.CharField(max_length=64)
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
from regluit.settings.me import *
|
||||
|
||||
PAYMENT_TYPE_NONE = 0
|
||||
PAYMENT_TYPE_INSTANT = 1
|
||||
PAYMENT_TYPE_AUTHORIZATION = 2
|
||||
|
@ -13,4 +11,3 @@ CANCEL_URL = 'paymentcancel'
|
|||
|
||||
PREAPPROVAL_PERIOD = 365 # days to ask for in a preapproval
|
||||
PAYPAL_COMMISSION = 0.10
|
||||
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from regluit.payment.parameters import *
|
||||
from django.conf import settings
|
||||
from regluit.payment.models import Transaction
|
||||
from django.contrib.auth.models import User
|
||||
from django.utils import simplejson as json
|
||||
|
@ -24,6 +25,7 @@ import smtplib
|
|||
import urlparse
|
||||
import decimal
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# transaction_type constants
|
||||
IPN_TYPE_PAYMENT = 'Adaptive Payment PAY'
|
||||
|
@ -91,18 +93,18 @@ class Pay( object ):
|
|||
def __init__( self, transaction):
|
||||
|
||||
headers = {
|
||||
'X-PAYPAL-SECURITY-USERID':PAYPAL_USERNAME,
|
||||
'X-PAYPAL-SECURITY-PASSWORD':PAYPAL_PASSWORD,
|
||||
'X-PAYPAL-SECURITY-SIGNATURE':PAYPAL_SIGNATURE,
|
||||
'X-PAYPAL-APPLICATION-ID':PAYPAL_APPID,
|
||||
'X-PAYPAL-SECURITY-USERID':settings.PAYPAL_USERNAME,
|
||||
'X-PAYPAL-SECURITY-PASSWORD':settings.PAYPAL_PASSWORD,
|
||||
'X-PAYPAL-SECURITY-SIGNATURE':settings.PAYPAL_SIGNATURE,
|
||||
'X-PAYPAL-APPLICATION-ID':settings.PAYPAL_APPID,
|
||||
'X-PAYPAL-REQUEST-DATA-FORMAT':'JSON',
|
||||
'X-PAYPAL-RESPONSE-DATA-FORMAT':'JSON'
|
||||
}
|
||||
|
||||
return_url = BASE_URL + COMPLETE_URL
|
||||
cancel_url = BASE_URL + CANCEL_URL
|
||||
print "Return URL: " + return_url
|
||||
print "Cancel URL: " + cancel_url
|
||||
return_url = settings.BASE_URL + COMPLETE_URL
|
||||
cancel_url = settings.BASE_URL + CANCEL_URL
|
||||
logger.info("Return URL: " + return_url)
|
||||
logger.info("Cancel URL: " + cancel_url)
|
||||
|
||||
receiver_list = []
|
||||
receivers = transaction.receiver_set.all()
|
||||
|
@ -121,7 +123,7 @@ class Pay( object ):
|
|||
else:
|
||||
receiver_list.append({'email':r.email,'amount':str(r.amount)})
|
||||
|
||||
print receiver_list
|
||||
logger.info(receiver_list)
|
||||
|
||||
data = {
|
||||
'actionType': 'PAY',
|
||||
|
@ -130,7 +132,7 @@ class Pay( object ):
|
|||
'returnUrl': return_url,
|
||||
'cancelUrl': cancel_url,
|
||||
'requestEnvelope': { 'errorLanguage': 'en_US' },
|
||||
'ipnNotificationUrl': BASE_URL + 'paypalipn'
|
||||
'ipnNotificationUrl': settings.BASE_URL + 'paypalipn'
|
||||
}
|
||||
|
||||
if transaction.reference:
|
||||
|
@ -138,10 +140,10 @@ class Pay( object ):
|
|||
|
||||
self.raw_request = json.dumps(data)
|
||||
|
||||
self.raw_response = url_request( PAYPAL_ENDPOINT, "/AdaptivePayments/Pay", data=self.raw_request, headers=headers ).content()
|
||||
print "paypal PAY response was: %s" % self.raw_response
|
||||
self.raw_response = url_request(settings.PAYPAL_ENDPOINT, "/AdaptivePayments/Pay", data=self.raw_request, headers=headers ).content()
|
||||
logger.info("paypal PAY response was: %s" % self.raw_response)
|
||||
self.response = json.loads( self.raw_response )
|
||||
print self.response
|
||||
logger.info(self.response)
|
||||
|
||||
def status( self ):
|
||||
if self.response.has_key( 'paymentExecStatus' ):
|
||||
|
@ -152,7 +154,7 @@ class Pay( object ):
|
|||
def error( self ):
|
||||
if self.response.has_key('error'):
|
||||
error = self.response['error']
|
||||
print error
|
||||
logger.info(error)
|
||||
return error[0]['message']
|
||||
else:
|
||||
return 'Paypal PAY: Unknown Error'
|
||||
|
@ -164,7 +166,7 @@ class Pay( object ):
|
|||
return self.response['payKey']
|
||||
|
||||
def next_url( self ):
|
||||
return '%s?cmd=_ap-payment&paykey=%s' % ( PAYPAL_PAYMENT_HOST, self.response['payKey'] )
|
||||
return '%s?cmd=_ap-payment&paykey=%s' % (settings.PAYPAL_PAYMENT_HOST, self.response['payKey'] )
|
||||
|
||||
|
||||
class CancelPreapproval(object):
|
||||
|
@ -172,10 +174,10 @@ class CancelPreapproval(object):
|
|||
def __init__(self, transaction):
|
||||
|
||||
headers = {
|
||||
'X-PAYPAL-SECURITY-USERID':PAYPAL_USERNAME,
|
||||
'X-PAYPAL-SECURITY-PASSWORD':PAYPAL_PASSWORD,
|
||||
'X-PAYPAL-SECURITY-SIGNATURE':PAYPAL_SIGNATURE,
|
||||
'X-PAYPAL-APPLICATION-ID':PAYPAL_APPID,
|
||||
'X-PAYPAL-SECURITY-USERID':settings.PAYPAL_USERNAME,
|
||||
'X-PAYPAL-SECURITY-PASSWORD':settings.PAYPAL_PASSWORD,
|
||||
'X-PAYPAL-SECURITY-SIGNATURE':settings.PAYPAL_SIGNATURE,
|
||||
'X-PAYPAL-APPLICATION-ID':settings.PAYPAL_APPID,
|
||||
'X-PAYPAL-REQUEST-DATA-FORMAT':'JSON',
|
||||
'X-PAYPAL-RESPONSE-DATA-FORMAT':'JSON',
|
||||
}
|
||||
|
@ -186,10 +188,10 @@ class CancelPreapproval(object):
|
|||
}
|
||||
|
||||
self.raw_request = json.dumps(data)
|
||||
self.raw_response = url_request(PAYPAL_ENDPOINT, "/AdaptivePayments/CancelPreapproval", data=self.raw_request, headers=headers ).content()
|
||||
print "paypal CANCEL PREAPPROBAL response was: %s" % self.raw_response
|
||||
self.raw_response = url_request(settings.PAYPAL_ENDPOINT, "/AdaptivePayments/CancelPreapproval", data=self.raw_request, headers=headers ).content()
|
||||
logger.info("paypal CANCEL PREAPPROBAL response was: %s" % self.raw_response)
|
||||
self.response = json.loads( self.raw_response )
|
||||
print self.response
|
||||
logger.info(self.response)
|
||||
|
||||
def success(self):
|
||||
if self.status() == 'Success' or self.status() == "SuccessWithWarning":
|
||||
|
@ -200,7 +202,7 @@ class CancelPreapproval(object):
|
|||
def error(self):
|
||||
if self.response.has_key('error'):
|
||||
error = self.response['error']
|
||||
print error
|
||||
logger.info(error)
|
||||
return error[0]['message']
|
||||
else:
|
||||
return 'Paypal Preapproval Cancel: Unknown Error'
|
||||
|
@ -216,10 +218,10 @@ class Preapproval( object ):
|
|||
def __init__( self, transaction, amount ):
|
||||
|
||||
headers = {
|
||||
'X-PAYPAL-SECURITY-USERID':PAYPAL_USERNAME,
|
||||
'X-PAYPAL-SECURITY-PASSWORD':PAYPAL_PASSWORD,
|
||||
'X-PAYPAL-SECURITY-SIGNATURE':PAYPAL_SIGNATURE,
|
||||
'X-PAYPAL-APPLICATION-ID':PAYPAL_APPID,
|
||||
'X-PAYPAL-SECURITY-USERID':settings.PAYPAL_USERNAME,
|
||||
'X-PAYPAL-SECURITY-PASSWORD':settings.PAYPAL_PASSWORD,
|
||||
'X-PAYPAL-SECURITY-SIGNATURE':settings.PAYPAL_SIGNATURE,
|
||||
'X-PAYPAL-APPLICATION-ID':settings.PAYPAL_APPID,
|
||||
'X-PAYPAL-REQUEST-DATA-FORMAT':'JSON',
|
||||
'X-PAYPAL-RESPONSE-DATA-FORMAT':'JSON',
|
||||
}
|
||||
|
@ -248,10 +250,10 @@ class Preapproval( object ):
|
|||
}
|
||||
|
||||
self.raw_request = json.dumps(data)
|
||||
self.raw_response = url_request(PAYPAL_ENDPOINT, "/AdaptivePayments/Preapproval", data=self.raw_request, headers=headers ).content()
|
||||
print "paypal PREAPPROVAL response was: %s" % self.raw_response
|
||||
self.raw_response = url_request(settings.PAYPAL_ENDPOINT, "/AdaptivePayments/Preapproval", data=self.raw_request, headers=headers ).content()
|
||||
logger.info("paypal PREAPPROVAL response was: %s" % self.raw_response)
|
||||
self.response = json.loads( self.raw_response )
|
||||
print self.response
|
||||
logger.info(self.response)
|
||||
|
||||
def paykey( self ):
|
||||
if self.response.has_key( 'preapprovalKey' ):
|
||||
|
@ -260,12 +262,12 @@ class Preapproval( object ):
|
|||
return None
|
||||
|
||||
def next_url( self ):
|
||||
return '%s?cmd=_ap-preapproval&preapprovalkey=%s' % ( PAYPAL_PAYMENT_HOST, self.response['preapprovalKey'] )
|
||||
return '%s?cmd=_ap-preapproval&preapprovalkey=%s' % ( settings.PAYPAL_PAYMENT_HOST, self.response['preapprovalKey'] )
|
||||
|
||||
def error( self ):
|
||||
if self.response.has_key('error'):
|
||||
error = self.response['error']
|
||||
print error
|
||||
logger.info(error)
|
||||
return error[0]['message']
|
||||
else:
|
||||
return 'Paypal Preapproval: Unknown Error'
|
||||
|
@ -285,7 +287,7 @@ class IPN( object ):
|
|||
# verify that the request is paypal's
|
||||
self.error = None
|
||||
|
||||
url = "%s?cmd=_notify-validate" % PAYPAL_PAYMENT_HOST
|
||||
url = "%s?cmd=_notify-validate" % settings.PAYPAL_PAYMENT_HOST
|
||||
data=urllib.urlencode(request.POST.copy())
|
||||
req = urllib2.Request(url, data)
|
||||
response = urllib2.urlopen(req)
|
||||
|
@ -345,6 +347,6 @@ class IPN( object ):
|
|||
transdict = IPN.slicedict(request.POST, 'transaction[%s].' % transaction_num)
|
||||
if len(transdict) > 0:
|
||||
self.transactions.append(transdict)
|
||||
print transdict
|
||||
logger.info(transdict)
|
||||
|
||||
|
||||
|
|
|
@ -8,5 +8,6 @@ urlpatterns = patterns(
|
|||
url(r"^testcancel", "testCancel"),
|
||||
url(r"^querycampaign", "queryCampaign"),
|
||||
url(r"^paypalipn", "paypalIPN"),
|
||||
url(r"^runtests", "runTests")
|
||||
url(r"^runtests", "runTests"),
|
||||
url(r"^paymentcomplete","paymentcomplete")
|
||||
)
|
||||
|
|
|
@ -11,6 +11,14 @@ from unittest import TestResult
|
|||
from regluit.payment.tests import PledgeTest, AuthorizeTest
|
||||
import traceback
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# parameterize some test recipients
|
||||
#TEST_RECEIVERS = ['jakace_1309677337_biz@gmail.com', 'seller_1317463643_biz@gmail.com']
|
||||
TEST_RECEIVERS = ['glueja_1317336101_biz@gluejar.com', 'rh1_1317336251_biz@gluejar.com', 'RH2_1317336302_biz@gluejar.com']
|
||||
|
||||
|
||||
'''
|
||||
http://BASE/querycampaign?id=2
|
||||
|
||||
|
@ -51,7 +59,7 @@ def testExecute(request):
|
|||
|
||||
for t in result:
|
||||
output += str(t)
|
||||
print str(t)
|
||||
logger.info(str(t))
|
||||
|
||||
else:
|
||||
transactions = Transaction.objects.filter(status='ACTIVE')
|
||||
|
@ -59,12 +67,12 @@ def testExecute(request):
|
|||
for t in transactions:
|
||||
|
||||
# Note, set this to 1-5 different receivers with absolute amounts for each
|
||||
receiver_list = [{'email':'jakace_1309677337_biz@gmail.com', 'amount':t.amount * 0.80},
|
||||
{'email':'seller_1317463643_biz@gmail.com', 'amount':t.amount * 0.20}]
|
||||
receiver_list = [{'email':TEST_RECEIVERS[0], 'amount':t.amount * 0.80},
|
||||
{'email':TEST_RECEIVERS[1], 'amount':t.amount * 0.20}]
|
||||
|
||||
p.execute_transaction(t, receiver_list)
|
||||
output += str(t)
|
||||
print str(t)
|
||||
logger.info(str(t))
|
||||
|
||||
return HttpResponse(output)
|
||||
|
||||
|
@ -90,8 +98,8 @@ def testAuthorize(request):
|
|||
|
||||
|
||||
# Note, set this to 1-5 different receivers with absolute amounts for each
|
||||
receiver_list = [{'email':'jakace_1309677337_biz@gmail.com', 'amount':20.00},
|
||||
{'email':'seller_1317463643_biz@gmail.com', 'amount':10.00}]
|
||||
receiver_list = [{'email': TEST_RECEIVERS[0], 'amount':20.00},
|
||||
{'email': TEST_RECEIVERS[1], 'amount':10.00}]
|
||||
|
||||
if campaign_id:
|
||||
campaign = Campaign.objects.get(id=int(campaign_id))
|
||||
|
@ -101,12 +109,12 @@ def testAuthorize(request):
|
|||
t, url = p.authorize('USD', TARGET_TYPE_NONE, amount, campaign=None, list=None, user=None)
|
||||
|
||||
if url:
|
||||
print "testAuthorize: " + url
|
||||
logger.info("testAuthorize: " + url)
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
else:
|
||||
response = t.reference
|
||||
print "testAuthorize: Error " + str(t.reference)
|
||||
logger.info("testAuthorize: Error " + str(t.reference))
|
||||
return HttpResponse(response)
|
||||
|
||||
'''
|
||||
|
@ -144,8 +152,8 @@ def testPledge(request):
|
|||
|
||||
|
||||
# Note, set this to 1-5 different receivers with absolute amounts for each
|
||||
receiver_list = [{'email':'jakace_1309677337_biz@gmail.com', 'amount':20.00},
|
||||
{'email':'seller_1317463643_biz@gmail.com', 'amount':10.00}]
|
||||
#receiver_list = [{'email':TEST_RECEIVERS[0], 'amount':20.00},{'email':TEST_RECEIVERS[1], 'amount':10.00}]
|
||||
receiver_list = [{'email':TEST_RECEIVERS[0], 'amount':78.90}, {'email':TEST_RECEIVERS[1], 'amount':34.56}]
|
||||
|
||||
if campaign_id:
|
||||
campaign = Campaign.objects.get(id=int(campaign_id))
|
||||
|
@ -155,12 +163,12 @@ def testPledge(request):
|
|||
t, url = p.pledge('USD', TARGET_TYPE_NONE, receiver_list, campaign=None, list=None, user=None)
|
||||
|
||||
if url:
|
||||
print "testPledge: " + url
|
||||
logger.info("testPledge: " + url)
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
else:
|
||||
response = t.reference
|
||||
print "testPledge: Error " + str(t.reference)
|
||||
logger.info("testPledge: Error " + str(t.reference))
|
||||
return HttpResponse(response)
|
||||
|
||||
def runTests(request):
|
||||
|
@ -184,7 +192,7 @@ def runTests(request):
|
|||
test.run(result)
|
||||
|
||||
output = "Tests Run: " + str(result.testsRun) + str(result.errors) + str(result.failures)
|
||||
print output
|
||||
logger.info(output)
|
||||
|
||||
return HttpResponse(output)
|
||||
|
||||
|
@ -198,6 +206,13 @@ def paypalIPN(request):
|
|||
p = PaymentManager()
|
||||
p.processIPN(request)
|
||||
|
||||
print str(request.POST)
|
||||
logger.info(str(request.POST))
|
||||
return HttpResponse("ipn")
|
||||
|
||||
def paymentcomplete(request):
|
||||
# pick up all get and post parameters and display
|
||||
output = "payment complete"
|
||||
output += request.method + "\n" + str(request.REQUEST.items())
|
||||
return HttpResponse(output)
|
||||
|
||||
|
|
@ -8,3 +8,5 @@ django-social-auth
|
|||
selenium
|
||||
django-nose-selenium
|
||||
nose
|
||||
django-profiles
|
||||
MySQL-python
|
||||
|
|
|
@ -0,0 +1,45 @@
|
|||
from regluit.settings.common import *
|
||||
|
||||
DEBUG = True
|
||||
TEMPLATE_DEBUG = DEBUG
|
||||
|
||||
ADMINS = (
|
||||
('Ed Summers', 'ehs@pobox.com'),
|
||||
)
|
||||
|
||||
MANAGERS = ADMINS
|
||||
|
||||
DATABASES = {
|
||||
'default': {
|
||||
'ENGINE': 'django.db.backends.mysql',
|
||||
'NAME': 'unglueit_dev',
|
||||
'USER': 'unglueit_dev',
|
||||
'PASSWORD': 'unglu3it',
|
||||
'HOST': 'gluejardb.cboagmr25pjs.us-east-1.rds.amazonaws.com',
|
||||
'PORT': '',
|
||||
}
|
||||
}
|
||||
|
||||
TIME_ZONE = 'America/New_York'
|
||||
SECRET_KEY = '_^_off!8zsj4+)%qq623m&$7_m-q$iau5le0w!mw&n5tgt#x=t'
|
||||
|
||||
# django
|
||||
EMAIL_USE_TLS = True
|
||||
EMAIL_HOST = 'smtp.gmail.com'
|
||||
EMAIL_HOST_USER = 'ed.summers@gmail.com'
|
||||
EMAIL_HOST_PASSWORD = 'hvkhjwujmwzvraag'
|
||||
EMAIL_PORT = 587
|
||||
DEFAULT_FROM_EMAIL = 'info@gluejar.com'
|
||||
|
||||
# twitter auth
|
||||
TWITTER_CONSUMER_KEY = 'sd9StEg1N1qB8gGb2GRX4A'
|
||||
TWITTER_CONSUMER_SECRET = 'YSKHn8Du6EWqpcWZ6sp5tqDPvcOBXK0WJWVGWyB0'
|
||||
|
||||
# facebook auth
|
||||
FACEBOOK_APP_ID = '242881179080779'
|
||||
FACEBOOK_API_SECRET = '5eae483a0e92113d884c427b578ef23a'
|
||||
|
||||
# google auth
|
||||
GOOGLE_OAUTH2_CLIENT_ID = '989608723367.apps.googleusercontent.com'
|
||||
GOOGLE_OAUTH2_CLIENT_SECRET = '3UqalKyNynnaaarumUIWh8vS'
|
||||
GOOGLE_DISPLAY_NAME = 'unglue it!'
|
Loading…
Reference in New Issue