minor cleanup of the models
[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 = _('Organizational Unit 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 = _('Organizational Unit 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 = _('Organizational Unit 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 = _('Organizational Unit')
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.ForeignKey('XmlTransform')
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         verbose_name_plural= _('Copy Statuses')
304     def __str__(self):
305         return self.name
306
307
308 class AudienceMap(models.Model):
309     code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
310     value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
311     description = models.CharField(maxlength=CHAR_MAXLEN)
312     class Admin:
313         search_fields = ['code', 'value', 'description']
314         list_display = ('code', 'value', 'description')
315     class Meta:
316         db_table = 'audience_map'
317         ordering = ['code']
318         verbose_name = _('Audience Map')
319     def __str__(self):
320         return self.code
321
322
323 class BibSource(models.Model):
324     quality = models.IntegerField()
325     source = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
326     transcendant = models.BooleanField()
327     class Admin:
328         search_fields = ['source']
329         list_display = ('source', 'quality', 'transcendant')
330     class Meta:
331         db_table = 'bib_source'
332         ordering = ['source']
333         verbose_name = _('Bib Source')
334     def __str__(self):
335         return self.source
336
337 class ItemFormMap(models.Model):
338     code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
339     value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
340     class Admin:
341         search_fields = ['code', 'value']
342         list_display = ('code', 'value')
343     class Meta:
344         db_table = 'item_form_map'
345         ordering = ['code']
346         verbose_name = _('Item Form Map')
347     def __str__(self):
348         return self.code
349
350 class ItemTypeMap(models.Model):
351     code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
352     value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
353     class Admin:
354         search_fields = ['code', 'value']
355         list_display = ('code', 'value')
356     class Meta:
357         db_table = 'item_type_map'
358         ordering = ['code']
359         verbose_name = _('Item Type Map')
360     def __str__(self):
361         return self.code
362
363
364
365 class LanguageMap(models.Model):
366     code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
367     value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
368     class Admin:
369         search_fields = ['code', 'value']
370         list_display = ('code', 'value')
371     class Meta:
372         db_table = 'language_map'
373         ordering = ['code']
374         verbose_name = _('Language Map')
375     def __str__(self):
376         return self.code
377
378
379 class LitFormMap(models.Model):
380     code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
381     value = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
382     description = models.CharField(maxlength=CHAR_MAXLEN)
383     class Admin:
384         search_fields = ['code', 'value', 'description']
385         list_display = ('code', 'value', 'description')
386     class Meta:
387         db_table = 'lit_form_map'
388         ordering = ['code']
389         verbose_name = _('Lit Form Map')
390     def __str__(self):
391         return self.code
392
393 class NetAccessLevel(models.Model):
394     name = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
395     class Admin:
396         search_fields = ['name']
397     class Meta:
398         db_table = 'net_access_level'
399         ordering = ['name']
400         verbose_name = _('Net Access Level')
401     def __str__(self):
402         return self.name
403
404
405 class XmlTransform(models.Model):
406     name = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True)
407     namespace_uri = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
408     prefix = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
409     xslt = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
410     class Admin:
411         search_fields = ['name', 'namespace_uri', 'prefix' ]
412         list_display = ('name', 'prefix', 'namespace_uri', 'xslt')
413     class Meta:
414         db_table = 'xml_transform'
415         ordering = ['name']
416         verbose_name = _('XML Transform')
417     def __str__(self):
418         return self.name
419
420
421