Spaces:
Running
Running
| from datetime import datetime, timedelta | |
| from icalendar import Calendar, Event | |
| from pathlib import Path | |
| import pytz | |
| async def create_calendar_event( | |
| title: str, | |
| start: str, | |
| end: str, | |
| description: str = '', | |
| location: str = '' | |
| ) -> dict: | |
| """ | |
| Create ICS calendar event | |
| Args: | |
| title: Event title | |
| start: Start datetime (ISO format or natural language) | |
| end: End datetime (ISO format or natural language) | |
| description: Event description | |
| location: Event location | |
| Returns: | |
| Dict with ICS file path | |
| """ | |
| try: | |
| # Parse dates | |
| start_dt = parse_datetime(start) | |
| end_dt = parse_datetime(end) | |
| # Create calendar | |
| cal = Calendar() | |
| cal.add('prodid', '-//LifeAdmin AI//lifeadmin.ai//') | |
| cal.add('version', '2.0') | |
| # Create event | |
| event = Event() | |
| event.add('summary', title) | |
| event.add('dtstart', start_dt) | |
| event.add('dtend', end_dt) | |
| event.add('description', description) | |
| if location: | |
| event.add('location', location) | |
| event.add('dtstamp', datetime.now(pytz.UTC)) | |
| # Generate unique ID | |
| import uuid | |
| event.add('uid', str(uuid.uuid4())) | |
| cal.add_component(event) | |
| # Save to file | |
| output_path = f"data/outputs/event_{datetime.now().strftime('%Y%m%d_%H%M%S')}.ics" | |
| Path(output_path).parent.mkdir(parents=True, exist_ok=True) | |
| with open(output_path, 'wb') as f: | |
| f.write(cal.to_ical()) | |
| return { | |
| 'success': True, | |
| 'output_path': output_path, | |
| 'event': { | |
| 'title': title, | |
| 'start': start_dt.isoformat(), | |
| 'end': end_dt.isoformat(), | |
| 'description': description | |
| } | |
| } | |
| except Exception as e: | |
| return {'error': str(e), 'success': False} | |
| def parse_datetime(dt_string: str) -> datetime: | |
| """Parse datetime from various formats""" | |
| try: | |
| # Try ISO format | |
| return datetime.fromisoformat(dt_string.replace('Z', '+00:00')) | |
| except: | |
| pass | |
| try: | |
| # Try common formats | |
| for fmt in ['%Y-%m-%d %H:%M', '%Y-%m-%d', '%m/%d/%Y %H:%M', '%m/%d/%Y']: | |
| try: | |
| dt = datetime.strptime(dt_string, fmt) | |
| return pytz.UTC.localize(dt) | |
| except: | |
| continue | |
| except: | |
| pass | |
| # Default to now | |
| return datetime.now(pytz.UTC) | |
| async def create_multiple_events(events: list) -> dict: | |
| """Create multiple calendar events from a list""" | |
| results = [] | |
| for event_data in events: | |
| result = await create_calendar_event(**event_data) | |
| results.append(result) | |
| successful = sum(1 for r in results if r.get('success')) | |
| return { | |
| 'success': True, | |
| 'total_events': len(events), | |
| 'successful': successful, | |
| 'results': results | |
| } |