pacified django by altering the foreignkey column name to what it is expecting
[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 """ --------------------------------------------------------------
10     Permission tables
11     -------------------------------------------------------------- """
12
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()
20     class Admin:
21         list_display = ('name', 'description')
22         list_filter = ['parent_id']
23         search_fields = ['name', 'description']
24     class Meta:
25         db_table = 'grp_tree'
26         ordering = ['name']
27         verbose_name = _('User Group')
28     def __str__(self):
29         return self.name
30
31 class PermList(models.Model):
32     code = models.CharField(maxlength=100)
33     description = models.CharField(blank=True, maxlength=CHAR_MAXLEN)
34     class Admin:
35         list_display = ('code','description')
36         search_fields = ['code']
37     class Meta:
38         db_table = 'perm_list'
39         ordering = ['code']
40         verbose_name = _('Permission')
41     def __str__(self):
42         return self.code
43
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()
49     class Admin:
50         list_filter = ['grp_id']
51         list_display = ('perm_id', 'grp_id', 'depth_id')
52     class Meta:
53         db_table = 'grp_perm_map'
54         ordering = ['perm_id', 'grp_id']
55         verbose_name = _('Permission Setting')
56     def __str__(self):
57         return str(self.grp_id)+' -> '+str(self.perm_id)
58
59
60
61
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 :(
64
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)
69    def __str__(self):
70       return "%s (%s)" % ( str(self.card_id), str(self.usrname))
71    class Meta:
72       db_table = 'usr'
73       verbose_name = 'User'
74
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()
80    class Admin:
81       search_fields = ['usr_id', 'perm_id']  # we need text fields to search...
82    class Meta:
83       db_table = 'usr_perm_map'
84       verbose_name = 'User Permission'
85    def __str__(self):
86       return "%s -> %s" % ( str(self.usr_id), str(self.perm_id) )
87
88
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()
93    def __str__(self): 
94       return self.barcode
95    class Meta:
96       db_table = 'card'
97       verbose_name = 'Card'
98 """
99
100    
101
102 """ --------------------------------------------------------------
103     Actor tables
104     -------------------------------------------------------------- """
105
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()
113     class Meta:
114         db_table = 'org_unit_type'
115         verbose_name = _('Organizational Unit Type')
116     class Admin:
117         list_display = ('name', 'depth')
118         list_filter = ['parent_id']
119         ordering = ['depth']
120     def __str__(self):
121         return self.name
122
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)
127     class Admin:
128         list_display = ('org_unit_id', 'name', 'value')
129         search_fields = ['name', 'value']
130         list_filter = ['name', 'org_unit_id']
131     class Meta:
132         db_table = 'org_unit_setting'
133         ordering = ['org_unit_id', 'name']
134         verbose_name = _('Organizational Unit Setting')
135     def __str__(self):
136         return "%s:%s=%s" % (self.org_unit_id.shortname, self.name, self.value)
137
138
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)
150     class Admin:
151         search_fields = ['street1', 'city', 'post_code']   
152         list_filter = ['org_unit_id']
153         list_display = ('street1', 'street2', 'city', 'county', 'state', 'post_code')
154     class Meta:
155         ordering = ['city']
156         db_table = 'org_address'
157         verbose_name = _('Organizational Unit Address')
158     def __str__(self):
159         return self.street1+' '+self.city+', '+self.state+' '+self.post_code
160
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)
177     class Admin:
178         search_fields = ['name', 'shortname']
179         list_display = ('shortname', 'name')
180     class Meta:
181         db_table = 'org_unit'
182         ordering = ['shortname']
183         verbose_name = _('Organizational Unit')
184     def __str__(self):
185         return self.shortname
186
187
188
189 """ --------------------------------------------------------------
190     Config tables
191     -------------------------------------------------------------- """
192
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()
199     class Admin:
200         search_fields = ['name']
201         list_display = ('name','extended','normal','shrt','max_renewals')
202     class Meta:
203         db_table = 'rule_circ_duration'
204         ordering = ['name']
205         verbose_name = _('Circ Duration Rule')
206     def __str__(self):
207         return self.name
208
209
210 class RuleMaxFine(models.Model):
211     name = models.CharField(maxlength=CHAR_MAXLEN)
212     amount = models.FloatField(max_digits=6, decimal_places=2)
213     class Admin:
214         search_fields = ['name']
215         list_display = ('name','amount')
216     class Meta:
217         db_table = 'rule_max_fine'
218         ordering = ['name']
219         verbose_name = _('Circ Max Fine Rule')
220     def __str__(self):
221         return self.name
222
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)
228     class Admin:
229         search_fields = ['name']
230         list_display = ('name','high', 'normal', 'low')
231     class Meta:
232         db_table = 'rule_recuring_fine'
233         ordering = ['name']
234         verbose_name = 'Circ Recurring Fine Rule'
235     def __str__(self):
236         return self.name
237
238 class IdentificationType(models.Model):
239     name = models.CharField(maxlength=CHAR_MAXLEN)
240     class Admin:
241         search_fields = ['name']
242     class Meta:
243         db_table = 'identification_type'
244         ordering = ['name']
245         verbose_name = _('Identification Type')
246     def __str__(self):
247         return self.name
248
249
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()
254     class Admin:
255         search_fields = ['name']
256     class Meta:
257         db_table = 'rule_age_hold_protect'
258         ordering = ['name']
259         verbose_name = _('Hold Age Protection Rule')
260     def __str__(self):
261         return self.name
262
263
264
265 class MetabibField(models.Model):
266     field_class_choices = (
267         ('title', 'Title'),
268         ('author', 'Author'),
269         ('subject', 'Subject'),
270         ('series', 'Series'),
271         ('keyword', 'Keyword'),
272     )
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')
278     class Admin:
279         search_fields = ['name', 'field_class', 'format_id']
280         list_display = ('field_class', 'name', 'format_id')
281     class Meta:
282         db_table = 'metabib_field'
283         ordering = ['field_class', 'name']
284         verbose_name = _('Metabib Field')
285     def __str__(self):
286         return self.name
287
288
289 class CopyStatus(models.Model):
290     name = models.CharField(maxlength=CHAR_MAXLEN)
291     holdable = models.BooleanField()
292     class Admin:
293         search_fields = ['name']
294         list_display = ('name', 'holdable')
295     class Meta:
296         db_table = 'copy_status'
297         ordering = ['name']
298         verbose_name= _('Copy Status')
299         verbose_name_plural= _('Copy Statuses')
300     def __str__(self):
301         return self.name
302
303
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)
308     class Admin:
309         search_fields = ['code', 'value', 'description']
310         list_display = ('code', 'value', 'description')
311     class Meta:
312         db_table = 'audience_map'
313         ordering = ['code']
314         verbose_name = _('Audience Map')
315     def __str__(self):
316         return self.code
317
318
319 class BibSource(models.Model):
320     quality = models.IntegerField()
321     source = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
322     transcendant = models.BooleanField()
323     class Admin:
324         search_fields = ['source']
325         list_display = ('source', 'quality', 'transcendant')
326     class Meta:
327         db_table = 'bib_source'
328         ordering = ['source']
329         verbose_name = _('Bib Source')
330     def __str__(self):
331         return self.source
332
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)
336     class Admin:
337         search_fields = ['code', 'value']
338         list_display = ('code', 'value')
339     class Meta:
340         db_table = 'item_form_map'
341         ordering = ['code']
342         verbose_name = _('Item Form Map')
343     def __str__(self):
344         return self.code
345
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)
349     class Admin:
350         search_fields = ['code', 'value']
351         list_display = ('code', 'value')
352     class Meta:
353         db_table = 'item_type_map'
354         ordering = ['code']
355         verbose_name = _('Item Type Map')
356     def __str__(self):
357         return self.code
358
359
360
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)
364     class Admin:
365         search_fields = ['code', 'value']
366         list_display = ('code', 'value')
367     class Meta:
368         db_table = 'language_map'
369         ordering = ['code']
370         verbose_name = _('Language Map')
371     def __str__(self):
372         return self.code
373
374
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)
379     class Admin:
380         search_fields = ['code', 'value', 'description']
381         list_display = ('code', 'value', 'description')
382     class Meta:
383         db_table = 'lit_form_map'
384         ordering = ['code']
385         verbose_name = _('Lit Form Map')
386     def __str__(self):
387         return self.code
388
389 class NetAccessLevel(models.Model):
390     name = models.CharField(maxlength=CHAR_MAXLEN, blank=False)
391     class Admin:
392         search_fields = ['name']
393     class Meta:
394         db_table = 'net_access_level'
395         ordering = ['name']
396         verbose_name = _('Net Access Level')
397     def __str__(self):
398         return self.name
399
400
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)
406     class Admin:
407         search_fields = ['name', 'namespace_uri', 'prefix' ]
408         list_display = ('name', 'prefix', 'namespace_uri', 'xslt')
409     class Meta:
410         db_table = 'xml_transform'
411         ordering = ['name']
412         verbose_name = _('XML Transform')
413     def __str__(self):
414         return self.name
415
416
417
418
419