Skip to content
Snippets Groups Projects
Commit 85adaae5 authored by Gunnar Schaefer's avatar Gunnar Schaefer
Browse files

Merge pull request #18 from scitran/timezone_support

Provide timestamps with timezone in ISO format
parents 9a7099d2 002b8736
No related branches found
No related tags found
No related merge requests found
......@@ -58,7 +58,7 @@ class Acquisitions(containers.ContainerList):
if not self.app.db.sessions.find_one({'_id': _id}):
self.abort(404, 'no such Session')
query = {'session': _id}
projection = {'label': 1, 'description': 1, 'types': 1, 'notes': 1}
projection = {'label': 1, 'description': 1, 'types': 1, 'notes': 1, 'timestamp': 1, 'timezone': 1}
acquisitions = self._get(query, projection, self.request.get('admin').lower() in ('1', 'true'))
if self.debug:
for acquisition in acquisitions:
......
......@@ -198,7 +198,7 @@ class Collections(containers.ContainerList):
def get(self):
"""Return the list of Collections."""
query = {'curator_id': self.request.get('curator')} if self.request.get('curator') else {}
projection = {'curator_id': 1, 'name': 1, 'notes': 1}
projection = {'curator_id': 1, 'name': 1, 'notes': 1, 'timestamp': 1, 'timezone': 1}
collections = self._get(query, projection, self.request.get('admin').lower() in ('1', 'true'))
for coll in collections:
coll['_id'] = str(coll['_id'])
......@@ -296,7 +296,7 @@ class CollectionSessions(sessions.Sessions):
{'$group': {'_id': '$session'}},
])
query = {'_id': {'$in': [ar['_id'] for ar in agg_res]}}
projection = {'label': 1, 'subject.code': 1, 'notes': 1}
projection = {'label': 1, 'subject.code': 1, 'notes': 1, 'timestamp': 1, 'timezone': 1}
projection['permissions'] = {'$elemMatch': {'_id': self.uid, 'site': self.source_site}}
sessions = list(self.dbc.find(query, projection))
for sess in sessions:
......@@ -333,7 +333,7 @@ class CollectionAcquisitions(acquisitions.Acquisitions):
query['session'] = bson.ObjectId(sid)
elif sid != '':
self.abort(400, sid + ' is not a valid ObjectId')
projection = {'label': 1, 'description': 1, 'types': 1, 'notes': 1}
projection = {'label': 1, 'description': 1, 'types': 1, 'notes': 1, 'timestamp': 1, 'timezone': 1}
projection['permissions'] = {'$elemMatch': {'_id': self.uid, 'site': self.source_site}}
acquisitions = list(self.dbc.find(query, projection))
for acq in acquisitions:
......
......@@ -5,8 +5,8 @@ log = logging.getLogger('scitran.api')
import os
import json
import pytz
import hashlib
import datetime
import jsonschema
import bson.json_util
......@@ -16,7 +16,6 @@ import base
import util
import users
import tempdir as tempfile
FILE_SCHEMA = {
'$schema': 'http://json-schema.org/draft-04/schema#',
......@@ -112,6 +111,13 @@ FILE_DOWNLOAD_SCHEMA = {
}
def fixup_timestamps(container):
if 'timestamp' in container:
container_timezone = pytz.timezone(container.get('timezone', None) or 'UTC')
container['timestamp'] = container_timezone.localize(container['timestamp']).isoformat()
container['timezone'] = container_timezone.zone
class ContainerList(base.RequestHandler):
def _get(self, query, projection, admin_only=False):
......@@ -127,6 +133,7 @@ class ContainerList(base.RequestHandler):
containers = list(self.dbc.find(query, projection))
for container in containers:
container['_id'] = str(container['_id'])
fixup_timestamps(container)
return containers
......@@ -154,6 +161,7 @@ class Container(base.RequestHandler):
for file_info in container['files']:
file_info['path'] = str(_id)[-3:] + '/' + str(_id) + '/' + file_info['name'] + file_info['ext']
container['_id'] = str(container['_id'])
fixup_timestamps(container)
return container, user_perm
def put(self, _id):
......
......@@ -113,7 +113,7 @@ class Projects(containers.ContainerList):
def get(self):
"""Return the User's list of Projects."""
query = {'group_id': self.request.get('group')} if self.request.get('group') else {}
projection = {'group_id': 1, 'name': 1, 'notes': 1}
projection = {'group_id': 1, 'name': 1, 'notes': 1, 'timestamp': 1, 'timezone': 1}
projects = self._get(query, projection, self.request.get('admin').lower() in ('1', 'true'))
if self.debug:
for proj in projects:
......
......@@ -64,7 +64,7 @@ class Sessions(containers.ContainerList):
query = {'project': _id}
else:
query = {}
projection = {'label': 1, 'subject.code': 1, 'notes': 1, 'project': 1}
projection = {'label': 1, 'subject.code': 1, 'notes': 1, 'project': 1, 'timestamp': 1, 'timezone': 1}
sessions = self._get(query, projection, self.request.get('admin').lower() in ('1', 'true'))
for sess in sessions:
sess['project'] = str(sess['project'])
......
......@@ -146,11 +146,12 @@ def _update_db(db, dataset):
fields=[],
)
if dataset.nims_timestamp:
db.projects.update({'_id': project['_id']}, {'$max': dict(timestamp=dataset.nims_timestamp)})
db.projects.update({'_id': project['_id']}, {'$max': dict(timestamp=dataset.nims_timestamp), '$set': dict(timezone=dataset.nims_timezone)})
db.sessions.update({'_id': session['_id']}, {'$min': dict(timestamp=dataset.nims_timestamp), '$set': dict(timezone=dataset.nims_timezone)})
# create a job, if necessary
return acquisition['_id']
# TODO: create job should be use-able from bootstrap.py with only database information
def create_job(dbc, dataset):
db = dbc.database
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment