Create Syrup model tables in a 'reserves' schema, just because we can.
authorgfawcett <gfawcett@6d9bc8c9-1ec2-4278-b937-99fde70a366f>
Tue, 9 Feb 2010 02:21:16 +0000 (02:21 +0000)
committergfawcett <gfawcett@6d9bc8c9-1ec2-4278-b937-99fde70a366f>
Tue, 9 Feb 2010 02:21:16 +0000 (02:21 +0000)
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
conifer/syrup/admin.py
conifer/syrup/models.py

index d912acc..0b620ad 100644 (file)
@@ -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.
index 9ac7f1a..3ffd2b3 100644 (file)
@@ -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)
 
index 03a3ea1..604d066 100644 (file)
@@ -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='<strong class="highlight">\\1</strong>'):
@@ -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)