import cpsl
import datetime
app = cpsl.App(name="collections-demo", image=cpsl.Image())
contacts = app.collection(
"contacts",
columns=[
cpsl.Column("name"),
cpsl.Column("email", type="email"),
cpsl.Column("website", type="link"),
cpsl.Column("status", type="status"),
],
scope="app",
sortable=True,
filterable=True,
paginate=20,
)
bookmarks = app.collection(
"bookmarks",
columns=["title", "url", "saved_at"],
scope="user",
sortable=True,
paginate=10,
)
scratchpad = app.collection(
"scratchpad",
columns=["note", "created_at"],
scope="session",
paginate=20,
)
@app.page("Contacts", icon="users", access="authenticated")
def contacts_page():
return cpsl.ui.Page(
[
cpsl.ui.Text("Contacts", style="heading"),
cpsl.ui.Divider(),
cpsl.ui.Table(contacts),
]
)
@app.message()
async def handle(session: cpsl.Session, msg: cpsl.Message):
text = (msg.text or "").strip()
if text.startswith("add "):
name, email, website = [part.strip() for part in text[4:].split(",", 2)]
created = await contacts.insert_one(
{
"name": name,
"email": email,
"website": website,
"status": "active",
}
)
await session.reply(f"Added {created['name']} ({created['id']})")
return
if text.startswith("bookmark "):
title, url = [part.strip() for part in text[9:].split(",", 1)]
await session.db.bookmarks.insert_one(
{
"title": title,
"url": url,
"saved_at": datetime.datetime.now(datetime.timezone.utc).isoformat(),
}
)
await session.reply("Saved bookmark.")
return
if text.startswith("note "):
await session.db.scratchpad.insert_one(
{
"note": text[5:].strip(),
"created_at": datetime.datetime.now(datetime.timezone.utc).isoformat(),
}
)
await session.reply("Saved note.")
return
await session.reply(
"Commands:\n"
"- add name, email, website\n"
"- bookmark title, url\n"
"- note text"
)