aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
Diffstat (limited to 'backend')
-rwxr-xr-xbackend/hist_data/gen_picked_data.py102
-rw-r--r--backend/hist_data/picked/README.md11
-rw-r--r--backend/tests/test_gen_picked_data.py40
3 files changed, 99 insertions, 54 deletions
diff --git a/backend/hist_data/gen_picked_data.py b/backend/hist_data/gen_picked_data.py
index 933af24..cd554d5 100755
--- a/backend/hist_data/gen_picked_data.py
+++ b/backend/hist_data/gen_picked_data.py
@@ -27,31 +27,87 @@ def genData(pickedDir: str, pickedEvtFile: str, dbFile: str, imgOutDir: str) ->
eventsToAdd = json.load(f)
nextId = -1
for event in eventsToAdd:
- row = dbCur.execute('SELECT id from events where title = ?', (event['title'],)).fetchone()
- if row is not None:
- print(f'WARNING: Event "{event["title"]}" already exists, and will be skipped')
- continue
- print(f'Adding event {event["title"]}')
- print("- Updating 'events'")
- dbCur.execute('INSERT INTO events VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
- (nextId, event['title'], event['start'], event['start_upper'], event['end'], event['end_upper'],
- event['fmt'], event['ctg']))
- print('- Converting image file')
- image = event['image']
- success = convertImage(os.path.join(pickedDir, image['file']), os.path.join(imgOutDir, str(nextId) + '.jpg'))
- if not success:
+ 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
- print("- Updating 'images'")
- dbCur.execute('INSERT INTO images VALUES (?, ?, ?, ?, ?)',
- (nextId, image['url'], image['license'], image['artist'], image['credit']))
- print("- Updating 'event_imgs'")
- dbCur.execute('INSERT INTO event_imgs VALUES (?, ?)', (nextId, nextId))
- print("- Updating 'descs'")
- dbCur.execute('INSERT INTO descs VALUES (?, ?, ?)', (nextId, nextId, event['desc']))
- print("- Updating 'pop'")
- dbCur.execute('INSERT INTO pop VALUES (?, ?)', (nextId, event['pop']))
#
- nextId -= 1
+ 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()
diff --git a/backend/hist_data/picked/README.md b/backend/hist_data/picked/README.md
index 395fd9d..659c175 100644
--- a/backend/hist_data/picked/README.md
+++ b/backend/hist_data/picked/README.md
@@ -1,12 +1,13 @@
-This directory holds data for additional manually-picked events.
+This directory holds data for manually-picked events.
Files
=====
- events.json <br>
- Encodes an array of objects, each describing an event to add.
+ Encodes an array of objects, each describing an event to modify, add, or delete.
For example:
[{
+ "id": 81068910,
"title": "COVID-19 Pandemic",
"start": 2458919,
"start_upper": null,
@@ -25,5 +26,7 @@ Files
"pop": 100
}]
- The `image.file` field should name an image file in this directory.
- Other fields correspond to those in the `events`, `images`, `descs`, and `pop` tables (see `../README.md`).
+ - For event modification, specify `id` and one or more other fields to change.
+ If `image` is present, all its fields should be present.
+ - For event deletion, specify only `id` or `title`.
+ - For event addition, specify all fields except `id`, and possibly `image` and `desc`.
diff --git a/backend/tests/test_gen_picked_data.py b/backend/tests/test_gen_picked_data.py
index d469a31..8f1beda 100644
--- a/backend/tests/test_gen_picked_data.py
+++ b/backend/tests/test_gen_picked_data.py
@@ -35,12 +35,10 @@ class TestGenImgs(unittest.TestCase):
"desc": "Global pandemic caused by the virus SARS-CoV-2",
"pop": 100
},{
+ "id": 2,
"title": "foo",
"start": -100,
- "start_upper": 2000,
- "end": null,
- "end_upper": null,
- "fmt": 0,
+ "start_upper": null,
"ctg": "discovery",
"image": {
"file": "foo.jpg",
@@ -48,26 +46,9 @@ class TestGenImgs(unittest.TestCase):
"license": "cc-by",
"artist": "Fibble Wesky",
"credit": "Plosta Grimble and Hoska Ferlento"
- },
- "desc": "Rhubarb, broccoli, and the fifth box under Tuesday",
- "pop": 0
+ }
},{
- "title": "event one",
- "start": 100,
- "start_upper": null,
- "end": null,
- "end_upper": null,
- "fmt": 0,
- "ctg": "event",
- "image": {
- "file": "x.jpg",
- "url": "?",
- "license": "cc0",
- "artist": "?",
- "credit": "???"
- },
- "desc": "?",
- "pop": 0
+ "title": "event three"
}]
''')
# Create picked images
@@ -82,6 +63,8 @@ class TestGenImgs(unittest.TestCase):
'INSERT INTO events VALUES (?, ?, ?, ?, ?, ?, ?, ?)',
{
(1, 'event one', 100, 1000, None, None, 0, 'event'),
+ (2, 'event two', 200, 2000, None, None, 0, 'event'),
+ (3, 'event three', 300, 3000, None, None, 0, 'event'),
}
)
createTestDbTable(
@@ -98,6 +81,7 @@ class TestGenImgs(unittest.TestCase):
'INSERT INTO event_imgs VALUES (?, ?)',
{
(1, 10),
+ (2, 10),
}
)
createTestDbTable(
@@ -106,6 +90,7 @@ class TestGenImgs(unittest.TestCase):
'INSERT INTO descs VALUES (?, ?, ?)',
{
(1, 100, 'desc one'),
+ (3, 200, 'desc three'),
}
)
createTestDbTable(
@@ -114,6 +99,8 @@ class TestGenImgs(unittest.TestCase):
'INSERT INTO pop VALUES (?, ?)',
{
(1, 99),
+ (2, 35),
+ (3, 1),
}
)
# Create existing event images
@@ -132,8 +119,8 @@ class TestGenImgs(unittest.TestCase):
readTestDbTable(dbFile, 'SELECT id, title, start, start_upper, end, end_upper, fmt, ctg FROM events'),
{
(1, 'event one', 100, 1000, None, None, 0, 'event'),
+ (2, 'foo', -100, None, None, None, 0, 'discovery'),
(-1, 'COVID-19 Pandemic', 2458919, None, None, None, 2, 'event'),
- (-2, 'foo', -100, 2000, None, None, 0, 'discovery'),
}
)
self.assertEqual(
@@ -149,8 +136,8 @@ class TestGenImgs(unittest.TestCase):
readTestDbTable(dbFile, 'SELECT id, img_id FROM event_imgs'),
{
(1, 10),
+ (2, -2),
(-1, -1),
- (-2, -2),
}
)
self.assertEqual(
@@ -158,14 +145,13 @@ class TestGenImgs(unittest.TestCase):
{
(1, 100, 'desc one'),
(-1, -1, 'Global pandemic caused by the virus SARS-CoV-2'),
- (-2, -2, 'Rhubarb, broccoli, and the fifth box under Tuesday'),
}
)
self.assertEqual(
readTestDbTable(dbFile, 'SELECT id, pop from pop'),
{
(1, 99),
+ (2, 35),
(-1, 100),
- (-2, 0),
}
)