X-Git-Url: https://git.evergreen-ils.org/?p=Evergreen.git;a=blobdiff_plain;f=Open-ILS%2Fadmin%2Fils_admin%2Fsetup%2Fils_data%2Fmodels.py;h=ea19cec87b5a7b71b5c9c881ed549a1bd7bb5e76;hp=d0b2579156c9b2db64bddd6fc0ab7c67c8b62af8;hb=c97146409f6bd96fd26b4ba921de7ca34f675536;hpb=63d5a9ef949e74bf20fb402b75365a53d0af0532 diff --git a/Open-ILS/admin/ils_admin/setup/ils_data/models.py b/Open-ILS/admin/ils_admin/setup/ils_data/models.py index d0b2579156..ea19cec87b 100644 --- a/Open-ILS/admin/ils_admin/setup/ils_data/models.py +++ b/Open-ILS/admin/ils_admin/setup/ils_data/models.py @@ -1,6 +1,8 @@ from django.db import models from django.db.models import signals from django.dispatch import dispatcher +import datetime +from gettext import gettext as _ INTERVAL_HELP_TEXT = _('examples: "1 hour", "14 days", "3 months", "DD:HH:MM:SS.ms"') CHAR_MAXLEN=200 # just provide a sane default @@ -10,23 +12,6 @@ CHAR_MAXLEN=200 # just provide a sane default Permission tables -------------------------------------------------------------- """ -class GrpTree(models.Model): - name = models.CharField(maxlength=100) - parent_id = models.ForeignKey('self', null=True, related_name='children', db_column='parent') - description = models.CharField(blank=True, maxlength=CHAR_MAXLEN) - perm_interval = models.CharField(blank=True, maxlength=100, help_text=INTERVAL_HELP_TEXT) - application_perm = models.CharField(blank=True, maxlength=100) - usergroup = models.BooleanField() - class Admin: - list_display = ('name', 'description') - list_filter = ['parent_id'] - search_fields = ['name', 'description'] - class Meta: - db_table = 'grp_tree' - ordering = ['name'] - verbose_name = _('User Group') - def __str__(self): - return self.name class PermList(models.Model): code = models.CharField(maxlength=100) @@ -42,7 +27,7 @@ class PermList(models.Model): return self.code class GrpPermMap(models.Model): - grp_id = models.ForeignKey(GrpTree, db_column='grp') + grp_id = models.ForeignKey('GrpTree', db_column='grp') perm_id = models.ForeignKey(PermList, db_column='perm') depth_id = models.ForeignKey('OrgUnitType', to_field='depth', db_column='depth') grantable = models.BooleanField() @@ -56,6 +41,25 @@ class GrpPermMap(models.Model): def __str__(self): return str(self.grp_id)+' -> '+str(self.perm_id) +class GrpTree(models.Model): + name = models.CharField(maxlength=100) + parent_id = models.ForeignKey('self', null=True, related_name='children', db_column='parent') + description = models.CharField(blank=True, maxlength=CHAR_MAXLEN) + perm_interval = models.CharField(blank=True, maxlength=100, help_text=INTERVAL_HELP_TEXT) + application_perm = models.CharField(blank=True, maxlength=100) + usergroup = models.BooleanField() + class Admin: + list_display = ('name', 'description') + list_filter = ['parent_id'] + search_fields = ['name', 'description'] + class Meta: + db_table = 'grp_tree' + ordering = ['name'] + verbose_name = _('User Group') + def __str__(self): + return self.name + + @@ -184,12 +188,69 @@ class OrgUnit(models.Model): def __str__(self): return self.shortname +class HoursOfOperation(models.Model): + #choices = tuple([ (datetime.time(i), str(i)) for i in range(0,23) ]) + org_unit = models.ForeignKey('OrgUnit', db_column='id') + # XXX add better time widget support + dow_0_open = models.TimeField(_('Monday Open'), null=False, blank=False, default=datetime.time(9)) + dow_0_close = models.TimeField(_('Monday Close'), null=False, blank=False, default=datetime.time(17)) + dow_1_open = models.TimeField(_('Tuesday Open'), null=False, blank=False, default=datetime.time(9)) + dow_1_close = models.TimeField(_('Tuesday Close'), null=False, blank=False, default=datetime.time(17)) + dow_2_open = models.TimeField(_('Wednesday Open'), null=False, blank=False, default=datetime.time(9)) + dow_2_close = models.TimeField(_('Wednesday Close'), null=False, blank=False, default=datetime.time(17)) + dow_3_open = models.TimeField(_('Thursday Open'), null=False, blank=False, default=datetime.time(9)) + dow_3_close = models.TimeField(_('Thursday Close'), null=False, blank=False, default=datetime.time(17)) + dow_4_open = models.TimeField(_('Friday Open'), null=False, blank=False, default=datetime.time(9)) + dow_4_close = models.TimeField(_('Friday Close'), null=False, blank=False, default=datetime.time(17)) + dow_5_open = models.TimeField(_('Saturday Open'), null=False, blank=False, default=datetime.time(9)) + dow_5_close = models.TimeField(_('Saturday Close'), null=False, blank=False, default=datetime.time(17)) + dow_6_open = models.TimeField(_('Sunday Open'), null=False, blank=False, default=datetime.time(9)) + dow_6_close = models.TimeField(_('Sunday Close'), null=False, blank=False, default=datetime.time(17)) + class Admin: + pass + class Meta: + db_table = 'hours_of_operation' + verbose_name = _('Hours of Operation') + verbose_name_plural = verbose_name + def __str__(self): + return str(self.org_unit) + """ -------------------------------------------------------------- Config tables -------------------------------------------------------------- """ +class CircModifier(models.Model): + code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True) + name = models.CharField(maxlength=CHAR_MAXLEN) + description = models.CharField(maxlength=CHAR_MAXLEN); + sip2_media_type = models.CharField(maxlength=CHAR_MAXLEN); + magnetic_media = models.BooleanField() + class Admin: + search_fields = ['name','code'] + list_display = ('code','name','description','sip2_media_type','magnetic_media') + class Meta: + db_table = 'circ_modifier' + ordering = ['name'] + verbose_name = _('Circulation Modifier') + def __str__(self): + return self.name + + +class VideoRecordingFormat(models.Model): + code = models.CharField(maxlength=CHAR_MAXLEN, blank=False, primary_key=True) + value = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT); + class Admin: + search_fields = ['value','code'] + list_display = ('value','code') + class Meta: + db_table = 'videorecording_format_map' + ordering = ['code'] + verbose_name = _('Video Recording Format') + def __str__(self): + return self.value + class RuleCircDuration(models.Model): name = models.CharField(maxlength=CHAR_MAXLEN) extended = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT); @@ -206,6 +267,89 @@ class RuleCircDuration(models.Model): def __str__(self): return self.name +class CircMatrixMatchpoint(models.Model): + active = models.BooleanField(blank=False, default=True) + org_unit_id = models.ForeignKey(OrgUnit, db_column='org_unit', blank=False) + grp_id = models.ForeignKey(GrpTree, db_column='grp', blank=False, verbose_name=_("User Group")) + circ_modifier_id = models.ForeignKey(CircModifier, db_column='circ_modifier', null=True,blank=True) + marc_type_id = models.ForeignKey('ItemTypeMap', db_column='marc_type', null=True,blank=True) + marc_form_id = models.ForeignKey('ItemFormMap', db_column='marc_form', null=True,blank=True) + marc_vr_format_id = models.ForeignKey('VideoRecordingFormat', db_column='marc_vr_format', null=True,blank=True) + ref_flag = models.BooleanField(null=True) + usr_age_lower_bound = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT, null=True, blank=True) + usr_age_upper_bound = models.CharField(maxlength=CHAR_MAXLEN, help_text=INTERVAL_HELP_TEXT, null=True, blank=True) + + def save(self): + ''' Override to force None-ness on the interval fields ''' + if self.usr_age_lower_bound == "": + self.usr_age_lower_bound = None + if self.usr_age_upper_bound == "": + self.usr_age_upper_bound = None + return models.Model.save(self) + + class Admin: + search_fields = ['grp_id','org_unit_id','circ_modifier_id','marc_type_id','marc_form_id', + 'marc_vr_format_id','usr_age_lower_bound','usr_age_upper_bound'] + + list_display = ('grp_id','org_unit_id','circ_modifier_id','marc_type_id','marc_form_id', + 'marc_vr_format_id','ref_flag','usr_age_lower_bound','usr_age_upper_bound') + + list_filter = ['grp_id','org_unit_id','circ_modifier_id','marc_type_id','marc_form_id','marc_vr_format_id'] + class Meta: + db_table = 'circ_matrix_matchpoint' + ordering = ['id'] + verbose_name = _('Circulation Matrix Matchpoint') + def __str__(self): + return _("OrgUnit: %(orgid)s, Group: %(grpid)s, Circ Modifier: %(modid)s") % { + 'orgid':self.org_unit_id, 'grpid':self.grp_id, 'modid':self.circ_modifier_id} + +class CircMatrixTest(models.Model): + matchpoint_id = models.ForeignKey(CircMatrixMatchpoint, db_column='matchpoint', blank=False, primary_key=True, + edit_inline=models.TABULAR, core=True, num_in_admin=1) + max_items_out = models.IntegerField(null=True, blank=True) + max_overdue = models.IntegerField(null=True, blank=True) + max_fines = models.FloatField(max_digits=8, decimal_places=2, null=True, blank=True) + script_test = models.CharField(maxlength=CHAR_MAXLEN, null=True, blank=True) + class Admin: + list_display = ('matchpoint_id','max_items_out','max_overdue','max_fines','script_test') + class Meta: + db_table = 'circ_matrix_test' + ordering = ['matchpoint_id'] + verbose_name = _('Circ Matrix Test') + def __str__(self): + return _("%(mid)s, Max Items Out: %(iout)s, Max Overdue: %(odue)s, Max Fines: %(fines)s") % { + 'mid': self.matchpoint_id, 'iout' : self.max_items_out, 'odue':self.max_overdue, 'fines':self.max_fines} + +class CircMatrixCircModTest(models.Model): + matchpoint_id = models.ForeignKey(CircMatrixMatchpoint, db_column='matchpoint', blank=False, edit_inline=True,core=True, num_in_admin=1) + items_out = models.IntegerField(blank=False) + circ_mod_id = models.ForeignKey(CircModifier, db_column='circ_mod', blank=False) + class Admin: + search_fields = ['circ_mod_id'] + list_display = ('matchpoint_id','circ_mod_id','items_out') + class Meta: + db_table = 'circ_matrix_circ_mod_test' + ordering = ['matchpoint_id'] + verbose_name = _('Circ Matrix Items Out Cirulation Modifier Subtest') + def __str__(self): + return _("%(mid)s, Restriction: %(mod)s") % {'mid': self.matchpoint_id,'mod':self.circ_mod_id} + +class CircMatrixRuleSet(models.Model): + matchpoint_id = models.ForeignKey(CircMatrixMatchpoint, db_column='matchpoint', + blank=False, primary_key=True, edit_inline=True,core=True, num_in_admin=1) + duration_rule_id = models.ForeignKey(RuleCircDuration, db_column='duration_rule', blank=False) + recurring_fine_rule_id = models.ForeignKey('RuleRecurringFine', db_column='recurring_fine_rule', blank=False) + max_fine_rule_id = models.ForeignKey('RuleMaxFine', db_column='max_fine_rule', blank=False) + class Admin: + search_fields = ['matchoint_id'] + list_display = ('matchpoint_id','duration_rule_id','recurring_fine_rule_id','max_fine_rule_id') + class Meta: + db_table = 'circ_matrix_ruleset' + ordering = ['matchpoint_id'] + verbose_name = _('Circ Matrix Rule Set') + def __str__(self): + return _("Duration: %(dur)s, Recurring Fine: %(rfine)s, Max Fine: %(mfine)s") % { + 'dur':self.duration_rule_id, 'rfine':self.recurring_fine_rule_id, 'mfine':self.max_fine_rule_id} class RuleMaxFine(models.Model): name = models.CharField(maxlength=CHAR_MAXLEN)