mirror of
https://github.com/penpot/penpot.git
synced 2025-01-09 08:20:45 -05:00
🎉 Add the ability to delete and search profiles to manage.py
This commit is contained in:
parent
0dc7f4e07e
commit
01404ba581
3 changed files with 102 additions and 14 deletions
|
@ -11,6 +11,7 @@ import json
|
||||||
import socket
|
import socket
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
from tabulate import tabulate
|
||||||
from getpass import getpass
|
from getpass import getpass
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
|
|
||||||
|
@ -58,6 +59,7 @@ def print_error(res):
|
||||||
break
|
break
|
||||||
|
|
||||||
def run_cmd(params):
|
def run_cmd(params):
|
||||||
|
try:
|
||||||
expr = "(app.srepl.ext/run-json-cmd {})".format(encode(params))
|
expr = "(app.srepl.ext/run-json-cmd {})".format(encode(params))
|
||||||
res, failed = send_eval(expr)
|
res, failed = send_eval(expr)
|
||||||
if failed:
|
if failed:
|
||||||
|
@ -65,6 +67,9 @@ def run_cmd(params):
|
||||||
sys.exit(-1)
|
sys.exit(-1)
|
||||||
|
|
||||||
return res
|
return res
|
||||||
|
except Exception as cause:
|
||||||
|
print("EXC:", str(cause))
|
||||||
|
sys.exit(-2)
|
||||||
|
|
||||||
def create_profile(fullname, email, password):
|
def create_profile(fullname, email, password):
|
||||||
params = {
|
params = {
|
||||||
|
@ -96,6 +101,34 @@ def update_profile(email, fullname, password, is_active):
|
||||||
else:
|
else:
|
||||||
print(f"No profile found with email {email}")
|
print(f"No profile found with email {email}")
|
||||||
|
|
||||||
|
def delete_profile(email, soft):
|
||||||
|
params = {
|
||||||
|
"cmd": "delete-profile",
|
||||||
|
"params": {
|
||||||
|
"email": email,
|
||||||
|
"soft": soft
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res = run_cmd(params)
|
||||||
|
if res is True:
|
||||||
|
print(f"Deleted")
|
||||||
|
else:
|
||||||
|
print(f"No profile found with email {email}")
|
||||||
|
|
||||||
|
def search_profile(email):
|
||||||
|
params = {
|
||||||
|
"cmd": "search-profile",
|
||||||
|
"params": {
|
||||||
|
"email": email,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res = run_cmd(params)
|
||||||
|
|
||||||
|
if isinstance(res, list):
|
||||||
|
print(tabulate(res, headers="keys"))
|
||||||
|
|
||||||
def derive_password(password):
|
def derive_password(password):
|
||||||
params = {
|
params = {
|
||||||
"cmd": "derive-password",
|
"cmd": "derive-password",
|
||||||
|
@ -107,11 +140,13 @@ def derive_password(password):
|
||||||
res = run_cmd(params)
|
res = run_cmd(params)
|
||||||
print(f"Derived password: \"{res}\"")
|
print(f"Derived password: \"{res}\"")
|
||||||
|
|
||||||
available_commands = [
|
available_commands = (
|
||||||
"create-profile",
|
"create-profile",
|
||||||
"update-profile",
|
"update-profile",
|
||||||
"derive-password"
|
"delete-profile",
|
||||||
]
|
"search-profile",
|
||||||
|
"derive-password",
|
||||||
|
)
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description=(
|
description=(
|
||||||
|
@ -121,10 +156,11 @@ parser = argparse.ArgumentParser(
|
||||||
|
|
||||||
parser.add_argument("-V", "--version", action="version", version="Penpot CLI %%develop%%")
|
parser.add_argument("-V", "--version", action="version", version="Penpot CLI %%develop%%")
|
||||||
parser.add_argument("action", action="store", choices=available_commands)
|
parser.add_argument("action", action="store", choices=available_commands)
|
||||||
parser.add_argument("-n", "--fullname", help="Fullname", action="store")
|
parser.add_argument("-f", "--force", help="force operation", action="store_true")
|
||||||
parser.add_argument("-e", "--email", help="Email", action="store")
|
parser.add_argument("-n", "--fullname", help="fullname", action="store")
|
||||||
parser.add_argument("-p", "--password", help="Password", action="store")
|
parser.add_argument("-e", "--email", help="email", action="store")
|
||||||
parser.add_argument("-c", "--connect", help="Connect to PREPL", action="store", default="tcp://localhost:6063")
|
parser.add_argument("-p", "--password", help="password", action="store")
|
||||||
|
parser.add_argument("-c", "--connect", help="connect to PREPL", action="store", default="tcp://localhost:6063")
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
@ -165,3 +201,19 @@ elif args.action == "derive-password":
|
||||||
password = getpass("Password: ")
|
password = getpass("Password: ")
|
||||||
|
|
||||||
derive_password(password)
|
derive_password(password)
|
||||||
|
|
||||||
|
elif args.action == "delete-profile":
|
||||||
|
email = args.email
|
||||||
|
soft = not args.force
|
||||||
|
|
||||||
|
if email is None:
|
||||||
|
email = input("Email: ")
|
||||||
|
|
||||||
|
delete_profile(email, soft)
|
||||||
|
|
||||||
|
elif args.action == "search-profile":
|
||||||
|
email = args.email
|
||||||
|
if email is None:
|
||||||
|
email = input("Email: ")
|
||||||
|
|
||||||
|
search_profile(email)
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
[app.db :as db]
|
[app.db :as db]
|
||||||
[app.rpc.commands.auth :as cmd.auth]
|
[app.rpc.commands.auth :as cmd.auth]
|
||||||
[app.util.json :as json]
|
[app.util.json :as json]
|
||||||
|
[app.util.time :as dt]
|
||||||
[cuerdas.core :as str]))
|
[cuerdas.core :as str]))
|
||||||
|
|
||||||
(defn- get-current-system
|
(defn- get-current-system
|
||||||
|
@ -63,9 +64,43 @@
|
||||||
params
|
params
|
||||||
{:email email
|
{:email email
|
||||||
:deleted-at nil}
|
:deleted-at nil}
|
||||||
{:return-keys false})]
|
{::db/return-keys? false})]
|
||||||
(pos? (:next.jdbc/update-count res))))))))
|
(pos? (:next.jdbc/update-count res))))))))
|
||||||
|
|
||||||
|
(defmethod run-json-cmd* :delete-profile
|
||||||
|
[{:keys [email soft]}]
|
||||||
|
(when-not email
|
||||||
|
(ex/raise :type :assertion
|
||||||
|
:code :invalid-arguments
|
||||||
|
:hint "email should be provided"))
|
||||||
|
|
||||||
|
(when-let [system (get-current-system)]
|
||||||
|
(db/with-atomic [conn (:app.db/pool system)]
|
||||||
|
|
||||||
|
(let [res (if soft
|
||||||
|
(db/update! conn :profile
|
||||||
|
{:deleted-at (dt/now)}
|
||||||
|
{:email email :deleted-at nil}
|
||||||
|
{::db/return-keys? false})
|
||||||
|
(db/delete! conn :profile
|
||||||
|
{:email email}
|
||||||
|
{::db/return-keys? false}))]
|
||||||
|
(pos? (:next.jdbc/update-count res))))))
|
||||||
|
|
||||||
|
(defmethod run-json-cmd* :search-profile
|
||||||
|
[{:keys [email]}]
|
||||||
|
(when-not email
|
||||||
|
(ex/raise :type :assertion
|
||||||
|
:code :invalid-arguments
|
||||||
|
:hint "email should be provided"))
|
||||||
|
|
||||||
|
(when-let [system (get-current-system)]
|
||||||
|
(db/with-atomic [conn (:app.db/pool system)]
|
||||||
|
|
||||||
|
(let [sql (str "select email, fullname, created_at, deleted_at from profile "
|
||||||
|
" where email similar to ? order by created_at desc limit 100")]
|
||||||
|
(db/exec! conn [sql email])))))
|
||||||
|
|
||||||
(defmethod run-json-cmd* :derive-password
|
(defmethod run-json-cmd* :derive-password
|
||||||
[{:keys [password]}]
|
[{:keys [password]}]
|
||||||
(auth/derive-password password))
|
(auth/derive-password password))
|
||||||
|
|
|
@ -25,6 +25,7 @@ RUN set -ex; \
|
||||||
woff-tools \
|
woff-tools \
|
||||||
woff2 \
|
woff2 \
|
||||||
python3 \
|
python3 \
|
||||||
|
python3-tabulate \
|
||||||
fontforge \
|
fontforge \
|
||||||
; \
|
; \
|
||||||
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen; \
|
echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen; \
|
||||||
|
|
Loading…
Reference in a new issue