from flask import Flask, render_template import contentful from dotenv import load_dotenv import os import markdown load_dotenv() app = Flask(__name__, static_folder='public') # Set your Contentful space ID and access token SPACE_ID = os.getenv('SPACE_ID') ACCESS_TOKEN = os.getenv('ACCESS_TOKEN') client = contentful.Client(SPACE_ID, ACCESS_TOKEN) @app.route('/') def index(): return render_template('index.html', title='') @app.route('/events') def events(): events = get_all_content('event') return render_template('list.html', title='Events', content=events) @app.route('/exhibitions') def exhibitions(): exhibitions = get_all_content('exhibition') return render_template('list.html', title='Exhibitions', content=exhibitions) @app.route('/conferences') def conference(): conferences = get_all_content('conference') return render_template('list.html', title='Conferences', content=conferences) @app.route('//') def event_article(type, title): data = get_content_by_title(title, type) return render_template('article.html', title=title, content=data) @app.route('/locations') def locations(): return render_template('locations.html', title='Locations') def get_all_content(type): entries = client.entries({'content_type': type}) content_list = process_content(entries, type) return content_list def get_content_by_title(title, pre_type): type = pre_type[:-1] entries = client.entries({'query': title, 'limit': 5}) exact_matches = [entry for entry in entries if getattr(entry, f'title_of_{type}') == title] content_list = process_content(exact_matches, type) return content_list def process_content(entries, type): content_list = [] times = [] dates = [] exh_type = None for entry in entries: if type == 'event': times = getattr(entry, f'{type}_times') dates = getattr(entry, f'{type}_dates') if type == 'conference': date_time_obj = getattr(entry, f'{type}_start_date_time') date_str, time_str = format_datetime(date_time_obj) try: end_time_str = getattr(entry, f'{type}_end_date_time') except: end_time_str = None if end_time_str != None: end_time_str = end_time_str.strftime('%I%p').upper().lstrip('0') concat_time_str = time_str + '->' + end_time_str else: concat_time_str = time_str dates.append(date_str) times.append(concat_time_str) if type == 'exhibition': exh_type = getattr(entry, f'{type}_type') try: bookUrl = getattr(entry, 'book_url') print(bookUrl) except: bookUrl = None content = { 'title': getattr(entry, f'title_of_{type}'), 'information': markdown.markdown(getattr(entry, f'{type}_information')), 'image': 'https:{0}'.format(getattr(entry, f'{type}_reference_image').url()), 'artists': getattr(entry, f'{type}_artists'), 'dates': dates, 'times': times, 'location': getattr(entry, f'{type}_location'), 'bookUrl': bookUrl, 'exh_type': exh_type } content_list.append(content) # Sort the content list by the 'title' key alphabetically content_list.sort(key=lambda x: x['title'].lower()) return content_list def format_datetime(dt): date_str = dt.strftime('%d.%m.%y') time_str = dt.strftime('%I%p').upper().lstrip('0') return date_str, time_str if __name__ == '__main__': app.run(debug=True)