initial commit
commit
db9f27741e
@ -0,0 +1,69 @@
|
|||||||
|
# virtualenv
|
||||||
|
env
|
||||||
|
|
||||||
|
# Pycharm
|
||||||
|
.idea
|
||||||
|
|
||||||
|
# ---> Python
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
||||||
|
# C extensions
|
||||||
|
*.so
|
||||||
|
|
||||||
|
# Distribution / packaging
|
||||||
|
.Python
|
||||||
|
env/
|
||||||
|
pypyenv/
|
||||||
|
build/
|
||||||
|
develop-eggs/
|
||||||
|
dist/
|
||||||
|
downloads/
|
||||||
|
eggs/
|
||||||
|
.eggs/
|
||||||
|
lib/
|
||||||
|
lib64/
|
||||||
|
parts/
|
||||||
|
sdist/
|
||||||
|
var/
|
||||||
|
*.egg-info/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg
|
||||||
|
|
||||||
|
# PyInstaller
|
||||||
|
# Usually these files are written by a python script from a template
|
||||||
|
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||||
|
*.manifest
|
||||||
|
*.spec
|
||||||
|
|
||||||
|
# Installer logs
|
||||||
|
pip-log.txt
|
||||||
|
pip-delete-this-directory.txt
|
||||||
|
|
||||||
|
# Unit test / coverage reports
|
||||||
|
htmlcov/
|
||||||
|
.tox/
|
||||||
|
.coverage
|
||||||
|
.coverage.*
|
||||||
|
.cache
|
||||||
|
nosetests.xml
|
||||||
|
coverage.xml
|
||||||
|
*,cover
|
||||||
|
|
||||||
|
# Translations
|
||||||
|
*.mo
|
||||||
|
*.pot
|
||||||
|
|
||||||
|
# Django stuff:
|
||||||
|
*.log
|
||||||
|
|
||||||
|
# Sphinx documentation
|
||||||
|
docs/_build/
|
||||||
|
|
||||||
|
# Redis
|
||||||
|
/dump.rdb
|
||||||
|
|
||||||
|
# Project
|
||||||
|
config.py
|
@ -0,0 +1 @@
|
|||||||
|
from cookiedb.models import Base
|
@ -0,0 +1,87 @@
|
|||||||
|
import bcrypt
|
||||||
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
|
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime, Boolean, Numeric
|
||||||
|
from sqlalchemy.orm import relationship, backref
|
||||||
|
from sqlalchemy.sql import expression
|
||||||
|
from sqlalchemy.ext.compiler import compiles
|
||||||
|
from sqlalchemy.types import DateTime as DateTimeType
|
||||||
|
|
||||||
|
BCRYPT_LOG_ROUNDS = 11
|
||||||
|
|
||||||
|
|
||||||
|
# can be moved to models util?
|
||||||
|
class utcnow(expression.FunctionElement):
|
||||||
|
type = DateTimeType()
|
||||||
|
|
||||||
|
|
||||||
|
# Can be moved to the models util?
|
||||||
|
@compiles(utcnow, 'postgresql')
|
||||||
|
def pg_utcnow(element, compiler, **kw):
|
||||||
|
return "TIMEZONE('utc', CURRENT_TIMESTAMP)"
|
||||||
|
|
||||||
|
|
||||||
|
Base = declarative_base()
|
||||||
|
|
||||||
|
|
||||||
|
class DBMixin:
|
||||||
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
||||||
|
created_date = Column(DateTime, server_default=utcnow())
|
||||||
|
modified_date = Column(DateTime, server_default=utcnow(), onupdate=utcnow())
|
||||||
|
|
||||||
|
def to_dict(self):
|
||||||
|
d = self.__dict__.copy()
|
||||||
|
if '_sa_instance_state' in d:
|
||||||
|
d.pop('_sa_instance_state')
|
||||||
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
def ReferenceCol(tablename, nullable=False, **kw):
|
||||||
|
return Column(ForeignKey('{}.id'.format(tablename)), nullable=nullable, **kw)
|
||||||
|
|
||||||
|
|
||||||
|
class Cookie(Base, DBMixin):
|
||||||
|
__tablename__ = 'cookies'
|
||||||
|
|
||||||
|
name = Column(String(50), index=True)
|
||||||
|
recipe_url = Column(String(255))
|
||||||
|
sku = Column(String(55))
|
||||||
|
qoh = Column(Integer)
|
||||||
|
unit_cost = Column(Numeric(12, 2))
|
||||||
|
|
||||||
|
|
||||||
|
class User(DBMixin, Base):
|
||||||
|
__tablename__ = 'users'
|
||||||
|
|
||||||
|
email = Column(String(255), nullable=False, unique=True)
|
||||||
|
password = Column(String(255))
|
||||||
|
admin = Column(Boolean, nullable=False, default=False)
|
||||||
|
confirmed = Column(Boolean, nullable=False, default=False)
|
||||||
|
|
||||||
|
def __init__(self, email, password, admin=False):
|
||||||
|
self.email = email
|
||||||
|
self.password = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt(BCRYPT_LOG_ROUNDS)).decode()
|
||||||
|
self.admin = admin
|
||||||
|
|
||||||
|
def check_password(self, password):
|
||||||
|
return bcrypt.checkpw(password.encode('utf-8'), self.password.encode('utf-8'))
|
||||||
|
|
||||||
|
|
||||||
|
class Order(DBMixin, Base):
|
||||||
|
__tablename__ = 'orders'
|
||||||
|
|
||||||
|
user_id = ReferenceCol('users')
|
||||||
|
shipped = Column(Boolean, default=False)
|
||||||
|
|
||||||
|
user = relationship('User', backref=backref('orders'))
|
||||||
|
|
||||||
|
|
||||||
|
class LineItem(DBMixin, Base):
|
||||||
|
__tablename__ = 'line_items'
|
||||||
|
|
||||||
|
order_id = ReferenceCol('orders')
|
||||||
|
cookie_id = ReferenceCol('cookies')
|
||||||
|
quantity = Column(Integer)
|
||||||
|
extended_cost = Column(Numeric(12, 2))
|
||||||
|
|
||||||
|
order = relationship('Order', backref=backref('line_items'))
|
||||||
|
cookie = relationship('Cookie', uselist=False)
|
@ -0,0 +1,6 @@
|
|||||||
|
bcrypt==3.1.4
|
||||||
|
cffi==1.11.5
|
||||||
|
psycopg2==2.7.4
|
||||||
|
pycparser==2.18
|
||||||
|
six==1.11.0
|
||||||
|
SQLAlchemy==1.2.6
|
@ -0,0 +1,17 @@
|
|||||||
|
from setuptools import setup, find_packages
|
||||||
|
|
||||||
|
with open('requirements.txt') as f:
|
||||||
|
requirements = [requirement for requirement in f]
|
||||||
|
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='cookiedb',
|
||||||
|
version='0.1.0',
|
||||||
|
description='A sample domain model to be used for toy applications',
|
||||||
|
packages=find_packages(),
|
||||||
|
author='Drew Bednar',
|
||||||
|
author_email='drew@androiddrew.com',
|
||||||
|
install_requires=requirements,
|
||||||
|
license='MIT',
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue