diff options
author | Christopher Allan Webber <cwebber@dustycloud.org> | 2012-02-18 15:33:29 -0600 |
---|---|---|
committer | Christopher Allan Webber <cwebber@dustycloud.org> | 2012-02-18 15:33:29 -0600 |
commit | 4d8be4fe0d82c13c0a4d0fb454c422449bdfafe2 (patch) | |
tree | b9be37aef8bb0284f011fe56e0c6d02cf404aba7 | |
parent | 63352aaf70d97a37b6277fab0f9b957d34dcb9df (diff) | |
parent | a45631e3f3791071571da3a59bf6d3ecad42033f (diff) | |
download | mediagoblin-4d8be4fe0d82c13c0a4d0fb454c422449bdfafe2.tar.lz mediagoblin-4d8be4fe0d82c13c0a4d0fb454c422449bdfafe2.tar.xz mediagoblin-4d8be4fe0d82c13c0a4d0fb454c422449bdfafe2.zip |
Merge branch 'master' into sqlmigrate
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | mediagoblin.ini | 4 | ||||
-rw-r--r-- | mediagoblin/config_spec.ini | 1 | ||||
-rw-r--r-- | mediagoblin/db/sql/convert.py | 5 | ||||
-rw-r--r-- | mediagoblin/db/sql/extratypes.py | 28 | ||||
-rw-r--r-- | mediagoblin/db/sql/models.py | 12 |
6 files changed, 42 insertions, 9 deletions
@@ -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): |