예제 #1
0
파일: tag.py 프로젝트: rabaarabaa/server
def get_tags(item_type: enums.ItemType = enums.ItemType.Gallery,
             item_id: int = 0,
             raw: bool = False):
    """
    Get tags for item

    Args:
        item_type: possible items are :attr:`.ItemType.Gallery`, :attr:`.ItemType.Page`,
            :attr:`.ItemType.Grouping`, :attr:`.ItemType.Collection`
        item_id: id of item to fetch tags for
        raw: if true, tags from descendant ItemType's will not be included
            (this only makes sense when ItemType is :attr:`.ItemType.Gallery`)

    Returns:
        ```
        { namespace : list of tag message objects }
        ```
    """

    item_type = enums.ItemType.get(item_type)

    _, db_item = item_type._msg_and_model(
        (enums.ItemType.Gallery, enums.ItemType.Collection,
         enums.ItemType.Grouping, enums.ItemType.Page))

    db_obj = database_cmd.GetModelItemByID().run(db_item, {item_id})
    if db_obj:
        db_obj = db_obj[0]

    nstags = []
    if db_obj:
        g_objs = []
        if issubclass(db_item, db.TaggableMixin):
            nstags = db_obj.tags.all()
            if not raw and isinstance(db_obj, db.Gallery):
                g_objs.append(db_obj)
        else:
            for g in db_obj.galleries.all():
                nstags.extend(g.tags.all())
                if not raw:
                    g_objs.append(g)

        for g_obj in g_objs:
            for p in g_obj.pages.all():  # TODO: we only need tags
                nstags.extend(p.tags.all())

    msg = {}
    _msg = {}
    for nstag in nstags:
        ns = nstag.namespace.name
        if ns not in msg:
            msg[ns] = []
            _msg[ns] = []

        if nstag.tag.name not in _msg[ns]:
            msg[ns].append(
                message.Tag(nstag.tag, nstag).json_friendly(include_key=False))
            _msg[ns].append(nstag.tag.name)

    return message.Identity('tags', msg)
예제 #2
0
파일: ui.py 프로젝트: naafx8/server
def library_view(item_type: enums.ItemType = enums.ItemType.Gallery,
                 page: int = 0,
                 limit: int = 100,
                 sort_by: str = "",
                 search_query: str = "",
                 filter_id: int = None,
                 view_filter: enums.ViewType = enums.ViewType.Library,
                 ctx=None):
    """
    Fetch items from the database.
    Provides pagination.

    Args:
        item_type: possible items are :py:attr:`.ItemType.Gallery`, :py:attr:`.ItemType.Collection`, :py:attr:`.ItemType.Grouping`
        page: current page (zero-indexed)
        sort_by: name of column to order by ...
        limit: amount of items per page
        search_query: filter item by search terms
        filter_id: current filter list id
        view_filter: ...

    Returns:
        list of item message objects
    """
    utils.require_context(ctx)
    view_filter = enums.ViewType.get(view_filter)
    item_type = enums.ItemType.get(item_type)

    db_msg, db_model = item_type._msg_and_model(
        (enums.ItemType.Gallery, enums.ItemType.Collection,
         enums.ItemType.Grouping))

    items = message.List(db_model.__name__.lower(), db_msg)

    model_ids = search_cmd.ModelFilter().run(db_model, search_query)

    [
        items.append(db_msg(x)) for x in database_cmd.GetModelItemByID().run(
            db_model, model_ids, limit=limit, offset=page * limit)
    ]

    return items
예제 #3
0
def get_related_items(item_type: enums.ItemType = enums.ItemType.Gallery,
                      item_id: int = 0,
                      related_type: enums.ItemType = enums.ItemType.Page,
                      limit: int = 100):
    """
    Get item related to given item

    Args:
        item_type: parent item
        item_id: id of parent item
        related_type: child item
        limit: limit the amount of items returned

    Returns:
        a list of related item message object
    """
    item_type = enums.ItemType.get(item_type)
    related_type = enums.ItemType.get(related_type)

    _, parent_model = item_type._msg_and_model()
    child_msg, child_model = related_type._msg_and_model()

    col = db.relationship_column(parent_model, child_model)
    if not col:
        raise exceptions.APIError(
            utils.this_function(),
            "{} has no relationship with {}".format(related_type, item_type))

    s = constants.db_session()
    item_ids = s.query(child_model.id).join(col).filter(
        parent_model.id == item_id).limit(limit).all()
    items = database_cmd.GetModelItemByID().run(child_model,
                                                {x[0]
                                                 for x in item_ids})

    item_list = message.List(db.model_name(child_model), child_msg)
    [item_list.append(child_msg(x)) for x in items]
    return item_list
예제 #4
0
def get_item(item_type: enums.ItemType = enums.ItemType.Gallery,
             item_id: int = 0):
    """
    Get item

    Args:
        item_type: type of item to get
        item_id: id of item

    Returns:
        item message object
    """

    item_type = enums.ItemType.get(item_type)

    db_msg, db_model = item_type._msg_and_model()

    item = database_cmd.GetModelItemByID().run(db_model, {item_id})[0]
    if not item:
        raise exceptions.DatabaseItemNotFoundError(
            utils.this_function(),
            "'{}' with id '{}' was not found".format(item_type.name, item_id))

    return db_msg(item)