witten
/
luminotes
Archived
1
0
Fork 0
This repository has been archived on 2023-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
luminotes/model/File.py

133 lines
4.8 KiB
Python

from Persistent import Persistent, quote
class File( Persistent ):
"""
Metadata about an uploaded file. The actual file data is stored on the filesystem instead of in
the database. (Binary conversion to/from PostgreSQL's bytea is too slow, and the version of
psycopg2 I'm using doesn't have large object support.)
"""
def __init__( self, object_id, revision = None, notebook_id = None, note_id = None,
filename = None, size_bytes = None, content_type = None ):
"""
Create a File with the given id.
@type object_id: unicode
@param object_id: id of the File
@type revision: datetime or NoneType
@param revision: revision timestamp of the object (optional, defaults to now)
@type notebook_id: unicode or NoneType
@param notebook_id: id of the notebook containing the file
@type note_id: unicode or NoneType
@param note_id: id of the note linking to the file
@type filename: unicode
@param filename: name of the file on the client
@type size_bytes: int
@param size_bytes: length of the file data in bytes
@type content_type: unicode
@param content_type: value of the Content-Type HTTP header for this file
@rtype: File
@return: newly constructed File
"""
Persistent.__init__( self, object_id, revision )
self.__notebook_id = notebook_id
self.__note_id = note_id
self.__filename = filename
self.__size_bytes = size_bytes
self.__content_type = content_type
@staticmethod
def create( object_id, notebook_id = None, note_id = None, filename = None, size_bytes = None, content_type = None ):
"""
Convenience constructor for creating a new File.
@type object_id: unicode
@param object_id: id of the File
@type notebook_id: unicode or NoneType
@param notebook_id: id of the notebook containing the file
@type note_id: unicode or NoneType
@param note_id: id of the note linking to the file
@type filename: unicode
@param filename: name of the file on the client
@type size_bytes: int
@param size_bytes: length of the file data in bytes
@type content_type: unicode
@param content_type: value of the Content-Type HTTP header for this file
@rtype: File
@return: newly constructed File
"""
return File( object_id, notebook_id = notebook_id, note_id = note_id, filename = filename,
size_bytes = size_bytes, content_type = content_type )
@staticmethod
def sql_load( object_id, revision = None ):
# Files don't store old revisions
if revision:
raise NotImplementedError()
return \
"""
select
file.id, file.revision, file.notebook_id, file.note_id, file.filename, file.size_bytes, file.content_type
from
file
where
file.id = %s;
""" % quote( object_id )
@staticmethod
def sql_id_exists( object_id, revision = None ):
if revision:
raise NotImplementedError()
return "select id from file where id = %s;" % quote( object_id )
def sql_exists( self ):
return File.sql_id_exists( self.object_id )
def sql_create( self ):
return "insert into file ( id, revision, notebook_id, note_id, filename, size_bytes, content_type ) values ( %s, %s, %s, %s, %s, %s, %s );" % \
( quote( self.object_id ), quote( self.revision ), quote( self.__notebook_id ), quote( self.__note_id ),
quote( self.__filename ), self.__size_bytes or 'null', quote( self.__content_type ) )
def sql_update( self ):
return "update file set revision = %s, notebook_id = %s, note_id = %s, filename = %s, size_bytes = %s, content_type = %s where id = %s;" % \
( quote( self.revision ), quote( self.__notebook_id ), quote( self.__note_id ), quote( self.__filename ),
self.__size_bytes or 'null', quote( self.__content_type ), quote( self.object_id ) )
def sql_delete( self ):
return "delete from file where id = %s;" % quote( self.object_id )
@staticmethod
def sql_load_note_files( note_id ):
return \
"""
select
file.id, file.revision, file.notebook_id, file.note_id, file.filename, file.size_bytes, file.content_type
from
file
where
file.note_id = %s;
""" % quote( note_id )
def to_dict( self ):
d = Persistent.to_dict( self )
d.update( dict(
notebook_id = self.__notebook_id,
note_id = self.__note_id,
filename = self.__filename,
size_bytes = self.__size_bytes,
content_type = self.__content_type,
) )
return d
def __set_filename( self, filename ):
self.__filename = filename
notebook_id = property( lambda self: self.__notebook_id )
note_id = property( lambda self: self.__note_id )
filename = property( lambda self: self.__filename, __set_filename )
size_bytes = property( lambda self: self.__size_bytes )
content_type = property( lambda self: self.__content_type )