1 from django.db import models
2 from django.db.models import signals
3 from django.dispatch import dispatcher
5 INTERVAL_HELP_TEXT = _('examples: "1 hour", "14 days", "3 months", "DD:HH:MM:SS.ms"')
6 CHAR_MAXLEN=200 # just provide a sane default
9 #PG_SCHEMAS = "actor, permission, public, config"
13 """ --------------------------------------------------------------
15 -------------------------------------------------------------- """
17 class GrpTree(models.Model):
18 name = models.CharField(maxlength=100)
19 parent_id = models.ForeignKey('self', null=True, related_name='children', db_column='parent')
20 description = models.CharField(blank=True, maxlength=CHAR_MAXLEN)
21 perm_interval = models.CharField(blank=True, maxlength=100, help_text=INTERVAL_HELP_TEXT)
22 application_perm = models.CharField(blank=True, maxlength=100)
23 usergroup = models.BooleanField()
25 list_display = ('name', 'description')
26 list_filter = ['parent_id']
27 search_fields = ['name', 'description']
31 verbose_name = _('User Group')
35 class PermList(models.Model):
36 code = models.CharField(maxlength=100)
37 description = models.CharField(blank=True, maxlength=CHAR_MAXLEN)
39 list_display = ('code','description')
40 search_fields = ['code']
42 db_table = 'perm_list'
44 verbose_name = _('Permission')
48 class GrpPermMap(models.Model):
49 grp_id = models.ForeignKey(GrpTree, db_column='grp')
50 perm_id = models.ForeignKey(PermList, db_column='perm')
51 depth_id = models.ForeignKey('OrgUnitType', to_field='depth', db_column='depth')
52 grantable = models.BooleanField()
54 list_filter = ['grp_id']
55 list_display = ('perm_id', 'grp_id', 'depth_id')
57 db_table = 'grp_perm_map'
58 ordering = ['perm_id', 'grp_id']
59 verbose_name = _('Permission Setting')
61 return str(self.grp_id)+' -> '+str(self.perm_id)
66 """ There's no way to do user-based mangling given the size of the data without custom handling.
67 When you try to create a new permission map, it tries to load all users into a dropdown selector :(
69 class User(models.Model):
70 card_id = models.ForeignKey('Card', db_column='card')
71 profile_id = models.ForeignKey(GrpTree, db_column='profile')
72 usrname = models.CharField(blank=False, null=False, maxlength=CHAR_MAXLEN)
74 return "%s (%s)" % ( str(self.card_id), str(self.usrname))
79 class UsrPermMap(models.Model):
80 usr_id = models.ForeignKey(User, db_column='usr')
81 perm_id = models.ForeignKey(PermList, db_column='perm')
82 depth_id = models.ForeignKey(OrgUnitType, to_field='depth', db_column='depth')
83 grantable = models.BooleanField()
85 search_fields = ['usr_id', 'perm_id'] # we need text fields to search...
87 db_table = 'usr_perm_map'
88 verbose_name = 'User Permission'
90 return "%s -> %s" % ( str(self.usr_id), str(self.perm_id) )
93 class Card(models.Model):
94 usr_id = models.ForeignKey(User, db_column='usr')
95 barcode = models.CharField(blank=False, null=False, maxlength=CHAR_MAXLEN)
96 active = models.BooleanField()
101 verbose_name = 'Card'
106 """ --------------------------------------------------------------
108 -------------------------------------------------------------- """
110 class OrgUnitType(models.Model):
111 name = models.CharField(maxlength=100)
112 opac_label = models.CharField(maxlength=100)
113 depth = models.IntegerField()
114 parent_id = models.ForeignKey('self', null=True, related_name='children', db_column='parent')
115 can_have_vols = models.BooleanField()
116 can_have_users = models.BooleanField()
118 db_table = 'org_unit_type'
119 verbose_name = _('Library Type')
121 list_display = ('name', 'depth')
122 list_filter = ['parent_id']
127 class OrgUnitSetting(models.Model):
128 org_unit_id = models.ForeignKey('OrgUnit', db_column='org_unit')
129 name = models.CharField(maxlength=CHAR_MAXLEN)
130 value = models.CharField(maxlength=CHAR_MAXLEN)
132 list_display = ('org_unit_id', 'name', 'value')
133 search_fields = ['name', 'value']
134 list_filter = ['name', 'org_unit_id']
136 db_table = 'org_unit_setting'
137 ordering = ['org_unit_id', 'name']
138 verbose_name = _('Library Setting')
140 return "%s:%s=%s" % (self.org_unit_id.shortname, self.name, self.value)
143 class OrgAddress(models.Model):
144 valid = models.BooleanField()
145 org_unit_id = models.ForeignKey('OrgUnit', db_column='org_unit')
146 address_type = models.CharField(blank=False, maxlength=CHAR_MAXLEN, default='MAILING')
147 street1 = models.CharField(blank=False, maxlength=CHAR_MAXLEN)
148 street2 = models.CharField(maxlength=CHAR_MAXLEN)
149 city = models.CharField(blank=False, maxlength=CHAR_MAXLEN)
150 county = models.CharField(maxlength=CHAR_MAXLEN)
151 state = models.CharField(blank=False, maxlength=CHAR_MAXLEN)
152 country = models.CharField(blank=False, maxlength=CHAR_MAXLEN)
153 post_code = models.CharField(blank=False, maxlength=CHAR_MAXLEN)
155 search_fields = ['street1', 'city', 'post_code']
156 list_filter = ['org_unit_id']
157 list_display = ('street1', 'street2', 'city', 'county', 'state', 'post_code')
160 db_table = 'org_address'
161 verbose_name = _('Library Address')
163 return self.street1+' '+self.city+', '+self.state+' '+self.post_code
165 class OrgUnit(models.Model):
166 parent_ou_id = models.ForeignKey('self', null=True, related_name='children', db_column='parent_ou')
167 ou_type_id = models.ForeignKey(OrgUnitType, db_column='ou_type')
168 shortname = models.CharField(maxlength=CHAR_MAXLEN)
169 name = models.CharField(maxlength=CHAR_MAXLEN)
170 email = models.EmailField(null=True, blank=True)
171 phone = models.CharField(maxlength=CHAR_MAXLEN, null=True, blank=True)
172 opac_visible = models.BooleanField(blank=True)
173 ill_address_id = models.ForeignKey(OrgAddress,
174 db_column='ill_address', related_name='ill_addresses', null=True, blank=True)
175 holds_address_id = models.ForeignKey(OrgAddress,
176 db_column='holds_address', related_name='holds_addresses', null=True, blank=True)
177 mailing_address_id = models.ForeignKey(OrgAddress,
178 db_column='mailing_address', related_name='mailing_addresses', null=True, blank=True)
179 billing_address_id = models.ForeignKey(OrgAddress,
180 db_column='billing_address', related_name='billing_addresses', null=True, blank=True)
182 search_fields = ['name', 'shortname']
183 list_display = ('shortname', 'name')
185 db_table = 'org_unit'
186 ordering = ['shortname']
187 verbose_name = _('Library')
189 return self.shortname
193 """ --------------------------------------------------------------
195 -------------------------------------------------------------- """
197 class RuleCircDuration(models.Model):
198 name = models.CharField(maxlength=CHAR_MAXLEN)
199 extended = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT);
200 normal = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT);
201 shrt = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT);
202 max_renewals = models.IntegerField()
204 search_fields = ['name']
205 list_display = ('name','extended','normal','shrt','max_renewals')
207 db_table = 'rule_circ_duration'
209 verbose_name = _('Circ Duration Rule')
214 class RuleMaxFine(models.Model):
215 name = models.CharField(maxlength=CHAR_MAXLEN)
216 amount = models.FloatField(max_digits=6, decimal_places=2)
218 search_fields = ['name']
219 list_display = ('name','amount')
221 db_table = 'rule_max_fine'
223 verbose_name = _('Circ Max Fine Rule')
227 class RuleRecurringFine(models.Model):
228 name = models.CharField(maxlength=CHAR_MAXLEN)
229 high = models.FloatField(max_digits=6, decimal_places=2)
230 normal = models.FloatField(max_digits=6, decimal_places=2)
231 low = models.FloatField(max_digits=6, decimal_places=2)
233 search_fields = ['name']
234 list_display = ('name','high', 'normal', 'low')
236 db_table = 'rule_recuring_fine'
238 verbose_name = 'Circ Recurring Fine Rule'
242 class IdentificationType(models.Model):
243 name = models.CharField(maxlength=CHAR_MAXLEN)
245 search_fields = ['name']
247 db_table = 'identification_type'
249 verbose_name = _('Identification Type')
254 class RuleAgeHoldProtect(models.Model):
255 name = models.CharField(maxlength=CHAR_MAXLEN)
256 age = models.CharField(blank=True, maxlength=100, help_text=INTERVAL_HELP_TEXT)
257 prox = models.IntegerField()
259 search_fields = ['name']
261 db_table = 'rule_age_hold_protect'
263 verbose_name = _('Hold Age Protection Rule')
269 class MetabibField(models.Model):
270 field_class_choices = (
272 ('author', 'Author'),
273 ('subject', 'Subject'),
274 ('series', 'Series'),
275 ('keyword', 'Keyword'),
277 field_class = models.CharField(maxlength=CHAR_MAXLEN, choices=field_class_choices, null=False, blank=False)
278 name = models.CharField(maxlength=CHAR_MAXLEN, null=False, blank=False)
279 xpath = models.TextField(null=False, blank=False)
280 weight = models.IntegerField(null=False, blank=False)
281 format = models.CharField(maxlength=CHAR_MAXLEN, null=False, blank=False)
283 search_fields = ['name', 'format', 'field_class']
284 list_display = ('field_class', 'name', 'format')
286 db_table = 'metabib_field'
287 ordering = ['field_class', 'name']
288 verbose_name = _('Metabib Field')
293 class CopyStatus(models.Model):
294 name = models.CharField(maxlength=CHAR_MAXLEN)
295 holdable = models.BooleanField()
297 search_fields = ['name']
298 list_display = ('name', 'holdable')
300 db_table = 'copy_status'
302 verbose_name= _('Copy Status')
307 class AudienceMap(models.Model):
308 code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
309 value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
310 description = models.CharField(maxlength=CHAR_MAXLEN)
312 search_fields = ['code', 'value', 'description']
313 list_display = ('code', 'value', 'description')
315 db_table = 'audience_map'
317 verbose_name = _('Audience Map')
322 class BibSource(models.Model):
323 quality = models.IntegerField()
324 source = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
325 transcendant = models.BooleanField()
327 search_fields = ['source']
328 list_display = ('source', 'quality', 'transcendant')
330 db_table = 'bib_source'
331 ordering = ['source']
332 verbose_name = _('Bib Source')
336 class ItemFormMap(models.Model):
337 code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
338 value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
340 search_fields = ['code', 'value']
341 list_display = ('code', 'value')
343 db_table = 'item_form_map'
345 verbose_name = _('Item Form Map')
349 class ItemTypeMap(models.Model):
350 code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
351 value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
353 search_fields = ['code', 'value']
354 list_display = ('code', 'value')
356 db_table = 'item_form_map'
358 verbose_name = _('Item Type Map')
364 class LanguageMap(models.Model):
365 code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
366 value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
368 search_fields = ['code', 'value']
369 list_display = ('code', 'value')
371 db_table = 'language_map'
373 verbose_name = _('Language Map')
378 class LitFormMap(models.Model):
379 code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
380 value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
381 description = models.CharField(maxlength=CHAR_MAXLEN)
383 search_fields = ['code', 'value', 'description']
384 list_display = ('code', 'value', 'description')
386 db_table = 'lit_form_map'
388 verbose_name = _('Lit Form Map')
392 class NetAccessLevel(models.Model):
393 name = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
395 search_fields = ['name']
397 db_table = 'net_access_level'
399 verbose_name = _('Net Access Level')
404 class XmlTransform(models.Model):
405 name = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
406 namespace_uri = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
407 prefix = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
408 xslt = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
410 search_fields = ['name', 'namespace_uri', 'prefix' ]
411 list_display = ('name', 'prefix', 'namespace_uri', 'xslt')
413 db_table = 'xml_transform'
415 verbose_name = _('XML Transform')