def metadata_modified(self): """ Return most recent timestamp for revisions related to this package. NB Excludes changes to the package's groups """ import ckan.model as model where = [model.package_table.c.id == self.id] where_clauses = [ and_(model.package_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_extra_table.c.package_id == model.package_table.c.id, model.package_extra_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_relationship_table.c.subject_package_id == model.package_table.c.id, model.package_relationship_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_relationship_table.c.object_package_id == model.package_table.c.id, model.package_relationship_table.c.revision_id == model.revision_table.c.id, *where), and_(model.resource_group_table.c.package_id == model.package_table.c.id, model.resource_group_table.c.revision_id == model.revision_table.c.id, *where), and_(model.resource_group_table.c.package_id == model.package_table.c.id, model.resource_table.c.resource_group_id == model.resource_group_table.c.id, model.resource_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_tag_table.c.package_id == model.package_table.c.id, model.package_tag_table.c.revision_id == model.revision_table.c.id, *where) ] query = union(*[select([model.revision_table.c.timestamp], x) for x in where_clauses] ).order_by('timestamp DESC').limit(1) # Use current connection because we might be in a 'before_commit' of # a SessionExtension - only by using the current connection can we get # at the newly created revision etc. objects. conn = model.Session.connection() result = conn.execute(query).fetchone() if result: result_datetime = iso_date_to_datetime_for_sqlite(result[0]) timestamp_without_usecs = result_datetime.utctimetuple() usecs = float(result_datetime.microsecond) / 1e6 # use timegm instead of mktime, because we don't want it localised timestamp_float = timegm(timestamp_without_usecs) + usecs return datetime.datetime.utcfromtimestamp(timestamp_float)
def metadata_modified(self): """ Return most recent timestamp for revisions related to this package. NB Excludes changes to the package's groups """ from ckan import model where = [model.package_table.c.id == self.id] where_clauses = [ and_(model.package_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_extra_table.c.package_id == model.package_table.c.id, model.package_extra_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_relationship_table.c.subject_package_id == model.package_table.c.id, model.package_relationship_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_relationship_table.c.object_package_id == model.package_table.c.id, model.package_relationship_table.c.revision_id == model.revision_table.c.id, *where), and_(model.resource_group_table.c.package_id == model.package_table.c.id, model.resource_group_table.c.revision_id == model.revision_table.c.id, *where), and_(model.resource_group_table.c.package_id == model.package_table.c.id, model.resource_table.c.resource_group_id == model.resource_group_table.c.id, model.resource_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_tag_table.c.package_id == model.package_table.c.id, model.package_tag_table.c.revision_id == model.revision_table.c.id, *where) ] query = union(*[select([model.revision_table.c.timestamp], x) for x in where_clauses] ).order_by('timestamp DESC').limit(1) # Use current connection because we might be in a 'before_commit' of # a SessionExtension - only by using the current connection can we get # at the newly created revision etc. objects. conn = model.Session.connection() result = conn.execute(query).fetchone() if result: result_datetime = _types.iso_date_to_datetime_for_sqlite(result[0]) timestamp_without_usecs = result_datetime.utctimetuple() usecs = float(result_datetime.microsecond) / 1e6 # use timegm instead of mktime, because we don't want it localised timestamp_float = timegm(timestamp_without_usecs) + usecs return datetime.datetime.utcfromtimestamp(timestamp_float)
def last_modified(*av): """ Return most recent timestamp for a package revision, with optionally extra where clause. """ from ckan import model where = [] for arg in av: if isinstance(arg, expression.ClauseElement) or isinstance(arg, basestring): where.append(arg) where_clauses = [ and_(model.package_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_extra_table.c.package_id == model.package_table.c.id, model.package_extra_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_relationship_table.c.subject_package_id == model.package_table.c.id, model.package_relationship_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_relationship_table.c.object_package_id == model.package_table.c.id, model.package_relationship_table.c.revision_id == model.revision_table.c.id, *where), and_(model.resource_group_table.c.package_id == model.package_table.c.id, model.resource_group_table.c.revision_id == model.revision_table.c.id, *where), and_(model.resource_group_table.c.package_id == model.package_table.c.id, model.resource_table.c.resource_group_id == model.resource_group_table.c.id, model.resource_table.c.revision_id == model.revision_table.c.id, *where), and_(model.package_tag_table.c.package_id == model.package_table.c.id, model.package_tag_table.c.revision_id == model.revision_table.c.id, *where) ] query = union(*[select([model.revision_table.c.timestamp], x) for x in where_clauses] ).order_by("timestamp DESC").limit(1) conn = model.meta.engine.connect() result = conn.execute(query).fetchone() if result: result_datetime = iso_date_to_datetime_for_sqlite(result[0]) timestamp = result_datetime.utctimetuple() usecs = float(result_datetime.microsecond) / 1e6 else: timestamp, usecs = gmtime(), 0 # use timegm instead of mktime, because we don't want it localised return timegm(timestamp) + usecs