def post(self, thesis_id: str): log_request_info("Thesis tags update", request) thesis = db.session.query(Thesis).get(thesis_id) data = request.get_json() error = None if thesis is None: return json_response({"error": "Thesis not found"}, status=404) if data is None or data.get("admin_key", "") != current_app.config.get("ADMIN_KEY"): logger.warning("Invalid admin key") error = "Invalid admin key" else: for tag_data in data.get("add", []): tag = (db.session.query(Tag).filter( Tag.wikidata_id == tag_data["wikidata_id"]).first()) if tag is None: tag = db.session.query(Tag).filter_by( title=tag_data["title"]).first() if tag is None: tag = Tag( description=tag_data.get("description", None), title=tag_data["title"], url=tag_data["url"], wikidata_id=tag_data["wikidata_id"], image=tag_data.get("image", None), ) tag.make_slug() logger.info("New tag {}".format(tag)) tag.wikipedia_title = tag_data.get("wikipedia_title", None) tag.labels = ";".join(tag_data.get("labels", [])) tag.aliases = ";".join(tag_data.get("aliases", [])) logger.info("Appending {} to {}".format(tag, thesis)) thesis.tags.append(tag) if len(data.get("remove", [])) > 0: logger.info("Removing tags {}".format(", ".join( data.get("remove")))) thesis.tags = [ tag for tag in thesis.tags if tag.title not in data.get("remove") ] db.session.add(thesis) db.session.commit() if error is not None: return json_response({"error": error}) else: return json_response({"data": thesis.to_dict(), "error": error})
def load_tags(): """Load tags from exported tags.json.""" try: with open("../userdata/tags.json") as f: tag_export = json.load(f) except FileNotFoundError: logger.warning("File ../userdata/tags.json not found - tags were not imported") return if tag_export["meta"]["api"] != API_FULL_NAME: raise ValueError("Tag export has Version '{}' but should be '{}'".format(tag_export["meta"]["api"], API_FULL_NAME)) logger.info("Adding {} tags...".format(len(tag_export["data"]))) for tag_data in tag_export["data"]: tag = Tag( title=tag_data["title"], slug=tag_data["slug"], url=tag_data["url"], wikidata_id=tag_data["wikidata_id"], ) tag.description = tag_data.get("description", None) tag.wikipedia_title = tag_data.get("wikipedia_title", None) tag.labels = ";".join(tag_data.get("labels", [])) tag.aliases = ";".join(tag_data.get("aliases", [])) tag.image = tag_data.get("image", None) if tag.description is not None and len(tag.description) > 1: # Always start with upper case tag.description = tag.description[0].upper() + tag.description[1:] # Remove non-descriptions if tag.description.startswith("Wikimedia-"): tag.description = None for thesis_id in tag_data["theses"]: tag.theses.append(Thesis.query.get(thesis_id)) yield tag