23
23
TagBoxTypes ,
24
24
TextField ,
25
25
)
26
- from .joins import TagField , TagSubtag
26
+ from .joins import TagSubtag , TagField
27
27
from .models import Entry , Preferences , Tag , TagAlias
28
28
from ...constants import PREFS , TS_FOLDER_NAME , TAG_ARCHIVED , TAG_FAVORITE
29
29
@@ -118,25 +118,44 @@ def open_library(self, library_dir: Path | str) -> None:
118
118
119
119
def delete_item (self , item ):
120
120
logger .info ("deleting item" , item = item )
121
- with Session (self .engine ) as session , session . begin () :
121
+ with Session (self .engine ) as session :
122
122
session .delete (item )
123
123
session .commit ()
124
124
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 (
130
144
select (TagField ).where (
131
145
and_ (
146
+ TagField .tag_id == tag .id ,
132
147
TagField .field_id == field .id ,
133
- TagField .tag_id == tag_id ,
134
148
)
135
149
)
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
140
159
141
160
def get_entry (self , entry_id : int ) -> Entry | None :
142
161
"""Load entry without joins."""
@@ -153,7 +172,7 @@ def entries(self) -> list[Entry]:
153
172
"""Load all entries with joins.
154
173
Debugging purposes only.
155
174
"""
156
- with Session (self .engine ) as session , session . begin () :
175
+ with Session (self .engine ) as session :
157
176
stmt = (
158
177
select (Entry )
159
178
.outerjoin (Entry .text_fields )
@@ -469,7 +488,7 @@ def remove_field(
469
488
field : Field ,
470
489
entry_ids : list [int ],
471
490
) -> None :
472
- with Session (self .engine ) as session , session . begin () :
491
+ with Session (self .engine ) as session :
473
492
fields = session .scalars (
474
493
select (field .__class__ ).where (
475
494
and_ (
@@ -489,7 +508,7 @@ def update_field(
489
508
entry_ids : list [int ],
490
509
mode : Literal ["replace" , "append" , "remove" ],
491
510
):
492
- with Session (self .engine ) as session , session . begin () :
511
+ with Session (self .engine ) as session :
493
512
fields = session .scalars (
494
513
select (field .__class__ ).where (
495
514
and_ (
@@ -571,7 +590,7 @@ def add_tag(self, tag: Tag, subtag_ids: list[int] | None = None) -> Tag | None:
571
590
return None
572
591
573
592
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 :
575
594
# find field matching entry and field_type
576
595
field = session .scalars (
577
596
select (TagBoxField ).where (
@@ -596,48 +615,6 @@ def add_field_tag(self, entry: Entry, tag: Tag, field_type: TagBoxTypes) -> bool
596
615
session .rollback ()
597
616
return False
598
617
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
-
641
618
def save_library_backup_to_disk (self , * args , ** kwargs ):
642
619
logger .error ("save_library_backup_to_disk to be implemented" )
643
620
0 commit comments