-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmanage.py
More file actions
executable file
·199 lines (166 loc) · 5.31 KB
/
manage.py
File metadata and controls
executable file
·199 lines (166 loc) · 5.31 KB
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#!/usr/bin/env python
import click
from flask.cli import FlaskGroup
from flask_migrate import Migrate, upgrade, downgrade
from elixir_dss import app, db
from elixir_dss.importer.importer_utils import schedule_submission_export
from elixir_dss.models.security import Role, User
from elixir_dss.models.services import assign_role_to_user, register_new_user
from elixir_dss.models.seed_data import seed_init_data
migrate_instance = Migrate(app, db)
cli = FlaskGroup(create_app=lambda: app)
@app.cli.command()
def init_db():
"""Downgrade to base, upgrade to head, and seed data"""
click.echo("Downgrading to base...")
downgrade(revision="base")
click.echo("Upgrading to head...")
upgrade()
click.echo("Seeding initial data...")
seed_init_data()
click.echo("✓ Database reset complete!")
@cli.command()
def seed_data():
"""Seed initial data into the database."""
click.echo("Seeding initial data...")
with app.app_context():
seed_init_data()
click.echo("Initial data seeded successfully!")
@cli.command()
def load_demo_users():
"""Load demonstration users for testing."""
click.echo("Loading demo users...")
u1 = User(
first_name="Steward",
last_name="One",
elixir_sub_id="steward1@uni.lu",
email="steward1@uni.lu",
institution_accession="ELU_I_77",
phone_no="+352123456789",
)
register_new_user(u1)
assign_role_to_user(u1, "data_steward")
click.echo("Created data steward user: steward1@uni.lu")
u2 = User(
first_name="Submitter",
last_name="One",
elixir_sub_id="submitter1@some.edu",
email="submitter1@some.edu",
institution_accession="ELU_I_79",
phone_no="+352123456789",
)
register_new_user(u2)
assign_role_to_user(u2, "user")
click.echo("Created data provider: submitter1@some.edu")
u3 = User(
first_name="Submitter",
last_name="Two",
elixir_sub_id="submitter2@some.edu",
email="submitter2@some.edu",
institution_accession="ELU_I_79",
phone_no="+352123456789",
)
register_new_user(u3)
assign_role_to_user(u3, "user")
click.echo("Created data provider: submitter2@some.edu")
u4 = User(
first_name="Admin",
last_name="One",
elixir_sub_id="admin@uni.lu",
email="admin@uni.lu",
institution_accession="ELU_I_77",
phone_no="+352123456789",
)
register_new_user(u4)
assign_role_to_user(u4, "admin")
click.echo("Created admin user: admin@uni.lu")
click.echo("Demo users loaded successfully!")
@cli.command()
@click.argument("name")
@click.argument("surname")
@click.argument("email")
@click.argument("elixir_id")
@click.argument("institution")
def create_admin(name, surname, email, elixir_id, institution):
"""Create an admin user.
Arguments:
NAME: First name of the admin
SURNAME: Last name of the admin
EMAIL: Email address
ELIXIR_ID: ELIXIR ID
INSTITUTION: Institution accession code
"""
u1 = User(
first_name=name,
last_name=surname,
elixir_sub_id=elixir_id,
email=email,
institution_accession=institution,
)
register_new_user(u1)
assign_role_to_user(u1, "admin")
click.echo(f"Admin user created successfully: {email}")
@cli.command()
@click.option(
"--destination",
"-d",
default=app.config.get("SUBMISSION_EXPORT_FOLDER"),
help=f"Path to the destination folder. Default: {app.config.get('SUBMISSION_EXPORT_FOLDER')}",
)
@click.option(
"--all",
"-a",
is_flag=True,
help="Export also submissions which have been already exported in the past. This will overwrite existing JSON files.",
)
@click.option(
"--submission-id",
"-i",
multiple=True,
help="List of submission IDs to export (can be used multiple times)",
)
def export_submissions(destination, all, submission_id):
"""Export submissions into JSON files."""
submissions_to_export = list(submission_id) if submission_id else []
click.echo(f"Exporting submissions to: {destination}")
if all:
click.echo("Exporting all submissions (including previously exported)")
if submissions_to_export:
click.echo(f"Exporting specific submissions: {submissions_to_export}")
schedule_submission_export(destination, all, submissions_to_export)
click.echo("Export completed!")
@cli.command()
def shell():
"""Start an interactive Python shell with app context."""
import code
import readline
# Enable tab completion
readline.parse_and_bind("tab: complete")
# Create context with useful imports
context = {
"app": app,
"db": db,
"User": User,
"Role": Role,
}
# Start interactive shell
code.interact(
local=context,
banner="""
Python Shell for Elixir-DSS
Available objects: app, db, User, Role
Use tab for autocompletion
""",
)
@cli.command()
@click.argument("email")
def grant_data_steward_access(email):
click.echo(f"Granting data steward access to: {email}")
user = User.query.filter_by(email=email).first()
if user:
assign_role_to_user(user, "data_steward")
click.echo(f"Granted data steward access to: {email}")
else:
click.echo(f"User not found: {email}")
if __name__ == "__main__":
cli()