# @name: relationships.py # @creation_date: 2022-04-11 # @license: The MIT License # @author: Simon Bowie # @purpose: functions for relationships # @acknowledgements: from .models import Resource from .models import Relationship from . import db import markdown # function to retrieve linked resources def get_relationships(primary_id): primary_relationships = Relationship.query.filter_by(first_resource_id=primary_id).all() links = [] if primary_relationships: links = [] for relationship in primary_relationships: secondary_id = relationship.second_resource_id links.extend(Resource.query.filter_by(id=secondary_id).all()) secondary_relationships = Relationship.query.filter_by(second_resource_id=primary_id).all() if secondary_relationships: for relationship in secondary_relationships: primary_id = relationship.first_resource_id links.extend(Resource.query.filter_by(id=primary_id).all()) return links else: secondary_relationships = Relationship.query.filter_by(second_resource_id=primary_id).all() if secondary_relationships: links = [] for relationship in secondary_relationships: primary_id = relationship.first_resource_id links.extend(Resource.query.filter_by(id=primary_id).all()) return links # function to append relationships to a resource object def append_relationships(resource): relationships = get_relationships(resource.id) if relationships: for relationship in relationships: if relationship.type == 'tool': if 'tools' not in resource.__dict__.keys(): resource.__dict__['tools'] = [] resource.__dict__['tools'].append(relationship) else: resource.__dict__['tools'].append(relationship) elif relationship.type == 'practice': if 'practices' not in resource.__dict__.keys(): resource.__dict__['practices'] = [] resource.__dict__['practices'].append(relationship) else: resource.__dict__['practices'].append(relationship) elif relationship.type == 'book': # render Markdown as HTML relationship.description = markdown.markdown(relationship.description) if 'books' not in resource.__dict__.keys(): resource.__dict__['books'] = [] resource.__dict__['books'].append(relationship) else: resource.__dict__['books'].append(relationship) return resource else: return resource # function to append relationships to a dictionary of resources def append_relationships_multiple(resources): for index, resource in enumerate(resources): resources[index] = append_relationships(resource) return resources # function to add a relationship to a linked resource def add_relationship(resource_id, linked_resource_id): first_resource_id = resource_id second_resource_id = linked_resource_id new_relationship = Relationship(first_resource_id=first_resource_id, second_resource_id=second_resource_id) # add the new relationship to the database db.session.add(new_relationship) db.session.commit() # function to delete a single relationship def delete_relationship(main_id, for_deletion_id): relation = Relationship.query.filter(((Relationship.first_resource_id == main_id) & (Relationship.second_resource_id == for_deletion_id)) | ((Relationship.first_resource_id == for_deletion_id) & (Relationship.second_resource_id == main_id))).first() deletion = Relationship.query.get(relation.id) db.session.delete(deletion) db.session.commit() # logic for editing relationships def edit_relationships(resource_id, linked_resources, remove_linked_resources, existing_relationships): if linked_resources: for linked_resource in linked_resources: link = Resource.query.get(linked_resource) if existing_relationships and link not in existing_relationships: add_relationship(resource_id, linked_resource) elif not existing_relationships: add_relationship(resource_id, linked_resource) if remove_linked_resources: for remove_linked_resource in remove_linked_resources: delete_relationship(resource_id, remove_linked_resource)