Merge branch 'master' of github.com:Gluejar/regluit into tastypie2

pull/1/head
Raymond Yee 2011-10-07 09:15:15 -07:00
commit 0ffa43b870
19 changed files with 612 additions and 81 deletions

1
.gitignore vendored
View File

@ -4,3 +4,4 @@
settings/me.* settings/me.*
*.dot *.dot
reports reports
ENV

View File

@ -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 an Ubuntu system. If you are on OS X see notes below
to install python-setuptools in step 1: 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. `sudo easy_install virtualenv virtualenvwrapper`
1. `git clone git@github.com:Gluejar/regluit.git` 1. `git clone git@github.com:Gluejar/regluit.git`
1. `cd regluit` 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. `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/ 1. point your browser at http://localhost:8000/
OS X Production Deployment
------- ---------------------
You should have XCode installed
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 Install virtualenvwrapper according
to the process at http://blog.praveengollakota.com/47430655: to the process at http://blog.praveengollakota.com/47430655:

0
api/models.py Normal file
View File

View File

@ -9,7 +9,7 @@ class Migration(SchemaMigration):
def forwards(self, orm): def forwards(self, orm):
# Changing field 'Author.edition' # 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): def backwards(self, orm):

View File

@ -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']

View File

@ -1,13 +1,13 @@
from django.db import models from django.db import models
from django.db.models import Q from django.db.models import Q
from django.contrib.auth.models import User from django.contrib.auth.models import User
from decimal import Decimal
class Campaign(models.Model): class Campaign(models.Model):
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
name = models.CharField(max_length=500, null=False) name = models.CharField(max_length=500, null=False)
description = models.CharField(max_length=10000, 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) deadline = models.DateTimeField(null=False)
paypal_receiver = models.CharField(max_length=100, null=True) paypal_receiver = models.CharField(max_length=100, null=True)
amazon_receiver = models.CharField(max_length=100, null=True) amazon_receiver = models.CharField(max_length=100, null=True)

14
deploy/regluit.conf Normal file
View File

@ -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

View File

@ -1,10 +1,8 @@
#!/usr/bin/env python #!/usr/bin/env python
import os import os
import socket
import django.core.handlers.wsgi import django.core.handlers.wsgi
hostname = socket.gethostname() os.environ['DJANGO_SETTINGS_MODULE'] = 'regluit.settings.prod'
os.environ['DJANGO_SETTING_MODULE'] = 'regluit.settings_%s' % hostname application = django.core.handlers.wsgi.WSGIHandler()
application = django.core.handlers.wsgi.WSGIHander()

View File

@ -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 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 uuid
import traceback import traceback
import logging
from decimal import Decimal as D
logger = logging.getLogger(__name__)
class PaymentManager( object ): class PaymentManager( object ):
@ -23,7 +27,7 @@ class PaymentManager( object ):
ipn = IPN(request) ipn = IPN(request)
if ipn.success(): if ipn.success():
print "Valid IPN" logger.info("Valid IPN")
if ipn.transaction_type == IPN_TYPE_PAYMENT: if ipn.transaction_type == IPN_TYPE_PAYMENT:
@ -40,7 +44,7 @@ class PaymentManager( object ):
try: try:
r = Receiver.objects.get(transaction=t, email=item['receiver']) 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 # one of the IPN_SENDER_STATUS codes defined in paypal.py
r.status = item['status_for_sender_txn'] r.status = item['status_for_sender_txn']
r.txn_id = item['id_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 # The status is always one of the IPN_PREAPPROVAL_STATUS codes defined in paypal.py
t.status = ipn.status t.status = ipn.status
t.save() t.save()
print "IPN: Preapproval transaction: " + str(t.id) + " Status: " + ipn.status logger.info("IPN: Preapproval transaction: " + str(t.id) + " Status: " + ipn.status)
else: else:
print "IPN: Unknown Transaction Type: " + ipn.transaction_type logger.info("IPN: Unknown Transaction Type: " + ipn.transaction_type)
else: else:
print "ERROR: INVALID IPN" logger.info("ERROR: INVALID IPN")
print ipn.error logger.info(ipn.error)
except: except:
traceback.print_exc() traceback.print_exc()
@ -228,12 +232,12 @@ class PaymentManager( object ):
# We will update our transaction status when we receive the IPN # We will update our transaction status when we receive the IPN
if p.status() == IPN_PAY_STATUS_COMPLETED: if p.status() == IPN_PAY_STATUS_COMPLETED:
print "Execute Success" logger.info("Execute Success")
return True return True
else: else:
transaction.error = p.error() transaction.error = p.error()
print "Execute Error: " + p.error() logger.info("Execute Error: " + p.error())
return False return False
''' '''
@ -248,11 +252,11 @@ class PaymentManager( object ):
p = CancelPreapproval(transaction) p = CancelPreapproval(transaction)
if p.success(): if p.success():
print "Cancel Transaction " + str(transaction.id) + " Completed" logger.info("Cancel Transaction " + str(transaction.id) + " Completed")
return True return True
else: 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() transaction.error = p.error()
return False return False
@ -291,13 +295,13 @@ class PaymentManager( object ):
if p.status() == 'Success': if p.status() == 'Success':
t.reference = p.paykey() t.reference = p.paykey()
t.save() t.save()
print "Authorize Success: " + p.next_url() logger.info("Authorize Success: " + p.next_url())
return t, p.next_url() return t, p.next_url()
else: else:
t.error = p.error() t.error = p.error()
t.save() t.save()
print "Authorize Error: " + p.error() logger.info("Authorize Error: " + p.error())
return t, None return t, None
@ -325,10 +329,10 @@ class PaymentManager( object ):
''' '''
def pledge(self, currency, target, receiver_list, campaign=None, list=None, user=None): 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 # 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, t = Transaction.objects.create(amount=amount,
type=PAYMENT_TYPE_INSTANT, type=PAYMENT_TYPE_INSTANT,
@ -348,13 +352,13 @@ class PaymentManager( object ):
if p.status() == 'CREATED': if p.status() == 'CREATED':
t.reference = p.paykey() t.reference = p.paykey()
t.save() t.save()
print "Pledge Success: " + p.next_url() logger.info("Pledge Success: " + p.next_url())
return t, p.next_url() return t, p.next_url()
else: else:
t.error = p.error() t.error = p.error()
t.save() t.save()
print "Pledge Error: " + p.error() logger.info("Pledge Error: " + p.error())
return t, None return t, None

View File

@ -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']

View File

@ -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']

View File

View File

@ -2,13 +2,14 @@ from django.db import models
from django.contrib.auth.models import User from django.contrib.auth.models import User
from regluit.core.models import Campaign, Wishlist from regluit.core.models import Campaign, Wishlist
from regluit.payment.parameters import * from regluit.payment.parameters import *
from decimal import Decimal
class Transaction(models.Model): class Transaction(models.Model):
type = models.IntegerField(default=PAYMENT_TYPE_NONE, null=False) type = models.IntegerField(default=PAYMENT_TYPE_NONE, null=False)
target = models.IntegerField(default=TARGET_TYPE_NONE, null=False) target = models.IntegerField(default=TARGET_TYPE_NONE, null=False)
status = models.CharField(max_length=32, default='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) currency = models.CharField(max_length=10, default='USD', null=True)
secret = models.CharField(max_length=64, null=True) secret = models.CharField(max_length=64, null=True)
reference = models.CharField(max_length=128, null=True) reference = models.CharField(max_length=128, null=True)
@ -38,7 +39,7 @@ class Transaction(models.Model):
class Receiver(models.Model): class Receiver(models.Model):
email = models.CharField(max_length=64) 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) currency = models.CharField(max_length=10)
status = models.CharField(max_length=64) status = models.CharField(max_length=64)
reason = models.CharField(max_length=64) reason = models.CharField(max_length=64)

View File

@ -1,5 +1,3 @@
from regluit.settings.me import *
PAYMENT_TYPE_NONE = 0 PAYMENT_TYPE_NONE = 0
PAYMENT_TYPE_INSTANT = 1 PAYMENT_TYPE_INSTANT = 1
PAYMENT_TYPE_AUTHORIZATION = 2 PAYMENT_TYPE_AUTHORIZATION = 2
@ -13,4 +11,3 @@ CANCEL_URL = 'paymentcancel'
PREAPPROVAL_PERIOD = 365 # days to ask for in a preapproval PREAPPROVAL_PERIOD = 365 # days to ask for in a preapproval
PAYPAL_COMMISSION = 0.10 PAYPAL_COMMISSION = 0.10

View File

@ -1,4 +1,5 @@
from regluit.payment.parameters import * from regluit.payment.parameters import *
from django.conf import settings
from regluit.payment.models import Transaction from regluit.payment.models import Transaction
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils import simplejson as json from django.utils import simplejson as json
@ -24,6 +25,7 @@ import smtplib
import urlparse import urlparse
import decimal import decimal
logger = logging.getLogger(__name__)
# transaction_type constants # transaction_type constants
IPN_TYPE_PAYMENT = 'Adaptive Payment PAY' IPN_TYPE_PAYMENT = 'Adaptive Payment PAY'
@ -91,18 +93,18 @@ class Pay( object ):
def __init__( self, transaction): def __init__( self, transaction):
headers = { headers = {
'X-PAYPAL-SECURITY-USERID':PAYPAL_USERNAME, 'X-PAYPAL-SECURITY-USERID':settings.PAYPAL_USERNAME,
'X-PAYPAL-SECURITY-PASSWORD':PAYPAL_PASSWORD, 'X-PAYPAL-SECURITY-PASSWORD':settings.PAYPAL_PASSWORD,
'X-PAYPAL-SECURITY-SIGNATURE':PAYPAL_SIGNATURE, 'X-PAYPAL-SECURITY-SIGNATURE':settings.PAYPAL_SIGNATURE,
'X-PAYPAL-APPLICATION-ID':PAYPAL_APPID, 'X-PAYPAL-APPLICATION-ID':settings.PAYPAL_APPID,
'X-PAYPAL-REQUEST-DATA-FORMAT':'JSON', 'X-PAYPAL-REQUEST-DATA-FORMAT':'JSON',
'X-PAYPAL-RESPONSE-DATA-FORMAT':'JSON' 'X-PAYPAL-RESPONSE-DATA-FORMAT':'JSON'
} }
return_url = BASE_URL + COMPLETE_URL return_url = settings.BASE_URL + COMPLETE_URL
cancel_url = BASE_URL + CANCEL_URL cancel_url = settings.BASE_URL + CANCEL_URL
print "Return URL: " + return_url logger.info("Return URL: " + return_url)
print "Cancel URL: " + cancel_url logger.info("Cancel URL: " + cancel_url)
receiver_list = [] receiver_list = []
receivers = transaction.receiver_set.all() receivers = transaction.receiver_set.all()
@ -121,7 +123,7 @@ class Pay( object ):
else: else:
receiver_list.append({'email':r.email,'amount':str(r.amount)}) receiver_list.append({'email':r.email,'amount':str(r.amount)})
print receiver_list logger.info(receiver_list)
data = { data = {
'actionType': 'PAY', 'actionType': 'PAY',
@ -130,7 +132,7 @@ class Pay( object ):
'returnUrl': return_url, 'returnUrl': return_url,
'cancelUrl': cancel_url, 'cancelUrl': cancel_url,
'requestEnvelope': { 'errorLanguage': 'en_US' }, 'requestEnvelope': { 'errorLanguage': 'en_US' },
'ipnNotificationUrl': BASE_URL + 'paypalipn' 'ipnNotificationUrl': settings.BASE_URL + 'paypalipn'
} }
if transaction.reference: if transaction.reference:
@ -138,10 +140,10 @@ class Pay( object ):
self.raw_request = json.dumps(data) self.raw_request = json.dumps(data)
self.raw_response = url_request( PAYPAL_ENDPOINT, "/AdaptivePayments/Pay", data=self.raw_request, headers=headers ).content() self.raw_response = url_request(settings.PAYPAL_ENDPOINT, "/AdaptivePayments/Pay", data=self.raw_request, headers=headers ).content()
print "paypal PAY response was: %s" % self.raw_response logger.info("paypal PAY response was: %s" % self.raw_response)
self.response = json.loads( self.raw_response ) self.response = json.loads( self.raw_response )
print self.response logger.info(self.response)
def status( self ): def status( self ):
if self.response.has_key( 'paymentExecStatus' ): if self.response.has_key( 'paymentExecStatus' ):
@ -152,7 +154,7 @@ class Pay( object ):
def error( self ): def error( self ):
if self.response.has_key('error'): if self.response.has_key('error'):
error = self.response['error'] error = self.response['error']
print error logger.info(error)
return error[0]['message'] return error[0]['message']
else: else:
return 'Paypal PAY: Unknown Error' return 'Paypal PAY: Unknown Error'
@ -164,7 +166,7 @@ class Pay( object ):
return self.response['payKey'] return self.response['payKey']
def next_url( self ): 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): class CancelPreapproval(object):
@ -172,10 +174,10 @@ class CancelPreapproval(object):
def __init__(self, transaction): def __init__(self, transaction):
headers = { headers = {
'X-PAYPAL-SECURITY-USERID':PAYPAL_USERNAME, 'X-PAYPAL-SECURITY-USERID':settings.PAYPAL_USERNAME,
'X-PAYPAL-SECURITY-PASSWORD':PAYPAL_PASSWORD, 'X-PAYPAL-SECURITY-PASSWORD':settings.PAYPAL_PASSWORD,
'X-PAYPAL-SECURITY-SIGNATURE':PAYPAL_SIGNATURE, 'X-PAYPAL-SECURITY-SIGNATURE':settings.PAYPAL_SIGNATURE,
'X-PAYPAL-APPLICATION-ID':PAYPAL_APPID, 'X-PAYPAL-APPLICATION-ID':settings.PAYPAL_APPID,
'X-PAYPAL-REQUEST-DATA-FORMAT':'JSON', 'X-PAYPAL-REQUEST-DATA-FORMAT':'JSON',
'X-PAYPAL-RESPONSE-DATA-FORMAT':'JSON', 'X-PAYPAL-RESPONSE-DATA-FORMAT':'JSON',
} }
@ -186,10 +188,10 @@ class CancelPreapproval(object):
} }
self.raw_request = json.dumps(data) self.raw_request = json.dumps(data)
self.raw_response = url_request(PAYPAL_ENDPOINT, "/AdaptivePayments/CancelPreapproval", data=self.raw_request, headers=headers ).content() self.raw_response = url_request(settings.PAYPAL_ENDPOINT, "/AdaptivePayments/CancelPreapproval", data=self.raw_request, headers=headers ).content()
print "paypal CANCEL PREAPPROBAL response was: %s" % self.raw_response logger.info("paypal CANCEL PREAPPROBAL response was: %s" % self.raw_response)
self.response = json.loads( self.raw_response ) self.response = json.loads( self.raw_response )
print self.response logger.info(self.response)
def success(self): def success(self):
if self.status() == 'Success' or self.status() == "SuccessWithWarning": if self.status() == 'Success' or self.status() == "SuccessWithWarning":
@ -200,7 +202,7 @@ class CancelPreapproval(object):
def error(self): def error(self):
if self.response.has_key('error'): if self.response.has_key('error'):
error = self.response['error'] error = self.response['error']
print error logger.info(error)
return error[0]['message'] return error[0]['message']
else: else:
return 'Paypal Preapproval Cancel: Unknown Error' return 'Paypal Preapproval Cancel: Unknown Error'
@ -216,10 +218,10 @@ class Preapproval( object ):
def __init__( self, transaction, amount ): def __init__( self, transaction, amount ):
headers = { headers = {
'X-PAYPAL-SECURITY-USERID':PAYPAL_USERNAME, 'X-PAYPAL-SECURITY-USERID':settings.PAYPAL_USERNAME,
'X-PAYPAL-SECURITY-PASSWORD':PAYPAL_PASSWORD, 'X-PAYPAL-SECURITY-PASSWORD':settings.PAYPAL_PASSWORD,
'X-PAYPAL-SECURITY-SIGNATURE':PAYPAL_SIGNATURE, 'X-PAYPAL-SECURITY-SIGNATURE':settings.PAYPAL_SIGNATURE,
'X-PAYPAL-APPLICATION-ID':PAYPAL_APPID, 'X-PAYPAL-APPLICATION-ID':settings.PAYPAL_APPID,
'X-PAYPAL-REQUEST-DATA-FORMAT':'JSON', 'X-PAYPAL-REQUEST-DATA-FORMAT':'JSON',
'X-PAYPAL-RESPONSE-DATA-FORMAT':'JSON', 'X-PAYPAL-RESPONSE-DATA-FORMAT':'JSON',
} }
@ -248,10 +250,10 @@ class Preapproval( object ):
} }
self.raw_request = json.dumps(data) self.raw_request = json.dumps(data)
self.raw_response = url_request(PAYPAL_ENDPOINT, "/AdaptivePayments/Preapproval", data=self.raw_request, headers=headers ).content() self.raw_response = url_request(settings.PAYPAL_ENDPOINT, "/AdaptivePayments/Preapproval", data=self.raw_request, headers=headers ).content()
print "paypal PREAPPROVAL response was: %s" % self.raw_response logger.info("paypal PREAPPROVAL response was: %s" % self.raw_response)
self.response = json.loads( self.raw_response ) self.response = json.loads( self.raw_response )
print self.response logger.info(self.response)
def paykey( self ): def paykey( self ):
if self.response.has_key( 'preapprovalKey' ): if self.response.has_key( 'preapprovalKey' ):
@ -260,12 +262,12 @@ class Preapproval( object ):
return None return None
def next_url( self ): 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 ): def error( self ):
if self.response.has_key('error'): if self.response.has_key('error'):
error = self.response['error'] error = self.response['error']
print error logger.info(error)
return error[0]['message'] return error[0]['message']
else: else:
return 'Paypal Preapproval: Unknown Error' return 'Paypal Preapproval: Unknown Error'
@ -285,7 +287,7 @@ class IPN( object ):
# verify that the request is paypal's # verify that the request is paypal's
self.error = None 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()) data=urllib.urlencode(request.POST.copy())
req = urllib2.Request(url, data) req = urllib2.Request(url, data)
response = urllib2.urlopen(req) response = urllib2.urlopen(req)
@ -345,6 +347,6 @@ class IPN( object ):
transdict = IPN.slicedict(request.POST, 'transaction[%s].' % transaction_num) transdict = IPN.slicedict(request.POST, 'transaction[%s].' % transaction_num)
if len(transdict) > 0: if len(transdict) > 0:
self.transactions.append(transdict) self.transactions.append(transdict)
print transdict logger.info(transdict)

View File

@ -8,5 +8,6 @@ urlpatterns = patterns(
url(r"^testcancel", "testCancel"), url(r"^testcancel", "testCancel"),
url(r"^querycampaign", "queryCampaign"), url(r"^querycampaign", "queryCampaign"),
url(r"^paypalipn", "paypalIPN"), url(r"^paypalipn", "paypalIPN"),
url(r"^runtests", "runTests") url(r"^runtests", "runTests"),
url(r"^paymentcomplete","paymentcomplete")
) )

View File

@ -11,6 +11,14 @@ from unittest import TestResult
from regluit.payment.tests import PledgeTest, AuthorizeTest from regluit.payment.tests import PledgeTest, AuthorizeTest
import traceback 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 http://BASE/querycampaign?id=2
@ -51,7 +59,7 @@ def testExecute(request):
for t in result: for t in result:
output += str(t) output += str(t)
print str(t) logger.info(str(t))
else: else:
transactions = Transaction.objects.filter(status='ACTIVE') transactions = Transaction.objects.filter(status='ACTIVE')
@ -59,12 +67,12 @@ def testExecute(request):
for t in transactions: for t in transactions:
# Note, set this to 1-5 different receivers with absolute amounts for each # 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}, receiver_list = [{'email':TEST_RECEIVERS[0], 'amount':t.amount * 0.80},
{'email':'seller_1317463643_biz@gmail.com', 'amount':t.amount * 0.20}] {'email':TEST_RECEIVERS[1], 'amount':t.amount * 0.20}]
p.execute_transaction(t, receiver_list) p.execute_transaction(t, receiver_list)
output += str(t) output += str(t)
print str(t) logger.info(str(t))
return HttpResponse(output) return HttpResponse(output)
@ -90,8 +98,8 @@ def testAuthorize(request):
# Note, set this to 1-5 different receivers with absolute amounts for each # Note, set this to 1-5 different receivers with absolute amounts for each
receiver_list = [{'email':'jakace_1309677337_biz@gmail.com', 'amount':20.00}, receiver_list = [{'email': TEST_RECEIVERS[0], 'amount':20.00},
{'email':'seller_1317463643_biz@gmail.com', 'amount':10.00}] {'email': TEST_RECEIVERS[1], 'amount':10.00}]
if campaign_id: if campaign_id:
campaign = Campaign.objects.get(id=int(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) t, url = p.authorize('USD', TARGET_TYPE_NONE, amount, campaign=None, list=None, user=None)
if url: if url:
print "testAuthorize: " + url logger.info("testAuthorize: " + url)
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
else: else:
response = t.reference response = t.reference
print "testAuthorize: Error " + str(t.reference) logger.info("testAuthorize: Error " + str(t.reference))
return HttpResponse(response) return HttpResponse(response)
''' '''
@ -144,8 +152,8 @@ def testPledge(request):
# Note, set this to 1-5 different receivers with absolute amounts for each # Note, set this to 1-5 different receivers with absolute amounts for each
receiver_list = [{'email':'jakace_1309677337_biz@gmail.com', 'amount':20.00}, #receiver_list = [{'email':TEST_RECEIVERS[0], 'amount':20.00},{'email':TEST_RECEIVERS[1], 'amount':10.00}]
{'email':'seller_1317463643_biz@gmail.com', 'amount':10.00}] receiver_list = [{'email':TEST_RECEIVERS[0], 'amount':78.90}, {'email':TEST_RECEIVERS[1], 'amount':34.56}]
if campaign_id: if campaign_id:
campaign = Campaign.objects.get(id=int(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) t, url = p.pledge('USD', TARGET_TYPE_NONE, receiver_list, campaign=None, list=None, user=None)
if url: if url:
print "testPledge: " + url logger.info("testPledge: " + url)
return HttpResponseRedirect(url) return HttpResponseRedirect(url)
else: else:
response = t.reference response = t.reference
print "testPledge: Error " + str(t.reference) logger.info("testPledge: Error " + str(t.reference))
return HttpResponse(response) return HttpResponse(response)
def runTests(request): def runTests(request):
@ -184,7 +192,7 @@ def runTests(request):
test.run(result) test.run(result)
output = "Tests Run: " + str(result.testsRun) + str(result.errors) + str(result.failures) output = "Tests Run: " + str(result.testsRun) + str(result.errors) + str(result.failures)
print output logger.info(output)
return HttpResponse(output) return HttpResponse(output)
@ -198,6 +206,13 @@ def paypalIPN(request):
p = PaymentManager() p = PaymentManager()
p.processIPN(request) p.processIPN(request)
print str(request.POST) logger.info(str(request.POST))
return HttpResponse("ipn") 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)

View File

@ -8,3 +8,5 @@ django-social-auth
selenium selenium
django-nose-selenium django-nose-selenium
nose nose
django-profiles
MySQL-python

45
settings/prod.py Normal file
View File

@ -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!'