Esempio n. 1
0
 def _get_joins(self):
     # pylint: disable=no-member
     # SQLObject methods not detected by pylint
     return [
         LEFTJOINOn(None, PhysicalCard,
                    PhysicalCard.q.id == self.__oTable.physical_card_id),
         LEFTJOINOn(None, AbstractCard,
                    AbstractCard.q.id == PhysicalCard.q.abstractCardID),
     ]
Esempio n. 2
0
 def _get_joins(self):
     # The join on the AbstractCard table is needed to enable filtering
     # physical card sets on abstract card propeties, since the base class
     # for physical card sets is the mapping table.
     # This is one of the only filters allowed to join like this
     # pylint: disable=no-member
     # SQLObject methods not detected by pylint
     return [
         LEFTJOINOn(None, PhysicalCard,
                    PhysicalCard.q.id == self.__oTable.physical_card_id),
         LEFTJOINOn(None, AbstractCard,
                    AbstractCard.q.id == PhysicalCard.q.abstractCardID),
     ]
def testAliased():
    setupClass(SBButton)
    b = Alias(makeSelect(), 'b')
    checkCount(b, 1)
    checkCount(Select(b.q.id), 1)

    # Table1 & Table2 are treated individually in joins
    checkCount(JOIN(None, b), 1)
    checkCount(JOIN(b, SBButton), 1)
    checkCount(JOIN(SBButton, b), 1)
    checkCount(LEFTJOINOn(None, b, SBButton.q.id == b.q.id), 1)
    checkCount(LEFTJOINOn(b, SBButton, SBButton.q.id == b.q.id), 1)
    checkCount(LEFTJOINOn(SBButton, b, SBButton.q.id == b.q.id), 1)
Esempio n. 4
0
 def _get_joins(self):
     # pylint: disable=no-member
     # SQLObject methods not detected by pylint
     return [
         LEFTJOINOn(None, self._oMapTable,
                    AbstractCard.q.id == self._oMapTable.q.abstract_card_id)
     ]
Esempio n. 5
0
    def __init__(self, name, filter_string):
        self.name = name

        project_name, keyword_filters = parseutils.extractKeywords(
            filter_string)

        q_filters = [x.filter() for x in keyword_filters]

        project_list = Project.select(LIKE(Project.q.name, project_name))
        q_filters.append(IN(Task.q.project, project_list))

        # Skip notes
        q_filters.append(
            parseutils.KeywordFilter("!@" + NOTE_KEYWORD).filter())

        # Only list done tasks if they were done after min_date
        min_date = compute_min_date()
        q_filters.append(
            OR(Task.q.status != 'done', Task.q.doneDate >= min_date))

        self.tasks = Task.select(AND(*q_filters),
                                 orderBy=Task.q.id,
                                 distinct=True,
                                 join=LEFTJOINOn(
                                     Task, TaskKeyword,
                                     Task.q.id == TaskKeyword.q.taskID))
Esempio n. 6
0
 def _get_joins(self):
     # pylint: disable=no-member
     # SQLObject methods not detected by pylint
     oTable = Table('abstract_card')
     return [
         LEFTJOINOn(None, PhysicalCard,
                    PhysicalCard.q.abstractCardID == oTable.id)
     ]
Esempio n. 7
0
def test_7join_on():
    setup()
    setupClass(SOTestJoin3)
    setupClass(SOTestJoin4)
    setupClass(SOTestJoin5)

    select = SOTestJoin1.select(
        join=(LEFTJOINOn(SOTestJoin2, SOTestJoin3, SOTestJoin2.q.col2 ==
                         SOTestJoin3.q.col3),
              LEFTJOINOn(SOTestJoin4, SOTestJoin5, SOTestJoin4.q.col4 ==
                         SOTestJoin5.q.col5)))
    assert str(select) == \
        "SELECT so_test_join1.id, so_test_join1.col1 " \
        "FROM so_test_join1, so_test_join2 " \
        "LEFT JOIN so_test_join3 " \
        "ON ((so_test_join2.col2) = (so_test_join3.col3)), so_test_join4 " \
        "LEFT JOIN so_test_join5 " \
        "ON ((so_test_join4.col4) = (so_test_join5.col5)) WHERE 1 = 1"
Esempio n. 8
0
def test_1syntax():
    setup()
    join = JOIN("table1", "table2")
    assert str(join) == "table1 JOIN table2"
    join = LEFTJOIN("table1", "table2")
    assert str(join) == "table1 LEFT JOIN table2"
    join = LEFTJOINOn("table1", "table2", "tabl1.col1 = table2.col2")
    assert getConnection().sqlrepr(join) == \
        "table1 LEFT JOIN table2 ON tabl1.col1 = table2.col2"
Esempio n. 9
0
 def _get_joins(self):
     # This is one of the filters allowed to
     # pass the AbstractCard table as a joining table.
     # The join is needed so filtering on abstract card properties can work
     # pylint: disable=no-member
     # SQLObject methods not detected by pylint
     oTable = Table('physical_card')
     return [
         LEFTJOINOn(None, AbstractCard,
                    AbstractCard.q.id == oTable.abstract_card_id)
     ]
Esempio n. 10
0
def test_3perform_join():
    setup()
    SOTestJoin1(col1="test1")
    SOTestJoin1(col1="test2")
    SOTestJoin1(col1="test3")
    SOTestJoin2(col2="test1")
    SOTestJoin2(col2="test2")

    select = SOTestJoin1.select(join=LEFTJOINOn(
        SOTestJoin1, SOTestJoin2, SOTestJoin1.q.col1 == SOTestJoin2.q.col2))
    assert select.count() == 3
Esempio n. 11
0
def test_3joins():
    setupClass(JoinAlias)
    alias = Alias(JoinAlias)
    select = JoinAlias.select(
        (JoinAlias.q.name == 'a') & (alias.q.name == 'b'),
        join=LEFTJOINOn(None, alias, alias.q.name == 'c'))
    assert str(select) == \
        "SELECT join_alias.id, join_alias.name, join_alias.parent " \
        "FROM join_alias " \
        "LEFT JOIN join_alias  join_alias_alias3 " \
        "ON ((join_alias_alias3.name) = ('c')) " \
        "WHERE (((join_alias.name) = ('a')) AND " \
        "((join_alias_alias3.name) = ('b')))"
Esempio n. 12
0
    def database_gen(authorOrTitle=""):
        titles = []

        # start out with the join clauses in the where clause list
        where_clause_list = []
        clause_tables = ["book", "author", "author_title"]
        join_list = [
            LEFTJOINOn("title", "book", "book.title_id=title.id"),
            LEFTJOINOn(None, "author_title", "title.id=author_title.title_id"),
            LEFTJOINOn(None, "author", "author.id=author_title.author_id"),
        ]

        # add filter clauses if they are called for
        where_clause_list.append(
            "(author.author_name RLIKE '%s' OR title.booktitle RLIKE '%s')"
            % (authorOrTitle.strip(), authorOrTitle.strip())
        )
        # AND all where clauses together
        where_clause = AND(where_clause_list)
        titles = []

        # do search.
        titles = Title.select(
            where_clause, join=join_list, clauseTables=clause_tables, distinct=True
        )
        for t1 in titles:
            yield {
                "title": t1.booktitle,
                "authors": t1.author,
                "authors_as_string": t1.authors_as_string(),
                "categories_as_string": t1.categories_as_string(),
                "list_price": t1.highest_price_book().ourprice,
                "publisher": t1.publisher,
                "isbn": t1.isbn,
                "format": t1.type,
                "kind": t1.kind.kindName,
                "known_title": t1,
            }
Esempio n. 13
0
 def _get_joins(self):
     # pylint: disable=no-member
     # avoid SQLObject method not detected problems
     return [LEFTJOINOn(None, self._oMapTable,
                        AbstractCard.q.id == self._oMapTable.q.id)]
Esempio n. 14
0
 def __init__(self, aData):
     # aData is a list or tuple of the form (aCounts, sCardSetName)
     # Selects cards with a count in the range specified by aCounts from
     # the Physical Card Set sCardSetName
     # We rely on the joins to limit this to the appropriate card sets
     # pylint: disable=no-member
     # SQLObject methods not detected by pylint
     aIds = []
     try:
         aCounts, aCardSetName = aData
         if not isinstance(aCardSetName, list):
             aCardSetName = [aCardSetName]
         for sCardSetName in aCardSetName:
             try:
                 oCS = IPhysicalCardSet(sCardSetName)
                 aIds.append(oCS.id)
             except SQLObjectNotFound:
                 aCounts = []
     except ValueError:
         aCounts = []
     # strip whitespace before comparing stuff
     # aCounts may be a single string, so we can't use 'for x in aCounts'
     aCounts = {x.strip() for x in list(aCounts)}
     self._oFilters = []
     self._aCardSetIds = aIds
     self._oZeroQuery = None
     if '0' in aCounts:
         aCounts.remove('0')
         self._oZeroQuery = Select(
             PhysicalCard.q.abstractCardID,
             where=IN(MapPhysicalCardToPhysicalCardSet.q.physicalCardSetID,
                      aIds),
             join=LEFTJOINOn(
                 PhysicalCard, MapPhysicalCardToPhysicalCardSet,
                 PhysicalCard.q.id ==
                 MapPhysicalCardToPhysicalCardSet.q.physicalCardID),
             groupBy=PhysicalCard.q.abstractCardID,
             having=func.COUNT(PhysicalCard.q.abstractCardID) > 0)
     if '>30' in aCounts:
         aCounts.remove('>30')
         oGreater30Query = Select(
             PhysicalCard.q.abstractCardID,
             where=IN(MapPhysicalCardToPhysicalCardSet.q.physicalCardSetID,
                      aIds),
             join=LEFTJOINOn(
                 PhysicalCard, MapPhysicalCardToPhysicalCardSet,
                 PhysicalCard.q.id ==
                 MapPhysicalCardToPhysicalCardSet.q.physicalCardID),
             groupBy=(PhysicalCard.q.abstractCardID,
                      MapPhysicalCardToPhysicalCardSet.q.physicalCardSetID),
             having=func.COUNT(PhysicalCard.q.abstractCardID) > 30)
         self._oFilters.append(oGreater30Query)
     if aCounts:
         # SQLite doesn't like strings here, so convert to int
         oCountFilter = Select(
             PhysicalCard.q.abstractCardID,
             where=IN(MapPhysicalCardToPhysicalCardSet.q.physicalCardSetID,
                      aIds),
             join=LEFTJOINOn(
                 PhysicalCard, MapPhysicalCardToPhysicalCardSet,
                 PhysicalCard.q.id ==
                 MapPhysicalCardToPhysicalCardSet.q.physicalCardID),
             groupBy=(PhysicalCard.q.abstractCardID,
                      MapPhysicalCardToPhysicalCardSet.q.physicalCardSetID),
             having=IN(func.COUNT(PhysicalCard.q.abstractCardID),
                       [int(x) for x in aCounts]))
         self._oFilters.append(oCountFilter)
Esempio n. 15
0
def searchInventory(sortby="booktitle", out_of_stock=False, **kwargs):
    # start building the filter list
    where_clause_list = []
    print("kwargs are ", kwargs, file=sys.stderr)
    for k in kwargs:
        if type(k) == bytes:
            kwargs[k] = kwargs[k].decode("utf-8")
    to_delete = [k for k in kwargs if kwargs[k] == ""]
    for td in to_delete:
        del kwargs[td]
    print(len(kwargs), file=sys.stderr)

    # clause_tables=['book', 'author', 'author_title', 'category', 'location']
    clause_tables = ["book", "author", "author_title", "location"]
    join_list = [
        LEFTJOINOn("title", "book", "book.title_id=title.id"),
        LEFTJOINOn(None, "author_title", "title.id=author_title.title_id"),
        LEFTJOINOn(None, "author", "author.id=author_title.author_id"),
        LEFTJOINOn(None, Location, Location.q.id == Book.q.locationID),
    ]
    # join_list=[LEFTJOINOn('title', 'book', 'book.title_id=title.id'), LEFTJOINOn(None, 'author_title', 'title.id=author_title.title_id'), LEFTJOINOn(None, 'author', 'author.id=author_title.author_id'), LEFTJOINOn(None, Category, Category.q.titleID==Title.q.id), LEFTJOINOn(None, Location, Location.q.id==Book.q.locationID)]
    if "the_kind" in kwargs:
        where_clause_list.append(Title.q.kindID == kwargs["the_kind"])
    if "the_location" in kwargs and len(the_location) > 1:
        where_clause_list.append(Book.q.locationID == kwargs["the_location"])
    if "title" in kwargs:
        where_clause_list.append(RLIKE(Title.q.booktitle, kwargs["title"].strip()))
    if "publisher" in kwargs:
        where_clause_list.append(RLIKE(Title.q.publisher, kwargs["publisher"].strip()))
    if "tag" in kwargs:
        where_clause_list.append(RLIKE(Title.q.tag, kwargs["tag"].strip()))
    if "isbn" in kwargs:
        isbn, price = _process_isbn(kwargs["isbn"])
        where_clause_list.append(Title.q.isbn == isbn)
    if "formatType" in kwargs:
        where_clause_list.append(Title.q.type == kwargs["formatType"].strip())
    if "owner" in kwargs:
        where_clause_list.append(RLIKE(Book.q.owner, kwargs["owner"].strip()))
    if "distributor" in kwargs:
        where_clause_list.append(
            RLIKE(Book.q.distributor, kwargs["distributor"].strip())
        )
    if "inv_begin_date" in kwargs:
        where_clause_list.append(Book.q.inventoried_when >= kwargs["inv_begin_date"])
    if "inv_end_date" in kwargs:
        where_clause_list.append(Book.q.inventoried_when < kwargs["inv_end_date"])
    if "sold_begin_date" in kwargs:
        where_clause_list.append(Book.q.sold_when >= kwargs["sold_begin_date"])
    if "sold_end_date" in kwargs:
        where_clause_list.append(Book.q.sold_when < kwargs["sold_end_date"])
    if "author" in kwargs:
        where_clause_list.append(RLIKE(Author.q.authorName, kwargs["author"].strip()))
    if "category" in kwargs:
        where_clause_list.append(
            RLIKE(Category.q.categoryName, kwargs["category"].strip())
        )
    if "status" in kwargs:
        where_clause_list.append(Book.q.status == kwargs["status"].strip())
    if "id" in kwargs:
        where_clause_list.append(Title.q.id == kwargs["id"])
    if "authorOrTitle" in kwargs:
        where_clause_list.append(
            OR(
                RLIKE(Author.q.authorName, kwargs["authorOrTitle"].strip()),
                RLIKE(Title.q.booktitle, kwargs["authorOrTitle"].strip()),
            )
        )

    where_clause = AND(*where_clause_list)

    # do search first. Note it currently doesnt let you search for every book in database, unless you use some sort of
    # trick like '1=1' for the where clause string, as the where clause string may not be blank
    titles = []
    if len(kwargs) > 1 or kwargs.setdefault("out_of_stock", False):
        titles = Title.select(
            where_clause,
            join=join_list,
            orderBy=sortby,
            clauseTables=clause_tables,
            distinct=True,
        )
    # filter for stock status
    # GROUPBY in sqlobject is complicated. We could do it but it's not worth it
    if "out_of_stock" in kwargs:
        titles = [t for t in titles if t.copies_in_status("STOCK") == 0]
    # filter on specific numbers in stock
    if "stock_less_than" in kwargs:
        titles = [
            t
            for t in titles
            if t.copies_in_status("STOCK") <= int(kwargs["stock_less_than"])
        ]
    if "stock_more_than" in kwargs:
        titles = [
            t
            for t in titles
            if t.copies_in_status("STOCK") >= int(kwargs["stock_more_than"])
        ]
    # filter by items sold
    if "sold_more_than" in kwargs:
        titles = [
            t
            for t in titles
            if t.copies_in_status("SOLD") >= int(kwargs["sold_more_than"])
        ]
    if "sold_less_than" in kwargs:
        titles = [
            t
            for t in titles
            if t.copies_in_status("SOLD") >= int(kwargs["sold_less_than"])
        ]
    print(titles, file=sys.stderr)
    return titles
Esempio n. 16
0
    def _renderList(self,
                    renderer,
                    projectList,
                    filters,
                    order,
                    limit=None,
                    groupKeyword=None):
        """
        Render a list using renderer, according to the restrictions set by the
        other parameters
        @param renderer: renderer class (for example: TextListRenderer)
        @param projectList: list of project name (as unicode string)
        @param filters: filters in sqlobject format (example: Task.q.status == 'done')
        @param order: ordering in sqlobject format (example: -Task.q.urgency)
        @param limit: limit number tasks (int) or None for no limit
        @param groupKeyword: keyword used for grouping (as unicode string) or None
        """
        if groupKeyword:
            if groupKeyword.startswith("@"):
                groupKeyword = groupKeyword[1:]
            for keyword in Keyword.select(LIKE(Keyword.q.name, groupKeyword)):
                if unicode(keyword.name).startswith(
                        "_") and not groupKeyword.startswith("_"):
                    # BUG: cannot filter on db side because sqlobject does not understand ESCAPE needed whith _
                    continue
                taskList = Task.select(
                    AND(TaskKeyword.q.keywordID == keyword.id, *filters),
                    orderBy=order,
                    limit=limit,
                    distinct=True,
                    join=LEFTJOINOn(Task, TaskKeyword,
                                    Task.q.id == TaskKeyword.q.taskID))
                taskList = list(taskList)
                if projectList:
                    taskList = [
                        x for x in taskList if x.project in projectList
                    ]
                if len(taskList) > 0:
                    self.lastTaskIds.extend([
                        t.id for t in taskList
                    ])  # Keep selected id for further use
                    renderer.addTaskList(unicode(keyword), taskList)
            renderer.end()
        else:
            hiddenProjectNames = []
            for project in projectList:
                if not project.active:
                    hiddenProjectNames.append(project.name)
                    continue
                taskList = Task.select(AND(Task.q.projectID == project.id,
                                           *filters),
                                       orderBy=order,
                                       limit=limit,
                                       distinct=True,
                                       join=LEFTJOINOn(
                                           Task, TaskKeyword,
                                           Task.q.id == TaskKeyword.q.taskID))
                taskList = list(taskList)

                if len(taskList) > 0:
                    self.lastTaskIds.extend([
                        t.id for t in taskList
                    ])  # Keep selected id for further use
                    renderer.addTaskList(unicode(project), taskList)
            renderer.end()

            if len(hiddenProjectNames) > 0:
                tui.info("hidden projects: %s" % ", ".join(hiddenProjectNames))
Esempio n. 17
0
 def _get_joins(self):
     return [
         LEFTJOINOn(None, self.__oTable,
                    self.__oPT.id == self.__oTable.q.physical_card_id)
     ]