def edit_classes(self, *ids_or_labels, mode, auto_commit=True, annotator=None):
""":param mode: either 'add' 'set' or 'del'"""
sess = object_session(self)
needs_commit = False
ids = set(ids_or_labels)
labels = set(_ for _ in ids if type(_) in (bytes, str))
ids -= labels
if mode == 'set':
self.classes[:] = []
else:
classes = list(self.classes)
if mode == 'del':
for c in classes:
if c.id in ids or c.label in labels:
self.classes.remove(c)
needs_commit = True
ids = labels = set() # do not add anything
elif mode == 'add':
for c in classes:
if c.id in ids:
ids.remove(c.id) # already set, remove it and don't add it again
if c.label in labels:
labels.remove(c.label) # already set, remove it and don't add it again
elif mode != 'set':
raise TypeError("`mode` argument needs to be in ('add', 'del', 'set'), "
"'%s' supplied" % str(mode))
if ids or labels:
flt1 = None if not ids else Class.id.in_(ids) # filter on ids, or None
flt2 = None if not labels else Class.label.in_(labels) # filter on labels, or None
flt = flt1 if flt2 is None else flt2 if flt1 is None else (flt1 | flt2)
classids2add = [_[0] for _ in sess.query(Class.id).filter(flt)]
if classids2add:
needs_commit = True
sess.add_all((ClassLabelling(class_id=cid,
segment_id=self.id, annotator=annotator,
is_hand_labelled=annotator or False)
for cid in classids2add))
if needs_commit and auto_commit:
try:
sess.commit()
except SQLAlchemyError as _:
sess.rollback()
raise
评论列表
文章目录