calendar-gym / server /data /multi_user_sample.py
santosh-iima's picture
Upload 91 files
beb8990 verified
"""
Multi-User Sample Data for Calendar Application
"""
from datetime import datetime, timedelta
from typing import List, Dict, Any
from .enhanced_event_seed_data import generate_enhanced_event_sql
from .watch_channel_seed_data import get_watch_channel_sql
def get_multi_user_sample_data() -> Dict[str, Any]:
"""
Generate sample data for multiple users demonstrating multi-user scenarios
"""
# Sample users
users = [
{
"user_id": "alice_manager",
"email": "alice.manager@techcorp.com",
"name": "Alice Johnson",
"given_name": "Alice",
"family_name": "Johnson",
"static_token": "ya29.A0ARrdaM-k9Vq7GzY2pL4mQf8sN1xT0bR3uHcJWv5yKzP6eF2.qwErTyUIopASDfGhJkLzXcVbNm12_34-56",
"timezone": "America/New_York",
"role": "Project Manager"
},
{
"user_id": "bob_developer",
"email": "bob.smith@techcorp.com",
"name": "Bob Smith",
"given_name": "Bob",
"family_name": "Smith",
"static_token": "ya29.A0ARrdaM-Zx8Nw3Q4pVb6Ls9R1mT0cG2uF5yH7kJd8sA1Lq2.wErtYuIoPaSdFgHjKlZxCvBnM987_65-43",
"timezone": "America/Los_Angeles",
"role": "Senior Developer"
},
{
"user_id": "carol_designer",
"email": "carol.white@techcorp.com",
"name": "Carol White",
"given_name": "Carol",
"family_name": "White",
"static_token": "ya29.A0ARrdaM-b7Hc5Vn2Qm8R1sT4pL0xY9wK3uF6jZ2eRc1.QaWsEdRfTgHyJuIkOlPzXcVbNmKjHgf_21-098",
"timezone": "Europe/London",
"role": "UX Designer"
},
{
"user_id": "dave_sales",
"email": "dave.brown@techcorp.com",
"name": "Dave Brown",
"given_name": "Dave",
"family_name": "Brown",
"static_token": "ya29.A0ARrdaM-p3Lk9Vb6Qw2Zx8N1sT4mH7gF5yR0uJc2ePq.ZxCvBnMlKjHgFfDsaQwErTyUiOpAsDfGhJk_77-11",
"timezone": "America/Chicago",
"role": "Sales Director"
}
]
# Alice's calendars (Project Manager)
alice_calendars = [
{
"calendar_id": "alice-primary",
"user_id": "alice_manager",
"summary": "Alice Johnson",
"description": "Primary calendar for Alice Johnson - Project Manager",
"time_zone": "America/New_York",
"is_primary": True,
"color_id": "1"
},
{
"calendar_id": "alice-projects",
"user_id": "alice_manager",
"summary": "Project Management",
"description": "Project meetings, deadlines, and milestones",
"time_zone": "America/New_York",
"is_primary": False,
"color_id": "7"
},
{
"calendar_id": "alice-team",
"user_id": "alice_manager",
"summary": "Team Coordination",
"description": "Team meetings, 1-on-1s, and team events",
"time_zone": "America/New_York",
"is_primary": False,
"color_id": "11"
}
]
# Bob's calendars (Developer)
bob_calendars = [
{
"calendar_id": "bob-primary",
"user_id": "bob_developer",
"summary": "Bob Smith",
"description": "Primary calendar for Bob Smith - Senior Developer",
"time_zone": "America/Los_Angeles",
"is_primary": True,
"color_id": "2"
},
{
"calendar_id": "bob-development",
"user_id": "bob_developer",
"summary": "Development Schedule",
"description": "Sprint planning, code reviews, and development tasks",
"time_zone": "America/Los_Angeles",
"is_primary": False,
"color_id": "9"
},
{
"calendar_id": "bob-personal",
"user_id": "bob_developer",
"summary": "Personal Time",
"description": "Personal appointments and time off",
"time_zone": "America/Los_Angeles",
"is_primary": False,
"color_id": "14"
}
]
# Carol's calendars (Designer)
carol_calendars = [
{
"calendar_id": "carol-primary",
"user_id": "carol_designer",
"summary": "Carol White",
"description": "Primary calendar for Carol White - UX Designer",
"time_zone": "Europe/London",
"is_primary": True,
"color_id": "4"
},
{
"calendar_id": "carol-design",
"user_id": "carol_designer",
"summary": "Design Work",
"description": "Design sessions, user research, and creative time",
"time_zone": "Europe/London",
"is_primary": False,
"color_id": "16"
}
]
# Dave's calendars (Sales)
dave_calendars = [
{
"calendar_id": "dave-primary",
"user_id": "dave_sales",
"summary": "Dave Brown",
"description": "Primary calendar for Dave Brown - Sales Director",
"time_zone": "America/Chicago",
"is_primary": True,
"color_id": "6"
},
{
"calendar_id": "dave-sales",
"user_id": "dave_sales",
"summary": "Sales Activities",
"description": "Client meetings, sales calls, and deals",
"time_zone": "America/Chicago",
"is_primary": False,
"color_id": "23"
}
]
# Sample events for each user
base_date = datetime.now().replace(hour=9, minute=0, second=0, microsecond=0)
alice_events = [
{
"event_id": "alice-event-1",
"calendar_id": "alice-projects",
"user_id": "alice_manager",
"summary": "Sprint Planning Meeting",
"description": "Plan upcoming sprint with development team",
"location": "Conference Room A",
"start_datetime": base_date,
"end_datetime": base_date + timedelta(hours=1),
"status": "confirmed"
},
{
"event_id": "alice-event-2",
"calendar_id": "alice-team",
"user_id": "alice_manager",
"summary": "1-on-1 with Bob",
"description": "Weekly check-in with Bob Smith",
"location": "Alice's Office",
"start_datetime": base_date + timedelta(days=1, hours=2),
"end_datetime": base_date + timedelta(days=1, hours=2, minutes=30),
"status": "confirmed"
},
{
"event_id": "alice-event-3",
"calendar_id": "alice-primary",
"user_id": "alice_manager",
"summary": "Board Meeting",
"description": "Monthly board meeting presentation",
"location": "Executive Conference Room",
"start_datetime": base_date + timedelta(days=7),
"end_datetime": base_date + timedelta(days=7, hours=2),
"status": "confirmed"
}
]
bob_events = [
{
"event_id": "bob-event-1",
"calendar_id": "bob-development",
"user_id": "bob_developer",
"summary": "Code Review Session",
"description": "Review pull requests from junior developers",
"location": "Development Room",
"start_datetime": base_date + timedelta(hours=3),
"end_datetime": base_date + timedelta(hours=4),
"status": "confirmed"
},
{
"event_id": "bob-event-2",
"calendar_id": "bob-primary",
"user_id": "bob_developer",
"summary": "Architecture Discussion",
"description": "Discuss system architecture for new feature",
"location": "Video Call",
"start_datetime": base_date + timedelta(days=2),
"end_datetime": base_date + timedelta(days=2, hours=1, minutes=30),
"status": "confirmed"
},
{
"event_id": "bob-event-3",
"calendar_id": "bob-personal",
"user_id": "bob_developer",
"summary": "Dentist Appointment",
"description": "Annual dental checkup",
"location": "Downtown Dental",
"start_datetime": base_date + timedelta(days=5, hours=5),
"end_datetime": base_date + timedelta(days=5, hours=6),
"status": "confirmed"
}
]
carol_events = [
{
"event_id": "carol-event-1",
"calendar_id": "carol-design",
"user_id": "carol_designer",
"summary": "User Research Session",
"description": "Interview users about new feature requirements",
"location": "Research Lab",
"start_datetime": base_date + timedelta(hours=1),
"end_datetime": base_date + timedelta(hours=3),
"status": "confirmed"
},
{
"event_id": "carol-event-2",
"calendar_id": "carol-primary",
"user_id": "carol_designer",
"summary": "Design Review",
"description": "Present mockups to stakeholders",
"location": "Design Studio",
"start_datetime": base_date + timedelta(days=3, hours=2),
"end_datetime": base_date + timedelta(days=3, hours=3, minutes=30),
"status": "confirmed"
}
]
dave_events = [
{
"event_id": "dave-event-1",
"calendar_id": "dave-sales",
"user_id": "dave_sales",
"summary": "Client Demo",
"description": "Product demonstration for potential enterprise client",
"location": "Client Office",
"start_datetime": base_date + timedelta(days=1),
"end_datetime": base_date + timedelta(days=1, hours=2),
"status": "confirmed"
},
{
"event_id": "dave-event-2",
"calendar_id": "dave-primary",
"user_id": "dave_sales",
"summary": "Sales Team Meeting",
"description": "Weekly sales team sync and pipeline review",
"location": "Sales Conference Room",
"start_datetime": base_date + timedelta(days=4),
"end_datetime": base_date + timedelta(days=4, hours=1),
"status": "confirmed"
}
]
settings = [
{"id": "alice_timezone", "user_id": "alice_manager", "value": "America/New_York"},
{"id": "bob_timezone", "user_id": "bob_developer", "value": "America/Los_Angeles"},
{"id": "carol_timezone", "user_id": "carol_designer", "value": "Europe/London"},
{"id": "dave_timezone", "user_id": "dave_sales", "value": "America/Chicago"}
]
scopes = [
{"id": "scope-alice", "type": "user", "value": "alice.manager@techcorp.com"},
{"id": "scope-bob", "type": "user", "value": "bob.smith@techcorp.com"},
{"id": "scope-carol", "type": "user", "value": "carol.white@techcorp.com"},
{"id": "scope-dave", "type": "user", "value": "dave.brown@techcorp.com"},
{"id": "scope-group", "type": "group", "value": "product-team@techcorp.com"},
{"id": "scope-domain", "type": "domain", "value": "techcorp.com"},
{"id": "scope-public", "type": "default", "value":"public"}
]
acls = [
# Alice's calendar ACLs (owner of her calendars)
{
"id": "acl-alice-primary",
"calendar_id": "alice-primary",
"user_id": "alice_manager",
"role": "owner",
"scope_id": "scope-alice",
"etag": "etag-alice-primary"
},
{
"id": "acl-alice-projects",
"calendar_id": "alice-projects",
"user_id": "alice_manager",
"role": "owner",
"scope_id": "scope-alice",
"etag": "etag-alice-projects"
},
{
"id": "acl-alice-team",
"calendar_id": "alice-team",
"user_id": "alice_manager",
"role": "owner",
"scope_id": "scope-alice",
"etag": "etag-alice-team"
},
# Bob's calendar ACLs (owner of his calendars)
{
"id": "acl-bob-primary",
"calendar_id": "bob-primary",
"user_id": "bob_developer",
"role": "owner",
"scope_id": "scope-bob",
"etag": "etag-bob-primary"
},
{
"id": "acl-bob-development",
"calendar_id": "bob-development",
"user_id": "bob_developer",
"role": "owner",
"scope_id": "scope-bob",
"etag": "etag-bob-development"
},
{
"id": "acl-bob-personal",
"calendar_id": "bob-personal",
"user_id": "bob_developer",
"role": "owner",
"scope_id": "scope-bob",
"etag": "etag-bob-personal"
},
# Carol's calendar ACLs (owner of her calendars)
{
"id": "acl-carol-primary",
"calendar_id": "carol-primary",
"user_id": "carol_designer",
"role": "owner",
"scope_id": "scope-carol",
"etag": "etag-carol-primary"
},
{
"id": "acl-carol-design",
"calendar_id": "carol-design",
"user_id": "carol_designer",
"role": "owner",
"scope_id": "scope-carol",
"etag": "etag-carol-design"
},
# Dave's calendar ACLs (owner of his calendars)
{
"id": "acl-dave-primary",
"calendar_id": "dave-primary",
"user_id": "dave_sales",
"role": "owner",
"scope_id": "scope-dave",
"etag": "etag-dave-primary"
},
{
"id": "acl-dave-sales",
"calendar_id": "dave-sales",
"user_id": "dave_sales",
"role": "owner",
"scope_id": "scope-dave",
"etag": "etag-dave-sales"
},
# Shared access examples
{
"id": "acl-shared-1",
"calendar_id": "alice-projects",
"user_id": "alice_manager",
"role": "writer",
"scope_id": "scope-bob",
"etag": "etag-shared-1"
},
{
"id": "acl-shared-2",
"calendar_id": "alice-projects",
"user_id": "alice_manager",
"role": "reader",
"scope_id": "scope-carol",
"etag": "etag-shared-2"
}
]
return {
"users": users,
"calendars": alice_calendars + bob_calendars + carol_calendars + dave_calendars,
"events": alice_events + bob_events + carol_events + dave_events,
"settings": settings,
"scopes": scopes,
"acls": acls,
"description": "Multi-user sample data with 4 users (Alice-PM, Bob-Dev, Carol-Design, Dave-Sales) demonstrating isolated data per user"
}
def get_multi_user_sql(database_name: str = "multi_user_calendar") -> str:
"""
Generate SQL statements for multi-user sample data
"""
data = get_multi_user_sample_data()
sql_statements = []
# Header
sql_statements.append(f"-- Multi-User Calendar Sample Data for {database_name}")
sql_statements.append(f"-- Generated on: {datetime.now().isoformat()}")
sql_statements.append("-- Contains sample data for 4 users with isolated calendars and events")
sql_statements.append("")
# Users
sql_statements.append("-- Users")
sql_statements.append("INSERT INTO users (user_id, email, name, given_name, family_name, static_token, timezone, is_active, is_verified, created_at, updated_at) VALUES")
user_values = []
for user in data["users"]:
# Escape single quotes by doubling them
name = user['name'].replace("'", "''")
given_name = user.get('given_name', '').replace("'", "''")
family_name = user.get('family_name', '').replace("'", "''")
user_values.append(
f"('{user['user_id']}', '{user['email']}', '{name}', "
f"'{given_name}', '{family_name}', "
f"'{user['static_token']}', '{user['timezone']}', 1, 1, "
f"datetime('now'), datetime('now'))"
)
sql_statements.append(",\n".join(user_values) + ";")
sql_statements.append("")
# Calendars
sql_statements.append("-- Calendars")
sql_statements.append("INSERT INTO calendars (calendar_id, user_id, summary, description, time_zone, is_primary, color_id, hidden, selected, deleted, created_at, updated_at) VALUES")
calendar_values = []
for calendar in data["calendars"]:
# Escape single quotes by doubling them
summary = calendar['summary'].replace("'", "''")
description = calendar.get('description', '').replace("'", "''")
calendar_values.append(
f"('{calendar['calendar_id']}', '{calendar['user_id']}', '{summary}', "
f"'{description}', '{calendar['time_zone']}', "
f"{1 if calendar.get('is_primary') else 0}, '{calendar.get('color_id', '1')}', "
f"0, 1, 0, datetime('now'), datetime('now'))"
)
sql_statements.append(",\n".join(calendar_values) + ";")
sql_statements.append("")
# Events
sql_statements = generate_enhanced_event_sql(sql_statements)
# Colors (shared across users)
sql_statements.append("-- Google Calendar Colors (shared across all users)")
from data.google_colors import GOOGLE_CALENDAR_COLORS
sql_statements.append("INSERT INTO colors (color_id, color_type, background, foreground, created_at, updated_at) VALUES")
color_values = []
for color in GOOGLE_CALENDAR_COLORS:
color_values.append(
f"('{color['color_id']}', '{color['color_type'].upper()}', '{color['background']}', "
f"'{color['foreground']}', datetime('now'), datetime('now'))"
)
sql_statements.append(",\n".join(color_values) + ";")
sql_statements.append("")
# Settings
sql_statements.append("-- Calendar Settings")
sql_statements.append("INSERT INTO settings (id, user_id, value) VALUES")
setting_values = []
for setting in data["settings"]:
setting_values.append(
f"('{setting['id']}', '{setting['user_id']}', '{setting['value']}')"
)
sql_statements.append(",\n".join(setting_values) + ";\n")
sql_statements.append("")
# Scopes
sql_statements.append("-- ACL Scopes")
sql_statements.append("INSERT INTO scopes (id, type, value) VALUES")
scope_values = []
for scope in data["scopes"]:
scope_values.append(
f"('{scope['id']}', '{scope['type']}', '{scope['value']}')"
)
sql_statements.append(",\n".join(scope_values) + ";\n")
sql_statements.append("")
# ACLs
sql_statements.append("-- Access Control Rules")
sql_statements.append("INSERT INTO acls (id, calendar_id, user_id, role, scope_id, etag) VALUES")
acl_values = []
for acl in data["acls"]:
acl_values.append(
f"('{acl['id']}', '{acl['calendar_id']}', '{acl['user_id']}', "
f"'{acl['role']}', '{acl['scope_id']}', '{acl['etag']}')"
)
sql_statements.append(",\n".join(acl_values) + ";\n")
sql_statements.append("")
sql_statements = get_watch_channel_sql(sql_statements)
return "\n".join(sql_statements)