From ca722c3caf8a7fdc7d8f82181c55228f9ba3c69b Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 14 Mar 2012 19:35:48 +0100 Subject: [PATCH 1/5] Migration to move gps data around Move media_data["gps"]["*"] to media_data["gps_*"]. In preparation for media_data.gps_* --- mediagoblin/db/mongo/migrations.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/mediagoblin/db/mongo/migrations.py b/mediagoblin/db/mongo/migrations.py index c5766b0d..23cf5e45 100644 --- a/mediagoblin/db/mongo/migrations.py +++ b/mediagoblin/db/mongo/migrations.py @@ -153,3 +153,21 @@ def convert_video_media_data(database): assert len(document['media_data']) == 1 document['media_data'] = document['media_data']['video'] collection.save(document) + +@RegisterMigration(11) +def convert_gps_media_data(database): + """ + Move media_data["gps"]["*"] to media_data["gps_*"]. + In preparation for media_data.gps_* + """ + collection = database['media_entries'] + target = collection.find( + {'media_data.gps': {'$exists': True}}) + + for document in target: + print document['_id'], "old:", document['media_data'] + for key, value in document['media_data']['gps'].iteritems(): + document['media_data']['gps_' + key] = value + del document['media_data']['gps'] + print document['_id'], "new:", document['media_data'] + collection.save(document) From e0b2b245fe00e6593db340b30754b80045eb9ac9 Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 14 Mar 2012 20:13:42 +0100 Subject: [PATCH 2/5] Use .gps_* in the template and add translations. Instead of .gps.x use .gps_x and add some "is defined" and stuff. Also mark some strings for translation in here. --- .../mediagoblin/utils/geolocation_map.html | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/mediagoblin/templates/mediagoblin/utils/geolocation_map.html b/mediagoblin/templates/mediagoblin/utils/geolocation_map.html index 118d0e62..e8baa247 100644 --- a/mediagoblin/templates/mediagoblin/utils/geolocation_map.html +++ b/mediagoblin/templates/mediagoblin/utils/geolocation_map.html @@ -17,24 +17,27 @@ #} {% block geolocation_map %} - {% if media.media_data.has_key('gps') - and app_config['geolocation_map_visible'] - and media.media_data.gps %} -

Location

+ {% if app_config['geolocation_map_visible'] + and media.media_data.gps_latitude is defined + and media.media_data.gps_latitude + and media.media_data.gps_longitude is defined + and media.media_data.gps_longitude %} +

{% trans %}Location{% endtrans %}

- {% set gps = media.media_data.gps %} + {%- set lon = media.media_data.gps_longitude %} + {%- set lat = media.media_data.gps_latitude %} + {%- set osm_url = "http://openstreetmap.org/?mlat={lat}&mlon={lon}".format(lat=lat, lon=lon) %}
+ value="{{ lon }}" /> + value="{{ lat }}" />

- View on - - OpenStreetMap - + {% trans -%} + View on OpenStreetMap + {%- endtrans %}

From ea200c32ac5266cefe317d224b305e18a36f0b8d Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 14 Mar 2012 20:15:04 +0100 Subject: [PATCH 3/5] Change image processing to create new .gps_*. The processing should also create .gps_* instead of the old ['gps']['x']. To ease forward porting, use the new media.media_data_init() to set the gps data in the media. --- mediagoblin/media_types/image/processing.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mediagoblin/media_types/image/processing.py b/mediagoblin/media_types/image/processing.py index 769de89b..b61e717d 100644 --- a/mediagoblin/media_types/image/processing.py +++ b/mediagoblin/media_types/image/processing.py @@ -119,7 +119,11 @@ def process_image(entry): 'clean': clean_exif(exif_tags)} media_data['exif']['useful'] = get_useful( media_data['exif']['clean']) - media_data['gps'] = gps_data + + if len(gps_data): + for key in list(gps_data.keys()): + gps_data['gps_' + key] = gps_data.pop(key) + entry.media_data_init(**gps_data) # clean up workbench workbench.destroy_self() From 28306810c5d28d33c397181769380ddf70a67758 Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 14 Mar 2012 21:17:07 +0100 Subject: [PATCH 4/5] Convert (gps) image media_data. Add mongo_to_sql convert part for converting the media_data for images. This currently drops the exif data and thus only converts gps data. --- mediagoblin/db/sql/convert.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/mediagoblin/db/sql/convert.py b/mediagoblin/db/sql/convert.py index 086a5c9c..dca93f3f 100644 --- a/mediagoblin/db/sql/convert.py +++ b/mediagoblin/db/sql/convert.py @@ -14,12 +14,14 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . +from copy import copy from mediagoblin.init import setup_global_and_app_config, setup_database from mediagoblin.db.mongo.util import ObjectId from mediagoblin.db.sql.models import (Base, User, MediaEntry, MediaComment, Tag, MediaTag, MediaFile, MediaAttachmentFile) +from mediagoblin.media_types.image.models import ImageData from mediagoblin.media_types.video.models import VideoData from mediagoblin.db.sql.open import setup_connection_and_db_from_config as \ sql_connect @@ -106,6 +108,25 @@ def convert_media_entries(mk_db): session.close() +def convert_image(mk_db): + session = Session() + + for media in mk_db.MediaEntry.find( + {'media_type': 'mediagoblin.media_types.image'}).sort('created'): + media_data = copy(media.media_data) + + # TODO: Fix after exif is migrated + media_data.pop('exif', None) + + if len(media_data): + media_data_row = ImageData(**media_data) + media_data_row.media_entry = obj_id_table[media._id] + session.add(media_data_row) + + session.commit() + session.close() + + def convert_video(mk_db): session = Session() @@ -180,6 +201,8 @@ def run_conversion(config_name): Session.remove() convert_media_entries(mk_db) Session.remove() + convert_image(mk_db) + Session.remove() convert_video(mk_db) Session.remove() convert_media_tags(mk_db) From 36ccc57bea30d1a437e673a01e8032a667040962 Mon Sep 17 00:00:00 2001 From: Elrond Date: Wed, 14 Mar 2012 21:17:50 +0100 Subject: [PATCH 5/5] Add gps_altitude and gps_direction to image media_data. --- mediagoblin/media_types/image/models.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mediagoblin/media_types/image/models.py b/mediagoblin/media_types/image/models.py index 7ffd209b..88ccc84e 100644 --- a/mediagoblin/media_types/image/models.py +++ b/mediagoblin/media_types/image/models.py @@ -14,6 +14,8 @@ class ImageData(Base): height = Column(Integer) gps_longitude = Column(Float) gps_latitude = Column(Float) + gps_altitude = Column(Float) + gps_direction = Column(Float) DATA_MODEL = ImageData