added a pile of new models from the config. schema
[Evergreen.git] / Open-ILS / admin / ils_admin / setup / ils_data / models.py
1 from django.db import models
2 from django.db.models import signals
3 from django.dispatch import dispatcher
4
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
7
8
9 #PG_SCHEMAS = "actor, permission, public, config"
10
11
12
13 """ --------------------------------------------------------------
14     Permission tables
15     -------------------------------------------------------------- """
16
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()
24     class Admin:
25         list_display = ('name', 'description')
26         list_filter = ['parent_id']
27         search_fields = ['name', 'description']
28     class Meta:
29         db_table = 'grp_tree'
30         ordering = ['name']
31         verbose_name = _('User Group')
32     def __str__(self):
33         return self.name
34
35 class PermList(models.Model):
36     code = models.CharField(maxlength=100)
37     description = models.CharField(blank=True, maxlength=CHAR_MAXLEN)
38     class Admin:
39         list_display = ('code','description')
40         search_fields = ['code']
41     class Meta:
42         db_table = 'perm_list'
43         ordering = ['code']
44         verbose_name = _('Permission')
45     def __str__(self):
46         return self.code
47
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()
53     class Admin:
54         list_filter = ['grp_id']
55         list_display = ('perm_id', 'grp_id', 'depth_id')
56     class Meta:
57         db_table = 'grp_perm_map'
58         ordering = ['perm_id', 'grp_id']
59         verbose_name = _('Permission Setting')
60     def __str__(self):
61         return str(self.grp_id)+' -> '+str(self.perm_id)
62
63
64
65
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 :(
68
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)
73    def __str__(self):
74       return "%s (%s)" % ( str(self.card_id), str(self.usrname))
75    class Meta:
76       db_table = 'usr'
77       verbose_name = 'User'
78
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()
84    class Admin:
85       search_fields = ['usr_id', 'perm_id']  # we need text fields to search...
86    class Meta:
87       db_table = 'usr_perm_map'
88       verbose_name = 'User Permission'
89    def __str__(self):
90       return "%s -> %s" % ( str(self.usr_id), str(self.perm_id) )
91
92
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()
97    def __str__(self): 
98       return self.barcode
99    class Meta:
100       db_table = 'card'
101       verbose_name = 'Card'
102 """
103
104    
105
106 """ --------------------------------------------------------------
107     Actor tables
108     -------------------------------------------------------------- """
109
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()
117     class Meta:
118         db_table = 'org_unit_type'
119         verbose_name = _('Library Type')
120     class Admin:
121         list_display = ('name', 'depth')
122         list_filter = ['parent_id']
123         ordering = ['depth']
124     def __str__(self):
125         return self.name
126
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)
131     class Admin:
132         list_display = ('org_unit_id', 'name', 'value')
133         search_fields = ['name', 'value']
134         list_filter = ['name', 'org_unit_id']
135     class Meta:
136         db_table = 'org_unit_setting'
137         ordering = ['org_unit_id', 'name']
138         verbose_name = _('Library Setting')
139     def __str__(self):
140         return "%s:%s=%s" % (self.org_unit_id.shortname, self.name, self.value)
141
142
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)
154     class Admin:
155         search_fields = ['street1', 'city', 'post_code']   
156         list_filter = ['org_unit_id']
157         list_display = ('street1', 'street2', 'city', 'county', 'state', 'post_code')
158     class Meta:
159         ordering = ['city']
160         db_table = 'org_address'
161         verbose_name = _('Library Address')
162     def __str__(self):
163         return self.street1+' '+self.city+', '+self.state+' '+self.post_code
164
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)
181     class Admin:
182         search_fields = ['name', 'shortname']
183         list_display = ('shortname', 'name')
184     class Meta:
185         db_table = 'org_unit'
186         ordering = ['shortname']
187         verbose_name = _('Library')
188     def __str__(self):
189         return self.shortname
190
191
192
193 """ --------------------------------------------------------------
194     Config tables
195     -------------------------------------------------------------- """
196
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()
203     class Admin:
204         search_fields = ['name']
205         list_display = ('name','extended','normal','shrt','max_renewals')
206     class Meta:
207         db_table = 'rule_circ_duration'
208         ordering = ['name']
209         verbose_name = _('Circ Duration Rule')
210     def __str__(self):
211         return self.name
212
213
214 class RuleMaxFine(models.Model):
215     name = models.CharField(maxlength=CHAR_MAXLEN)
216     amount = models.FloatField(max_digits=6, decimal_places=2)
217     class Admin:
218         search_fields = ['name']
219         list_display = ('name','amount')
220     class Meta:
221         db_table = 'rule_max_fine'
222         ordering = ['name']
223         verbose_name = _('Circ Max Fine Rule')
224     def __str__(self):
225         return self.name
226
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)
232     class Admin:
233         search_fields = ['name']
234         list_display = ('name','high', 'normal', 'low')
235     class Meta:
236         db_table = 'rule_recuring_fine'
237         ordering = ['name']
238         verbose_name = 'Circ Recurring Fine Rule'
239     def __str__(self):
240         return self.name
241
242 class IdentificationType(models.Model):
243     name = models.CharField(maxlength=CHAR_MAXLEN)
244     class Admin:
245         search_fields = ['name']
246     class Meta:
247         db_table = 'identification_type'
248         ordering = ['name']
249         verbose_name = _('Identification Type')
250     def __str__(self):
251         return self.name
252
253
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()
258     class Admin:
259         search_fields = ['name']
260     class Meta:
261         db_table = 'rule_age_hold_protect'
262         ordering = ['name']
263         verbose_name = _('Hold Age Protection Rule')
264     def __str__(self):
265         return self.name
266
267
268
269 class MetabibField(models.Model):
270     field_class_choices = (
271         ('title', 'Title'),
272         ('author', 'Author'),
273         ('subject', 'Subject'),
274         ('series', 'Series'),
275         ('keyword', 'Keyword'),
276     )
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)
282     class Admin:
283         search_fields = ['name', 'format', 'field_class']
284         list_display = ('field_class', 'name', 'format')
285     class Meta:
286         db_table = 'metabib_field'
287         ordering = ['field_class', 'name']
288         verbose_name = _('Metabib Field')
289     def __str__(self):
290         return self.name
291
292
293 class CopyStatus(models.Model):
294     name = models.CharField(maxlength=CHAR_MAXLEN)
295     holdable = models.BooleanField()
296     class Admin:
297         search_fields = ['name']
298         list_display = ('name', 'holdable')
299     class Meta:
300         db_table = 'copy_status'
301         ordering = ['name']
302         verbose_name= _('Copy Status')
303     def __str__(self):
304         return self.name
305
306
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)
311     class Admin:
312         search_fields = ['code', 'value', 'description']
313         list_display = ('code', 'value', 'description')
314     class Meta:
315         db_table = 'audience_map'
316         ordering = ['code']
317         verbose_name = _('Audience Map')
318     def __str__(self):
319         return self.code
320
321
322 class BibSource(models.Model):
323     quality = models.IntegerField()
324     source = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
325     transcendant = models.BooleanField()
326     class Admin:
327         search_fields = ['source']
328         list_display = ('source', 'quality', 'transcendant')
329     class Meta:
330         db_table = 'bib_source'
331         ordering = ['source']
332         verbose_name = _('Bib Source')
333     def __str__(self):
334         return self.source
335
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)
339     class Admin:
340         search_fields = ['code', 'value']
341         list_display = ('code', 'value')
342     class Meta:
343         db_table = 'item_form_map'
344         ordering = ['code']
345         verbose_name = _('Item Form Map')
346     def __str__(self):
347         return self.code
348
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)
352     class Admin:
353         search_fields = ['code', 'value']
354         list_display = ('code', 'value')
355     class Meta:
356         db_table = 'item_form_map'
357         ordering = ['code']
358         verbose_name = _('Item Type Map')
359     def __str__(self):
360         return self.code
361
362
363
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)
367     class Admin:
368         search_fields = ['code', 'value']
369         list_display = ('code', 'value')
370     class Meta:
371         db_table = 'language_map'
372         ordering = ['code']
373         verbose_name = _('Language Map')
374     def __str__(self):
375         return self.code
376
377
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)
382     class Admin:
383         search_fields = ['code', 'value', 'description']
384         list_display = ('code', 'value', 'description')
385     class Meta:
386         db_table = 'lit_form_map'
387         ordering = ['code']
388         verbose_name = _('Lit Form Map')
389     def __str__(self):
390         return self.code
391
392 class NetAccessLevel(models.Model):
393     name = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
394     class Admin:
395         search_fields = ['name']
396     class Meta:
397         db_table = 'net_access_level'
398         ordering = ['name']
399         verbose_name = _('Net Access Level')
400     def __str__(self):
401         return self.name
402
403
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)
409     class Admin:
410         search_fields = ['name', 'namespace_uri', 'prefix' ]
411         list_display = ('name', 'prefix', 'namespace_uri', 'xslt')
412     class Meta:
413         db_table = 'xml_transform'
414         ordering = ['name']
415         verbose_name = _('XML Transform')
416     def __str__(self):
417         return self.name
418
419
420