aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Allan Webber <cwebber@dustycloud.org>2012-02-18 15:33:29 -0600
committerChristopher Allan Webber <cwebber@dustycloud.org>2012-02-18 15:33:29 -0600
commit4d8be4fe0d82c13c0a4d0fb454c422449bdfafe2 (patch)
treeb9be37aef8bb0284f011fe56e0c6d02cf404aba7
parent63352aaf70d97a37b6277fab0f9b957d34dcb9df (diff)
parenta45631e3f3791071571da3a59bf6d3ecad42033f (diff)
downloadmediagoblin-4d8be4fe0d82c13c0a4d0fb454c422449bdfafe2.tar.lz
mediagoblin-4d8be4fe0d82c13c0a4d0fb454c422449bdfafe2.tar.xz
mediagoblin-4d8be4fe0d82c13c0a4d0fb454c422449bdfafe2.zip
Merge branch 'master' into sqlmigrate
-rw-r--r--.gitignore1
-rw-r--r--mediagoblin.ini4
-rw-r--r--mediagoblin/config_spec.ini1
-rw-r--r--mediagoblin/db/sql/convert.py5
-rw-r--r--mediagoblin/db/sql/extratypes.py28
-rw-r--r--mediagoblin/db/sql/models.py12
6 files changed, 42 insertions, 9 deletions
diff --git a/.gitignore b/.gitignore
index b46ec38a..e3a83822 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,6 +15,7 @@
/user_dev/
/paste_local.ini
/mediagoblin_local.ini
+/mediagoblin.db
/server-log.txt
# Tests
diff --git a/mediagoblin.ini b/mediagoblin.ini
index dbde6e51..223f0f4a 100644
--- a/mediagoblin.ini
+++ b/mediagoblin.ini
@@ -5,6 +5,10 @@
direct_remote_path = /mgoblin_static/
email_sender_address = "notice@mediagoblin.example.org"
+## Uncomment and change to your DB's appropiate setting.
+## Default is a local sqlite db "mediagoblin.db".
+# sql_engine = postgresql:///gmg
+
# set to false to enable sending notices
email_debug_mode = true
diff --git a/mediagoblin/config_spec.ini b/mediagoblin/config_spec.ini
index 2d410899..2b4ba2f9 100644
--- a/mediagoblin/config_spec.ini
+++ b/mediagoblin/config_spec.ini
@@ -9,6 +9,7 @@ media_types = string_list(default=list("mediagoblin.media_types.image"))
db_host = string()
db_name = string(default="mediagoblin")
db_port = integer()
+sql_engine = string(default="sqlite:///%(here)s/mediagoblin.db")
# Where temporary files used in processing and etc are kept
workbench_path = string(default="%(here)s/user_dev/media/workbench")
diff --git a/mediagoblin/db/sql/convert.py b/mediagoblin/db/sql/convert.py
index a46d62ea..36d6fc7f 100644
--- a/mediagoblin/db/sql/convert.py
+++ b/mediagoblin/db/sql/convert.py
@@ -79,7 +79,7 @@ def convert_media_entries(mk_db):
('title', 'slug', 'created',
'description',
'media_type', 'state', 'license',
- 'fail_error',
+ 'fail_error', 'fail_metadata',
'queued_task_id',))
copy_reference_attr(entry, new_entry, "uploader")
@@ -148,8 +148,7 @@ def convert_media_comments(mk_db):
def main():
global_config, app_config = setup_global_and_app_config("mediagoblin.ini")
- sql_conn, sql_db = sql_connect({'sql_engine': 'sqlite:///mediagoblin.db'})
-
+ sql_conn, sql_db = sql_connect(app_config)
mk_conn, mk_db = mongo_connect(app_config)
Base.metadata.create_all(sql_db.engine)
diff --git a/mediagoblin/db/sql/extratypes.py b/mediagoblin/db/sql/extratypes.py
index 3a594728..8e078f14 100644
--- a/mediagoblin/db/sql/extratypes.py
+++ b/mediagoblin/db/sql/extratypes.py
@@ -15,7 +15,8 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from sqlalchemy.types import TypeDecorator, Unicode
+from sqlalchemy.types import TypeDecorator, Unicode, VARCHAR
+import json
class PathTupleWithSlashes(TypeDecorator):
@@ -35,3 +36,28 @@ class PathTupleWithSlashes(TypeDecorator):
if value is not None:
value = tuple(value.split('/'))
return value
+
+
+# The following class and only this one class is in very
+# large parts based on example code from sqlalchemy.
+#
+# The original copyright notice and license follows:
+# Copyright (C) 2005-2011 the SQLAlchemy authors and contributors <see AUTHORS file>
+#
+# This module is part of SQLAlchemy and is released under
+# the MIT License: http://www.opensource.org/licenses/mit-license.php
+#
+class JSONEncoded(TypeDecorator):
+ "Represents an immutable structure as a json-encoded string."
+
+ impl = VARCHAR
+
+ def process_bind_param(self, value, dialect):
+ if value is not None:
+ value = json.dumps(value)
+ return value
+
+ def process_result_value(self, value, dialect):
+ if value is not None:
+ value = json.loads(value)
+ return value
diff --git a/mediagoblin/db/sql/models.py b/mediagoblin/db/sql/models.py
index b6377172..699dbf33 100644
--- a/mediagoblin/db/sql/models.py
+++ b/mediagoblin/db/sql/models.py
@@ -29,7 +29,7 @@ from sqlalchemy.orm.collections import attribute_mapped_collection
from sqlalchemy.sql.expression import desc
from sqlalchemy.ext.associationproxy import association_proxy
-from mediagoblin.db.sql.extratypes import PathTupleWithSlashes
+from mediagoblin.db.sql.extratypes import PathTupleWithSlashes, JSONEncoded
from mediagoblin.db.sql.base import Base, DictReadAttrProxy
from mediagoblin.db.mixin import UserMixin, MediaEntryMixin, MediaCommentMixin
@@ -98,7 +98,7 @@ class MediaEntry(Base, MediaEntryMixin):
license = Column(Unicode)
fail_error = Column(Unicode)
- fail_metadata = Column(UnicodeText)
+ fail_metadata = Column(JSONEncoded)
queued_media_file = Column(PathTupleWithSlashes)
@@ -214,10 +214,12 @@ class MediaTag(Base):
creator=Tag.find_or_new
)
- def __init__(self, name, slug):
+ def __init__(self, name=None, slug=None):
Base.__init__(self)
- self.name = name
- self.tag_helper = Tag.find_or_new(slug)
+ if name is not None:
+ self.name = name
+ if slug is not None:
+ self.tag_helper = Tag.find_or_new(slug)
@property
def dict_view(self):