/
manage.py
136 lines (112 loc) · 4.17 KB
/
manage.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
"""
Flask-script stuff
"""
import base64
import os
import os.path
import random
import string
import sys
from random import choice
import faker
from flask import url_for
from flask.ext.assets import ManageAssets
from flask.ext.migrate import MigrateCommand
from flask.ext.migrate import stamp
from flask.ext.script import Manager
from app.factory import create_app
from app.models import Annotation
from app.models import Comment
from app.models import db
from app.models import Document
from app.models import ROLE_ADMIN
from app.models import User
EMPTY_PDF = """
JVBERi0xLjIKJcfsj6IKNSAwIG9iago8PC9MZW5ndGggNiAwIFIvRmlsdGVyIC9GbGF0ZURlY29k
ZT4+CnN0cmVhbQp4nCtUMNAzVDAAQSidnMsVyAUANUkEZWVuZHN0cmVhbQplbmRvYmoKNiAwIG9i
agoyMwplbmRvYmoKNCAwIG9iago8PC9UeXBlL1BhZ2UvTWVkaWFCb3ggWzAgMCA1OTUuMjggODQx
Ljg5XQovUGFyZW50IDMgMCBSCi9SZXNvdXJjZXM8PC9Qcm9jU2V0Wy9QREZdCj4+Ci9Db250ZW50
cyA1IDAgUgo+PgplbmRvYmoKMyAwIG9iago8PCAvVHlwZSAvUGFnZXMgL0tpZHMgWwo0IDAgUgpd
IC9Db3VudCAxCj4+CmVuZG9iagoxIDAgb2JqCjw8L1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDMgMCBS
Cj4+CmVuZG9iagoyIDAgb2JqCjw8L1Byb2R1Y2VyKEdQTCBHaG9zdHNjcmlwdCA5LjA2KQovQ3Jl
YXRpb25EYXRlKEQ6MjAxNDEwMzAxMDM0MDgrMDEnMDAnKQovTW9kRGF0ZShEOjIwMTQxMDMwMTAz
NDA4KzAxJzAwJyk+PmVuZG9iagp4cmVmCjAgNwowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAz
MDUgMDAwMDAgbiAKMDAwMDAwMDM1MyAwMDAwMCBuIAowMDAwMDAwMjQ2IDAwMDAwIG4gCjAwMDAw
MDAxMjYgMDAwMDAgbiAKMDAwMDAwMDAxNSAwMDAwMCBuIAowMDAwMDAwMTA4IDAwMDAwIG4gCnRy
YWlsZXIKPDwgL1NpemUgNyAvUm9vdCAxIDAgUiAvSW5mbyAyIDAgUgovSUQgWzxCRDRERjFGODJB
QTQzMTY1Q0Y1QzkzNzY4QUU5MzQ5MD48QkQ0REYxRjgyQUE0MzE2NUNGNUM5Mzc2OEFFOTM0OTA+
XQo+PgpzdGFydHhyZWYKNDc2CiUlRU9GCg==
"""
def generate_password():
letters = string.ascii_letters + string.digits
length = 20
password = ''.join(random.choice(letters) for _ in range(length))
return password
def main():
manager = Manager(create_app)
manager.add_command('db', MigrateCommand)
manager.add_command('assets', ManageAssets)
manager.add_option('-c', '--config', dest='config_file', required=False)
@manager.command
def create():
"Creates database tables from sqlalchemy models"
db.create_all()
stamp()
@manager.command
def makeadmin():
"Create an admin user with a random password"
password = generate_password()
user = User('admin', password)
user.role = ROLE_ADMIN
db.session.add(user)
db.session.commit()
print password
@manager.command
def fake():
"Populate tables using fake data"
fake = faker.Faker()
upload_dir = os.path.join(manager.app.instance_path, 'uploads')
if not os.path.isdir(upload_dir):
os.mkdir(upload_dir)
users = [User.generate(fake) for _ in range(0, 10)]
user = users[0]
for obj in users:
db.session.add(obj)
db.session.commit()
pdfdata = base64.decodestring(EMPTY_PDF.strip())
docs = [Document.generate(pdfdata) for _ in range(0, 10)]
for doc in docs:
comments = [Comment.generate(fake, doc.id) for _ in range(0, 4)]
annotations = [Annotation.generate(fake, doc.id, user.id)
for _ in range(0, 2)]
for obj in docs + comments + annotations:
db.session.add(obj)
db.session.commit()
@manager.command
def resetpassword(username):
"Reset password for a user"
user = User.query.filter_by(name=username).first()
if user is None:
print "No such user."
sys.exit(1)
password = generate_password()
user.set_password(password)
db.session.commit()
print password
@manager.command
def routes():
import urllib
output = []
for rule in manager.app.url_map.iter_rules():
options = {}
for arg in rule.arguments:
options[arg] = "[{0}]".format(arg)
methods = ','.join(rule.methods)
url = url_for(rule.endpoint, **options)
line = "{:40s} {:25s} {}".format(rule.endpoint, methods, url)
output.append(urllib.unquote(line))
for line in sorted(output):
print line
manager.run()
if __name__ == '__main__':
main()