aboutsummaryrefslogtreecommitdiff
path: root/backend/hist_data/gen_picked_data.py
blob: cd554d5ec1847d96294677399877859c2e234466 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#!/usr/bin/python3

"""
Adds additional manually-picked events to the database
"""

# Code used in unit testing (for resolving imports of modules within this directory)
import os, sys
parentDir = os.path.dirname(os.path.realpath(__file__))
sys.path.append(parentDir)
# Standard imports
import argparse
import json, sqlite3
# Local imports
from gen_imgs import convertImage

PICKED_DIR = 'picked'
PICKED_EVT_FILE = 'events.json'
DB_FILE = 'data.db'
IMG_OUT_DIR = 'img'

def genData(pickedDir: str, pickedEvtFile: str, dbFile: str, imgOutDir: str) -> None:
	dbCon = sqlite3.connect(dbFile)
	dbCur = dbCon.cursor()
	#
	with open(os.path.join(pickedDir, pickedEvtFile)) as f:
		eventsToAdd = json.load(f)
	nextId = -1
	for event in eventsToAdd:
		eventId = event['id'] if 'id' in event else None
		title = event['title'] if 'title' in event else None
		if eventId is None and title is None:
			print(f'ERROR: Entry with no ID or title: {event}')
			break
		#
		doAdd = eventId is None and len(event) > 1
		doModify = eventId is not None and len(event) > 1
		doDelete = not doModify and not doAdd
		if doAdd:
			print(f'Adding event with title "{title}"')
			dbCur.execute('INSERT INTO events VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
				(nextId, event['title'], event['start'], event['start_upper'], event['end'], event['end_upper'],
					event['fmt'], event['ctg']))
			if 'image' in event:
				print('> Adding image')
				image = event['image']
				outFile = os.path.join(imgOutDir, str(nextId) + '.jpg')
				success = convertImage(os.path.join(pickedDir, image['file']), outFile)
				if not success:
					print('ERROR: Conversion failed')
					break
				dbCur.execute('INSERT INTO images VALUES (?, ?, ?, ?, ?)',
					(nextId, image['url'], image['license'], image['artist'], image['credit']))
				dbCur.execute('INSERT INTO event_imgs VALUES (?, ?)', (nextId, nextId))
			if 'desc' in event:
				dbCur.execute('INSERT INTO descs VALUES (?, ?, ?)', (nextId, nextId, event['desc']))
			dbCur.execute('INSERT INTO pop VALUES (?, ?)', (nextId, event['pop']))
			nextId -= 1
		elif doDelete:
			if eventId:
				print(f'Deleting event with ID {eventId}')
			else:
				print(f'Deleting event with title "{title}"')
				row = dbCur.execute('SELECT id FROM events WHERE title = ?', (title,)).fetchone()
				if row is None:
					print(f'ERROR: Could not find event with title {title}')
					break
				eventId = row[0]
			dbCur.execute('DELETE FROM events WHERE id = ?', (eventId,))
			dbCur.execute('DELETE FROM pop WHERE id = ?', (eventId,))
			dbCur.execute('DELETE FROM descs WHERE id = ?', (eventId,))
			dbCur.execute('DELETE FROM event_imgs WHERE id = ?', (eventId,))
			# Note: Intentionally not deleting entries or files for images that become unused.
		else: # doModify
			print(f'Modifying event with ID {eventId}')
			if dbCur.execute('SELECT id FROM events WHERE id = ?', (eventId,)).fetchone() is None:
				print(f'ERROR: Could not find event with ID {eventId}')
				break
			for field in ['title', 'start', 'start_upper', 'end', 'end_upper', 'fmt', 'ctg']:
				if field in event:
					dbCur.execute(f'UPDATE events SET {field} = ? WHERE id = ?', (event[field], eventId,))
			if 'image' in event:
				print('> Adding image')
				image = event['image']
				outFile = os.path.join(imgOutDir, str(nextId) + '.jpg')
				success = convertImage(os.path.join(pickedDir, image['file']), outFile)
				if not success:
					print('ERROR: Conversion failed')
					break
				dbCur.execute('INSERT INTO images VALUES (?, ?, ?, ?, ?)',
					(nextId, image['url'], image['license'], image['artist'], image['credit']))
				row = dbCur.execute('SELECT img_id FROM event_imgs WHERE id = ?', (eventId,)).fetchone()
				if row is None:
					dbCur.execute('INSERT INTO event_imgs VALUES (?, ?)', (eventId, nextId))
				else:
					dbCur.execute('UPDATE event_imgs SET img_id = ? WHERE id = ?', (nextId, eventId))
					# Note: Intentionally not deleting entries or files for images that become unused.
			if 'desc' in event:
				row = dbCur.execute('SELECT desc FROM descs WHERE id = ?', (eventId,)).fetchone()
				if row is None:
					dbCur.execute('INSERT INTO descs VALUES (?, ?)', (eventId, event['desc']))
				else:
					dbCur.execute('UPDATE event_imgs SET desc = ? WHERE id = ?', (event['desc'], eventId))
			if 'pop' in event:
				row = dbCur.execute('SELECT pop FROM pop WHERE id = ?', (eventId,)).fetchone()
				if row is None:
					dbCur.execute('INSERT INTO pop VALUES (?, ?)', (eventId, event['pop']))
				else:
					dbCur.execute('UPDATE pop SET pop = ? WHERE id = ?', (event['pop'], eventId))
			nextId -= 1
	#
	dbCon.commit()
	dbCon.close()

if __name__ == '__main__':
	parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
	args = parser.parse_args()
	#
	genData(PICKED_DIR, PICKED_EVT_FILE, DB_FILE, IMG_OUT_DIR)