2019-11-19 15:37:53 +03:00
|
|
|
|
from mods.db import db, Catalog, CatalogIndex
|
2019-12-01 16:22:43 +03:00
|
|
|
|
import re
|
2019-12-12 19:47:08 +03:00
|
|
|
|
import gi
|
|
|
|
|
gi.require_version('Gtk', '3.0')
|
|
|
|
|
from gi.repository import Gtk, GObject
|
|
|
|
|
from mods.utils import show_msg, ConditionalFilter
|
|
|
|
|
from mods.files import catalog_row_ui_str, new_catalog_win_file
|
|
|
|
|
from mods.root import builder
|
|
|
|
|
import peewee
|
|
|
|
|
|
|
|
|
|
class CatalogRow(Gtk.ListBoxRow):
|
|
|
|
|
@GObject.Property
|
|
|
|
|
def db_id(self):
|
|
|
|
|
return self._db_id
|
|
|
|
|
@db_id.setter
|
|
|
|
|
def db_id_setter(self, value):
|
|
|
|
|
self._db_id = value
|
|
|
|
|
@GObject.Property
|
|
|
|
|
def name(self):
|
|
|
|
|
return self._name
|
|
|
|
|
@name.setter
|
|
|
|
|
def name_setter(self, value):
|
|
|
|
|
self._name = value
|
2019-11-23 23:36:26 +03:00
|
|
|
|
|
|
|
|
|
def add_catalog(name):
|
|
|
|
|
with db.atomic():
|
|
|
|
|
catalog = Catalog.create(name=name)
|
|
|
|
|
CatalogIndex.insert(
|
|
|
|
|
{
|
|
|
|
|
CatalogIndex.rowid: catalog.id,
|
|
|
|
|
CatalogIndex.text: name
|
|
|
|
|
}
|
|
|
|
|
).execute()
|
2019-11-12 21:39:26 +03:00
|
|
|
|
return catalog
|
|
|
|
|
|
|
|
|
|
def search_catalogs(q):
|
2019-12-01 16:22:43 +03:00
|
|
|
|
q = re.sub(r'\s+', ' ', q).strip()
|
|
|
|
|
q = ' '.join([ f'{x}*' for x in q.split(' ')])
|
2019-11-19 15:37:53 +03:00
|
|
|
|
with db.atomic():
|
|
|
|
|
return (Catalog.select()
|
|
|
|
|
.join(
|
|
|
|
|
CatalogIndex,
|
|
|
|
|
on=(Catalog.id == CatalogIndex.rowid))
|
|
|
|
|
.where(CatalogIndex.match(q))
|
|
|
|
|
.order_by(CatalogIndex.bm25()))
|
2019-11-12 21:39:26 +03:00
|
|
|
|
|
2019-12-12 19:47:08 +03:00
|
|
|
|
catalog_filter = ConditionalFilter(search_catalogs)
|
|
|
|
|
|
|
|
|
|
###########################################################################
|
|
|
|
|
|
|
|
|
|
def build_catalog_row(catalog):
|
|
|
|
|
b = Gtk.Builder()
|
|
|
|
|
b.add_from_string(catalog_row_ui_str)
|
|
|
|
|
win = b.get_object('win')
|
|
|
|
|
box = b.get_object('catalog_box')
|
|
|
|
|
b.get_object('name').set_text(catalog.name)
|
|
|
|
|
row = CatalogRow()
|
|
|
|
|
row.props.db_id = catalog.id
|
|
|
|
|
row.name = catalog.name
|
|
|
|
|
win.remove(win.get_children()[0])
|
|
|
|
|
row.add(box)
|
|
|
|
|
return row
|
|
|
|
|
|
|
|
|
|
def create_new_catalog_win(catalog_list):
|
|
|
|
|
b = Gtk.Builder()
|
|
|
|
|
class NewCatalogHandler:
|
|
|
|
|
def save_catalog(self, *a):
|
|
|
|
|
catname = re.sub(r'\s+', ' ', b.get_object('catalog_name').get_text()).strip()
|
|
|
|
|
if not len(catname):
|
|
|
|
|
return show_msg('Не указано имя справочника', 'Данное поле должно быть заполнено', level='warn')
|
|
|
|
|
try:
|
|
|
|
|
catalog = add_catalog(catname)
|
|
|
|
|
except peewee.IntegrityError:
|
|
|
|
|
return show_msg('Данный справочник уже существует', 'Справочник с указанным названием уже есть с базе данных', level='warn')
|
|
|
|
|
row = build_catalog_row(catalog)
|
|
|
|
|
catalog_list.add(row)
|
|
|
|
|
catalog_list.select_row(row)
|
|
|
|
|
catalog_list.show_all()
|
|
|
|
|
b.get_object('new_catalog_window').close()
|
|
|
|
|
b.add_from_file(new_catalog_win_file)
|
|
|
|
|
b.connect_signals(NewCatalogHandler())
|
|
|
|
|
w = b.get_object('new_catalog_window')
|
|
|
|
|
return w
|
|
|
|
|
|
|
|
|
|
def catalog_sort_func(row1, row2, *a):
|
|
|
|
|
text1 = row1.props.name
|
|
|
|
|
text2 = row2.props.name
|
|
|
|
|
return (text1 > text2) - (text1 < text2)
|
|
|
|
|
def catalog_filter_func(row):
|
|
|
|
|
fstr = builder.get_object('catalog_filter').get_text().strip()
|
|
|
|
|
if not fstr:
|
|
|
|
|
catalog_filter.reset()
|
|
|
|
|
return True
|
|
|
|
|
return row.props.db_id in catalog_filter.filter(fstr)
|
|
|
|
|
|