DeCoster's picture
create a python project that prompts for calendar entries and creates a .ics file as output
fd75173 verified
Raw History Blame Contribute Delete
2.62 kB
python
from flask import Flask, render_template, request, jsonify, send_file
from ics import Calendar, Event
from datetime import datetime
import io
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/generate', methods=['POST'])
def generate_ics():
try:
data = request.get_json()
events_data = data.get('events', [])
cal = Calendar()
for event_data in events_data:
event = Event()
event.name = event_data.get('title', 'Untitled Event')
event.location = event_data.get('location', '')
event.description = event_data.get('description', '')
# Parse dates based on all-day flag
is_all_day = event_data.get('allDay', False)
if is_all_day:
start_str = event_data.get('start')
end_str = event_data.get('end')
# Parse date strings (format depends on browser locale)
start_date = datetime.strptime(start_str.split('T')[0], '%Y-%m-%d').date()
end_date = datetime.strptime(end_str.split('T')[0], '%Y-%m-%d').date()
event.begin = start_date
event.end = end_date
event.all_day = True
else:
# Parse datetime strings
start_str = event_data.get('start')
end_str = event_data.get('end')
# Handle different datetime formats from different browsers
for fmt in ('%Y-%m-%dT%H:%M', '%m/%d/%Y, %I:%M:%S %p', '%Y-%m-%d %H:%M:%S'):
try:
start_dt = datetime.strptime(start_str, fmt)
end_dt = datetime.strptime(end_str, fmt)
event.begin = start_dt
event.end = end_dt
break
except ValueError:
continue
cal.events.add(event)
# Create in-memory file
ics_file = io.BytesIO()
ics_file.write(str(cal).encode('utf-8'))
ics_file.seek(0)
return send_file(
ics_file,
as_attachment=True,
download_name='calendar_events.ics',
mimetype='text/calendar'
)
except Exception as e:
print(f"Error generating ICS: {str(e)}")
return jsonify({'error': str(e)}), 500
if __name__ == '__main__':
app.run(debug=True)
</html>