diff options
| -rwxr-xr-x | backend/data/genImgsForWeb.py | 3 | ||||
| -rwxr-xr-x | backend/server.py | 65 | ||||
| -rw-r--r-- | src/components/TileInfoModal.vue | 23 |
3 files changed, 52 insertions, 39 deletions
diff --git a/backend/data/genImgsForWeb.py b/backend/data/genImgsForWeb.py index de8ce1b..aa485bb 100755 --- a/backend/data/genImgsForWeb.py +++ b/backend/data/genImgsForWeb.py @@ -78,6 +78,9 @@ with open(imgListFile) as file: if completedProcess.returncode < 0: print("Exiting due to interrupted subprocess") break + elif completedProcess.returncode > 0: + print(f"Exiting due to subprocess exit status {completedProcess.returncode}") + break convertedImage = True # Add entry to db fromEol = imgPath.startswith("eol/") diff --git a/backend/server.py b/backend/server.py index 05cba2d..f85c475 100755 --- a/backend/server.py +++ b/backend/server.py @@ -25,7 +25,7 @@ if len(sys.argv) > 1: print(usageInfo, file=sys.stderr) sys.exit(1) -# Connect to db, and load spellfix extension +# Connect to db dbCon = sqlite3.connect(dbFile) # Some functions def lookupNodes(names, useReducedTree): @@ -54,24 +54,22 @@ def lookupNodes(names, useReducedTree): nodeObjs[childName]["parent"] = None if nodeName == "" else nodeName nodeObjs[childName]["pSupport"] = (pSupport == 1) # Get image names - query = "SELECT nodes.name, eol_id FROM" \ - " nodes INNER JOIN eol_ids ON nodes.name = eol_ids.name" \ - " INNER JOIN images ON eol_ids.id = images.eol_id WHERE" \ - " nodes.name IN ({})".format(",".join(["?"] * len(nodeObjs))) - for (name, eolId) in cur.execute(query, list(nodeObjs.keys())): - nodeObjs[name]["imgName"] = str(eolId) + ".jpg" - # Get 'linked' images for unresolved names - unresolvedNames = [n for n in nodeObjs if nodeObjs[n]["imgName"] == None] - query = "SELECT name, eol_id, eol_id2 from linked_imgs WHERE name IN ({})" - query = query.format(",".join(["?"] * len(unresolvedNames))) - for (name, eolId, eolId2) in cur.execute(query, unresolvedNames): - if eolId2 == None: - nodeObjs[name]["imgName"] = str(eolId) + ".jpg" - else: - nodeObjs[name]["imgName"] = [ - str(eolId) + ".jpg" if eolId != 0 else None, - str(eolId2) + ".jpg" if eolId2 != 0 else None, - ] + idsToNames = {nodeObjs[n]["otolId"]: n for n in nodeObjs.keys()} + query = "SELECT id FROM node_imgs WHERE id IN ({})".format(",".join(["?"] * len(idsToNames))) + for (otolId,) in cur.execute(query, list(idsToNames.keys())): + nodeObjs[idsToNames[otolId]]["imgName"] = otolId + ".jpg" + ## Get 'linked' images for unresolved names + #unresolvedNames = [n for n in nodeObjs if nodeObjs[n]["imgName"] == None] + #query = "SELECT name, eol_id, eol_id2 from linked_imgs WHERE name IN ({})" + #query = query.format(",".join(["?"] * len(unresolvedNames))) + #for (name, eolId, eolId2) in cur.execute(query, unresolvedNames): + # if eolId2 == None: + # nodeObjs[name]["imgName"] = str(eolId) + ".jpg" + # else: + # nodeObjs[name]["imgName"] = [ + # str(eolId) + ".jpg" if eolId != 0 else None, + # str(eolId2) + ".jpg" if eolId2 != 0 else None, + # ] # Get preferred-name info query = f"SELECT name, alt_name FROM names WHERE pref_alt = 1 AND name IN ({queryParamStr})" for (name, altName) in cur.execute(query, names): @@ -135,22 +133,29 @@ def lookupNodeInfo(name, useReducedTree): imgData = None if nodeObj != None: if isinstance(nodeObj["imgName"], str): - eolId = int(nodeObj["imgName"][:-4]) # Convert filename excluding .jpg suffix - query = "SELECT eol_id, source_url, license, copyright_owner FROM images WHERE eol_id = ?" - row = cur.execute(query, (eolId,)).fetchone() - imgData = {"eolId": row[0], "sourceUrl": row[1], "license": row[2], "copyrightOwner": row[3]} + otolId = nodeObj["imgName"][:-4] # Convert filename excluding .jpg suffix + print(otolId) + query = "SELECT images.id, images.src, url, license, artist, credit FROM" \ + " node_imgs INNER JOIN images ON node_imgs.img_id = images.id AND node_imgs.src = images.src" \ + " WHERE node_imgs.id = ?" + (imgId, imgSrc, url, license, artist, credit) = cur.execute(query, (otolId,)).fetchone() + imgData = {"imgId": imgId, "imgSrc": imgSrc, + "url": url, "license": license, "artist": artist, "credit": credit} elif isinstance(nodeObj["imgName"], list): # Get info for compound-image parts imgData = [None, None] - idsToLookup = [int(n[:-4]) for n in nodeObj["imgName"] if n != None] - query = "SELECT eol_id, source_url, license, copyright_owner FROM" \ - " images WHERE eol_id IN ({})".format(",".join(["?"] * len(idsToLookup))) - for row in cur.execute(query, idsToLookup): + idsToLookup = [n[:-4] for n in nodeObj["imgName"] if n != None] + query = "SELECT images.img_id, images.src, url, license, artist, credit FROM" \ + " node_imgs INNER JOIN images ON node_imgs.img_id = images.id AND node_imgs.src = images.src" \ + " WHERE node_imgs.id IN ({})".format(",".join(["?"] * len(idsToLookup))) + for (imgId, imgSrc, url, license, artist, credit) in cur.execute(query, idsToLookup): + imgData = {"imgId": imgId, "imgSrc": imgSrc, + "url": url, "license": license, "artist": artist, "credit": credit} imgName1 = nodeObj["imgName"][0] - if imgName1 != None and str(row[0]) == imgName1[:-4]: - imgData[0] = {"eolId": row[0], "sourceUrl": row[1], "license": row[2], "copyrightOwner": row[3]} + if imgName1 != None and str(imgId) == imgName1[:-4]: + imgData[0] = imgData else: - imgData[1] = {"eolId": row[0], "sourceUrl": row[1], "license": row[2], "copyrightOwner": row[3]} + imgData[1] = imgData # return {"descData": descData, "imgData": imgData, "nodeObj": nodeObj} diff --git a/src/components/TileInfoModal.vue b/src/components/TileInfoModal.vue index 6e1a8ab..5f28dbd 100644 --- a/src/components/TileInfoModal.vue +++ b/src/components/TileInfoModal.vue @@ -9,7 +9,7 @@ import {TolNode} from '../tol'; import {capitalizeWords} from '../lib'; type DescInfo = {text: string, fromRedirect: boolean, wikiId: number, fromDbp: boolean}; -type ImgInfo = {eolId: string, sourceUrl: string, license: string, copyrightOwner: string} +type ImgInfo = {imgId: number, imgSrc: 'eol' | 'enwiki', url: string, license: string, artist: string, credit: string} type TileInfoResponse = { tolNode: null | TolNode, descData: null | DescInfo | [DescInfo, DescInfo], @@ -105,7 +105,6 @@ export default defineComponent({ } else { [this.imgInfo1, this.imgInfo2] = obj.imgData; } - } }); }, @@ -125,7 +124,7 @@ export default defineComponent({ <div v-if="tolNode != null"> ({{tolNode.children.length}} children, {{tolNode.tips}} tips, <a :href="'https://tree.opentreeoflife.org/opentree/argus/opentree13.4@' + tolNode.otolId"> - OTOL Link</a>) + {{tolNode.otolId}}</a>) </div> </h1> <hr class="mb-4 border-stone-400"/> @@ -135,23 +134,29 @@ export default defineComponent({ <div v-else-if="!Array.isArray(tolNode.imgName)"> <div :style="imgStyles"/> <ul v-if="imgInfo != null"> + <li>Obtained via: {{imgInfo.imgSrc}}</li> <li>License: {{imgInfo.license}}</li> - <li><a :href="imgInfo.sourceUrl" class="underline">Source URL</a></li> - <li>Copyright Owner: {{imgInfo.copyrightOwner}}</li> + <li><a :href="imgInfo.url" class="underline">Source URL</a></li> + <li>Artist: {{imgInfo.artist}}</li> + <li v-if="imgInfo.credit != ''">Credit: {{imgInfo.credit}}</li> </ul> </div> <div v-else> <div v-if="tolNode.imgName[0] != null" :style="firstImgStyles"/> <ul v-if="imgInfo1 != null"> + <li>Obtained via: {{imgInfo1.imgSrc}}</li> <li>License: {{imgInfo1.license}}</li> - <li><a :href="imgInfo1.sourceUrl" class="underline">Source URL</a></li> - <li>Copyright Owner: {{imgInfo1.copyrightOwner}}</li> + <li><a :href="imgInfo1.url" class="underline">Source URL</a></li> + <li>Artist: {{imgInfo1.artist}}</li> + <li v-if="imgInfo1.credit != ''">Credit: {{imgInfo1.credit}}</li> </ul> <div v-if="tolNode.imgName[1] != null" :style="secondImgStyles"/> <ul v-if="imgInfo2 != null"> + <li>Obtained via: {{imgInfo2.imgSrc}}</li> <li>License: {{imgInfo2.license}}</li> - <li><a :href="imgInfo2.sourceUrl" class="underline">Source URL</a></li> - <li>Copyright Owner: {{imgInfo2.copyrightOwner}}</li> + <li><a :href="imgInfo2.url" class="underline">Source URL</a></li> + <li>Artist: {{imgInfo2.artist}}</li> + <li v-if="imgInfo2.credit != ''">Credit: {{imgInfo2.credit}}</li> </ul> </div> </div> |
