|
|
|
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():
|
|
|
|
sup_img = get_support_images()
|
|
|
|
return render_template('index.html', title='', sup_img_list=sup_img)
|
|
|
|
|
|
|
|
@app.route('/grph')
|
|
|
|
def graphics():
|
|
|
|
return render_template('grph.html')
|
|
|
|
|
|
|
|
@app.route('/events')
|
|
|
|
def events():
|
|
|
|
events = get_all_content('event')
|
|
|
|
return render_template('list.html', title='Events', content=events)
|
|
|
|
|
|
|
|
@app.route('/exhibitions')
|
|
|
|
def exhibitions():
|
|
|
|
return render_template('list.html', title='Exhibitions')
|
|
|
|
|
|
|
|
@app.route('/exhibitions/<ex_type>')
|
|
|
|
def exhibition_type(ex_type):
|
|
|
|
if ex_type == "local-artists-network":
|
|
|
|
ex_type = "LAN"
|
|
|
|
elif ex_type == "unsettling-the-algorithm":
|
|
|
|
ex_type = "UTA"
|
|
|
|
elif ex_type == "ethics-studio":
|
|
|
|
ex_type = "ES"
|
|
|
|
exhibitions = get_all_content('exhibition')
|
|
|
|
return render_template('list-exhibitions.html', title="Exhibitions", content=exhibitions, ex_type=ex_type)
|
|
|
|
|
|
|
|
@app.route('/conferences')
|
|
|
|
def conference():
|
|
|
|
conferences = get_all_content('conference')
|
|
|
|
return render_template('list.html', title='Conferences', content=conferences)
|
|
|
|
|
|
|
|
@app.route('/<type>/<title>')
|
|
|
|
def event_article(type, title):
|
|
|
|
data = get_content_by_title(title, type)
|
|
|
|
return render_template('article.html', title=title, content=data)
|
|
|
|
|
|
|
|
@app.route('/<type>/<ex_type>/<title>')
|
|
|
|
def event_articles(type, title, ex_type):
|
|
|
|
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 = []
|
|
|
|
exh_type = None
|
|
|
|
for entry in entries:
|
|
|
|
# Clear arrays
|
|
|
|
times = []
|
|
|
|
dates = []
|
|
|
|
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')
|
|
|
|
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 get_support_images():
|
|
|
|
# Specify the folder where images are stored
|
|
|
|
image_folder = os.path.join(app.static_folder, 'images/support')
|
|
|
|
|
|
|
|
# Define a list of supported image file extensions
|
|
|
|
valid_extensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp']
|
|
|
|
|
|
|
|
# List to hold the image file names
|
|
|
|
image_files = []
|
|
|
|
|
|
|
|
# Loop through files in the directory
|
|
|
|
for filename in os.listdir(image_folder):
|
|
|
|
# Check if the file is an image (by extension)
|
|
|
|
if os.path.splitext(filename)[1].lower() in valid_extensions:
|
|
|
|
image_files.append(filename)
|
|
|
|
|
|
|
|
return image_files
|
|
|
|
|
|
|
|
|
|
|
|
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)
|