def __init__(self, app: Flask):
        app.config["MONGO_URI"] = "mongodb://localhost:27017/unigames_webapp_db"

        self.mongo = PyMongo(app)
        self.fs = GridFS(self.mongo.db, 'fs')

        Tag.init_indices(self.mongo)
        AttributeOption.init_indices(self.mongo)
        Item.init_indices(self.mongo)
        Instance.init_indices(self.mongo)
        Role.init_indices(self.mongo)
        RelationOption.init_indices(self.mongo)
        Relation.init_indices(self.mongo)
        User.init_indices(self.mongo)

        # For actual production, to ensure certain attributes exist

        # create an attribute for a name
        self.name_attrib = AttributeOption.search_for_by_name(self.mongo, "name")
        if self.name_attrib is None:
            self.name_attrib = AttributeOption("name", AttributeTypes.SingleLineString)
            self.name_attrib.write_to_db(self.mongo)

        # create an attribute for a description
        self.description_attrib = AttributeOption.search_for_by_name(self.mongo, "description")
        if self.description_attrib is None:
            self.description_attrib = AttributeOption("description", AttributeTypes.MultiLineString)
            self.description_attrib.write_to_db(self.mongo)

        # create an attribute for a hidden description
        self.hidden_description_attrib = AttributeOption.search_for_by_name(self.mongo, "hidden_description")
        if self.hidden_description_attrib is None:
            self.hidden_description_attrib = AttributeOption("hidden_description", AttributeTypes.MultiLineString, True)
            self.hidden_description_attrib.write_to_db(self.mongo)

        # create an attribute for the main picture on an item/instance
        self.main_picture = AttributeOption.search_for_by_name(self.mongo, "main_picture")
        if self.main_picture is None:
            self.main_picture = AttributeOption("main_picture", AttributeTypes.Picture, True)
            self.main_picture.write_to_db(self.mongo)

        self.everyone_role = Role.search_for_by_name(self.mongo, "everyone")
        if self.everyone_role is None:  # -1 is overridden by everything, 'everyone' is required for sake of a default
            self.everyone_role = Role("everyone", -1, {Permissions.CanEditItems: False, Permissions.CanEditUsers: False,
                                                       Permissions.CanViewHidden: False})
            self.everyone_role.write_to_db(self.mongo)

        self.admin_role = Role.search_for_by_name(self.mongo, "admin")
        if self.admin_role is None:  # 0 overrides everything
            self.admin_role = Role("admin", 0, {Permissions.CanEditItems: True, Permissions.CanEditUsers: True,
                                                Permissions.CanViewHidden: True})
            self.admin_role.write_to_db(self.mongo)
            
        self.test_role = Role.search_for_by_name(self.mongo, "testing")
        if self.test_role is None:  # 0 overrides everything
            self.test_role = Role("testing", 0, {Permissions.CanEditItems: True, Permissions.CanEditUsers: True,
                                                Permissions.CanViewHidden: True})
            self.test_role.write_to_db(self.mongo)
    def __init__(self, app: Flask):
        app.config[
            "MONGO_URI"] = "mongodb://localhost:27017/unigames_webapp_db"

        self.mongo = PyMongo(app)
        Tag.init_indices(self.mongo)
        AttributeOption.init_indices(self.mongo)
        Item.init_indices(self.mongo)
        Instance.init_indices(self.mongo)
        Role.init_indices(self.mongo)
        RelationOption.init_indices(self.mongo)
        Relation.init_indices(self.mongo)
def tag_create():
    form = createTagForm()
    if form.validate_on_submit():
        tag_exists = Tag.search_for_by_name(db_manager.mongo, form.name.data)
        if tag_exists is None:
            new_tag = Tag(form.name.data, [], [])
            new_tag.write_to_db(db_manager.mongo)
            return 'tag created'
        else:
            return 'the tag already exists'
    return render_template('admin-pages/lib-man/tag-man/tag-create.html',
                           form=form)
def lib_add():
    form = newEntryForm()
    all_tags = db_manager.mongo.db.tags.find()
    if form.validate_on_submit():
        #search for an item with the same title
        item_name_attrib = AttributeOption.search_for_by_name(
            db_manager.mongo, "name")
        item_exists = Item.search_for_by_attribute(db_manager.mongo,
                                                   item_name_attrib,
                                                   form.title.data)
        if not item_exists:
            #find the matching tag
            tag_name = form.selection.data
            found_tag = Tag.search_for_by_name(db_manager.mongo, tag_name)
            add_tag = TagReference(found_tag.id, [])
            new_item = Item(
                {
                    "name": form.title.data,
                    "author": form.author.data
                }, [add_tag])
            new_item.write_to_db(db_manager.mongo)
            new_item.recalculate_implied_tags(db_manager.mongo)

            return redirect(url_for('lib'))
        else:
            return 'the item already exists'
    return render_template('admin-pages/lib-man/lib-add.html', form=form)
def tag_edit_impl(tag_name):
    tag = Tag.search_for_by_name(db_manager.mongo, tag_name)
    form = addTagImplForm()
    if form.validate_on_submit():
        TagImplication()
    return render_template('admin-pages/lib-man/tag-man/tag-edit-impl.html',
                           tag=tag,
                           form=form)
    def recalculate_instance_implied_tags(self, mongo: PyMongo, index: Optional[Union[int, List[int]]] = None):
        """
        Recalculates the implied tags for instances

        Parameters
        ----------
            mongo
                The mongo database
            index

        Returns
        -------
            True if successfull, False otherwise
        """
        if not self.update_from_db(mongo):
            return False

        if index is None:
            to_visit = range(0, len(self.instances))
        elif isinstance(index, int):
            to_visit = [index]
        else:
            to_visit = index

        for i in to_visit:
            inst = self.instances[i]

            # get implied from relations
            relations = mongo.db.relations.find({"instance_id": inst.id})
            relations = [Relation.from_dict(r) for r in relations]

            relation_options = mongo.db.relation_options.find({"_id": {"$in": [r.option_id for r in relations]}})
            relation_options = [RelationOption.from_dict(r) for r in relation_options]

            inst.implied_tags = [implied for option in relation_options for implied in option.implies]

            # traverse implication DAG
            to_search = set(t.tag_id for t in inst.tags).union(t.tag_id for t in inst.implied_tags)
            searched = set(to_search)

            while to_search:
                top_level = mongo.db.tags.find({"_id": {"$in": list(to_search)}})
                to_search = set()
                if top_level is None:
                    break

                tags = [Tag.from_dict(tag) for tag in top_level]

                for tag in tags:
                    for implied in tag.implies:
                        if implied.tag_id not in searched:
                            searched.add(implied.tag_id)
                            to_search.add(implied.tag_id)
                            inst.implied_tags.append(implied)

            self.write_to_db(mongo)
            return True
    def recalculate_implied_tags(self, mongo: PyMongo):
        self.update_from_db(mongo)
        self.implied_tags = []

        # get implied from relations
        relations = mongo.db.relations.find({"instance_id": self.id})
        relations = [Relation.from_dict(r) for r in relations]

        relation_options = mongo.db.relation_options.find({"_id": {"$in": [r.option_id for r in relations]}})
        relation_options = [RelationOption.from_dict(r) for r in relation_options]

        relation_implied: Dict[ObjectId, Dict[int, TagParameterImpl]] = {}

        for ro in relation_options:
            for implied in ro.implies:
                if implied.implied_id not in relation_implied:
                    relation_implied[implied.implied_id] = {}

                for para in implied.parameters:
                    relation_implied[implied.implied_id][para.index] = para

        for r in relations:
            for implied in r.implies:
                if implied.implied_id not in relation_implied:
                    relation_implied[implied.implied_id] = {}

                for para in implied.parameters:
                    relation_implied[implied.implied_id][para.index] = para

        self.implied_tags = [TagReference(implied_id, [p for p in parameters.values()]) for implied_id, parameters in
                             relation_implied.items()]

        # traverse implication DAG
        to_search = set(t.tag_id for t in self.tags).union(t.tag_id for t in self.implied_tags)
        searched = set(to_search)

        while to_search:
            top_level = mongo.db.tags.find({"_id": {"$in": list(to_search)}})
            to_search = set()
            if top_level is None:
                break

            tags = [Tag.from_dict(tag) for tag in top_level]

            for tag in tags:
                for implied in tag.implies:
                    if implied.implied_id not in searched:
                        searched.add(implied.implied_id)
                        to_search.add(implied.implied_id)
                        self.implied_tags.append(TagReference(implied.implied_id, implied.parameters))

        self.write_to_db(mongo)
Exemple #8
0
    def recalculate_implied_tags(self, mongo: PyMongo, instances: bool = False, inherit: bool = True):
        if instances:
            self.recalculate_instance_implied_tags(mongo, None)
        else:
            if not self.update_from_db(mongo):
                return False
        self.implied_tags = []

        # get implied from relations
        relations = mongo.db.relations.find({"item_id": self.id})
        relations = [Relation.from_dict(r) for r in relations]

        relation_options = mongo.db.relation_options.find({"_id": {"$in": [r.option_id for r in relations]}})
        relation_options = [RelationOption.from_dict(r) for r in relation_options]

        self.implied_tags = [implied for option in relation_options for implied in option.implies]

        # traverse implication DAG
        to_search = set(t.tag_id for t in self.tags).union(t.tag_id for t in self.implied_tags)
        searched = set(to_search)

        while to_search:
            top_level = mongo.db.tags.find({"_id": {"$in": list(to_search)}})
            to_search = set()
            if top_level is None:
                break

            tags = [Tag.from_dict(tag) for tag in top_level]

            for tag in tags:
                for implied in tag.implies:
                    if implied.tag_id not in searched:
                        searched.add(implied.tag_id)
                        to_search.add(implied.tag_id)
                        self.implied_tags.append(implied)

        if inherit:
            possibilities = set()

            for inst in self.instances:
                possibilities.intersection_update(set(inst.tags).union(inst.implied_tags))

            self.implied_tags.extend(possibilities)

        self.write_to_db(mongo)
        return True
def instance_add(item_id):
    form = addInstanceForm()
    item = db_manager.mongo.db.items.find({"_id": ObjectId(item_id)})[0]
    if form.validate_on_submit():
        tag_name = form.selection.data
        found_tag = Tag.search_for_by_name(db_manager.mongo, tag_name)
        new_instance = Instance(ObjectId(item_id), {
            "uuid": form.uuid.data,
            "damage report": form.damage_report.data
        }, [TagReference(found_tag.id, [])])
        new_instance.write_to_db(db_manager.mongo)
        new_instance.recalculate_implied_tags(db_manager.mongo)
        return redirect(url_for('lib_edit', item_id=item_id))
    return render_template('admin-pages/lib-man/instance-add.html',
                           form=form,
                           item=item,
                           tags_collection=tags_collection)
Exemple #10
0
def tag_add(item_id):
    form = addTagForm()
    item = db_manager.mongo.db.items.find({"_id": ObjectId(item_id)})[0]

    if form.validate_on_submit():
        tag_name = form.selection.data
        found_tag = Tag.search_for_by_name(db_manager.mongo, tag_name)
        add_tag = {'tag_id': found_tag.id, 'parameters': []}
        item['tags'].append(add_tag)

        Item.from_dict(item).write_to_db(db_manager.mongo)
        Item.from_dict(item).recalculate_implied_tags(db_manager.mongo)

        return redirect(url_for('lib_edit', item_id=item_id))

    return render_template('admin-pages/lib-man/tag-add.html',
                           form=form,
                           tags_collection=tags_collection,
                           item=item)
Exemple #11
0
def search_string_to_mongodb_query(mongo: PyMongo, search_string: Union[str, AST], include_hidden: bool = False) -> Union[Dict, List[SearchStringParseError]]:
    """
    Takes in a search string, or AST and converts the search string 
    into an AST if neededed, then does all the processing needed to 
    convert that AST into a query that MongoDB understands
    """

    if isinstance(search_string, str):
        ast: AST = search_string_parser(search_string)
        if isinstance(ast, SearchStringParseError):
            return [ast]
    else:
        ast: AST = search_string

    # if not include_hidden then add that condition

    if not include_hidden:
        ast.base_operator = BinaryOperator(OperatorTypes.And, ast.base_operator, VisibleItemValue())

    # verify existence of tags/attribs and get their ids

    tag_names: Dict[str, TagValue] = {t.stripped_name: t for t in ast.tag_values}
    attribute_names: Dict[str, AttributeValue] = {a.attribute_name: a for a in ast.attribute_values}

    tags = mongo.db.tags.find({"name": {"$in": list(tag_names.keys())}})
    tags = [Tag.from_dict(t) for t in tags]

    for tag in tags:
        tag_names.pop(tag.name).tag_id = tag.id

    if tag_names:
        return [NonexistentTag(t) for t in tag_names.keys()]

    attrib_options = mongo.db.attrib_options.find({"attribute_name": {"$in": list(attribute_names.keys())}})
    attrib_options = [AttributeOption.from_dict(t) for t in attrib_options]

    for attrib_option in attrib_options:
        attribute_names.pop(attrib_option.attribute_name).attribute_option_id = attrib_option.id

    if attribute_names:
        return [NonexistentAttribute(t) for t in attribute_names.keys()]

    # now: selectively apply de-morgans law to move all not's onto atomic values due to limitation in MongoDB search

    to_visit_queue: List[Operator] = [ast.base_operator]

    while to_visit_queue:
        node = to_visit_queue.pop()

        if isinstance(node, UnitaryOperator):
            if node.op_type == OperatorTypes.Identity:
                if isinstance(node.value, Operator):
                    to_visit_queue.append(node.value)
            elif node.op_type == OperatorTypes.Not:
                if isinstance(node.value, UnitaryOperator):
                    if node.value.op_type == OperatorTypes.Identity:
                        # !(a) -> (!a)
                        node.op_type = OperatorTypes.Identity
                        node.value.op_type = OperatorTypes.Not
                    elif node.value.op_type == OperatorTypes.Not:
                        # !!a -> a
                        node.op_type = OperatorTypes.Identity
                        node.value.op_type = OperatorTypes.Identity

                    to_visit_queue.append(node.value)
                elif isinstance(node.value, BinaryOperator):
                    if node.value.op_type == OperatorTypes.And:
                        # !(a && b) -> (!a || !b)
                        node.op_type = OperatorTypes.Identity
                        node.value.op_type = OperatorTypes.Or

                        node.value.left_value = UnitaryOperator(OperatorTypes.Not, node.value.left_value)
                        node.value.right_value = UnitaryOperator(OperatorTypes.Not, node.value.right_value)
                    elif node.value.op_type == OperatorTypes.Or:
                        # !(a || b) -> (!a && !b)
                        node.op_type = OperatorTypes.Identity
                        node.value.op_type = OperatorTypes.And

                        node.value.left_value = UnitaryOperator(OperatorTypes.Not, node.value.left_value)
                        node.value.right_value = UnitaryOperator(OperatorTypes.Not, node.value.right_value)

                    to_visit_queue.append(node.value)
                elif isinstance(node.value, Value):
                    # embed the not so it can be processed correctly
                    # !a -> a(not = true)
                    node.op_type = OperatorTypes.Identity
                    node.value.not_value = not node.value.not_value

        elif isinstance(node, BinaryOperator):
            if isinstance(node.left_value, Operator):
                to_visit_queue.append(node.left_value)
            if isinstance(node.right_value, Operator):
                to_visit_queue.append(node.right_value)

    # now form into a search

    return ast.base_operator.to_search_query()
    def recalculate_implied_tags(self, mongo: PyMongo, instances: bool = False, inherit: bool = True):
        """
        Recalculates the implied tags

        Parameters
        ----------
            mongo
                The mongo database
            instances
                If true, then also recalculate the implied of all the instances
            inherit
                If true and a tag is on all instances of an object it will be implied on the item

        Returns
        -------
            True if successfull, False otherwise
        """
        if instances:
            self.recalculate_instance_implied_tags(mongo, None)
        else:
            if not self.update_from_db(mongo):
                return False
        self.implied_tags = []

        # get implied from relations
        relations = mongo.db.relations.find({"item_id": self.id})
        relations = [Relation.from_dict(r) for r in relations]

        relation_options = mongo.db.relation_options.find({"_id": {"$in": [r.option_id for r in relations]}})
        relation_options = [RelationOption.from_dict(r) for r in relation_options]

        self.implied_tags = [implied for option in relation_options for implied in option.implies]

        # traverse implication DAG
        to_search = set(t.tag_id for t in self.tags).union(t.tag_id for t in self.implied_tags)
        searched = set(to_search)

        while to_search:
            top_level = mongo.db.tags.find({"_id": {"$in": list(to_search)}})
            to_search = set()
            if top_level is None:
                break

            tags = [Tag.from_dict(tag) for tag in top_level]

            for tag in tags:
                for implied in tag.implies:
                    if implied.tag_id not in searched:
                        searched.add(implied.tag_id)
                        to_search.add(implied.tag_id)
                        self.implied_tags.append(implied)

        if inherit:
            possibilities = set()

            for inst in self.instances:
                possibilities.intersection_update(set(inst.tags).union(inst.implied_tags))

            self.implied_tags.extend(possibilities)

        self.write_to_db(mongo)
        return True
    def test(self):
        #create a book tag
        book_tag = Tag.search_for_by_name(self.mongo, "Book")
        if book_tag is None:
            book_tag = Tag("Book", [], [])
            book_tag.write_to_db(self.mongo)

        #create a multiplayer tag
        multiplayer_tag = Tag.search_for_by_name(self.mongo, "Multiplayer")
        if multiplayer_tag is None:
            multiplayer_tag = Tag("Multiplayer", [], [])
            multiplayer_tag.write_to_db(self.mongo)

        #create a player number tag
        players_tag = Tag.search_for_by_name(self.mongo, "Players: {}")
        if players_tag is None:
            players_tag = Tag("Players: {}",
                              [TagParameter.new_integer_range(0, 2, None)],
                              [TagImplication(multiplayer_tag.id, [])])
            players_tag.write_to_db(self.mongo)

        #create a damaged tag
        damaged_tag = Tag.search_for_by_name(self.mongo, "Damaged")
        if damaged_tag is None:
            damaged_tag = Tag("Damaged", [], [])
            damaged_tag.write_to_db(self.mongo)

        #create an added by tag
        added_by_tag = Tag.search_for_by_name(self.mongo, "Added By: {}")
        if added_by_tag is None:
            added_by_tag = Tag("Added By: {}", [TagParameter.new_string(0)],
                               [])
            added_by_tag.write_to_db(self.mongo)

        #create a borrowed by tag
        borrowed_by_tag = Tag.search_for_by_name(self.mongo, "Borrowed By: {}")
        if borrowed_by_tag is None:
            borrowed_by_tag = Tag("Borrowed By: {}",
                                  [TagParameter.new_string(0)], [])
            borrowed_by_tag.write_to_db(self.mongo)

        #create a None tag (all root tags point to this tag for easier management)
        root_tag = Tag.search_for_by_name(self.mongo, "None")
        if root_tag is None:
            root_tag = Tag("None", [], [])
            root_tag.write_to_db(self.mongo)

        #create an attribute for name
        item_name_attrib = AttributeOption.search_for_by_name(
            self.mongo, "name")
        if item_name_attrib is None:
            item_name_attrib = AttributeOption("name",
                                               AttributeTypes.SingleLineString)
            item_name_attrib.write_to_db(self.mongo)

        #create an attribute for author
        item_author_attrib = AttributeOption.search_for_by_name(
            self.mongo, "author")
        if item_author_attrib is None:
            item_author_attrib = AttributeOption(
                "author", AttributeTypes.SingleLineString)
            item_author_attrib.write_to_db(self.mongo)

        #create an attribute for description
        item_description_attrib = AttributeOption.search_for_by_name(
            self.mongo, "description")
        if item_description_attrib is None:
            item_description_attrib = AttributeOption(
                "description", AttributeTypes.MultiLineString)
            item_description_attrib.write_to_db(self.mongo)

        #search for item by its name attribute
        bob_book_item = Item.search_for_by_attribute(self.mongo,
                                                     item_name_attrib,
                                                     "Bob's Grand Adventure")
        #create a new item if no search result returned
        if not bob_book_item:
            bob_book_item = Item(
                {
                    "name": "Bob's Grand Adventure",
                    "author": "Mingchuan Tian"
                }, [
                    TagReference(book_tag.id, []),
                    TagReference(players_tag.id, [
                        TagParameterImpl.new_integer_range(
                            players_tag.parameters[0], 3, 5)
                    ])
                ])
            bob_book_item.write_to_db(self.mongo)
        else:
            bob_book_item = bob_book_item[0]

        #recalculates all implied tags for the item
        bob_book_item.recalculate_implied_tags(self.mongo)

        print("Multiplayer items: " +
              str(Item.search_for_by_tag_id(self.mongo, multiplayer_tag.id)))

        #search for the uuid attribute
        instance_uuid_attrib = AttributeOption.search_for_by_name(
            self.mongo, "uuid")
        #if none returned, create a new uuid attribute
        if instance_uuid_attrib is None:
            instance_uuid_attrib = AttributeOption(
                "uuid", AttributeTypes.SingleLineString)
            instance_uuid_attrib.write_to_db(self.mongo)

        #search for the Damage Report attribute
        instance_damage_report_attrib = AttributeOption.search_for_by_name(
            self.mongo, "Damage Report")
        #if none returned, create a Damage Report attribute
        if instance_damage_report_attrib is None:
            instance_damage_report_attrib = AttributeOption(
                "Damage Report", AttributeTypes.MultiLineString)
            instance_damage_report_attrib.write_to_db(self.mongo)

        #search for an instance with uuid 1093..
        bob_book_instance_1 = Instance.search_for_by_attribute(
            self.mongo, instance_uuid_attrib, "109358180")
        #if none returned, create a new instance with further info
        if not bob_book_instance_1:
            bob_book_instance_1 = Instance(
                bob_book_item.id, {
                    "uuid":
                    "109358180",
                    "Damage Report":
                    "(4/5/2017): Page 57 has a small section of the top right corner torn off, no text missing, still serviceable"
                }, [TagReference(damaged_tag.id, [])])
            bob_book_instance_1.write_to_db(self.mongo)
        else:
            bob_book_instance_1 = bob_book_instance_1[0]

        #recalculate implied tags for instance
        bob_book_instance_1.recalculate_implied_tags(self.mongo)

        #search for a damaged item
        print("Damaged items /w Instance: " + str(
            Item.search_for_by_tag_id_with_instance(self.mongo,
                                                    damaged_tag.id)))
        print("Damaged items /w Common Instance: " + str(
            Item.search_for_by_tag_id_with_common_instance(
                self.mongo, damaged_tag.id)))

        bob_book_instance_2 = Instance.search_for_by_attribute(
            self.mongo, instance_uuid_attrib, "109358181")
        if not bob_book_instance_2:
            bob_book_instance_2 = Instance(bob_book_item.id,
                                           {"uuid": "109358181"}, [])
            bob_book_instance_2.write_to_db(self.mongo)
        else:
            bob_book_instance_2 = bob_book_instance_2[0]

        bob_book_instance_2.recalculate_implied_tags(self.mongo)

        print("Damaged items /w Instance: " + str(
            Item.search_for_by_tag_id_with_instance(self.mongo,
                                                    damaged_tag.id)))
        print("Damaged items /w Common Instance: " + str(
            Item.search_for_by_tag_id_with_common_instance(
                self.mongo, damaged_tag.id)))

        everyone_role = Role.search_for_by_name(self.mongo, "everyone")
        if everyone_role is None:  # -1 is overridden by everything, an 'everyone' is required for sake of a default
            everyone_role = Role("everyone", -1, {
                Permissions.CanEditItems: False,
                Permissions.CanEditUsers: False
            })
            everyone_role.write_to_db(self.mongo)

        admin_role = Role.search_for_by_name(self.mongo, "admin")
        if admin_role is None:  # 0 overrides everything
            admin_role = Role("admin", 0, {
                Permissions.CanEditItems: True,
                Permissions.CanEditUsers: True
            })
            admin_role.write_to_db(self.mongo)

        added_by_item_relation = RelationOption.search_for_by_name(
            self.mongo, "Added")
        if added_by_item_relation is None:
            added_by_item_relation = RelationOption("Added", [
                TagImplication(added_by_tag.id, [
                    TagParameterImpl.new_needs_override(
                        added_by_tag.parameters[0])
                ])
            ])
            added_by_item_relation.write_to_db(self.mongo)

        borrowing_item_relation = RelationOption.search_for_by_name(
            self.mongo, "Borrowing")
        if borrowing_item_relation is None:
            borrowing_item_relation = RelationOption("Borrowing", [
                TagImplication(borrowed_by_tag.id, [
                    TagParameterImpl.new_needs_override(
                        borrowed_by_tag.parameters[0])
                ])
            ])
            borrowing_item_relation.write_to_db(self.mongo)

        matthew_user = User.search_for_by_display_name(self.mongo, "Matthew")
        if matthew_user is None:
            matthew_user = User("Matthew", [admin_role.id])
            matthew_user.write_to_db(self.mongo)

        matthew_bob_book_added_relation = Relation.search_for_by_item_id(
            self.mongo, bob_book_item.id)
        if not matthew_bob_book_added_relation:
            matthew_bob_book_added_relation = Relation.new_item(
                matthew_user.id, added_by_item_relation.id, bob_book_item.id, [
                    TagImplication(added_by_tag.id, [
                        TagParameterImpl.new_string(added_by_tag.parameters[0],
                                                    "Matthew")
                    ])
                ])

            matthew_bob_book_added_relation.write_to_db(self.mongo)
        else:
            matthew_bob_book_added_relation = matthew_bob_book_added_relation[
                0]

        matthew_bob_borrow_added_relation = Relation.search_for_by_instance_id(
            self.mongo, bob_book_instance_2.id)
        if not matthew_bob_borrow_added_relation:
            matthew_bob_borrow_added_relation = Relation.new_instance(
                matthew_user.id, borrowing_item_relation.id,
                bob_book_instance_2.id, [
                    TagImplication(borrowed_by_tag.id, [
                        TagParameterImpl.new_string(
                            borrowed_by_tag.parameters[0], "Matthew")
                    ])
                ])
            matthew_bob_borrow_added_relation.write_to_db(self.mongo)
        else:
            matthew_bob_borrow_added_relation = matthew_bob_borrow_added_relation[
                0]

        bob_book_instance_1.recalculate_implied_tags(self.mongo)
        bob_book_instance_2.recalculate_implied_tags(self.mongo)
        bob_book_item.recalculate_implied_tags(self.mongo)
    def test(self):
        # create a book tag
        book_tag = Tag.search_for_by_name(self.mongo, "Book")
        if book_tag is None:
            book_tag = Tag("Book", [])
            book_tag.write_to_db(self.mongo)

        # create a multiplayer tag
        multiplayer_tag = Tag.search_for_by_name(self.mongo, "Multiplayer")
        if multiplayer_tag is None:
            multiplayer_tag = Tag("Multiplayer", [])
            multiplayer_tag.write_to_db(self.mongo)

        # create a player 1 tag
        players_tag_1 = Tag.search_for_by_name(self.mongo, "Players: 1")
        if players_tag_1 is None:
            players_tag_1 = Tag("Players: 1", [])
            players_tag_1.write_to_db(self.mongo)

        # create a player 2 tag
        players_tag_2 = Tag.search_for_by_name(self.mongo, "Players: 2")
        if players_tag_2 is None:
            players_tag_2 = Tag("Players: 2", [TagReference(multiplayer_tag)])
            players_tag_2.write_to_db(self.mongo)

        # create a player 3 tag
        players_tag_3 = Tag.search_for_by_name(self.mongo, "Players: 3")
        if players_tag_3 is None:
            players_tag_3 = Tag("Players: 3", [TagReference(multiplayer_tag)])
            players_tag_3.write_to_db(self.mongo)

        # create a player 4 tag
        players_tag_4 = Tag.search_for_by_name(self.mongo, "Players: 4")
        if players_tag_4 is None:
            players_tag_4 = Tag("Players: 4", [TagReference(multiplayer_tag)])
            players_tag_4.write_to_db(self.mongo)

        # create a player 5 tag
        players_tag_5 = Tag.search_for_by_name(self.mongo, "Players: 5")
        if players_tag_5 is None:
            players_tag_5 = Tag("Players: 5", [TagReference(multiplayer_tag)])
            players_tag_5.write_to_db(self.mongo)

        # create a player 6 tag
        players_tag_6 = Tag.search_for_by_name(self.mongo, "Players: 6")
        if players_tag_6 is None:
            players_tag_6 = Tag("Players: 6", [TagReference(multiplayer_tag)])
            players_tag_6.write_to_db(self.mongo)

        # create a damaged tag
        damaged_tag = Tag.search_for_by_name(self.mongo, "Damaged")
        if damaged_tag is None:
            damaged_tag = Tag("Damaged", [])
            damaged_tag.write_to_db(self.mongo)

        # create a borrowed out tag
        borrowed_out_tag = Tag.search_for_by_name(self.mongo, "Borrowed Out")
        if borrowed_out_tag is None:
            borrowed_out_tag = Tag("Borrowed Out", [])
            borrowed_out_tag.write_to_db(self.mongo)

        # create a None tag (all root tags point to this tag for easier management)
        root_tag = Tag.search_for_by_name(self.mongo, "None")
        if root_tag is None:
            root_tag = Tag("None", [])
            root_tag.write_to_db(self.mongo)

        # load image from disk, normally one would upload it from the website
        test_image = self.fs.find_one({"filename": "dungeons.jpg"})
        if test_image is None:
            with open("../frontend/games-img/dungeons.jpg", "rb") as f:
                test_image = self.fs.put(f,
                                         filename="dungeons.jpg",
                                         content_type='image/jpg')
        else:
            test_image = test_image._id

        # search for item by its name attribute
        bob_book_item = Item.search_for_by_attribute(self.mongo,
                                                     self.name_attrib,
                                                     "Bob's Grand Adventure")
        # create a new item if no search result returned
        if not bob_book_item:
            bob_book_item = Item([
                SingleLineStringAttribute(self.name_attrib,
                                          "Bob's Grand Adventure"),
                MultiLineStringAttribute(self.description_attrib,
                                         ["No Description"]),
                PictureAttribute(self.main_picture, test_image)
            ], [
                TagReference(book_tag),
                TagReference(players_tag_3),
                TagReference(players_tag_4),
                TagReference(players_tag_5)
            ], [])

            bob_book_item.instances.append(
                Instance([
                    MultiLineStringAttribute(
                        self.description_attrib,
                        ["No Description", "uuid: 109358180"]),
                    MultiLineStringAttribute(self.hidden_description_attrib, [
                        "Damage Report: (4/5/2017): Page 57 has a small section of the top right corner torn off, no text missing, still serviceable"
                    ])
                ], [TagReference(damaged_tag)], True))
            bob_book_item.instances.append(
                Instance([
                    MultiLineStringAttribute(
                        self.description_attrib,
                        ["No Description", "uuid: 109358181"])
                ], []))

            bob_book_item.write_to_db(self.mongo)
        else:
            bob_book_item = bob_book_item[0]

        # search for item by its name attribute
        steve_hidden_book_item = Item.search_for_by_attribute(
            self.mongo, self.name_attrib, "Steve's Grand Adventure")
        # create a new item if no search result returned
        if not steve_hidden_book_item:
            steve_hidden_book_item = Item([
                SingleLineStringAttribute(self.name_attrib,
                                          "Steve's Grand Adventure")
            ], [TagReference(book_tag),
                TagReference(players_tag_4)], [], True)

            steve_hidden_book_item.instances.append(
                Instance([
                    MultiLineStringAttribute(
                        self.description_attrib,
                        ["No Description", "uuid: 109354180"])
                ], []))
            steve_hidden_book_item.instances.append(
                Instance([
                    MultiLineStringAttribute(
                        self.description_attrib,
                        ["No Description", "uuid: 109354181"])
                ], []))

            steve_hidden_book_item.write_to_db(self.mongo)
        else:
            steve_hidden_book_item = steve_hidden_book_item[0]

        # recalculates all implied tags for the item and instances
        bob_book_item.recalculate_implied_tags(self.mongo, True)

        borrowing_item_relation = RelationOption.search_for_by_name(
            self.mongo, "Borrowing")
        if borrowing_item_relation is None:
            borrowing_item_relation = RelationOption(
                "Borrowing", [TagReference(borrowed_out_tag)])
            borrowing_item_relation.write_to_db(self.mongo)

        emptycheck = self.mongo.db.users.count()
        default_user = User.search_for_by_display_name(self.mongo,
                                                       "DefaultAdmin")
        if emptycheck == 0:
            default_user = User("DefaultAdmin", [self.admin_role.id],
                                "*****@*****.**",
                                generate_password_hash("password"), "Test",
                                "LastTest")
            default_user.write_to_db(self.mongo)

        # this code should never be needed normally, this is modeling a human performing this action, if you want to automate this properlly then properlly add a uuid attribute
        inst_0_id = [
            inst for inst in bob_book_item.instances if len([
                a for a in inst.attributes
                if isinstance(a, MultiLineStringAttribute) and len([
                    line
                    for line in a.value if line.find("uuid: 109358180") != -1
                ]) != 0
            ]) != 0
        ][0].id
        inst_1_id = [
            inst for inst in bob_book_item.instances if len([
                a for a in inst.attributes
                if isinstance(a, MultiLineStringAttribute) and len([
                    line
                    for line in a.value if line.find("uuid: 109358181") != -1
                ]) != 0
            ]) != 0
        ][0].id

        matthew_bob_borrow_relation = Relation.search_for_by_instance_id(
            self.mongo, inst_1_id)
        if not matthew_bob_borrow_relation:
            matthew_bob_borrow_relation = Relation.new_instance(
                default_user.id, borrowing_item_relation.id, inst_1_id)
            matthew_bob_borrow_relation.write_to_db(self.mongo)
        else:
            matthew_bob_borrow_relation = matthew_bob_borrow_relation[0]

        bob_book_item.recalculate_implied_tags(self.mongo, True)

        #Page load testing
        '''
Exemple #15
0
def tag_edit_param(tag_name):
    tag = Tag.search_for_by_name(db_manager.mongo, tag_name)
    form = addTagParamForm()
    if form.validate_on_submit():
        param_type = form.paramType.data
        #Find the right index for this parameter
        last_index = -1
        for param in tag.parameters:
            if param.index == last_index + 1:
                last_index += 1
                continue
            else:
                last_index += 1
                break
        if param_type == 'integer':
            try:
                new_param = TagParameter.new_integer(last_index,
                                                     form.min_value.data,
                                                     form.max_value.data)
            except:
                return 'Something wrong'
        elif param_type == 'real number':
            try:
                new_param = TagParameter.new_real(last_index,
                                                  form.min_value.data,
                                                  form.max_value.data)
            except:
                return 'Something wrong'

        elif param_type == 'range(integer)':
            try:
                new_param = TagParameter.new_integer_range(
                    last_index, form.min_value.data, form.max_value.data)
            except:
                return 'Something wrong'

        elif param_type == 'range(real)':
            try:
                new_param = TagParameter.new_real_range(
                    last_index, form.min_value.data, form.max_value.data)
            except:
                return 'Something wrong'

        elif param_type == 'enumerated':
            try:
                new_param = TagParameter.new_enum(last_index, [
                    form.enumerate_values1.data, form.enumerate_values2.data,
                    form.enumerate_values3.data
                ])
            except:
                return 'Something wrong'
        elif param_type == 'string':
            try:
                new_param = TagParameter.new_string(last_index)
            except:
                return 'Something wrong'
        tag.parameters.append(new_param)
        tag.write_to_db(db_manager.mongo)
        return 'tag param updated'

    return render_template('admin-pages/lib-man/tag-man/tag-edit-param.html',
                           tag=tag,
                           form=form)
Exemple #16
0
def tag_delete(tag_name):
    tag = Tag.search_for_by_name(db_manager.mongo, tag_name)
    tag.delete_from_db(db_manager.mongo)
    return redirect(url_for('tag_all'))