def add_note(map_identifier, topic_identifier): topic_store = get_topic_store() topic_map = topic_store.get_topic_map(map_identifier, current_user.id) if topic_map is None: current_app.logger.warning( f"Topic map not found: user identifier: [{current_user.id}], topic map identifier: [{map_identifier}]" ) abort(404) # If the map doesn't belong to the user and they don't have the right # collaboration mode on the map, then abort if not topic_map.owner and ( topic_map.collaboration_mode is not CollaborationMode.EDIT and topic_map.collaboration_mode is not CollaborationMode.COMMENT ): abort(403) topic = topic_store.get_topic( map_identifier, topic_identifier, resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES, ) if topic is None: current_app.logger.warning( f"Topic not found: user identifier: [{current_user.id}], topic map identifier: [{map_identifier}], topic identifier: [{topic_identifier}]" ) abort(404) error = 0 if request.method == "POST": form_note_title = request.form["note-title"].strip() form_note_text = request.form["note-text"].strip() form_note_scope = request.form["note-scope"].strip() # If no values have been provided set their default values if not form_note_scope: form_note_scope = session["current_scope"] # Validate form inputs if not form_note_title: error = error | 1 if not form_note_text: error = error | 2 if not topic_store.topic_exists(topic_map.identifier, form_note_scope): error = error | 4 if error != 0: flash( "An error occurred when submitting the form. Please review the warnings and fix accordingly.", "warning", ) else: note_occurrence = Occurrence( instance_of="note", topic_identifier=topic.identifier, scope=form_note_scope, resource_data=form_note_text, ) title_attribute = Attribute( "title", form_note_title, note_occurrence.identifier, data_type=DataType.STRING, ) timestamp = str(datetime.now()) modification_attribute = Attribute( "modification-timestamp", timestamp, note_occurrence.identifier, data_type=DataType.TIMESTAMP, ) # Persist objects to the topic store topic_store.set_occurrence(topic_map.identifier, note_occurrence) topic_store.set_attribute(topic_map.identifier, title_attribute) topic_store.set_attribute(topic_map.identifier, modification_attribute) flash("Note successfully added.", "success") return redirect( url_for( "topic.view", map_identifier=topic_map.identifier, topic_identifier=topic.identifier, ) ) return render_template( "topic/add_note.html", error=error, topic_map=topic_map, topic=topic, note_title=form_note_title, note_text=form_note_text, note_scope=form_note_scope, ) return render_template("topic/add_note.html", error=error, topic_map=topic_map, topic=topic)
def add_occurrence(self, occurrence: Occurrence) -> None: occurrence.topic_identifier = self.identifier self.__occurrences.append(occurrence)
scene_store = SceneStore(username, password) scene_store.open() # Genesis topic. attribute01 = Attribute('entry-scene', 'outpost', 'genesis') scene_store.set_attribute(TOPIC_MAP_IDENTIFIER, attribute01) story_text = """The US is at an ever growing risk of cyber attacks, with energy infrastructure likely to be hackers' prime target. This was the stark warning made by General Keith Alexander, the retired general and former chief of the __National Security Agency__, earlier this year. Now, the Pentagon says it has a plan to do something about the threat. Its research division, __DARPA__, has launched a new program to target security threats that have the potential to wipe out all of America's power systems. """ story_text_occurrence = Occurrence(topic_identifier='genesis', instance_of='text', resource_data=bytes(story_text, 'utf-8')) scene_store.set_occurrence(TOPIC_MAP_IDENTIFIER, story_text_occurrence) story_image_occurrence = Occurrence(topic_identifier='genesis', instance_of='image', resource_ref='outpost.png') scene_store.set_occurrence(TOPIC_MAP_IDENTIFIER, story_image_occurrence) # Scene 01 - Outpost Alpha. asset11 = Asset('scene', 'scene-005.json') scene1 = Scene('outpost', 'Outpost Alpha', description='A station established at a distance from the main body of an army to protect it from surprise attack.', ordinal=1) scene1.add_asset(asset11) scene1_text = """A military __outpost__ is a detachment of troops stationed at a distance from the main force or formation, usually at a station in a remote or sparsely populated location, positioned to stand guard against unauthorized intrusions and surprise attacks; and the station occupied by such troops, usually a small military base or
def edit(map_identifier, topic_identifier): topic_store = get_topic_store() topic_map = topic_store.get_topic_map(map_identifier, current_user.id) if topic_map is None: current_app.logger.warning( f"Topic map not found: user identifier: [{current_user.id}], topic map identifier: [{map_identifier}]" ) abort(404) # If the map doesn't belong to the user and they don't have the right # collaboration mode on the map, then abort if not topic_map.owner and topic_map.collaboration_mode is not CollaborationMode.EDIT: abort(403) topic = topic_store.get_topic( map_identifier, topic_identifier, scope=session["current_scope"], resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES, ) if topic is None: current_app.logger.warning( f"Topic not found: user identifier: [{current_user.id}], topic map identifier: [{map_identifier}], topic identifier: [{topic_identifier}]" ) abort(404) occurrences = topic_store.get_topic_occurrences( map_identifier, topic_identifier, scope=session["current_scope"], inline_resource_data=RetrievalMode.INLINE_RESOURCE_DATA, ) texts = [ occurrence for occurrence in occurrences if occurrence.instance_of == "text" and occurrence.scope == session["current_scope"] ] form_topic_name = topic.first_base_name.name form_topic_text = texts[0].resource_data.decode() if len(texts) > 0 and texts[0].resource_data else "" form_topic_instance_of = topic.instance_of form_topic_text_scope = texts[0].scope if len(texts) > 0 else session["current_scope"] error = 0 if request.method == "POST": form_topic_name = request.form["topic-name"].strip() form_topic_text = request.form["topic-text"].strip() form_topic_instance_of = request.form["topic-instance-of"].strip() form_topic_text_scope = request.form["topic-text-scope"].strip() # If no values have been provided set their default values if not form_topic_instance_of: form_topic_instance_of = "topic" if not form_topic_text_scope: form_topic_text_scope = session["current_scope"] # Validate form inputs if not topic_store.topic_exists(topic_map.identifier, form_topic_instance_of): error = error | 1 if not topic_store.topic_exists(topic_map.identifier, form_topic_text_scope): error = error | 2 if error != 0: flash( "An error occurred when submitting the form. Please review the warnings and fix accordingly.", "warning", ) else: if topic.get_base_name_by_scope(session["current_scope"]): # Update the topic's base name if it has changed if topic.first_base_name.name != form_topic_name: topic_store.update_base_name( map_identifier, topic.first_base_name.identifier, form_topic_name, form_topic_text_scope, ) else: base_name = BaseName(form_topic_name, session["current_scope"]) topic_store.set_base_name(map_identifier, topic.identifier, base_name) # Update topic's 'instance of' if it has changed if topic.instance_of != form_topic_instance_of: topic_store.update_topic_instance_of(map_identifier, topic.identifier, form_topic_instance_of) # If the topic has an existing text occurrence update it, otherwise create a new text occurrence # and persist it if len(texts) > 0 and form_topic_text_scope == session["current_scope"]: topic_store.update_occurrence_data(map_identifier, texts[0].identifier, form_topic_text) else: text_occurrence = Occurrence( instance_of="text", topic_identifier=topic.identifier, scope=form_topic_text_scope, resource_data=form_topic_text, ) topic_store.set_occurrence(topic_map.identifier, text_occurrence) # Update the topic's modification (timestamp) attribute timestamp = str(datetime.now()) if topic.get_attribute_by_name("modification-timestamp"): topic_store.update_attribute_value( topic_map.identifier, topic.get_attribute_by_name("modification-timestamp").identifier, timestamp, ) else: modification_attribute = Attribute( "modification-timestamp", timestamp, topic.identifier, data_type=DataType.TIMESTAMP, ) topic_store.set_attribute(topic_map.identifier, modification_attribute) flash("Topic successfully updated.", "success") return redirect( url_for( "topic.view", map_identifier=topic_map.identifier, topic_identifier=topic.identifier, ) ) return render_template( "topic/edit.html", error=error, topic_map=topic_map, topic=topic, topic_name=form_topic_name, topic_identifier=topic.identifier, topic_text=form_topic_text, topic_instance_of=form_topic_instance_of, topic_text_scope=form_topic_text_scope, collaboration_mode=topic_map.collaboration_mode, )
def convert(map_identifier, note_identifier): topic_store = get_topic_store() topic_map = topic_store.get_topic_map(map_identifier, current_user.id) if topic_map is None: abort(404) # If the map doesn't belong to the user and they don't have the right # collaboration mode on the map, then abort if not topic_map.owner and topic_map.collaboration_mode is not CollaborationMode.EDIT: abort(403) topic = topic_store.get_topic( map_identifier, "notes", resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES) if topic is None: abort(404) note_occurrence = topic_store.get_occurrence( map_identifier, note_identifier, inline_resource_data=RetrievalMode.INLINE_RESOURCE_DATA, resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES, ) note_title = note_occurrence.get_attribute_by_name("title").value form_topic_name = "" form_topic_identifier = "" form_topic_text = "## " + note_title + "\n" + note_occurrence.resource_data.decode( ) error = 0 if request.method == "POST": form_topic_identifier = request.form["topic-identifier"].strip() form_topic_name = request.form["topic-name"].strip() form_topic_text = request.form["topic-text"] form_topic_instance_of = request.form["topic-instance-of"].strip() # If no values have been provided set their default values if not form_topic_instance_of: form_topic_instance_of = "topic" # Validate form inputs if not form_topic_name: error = error | 1 if topic_store.topic_exists(topic_map.identifier, form_topic_identifier): error = error | 2 if not form_topic_identifier: error = error | 4 if not topic_store.topic_exists(topic_map.identifier, form_topic_instance_of): error = error | 8 if error != 0: flash( "An error occurred when submitting the form. Please review the warnings and fix accordingly.", "warning", ) else: new_topic = Topic(form_topic_identifier, form_topic_instance_of, form_topic_name) text_occurrence = Occurrence( instance_of="text", topic_identifier=new_topic.identifier, resource_data=form_topic_text, ) timestamp = str(datetime.now()) modification_attribute = Attribute( "modification-timestamp", timestamp, new_topic.identifier, data_type=DataType.TIMESTAMP, ) # Persist objects to the topic store topic_store.set_topic(topic_map.identifier, new_topic) topic_store.set_occurrence(topic_map.identifier, text_occurrence) topic_store.set_attribute(topic_map.identifier, modification_attribute) # Remove the original note occurrence topic_store.delete_occurrence(topic_map.identifier, note_identifier) flash("Note successfully converted.", "success") return redirect( url_for( "topic.view", map_identifier=topic_map.identifier, topic_identifier=new_topic.identifier, )) return render_template( "note/convert.html", error=error, topic_map=topic_map, topic=topic, topic_name=form_topic_name, topic_identifier=form_topic_identifier, topic_text=form_topic_text, topic_instance_of=form_topic_instance_of, note_identifier=note_identifier, ) return render_template( "note/convert.html", error=error, topic_map=topic_map, topic=topic, topic_name=form_topic_name, topic_identifier=form_topic_identifier, topic_text=form_topic_text, note_identifier=note_identifier, )
def upload(map_identifier, topic_identifier): topic_store = get_topic_store() topic_map = topic_store.get_topic_map(map_identifier) if topic_map is None: abort(404) if current_user.id != topic_map.user_identifier: abort(403) topic = topic_store.get_topic( map_identifier, topic_identifier, resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES, ) if topic is None: abort(404) form_file_title = "" form_file_scope = "*" error = 0 if request.method == "POST": form_file_title = request.form["file-title"].strip() form_file_scope = request.form["file-scope"].strip() form_upload_file = (request.files["file-file"] if "file-file" in request.files else None) # If no values have been provided set their default values if not form_file_scope: form_file_scope = "*" # Universal scope # Validate form inputs if not form_file_title: error = error | 1 if not form_upload_file: error = error | 2 else: if form_upload_file.filename == "": error = error | 4 if not topic_store.topic_exists(topic_map.identifier, form_file_scope): error = error | 8 if error != 0: flash( "An error occurred when uploading the 3D content. Please review the warnings and fix accordingly.", "warning", ) else: file_extension = get_file_extension(form_upload_file.filename) file_file_name = f"{str(uuid.uuid4())}.{file_extension}" # Create the file directory for this topic map and topic if it doesn't already exist file_directory = os.path.join(bp.root_path, RESOURCES_DIRECTORY, str(map_identifier), topic_identifier) if not os.path.isdir(file_directory): os.makedirs(file_directory) file_path = os.path.join(file_directory, file_file_name) form_upload_file.save(file_path) file_occurrence = Occurrence( instance_of="3d-scene", topic_identifier=topic.identifier, scope=form_file_scope, resource_ref=file_file_name, ) title_attribute = Attribute( "title", form_file_title, file_occurrence.identifier, data_type=DataType.STRING, ) # Persist objects to the topic store topic_store.set_occurrence(topic_map.identifier, file_occurrence) topic_store.set_attribute(topic_map.identifier, title_attribute) flash("3D content successfully uploaded.", "success") return redirect( url_for( "three_d.index", map_identifier=topic_map.identifier, topic_identifier=topic.identifier, )) return render_template( "three_d/upload.html", error=error, topic_map=topic_map, topic=topic, file_title=form_file_title, file_scope=form_file_scope, )
def add(map_identifier): topic_store = get_topic_store() topic_map = topic_store.get_topic_map(map_identifier) if topic_map is None: abort(404) if current_user.id != topic_map.user_identifier: abort(403) topic = topic_store.get_topic( map_identifier, "home", resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES) if topic is None: abort(404) form_note_title = "" form_note_text = "" form_note_scope = session["current_scope"] error = 0 if request.method == "POST": form_note_title = request.form["note-title"].strip() form_note_text = request.form["note-text"].strip() form_note_scope = request.form["note-scope"].strip() # If no values have been provided set their default values if not form_note_scope: form_note_scope = UNIVERSAL_SCOPE # Validate form inputs if not form_note_title: error = error | 1 if not form_note_text: error = error | 2 if not topic_store.topic_exists(topic_map.identifier, form_note_scope): error = error | 4 if error != 0: flash( "An error occurred when submitting the form. Please review the warnings and fix accordingly.", "warning", ) else: note_occurrence = Occurrence( instance_of="note", topic_identifier="notes", scope=form_note_scope, resource_data=form_note_text, ) title_attribute = Attribute( "title", form_note_title, note_occurrence.identifier, data_type=DataType.STRING, ) timestamp = str(datetime.now()) modification_attribute = Attribute( "modification-timestamp", timestamp, note_occurrence.identifier, data_type=DataType.TIMESTAMP, ) # Persist objects to the topic store topic_store.set_occurrence(topic_map.identifier, note_occurrence) topic_store.set_attribute(topic_map.identifier, title_attribute) topic_store.set_attribute(topic_map.identifier, modification_attribute) flash("Note successfully added.", "success") return redirect( url_for("note.index", map_identifier=topic_map.identifier)) return render_template( "note/add.html", error=error, topic_map=topic_map, topic=topic, note_title=form_note_title, note_text=form_note_text, note_scope=form_note_scope, )
def add(map_identifier, topic_identifier): topic_store = get_topic_store() topic_map = topic_store.get_topic_map(map_identifier, current_user.id) if topic_map is None: abort(404) # If the map doesn't belong to the user and they don't have the right # collaboration mode on the map, then abort if not topic_map.owner and topic_map.collaboration_mode is not CollaborationMode.EDIT: abort(403) topic = topic_store.get_topic( map_identifier, topic_identifier, resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES, ) if topic is None: abort(404) error = 0 if request.method == "POST": form_link_title = request.form["link-title"].strip() form_link_url = request.form["link-url"].strip() form_link_scope = request.form["link-scope"].strip() # If no values have been provided set their default values if not form_link_scope: form_link_scope = session["current_scope"] # Validate form inputs if not form_link_title: error = error | 1 if not form_link_url: error = error | 2 if not topic_store.topic_exists(topic_map.identifier, form_link_scope): error = error | 4 if error != 0: flash( "An error occurred when submitting the form. Please review the warnings and fix accordingly.", "warning", ) else: link_occurrence = Occurrence( instance_of="url", topic_identifier=topic.identifier, scope=form_link_scope, resource_ref=form_link_url, ) title_attribute = Attribute( "title", form_link_title, link_occurrence.identifier, data_type=DataType.STRING, ) # Persist objects to the topic store topic_store.set_occurrence(topic_map.identifier, link_occurrence) topic_store.set_attribute(topic_map.identifier, title_attribute) flash("Link successfully added.", "success") return redirect( url_for( "link.index", map_identifier=topic_map.identifier, topic_identifier=topic.identifier, )) return render_template( "link/add.html", error=error, topic_map=topic_map, topic=topic, link_title=form_link_title, link_url=form_link_url, link_scope=form_link_scope, ) return render_template("link/add.html", error=error, topic_map=topic_map, topic=topic)
def upload(map_identifier, topic_identifier): topic_store = get_topic_store() topic_map = topic_store.get_map(map_identifier, current_user.id) if topic_map is None: abort(404) # If the map doesn't belong to the user and they don't have the right # collaboration mode on the map, then abort if not topic_map.owner and topic_map.collaboration_mode is not CollaborationMode.EDIT: abort(403) topic = topic_store.get_topic( map_identifier, topic_identifier, resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES, ) if topic is None: abort(404) map_notes_count = topic_store.get_topic_occurrences_statistics(map_identifier, "notes")["note"] error = 0 if request.method == "POST": form_image_title = request.form["image-title"].strip() form_image_scope = request.form["image-scope"].strip() form_upload_file = request.files["image-file"] if "image-file" in request.files else None # If no values have been provided set their default values if not form_image_scope: form_image_scope = session["current_scope"] # Validate form inputs if not form_image_title: error = error | 1 if not form_upload_file: error = error | 2 else: if form_upload_file.filename == "": error = error | 4 elif not allowed_file(form_upload_file.filename): error = error | 8 if not topic_store.topic_exists(topic_map.identifier, form_image_scope): error = error | 16 if error != 0: flash( "An error occurred when uploading the image. Please review the warnings and fix accordingly.", "warning", ) else: image_file_name = f"{str(uuid.uuid4())}.{get_file_extension(form_upload_file.filename)}" # Create the image directory for this topic map if it doesn't already exist image_directory = os.path.join(current_app.static_folder, RESOURCES_DIRECTORY, str(map_identifier)) if not os.path.isdir(image_directory): os.makedirs(image_directory) file_path = os.path.join(image_directory, image_file_name) form_upload_file.save(file_path) image_occurrence = Occurrence( instance_of="image", topic_identifier=topic.identifier, scope=form_image_scope, resource_ref=image_file_name, ) title_attribute = Attribute( "title", form_image_title, image_occurrence.identifier, data_type=DataType.STRING, ) # Persist objects to the topic store topic_store.create_occurrence(topic_map.identifier, image_occurrence) topic_store.create_attribute(topic_map.identifier, title_attribute) flash("Image successfully uploaded.", "success") return redirect( url_for( "image.index", map_identifier=topic_map.identifier, topic_identifier=topic.identifier, ) ) return render_template( "image/upload.html", error=error, topic_map=topic_map, topic=topic, image_title=form_image_title, image_scope=form_image_scope, map_notes_count=map_notes_count, ) return render_template( "image/upload.html", error=error, topic_map=topic_map, topic=topic, map_notes_count=map_notes_count, )
def add(map_identifier, topic_identifier): topic_store = get_topic_store() topic_map = topic_store.get_topic_map(map_identifier) if topic_map is None: abort(404) if current_user.id != topic_map.user_identifier: abort(403) topic = topic_store.get_topic( map_identifier, topic_identifier, resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES, ) if topic is None: abort(404) form_video_title = "" form_video_url = "" form_video_scope = session["current_scope"] error = 0 if request.method == "POST": form_video_title = request.form["video-title"].strip() form_video_url = request.form["video-url"].strip() form_video_scope = request.form["video-scope"].strip() # If no values have been provided set their default values if not form_video_scope: form_video_scope = UNIVERSAL_SCOPE # Validate form inputs if not form_video_title: error = error | 1 if not form_video_url: error = error | 2 if not topic_store.topic_exists(topic_map.identifier, form_video_scope): error = error | 4 if error != 0: flash( "An error occurred when submitting the form. Please review the warnings and fix accordingly.", "warning", ) else: video_occurrence = Occurrence( instance_of="video", topic_identifier=topic.identifier, scope=form_video_scope, resource_ref=form_video_url, ) title_attribute = Attribute( "title", form_video_title, video_occurrence.identifier, data_type=DataType.STRING, ) # Persist objects to the topic store topic_store.set_occurrence(topic_map.identifier, video_occurrence) topic_store.set_attribute(topic_map.identifier, title_attribute) flash("Video link successfully added.", "success") return redirect( url_for( "video.index", map_identifier=topic_map.identifier, topic_identifier=topic.identifier, )) return render_template( "video/add.html", error=error, topic_map=topic_map, topic=topic, video_title=form_video_title, video_url=form_video_url, video_scope=form_video_scope, )
def edit(map_identifier, topic_identifier): topic_store = get_topic_store() topic_map = topic_store.get_topic_map(map_identifier) if topic_map is None: abort(404) if current_user.id != topic_map.user_identifier: abort(403) topic = topic_store.get_topic( map_identifier, topic_identifier, resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES, ) if topic is None: abort(404) occurrences = topic_store.get_topic_occurrences( map_identifier, topic_identifier, scope=session["current_scope"], inline_resource_data=RetrievalMode.INLINE_RESOURCE_DATA, ) texts = [ occurrence for occurrence in occurrences if occurrence.instance_of == "text" ] form_topic_name = topic.first_base_name.name form_topic_text = (texts[0].resource_data.decode() if len(texts) > 0 and texts[0].resource_data else "") form_topic_instance_of = topic.instance_of form_topic_text_scope = ( texts[0].scope if len(texts) > 0 else session["current_scope"] ) # Should it be '*'? error = 0 if request.method == "POST": form_topic_name = request.form["topic-name"].strip() form_topic_text = request.form["topic-text"].strip() form_topic_instance_of = request.form["topic-instance-of"].strip() form_topic_text_scope = request.form["topic-text-scope"].strip() # If no values have been provided set their default values if not form_topic_instance_of: form_topic_instance_of = "topic" # Validate form inputs if not topic_store.topic_exists(topic_map.identifier, form_topic_instance_of): error = error | 1 if not topic_store.topic_exists(topic_map.identifier, form_topic_text_scope): error = error | 2 if error != 0: flash( "An error occurred when submitting the form. Please review the warnings and fix accordingly.", "warning", ) else: # Update topic's first base name if it has changed if topic.first_base_name.name != form_topic_name: topic_store.update_basename(map_identifier, topic.first_base_name.identifier, form_topic_name) # Update topic's 'instance of' if it has changed if topic.instance_of != form_topic_instance_of: topic_store.update_topic_instance_of(map_identifier, topic.identifier, form_topic_instance_of) # If the topic has an existing text occurrence update it, otherwise create a new text occurrence # and persist it if len(texts) > 0: topic_store.update_occurrence_data(map_identifier, texts[0].identifier, form_topic_text) else: text_occurrence = Occurrence( instance_of="text", topic_identifier=topic.identifier, scope=form_topic_text_scope, resource_data=form_topic_text, ) topic_store.set_occurrence(topic_map.identifier, text_occurrence) # Update the topic's modification (timestamp) attribute timestamp = str(datetime.now()) if topic.get_attribute_by_name("modification-timestamp"): topic_store.update_attribute_value( topic_map.identifier, topic.get_attribute_by_name( "modification-timestamp").identifier, timestamp, ) else: modification_attribute = Attribute( "modification-timestamp", timestamp, topic.identifier, data_type=DataType.TIMESTAMP, ) topic_store.set_attribute(topic_map.identifier, modification_attribute) flash("Topic successfully updated.", "success") return redirect( url_for( "topic.view", map_identifier=topic_map.identifier, topic_identifier=topic.identifier, )) return render_template( "topic/edit.html", error=error, topic_map=topic_map, topic=topic, topic_name=form_topic_name, topic_identifier=topic.identifier, topic_text=form_topic_text, topic_instance_of=form_topic_instance_of, topic_text_scope=form_topic_text_scope, )
def create(map_identifier, topic_identifier): topic_store = get_topic_store() topic_map = topic_store.get_topic_map(map_identifier) if topic_map is None: abort(404) if current_user.id != topic_map.user_identifier: abort(403) topic = topic_store.get_topic( map_identifier, topic_identifier, resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES, ) if topic is None: abort(404) form_topic_name = "" form_topic_identifier = "" form_topic_text = "" form_topic_instance_of = "topic" form_topic_text_scope = session["current_scope"] error = 0 if request.method == "POST": form_topic_identifier = request.form["topic-identifier"].strip() form_topic_name = request.form["topic-name"].strip() form_topic_text = request.form["topic-text"].strip() form_topic_instance_of = request.form["topic-instance-of"].strip() form_topic_text_scope = request.form["topic-text-scope"].strip() # If no values have been provided set their default values if not form_topic_instance_of: form_topic_instance_of = "topic" # Validate form inputs if not form_topic_name: error = error | 1 if topic_store.topic_exists(topic_map.identifier, form_topic_identifier): error = error | 2 if not form_topic_identifier: error = error | 4 if not topic_store.topic_exists(topic_map.identifier, form_topic_instance_of): error = error | 8 if not topic_store.topic_exists(topic_map.identifier, form_topic_text_scope): error = error | 16 if error != 0: flash( "An error occurred when submitting the form. Please review the warnings and fix accordingly.", "warning", ) else: new_topic = Topic(form_topic_identifier, form_topic_instance_of, form_topic_name) text_occurrence = Occurrence( instance_of="text", topic_identifier=new_topic.identifier, scope=form_topic_text_scope, resource_data=form_topic_text, ) timestamp = str(datetime.now()) modification_attribute = Attribute( "modification-timestamp", timestamp, new_topic.identifier, data_type=DataType.TIMESTAMP, ) query_attribute = Attribute( "knowledge-graph-query", form_topic_name.lower(), new_topic.identifier, data_type=DataType.STRING, ) # Persist objects to the topic store topic_store.set_topic(topic_map.identifier, new_topic) topic_store.set_occurrence(topic_map.identifier, text_occurrence) topic_store.set_attribute(topic_map.identifier, modification_attribute) topic_store.set_attribute(topic_map.identifier, query_attribute) flash("Topic successfully created.", "success") return redirect( url_for( "topic.view", map_identifier=topic_map.identifier, topic_identifier=new_topic.identifier, )) return render_template( "topic/create.html", error=error, topic_map=topic_map, topic=topic, topic_name=form_topic_name, topic_identifier=form_topic_identifier, topic_text=form_topic_text, topic_instance_of=form_topic_instance_of, topic_text_scope=form_topic_text_scope, )
def create(map_identifier, topic_identifier): topic_store = get_topic_store() topic_map = topic_store.get_map(map_identifier, current_user.id) if topic_map is None: current_app.logger.warning( f"Topic map not found: user identifier: [{current_user.id}], topic map identifier: [{map_identifier}]" ) abort(404) # If the map doesn't belong to the user and they don't have the right # collaboration mode on the map, then abort if not topic_map.owner and topic_map.collaboration_mode is not CollaborationMode.EDIT: abort(403) topic = topic_store.get_topic( map_identifier, topic_identifier, resolve_attributes=RetrievalMode.RESOLVE_ATTRIBUTES, ) if topic is None: current_app.logger.warning( f"Topic not found: user identifier: [{current_user.id}], topic map identifier: [{map_identifier}], topic identifier: [{topic_identifier}]" ) abort(404) map_notes_count = topic_store.get_topic_occurrences_statistics( map_identifier, "notes")["note"] error = 0 if request.method == "POST": form_topic_identifier = request.form["topic-identifier"].strip() form_topic_name = request.form["topic-name"].strip() form_topic_text = request.form["topic-text"].strip() form_topic_instance_of = request.form["topic-instance-of"].strip() form_topic_text_scope = request.form["topic-text-scope"].strip() # If no values have been provided set their default values if not form_topic_instance_of: form_topic_instance_of = "topic" if not form_topic_text_scope: form_topic_text_scope = session["current_scope"] # Validate form inputs if not form_topic_name: error = error | 1 if topic_store.topic_exists(topic_map.identifier, form_topic_identifier): error = error | 2 if not form_topic_identifier: error = error | 4 if not topic_store.topic_exists(topic_map.identifier, form_topic_instance_of): error = error | 8 if not topic_store.topic_exists(topic_map.identifier, form_topic_text_scope): error = error | 16 if error != 0: flash( "An error occurred when submitting the form. Please review the warnings and fix accordingly.", "warning", ) else: new_topic = Topic(form_topic_identifier, form_topic_instance_of, form_topic_name) text_occurrence = Occurrence( instance_of="text", topic_identifier=new_topic.identifier, scope=form_topic_text_scope, resource_data=form_topic_text, ) new_topic.first_base_name.scope = session["current_scope"] timestamp = str(datetime.now()) modification_attribute = Attribute( "modification-timestamp", timestamp, new_topic.identifier, data_type=DataType.TIMESTAMP, ) # Persist objects to the topic store topic_store.create_topic(topic_map.identifier, new_topic) topic_store.create_occurrence(topic_map.identifier, text_occurrence) topic_store.create_attribute(topic_map.identifier, modification_attribute) flash("Topic successfully created.", "success") return redirect( url_for( "topic.view", map_identifier=topic_map.identifier, topic_identifier=new_topic.identifier, )) return render_template( "topic/create.html", error=error, topic_map=topic_map, topic=topic, topic_name=form_topic_name, topic_identifier=form_topic_identifier, topic_text=form_topic_text, topic_instance_of=form_topic_instance_of, topic_text_scope=form_topic_text_scope, map_notes_count=map_notes_count, ) return render_template( "topic/create.html", error=error, topic_map=topic_map, topic=topic, map_notes_count=map_notes_count, )
username = config['DATABASE']['Username'] password = config['DATABASE']['Password'] # Instantiate and open the scene store. scene_store = SceneStore(username, password) scene_store.open() # Genesis topic. attribute01 = Attribute('entry-scene', 'environment', 'genesis') scene_store.set_attribute(TOPIC_MAP_IDENTIFIER, attribute01) story_text = """A test story. """ story_text_occurrence = Occurrence(topic_identifier='genesis', instance_of='text', resource_data=bytes(story_text, 'utf-8')) scene_store.set_occurrence(TOPIC_MAP_IDENTIFIER, story_text_occurrence) story_image_occurrence = Occurrence(topic_identifier='genesis', instance_of='image', resource_ref='locomotive.png') scene_store.set_occurrence(TOPIC_MAP_IDENTIFIER, story_image_occurrence) # Test scene. asset0 = Asset('scene', 'environment.gltf') scene1 = Scene('environment', 'Test Environment') scene1.add_asset(asset0) scene1_text = """An environment for testing purposes. """ scene_store.set_scene(TOPIC_MAP_IDENTIFIER, scene1)
def set_entity(self, map_identifier: int, entity: Entity, event_identifier: str = None) -> None: if (self.source_directory is None) or (self.destination_directory is None): raise StoryDbError("Missing resource directories") if not self.topic_store.topic_exists(map_identifier, entity.identifier): topic = Topic(entity.identifier, entity.instance_of, entity.name) timestamp = str(datetime.now()) modification_attribute = Attribute( "modification-timestamp", timestamp, topic.identifier, data_type=DataType.TIMESTAMP, ) self.topic_store.set_topic(map_identifier, topic) self.topic_store.set_attribute(map_identifier, modification_attribute) if hasattr(entity, "description") and entity.description: text_occurrence = Occurrence( instance_of="text", topic_identifier=entity.identifier, resource_data=entity.description, ) self.topic_store.set_occurrence(map_identifier, text_occurrence) if hasattr(entity, "animation") and entity.animation: entity.add_attribute( Attribute( "animation", entity.animation, entity.identifier, data_type=DataType.STRING, )) # Create the file directory for this topic map and topic if it doesn't already exist file_directory = os.path.join(self.destination_directory, str(map_identifier), entity.identifier) if not os.path.isdir(file_directory): os.makedirs(file_directory) for resource in entity.resources: occurrence = Occurrence( instance_of=resource.instance_of, topic_identifier=entity.identifier, resource_ref=resource.reference, resource_data=resource.data, ) title_attribute = Attribute( "title", resource.title, occurrence.identifier, data_type=DataType.STRING, ) self.topic_store.set_occurrence(map_identifier, occurrence) self.topic_store.set_attribute(map_identifier, title_attribute) # Copy resource file to appropriate (topic) directory if occurrence.resource_ref: source_file_path = os.path.join(self.source_directory, occurrence.resource_ref) destination_file_path = os.path.join( self.destination_directory, str(map_identifier), entity.identifier, occurrence.resource_ref, ) if not os.path.isfile(destination_file_path): shutil.copy(source_file_path, destination_file_path) if hasattr(entity, "tags"): self.topic_store.set_tags(map_identifier, entity.identifier, entity.tags) self.topic_store.set_attributes(map_identifier, entity.attributes) if event_identifier: association = Association( instance_of=entity.instance_of, src_topic_ref=entity.identifier, dest_topic_ref=event_identifier, src_role_spec="included-in", dest_role_spec="includes", ) self.topic_store.set_association(map_identifier, association)