~fabrixxm/confy

69b3d2d5e8e81d17f2f1a627d142214de8b573e8 — fabrixxm 3 months ago 088343f
models: search events with filters
1 files changed, 23 insertions(+), 11 deletions(-)

M src/models.py
M src/models.py => src/models.py +23 -11
@@ 31,15 31,18 @@ class ObjectNotFound(Exception):


## models
def _build_filter(day=None, room=None, track=None, event=None, **kwargs):
def _build_filter(table="", day=None, room=None, track=None, event=None, **kwargs):
        filterdata = []
        wherestm = []

        if table != "":
            table = f"{table}."

        def __f(col, value):
            if value is None:
                wherestm.append("{} is null".format(col))
                wherestm.append(f"{table}{col} is null")
            else:
                wherestm.append("{} = ?".format(col))
                wherestm.append(f"{table}{col} = ?")
                filterdata.append(value)

        if day is not None:


@@ 411,7 414,7 @@ class Event(GObject.GObject):

    @classmethod
    def filter(cls, day:Day = None, room:Room = None, track:Track = None, **kwargs):
        filterdata, wherestm = _build_filter(day=day, room=room, track=track, **kwargs)
        filterdata, wherestm = _build_filter("events", day=day, room=room, track=track, **kwargs)

        query = """SELECT * FROM events
                    WHERE {}


@@ 433,20 436,29 @@ class Event(GObject.GObject):
            yield cls()._init(row)

    @classmethod
    def search(cls, term, starred=False):
    def search(cls, term, starred=False, order_by=None, **filters):
        """Search events for 'term'"""

        starfilter = ""
        if starred:
            starfilter = "events.starred = 1 AND"
            filters["starred"] = 1
        filterdata, wherestm = _build_filter("events", **filters)

        order = ['rank']
        if order_by:
            order = [order_by, 'rank']

        wherestm.append("fts_event = ?")
        filterdata.append(term)

        query = """SELECT events.* FROM fts_event
                    JOIN events ON events.id = fts_event.event_id
                    WHERE {} fts_event = ?
                    WHERE {}
                    GROUP BY events.id
                    ORDER BY rank""".format(starfilter)
                    ORDER BY {}""".format(
                        " AND ".join(wherestm),
                        ", ".join(order)
                    )

        for row in local.getDb().execute(query, (term,)):
        for row in local.getDb().execute(query, filterdata):
            yield cls()._init(row)