Skip to content

Commit

Permalink
Merge pull request #77 from feup-infolab/lazaroDevelop
Browse files Browse the repository at this point in the history
Lazaro develop
  • Loading branch information
lazarocosta committed May 22, 2020
2 parents 8ea08ff + e4ed08e commit a7a341c
Show file tree
Hide file tree
Showing 7 changed files with 85 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@

from src.GCF.decorators.OntologyClass import decorator_schema


@decorator_schema
class E33_Linguistic_ObjectSchema(E73_Information_ObjectSchema):
has_translation = fields.List(fields.Nested(
Expand Down
4 changes: 2 additions & 2 deletions src/Models/CRM/v5_0_2/NodeEntities/E68_Dissolution.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@
from neomodel import RelationshipTo
from src.Models.CRM.v5_0_2.NodeEntities.E64_End_of_Existence import E64_End_of_Existence, E64_End_of_ExistenceSchema
from src.Models.CRM.v5_0_2.NodeProperties.P99_dissolved import P99_dissolved
from src.GCF.decorators.OntologyClass import decorator_schema


@decorator_schema
class E68_DissolutionSchema(E64_End_of_ExistenceSchema):
dissolved = fields.List(fields.Nested(
"src.Models.CRM.v5_0_2.NodeEntities.E74_Group.E74_GroupSchema")
)
from src.GCF.decorators.OntologyClass import decorator_schema


@decorator_schema
class E68_Dissolution(E64_End_of_Existence):
dissolved = RelationshipTo(
".E74_Group.E74_Group", "P99_dissolved", model=P99_dissolved
Expand Down
3 changes: 1 addition & 2 deletions src/Models/CRM/v5_0_2/NodeEntities/E74_Group.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@

@decorator_schema
class E74_GroupSchema(E39_ActorSchema):
has_current_or_former_member = fields.List(fields.Nested(E39_ActorSchema)
)
has_current_or_former_member = fields.List(fields.Nested(E39_ActorSchema))


class E74_Group(E39_Actor):
Expand Down
6 changes: 3 additions & 3 deletions src/Models/CRM/v5_0_2/NodeEntities/E98_Currency.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
from src.Models.CRM.v5_0_2.NodeEntities.E55_Type import E55_Type, E55_TypeSchema
from src.Models.CRM.v5_0_2.NodeEntities.E58_Measurement_Unit import E58_Measurement_Unit, E58_Measurement_UnitSchema
from src.Models.CRM.v5_0_2.NodeEntities.E55_Type import E55_Type, E55_TypeSchema
from src.GCF.decorators.OntologyClass import decorator_schema


@decorator_schema
class E98_CurrencySchema(E55_TypeSchema, E58_Measurement_UnitSchema):
class E98_CurrencySchema(E58_Measurement_UnitSchema, E55_TypeSchema):
pass


class E98_Currency(E55_Type, E58_Measurement_Unit):
class E98_Currency(E58_Measurement_Unit, E55_Type):
pass

def __init__(self, schema=None, *args, **kwargs):
Expand Down
29 changes: 11 additions & 18 deletions src/Routes/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
import os, sys
import argparse


# returns the project root path (assumes that the script is started from src/Routes/routes.py)
def get_project_root():
"""Returns project root folder."""
return Path(__file__).parent.parent.parent


# append project root to sys paths so that src.** modules can be found by Python when running the app from a script
# From https://leemendelowitz.github.io/blog/how-does-python-find-packages.html
print("Archgraph running at " + get_project_root().as_posix())
Expand All @@ -24,14 +26,15 @@ def get_project_root():
from neomodel import config

from src.Utils.JsonEncoder import search_cidoc, search_specific_cidoc
from src.Utils.Utils import get_node_by_uid, nested_json, updated_node, make_result
from src.Utils.Utils import get_node_by_uid, build_next_json, updated_node, make_result

if args.neo4j:
config.DATABASE_URL = args.neo4j
else:
config.DATABASE_URL = "bolt://neo4j:password@localhost:7687"

from src.Routes.mongo import insert_template_in_mongo, get_all_records_from_collection, get_schema_from_mongo, get_templates_from_mongo_by_classes_name
from src.Routes.mongo import insert_template_in_mongo, get_all_records_from_collection, get_schema_from_mongo, \
get_templates_from_mongo_by_classes_name

app = Flask(__name__)

Expand Down Expand Up @@ -84,12 +87,12 @@ def get_record(uid):
# if record is not None:
# return make_response(jsonify(json.loads(record["data"])), 201)
# else:
#template = json.loads(template_str)
# template = json.loads(template_str)
template = request.json

node = get_node_by_uid(uid)
if node is not None:
data = nested_json(node, template)
data = build_next_json(node, template)
# print(data)
# add_record_to_collection(uid, data, "data")
get_all_records_from_collection("data")
Expand All @@ -115,7 +118,7 @@ def response_get_schema_node(uid):
@cross_origin()
def insert_template_in_mongodb(uid):
node = get_node_by_uid(uid)
#todo descomentar isto
# todo descomentar isto
# template = request.json
# template = {
# "E52_Time_Span": {
Expand Down Expand Up @@ -144,9 +147,6 @@ def get_schema(uid):
# "E52_Time_Span": {
# "has_value": "DataObject"}
# }
# todo descomentar isto
#template = json.loads(template_str)


# template = {
# "E52_Time_Span": {
Expand Down Expand Up @@ -180,25 +180,18 @@ def get_templates_from_entity(uid):
return make_response(jsonify(message="Node doesn't exists"), 404)


# @app.route("/create", methods=["POST"])
# def create():
# return "create"


# update node
@app.route("/<uid>", methods=["POST"])
@cross_origin()
def response_update(uid):

node = get_node_by_uid(uid)
if node is not None:
#todo meter o template no body tambem
data = request.json
merged = updated_node(node, data['data'], data['template'])
if merged:
#update_data_in_mongo(uid, node.encodeJSON())
#get_all_records_from_collection("data")
new_data = nested_json(node, data['template'])
# update_data_in_mongo(uid, node.encodeJSON())
# get_all_records_from_collection("data")
new_data = build_next_json(node, data['template'])
return make_response(jsonify(new_data), 201)
else:
return make_response(jsonify(message="Unsaved node"), 404)
Expand Down
86 changes: 63 additions & 23 deletions src/Utils/Utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,20 +52,57 @@
from src.Models.CRM.v5_0_2.NodeEntities.E21_Person import E21_Person, E21_PersonSchema
from src.Models.CRM.v5_0_2.NodeEntities.E22_Human_Made_Object import E22_Human_Made_Object, E22_Human_Made_ObjectSchema
from src.Models.CRM.v5_0_2.NodeEntities.E24_Physical_Human_Made_Thing import E24_Physical_Human_Made_Thing, E24_Physical_Human_Made_ThingSchema

from src.Models.CRM.v5_0_2.NodeEntities.E35_Title import E35_Title
from src.Models.CRM.v5_0_2.NodeEntities.E39_Actor import E39_Actor
from src.Models.CRM.v5_0_2.NodeEntities.E41_Appellation import E41_Appellation
from src.Models.CRM.v5_0_2.NodeEntities.E52_Time_Span import E52_Time_Span
from src.Models.CRM.v5_0_2.NodeEntities.E53_Place import E53_Place
from src.Models.CRM.v5_0_2.NodeEntities.E25_Human_Made_Feature import E25_Human_Made_Feature, E25_Human_Made_FeatureSchema
from src.Models.CRM.v5_0_2.NodeEntities.E26_Physical_Feature import E26_Physical_Feature, E26_Physical_FeatureSchema
from src.Models.CRM.v5_0_2.NodeEntities.E27_Site import E27_Site, E27_SiteSchema
from src.Models.CRM.v5_0_2.NodeEntities.E28_Conceptual_Object import E28_Conceptual_Object, E28_Conceptual_ObjectSchema
from src.Models.CRM.v5_0_2.NodeEntities.E29_Design_or_Procedure import E29_Design_or_Procedure, E29_Design_or_ProcedureSchema
from src.Models.CRM.v5_0_2.NodeEntities.E30_Right import E30_Right, E30_RightSchema
from src.Models.CRM.v5_0_2.NodeEntities.E31_Document import E31_Document, E31_DocumentSchema
from src.Models.CRM.v5_0_2.NodeEntities.E32_Authority_Document import E32_Authority_Document, E32_Authority_DocumentSchema
from src.Models.CRM.v5_0_2.NodeEntities.E33_Linguistic_Object import E33_Linguistic_Object, E33_Linguistic_ObjectSchema
from src.Models.CRM.v5_0_2.NodeEntities.E34_Inscription import E34_Inscription, E34_InscriptionSchema
from src.Models.CRM.v5_0_2.NodeEntities.E35_Title import E35_Title, E35_TitleSchema
from src.Models.CRM.v5_0_2.NodeEntities.E36_Visual_Item import E36_Visual_Item, E36_Visual_ItemSchema
from src.Models.CRM.v5_0_2.NodeEntities.E37_Mark import E37_Mark, E37_MarkSchema
from src.Models.CRM.v5_0_2.NodeEntities.E39_Actor import E39_Actor, E39_ActorSchema
from src.Models.CRM.v5_0_2.NodeEntities.E41_Appellation import E41_Appellation, E41_AppellationSchema
from src.Models.CRM.v5_0_2.NodeEntities.E42_Identifier import E42_Identifier, E42_IdentifierSchema
from src.Models.CRM.v5_0_2.NodeEntities.E52_Time_Span import E52_Time_Span, E52_Time_SpanSchema
from src.Models.CRM.v5_0_2.NodeEntities.E53_Place import E53_Place, E53_PlaceSchema
from src.Models.CRM.v5_0_2.NodeEntities.E54_Dimension import E54_Dimension, E54_DimensionSchema

from src.Models.CRM.v5_0_2.NodeEntities.E55_Type import E55_Type
from src.Models.CRM.v5_0_2.NodeEntities.E70_Thing import E70_Thing
from src.Models.CRM.v5_0_2.NodeEntities.E72_Legal_Object import E72_Legal_Object
from src.Models.CRM.v5_0_2.NodeEntities.E77_Persistent_Item import E77_Persistent_Item
from src.Models.CRM.v5_0_2.NodeEntities.E83_Type_Creation import E83_Type_Creation

from src.Models.CRM.v5_0_2.NodeEntities.E55_Type import E55_Type, E55_TypeSchema
from src.Models.CRM.v5_0_2.NodeEntities.E56_Language import E56_Language, E56_LanguageSchema
from src.Models.CRM.v5_0_2.NodeEntities.E57_Material import E57_Material, E57_MaterialSchema
from src.Models.CRM.v5_0_2.NodeEntities.E58_Measurement_Unit import E58_Measurement_Unit, E58_Measurement_UnitSchema
from src.Models.CRM.v5_0_2.NodeEntities.E63_Beggining_of_Existence import E63_Beggining_of_Existence, E63_Beggining_of_ExistenceSchema
from src.Models.CRM.v5_0_2.NodeEntities.E64_End_of_Existence import E64_End_of_Existence, E64_End_of_ExistenceSchema
from src.Models.CRM.v5_0_2.NodeEntities.E65_Creation import E65_Creation, E65_CreationSchema
from src.Models.CRM.v5_0_2.NodeEntities.E66_Formation import E66_Formation, E66_FormationSchema
from src.Models.CRM.v5_0_2.NodeEntities.E67_Birth import E67_Birth, E67_BirthSchema
from src.Models.CRM.v5_0_2.NodeEntities.E68_Dissolution import E68_Dissolution, E68_DissolutionSchema
from src.Models.CRM.v5_0_2.NodeEntities.E69_Death import E69_Death, E69_DeathSchema
from src.Models.CRM.v5_0_2.NodeEntities.E70_Thing import E70_Thing, E70_ThingSchema
from src.Models.CRM.v5_0_2.NodeEntities.E71_Human_Made_Thing import E71_Human_Made_Thing, E71_Human_Made_ThingSchema
from src.Models.CRM.v5_0_2.NodeEntities.E72_Legal_Object import E72_Legal_Object, E72_Legal_ObjectSchema
from src.Models.CRM.v5_0_2.NodeEntities.E73_Information_Object import E73_Information_Object, E73_Information_ObjectSchema
from src.Models.CRM.v5_0_2.NodeEntities.E74_Group import E74_Group, E74_GroupSchema
from src.Models.CRM.v5_0_2.NodeEntities.E77_Persistent_Item import E77_Persistent_Item, E77_Persistent_ItemSchema
from src.Models.CRM.v5_0_2.NodeEntities.E78_Curated_Holding import E78_Curated_Holding, E78_Curated_HoldingSchema
from src.Models.CRM.v5_0_2.NodeEntities.E79_Part_Addition import E79_Part_Addition, E79_Part_AdditionSchema
from src.Models.CRM.v5_0_2.NodeEntities.E80_Part_Removal import E80_Part_Removal, E80_Part_RemovalSchema
from src.Models.CRM.v5_0_2.NodeEntities.E81_Transformation import E81_Transformation, E81_TransformationSchema
from src.Models.CRM.v5_0_2.NodeEntities.E83_Type_Creation import E83_Type_Creation, E83_Type_CreationSchema
from src.Models.CRM.v5_0_2.NodeEntities.E85_Joining import E85_Joining, E85_JoiningSchema
from src.Models.CRM.v5_0_2.NodeEntities.E86_Leaving import E86_Leaving, E86_LeavingSchema
from src.Models.CRM.v5_0_2.NodeEntities.E87_Curation_Activity import E87_Curation_Activity, E87_Curation_ActivitySchema
from src.Models.CRM.v5_0_2.NodeEntities.E89_Propositional_Object import E89_Propositional_Object, E89_Propositional_ObjectSchema
from src.Models.CRM.v5_0_2.NodeEntities.E90_Symbolic_Object import E90_Symbolic_Object, E90_Symbolic_ObjectSchema
from src.Models.CRM.v5_0_2.NodeEntities.E92_Spacetime_Volume import E92_Spacetime_Volume, E92_Spacetime_VolumeSchema
from src.Models.CRM.v5_0_2.NodeEntities.E93_Presence import E93_Presence, E93_PresenceSchema
from src.Models.CRM.v5_0_2.NodeEntities.E95_Purchase import E95_Purchase, E95_PurchaseSchema
from src.Models.CRM.v5_0_2.NodeEntities.E97_Monetary_Amount import E97_Monetary_Amount, E97_Monetary_AmountSchema
from src.Models.CRM.v5_0_2.NodeEntities.E99_Product_Type import E99_Product_Type, E99_Product_TypeSchema
# TODO nao apagar estes importes

import src.Utils.Utils as self
Expand All @@ -80,6 +117,7 @@ def get_driver():
return self.driver


# reads all relation of a node with a given name
def read_relationships(search_node, search_node_uid, relationship_name):
def read(tx, search_node, search_node_uid, relationship_name):
array_uids = []
Expand All @@ -104,7 +142,8 @@ def read(tx, search_node, search_node_uid, relationship_name):
)


def nested_json(node, template):
# builds information block for a node with a given template
def build_next_json(node, template):
if isinstance(template, str):
return node.decodeJSON()

Expand All @@ -127,21 +166,22 @@ def nested_json(node, template):
return None

if schema_relationship['type'] == 'array':
result = nested_json(new_node, json_nested)
result = build_next_json(new_node, json_nested)
if result is None:
return None
else:
new_object[relationship_name].append(result)
else:
result = nested_json(new_node, json_nested)
result = build_next_json(new_node, json_nested)
if result is None:
return None
else:
new_object[relationship_name] = nested_json(new_node, json_nested)
new_object[relationship_name] = build_next_json(new_node, json_nested)

return dict(node.decodeJSON(), **new_object)


# get node from database with a given uid
def get_node_by_uid(uid):
try:
return DataObject.nodes.get(uid=uid)
Expand All @@ -152,6 +192,7 @@ def get_node_by_uid(uid):
return None


# delete node from database with a given uid
def delete_node_by_uid(uid):
try:
node = DataObject.nodes.get(uid=uid)
Expand All @@ -166,6 +207,7 @@ def delete_node_by_uid(uid):
return None


# given a template and a node, the node and next nodes information is updated
def updated_node(node, data, template):
db.begin()
result = updated_node_aux(node, data, template[list(template.keys())[0]])
Expand All @@ -177,6 +219,7 @@ def updated_node(node, data, template):
return True


# auxiliary function - given a template and a node, the node and next nodes information is updated
def updated_node_aux(current_node, data, template):
new_node = current_node.node_self_build(data)
if current_node.merge_node(new_node['self_node']):
Expand All @@ -194,6 +237,7 @@ def updated_node_aux(current_node, data, template):
return None


# given a template and the current node, the function add all relations to the current node
def add_all_relationships(relationships, node, template):
def update_node_and_call_next(new_instance, next_node, template):
for attr in next_node:
Expand Down Expand Up @@ -231,12 +275,6 @@ def update_node_and_call_next(new_instance, next_node, template):
return True


def read_file(path_file):
file = open(path_file, "r")
file_to_json = json.loads(file.read())
return file_to_json


def make_result(result):
response_array = "[" + result[0].encodeJSON()
iterator = iter(result)
Expand All @@ -247,6 +285,7 @@ def make_result(result):
return response_array


# given a classes name array, the function return the class instance
def find_name_of_classes_in_project(classes_name):
classes = []
error = False
Expand Down Expand Up @@ -277,6 +316,7 @@ def find_name_of_classes_in_project(classes_name):
return classes


# given a model class names array, the function return the schema class instance
def find_name_of_schema_classes_in_project(classes_name):
schemas_classes = []
error = False
Expand Down
8 changes: 4 additions & 4 deletions test/Unit/test_relations.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from src.Models.CRM.v5_0_2.NodeEntities.E8_Acquisition import E8_Acquisition
from src.Models.CRM.v5_0_2.NodeEntities.E9_Move import E9_Move
from src.Routes.mongo import get_all_records_from_collection, insert_default_templates, delete_collection
from src.Utils.Utils import nested_json, find_name_of_classes_in_project, find_name_of_schema_classes_in_project
from src.Utils.Utils import build_next_json, find_name_of_classes_in_project, find_name_of_schema_classes_in_project

from src.Models.ArchOnto.v0_1.NodeEntities.ARE2_Formal_Title import ARE2_Formal_Title
from src.Models.CRM.v5_0_2.NodeEntities.E12_Production import E12_Production
Expand Down Expand Up @@ -413,7 +413,7 @@ def test_serialization(self):
{"P46_is_composed_of": "E18_Physical_Thing"}
}

result1 = json.dumps(nested_json(e18, json1))
result1 = json.dumps(build_next_json(e18, json1))
print(result1)

json2 = {
Expand All @@ -430,10 +430,10 @@ def test_serialization(self):
{"has_value": "DataObject"}

}
result2 = json.dumps(nested_json(e52, json2_1))
result2 = json.dumps(build_next_json(e52, json2_1))
print(result2)

result3 = json.dumps(nested_json(e2, json2))
result3 = json.dumps(build_next_json(e2, json2))
print(result3)

def test_schema_with_template(self):
Expand Down

0 comments on commit a7a341c

Please sign in to comment.