mirror of
https://github.com/simple-login/app.git
synced 2024-09-27 20:31:30 +02:00
Add export endpoints
This commit is contained in:
parent
d933bffa2f
commit
3932ed2eb8
@ -11,4 +11,5 @@ from .views import (
|
||||
mailbox,
|
||||
notification,
|
||||
setting,
|
||||
export,
|
||||
)
|
||||
|
67
app/api/views/export.py
Normal file
67
app/api/views/export.py
Normal file
@ -0,0 +1,67 @@
|
||||
import csv
|
||||
from io import StringIO
|
||||
|
||||
from flask import g
|
||||
from flask import jsonify
|
||||
from flask import make_response
|
||||
from flask import request
|
||||
|
||||
from app.api.base import api_bp, require_api_auth
|
||||
from app.models import Alias, Client, CustomDomain
|
||||
|
||||
|
||||
@api_bp.route("/export/data", methods=["GET"])
|
||||
@require_api_auth
|
||||
def export_data():
|
||||
"""
|
||||
Get user data
|
||||
Output:
|
||||
Alias, custom domain and app info
|
||||
|
||||
"""
|
||||
user = g.user
|
||||
|
||||
data = {
|
||||
"email": user.email,
|
||||
"name": user.name,
|
||||
"aliases": [],
|
||||
"apps": [],
|
||||
"custom_domains": [],
|
||||
}
|
||||
|
||||
for alias in Alias.filter_by(user_id=user.id).all(): # type: Alias
|
||||
data["aliases"].append(dict(email=alias.email, enabled=alias.enabled))
|
||||
|
||||
for custom_domain in CustomDomain.filter_by(user_id=user.id).all():
|
||||
data["custom_domains"].append(custom_domain.domain)
|
||||
|
||||
for app in Client.filter_by(user_id=user.id): # type: Client
|
||||
data["apps"].append(
|
||||
dict(name=app.name, home_url=app.home_url, published=app.published)
|
||||
)
|
||||
|
||||
return jsonify(data)
|
||||
|
||||
|
||||
@api_bp.route("/export/aliases", methods=["GET"])
|
||||
@require_api_auth
|
||||
def export_aliases():
|
||||
"""
|
||||
Get user aliases as importable CSV file
|
||||
Output:
|
||||
Importable CSV file
|
||||
|
||||
"""
|
||||
user = g.user
|
||||
|
||||
data = [["alias", "note", "enabled"]]
|
||||
for alias in Alias.filter_by(user_id=user.id).all(): # type: Alias
|
||||
data.append([alias.email, alias.note, alias.enabled])
|
||||
|
||||
si = StringIO()
|
||||
cw = csv.writer(si)
|
||||
cw.writerows(data)
|
||||
output = make_response(si.getvalue())
|
||||
output.headers["Content-Disposition"] = "attachment; filename=aliases.csv"
|
||||
output.headers["Content-type"] = "text/csv"
|
||||
return output
|
@ -1,6 +1,5 @@
|
||||
import csv
|
||||
import json
|
||||
from io import BytesIO, StringIO
|
||||
from io import BytesIO
|
||||
|
||||
import arrow
|
||||
from flask import (
|
||||
@ -10,7 +9,6 @@ from flask import (
|
||||
url_for,
|
||||
flash,
|
||||
Response,
|
||||
make_response,
|
||||
)
|
||||
from flask_login import login_required, current_user, logout_user
|
||||
from flask_wtf import FlaskForm
|
||||
@ -266,42 +264,9 @@ def setting():
|
||||
return redirect(url_for("dashboard.setting"))
|
||||
|
||||
elif request.form.get("form-name") == "export-data":
|
||||
data = {
|
||||
"email": current_user.email,
|
||||
"name": current_user.name,
|
||||
"aliases": [],
|
||||
"apps": [],
|
||||
"custom_domains": [],
|
||||
}
|
||||
|
||||
for alias in Alias.filter_by(user_id=current_user.id).all(): # type: Alias
|
||||
data["aliases"].append(dict(email=alias.email, enabled=alias.enabled))
|
||||
|
||||
for custom_domain in CustomDomain.filter_by(user_id=current_user.id).all():
|
||||
data["custom_domains"].append(custom_domain.domain)
|
||||
|
||||
for app in Client.filter_by(user_id=current_user.id): # type: Client
|
||||
data["apps"].append(
|
||||
dict(name=app.name, home_url=app.home_url, published=app.published)
|
||||
)
|
||||
|
||||
return Response(
|
||||
json.dumps(data),
|
||||
mimetype="text/json",
|
||||
headers={"Content-Disposition": "attachment;filename=data.json"},
|
||||
)
|
||||
return redirect(url_for("api.export_data"))
|
||||
elif request.form.get("form-name") == "export-alias":
|
||||
data = [["alias", "note", "enabled"]]
|
||||
for alias in Alias.filter_by(user_id=current_user.id).all(): # type: Alias
|
||||
data.append([alias.email, alias.note, alias.enabled])
|
||||
|
||||
si = StringIO()
|
||||
cw = csv.writer(si)
|
||||
cw.writerows(data)
|
||||
output = make_response(si.getvalue())
|
||||
output.headers["Content-Disposition"] = "attachment; filename=aliases.csv"
|
||||
output.headers["Content-type"] = "text/csv"
|
||||
return output
|
||||
return redirect(url_for("api.export_aliases"))
|
||||
|
||||
manual_sub = ManualSubscription.get_by(user_id=current_user.id)
|
||||
apple_sub = AppleSubscription.get_by(user_id=current_user.id)
|
||||
|
24
docs/api.md
24
docs/api.md
@ -14,6 +14,8 @@
|
||||
|
||||
[Settings endpoints](#settings-endpoints)
|
||||
|
||||
[Import and export endpoints](#import-and-export-endpoints)
|
||||
|
||||
[MISC endpoints](#misc-endpoints)
|
||||
|
||||
---
|
||||
@ -786,7 +788,27 @@ Return domains that user can use to create random alias
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
|
||||
### Import and export endpoints
|
||||
#### GET /api/export/data
|
||||
|
||||
Export user data
|
||||
|
||||
Input:
|
||||
- `Authentication` in header: the api key
|
||||
|
||||
Output:
|
||||
Alias, custom domain and app info
|
||||
|
||||
#### GET /api/export/aliases
|
||||
|
||||
Export user aliases in an importable CSV format
|
||||
|
||||
Input:
|
||||
- `Authentication` in header: the api key
|
||||
|
||||
Output:
|
||||
A CSV file with alias information that can be imported in the settings screen
|
||||
|
||||
### Misc endpoints
|
||||
#### POST /api/apple/process_payment
|
||||
|
Loading…
Reference in New Issue
Block a user