Skip to content

Instantly share code, notes, and snippets.

@alexanderdean
Created December 3, 2011 13:17
Show Gist options
  • Save alexanderdean/1427099 to your computer and use it in GitHub Desktop.
Save alexanderdean/1427099 to your computer and use it in GitHub Desktop.
For DictShield issue #45
#!/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