goodcloud / django-zebra Goto Github PK
View Code? Open in Web Editor NEWForms, widgets, template tags and examples that make Stripe + Django easier.
License: MIT License
Forms, widgets, template tags and examples that make Stripe + Django easier.
License: MIT License
With Django 1.5 the profile functionality was deprecated in favor of the new custom user model implementation. In my app, I'm using a custom user model for authentication. Currently I'm using Django 1.6.2
When trying to run the example code for stripe:
class UpgradeView(View):
form_class = StripePaymentForm
template = 'account/checkout.html'
def get(self, request, *args, **kwargs):
return render(request, self.template, {'form': self.form_class()})
def post(self, request, *args, **kwargs):
zebra_form = StripePaymentForm(request.POST)
if zebra_form.is_valid():
my_profile = request.user.get_profile()
stripe_customer = stripe.Customer.retrieve(my_profile.stripe_customer_id)
stripe_customer.card = zebra_form.cleaned_data['stripe_token']
stripe_customer.save()
my_profile.last_4_digits = zebra_form.cleaned_data['last_4_digits']
my_profile.stripe_customer_id = stripe_customer.id
my_profile.save()
return render(request, self.template, {'form': zebra_form})
I get an exception saying my custom user model doesn't have the method "get_profile()". Do I need to add some mixins to my user class or just use a profile model anyway?
Here's a copy of my user model and it's manager just in case, note the inclusion of data that would normally be in the profile:
class WUserManager(BaseUserManager):
def create_user(self, email, password=None):
"""
Creates and saves a User with the given email and password.
"""
if not email:
raise ValueError('Users must have an email address')
user = self.model(
email=self.normalize_email(email),
)
user.set_password(password)
user.save(using=self._db)
return user
def create_superuser(self, email, password):
"""
Creates and saves a superuser with the given email and password.
"""
user = self.create_user(email,
password=password,
)
user.is_admin = True
user.save(using=self._db)
return user
class WUser(AbstractBaseUser):
email = models.EmailField(
verbose_name='email address',
max_length=255,
unique=True,
db_index=True,
)
first_name = models.CharField(max_length=100, null=True, blank=True)
last_name = models.CharField(max_length=150, null=True, blank=True)
address = models.CharField(max_length=200, null=True, blank=True)
city = models.CharField(max_length=100, null=True, blank=True)
state = models.CharField(max_length=50, null=True, blank=True)
zip = models.PositiveIntegerField(max_length=5, null=True, blank=True)
account_type = models.CharField(max_length=20)
created = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
is_admin = models.BooleanField(default=False)
objects = WUserManager()
USERNAME_FIELD = 'email'
REQUIRED_FIELDS = []
def get_full_name(self):
# The user is identified by their email address
if self.first_name and self.last_name:
return self.first_name + ' ' + self.last_name
return self.email
def get_short_name(self):
# The user is identified by their email address
if self.first_name:
return self.first_name
return self.email.split('@')[0]
def get_license_status(self):
try:
license = self.license
except License.DoesNotExist:
license = None
if license is not None and isinstance(license, License):
return True
return False
# On Python 3: def __str__(self):
def __unicode__(self):
return self.email
def has_perm(self, perm, obj=None):
return True
def has_module_perms(self, app_label):
return True
@property
def is_staff(self):
return self.is_admin
class Meta:
verbose_name = 'User'
verbose_name_plural = 'Users'
We should be using stripe.js version 2 instead of version 1.
It looks like this project is dead. I've tried to contact GoodCloud, but they have not responded to any emails / pull requests.
I have a fork over here that has a few small updates and removed some deprecated functionality that I don't anyone is still using. If anyone is interested I can submit that to PyPi and we can make it the new "master". If anyone else has a good fork, I'm all for using that instead.
Thoughts? GoodCloud are you there?
Another thing that will increase usage is Sphinx for better documentation. And hosting of those docs on rtfd.org
Line 19:
$("button[type=submit]").attr("disabled","disabled").html("Submitting..")
and Line 30
return true
Are both missing semicolons.
Since the events have to do with billing, what is the best way to validate the webhook?
https://github.com/GoodCloud/django-zebra/blob/master/zebra/views.py#L59
Would it make sense to pull the id from the event object and re-request it from stripe so it is guaranteed to be official? Then pass the event object we pulled from stripe to the signal listeners.
actions done
INSTALLED_APPS
re_path(r'zebra/', include(('zebra.urls', 'zebra'), namespace="zebra",)),
ZEBRA_ENABLE_APP
set to True./manage.py makemigrations
, got error File "project_name/manage.py", line 11, in <module>
execute_from_command_line(sys.argv)
File "/home/aditya/dev/cn/pmx_env/lib/python3.7/site-packages/django/core/management/__init__.py", line 381, in execute_from_command_line
utility.execute()
File "/home/aditya/dev/cn/pmx_env/lib/python3.7/site-packages/django/core/management/__init__.py", line 357, in execute
django.setup()
File "/home/aditya/dev/cn/pmx_env/lib/python3.7/site-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "/home/aditya/dev/cn/pmx_env/lib/python3.7/site-packages/django/apps/registry.py", line 114, in populate
app_config.import_models()
File "/home/aditya/dev/cn/pmx_env/lib/python3.7/site-packages/django/apps/config.py", line 211, in import_models
self.models_module = import_module(models_module_name)
File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "/home/aditya/dev/cn/pmx_env/lib/python3.7/site-packages/zebra/models.py", line 51, in <module>
class Subscription(DatesModelBase, StripeSubscription):
File "/home/aditya/dev/cn/pmx_env/lib/python3.7/site-packages/zebra/models.py", line 52, in Subscription
customer = models.ForeignKey(Customer)
TypeError: __init__() missing 1 required positional argument: 'on_delete'```
Auditing a customer subscription for a newly created customer object fails when subscription data has not been created. It looks like Customer.subscription is null on creation and if this isnt updated before audit_customer_subscription it fails because subscription doesnt have a status.
*** AttributeError: 'NoneType' object has no attribute 'status'
The version on PyPi doesn't v2 webhooks.
In the update view (in the marty app), where is stripe_id in user.stripe_id coming from on line 24?
https://github.com/GoodCloud/django-zebra/blob/master/zebra_sample_project/marty/views.py
I am following this example, but when I submit the payment form I get this error:
"'User' object has no attribute 'stripe_id'"
Using 4242424242424242 as a test card, there should be comprehensive test coverage of this project. Otherwise it is hard to recommend to clients and customers.
Using Django 1.9.4 with mezzanine 4.1.0.
Upon installation (zebra was under INSTALLED_APPS, included URLS, had the Stripe API keys, and had ZEBRA_ENABLE_APP set to true), the necessary tables in my PostgreSQL table were not created by a normal manage.py makemigrations
but I had to run makemigrations zebra
in order to get this to work.
This is a bigger problem than django-zebra, but I wanted to post this here anyways because I figured some better minds might be able to help work through the problem.
This question roughly mirrors the problem I've been having. We integrated Stripe and Zebra into our site. When I test submit on an iPad, it'll prompt to save the credit card. When you press any of the buttons, it breaks the submit process. The $("button[type=submit]").attr("disabled","disabled").html("Submitting..")
line has been fired, so you can't click again, but the submit process never moves forward.
The most obvious answer would be to change the name of the credit card field to something that iOS wouldn't recognize; but overriding forms.py
doesn't feel like a very good solution. Not sure if sidestepping the feature is a great solution anyways; ideally; we'd come up with something that detects the problem and addresses it directly. Not sure if there's a way to use JS to monitor the submit process to allow for a second submit in a situation like this?
I'll continue to research the problem on my own, but any help is appreciated! iOS is pretty big for mobile commerce these days, so I'm sure I'm not gonna be the only one who has this problem.
Have installed the app and it is almost working correctly, however its not clear from the docs or sample app what fields I should add to my user profiles?
From the form blurb I see:
user.stripe_id, profile.last_4_digits, profile.stripe_customer_id
Would appreciate some guidance on where these come from and how to define these.
Webhooks are throwing exceptions since upgrading to Django 1.6.
According to the Django Deprecation Timeline for 1.6, The attribute HttpRequest.raw_post_data was renamed to HttpRequest.body in 1.4. The backward compatibility will be removed โ HttpRequest.raw_post_data will no longer work.
Stacktrace (most recent call last):
File "django/core/handlers/base.py", line 114, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "newrelic/hooks/framework_django.py", line 485, in wrapper
return wrapped(*args, **kwargs)
File "django/views/decorators/csrf.py", line 57, in wrapped_view
return view_func(*args, **kwargs)
File "zebra/views.py", line 67, in webhooks_v2
event_json = simplejson.loads(request.raw_post_data)
Looks like changing request.raw_post_data
to request.body
will fix the problem. Might need to add sniffing for older versions of Django...
Hi,
Any plans of supporting these "transfer" events:
Is the assumption that if we don't receive transfer.failed, then it was successful? Also, what if there was a usecase to execute a task upon receiving a transfer.created hook - how can we handle that today?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.