Added orders and prices apps

This commit is contained in:
Marc 2014-05-27 15:55:09 +00:00
parent f699fed511
commit 5d36dbd02d
18 changed files with 520 additions and 109 deletions

View file

@ -41,3 +41,5 @@ Remember that, as always with QuerySets, any subsequent chained methods which im
* profile select_related vs prefetch_related
* use HTTP OPTIONS instead of configuration endpoint, or rename to settings?
* Log changes from rest api (serialized objects)

View file

@ -50,6 +50,12 @@ def get_accounts():
tokens = reverse('admin:authtoken_token_changelist')
users.append(items.MenuItem(_("Tokens"), tokens))
accounts.append(items.MenuItem(_("Users"), url, children=users))
if isinstalled('orchestra.apps.prices'):
url = reverse('admin:prices_price_changelist')
accounts.append(items.MenuItem(_("Prices"), url))
if isinstalled('orchestra.apps.orders'):
url = reverse('admin:orders_order_changelist')
accounts.append(items.MenuItem(_("Orders"), url))
return accounts

View file

@ -1,8 +0,0 @@
Orders
======
Build an asyclic graph with every `model.save()` and `model.delete()` looking for Service.content_type matches.
`ORDERS_GRAPH_MAX_DEPTH`
autodiscover contacts by looking for `contact` atribute on related objects with reverse relationship `null=False`

View file

@ -0,0 +1,15 @@
from django.contrib import admin
from .models import Order, QuotaStorage
class OrderAdmin(admin.ModelAdmin):
pass
class QuotaStorageAdmin(admin.ModelAdmin):
pass
admin.site.register(Order, OrderAdmin)
admin.site.register(QuotaStorage, QuotaStorageAdmin)

View file

@ -1,29 +0,0 @@
from . import settings
class Node(object):
def __init__(self, content):
self.content = content
self.parents = []
self.path = []
def __repr__(self):
return "%s:%s" % (type(self.content).__name__, self.content)
class Collector(object):
def __init__(self, obj, cascade_only=False):
self.obj = obj
self.cascade_only = cascade_only
def collect(self):
depth = settings.ORDERS_COLLECTOR_MAX_DEPTH
return self._rec_collect(self.obj, [self.obj], depth)
def _rec_collect(self, obj, path, depth):
node = Node(content=obj)
# FK lookups
for field in obj._meta.fields:
if hasattr(field, 'related') and (self.cascade_only or not field.null):
related_object = getattr(obj, field.name)

View file

@ -1,36 +1,35 @@
from django.db import models
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType
from django.db import models
from django.utils.translation import ugettext as _
from django.utils.translation import ugettext_lazy as _
from . import settings
class Service(models.Model):
name = models.CharField(_("name"), max_length=256)
content_type = models.ForeignKey(ContentType, verbose_name=_("content_type"))
match = models.CharField(_("expression"), max_length=256)
def __unicode__(self):
return self.name
class Order(models.Model):
contact = models.ForeignKey(settings.ORDERS_CONTACT_MODEL,
verbose_name=_("contact"), related_name='orders')
account = models.ForeignKey('accounts.Account', verbose_name=_("account"),
related_name='orders')
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField(null=True)
service = models.ForeignKey(Service, verbose_name=_("service"),
related_name='orders'))
price = models.ForeignKey(settings.ORDERS_PRICE_MODEL,
verbose_name=_("price"), related_name='orders')
registered_on = models.DateTimeField(_("registered on"), auto_now_add=True)
canceled_on = models.DateTimeField(_("canceled on"), null=True, blank=True)
last_billed_on = models.DateTimeField(_("last billed on"), null=True, blank=True)
cancelled_on = models.DateTimeField(_("cancelled on"), null=True, blank=True)
billed_on = models.DateTimeField(_("billed on"), null=True, blank=True)
billed_until = models.DateTimeField(_("billed until"), null=True, blank=True)
ignore = models.BooleanField(_("ignore"), default=False)
description = models.CharField(_("description"), max_length=256, blank=True)
description = models.TextField(_("description"), blank=True)
content_object = generic.GenericForeignKey()
def __unicode__(self):
return "%s@%s" (self.service, self.contact)
return self.service
class QuotaStorage(models.Model):
order = models.ForeignKey(Order, verbose_name=_("order"))
value = models.BigIntegerField(_("value"))
date = models.DateTimeField(_("date"))
def __unicode__(self):
return self.order

View file

@ -1,7 +1,5 @@
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
ORDERS_CONTACT_MODEL = getattr(settings, 'ORDERS_CONTACT_MODEL', 'contacts.Contact')
ORDERS_COLLECTOR_MAX_DEPTH = getattr(settings, 'ORDERS_COLLECTOR_MAX_DEPTH', 3)
ORDERS_PRICE_MODEL = getattr(settings, 'ORDERS_PRICE_MODEL', 'prices.Price')

View file

@ -1,21 +0,0 @@
from django.db import models
class Root(models.Model):
name = models.CharField(max_length=256, default='randomname')
class Related(models.Model):
root = models.ForeignKey(Root)
class TwoRelated(models.Model):
related = models.ForeignKey(Related)
class ThreeRelated(models.Model):
twolated = models.ForeignKey(TwoRelated)
class FourRelated(models.Model):
threerelated = models.ForeignKey(ThreeRelated)

View file

@ -1,28 +0,0 @@
from django.conf import settings
from django.core.management import call_command
from django.db.models import loading
from django.test import TestCase
from .models import Root, Related, TwoRelated, ThreeRelated, FourRelated
#class CollectorTests(TestCase):
# def setUp(self):
# self.root = Root.objects.create(name='randomname')
# self.related = Related.objects.create(top=self.root)
#
# def _pre_setup(self):
# # Add the models to the db.
# self._original_installed_apps = list(settings.INSTALLED_APPS)
# settings.INSTALLED_APPS += ('orchestra.apps.orders.tests',)
# loading.cache.loaded = False
# call_command('syncdb', interactive=False, verbosity=0)
# super(CollectorTests, self)._pre_setup()
#
# def _post_teardown(self):
# super(CollectorTests, self)._post_teardown()
# settings.INSTALLED_APPS = self._original_installed_apps
# loading.cache.loaded = False
# def test_models(self):
# self.assertEqual('randomname', self.root.name)

View file

@ -0,0 +1,23 @@
from django.contrib import admin
from orchestra.core import services
from .models import Pack, Price, Rate
class RateInline(admin.TabularInline):
model = Rate
class PriceAdmin(admin.ModelAdmin):
inlines = [RateInline]
def formfield_for_dbfield(self, db_field, **kwargs):
""" Improve performance of account field and filter by account """
if db_field.name == 'service':
models = [model._meta.model_name for model in services.get().keys()]
kwargs['queryset'] = db_field.rel.to.objects.filter(model__in=models)
return super(PriceAdmin, self).formfield_for_dbfield(db_field, **kwargs)
admin.site.register(Price, PriceAdmin)

View file

@ -0,0 +1,42 @@
from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.utils.translation import ugettext_lazy as _
from . import settings
class Pack(models.Model):
account = models.ForeignKey('accounts.Account', verbose_name=_("account"),
related_name='packs')
name = models.CharField(_("pack"), max_length=128,
choices=settings.PRICES_PACKS,
default=settings.PRICES_DEFAULT_PACK)
def __unicode__(self):
return self.pack
class Price(models.Model):
description = models.CharField(_("description"), max_length=256, unique=True)
service = models.ForeignKey(ContentType, verbose_name=_("service"))
expression = models.CharField(_("match"), max_length=256)
tax = models.IntegerField(_("tax"), choices=settings.PRICES_TAXES,
default=settings.PRICES_DEFAUL_TAX)
active = models.BooleanField(_("is active"), default=True)
def __unicode__(self):
return self.description
class Rate(models.Model):
price = models.ForeignKey('prices.Price', verbose_name=_("price"))
pack = models.CharField(_("pack"), max_length=128, blank=True,
choices=(('', _("default")),) + settings.PRICES_PACKS)
quantity = models.PositiveIntegerField(_("quantity"), null=True, blank=True)
value = models.DecimalField(_("price"), max_digits=12, decimal_places=2)
class Meta:
unique_together = ('price', 'pack', 'quantity')
def __unicode__(self):
return self.price

View file

@ -0,0 +1,19 @@
from django.conf import settings
from django.utils.translation import ugettext_lazy as _
PRICES_PACKS = getattr(settings, 'PRICES_PACKS', (
('basic', _("Basic")),
('advanced', _("Advanced")),
))
PRICES_DEFAULT_PACK = getattr(settings, 'PRICES_DEFAULT_PACK', 'basic')
PRICES_TAXES = getattr(settings, 'PRICES_TAXES', (
(0, _("Duty free")),
(7, _("7%")),
(21, _("21%")),
))
PRICES_DEFAUL_TAX = getattr(settings, 'PRICES_DFAULT_TAX', 0)

View file

@ -76,6 +76,8 @@ INSTALLED_APPS = (
'orchestra.apps.databases',
'orchestra.apps.vps',
'orchestra.apps.issues',
'orchestra.apps.prices',
'orchestra.apps.orders',
# Third-party apps
'south',
@ -136,6 +138,8 @@ FLUENT_DASHBOARD_APP_GROUPS = (
'orchestra.apps.accounts.models.Account',
'orchestra.apps.contacts.models.Contact',
'orchestra.apps.users.models.User',
'orchestra.apps.orders.models.Order',
'orchestra.apps.prices.models.Price',
),
'collapsible': True,
}),
@ -167,6 +171,8 @@ FLUENT_DASHBOARD_APP_ICONS = {
# Accounts
'accounts/account': 'Face-monkey.png',
'contacts/contact': 'contact.png',
'orders/order': 'shopping-cart.png',
'prices/price': 'price.png',
# Administration
'users/user': 'Mr-potato.png',
'djcelery/taskstate': 'taskstate.png',

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
id="Your_Icon"
x="0px"
y="0px"
width="48"
height="48"
viewBox="0 0 48 48"
enable-background="new 0 0 100 100"
xml:space="preserve"
inkscape:version="0.48.3.1 r9886"
sodipodi:docname="price.svg"
inkscape:export-filename="/home/glic3rinu/orchestra/django-orchestra/orchestra/static/orchestra/icons/price.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata11"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs9"><filter
inkscape:collect="always"
id="filter3785"
x="-0.13714286"
width="1.2742857"
y="-0.96000003"
height="2.9200001"><feGaussianBlur
inkscape:collect="always"
stdDeviation="1.7378048"
id="feGaussianBlur3787" /></filter><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient2305"
id="radialGradient2311"
cx="-6"
cy="37.75"
fx="-6"
fy="37.75"
r="14"
gradientTransform="matrix(1,0,0,0.267857,0,27.63839)"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="always"
id="linearGradient2305"><stop
style="stop-color:#000000;stop-opacity:1;"
offset="0"
id="stop2307" /><stop
style="stop-color:#000000;stop-opacity:0;"
offset="1"
id="stop2309" /></linearGradient><radialGradient
r="14"
fy="37.75"
fx="-6"
cy="37.75"
cx="-6"
gradientTransform="matrix(1,0,0,0.267857,0,27.63839)"
gradientUnits="userSpaceOnUse"
id="radialGradient3043"
xlink:href="#linearGradient2305"
inkscape:collect="always" /></defs><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1024"
id="namedview7"
showgrid="false"
inkscape:zoom="6.675088"
inkscape:cx="15.760113"
inkscape:cy="22.890176"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="Your_Icon" />
<path
sodipodi:type="arc"
style="opacity:0.48453608;color:#000000;fill:url(#radialGradient3043);fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible"
id="path2303"
sodipodi:cx="-6"
sodipodi:cy="37.75"
sodipodi:rx="14"
sodipodi:ry="3.75"
d="m 8,37.75 a 14,3.75 0 1 1 -28,0 14,3.75 0 1 1 28,0 z"
transform="matrix(1.535714,0,0,1.51296,29.034195,-15.256481)" /><g
id="g3"
style="fill:#555753"
transform="matrix(0.56980085,-0.08926081,0.08926081,0.56980085,-7.4328135,-0.07503521)">
<path
d="m 92.489,14.705 c -0.77,-0.39 -1.696,-0.084 -2.085,0.679 -3.969,7.806 -7.123,7.317 -12.35,6.521 -3.248,-0.497 -7.289,-1.114 -12.139,0.37 -2.586,0.793 -4.882,2.757 -6.768,4.938 L 55.141,23.209 H 41.976 l -35.102,35.1 26.33,26.327 35.1,-35.098 V 36.371 l -6.948,-6.95 c 1.616,-1.921 3.495,-3.571 5.471,-4.178 4.172,-1.282 7.678,-0.745 10.76,-0.273 5.456,0.837 10.602,1.625 15.581,-8.181 0.388,-0.763 0.084,-1.696 -0.679,-2.084 M 45.114,52.634 c -0.743,-0.849 -2.128,-2.458 -4.824,-3.618 -2.424,-1.038 -3.673,-0.294 -4.118,0.755 -0.519,1.196 0.44,2.575 3.15,5.113 3.778,3.479 4.655,6.287 3.198,9.687 -1.431,3.325 -4.963,5.166 -9.566,4.036 l -1.654,3.848 -3.693,-1.588 1.521,-3.551 c -2.46,-1.185 -4.578,-2.939 -5.666,-4.334 l 2.998,-3.88 c 1.202,1.524 3.067,3.256 5.495,4.302 2.168,0.924 3.996,0.694 4.62,-0.763 0.612,-1.423 -0.206,-2.828 -2.601,-4.967 -3.423,-3.057 -5.349,-6.096 -3.793,-9.72 1.424,-3.325 4.849,-4.909 9.163,-3.938 l 1.521,-3.551 3.659,1.569 -1.404,3.286 c 2.43,1.136 3.872,2.417 4.926,3.574 l -2.932,3.74 z M 59.529,31.98 c 2.422,2.425 2.422,6.357 0,8.778 -1.215,1.209 -2.799,1.815 -4.387,1.815 -1.588,0 -3.178,-0.606 -4.388,-1.819 -2.423,-2.419 -2.423,-6.35 0,-8.775 1.21,-1.211 2.798,-1.813 4.383,-1.813 0.538,0 1.074,0.094 1.6,0.232 -0.703,1.054 -1.297,2.058 -1.768,2.903 -0.76,0.04 -1.479,0.33 -2.021,0.872 -0.588,0.585 -0.909,1.364 -0.909,2.194 0,0.832 0.321,1.606 0.903,2.193 0.591,0.589 1.369,0.91 2.199,0.91 0.831,0 1.606,-0.321 2.193,-0.91 0.586,-0.581 0.91,-1.362 0.91,-2.19 0,-0.594 -0.219,-1.136 -0.528,-1.623 0.485,-0.87 1.075,-1.839 1.743,-2.828 0.019,0.026 0.047,0.042 0.07,0.061"
id="path5"
style="fill:#555753"
inkscape:connector-curvature="0" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

View file

@ -0,0 +1,283 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
version="1.1"
inkscape:version="0.48.3.1 r9886"
width="48"
height="48"
sodipodi:docname="shopping-cart.png"
inkscape:export-filename="/home/glic3rinu/orchestra/django-orchestra/orchestra/static/orchestra/icons/shopping-cart.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<metadata
id="metadata8">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs6" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1024"
id="namedview4"
showgrid="false"
inkscape:zoom="6.5442039"
inkscape:cx="52.394878"
inkscape:cy="17.224989"
inkscape:window-x="0"
inkscape:window-y="27"
inkscape:window-maximized="1"
inkscape:current-layer="svg2" />
<image
width="43.169491"
height="40.771187"
xlink:href="data:image/png;base64,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
1SguKea+j23ki5//FKlkkic2PUk2m2X+/AXcefudI0JN3v4o2y5N07bour5J1/Ue75qzhamEbef3
gbxIR9gTP3nypPzr//FXOI5DaWkJt995O3PmzCaVSlNff4qm5haamluIRmNMr62mtmYadXUzEQi2
b3+LV195FcuyKSsr51vf/NZZx54upliWxd/87d9w5oz6NsryK5dx8/qbiEbVMklt7e00NjbT2dXN
1KpKZsyoYfLkSSDJGQ+Lx+P80Te/RVlpmZ+3WrbQ8feHB341TevRdf0BF7Atw4EdS0YFDHLDU97/
bW9uk48+9gjptFpsZdnypaxceS3lFRUjNNObE//ii1toblKUuaqyik9/+jPUup3/Bym9fb088ujP
OHr0KKAmna5Zex01tTVMmTw553l6e3ppaW7hre1v+wOxNdXVfPK+T1FTk/uRV29gNvzbBWvX8Hhi
WLPG05ePCRgo0Dxq6oHW1dUlH/qXhzh8+JCfLh6PU11dTXXNNLLZLC1N6uUFz7QIIbjxhpu46867
MAxj01lL9j6JlHL21te3Ln/yqV+SzQYLTUejUaqrp2FEDFqaW0gmg/cDNE1j/c23cNuG20Z9Finl
7OGR+uER+3OJ1p8VsFABfMA8EF959RX59NOb6e3rHfU6FUeczic+cR9z58z9wOemjyYdHWfkpl8+
wYkT79HX15c3TUFBATNnzuIjH/4Is+tmj/ksUsrZkDO8MmIsbCJAeTLhgUMPLO8/QE9Ptzxx8iSn
TjVQX19PPB6jrm42dbPqmDWr7r/H4/FvT+gmH7D09PTI+vqTNJxqIJvNqueoq6NySuU5vcUyvB/T
df2cpwv8X/lnXhgg25xNAAAAAElFTkSuQmCC
"
id="image10"
x="3.4576273"
y="4.9067798" />
</svg>

After

Width:  |  Height:  |  Size: 18 KiB