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 """ --------------------------------------------------------------
11 -------------------------------------------------------------- """
13 class GrpTree(models.Model):
14 name = models.CharField(maxlength=100)
15 parent_id = models.ForeignKey('self', null=True, related_name='children', db_column='parent')
16 description = models.CharField(blank=True, maxlength=CHAR_MAXLEN)
17 perm_interval = models.CharField(blank=True, maxlength=100, help_text=INTERVAL_HELP_TEXT)
18 application_perm = models.CharField(blank=True, maxlength=100)
19 usergroup = models.BooleanField()
21 list_display = ('name', 'description')
22 list_filter = ['parent_id']
23 search_fields = ['name', 'description']
27 verbose_name = _('User Group')
31 class PermList(models.Model):
32 code = models.CharField(maxlength=100)
33 description = models.TextField(blank=True)
35 list_display = ('code','description')
36 search_fields = ['code']
38 db_table = 'perm_list'
40 verbose_name = _('Permission')
44 class GrpPermMap(models.Model):
45 grp_id = models.ForeignKey(GrpTree, db_column='grp')
46 perm_id = models.ForeignKey(PermList, db_column='perm')
47 depth_id = models.ForeignKey('OrgUnitType', to_field='depth', db_column='depth')
48 grantable = models.BooleanField()
50 list_filter = ['grp_id']
51 list_display = ('perm_id', 'grp_id', 'depth_id')
53 db_table = 'grp_perm_map'
54 ordering = ['perm_id', 'grp_id']
55 verbose_name = _('Permission Setting')
57 return str(self.grp_id)+' -> '+str(self.perm_id)
62 """ There's no way to do user-based mangling given the size of the data without custom handling.
63 When you try to create a new permission map, it tries to load all users into a dropdown selector :(
65 class User(models.Model):
66 card_id = models.ForeignKey('Card', db_column='card')
67 profile_id = models.ForeignKey(GrpTree, db_column='profile')
68 usrname = models.CharField(blank=False, null=False, maxlength=CHAR_MAXLEN)
70 return "%s (%s)" % ( str(self.card_id), str(self.usrname))
75 class UsrPermMap(models.Model):
76 usr_id = models.ForeignKey(User, db_column='usr')
77 perm_id = models.ForeignKey(PermList, db_column='perm')
78 depth_id = models.ForeignKey(OrgUnitType, to_field='depth', db_column='depth')
79 grantable = models.BooleanField()
81 search_fields = ['usr_id', 'perm_id'] # we need text fields to search...
83 db_table = 'usr_perm_map'
84 verbose_name = 'User Permission'
86 return "%s -> %s" % ( str(self.usr_id), str(self.perm_id) )
89 class Card(models.Model):
90 usr_id = models.ForeignKey(User, db_column='usr')
91 barcode = models.CharField(blank=False, null=False, maxlength=CHAR_MAXLEN)
92 active = models.BooleanField()
102 """ --------------------------------------------------------------
104 -------------------------------------------------------------- """
106 class OrgUnitType(models.Model):
107 name = models.CharField(maxlength=100)
108 opac_label = models.CharField(maxlength=100)
109 depth = models.IntegerField()
110 parent_id = models.ForeignKey('self', null=True, related_name='children', db_column='parent')
111 can_have_vols = models.BooleanField()
112 can_have_users = models.BooleanField()
114 db_table = 'org_unit_type'
115 verbose_name = _('Organizational Unit Type')
117 list_display = ('name', 'depth')
118 list_filter = ['parent_id']
123 class OrgUnitSetting(models.Model):
124 org_unit_id = models.ForeignKey('OrgUnit', db_column='org_unit')
125 name = models.CharField(maxlength=CHAR_MAXLEN)
126 value = models.CharField(maxlength=CHAR_MAXLEN)
128 list_display = ('org_unit_id', 'name', 'value')
129 search_fields = ['name', 'value']
130 list_filter = ['name', 'org_unit_id']
132 db_table = 'org_unit_setting'
133 ordering = ['org_unit_id', 'name']
134 verbose_name = _('Organizational Unit Setting')
136 return "%s:%s=%s" % (self.org_unit_id.shortname, self.name, self.value)
139 class OrgAddress(models.Model):
140 valid = models.BooleanField()
141 org_unit_id = models.ForeignKey('OrgUnit', db_column='org_unit')
142 address_type = models.CharField(blank=False, maxlength=CHAR_MAXLEN, default=_('MAILING'))
143 street1 = models.CharField(blank=False, maxlength=CHAR_MAXLEN)
144 street2 = models.CharField(maxlength=CHAR_MAXLEN)
145 city = models.CharField(blank=False, maxlength=CHAR_MAXLEN)
146 county = models.CharField(maxlength=CHAR_MAXLEN)
147 state = models.CharField(blank=False, maxlength=CHAR_MAXLEN)
148 country = models.CharField(blank=False, maxlength=CHAR_MAXLEN)
149 post_code = models.CharField(blank=False, maxlength=CHAR_MAXLEN)
151 search_fields = ['street1', 'city', 'post_code']
152 list_filter = ['org_unit_id']
153 list_display = ('street1', 'street2', 'city', 'county', 'state', 'post_code')
156 db_table = 'org_address'
157 verbose_name = _('Organizational Unit Address')
159 return self.street1+' '+self.city+', '+self.state+' '+self.post_code
161 class OrgUnit(models.Model):
162 parent_ou_id = models.ForeignKey('self', null=True, related_name='children', db_column='parent_ou')
163 ou_type_id = models.ForeignKey(OrgUnitType, db_column='ou_type')
164 shortname = models.CharField(maxlength=CHAR_MAXLEN)
165 name = models.CharField(maxlength=CHAR_MAXLEN)
166 email = models.EmailField(null=True, blank=True)
167 phone = models.CharField(maxlength=CHAR_MAXLEN, null=True, blank=True)
168 opac_visible = models.BooleanField(blank=True)
169 ill_address_id = models.ForeignKey(OrgAddress,
170 db_column='ill_address', related_name='ill_addresses', null=True, blank=True)
171 holds_address_id = models.ForeignKey(OrgAddress,
172 db_column='holds_address', related_name='holds_addresses', null=True, blank=True)
173 mailing_address_id = models.ForeignKey(OrgAddress,
174 db_column='mailing_address', related_name='mailing_addresses', null=True, blank=True)
175 billing_address_id = models.ForeignKey(OrgAddress,
176 db_column='billing_address', related_name='billing_addresses', null=True, blank=True)
178 search_fields = ['name', 'shortname']
179 list_display = ('shortname', 'name')
181 db_table = 'org_unit'
182 ordering = ['shortname']
183 verbose_name = _('Organizational Unit')
185 return self.shortname
189 """ --------------------------------------------------------------
191 -------------------------------------------------------------- """
193 class RuleCircDuration(models.Model):
194 name = models.CharField(maxlength=CHAR_MAXLEN)
195 extended = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT);
196 normal = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT);
197 shrt = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT);
198 max_renewals = models.IntegerField()
200 search_fields = ['name']
201 list_display = ('name','extended','normal','shrt','max_renewals')
203 db_table = 'rule_circ_duration'
205 verbose_name = _('Circ Duration Rule')
210 class RuleMaxFine(models.Model):
211 name = models.CharField(maxlength=CHAR_MAXLEN)
212 amount = models.FloatField(max_digits=6, decimal_places=2)
214 search_fields = ['name']
215 list_display = ('name','amount')
217 db_table = 'rule_max_fine'
219 verbose_name = _('Circ Max Fine Rule')
223 class RuleRecurringFine(models.Model):
224 name = models.CharField(maxlength=CHAR_MAXLEN)
225 high = models.FloatField(max_digits=6, decimal_places=2)
226 normal = models.FloatField(max_digits=6, decimal_places=2)
227 low = models.FloatField(max_digits=6, decimal_places=2)
229 search_fields = ['name']
230 list_display = ('name','high', 'normal', 'low')
232 db_table = 'rule_recuring_fine'
234 verbose_name = 'Circ Recurring Fine Rule'
238 class IdentificationType(models.Model):
239 name = models.CharField(maxlength=CHAR_MAXLEN)
241 search_fields = ['name']
243 db_table = 'identification_type'
245 verbose_name = _('Identification Type')
250 class RuleAgeHoldProtect(models.Model):
251 name = models.CharField(maxlength=CHAR_MAXLEN)
252 age = models.CharField(blank=True, maxlength=100, help_text=INTERVAL_HELP_TEXT)
253 prox = models.IntegerField()
255 search_fields = ['name']
257 db_table = 'rule_age_hold_protect'
259 verbose_name = _('Hold Age Protection Rule')
265 class MetabibField(models.Model):
266 field_class_choices = (
268 ('author', 'Author'),
269 ('subject', 'Subject'),
270 ('series', 'Series'),
271 ('keyword', 'Keyword'),
273 field_class = models.CharField(maxlength=CHAR_MAXLEN, choices=field_class_choices, null=False, blank=False)
274 name = models.CharField(maxlength=CHAR_MAXLEN, null=False, blank=False)
275 xpath = models.TextField(null=False, blank=False)
276 weight = models.IntegerField(null=False, blank=False)
277 format_id = models.ForeignKey('XmlTransform', db_column='format')
279 search_fields = ['name', 'field_class', 'format_id']
280 list_display = ('field_class', 'name', 'format_id')
282 db_table = 'metabib_field'
283 ordering = ['field_class', 'name']
284 verbose_name = _('Metabib Field')
289 class CopyStatus(models.Model):
290 name = models.CharField(maxlength=CHAR_MAXLEN)
291 holdable = models.BooleanField()
293 search_fields = ['name']
294 list_display = ('name', 'holdable')
296 db_table = 'copy_status'
298 verbose_name= _('Copy Status')
299 verbose_name_plural= _('Copy Statuses')
304 class AudienceMap(models.Model):
305 code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
306 value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
307 description = models.CharField(maxlength=CHAR_MAXLEN)
309 search_fields = ['code', 'value', 'description']
310 list_display = ('code', 'value', 'description')
312 db_table = 'audience_map'
314 verbose_name = _('Audience Map')
319 class BibSource(models.Model):
320 quality = models.IntegerField()
321 source = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
322 transcendant = models.BooleanField()
324 search_fields = ['source']
325 list_display = ('source', 'quality', 'transcendant')
327 db_table = 'bib_source'
328 ordering = ['source']
329 verbose_name = _('Bib Source')
333 class ItemFormMap(models.Model):
334 code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
335 value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
337 search_fields = ['code', 'value']
338 list_display = ('code', 'value')
340 db_table = 'item_form_map'
342 verbose_name = _('Item Form Map')
346 class ItemTypeMap(models.Model):
347 code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
348 value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
350 search_fields = ['code', 'value']
351 list_display = ('code', 'value')
353 db_table = 'item_type_map'
355 verbose_name = _('Item Type Map')
361 class LanguageMap(models.Model):
362 code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
363 value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
365 search_fields = ['code', 'value']
366 list_display = ('code', 'value')
368 db_table = 'language_map'
370 verbose_name = _('Language Map')
375 class LitFormMap(models.Model):
376 code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
377 value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
378 description = models.CharField(maxlength=CHAR_MAXLEN)
380 search_fields = ['code', 'value', 'description']
381 list_display = ('code', 'value', 'description')
383 db_table = 'lit_form_map'
385 verbose_name = _('Lit Form Map')
389 class NetAccessLevel(models.Model):
390 name = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
392 search_fields = ['name']
394 db_table = 'net_access_level'
396 verbose_name = _('Net Access Level')
401 class XmlTransform(models.Model):
402 name = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
403 namespace_uri = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
404 prefix = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
405 xslt = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
407 search_fields = ['name', 'namespace_uri', 'prefix' ]
408 list_display = ('name', 'prefix', 'namespace_uri', 'xslt')
410 db_table = 'xml_transform'
412 verbose_name = _('XML Transform')