@@ -34,9 +34,8 @@ def as_resource_list(self):
34
34
35
35
class BaseResource (peewee .BaseModel ):
36
36
37
- def include_field_for_compact (cls , name ):
38
- if name in ['version' , 'created_at' , 'created_by' , 'modified_at' ,
39
- 'modified_by' ]:
37
+ def include_field_for_collection (cls , name ):
38
+ if name in cls .exclude_for_collection :
40
39
return False
41
40
attr = getattr (cls , name , None )
42
41
exclude = (db .ManyToManyField , peewee .ReverseRelationDescriptor ,
@@ -49,6 +48,8 @@ def __new__(mcs, name, bases, attrs, **kwargs):
49
48
# Inherit and extend instead of replacing.
50
49
resource_fields = attrs .pop ('resource_fields' , None )
51
50
resource_schema = attrs .pop ('resource_schema' , None )
51
+ exclude_for_collection = attrs .pop ('exclude_for_collection' , None )
52
+ exclude_for_version = attrs .pop ('exclude_for_version' , None )
52
53
cls = super ().__new__ (mcs , name , bases , attrs , ** kwargs )
53
54
if resource_fields is not None :
54
55
inherited = getattr (cls , 'resource_fields' , {})
@@ -58,10 +59,20 @@ def __new__(mcs, name, bases, attrs, **kwargs):
58
59
inherited = getattr (cls , 'resource_schema' , {})
59
60
resource_schema .update (inherited )
60
61
cls .resource_schema = resource_schema
61
- cls .extended_fields = cls .resource_fields
62
- cls .compact_fields = [
63
- n for n in cls .extended_fields
64
- if mcs .include_field_for_compact (cls , n )] + ['resource' ]
62
+ if exclude_for_collection is not None :
63
+ inherited = getattr (cls , 'exclude_for_collection' , [])
64
+ exclude_for_collection .extend (inherited )
65
+ cls .exclude_for_collection = exclude_for_collection
66
+ if exclude_for_version is not None :
67
+ inherited = getattr (cls , 'exclude_for_version' , [])
68
+ exclude_for_version .extend (inherited )
69
+ cls .exclude_for_version = exclude_for_version
70
+ cls .collection_fields = [
71
+ n for n in cls .resource_fields
72
+ if mcs .include_field_for_collection (cls , n )] + ['resource' ]
73
+ cls .versioned_fields = [
74
+ n for n in cls .resource_fields
75
+ if n not in cls .exclude_for_version ]
65
76
cls .build_resource_schema ()
66
77
return cls
67
78
@@ -70,6 +81,8 @@ class ResourceModel(db.Model, metaclass=BaseResource):
70
81
resource_fields = ['id' ]
71
82
identifiers = []
72
83
resource_schema = {'id' : {'readonly' : True }}
84
+ exclude_for_collection = []
85
+ exclude_for_version = []
73
86
74
87
id = db .CharField (max_length = 50 , unique = True , null = False )
75
88
@@ -91,7 +104,7 @@ def build_resource_schema(cls):
91
104
"""Map Peewee models to Cerberus validation schema."""
92
105
schema = dict (cls .resource_schema )
93
106
for name , field in cls ._meta .fields .items ():
94
- if name not in cls .extended_fields :
107
+ if name not in cls .resource_fields :
95
108
continue
96
109
if field .primary_key :
97
110
continue
@@ -133,17 +146,17 @@ def resource(self):
133
146
@property
134
147
def as_resource (self ):
135
148
"""Resource plus relations."""
136
- return {f : self .extended_field (f ) for f in self .extended_fields }
149
+ return {f : self .extended_field (f ) for f in self .resource_fields }
137
150
138
151
@property
139
152
def as_relation (self ):
140
153
"""Resources plus relation references without metadata."""
141
- return {f : self .compact_field (f ) for f in self .compact_fields }
154
+ return {f : self .compact_field (f ) for f in self .collection_fields }
142
155
143
156
@property
144
157
def as_version (self ):
145
158
"""Resources plus relations references and metadata."""
146
- return {f : self .compact_field (f ) for f in self .extended_fields }
159
+ return {f : self .compact_field (f ) for f in self .versioned_fields }
147
160
148
161
def extended_field (self , name ):
149
162
value = getattr (self , '{}_extended' .format (name ), getattr (self , name ))
0 commit comments