Created
December 3, 2011 13:17
-
-
Save alexanderdean/1427099 to your computer and use it in GitHub Desktop.
For DictShield issue #45
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
from dictshield.document import Document, EmbeddedDocument | |
from dictshield.base import UUIDField, ShieldException | |
from dictshield.fields import (StringField, | |
DateTimeField, | |
IntField, | |
ListField, | |
FloatField, | |
EmbeddedDocumentField) | |
import json | |
order = """{ | |
"sales_order" : { | |
"id" : "3187e7d0-f84f-11e0-be50-0800200c9a66", | |
"sales_channel" : { | |
"id" : "37f29761-0655-4eb8-87c5-9c505b86a34e", | |
"link" : { | |
"rel" : "self", | |
"href" : "http://localhost:8080/sales-channels/37f29761-0655-4eb8-87c5-9c505b86a34e", | |
"type" : "text/xml" | |
} | |
}, | |
"order_reference" : null, | |
"total_paid" : 8.99, | |
"shipping_paid" : 4.02, | |
"tax_paid" : 0.0, | |
"currency" : "GBP", | |
"shipping_method" : null, | |
"customer" : { | |
"name" : "xxxxx", | |
"customer_reference" : null, | |
"email" : null | |
}, | |
"sales_shipments" : [ ], | |
"sales_refunds" : [ ], | |
"billing_address" : { | |
"name" : "bbbbbb", | |
"company" : null, | |
"city" : null, | |
"state" : null, | |
"zip_code" : "99999", | |
"country" : "Italy", | |
"phone" : null, | |
"address_line_1" : "yyyyyyy", | |
"address_line_2" : "Livorno" | |
}, | |
"shipping_address" : { | |
"name" : "bbbbb", | |
"company" : null, | |
"city" : null, | |
"state" : null, | |
"zip_code" : "999999", | |
"country" : "Italy", | |
"phone" : null, | |
"address_line_1" : "yyyyyyy", | |
"address_line_2" : "Livorno" | |
}, | |
"sales_line_items" : [ { | |
"id" : "dd1f5162-f7ea-11e0-be50-0800200c9a66", | |
"title" : "Mystical Lenormand", | |
"sku" : "PBZ00001", | |
"status" : "shipped", | |
"unit_price" : 8.99, | |
"currency" : "GBP", | |
"quantity" : 1, | |
"total_paid" : 8.99, | |
"tax_paid" : 0.0 | |
}, { | |
"id" : "dd1f5162-f7ea-11e0-be50-0800200c9a67", | |
"title" : "Mystical Lenormand", | |
"sku" : "PBZ00001", | |
"status" : "reshipped", | |
"unit_price" : 0.0, | |
"currency" : "GBP", | |
"quantity" : 1, | |
"total_paid" : 0.0, | |
"tax_paid" : 0.0 | |
} ], | |
"ordered_at" : "2011-05-14T00:00:00.000+0300" | |
} | |
}""" | |
class Customer(EmbeddedDocument): | |
"""Representation for a Customer (as embedded in e.g. a SalesOrder) | |
""" | |
name = StringField(required=True) | |
customer_reference = StringField(required=False) | |
email = StringField(required=False) | |
def __repr__(self): | |
return "<Customer(%s, %s, %s)>" % (self.name, self.customer_reference, self.email) | |
class CustomerAddress(EmbeddedDocument): | |
"""Representation for a CustomerAddress (e.g. billing address or delivery | |
address. Embedded into top-level representations such as SalesOrders. | |
""" | |
name = StringField(required=True) | |
company = StringField(required=False) | |
address_line_1 = StringField(required=True) | |
address_line_2 = StringField(required=False) | |
city = StringField(required=False) | |
state = StringField(required=False) | |
zip_code = StringField(required=False) | |
country = StringField(required=True) | |
phone = StringField(required=False) | |
def __repr__(self): | |
return "<CustomerAddress(%s, %s, %s, %s, %s, %s, %s, %s, %s)" % (self.name, self.company, self.address_line_1, self.address_line_2, self.city, self.state, self.zip_code, self.country, self.phone) | |
class AtomLink(EmbeddedDocument): | |
"""Representation for a HATEOAS-friendly URL, aka an AtomLink | |
""" | |
rel = StringField(required=True) | |
href = StringField(required=True) | |
type = StringField(required=False, default="application/json") | |
def __repr__(self): | |
return "<AtomLink(%s, %s, %s)>" % (self.rel, self.href, self.type) | |
class RepresentationLink(EmbeddedDocument): | |
"""A RepresentationLink holds the ID of and HATEOAS | |
path to an individual Representation | |
""" | |
_internal_fields = ['_id', '_cls', '_types'] # Exclude id as this is an actual field | |
id = UUIDField(required=True) | |
link = EmbeddedDocumentField(AtomLink, required=True) | |
def __repr__(self): | |
return "<RepresentationLink(%s, %s)>" % (self.id, self.link) | |
class SalesLineItemSummary(EmbeddedDocument): | |
"""Sub-representation for a line item within a SalesOrder | |
""" | |
_internal_fields = ['_id', '_cls', '_types'] | |
id = UUIDField(required=True) | |
title = StringField(required=True) | |
sku = StringField(required=True) | |
product = EmbeddedDocumentField(RepresentationLink, required=False) | |
status = StringField(required=True) | |
unit_price = FloatField(required=True) | |
currency = StringField(required=True, max_length=3) # Throw in a bit of extra validation here | |
quantity = IntField(required=True) | |
total_paid = FloatField(required=True) | |
tax_paid = FloatField(required=True) | |
# HATEOAS reference back to this representation | |
link = EmbeddedDocumentField(AtomLink, required=False) | |
def __repr__(self): | |
return "<SalesLineItemSummary(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)>" % (self.id, self.title, self.sku, self.title, self.product, self.status, self.unit_price, self.currency, self.quantity, self.total_paid, self.tax_paid) | |
class BaseNewSalesOrder(EmbeddedDocument): | |
"""Representation for creating a new Orderly Sales Order | |
""" | |
# Core fields for this Order | |
sales_channel = EmbeddedDocumentField(RepresentationLink, required=True) | |
order_reference = StringField(required=False) | |
total_paid = FloatField(required=True) | |
shipping_paid = FloatField(required=False) | |
tax_paid = FloatField(required=False) | |
currency = StringField(required=True) | |
shipping_method = StringField(required=False) | |
# Fields relating to the customer's details | |
customer = EmbeddedDocumentField(Customer, required=True) | |
billing_address = EmbeddedDocumentField(CustomerAddress, required=True) | |
shipping_address = EmbeddedDocumentField(CustomerAddress, required=True) | |
# List of shipments and refunds for this order | |
sales_shipments = ListField(EmbeddedDocumentField(RepresentationLink, required=True), required=True) | |
sales_refunds = ListField(EmbeddedDocumentField(RepresentationLink, required=True), required=True) | |
# Individual line items in the order | |
sales_line_items = ListField(EmbeddedDocumentField(SalesLineItemSummary, required=True), required=True) | |
# Final datestamp | |
ordered_at = DateTimeField(required=True) | |
# Existing representations have string representations | |
def __repr__(self): | |
return "<SalesOrder(%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)>" % (repr(self.sales_channel), self.order_reference, self.total_paid, self.shipping_paid, self.tax_paid, self.currency, self.shipping_method, repr(self.customer), repr(self.sales_shipments), repr(self.sales_refunds), repr(self.billing_address), repr(self.shipping_address), repr(self.sales_line_items), self.ordered_at) | |
class NewSalesOrder(Document): | |
"""To create a new Sales Order resource, with root key | |
""" | |
sales_order = EmbeddedDocumentField(BaseNewSalesOrder, required=True) | |
data = json.loads(order) | |
rep = NewSalesOrder(**data) | |
try: | |
rep.validate() | |
except ShieldException, se: | |
print 'Marshalling error: %s' % se | |
data = rep.make_json_ownersafe(rep) | |
print data |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment