Skip to content

Commit a7f2146

Browse files
committed
Merge pull request #13 from rday/master
Mixer/Faker examples
2 parents 8f90cd7 + ef9d4f5 commit a7f2146

File tree

7 files changed

+223
-4
lines changed

7 files changed

+223
-4
lines changed

Bizness/models.py

+21
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ class Task(db.Model):
2121
description = db.Column(db.Text)
2222
due_date = db.Column(db.TIMESTAMP)
2323

24+
@staticmethod
25+
def paginate(page, page_size):
26+
return Task.query.paginate(page, page_size)
27+
2428
@staticmethod
2529
def from_request(request):
2630
parser = RequestParser()
@@ -227,3 +231,20 @@ def to_dict(self):
227231

228232
def __repr__(self):
229233
return u"Item {} <#{}> due {}".format(self.name, self.id, self.due_date.isoformat())
234+
235+
236+
class User(db.Model):
237+
__tablename__ = 'users'
238+
239+
id = db.Column(db.Integer(), primary_key=True)
240+
first_name = db.Column(db.String(64), nullable=False)
241+
last_name = db.Column(db.String(64), nullable=False)
242+
email_address = db.Column(db.String(64), nullable=False)
243+
password = db.Column(db.String(64), nullable=False)
244+
phone_number = db.Column(db.String(64), nullable=False)
245+
address = db.Column(db.String(64))
246+
city = db.Column(db.String(64))
247+
street = db.Column(db.String(64))
248+
state = db.Column(db.String(64))
249+
title = db.Column(db.String(64), nullable=False)
250+
active = db.Column(db.Boolean, nullable=False)

BiznessWeb/__init__.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,9 @@
1010
from flask.ext.admin.contrib.sqla import ModelView
1111
from flask.ext.login import LoginManager
1212
from .items import items_bp
13+
from .tasks import tasks_bp
1314
from Bizness import db
14-
from Bizness.models import Item
15+
from Bizness.models import Item, Task
1516

1617

1718
app = Flask(__name__)
@@ -23,6 +24,7 @@
2324
# Setup admin
2425
admin = Admin(app)
2526
admin.add_view(ModelView(Item, db.session))
27+
admin.add_view(ModelView(Task, db.session))
2628

2729
# Setup the login manager
2830
# For authentication
@@ -33,3 +35,4 @@
3335

3436
# Setup our route blueprints
3537
app.register_blueprint(items_bp)
38+
app.register_blueprint(tasks_bp)

BiznessWeb/tasks.py

+78
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
from flask import Blueprint, jsonify, request, abort
2+
from werkzeug.exceptions import BadRequest
3+
from Bizness import db
4+
from Bizness.models import Task
5+
from .api import BizResponse
6+
from config import PAGE_SIZE
7+
import iso8601
8+
9+
10+
tasks_bp = Blueprint('tasks_bp', __name__, url_prefix='/tasks')
11+
12+
13+
@tasks_bp.route('/')
14+
def index():
15+
"""
16+
request.args inherits from TypeConversionDict !
17+
"""
18+
page_size = request.args.get('page_size', PAGE_SIZE, type=int)
19+
page = request.args.get('page', 1, type=int)
20+
last_date = request.args.get('last_date', None, type=lambda d: iso8601.parse_date(d))
21+
22+
if last_date is None:
23+
tasks_pagination = Task.paginate(page, page_size)
24+
else:
25+
tasks_pagination = Task.paginate_by_due_date(last_date, page_size)
26+
27+
tasks = {
28+
'tasks': [task.to_dict() for task in tasks_pagination.items]
29+
}
30+
31+
response = BizResponse(
32+
success=True,
33+
data=tasks,
34+
total=tasks_pagination.total,
35+
page=tasks_pagination.page
36+
)
37+
38+
return jsonify(response.to_dict())
39+
40+
41+
@tasks_bp.route('/', methods=['POST'])
42+
def create_task():
43+
try:
44+
new_task = Task.from_request(request)
45+
db.session.add(new_task)
46+
db.session.commit()
47+
48+
response = BizResponse(
49+
success=True,
50+
data=new_task.to_dict(),
51+
total=1
52+
)
53+
except BadRequest as e:
54+
response = BizResponse(
55+
success=False,
56+
data=e.description
57+
)
58+
except Exception:
59+
response = BizResponse(
60+
success=False,
61+
data='An error occurred saving the task'
62+
)
63+
64+
return jsonify(response.to_dict())
65+
66+
67+
@tasks_bp.route('/<int:task_id>', methods=['GET'])
68+
def get_task(task_id):
69+
task = Task.query.filter(Task.id == task_id).first()
70+
if task is None:
71+
abort(404)
72+
73+
response = BizResponse(
74+
success=True,
75+
data=task.to_dict()
76+
)
77+
78+
return jsonify(response.to_dict())

tools/factory.py

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
from random import randint
2+
from Bizness import models
3+
from BiznessWeb import app, db
4+
from mixer.backend.flask import Mixer
5+
from mixer.backend.sqlalchemy import GenFactory
6+
7+
8+
def fake_active():
9+
return randint(0, 10) > 2
10+
11+
12+
class MyFactory(GenFactory):
13+
fakers = GenFactory.fakers
14+
fakers[('active', bool)] = fake_active
15+
16+
17+
mixer = Mixer(locale='en_US', commit=False, factory=MyFactory)
18+
19+
with app.app_context():
20+
db.drop_all()
21+
db.create_all()
22+
23+
mixer.init_app(app)
24+
25+
for user in mixer.cycle(20).blend(models.User):
26+
print("{} {}: {}".format(user.first_name, user.last_name, user.active))

tools/middleware.py

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from Bizness import models
2+
from BiznessWeb import app, db
3+
from mixer.backend.flask import Mixer
4+
from flask.ext.bcrypt import Bcrypt
5+
6+
7+
mixer = Mixer(locale='en_US', commit=False)
8+
bcrypt = Bcrypt(app)
9+
10+
11+
@mixer.middleware(models.User)
12+
def encrypt_password(user):
13+
user.password = bcrypt.generate_password_hash('def4ult')
14+
return user
15+
16+
17+
with app.app_context():
18+
db.drop_all()
19+
db.create_all()
20+
21+
mixer.init_app(app)
22+
mixer.register(models.User, email_address=mixer.faker.email_address)
23+
24+
for user in mixer.cycle(20).blend(models.User):
25+
print(u"{} {}: {}({})".format(user.first_name, user.last_name, user.email_address, user.password))

tools/populate_db.py

+9-3
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,24 @@
33
from Bizness import models
44
from BiznessWeb import app, db
55
from mixer.backend.flask import mixer
6+
from mixer.main import TypeMixer
7+
8+
@mixer.middleware(models.Task)
9+
def encrypt_password(task):
10+
task.due_date = datetime.datetime.utcnow() + datetime.timedelta(days=randint(5, 10))
11+
return task
612

713

814
with app.app_context():
915
db.drop_all()
1016
db.create_all()
1117
mixer.init_app(app)
18+
mixer.register(models.Task, description=lambda: 'LALAAL')
1219

1320
for task in mixer.cycle(10).blend(models.Task,
1421
name=mixer.faker.name,
15-
description=mixer.faker.text):
16-
task.due_date = datetime.datetime.utcnow() + datetime.timedelta(days=randint(5, 10))
17-
db.session.add(task)
22+
description=mixer.FAKE):
23+
print(task.due_date)
1824

1925
db.session.flush()
2026

tools/providers.py

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from Bizness import models
2+
from BiznessWeb import app, db
3+
from mixer.backend.flask import Mixer
4+
from faker.providers.phone_number import Provider as BaseProvider
5+
6+
7+
class FixedPhoneNumberProvider(BaseProvider):
8+
formats = (
9+
'###-###-####',
10+
'(###)###-####',
11+
'1-###-###-####',
12+
'###.###.####',
13+
'###-###-####x###',
14+
'(###)###-####x###',
15+
'1-###-###-####x###',
16+
'###.###.####x###',
17+
'###-###-####x####',
18+
'(###)###-####x####',
19+
'1-###-###-####x####',
20+
'###.###.####x####',
21+
'###-###-####x#####',
22+
'(###)###-####x#####',
23+
'1-###-###-####x#####',
24+
'###.###.####x#####'
25+
)
26+
27+
28+
class JobTitleProvider(BaseProvider):
29+
formats = ['{{experience_level}} {{job_type}}', ]
30+
31+
job_types = ['Developer', 'QA Analyst', 'UX Designer']
32+
33+
experience_levels = ['', 'Senior', 'Junior', 'Intern']
34+
35+
def title(self):
36+
pattern = self.random_element(self.formats)
37+
return self.generator.parse(pattern)
38+
39+
@classmethod
40+
def job_type(cls):
41+
return cls.random_element(cls.job_types)
42+
43+
@classmethod
44+
def experience_level(cls):
45+
return cls.random_element(cls.experience_levels)
46+
47+
48+
mixer = Mixer(locale='en_US', commit=False)
49+
50+
with app.app_context():
51+
db.drop_all()
52+
db.create_all()
53+
54+
mixer.init_app(app)
55+
mixer.faker.add_provider(JobTitleProvider)
56+
mixer.faker.add_provider(FixedPhoneNumberProvider)
57+
mixer.register(models.User, phone_number=mixer.faker.phone_number)
58+
59+
for user in mixer.cycle(20).blend(models.User):
60+
print("{} {}: {} {}".format(user.first_name, user.last_name, user.title, user.phone_number))

0 commit comments

Comments
 (0)