1- '''
1+ """
22Custom Managers for sierra base app models.
3- '''
3+ """
44from datetime import date , time , datetime
55
66from django .db import models
1010
1111
1212class CustomFilterManager (models .Manager ):
13- '''
13+ """
1414 A generic models.Manager class that provides the ability to set
1515 custom filters easily. Just create a child class, and then create a
1616 method with the same name as the filter that you pass to filter_by.
@@ -20,13 +20,13 @@ class CustomFilterManager(models.Manager):
2020 set. For instance: [{a AND b AND c} OR {d} OR {e AND f}]. Order_by
2121 should be an array that can be passed as arguments to
2222 queryset.order_by().
23- '''
23+ """
2424 options = {}
2525
2626 def _apply_filter (self , filter_method ):
27- '''
27+ """
2828 Applies the filter_method and returns the filtered queryset.
29- '''
29+ """
3030 filter_params = filter_method ()
3131 filter = filter_params ['filter' ]
3232 order_by = filter_params ['order_by' ]
@@ -39,29 +39,31 @@ def _apply_filter(self, filter_method):
3939 set = set .order_by (* order_by )
4040 return set
4141
42- def filter_by (self , filter_method , options = {} ):
43- '''
42+ def filter_by (self , filter_method , options = None ):
43+ """
4444 Fetches a set of records based on a filter string and any
4545 options you specify. Options should be a dictionary.
46- '''
47- self .options = options
46+ """
47+ self .options = options or {}
4848 filter_method = getattr (self , filter_method )
4949 return self ._apply_filter (filter_method )
5050
5151
5252class RecordManager (CustomFilterManager ):
53- '''
53+ """
5454 Defines some common filters that apply across multiple types of
5555 records from the Sierra database, such as the base record types
5656 (item, bib, patron, etc.)
57- '''
57+ """
5858
5959 def updated_date_range (self ):
60- '''
60+ """
6161 Filter by a date range for last_updated. Options should contain
62- date_range_from and date_range_to, each of which are simply date
63- objects.
64- '''
62+ date_range_from and date_range_to, each of which are simply
63+ date objects. Options *may* contain `is_deletion`, which is a
64+ boolean that indicates whether or not this requires "last
65+ deleted" rather than "last updated".
66+ """
6567 options = self .options
6668 date_from = datetime .combine (options ['date_range_from' ], time (0 , 0 ))
6769 date_from = tz .make_aware (date_from , tz .get_default_timezone ())
@@ -74,25 +76,25 @@ def updated_date_range(self):
7476 prefix = 'record_metadata__'
7577 else :
7678 prefix = ''
77- filter = [
78- {
79- '{}record_last_updated_gmt__gte' .format (prefix ): date_from ,
80- '{}record_last_updated_gmt__lte' .format (prefix ): date_to
81- },
82- {
79+ if options .get ('is_deletion' , False ):
80+ filter = [{
8381 '{}deletion_date_gmt__gte' .format (prefix ): date_from ,
8482 '{}deletion_date_gmt__lte' .format (prefix ): date_to ,
85- }
86- ]
87-
88- order_by = ['{}record_last_updated_gmt' .format (prefix )]
83+ }]
84+ order_by = ['{}deletion_date_gmt' .format (prefix )]
85+ else :
86+ filter = [{
87+ '{}record_last_updated_gmt__gte' .format (prefix ): date_from ,
88+ '{}record_last_updated_gmt__lte' .format (prefix ): date_to
89+ }]
90+ order_by = ['{}record_last_updated_gmt' .format (prefix )]
8991 return {'filter' : filter , 'order_by' : order_by }
9092
9193 def record_range (self ):
92- '''
94+ """
9395 Filter by a III record number range. Options should contain
9496 record_range_from and record_range_to.
95- '''
97+ """
9698 options = self .options
9799 record_from = options ['record_range_from' ]
98100 record_to = options ['record_range_to' ]
@@ -109,30 +111,31 @@ def record_range(self):
109111 return {'filter' : filter , 'order_by' : order_by }
110112
111113 def last_export (self ):
112- '''
114+ """
113115 Filter by a latest updated datetime in options['latest_time'].
114- '''
116+ """
115117 options = self .options
116118 latest_time = options ['latest_time' ]
117119 if self .model ._meta .object_name != 'RecordMetadata' :
118120 prefix = 'record_metadata__'
119121 else :
120122 prefix = ''
121- filter = [
122- {
123- '{}record_last_updated_gmt__gte' .format (prefix ): latest_time
124- },
125- {
123+ if options .get ('is_deletion' , False ):
124+ filter = [{
126125 '{}deletion_date_gmt__gte' .format (prefix ): latest_time
127- }
128- ]
129- order_by = ['{}record_last_updated_gmt' .format (prefix )]
126+ }]
127+ order_by = ['{}record_last_updated_gmt' .format (prefix )]
128+ else :
129+ filter = [{
130+ '{}record_last_updated_gmt__gte' .format (prefix ): latest_time
131+ }]
132+ order_by = ['{}deletion_date_gmt' .format (prefix )]
130133 return {'filter' : filter , 'order_by' : order_by }
131134
132135 def full_export (self ):
133- '''
136+ """
134137 No filter.
135- '''
138+ """
136139 if self .model ._meta .object_name != 'RecordMetadata' :
137140 prefix = 'record_metadata__'
138141 else :
@@ -142,9 +145,9 @@ def full_export(self):
142145 return {'filter' : filter , 'order_by' : order_by }
143146
144147 def location (self ):
145- '''
148+ """
146149 Filters item records by location (code).
147- '''
150+ """
148151 options = self .options
149152 location_code = self .options ['location_code' ]
150153 if self .model ._meta .object_name == 'RecordMetadata' :
0 commit comments