3
3
import uuid
4
4
5
5
from sqlalchemy import select , func , or_
6
- from sqlalchemy .orm import Session
6
+ from sqlalchemy .orm import Session , aliased
7
7
8
8
9
9
from papermerge .core import schema , orm
17
17
"-type" : orm .CustomField .type .desc (),
18
18
"name" : orm .CustomField .name .asc (),
19
19
"-name" : orm .CustomField .name .desc (),
20
+ "group_name" : orm .Group .name .asc ().nullsfirst (),
21
+ "-group_name" : orm .Group .name .desc ().nullslast (),
20
22
}
21
23
22
24
@@ -29,9 +31,16 @@ def get_custom_fields(
29
31
filter : str ,
30
32
order_by : str = "name" ,
31
33
) -> schema .PaginatedResponse [schema .CustomField ]:
34
+
35
+ UserGroupAlias = aliased (orm .user_groups_association )
36
+ subquery = select (UserGroupAlias .c .group_id ).where (
37
+ UserGroupAlias .c .user_id == user_id
38
+ )
39
+
32
40
stmt_total_cf = select (func .count (orm .CustomField .id )).where (
33
- orm .CustomField .user_id == user_id
41
+ or_ ( orm .CustomField .user_id == user_id , orm . CustomField . group_id . in_ ( subquery ))
34
42
)
43
+
35
44
if filter :
36
45
stmt_total_cf = stmt_total_cf .where (
37
46
or_ (
@@ -45,8 +54,18 @@ def get_custom_fields(
45
54
46
55
offset = page_size * (page_number - 1 )
47
56
stmt = (
48
- select (orm .CustomField )
49
- .where (orm .CustomField .user_id == user_id )
57
+ select (
58
+ orm .CustomField ,
59
+ orm .Group .name .label ("group_name" ),
60
+ orm .Group .id .label ("group_id" ),
61
+ )
62
+ .join (orm .Group , orm .Group .id == orm .CustomField .group_id , isouter = True )
63
+ .where (
64
+ or_ (
65
+ orm .CustomField .user_id == user_id ,
66
+ orm .CustomField .group_id .in_ (subquery ),
67
+ )
68
+ )
50
69
.limit (page_size )
51
70
.offset (offset )
52
71
.order_by (order_by_value )
@@ -59,9 +78,20 @@ def get_custom_fields(
59
78
orm .CustomField .type .icontains (filter ),
60
79
)
61
80
)
81
+ items = []
62
82
63
- db_cfs = db_session .scalars (stmt ).all ()
64
- items = [schema .CustomField .model_validate (db_cf ) for db_cf in db_cfs ]
83
+ for row in db_session .execute (stmt ):
84
+ kwargs = {
85
+ "id" : row .CustomField .id ,
86
+ "name" : row .CustomField .name ,
87
+ "type" : row .CustomField .type ,
88
+ "extra_data" : row .CustomField .extra_data ,
89
+ }
90
+ if row .group_name and row .group_id :
91
+ kwargs ["group_id" ] = row .group_id
92
+ kwargs ["group_name" ] = row .group_name
93
+
94
+ items .append (schema .CustomField (** kwargs ))
65
95
66
96
total_pages = math .ceil (total_cf / page_size )
67
97
@@ -127,9 +157,23 @@ def create_custom_field(
127
157
def get_custom_field (
128
158
session : Session , custom_field_id : uuid .UUID
129
159
) -> schema .CustomField :
130
- stmt = select (orm .CustomField ).where (orm .CustomField .id == custom_field_id )
131
- db_item = session .scalars (stmt ).unique ().one ()
132
- result = schema .CustomField .model_validate (db_item )
160
+ stmt = (
161
+ select (orm .CustomField , orm .Group )
162
+ .join (orm .Group , orm .Group .id == orm .CustomField .group_id , isouter = True )
163
+ .where (orm .CustomField .id == custom_field_id )
164
+ )
165
+ row = session .execute (stmt ).unique ().one ()
166
+ kwargs = {
167
+ "id" : row .CustomField .id ,
168
+ "name" : row .CustomField .name ,
169
+ "type" : row .CustomField .type ,
170
+ "extra_data" : row .CustomField .extra_data ,
171
+ }
172
+ if row .Group and row .Group .id :
173
+ kwargs ["group_id" ] = row .Group .id
174
+ kwargs ["group_name" ] = row .Group .name
175
+
176
+ result = schema .CustomField (** kwargs )
133
177
return result
134
178
135
179
@@ -156,13 +200,16 @@ def update_custom_field(
156
200
if attrs .extra_data :
157
201
cfield .extra_data = attrs .extra_data
158
202
159
- if attrs .user_id :
160
- cfield .user_id = attrs .user_id
161
- cfield .group_id = None
162
-
163
203
if attrs .group_id :
164
204
cfield .user_id = None
165
205
cfield .group_id = attrs .group_id
206
+ elif attrs .user_id :
207
+ cfield .user_id = attrs .user_id
208
+ cfield .group_id = None
209
+ else :
210
+ raise ValueError (
211
+ "Either attrs.user_id or attrs.group_id should be non-empty value"
212
+ )
166
213
167
214
session .commit ()
168
215
result = schema .CustomField .model_validate (cfield )
0 commit comments