2323 TagBoxTypes ,
2424 TextField ,
2525)
26- from .joins import TagField , TagSubtag
26+ from .joins import TagSubtag , TagField
2727from .models import Entry , Preferences , Tag , TagAlias
2828from ...constants import PREFS , TS_FOLDER_NAME , TAG_ARCHIVED , TAG_FAVORITE
2929
@@ -118,25 +118,44 @@ def open_library(self, library_dir: Path | str) -> None:
118118
119119 def delete_item (self , item ):
120120 logger .info ("deleting item" , item = item )
121- with Session (self .engine ) as session , session . begin () :
121+ with Session (self .engine ) as session :
122122 session .delete (item )
123123 session .commit ()
124124
125- def remove_field_tag (self , field : TagBoxField , tag_id : int ):
126- with Session (self .engine ) as session , session .begin ():
127- # remove instance of TagField matching combination of `field` and `tag_id`
128- session .delete (
129- session .scalar (
125+ def remove_field_tag (self , entry : Entry , tag : Tag , field : TagBoxTypes ):
126+ with Session (self .engine ) as session :
127+ # find field matching entry and field_type
128+ field = session .scalars (
129+ select (TagBoxField ).where (
130+ and_ (
131+ TagBoxField .entry_id == entry .id ,
132+ TagBoxField .type == field ,
133+ )
134+ )
135+ ).first ()
136+
137+ if not field :
138+ logger .error ("no field found" , entry = entry , field = field )
139+ return False
140+
141+ try :
142+ # find the record in `TagField` table and delete it
143+ tag_field = session .scalars (
130144 select (TagField ).where (
131145 and_ (
146+ TagField .tag_id == tag .id ,
132147 TagField .field_id == field .id ,
133- TagField .tag_id == tag_id ,
134148 )
135149 )
136- )
137- )
138-
139- session .commit ()
150+ ).first ()
151+ if tag_field :
152+ session .delete (tag_field )
153+ session .commit ()
154+ return True
155+ except IntegrityError as e :
156+ logger .exception (e )
157+ session .rollback ()
158+ return False
140159
141160 def get_entry (self , entry_id : int ) -> Entry | None :
142161 """Load entry without joins."""
@@ -153,7 +172,7 @@ def entries(self) -> list[Entry]:
153172 """Load all entries with joins.
154173 Debugging purposes only.
155174 """
156- with Session (self .engine ) as session , session . begin () :
175+ with Session (self .engine ) as session :
157176 stmt = (
158177 select (Entry )
159178 .outerjoin (Entry .text_fields )
@@ -469,7 +488,7 @@ def remove_field(
469488 field : Field ,
470489 entry_ids : list [int ],
471490 ) -> None :
472- with Session (self .engine ) as session , session . begin () :
491+ with Session (self .engine ) as session :
473492 fields = session .scalars (
474493 select (field .__class__ ).where (
475494 and_ (
@@ -489,7 +508,7 @@ def update_field(
489508 entry_ids : list [int ],
490509 mode : Literal ["replace" , "append" , "remove" ],
491510 ):
492- with Session (self .engine ) as session , session . begin () :
511+ with Session (self .engine ) as session :
493512 fields = session .scalars (
494513 select (field .__class__ ).where (
495514 and_ (
@@ -571,7 +590,7 @@ def add_tag(self, tag: Tag, subtag_ids: list[int] | None = None) -> Tag | None:
571590 return None
572591
573592 def add_field_tag (self , entry : Entry , tag : Tag , field_type : TagBoxTypes ) -> bool :
574- with Session (self .engine ) as session , session . begin () :
593+ with Session (self .engine ) as session :
575594 # find field matching entry and field_type
576595 field = session .scalars (
577596 select (TagBoxField ).where (
@@ -596,48 +615,6 @@ def add_field_tag(self, entry: Entry, tag: Tag, field_type: TagBoxTypes) -> bool
596615 session .rollback ()
597616 return False
598617
599- def add_tag_to_entry_meta_tags (self , tag : int | Tag , entry_id : int ) -> None :
600- if isinstance (tag , Tag ):
601- tag = tag .id
602-
603- with Session (self .engine ) as session , session .begin ():
604- meta_tag_box = session .scalars (
605- select (TagBoxField ).where (
606- and_ (
607- TagBoxField .entry_id == entry_id ,
608- TagBoxField .type == TagBoxTypes .meta_tag_box ,
609- )
610- )
611- ).one ()
612- tag = session .scalars (select (Tag ).where (Tag .id == tag )).one ()
613-
614- meta_tag_box .tags .add (tag )
615-
616- def remove_tag_from_entry_meta_tags (self , tag : int | Tag , entry_id : int ) -> None :
617- if isinstance (tag , Tag ):
618- tag = tag .id
619-
620- with Session (self .engine ) as session , session .begin ():
621- meta_tag_box = session .scalars (
622- select (TagBoxField ).where (
623- and_ (
624- TagBoxField .entry_id == entry_id ,
625- TagBoxField .type == TagBoxTypes .meta_tag_box ,
626- )
627- )
628- ).one ()
629- tag = session .scalars (select (Tag ).where (Tag .id == tag )).one ()
630-
631- meta_tag_box .tags .remove (tag )
632-
633- def entry_archived_favorited_status (self , entry : int | Entry ) -> tuple [bool , bool ]:
634- if isinstance (entry , Entry ):
635- entry = entry .id
636- with Session (self .engine ) as session , session .begin ():
637- entry_ = session .scalars (select (Entry ).where (Entry .id == entry )).one ()
638-
639- return (entry_ .archived , entry_ .favorited )
640-
641618 def save_library_backup_to_disk (self , * args , ** kwargs ):
642619 logger .error ("save_library_backup_to_disk to be implemented" )
643620
0 commit comments