-
-
Notifications
You must be signed in to change notification settings - Fork 47
/
manage.py
162 lines (122 loc) · 5.12 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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
from werkzeug.serving import run_simple
from metabrainz import db
from metabrainz import create_app
from metabrainz.model.access_log import AccessLog
from metabrainz.invoices.send_invoices import QuickBooksInvoiceSender
import urllib.parse
import subprocess
import os
import click
import logging
from metabrainz.supporter.copy_mb_row_ids import copy_row_ids
ADMIN_SQL_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'admin', 'sql')
cli = click.Group()
application = create_app()
@cli.command()
@click.option("--host", "-h", default="0.0.0.0", show_default=True)
@click.option("--port", "-p", default=8080, show_default=True)
@click.option("--debug", "-d", is_flag=True,
help="Turns debugging mode on or off. If specified, overrides "
"'DEBUG' value in the config file.")
def runserver(host, port, debug=False):
run_simple(
hostname=host,
port=port,
application=application,
use_debugger=debug,
use_reloader=debug,
)
@cli.command()
@click.option("--force", "-f", is_flag=True, help="Drop existing database and user.")
@click.option("--create-db", "-c", is_flag=True, help="Create database and extensions.")
def init_db(force=False, create_db=False):
db.init_db_engine(application.config["POSTGRES_ADMIN_URI"])
if force:
click.echo('Dropping existing database... ', nl=False)
db.run_sql_script_without_transaction(os.path.join(ADMIN_SQL_DIR, 'drop_db.sql'))
click.echo('Done.')
if create_db:
click.echo('Creating user and a database... ', nl=False)
db.run_sql_script_without_transaction(os.path.join(ADMIN_SQL_DIR, 'create_db.sql'))
click.echo('Done.')
click.echo('Creating database extensions... ', nl=False)
db.run_sql_script_without_transaction(os.path.join(ADMIN_SQL_DIR, 'create_extensions.sql'))
click.echo('Done.')
db.init_db_engine(application.config["SQLALCHEMY_DATABASE_URI"])
click.echo('Creating types... ', nl=False)
db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_types.sql'))
click.echo('Done.')
click.echo('Creating tables... ', nl=False)
db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_tables.sql'))
db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'oauth', 'create_tables.sql'))
click.echo('Done.')
click.echo('Creating primary and foreign keys... ', nl=False)
db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_primary_keys.sql'))
db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_foreign_keys.sql'))
click.echo('Done.')
click.echo('Creating indexes... ', nl=False)
db.run_sql_script(os.path.join(ADMIN_SQL_DIR, 'create_indexes.sql'))
click.echo('Done.')
click.echo("Database has been initialized successfully!")
@cli.command()
def extract_strings():
"""Extract all strings into messages.pot.
This command should be run after any translatable strings are updated.
Otherwise updates are not going to be available on Transifex.
"""
_run_command("pybabel extract -F metabrainz/babel.cfg "
"-o metabrainz/messages.pot metabrainz/")
click.echo("Strings have been successfully extracted into messages.pot file.")
@cli.command()
def compile_translations():
"""Compile translations for use."""
_run_command("pybabel compile -d metabrainz/translations")
click.echo("Translated strings have been compiled and ready to be used.")
@cli.command()
def cleanup_logs():
with create_app().app_context():
AccessLog.remove_old_ip_addr_records()
@cli.command()
def send_invoices():
""" Send invoices that are prepared, but unsent in QuickBooks."""
with create_app().app_context():
qb = QuickBooksInvoiceSender()
qb.send_invoices()
@cli.command()
def send_invoice_reminders():
""" Send invoices reminders about invoices that remain unpaid."""
logging.getLogger().setLevel(logging.DEBUG)
with create_app().app_context():
qb = QuickBooksInvoiceSender()
qb.send_invoice_reminders()
@cli.command()
def import_musicbrainz_row_ids():
""" Import musicbrainz row ids for users """
with create_app().app_context():
copy_row_ids()
def _run_psql(script, uri, database=None):
hostname, port, db_name, username, password = _explode_db_uri(uri)
script = os.path.join(ADMIN_SQL_DIR, script)
command = [
'psql',
'-h', hostname,
'-p', str(port),
'-U', username,
'-f', script,
]
if database:
command.extend(['-d', database])
return subprocess.call(command)
def _run_command(command):
return subprocess.check_call(command, shell=True)
def _explode_db_uri(uri):
"""Extracts database connection info from the URI.
Returns hostname, database name, username and password.
"""
uri = urllib.parse.urlsplit(uri)
return uri.hostname, uri.port, uri.path[1:], uri.username, uri.password
if __name__ == '__main__':
cli()
"""
insert into tier (name, short_desc, long_desc, price, available, "primary") values ('We will contribute, we promise!', 'For lame user lying about supporting us.', 'Whatevs, you dont care anyway.', 0.0, 't', 't');
"""