• Stars
    star
    158
  • Rank 237,131 (Top 5 %)
  • Language
    Python
  • Created about 12 years ago
  • Updated 8 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Django fields for the prices module

django-prices: Django fields for the prices module

Build Status codecov.io

Installation

  • pip install django-prices
  • Add django_prices to your INSTALLED_APPS at settings.py
  • Follow enmerkar instructions and update both your INSTALLED_APPS and MIDDLEWARE_CLASSES.

Features

Provides support for models:

from django.db import models
from django_prices.models import MoneyField, TaxedMoneyField


class Model(models.Model):
    currency = models.CharField(max_length=3, default="BTC")
    price_net_amount = models.DecimalField(max_digits=9, decimal_places=2, default="5")
    price_net = MoneyField(amount_field="price_net_amount", currency_field="currency")
    price_gross_amount = models.DecimalField(
        max_digits=9, decimal_places=2, default="5"
    )
    price_gross = MoneyField(
        amount_field="price_gross_amount", currency_field="currency"
    )
    price = TaxedMoneyField(
        net_amount_field="price_net_amount",
        gross_amount_field="price_gross_amount",
        currency="currency",
    )

And forms:

from django import forms

from django_prices.forms import MoneyField

AVAILABLE_CURRENCIES = ["BTC", "USD"]


class ProductForm(forms.Form):
    name = forms.CharField(label="Name")
    price_net = MoneyField(label="net", available_currencies=AVAILABLE_CURRENCIES)

And validators:

from django import forms
from prices.forms import Money

from django_prices.forms import MoneyField
from django_prices.validators import (
    MaxMoneyValidator, MinMoneyValidator, MoneyPrecisionValidator)


class DonateForm(forms.Form):
    donator_name = forms.CharField(label="Your name")
    donation = MoneyField(
        label="net",
        available_currencies=["BTC", "USD"],
        max_digits=9,
        decimal_places=2,
        validators=[
            MoneyPrecisionValidator(),
            MinMoneyValidator(Money(5, "USD")),
            MaxMoneyValidator(Money(500, "USD")),
        ],
    )

It also provides support for templates:

{% load prices %}

<p>Price: {{ foo.price.gross|amount }} ({{ foo.price.net|amount }} + {{ foo.price.tax|amount }} tax)</p>

You can also use HTML output from prices template tags, they will wrap currency symbol in a <span> element:

{% load prices %}

<p>Price: {{ foo.price.gross|amount:'html' }} ({{ foo.price.net|amount:'html' }} + {{ foo.price.tax|amount:'html' }} tax)</p>

It will be rendered as a following structure (for example with English locale):

<span class="currency">$</span>15.00

How to migrate to django-prices 2.0

Version 2.0 introduces major changes to how prices data is stored in models, enabling setting price's currency per model instance.

Steps to migrate:

  1. In your forms:

    • remove the currency argument
    • add available_currencies with available choices.

    If the form specified MoneyFields in fields option, replace those with explicit declarations instead:

    AVAILABLE_CURRENCIES = [("BTC", "bitcoins"), ("USD", "US dollar")]
    
    class ModelForm(forms.ModelForm):
        class Meta:
            model = models.Model
            fields = []
    
        price_net = MoneyField(available_currencies=AVAILABLE_CURRENCIES)
  2. In your models using MoneyField:

    • Replace all occurrences of the MoneyField class with DecimalField

    • Remove the currency argument from them

    • Change default from Money instance to value acceptable by Decimal field

      Example of code:

      price_net = MoneyField(
          "net", currency="BTC", default=Money("5", "BTC"), max_digits=9, decimal_places=2
      )

      Updated code:

      price_net = models.DecimalField("net", default="5", max_digits=9, decimal_places=2)
  3. In your migration files:

    • Replace all occurrences of the MoneyField class with DecimalField

    • Remove the currency argument from them

    • Change default from Money instance to value acceptable by Decimal field

      field = django_prices.models.MoneyField(currency='BTC', decimal_places=2, default='5', max_digits=9, verbose_name='net')

      Updated code:

      field = models.DecimalField(decimal_places=2, default='5', max_digits=9, verbose_name='net')
  4. Rename fields in models. Your old field will still store amount of money, so probably the best choice would be price_net_amount instead price_net.

  5. All places which use Models and it's fields can prevent django app from even starting the code. Possible issues: code tries to access non existing fields. Exclude those fields for now from your ModelForms, Graphene types etc.

  6. Run python manage.py makemigrations. Make sure to do this step before adding new MoneyFields to model! If not, django will generate delete/create migrations instead of rename.

  7. Run python manage.py migrate.

  8. Update django-prices.

  9. Add models.CharField for currency and MoneyField to your models:

    currency = models.CharField(max_length=3, default="BTC")
    price_net_amount = models.DecimalField("net", default="5", max_digits=9, decimal_places=2)
    price_net = MoneyField(amount_field="price_net_amount", currency_field="currency")
  10. Run python manage.py makemigrations and python manage.py migrate.

  11. Change TaxedMoneyField declaration:

    price = TaxedMoneyField(
        net_amount_field="price_net_amount",
        gross_amount_field="price_gross_amount",
        currency="currency",
    )
  12. Remember to address changes in previously edited ModelForms

More Repositories

1

ariadne

Python library for implementing GraphQL servers using schema-first approach.
Python
2,191
star
2

satchless

E-commerce for Python
Python
783
star
3

prices

Python price handling for humans.
Python
268
star
4

ariadne-codegen

Generate fully typed Python client for any GraphQL API from schema, queries and mutations
Python
265
star
5

google-i18n-address

Google's i18n address data packaged for Python.
Python
137
star
6

google-measurement-protocol

A Python implementation of Google Analytics Measurement Protocol
Python
103
star
7

ariadne-django

ariadne_django makes integrating ariadne and django together easier.
Python
64
star
8

django-images

A database-driven thumbnailing solution for Django
Python
63
star
9

django-messages

A Django application handling private messages between users.
Python
53
star
10

saleor-app-framework-python

Python Saleor App/Extension boilerplate. Batteries included.
Python
50
star
11

ariadne-graphql-modules

Ariadne package for implementing Ariadne GraphQL schemas using modular approach.
Python
36
star
12

chromedebug

A Chrome remote debugging protocol server for Python
Python
36
star
13

django-prices-openexchangerates

openexchangerates.org support for django-prices
Python
33
star
14

ariadne-website

The code that powers Ariadne website
JavaScript
24
star
15

serverless-saleor-app-example

Example implementation of Saleor app using AWS Lambda
Python
18
star
16

gql-federation-gateway

Simple gateway for Apollo Federation with JWT
JavaScript
18
star
17

django-offsite-storage

Cloud static and media file storage suitable for app containers
Python
17
star
18

django-prices-vatlayer

Vatlayer API support for django-prices
Python
15
star
19

bestest

Some of the bestestâ„¢ and cleverestestâ„¢ code out there
Python
14
star
20

django-voice

A simple user feedback application for your Django project
Python
14
star
21

ariadne-graphql-proxy

Ariadne toolkit for building GraphQL proxies.
Python
14
star
22

legacy-views

A legacy fork of Saleor that contains the old storefront and dashboard code
Python
14
star
23

graphql-workshop

A GraphQL workshop for DjangoCon EU 2019
Python
13
star
24

django-bootstrap-mockups

A template mocking tool for Django
Python
11
star
25

django-ariadne-deprecated

Django bindings for the Ariadne GraphQL library.
11
star
26

overv.io-beta

Private beta feedback
10
star
27

trapecssoid

CSS-based trapezoid blocks
CSS
10
star
28

saleor-demo

Saleor's demo setup
HTML
10
star
29

lynara

Python ASGI applications in an AWS Lambda runtime
Python
9
star
30

ariadne-lambda

Python
5
star
31

ariadne-graphql-chat-example

Simple Chat application using Ariadne and GraphQL Subscriptions
JavaScript
4
star
32

subgraph-template-ariadne-fastapi

Python
4
star
33

saleor-sdk-python

Python
4
star
34

smyth

A versatile tool that enhances your AWS Lambda development experience.
Python
4
star
35

opentracing-asgi

ASGI middleware reporting to the OpenTracing API
Python
3
star
36

saleor-product-mockups

Free Saleor product templates
3
star
37

codeclimate-isort

An isort plugin for codeclimate
Python
3
star
38

python-invoicible

Invoicible/CentrumFaktur library that provides pure Python interface to CentrumFaktur API
Python
2
star
39

saleor-graphql-deprecations

Deprecations tracker for Saleor's GraphQL API
Python
1
star
40

graphql-wroclaw-website

GraphQL Wrocław Meetup
JavaScript
1
star
41

overv.io-splash

Overv.io public webpage
HTML
1
star
42

js-invoicible

Invoicible/CentrumFaktur library that provides JavaScript interface to CentrumFaktur API
JavaScript
1
star
43

aws_secrets_cache

Cache AWS Secrets
Python
1
star
44

saleor-contentful-app

TypeScript
1
star
45

saleor-algolia-demo

Python
1
star