From c2ee74ba9d98e0a9c89e99882d2d10a71ce1ffbd Mon Sep 17 00:00:00 2001 From: gfawcett Date: Tue, 9 Feb 2010 02:21:16 +0000 Subject: [PATCH] Create Syrup model tables in a 'reserves' schema, just because we can. This is still the 'classic' Syrup database model; we haven't made any changes here vis-a-vis Robin's model. I've simply used explicit db_table naming and our custom backend to put the Syrup tables in a 'reserves' schema. I've also moved the default Django tables (users, groups, etc.) into a 'django' schema. This leaves 'public' empty. Note that I didn't do this by setting explicit db_table values for the Django tables, but rather by putting 'django' at the head of the search_path in settings.py. git-svn-id: svn://svn.open-ils.org/ILS-Contrib/servres/branches/eg-schema-experiment@774 6d9bc8c9-1ec2-4278-b937-99fde70a366f --- conifer/settings.py | 2 +- conifer/syrup/admin.py | 2 +- conifer/syrup/models.py | 86 ++++++++++++++++++++++++++++++++----------------- 3 files changed, 59 insertions(+), 31 deletions(-) diff --git a/conifer/settings.py b/conifer/settings.py index d912acc..0b620ad 100644 --- a/conifer/settings.py +++ b/conifer/settings.py @@ -17,7 +17,7 @@ ADMINS = ( MANAGERS = ADMINS DATABASE_ENGINE = 'conifer.evergreen.backends.postgresql_with_schemas' -DATABASE_PG_SCHEMAS = ['public','actor','asset','config','permission','reserves'] +DATABASE_PG_SCHEMAS = ['django','actor','asset','config','permission','reserves'] DATABASE_NAME = 'robin' # Or path to database file if using sqlite3. DATABASE_USER = 'postgres' # Not used with sqlite3. DATABASE_PASSWORD = 'XXX' # Not used with sqlite3. diff --git a/conifer/syrup/admin.py b/conifer/syrup/admin.py index 9ac7f1a..3ffd2b3 100644 --- a/conifer/syrup/admin.py +++ b/conifer/syrup/admin.py @@ -5,7 +5,7 @@ from django.contrib import admin import django.db.models from conifer.syrup.models import * -for m in [LibraryUnit, ServiceDesk, Member, Department, Course, Term, UserProfile, NewsItem, +for m in [Member, Department, Course, Term, UserProfile, NewsItem, Target, PhysicalObject]: admin.site.register(m) diff --git a/conifer/syrup/models.py b/conifer/syrup/models.py index 03a3ea1..604d066 100644 --- a/conifer/syrup/models.py +++ b/conifer/syrup/models.py @@ -12,6 +12,22 @@ import re import random from django.utils import simplejson from conifer.middleware import genshi_locals +from django.conf import settings + +try: + import markdown + def do_markdown(txt): + return markdown.markdown(txt) +except ImportError: + def do_markdown(txt): + return _('(Markdown not installed).') + + +# SCHEMAS: True if our database is being stored in a +# multi-schema Postgres database. + +SCHEMAS = (settings.DATABASE_ENGINE == 'conifer.evergreen.backends.postgresql_with_schemas') + def highlight(text, phrase, highlighter='\\1'): @@ -64,6 +80,10 @@ for k,v in [(k,v) for k,v in UserExtensionHack.__dict__.items() \ class UserProfile(m.Model): + + class Meta: + db_table = 'reserves.user_profile' if SCHEMAS else 'reserves_user_profile' + user = m.ForeignKey(User, unique=True) home_phone = m.CharField(max_length=100, blank=True) home_address = m.TextField(blank=True) @@ -75,7 +95,7 @@ class UserProfile(m.Model): wants_email_notices = m.BooleanField(default=False) last_email_notice = m.DateTimeField(default=datetime.now, blank=True, null=True) - + def __unicode__(self): return 'UserProfile(%s)' % self.user @@ -106,31 +126,15 @@ def maybe_initialize_user(username): if user: return user -#---------------------------------------------------------------------- -# LIBRARIES, SERVICE DESKS - -class LibraryUnit(m.Model): - name = m.CharField(max_length=100) - nickname = m.CharField(max_length=15,blank=True,default='') - url = m.URLField() - contact_email = m.EmailField() - - def __unicode__(self): - return self.name - -class ServiceDesk(m.Model): - library = m.ForeignKey(LibraryUnit) - abbreviation = m.CharField(max_length=8,db_index=True) - name = m.CharField(max_length=100) - active = m.BooleanField(default=True) - - def __unicode__(self): - return self.name #---------------------------------------------------------------------- # TERMS, COURSES, MEMBERSHIP class Term(m.Model): + + class Meta: + db_table = 'reserves.term' if SCHEMAS else 'reserves_term' + code = m.CharField(max_length=16, blank=True, null=True, unique=True) name = m.CharField(max_length=255) start = m.DateField('Start (Y-M-D)') @@ -140,6 +144,10 @@ class Term(m.Model): return self.code or self.name class Department(m.Model): + + class Meta: + db_table = 'reserves.department' if SCHEMAS else 'reserves_department' + abbreviation = m.CharField(max_length=8,db_index=True) name = m.CharField(max_length=255) active = m.BooleanField(default=True) @@ -149,6 +157,10 @@ class Department(m.Model): class Course(m.Model): """An offering of a course.""" + + class Meta: + db_table = 'reserves.course' if SCHEMAS else 'reserves_course' + # some courses may be ad-hoc and have no code. code = m.CharField(max_length=64, blank=True, null=True) department = m.ForeignKey(Department) @@ -314,8 +326,10 @@ def section_encode_safe(section): return course_sections.sections_tuple_delimiter.join(section).encode('base64').strip() class Member(m.Model): + class Meta: unique_together = (('course', 'user')) + db_table = 'reserves.member' if SCHEMAS else 'reserves_member' course = m.ForeignKey(Course) user = m.ForeignKey(User) @@ -355,6 +369,9 @@ class Item(m.Model): A reserve item, physical or electronic, as it appears in a given course instance. """ + + class Meta: + db_table = 'reserves.item' if SCHEMAS else 'reserves_item' # Structure @@ -537,9 +554,13 @@ metadata_attributes = { metadata_attribute_choices = metadata_attributes.items() metadata_attribute_choices.sort(key=lambda (a,b): b) + class Metadata(m.Model): """Metadata for items.""" + class Meta: + db_table = 'reserves.metadata' if SCHEMAS else 'reserves_metadata' + item = m.ForeignKey(Item) #fixme, arbitrary sizes. name = m.CharField('Attribute', max_length=128, choices=metadata_attribute_choices) @@ -548,15 +569,11 @@ class Metadata(m.Model): #------------------------------------------------------------ # News items -try: - import markdown - def do_markdown(txt): - return markdown.markdown(txt) -except ImportError: - def do_markdown(txt): - return _('(Markdown not installed).') - class NewsItem(m.Model): + + class Meta: + db_table = 'reserves.news_item' if SCHEMAS else 'reserves_news_item' + subject = m.CharField(max_length=200) body = m.TextField() published = m.DateTimeField(default=datetime.now, blank=True, null=True) @@ -581,6 +598,10 @@ class NewsItem(m.Model): # Z39.50 Support class Target(m.Model): + + class Meta: + db_table = 'reserves.target' if SCHEMAS else 'reserves_target' + name = m.CharField(max_length=100) host = m.CharField(max_length=50) db = m.CharField(max_length=50) @@ -597,6 +618,9 @@ class Target(m.Model): class CheckInOut(m.Model): """A log of checkout-to-patron and item-return events.""" + class Meta: + db_table = 'reserves.check_inout' if SCHEMAS else 'reserves_check_inout' + is_checkout = m.BooleanField() # in or out? is_successful = m.BooleanField() # did the transaction work? staff = m.ForeignKey(User) # who processed the request? @@ -610,6 +634,10 @@ class CheckInOut(m.Model): class PhysicalObject(m.Model): """A record of a physical object entering and leaving the Reserves area.""" + + class Meta: + db_table = 'reserves.physical_object' if SCHEMAS else 'reserves_physical_object' + barcode = m.CharField(max_length=100) # item barcode receiver = m.ForeignKey(User, related_name='receiver') # who received the item? received = m.DateTimeField(auto_now_add=True) -- 2.11.0