Merge branch 'release/v0.11'
@@ -148,3 +148,9 @@ trans.es = apps/web_theme/locale/es/LC_MESSAGES/django.po
|
||||
trans.pt = apps/web_theme/locale/pt/LC_MESSAGES/django.po
|
||||
trans.ru = apps/web_theme/locale/ru/LC_MESSAGES/django.po
|
||||
|
||||
[mayan-edms.apps-django_gpg]
|
||||
source_file = apps/django_gpg/locale/en/LC_MESSAGES/django.po
|
||||
source_lang = en
|
||||
trans.es = apps/django_gpg/locale/es/LC_MESSAGES/django.po
|
||||
trans.pt = apps/django_gpg/locale/pt/LC_MESSAGES/django.po
|
||||
trans.ru = apps/django_gpg/locale/ru/LC_MESSAGES/django.po
|
||||
|
||||
@@ -63,7 +63,7 @@ def convert(input_filepath, output_filepath=None, cleanup_files=False, mimetype=
|
||||
mimetype = office_converter.mimetype
|
||||
|
||||
except OfficeConversionError:
|
||||
raise UnknownFileFormat('office converter exception')
|
||||
raise UnknownFileFormat('office converter exception')
|
||||
|
||||
if size:
|
||||
transformations.append(
|
||||
@@ -110,7 +110,7 @@ def get_page_count(input_filepath):
|
||||
|
||||
return backend.get_page_count(input_filepath)
|
||||
|
||||
|
||||
'''
|
||||
def get_document_dimensions(document, *args, **kwargs):
|
||||
document_filepath = create_image_cache_filename(document.checksum, *args, **kwargs)
|
||||
if os.path.exists(document_filepath):
|
||||
@@ -118,7 +118,7 @@ def get_document_dimensions(document, *args, **kwargs):
|
||||
return [int(dimension) for dimension in backend.identify_file(unicode(document_filepath), options).split()]
|
||||
else:
|
||||
return [0, 0]
|
||||
|
||||
'''
|
||||
|
||||
def get_available_transformations_choices():
|
||||
result = []
|
||||
|
||||
@@ -9,7 +9,7 @@ msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/rosarior/mayan/issues\n"
|
||||
"POT-Creation-Date: 2011-11-22 11:26-0400\n"
|
||||
"PO-Revision-Date: 2011-11-22 21:01+0000\n"
|
||||
"PO-Revision-Date: 2011-12-06 06:17+0000\n"
|
||||
"Last-Translator: rosarior <roberto.rosario.gonzalez@gmail.com>\n"
|
||||
"Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mayan-edms/team/es/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@@ -557,11 +557,11 @@ msgstr ""
|
||||
|
||||
#: literals.py:205 literals.py:206
|
||||
msgid "Photo CD"
|
||||
msgstr ""
|
||||
msgstr "Photo CD"
|
||||
|
||||
#: literals.py:207
|
||||
msgid "Page Control Language"
|
||||
msgstr ""
|
||||
msgstr "Page Control Language"
|
||||
|
||||
#: literals.py:208 literals.py:221
|
||||
msgid "Apple Macintosh QuickDraw/PICT"
|
||||
@@ -577,11 +577,11 @@ msgstr ""
|
||||
|
||||
#: literals.py:211
|
||||
msgid "Portable Document Format"
|
||||
msgstr ""
|
||||
msgstr "Formato portatil de documento"
|
||||
|
||||
#: literals.py:212
|
||||
msgid "Portable Document Archive Format"
|
||||
msgstr ""
|
||||
msgstr "Format portatil de archivo de documento"
|
||||
|
||||
#: literals.py:213
|
||||
msgid "Pentax Electronic File"
|
||||
|
||||
@@ -13,21 +13,24 @@ from converter.exceptions import (OfficeConversionError,
|
||||
CACHED_FILE_SUFFIX = u'_office_converter'
|
||||
|
||||
CONVERTER_OFFICE_FILE_MIMETYPES = [
|
||||
'application/msword',
|
||||
'application/mswrite',
|
||||
'application/mspowerpoint',
|
||||
'application/msexcel',
|
||||
'application/vnd.ms-excel',
|
||||
'application/vnd.ms-powerpoint',
|
||||
'text/plain',
|
||||
'application/vnd.oasis.opendocument.presentation',
|
||||
'application/vnd.oasis.opendocument.text',
|
||||
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||||
'application/vnd.oasis.opendocument.spreadsheet',
|
||||
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
'application/vnd.oasis.opendocument.graphics',
|
||||
u'application/msword',
|
||||
u'application/mswrite',
|
||||
u'application/mspowerpoint',
|
||||
u'application/msexcel',
|
||||
u'application/vnd.ms-excel',
|
||||
u'application/vnd.ms-powerpoint',
|
||||
u'application/vnd.oasis.opendocument.presentation',
|
||||
u'application/vnd.oasis.opendocument.text',
|
||||
u'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
||||
u'application/vnd.oasis.opendocument.spreadsheet',
|
||||
u'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
u'application/vnd.oasis.opendocument.graphics',
|
||||
u'application/vnd.ms-office',
|
||||
u'text/plain',
|
||||
u'text/rtf',
|
||||
]
|
||||
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@@ -94,20 +97,22 @@ class OfficeConverterBackendUnoconv(object):
|
||||
command.append(u'--pipe')
|
||||
command.append(u'mayan-%s' % id_generator())
|
||||
|
||||
command.append(u'--format=pdf')
|
||||
command.append(u'--output=%s' % self.output_filepath)
|
||||
command.append(u'--format')
|
||||
command.append(u'pdf')
|
||||
command.append(u'--output')
|
||||
command.append(self.output_filepath)
|
||||
command.append(self.input_filepath)
|
||||
|
||||
try:
|
||||
logger.debug('prev environment: %s' % os.environ)
|
||||
proc = subprocess.Popen(command, close_fds=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
|
||||
return_code = proc.wait()
|
||||
logger.debug('post environment: %s' % os.environ)
|
||||
logger.debug('return_code: %s' % return_code)
|
||||
|
||||
readline = proc.stderr.readline()
|
||||
logger.debug('stderr: %s' % readline)
|
||||
if return_code != 0:
|
||||
raise OfficeBackendError(proc.stderr.readline())
|
||||
raise OfficeBackendError(readline)
|
||||
except OSError, msg:
|
||||
raise OfficeBackendError(msg)
|
||||
except Exception, msg:
|
||||
logger.error('Unhandled exception: %s' % msg)
|
||||
logger.error('Unhandled exception', exc_info=msg)
|
||||
|
||||
64
apps/django_gpg/__init__.py
Normal file
@@ -0,0 +1,64 @@
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from documents.models import Document
|
||||
from navigation.api import register_links, register_top_menu, \
|
||||
register_model_list_columns, register_multi_item_links, \
|
||||
register_sidebar_template
|
||||
from main.api import register_diagnostic, register_maintenance_links
|
||||
from permissions.api import register_permission, set_namespace_title
|
||||
from project_setup.api import register_setup
|
||||
from hkp import Key as KeyServerKey
|
||||
|
||||
from django_gpg.api import Key
|
||||
|
||||
PERMISSION_DOCUMENT_VERIFY = {'namespace': 'django_gpg', 'name': 'document_verify', 'label': _(u'Verify document signatures')}
|
||||
PERMISSION_KEY_VIEW = {'namespace': 'django_gpg', 'name': 'key_view', 'label': _(u'View keys')}
|
||||
PERMISSION_KEY_DELETE = {'namespace': 'django_gpg', 'name': 'key_delete', 'label': _(u'Delete keys')}
|
||||
PERMISSION_KEYSERVER_QUERY = {'namespace': 'django_gpg', 'name': 'keyserver_query', 'label': _(u'Query keyservers')}
|
||||
PERMISSION_KEY_RECEIVE = {'namespace': 'django_gpg', 'name': 'key_receive', 'label': _(u'Import key from keyservers')}
|
||||
PERMISSION_SIGNATURE_UPLOAD = {'namespace': 'django_gpg', 'name': 'signature_upload', 'label': _(u'Upload detached signatures')}
|
||||
PERMISSION_SIGNATURE_DOWNLOAD = {'namespace': 'django_gpg', 'name': 'key_receive', 'label': _(u'Download detached signatures')}
|
||||
|
||||
# Permission setup
|
||||
set_namespace_title('django_gpg', _(u'Signatures'))
|
||||
register_permission(PERMISSION_DOCUMENT_VERIFY)
|
||||
register_permission(PERMISSION_KEY_VIEW)
|
||||
register_permission(PERMISSION_KEY_DELETE)
|
||||
register_permission(PERMISSION_KEYSERVER_QUERY)
|
||||
register_permission(PERMISSION_KEY_RECEIVE)
|
||||
register_permission(PERMISSION_SIGNATURE_UPLOAD)
|
||||
register_permission(PERMISSION_SIGNATURE_DOWNLOAD)
|
||||
|
||||
def has_embedded_signature(context):
|
||||
return context['object'].signature_state
|
||||
|
||||
def doesnt_have_detached_signature(context):
|
||||
return context['object'].has_detached_signature() == False
|
||||
|
||||
# Setup views
|
||||
private_keys = {'text': _(u'private keys'), 'view': 'key_private_list', 'args': 'object.pk', 'famfam': 'key', 'icon': 'key.png', 'permissions': [PERMISSION_KEY_VIEW]}
|
||||
public_keys = {'text': _(u'public keys'), 'view': 'key_public_list', 'args': 'object.pk', 'famfam': 'key', 'icon': 'key.png', 'permissions': [PERMISSION_KEY_VIEW]}
|
||||
key_delete = {'text': _(u'delete'), 'view': 'key_delete', 'args': ['object.fingerprint', 'object.type'], 'famfam': 'key_delete', 'permissions': [PERMISSION_KEY_DELETE]}
|
||||
key_query = {'text': _(u'query keyservers'), 'view': 'key_query', 'famfam': 'zoom', 'permissions': [PERMISSION_KEYSERVER_QUERY]}
|
||||
key_receive = {'text': _(u'import'), 'view': 'key_receive', 'args': 'object.keyid', 'famfam': 'key_add', 'keep_query': True, 'permissions': [PERMISSION_KEY_RECEIVE]}
|
||||
document_signature_upload = {'text': _(u'upload signature'), 'view': 'document_signature_upload', 'args': 'object.pk', 'famfam': 'pencil_add', 'permissions': [PERMISSION_SIGNATURE_UPLOAD], 'conditional_disable': has_embedded_signature}
|
||||
document_signature_download = {'text': _(u'download signature'), 'view': 'document_signature_download', 'args': 'object.pk', 'famfam': 'disk', 'permissions': [PERMISSION_SIGNATURE_DOWNLOAD], 'conditional_disable': doesnt_have_detached_signature}
|
||||
key_setup = {'text': _(u'key management'), 'view': 'key_public_list', 'args': 'object.pk', 'famfam': 'key', 'icon': 'key.png', 'permissions': [PERMISSION_KEY_VIEW]}
|
||||
|
||||
# Document views
|
||||
document_verify = {'text': _(u'signatures'), 'view': 'document_verify', 'args': 'object.pk', 'famfam': 'text_signature', 'permissions': [PERMISSION_DOCUMENT_VERIFY]}
|
||||
|
||||
register_links(Document, [document_verify], menu_name='form_header')
|
||||
|
||||
register_links(['document_verify', 'document_signature_upload', 'document_signature_download'], [document_signature_upload, document_signature_download], menu_name='sidebar')
|
||||
|
||||
#register_links(['key_delete', 'key_private_list', 'key_public_list', 'key_query'], [private_keys, public_keys, key_query], menu_name='sidebar')
|
||||
register_links(['key_delete', 'key_public_list', 'key_query'], [public_keys, key_query], menu_name='sidebar')
|
||||
|
||||
register_links(Key, [key_delete])
|
||||
register_links(KeyServerKey, [key_receive])
|
||||
|
||||
register_setup(key_setup)
|
||||
|
||||
|
||||
|
||||
343
apps/django_gpg/api.py
Normal file
@@ -0,0 +1,343 @@
|
||||
import types
|
||||
from StringIO import StringIO
|
||||
from pickle import dumps
|
||||
import logging
|
||||
import tempfile
|
||||
import os
|
||||
|
||||
from django.core.files.base import File
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.utils.http import urlquote_plus
|
||||
|
||||
from hkp import KeyServer
|
||||
import gnupg
|
||||
|
||||
from django_gpg.exceptions import (GPGVerificationError, GPGSigningError,
|
||||
GPGDecryptionError, KeyDeleteError, KeyGenerationError,
|
||||
KeyFetchingError, KeyDoesNotExist, KeyImportError)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
KEY_TYPES = {
|
||||
'pub': _(u'Public'),
|
||||
'sec': _(u'Secret'),
|
||||
}
|
||||
|
||||
KEY_CLASS_RSA = 'RSA'
|
||||
KEY_CLASS_DSA = 'DSA'
|
||||
KEY_CLASS_ELG = 'ELG-E'
|
||||
|
||||
KEY_PRIMARY_CLASSES = (
|
||||
((KEY_CLASS_RSA), _(u'RSA')),
|
||||
((KEY_CLASS_DSA), _(u'DSA')),
|
||||
)
|
||||
|
||||
KEY_SECONDARY_CLASSES = (
|
||||
((KEY_CLASS_RSA), _(u'RSA')),
|
||||
((KEY_CLASS_ELG), _(u'Elgamal')),
|
||||
)
|
||||
|
||||
KEYSERVER_DEFAULT_PORT = 11371
|
||||
|
||||
SIGNATURE_STATE_BAD = 'signature bad'
|
||||
SIGNATURE_STATE_NONE = None
|
||||
SIGNATURE_STATE_ERROR = 'signature error'
|
||||
SIGNATURE_STATE_NO_PUBLIC_KEY = 'no public key'
|
||||
SIGNATURE_STATE_GOOD = 'signature good'
|
||||
SIGNATURE_STATE_VALID = 'signature valid'
|
||||
|
||||
SIGNATURE_STATES = {
|
||||
SIGNATURE_STATE_BAD: {
|
||||
'text': _(u'Bad signature.'),
|
||||
'icon': 'cross.png'
|
||||
},
|
||||
SIGNATURE_STATE_NONE: {
|
||||
'text': _(u'Document not signed or invalid signature.'),
|
||||
'icon': 'cross.png'
|
||||
},
|
||||
SIGNATURE_STATE_ERROR: {
|
||||
'text': _(u'Signature error.'),
|
||||
'icon': 'cross.png'
|
||||
},
|
||||
SIGNATURE_STATE_NO_PUBLIC_KEY: {
|
||||
'text': _(u'Document is signed but no public key is available for verification.'),
|
||||
'icon': 'user_silhouette.png'
|
||||
},
|
||||
SIGNATURE_STATE_GOOD: {
|
||||
'text': _(u'Document is signed, and signature is good.'),
|
||||
'icon': 'document_signature.png'
|
||||
},
|
||||
SIGNATURE_STATE_VALID: {
|
||||
'text': _(u'Document is signed with a valid signature.'),
|
||||
'icon': 'document_signature.png'
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
class Key(object):
|
||||
@staticmethod
|
||||
def get_key_id(fingerprint):
|
||||
return fingerprint[-16:]
|
||||
|
||||
@classmethod
|
||||
def get_all(cls, gpg, secret=False, exclude=None):
|
||||
result = []
|
||||
keys = gpg.gpg.list_keys(secret=secret)
|
||||
if exclude:
|
||||
excluded_id = exclude.key_id
|
||||
else:
|
||||
excluded_id = u''
|
||||
for key in keys:
|
||||
if not key['keyid'] in excluded_id:
|
||||
key_instance = Key(
|
||||
fingerprint=key['fingerprint'],
|
||||
uids=key['uids'],
|
||||
type=key['type'],
|
||||
data=gpg.gpg.export_keys([key['keyid']], secret=secret)
|
||||
)
|
||||
result.append(key_instance)
|
||||
|
||||
return result
|
||||
|
||||
@classmethod
|
||||
def get(cls, gpg, key_id, secret=False, search_keyservers=False):
|
||||
if len(key_id) > 16:
|
||||
# key_id is a fingerprint
|
||||
key_id = Key.get_key_id(key_id)
|
||||
|
||||
keys = gpg.gpg.list_keys(secret=secret)
|
||||
key = next((key for key in keys if key['keyid'] == key_id), None)
|
||||
if not key:
|
||||
if search_keyservers and secret==False:
|
||||
try:
|
||||
gpg.receive_key(key_id)
|
||||
return Key(gpg, key_id)
|
||||
except KeyFetchingError:
|
||||
raise KeyDoesNotExist
|
||||
else:
|
||||
raise KeyDoesNotExist
|
||||
|
||||
key_instance = Key(
|
||||
fingerprint=key['fingerprint'],
|
||||
uids=key['uids'],
|
||||
type=key['type'],
|
||||
data=gpg.gpg.export_keys([key['keyid']], secret=secret)
|
||||
)
|
||||
|
||||
return key_instance
|
||||
|
||||
def __init__(self, fingerprint, uids, type, data):
|
||||
self.fingerprint = fingerprint
|
||||
self.uids = uids
|
||||
self.type = type
|
||||
self.data = data
|
||||
|
||||
@property
|
||||
def key_id(self):
|
||||
return Key.get_key_id(self.fingerprint)
|
||||
|
||||
@property
|
||||
def user_ids(self):
|
||||
return u', '.join(self.uids)
|
||||
|
||||
def __str__(self):
|
||||
return '%s "%s" (%s)' % (self.key_id, self.user_ids, KEY_TYPES.get(self.type, _(u'unknown')))
|
||||
|
||||
def __unicode__(self):
|
||||
return unicode(self.__str__())
|
||||
|
||||
def __repr__(self):
|
||||
return self.__unicode__()
|
||||
|
||||
|
||||
class GPG(object):
|
||||
def __init__(self, binary_path=None, home=None, keyring=None, keyservers=None):
|
||||
kwargs = {}
|
||||
if binary_path:
|
||||
kwargs['gpgbinary'] = binary_path
|
||||
|
||||
if home:
|
||||
kwargs['gnupghome'] = home
|
||||
|
||||
if keyring:
|
||||
kwargs['keyring'] = keyring
|
||||
|
||||
self.keyservers = keyservers
|
||||
|
||||
self.gpg = gnupg.GPG(**kwargs)
|
||||
|
||||
def verify_w_retry(self, file_input, detached_signature=None):
|
||||
if isinstance(file_input, types.StringTypes):
|
||||
input_descriptor = open(file_input, 'rb')
|
||||
elif isinstance(file_input, types.FileType) or isinstance(file_input, File):
|
||||
input_descriptor = file_input
|
||||
elif issubclass(file_input.__class__, StringIO):
|
||||
input_descriptor = file_input
|
||||
else:
|
||||
raise ValueError('Invalid file_input argument type')
|
||||
|
||||
try:
|
||||
verify = self.verify_file(input_descriptor, detached_signature)
|
||||
if verify.status == 'no public key':
|
||||
# Try to fetch the public key from the keyservers
|
||||
try:
|
||||
self.receive_key(verify.key_id)
|
||||
return self.verify_w_retry(file_input, detached_signature)
|
||||
except KeyFetchingError:
|
||||
return verify
|
||||
else:
|
||||
return verify
|
||||
except IOError:
|
||||
return False
|
||||
|
||||
def verify_file(self, file_input, detached_signature=None):
|
||||
"""
|
||||
Verify the signature of a file.
|
||||
"""
|
||||
if isinstance(file_input, types.StringTypes):
|
||||
descriptor = open(file_input, 'rb')
|
||||
elif isinstance(file_input, types.FileType) or isinstance(file_input, File) or isinstance(file_input, StringIO):
|
||||
descriptor = file_input
|
||||
else:
|
||||
raise ValueError('Invalid file_input argument type')
|
||||
|
||||
if detached_signature:
|
||||
# Save the original data and invert the argument order
|
||||
# Signature first, file second
|
||||
file_descriptor, filename = tempfile.mkstemp(prefix='django_gpg')
|
||||
file_data = file_input.read()
|
||||
file_input.close()
|
||||
os.write(file_descriptor, file_data)
|
||||
os.close(file_descriptor)
|
||||
verify = self.gpg.verify_file(detached_signature, data_filename=filename)
|
||||
else:
|
||||
verify = self.gpg.verify_file(descriptor)
|
||||
descriptor.close()
|
||||
|
||||
if verify:
|
||||
return verify
|
||||
#elif getattr(verify, 'status', None) == 'no public key':
|
||||
# # Exception to the rule, to be able to query the keyservers
|
||||
# return verify
|
||||
else:
|
||||
raise GPGVerificationError()
|
||||
|
||||
def verify(self, data):
|
||||
# TODO: try to merge with verify_file
|
||||
verify = self.gpg.verify(data)
|
||||
|
||||
if verify:
|
||||
return verify
|
||||
else:
|
||||
raise GPGVerificationError(verify.status)
|
||||
|
||||
def sign_file(self, file_input, key=None, destination=None, key_id=None, passphrase=None, clearsign=False):
|
||||
"""
|
||||
Signs a filename, storing the signature and the original file
|
||||
in the destination filename provided (the destination file is
|
||||
overrided if it already exists), if no destination file name is
|
||||
provided the signature is returned.
|
||||
"""
|
||||
kwargs = {}
|
||||
kwargs['clearsign'] = clearsign
|
||||
|
||||
if key_id:
|
||||
kwargs['keyid'] = key_id
|
||||
|
||||
if key:
|
||||
kwargs['keyid'] = key.key_id
|
||||
|
||||
if passphrase:
|
||||
kwargs['passphrase'] = passphrase
|
||||
|
||||
if isinstance(file_input, types.StringTypes):
|
||||
input_descriptor = open(file_input, 'rb')
|
||||
elif isinstance(file_input, types.FileType) or isinstance(file_input, File):
|
||||
input_descriptor = file_input
|
||||
elif issubclass(file_input.__class__, StringIO):
|
||||
input_descriptor = file_input
|
||||
else:
|
||||
raise ValueError('Invalid file_input argument type')
|
||||
|
||||
if destination:
|
||||
output_descriptor = open(destination, 'wb')
|
||||
|
||||
signed_data = self.gpg.sign_file(input_descriptor, **kwargs)
|
||||
if not signed_data.fingerprint:
|
||||
raise GPGSigningError('Unable to sign file')
|
||||
|
||||
if destination:
|
||||
output_descriptor.write(signed_data.data)
|
||||
|
||||
input_descriptor.close()
|
||||
|
||||
if destination:
|
||||
output_descriptor.close()
|
||||
|
||||
if not destination:
|
||||
return signed_data
|
||||
|
||||
def decrypt_file(self, file_input):
|
||||
if isinstance(file_input, types.StringTypes):
|
||||
input_descriptor = open(file_input, 'rb')
|
||||
elif isinstance(file_input, types.FileType) or isinstance(file_input, File) or isinstance(file_input, StringIO):
|
||||
input_descriptor = file_input
|
||||
else:
|
||||
raise ValueError('Invalid file_input argument type')
|
||||
|
||||
result = self.gpg.decrypt_file(input_descriptor)
|
||||
input_descriptor.close()
|
||||
if not result.status:
|
||||
raise GPGDecryptionError('Unable to decrypt file')
|
||||
|
||||
return result
|
||||
|
||||
def create_key(self, *args, **kwargs):
|
||||
if kwargs.get('passphrase') == u'':
|
||||
kwargs.pop('passphrase')
|
||||
|
||||
input_data = self.gpg.gen_key_input(**kwargs)
|
||||
key = self.gpg.gen_key(input_data)
|
||||
if not key:
|
||||
raise KeyGenerationError('Unable to generate key')
|
||||
|
||||
return Key.get(self, key.fingerprint)
|
||||
|
||||
def delete_key(self, key):
|
||||
status = self.gpg.delete_keys(key.fingerprint, key.type == 'sec').status
|
||||
if status == 'Must delete secret key first':
|
||||
self.delete_key(Key.get(self, key.fingerprint, secret=True))
|
||||
self.delete_key(key)
|
||||
elif status != 'ok':
|
||||
raise KeyDeleteError('Unable to delete key')
|
||||
|
||||
def receive_key(self, key_id):
|
||||
for keyserver in self.keyservers:
|
||||
import_result = self.gpg.recv_keys(keyserver, key_id)
|
||||
if import_result:
|
||||
return Key.get(self, import_result.fingerprints[0], secret=False)
|
||||
|
||||
raise KeyFetchingError
|
||||
|
||||
def query(self, term):
|
||||
results = {}
|
||||
for keyserver in self.keyservers:
|
||||
url = u'http://%s' % keyserver
|
||||
server = KeyServer(url)
|
||||
try:
|
||||
key_list = server.search(term)
|
||||
for key in key_list:
|
||||
results[key.keyid] = key
|
||||
except:
|
||||
pass
|
||||
|
||||
return results.values()
|
||||
|
||||
def import_key(self, key_data):
|
||||
import_result = self.gpg.import_keys(key_data)
|
||||
logger.debug('import_result: %s' % import_result)
|
||||
|
||||
if import_result:
|
||||
return Key.get(self, import_result.fingerprints[0], secret=False)
|
||||
|
||||
raise KeyImportError
|
||||
0
apps/django_gpg/conf/__init__.py
Normal file
15
apps/django_gpg/conf/settings.py
Normal file
@@ -0,0 +1,15 @@
|
||||
'''
|
||||
Configuration options for the django_gpg app
|
||||
'''
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from smart_settings.api import register_settings
|
||||
|
||||
register_settings(
|
||||
namespace=u'django_gpg',
|
||||
module=u'django_gpg.conf.settings',
|
||||
settings=[
|
||||
{'name': u'KEYSERVERS', 'global_name': u'SIGNATURES_KEYSERVERS', 'default': ['pool.sks-keyservers.net'], 'description': _(u'List of keyservers to be queried for unknown keys.')},
|
||||
]
|
||||
)
|
||||
34
apps/django_gpg/exceptions.py
Normal file
@@ -0,0 +1,34 @@
|
||||
class GPGException(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class GPGVerificationError(GPGException):
|
||||
pass
|
||||
|
||||
|
||||
class GPGSigningError(GPGException):
|
||||
pass
|
||||
|
||||
|
||||
class GPGDecryptionError(GPGException):
|
||||
pass
|
||||
|
||||
|
||||
class KeyDeleteError(GPGException):
|
||||
pass
|
||||
|
||||
|
||||
class KeyGenerationError(GPGException):
|
||||
pass
|
||||
|
||||
|
||||
class KeyFetchingError(GPGException):
|
||||
pass
|
||||
|
||||
|
||||
class KeyDoesNotExist(GPGException):
|
||||
pass
|
||||
|
||||
|
||||
class KeyImportError(GPGException):
|
||||
pass
|
||||
19
apps/django_gpg/forms.py
Normal file
@@ -0,0 +1,19 @@
|
||||
from django import forms
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.utils.translation import ugettext
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.conf import settings
|
||||
|
||||
|
||||
class KeySearchForm(forms.Form):
|
||||
term = forms.CharField(
|
||||
label=_(u'Term'),
|
||||
help_text=_(u'Name, e-mail, key ID or key fingerprint to look for.')
|
||||
)
|
||||
|
||||
|
||||
class DetachedSignatureForm(forms.Form):
|
||||
file = forms.FileField(
|
||||
label=_(u'Signature file'),
|
||||
)
|
||||
290
apps/django_gpg/locale/en/LC_MESSAGES/django.po
Normal file
@@ -0,0 +1,290 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-12-06 02:06-0400\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"Language: \n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: __init__.py:14
|
||||
msgid "Verify document signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:15
|
||||
msgid "View keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:16
|
||||
msgid "Delete keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:17
|
||||
msgid "Query keyservers"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:18
|
||||
msgid "Import key from keyservers"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:19
|
||||
msgid "Upload detached signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:20
|
||||
msgid "Download detached signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:23
|
||||
msgid "Signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:39 views.py:67
|
||||
msgid "private keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:40 views.py:70
|
||||
msgid "public keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:41
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:42
|
||||
msgid "query keyservers"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:43
|
||||
msgid "import"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:44
|
||||
msgid "upload signature"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:45
|
||||
msgid "download signature"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:46
|
||||
msgid "key management"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:49
|
||||
msgid "signatures"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:22
|
||||
msgid "Public"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:23
|
||||
msgid "Secret"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:31 api.py:36
|
||||
msgid "RSA"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:32
|
||||
msgid "DSA"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:37
|
||||
msgid "Elgamal"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:51
|
||||
msgid "Bad signature."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:55
|
||||
msgid "Document not signed or invalid signature."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:59
|
||||
msgid "Signature error."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:63
|
||||
msgid "Document is signed but no public key is available for verification."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:67
|
||||
msgid "Document is signed, and signature is good."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:71
|
||||
msgid "Document is signed with a valid signature."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:144
|
||||
msgid "unknown"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:11
|
||||
msgid "Term"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:12
|
||||
msgid "Name, e-mail, key ID or key fingerprint to look for."
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:18
|
||||
msgid "Signature file"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:45
|
||||
#, python-format
|
||||
msgid "Key: %s, imported successfully."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:48
|
||||
#, python-format
|
||||
msgid "Unable to import key id: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:52
|
||||
msgid "Import key"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:53
|
||||
#, python-format
|
||||
msgid "Are you sure you wish to import key id: %s?"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:78
|
||||
msgid "Key ID"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:82
|
||||
msgid "Owner"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:102
|
||||
#, python-format
|
||||
msgid "Key: %s, deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:109
|
||||
msgid "Delete key"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:111
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Are you sure you wish to delete key: %s? If you try to delete a public key "
|
||||
"that is part of a public/private pair the private key will be deleted as "
|
||||
"well."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:129
|
||||
msgid "Query key server"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:142
|
||||
msgid "results"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:147
|
||||
msgid "ID"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
msgid "type"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
msgid "creation date"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:159
|
||||
msgid "disabled"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:163
|
||||
msgid "expiration date"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:167
|
||||
msgid "expired"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:171
|
||||
msgid "length"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:175
|
||||
msgid "revoked"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:180
|
||||
msgid "Identifies"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:205
|
||||
#, python-format
|
||||
msgid "Signature status: %(widget)s %(text)s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:212
|
||||
msgid "embedded"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:214
|
||||
msgid "detached"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:219
|
||||
#, python-format
|
||||
msgid "Signature ID: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:220
|
||||
#, python-format
|
||||
msgid "Signature type: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:221
|
||||
#, python-format
|
||||
msgid "Key ID: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:222
|
||||
#, python-format
|
||||
msgid "Timestamp: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:223
|
||||
#, python-format
|
||||
msgid "Signee: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:228
|
||||
#, python-format
|
||||
msgid "signature properties for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Detached signature uploaded successfully."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:259
|
||||
#, python-format
|
||||
msgid "Upload detached signature for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: conf/settings.py:13
|
||||
msgid "List of keyservers to be queried for unknown keys."
|
||||
msgstr ""
|
||||
BIN
apps/django_gpg/locale/es/LC_MESSAGES/django.mo
Normal file
302
apps/django_gpg/locale/es/LC_MESSAGES/django.po
Normal file
@@ -0,0 +1,302 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
# Roberto Rosario <roberto.rosario.gonzalez@gmail.com>, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: http://github.com/rosarior/mayan/issues\n"
|
||||
"POT-Creation-Date: 2011-12-06 02:06-0400\n"
|
||||
"PO-Revision-Date: 2011-12-06 06:14+0000\n"
|
||||
"Last-Translator: rosarior <roberto.rosario.gonzalez@gmail.com>\n"
|
||||
"Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mayan-edms/team/es/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: es\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: __init__.py:14
|
||||
msgid "Verify document signatures"
|
||||
msgstr "Verificar las firmas de documentos"
|
||||
|
||||
#: __init__.py:15
|
||||
msgid "View keys"
|
||||
msgstr "Ver llaves"
|
||||
|
||||
#: __init__.py:16
|
||||
msgid "Delete keys"
|
||||
msgstr "Borrar llaves"
|
||||
|
||||
#: __init__.py:17
|
||||
msgid "Query keyservers"
|
||||
msgstr "Hacer búsquedas en servidores de llaves"
|
||||
|
||||
#: __init__.py:18
|
||||
msgid "Import key from keyservers"
|
||||
msgstr "Importar llaves de los servidores de llaves"
|
||||
|
||||
#: __init__.py:19
|
||||
msgid "Upload detached signatures"
|
||||
msgstr "Subir una firma a parte"
|
||||
|
||||
#: __init__.py:20
|
||||
msgid "Download detached signatures"
|
||||
msgstr "Descargar la fima"
|
||||
|
||||
#: __init__.py:23
|
||||
msgid "Signatures"
|
||||
msgstr "Firmas"
|
||||
|
||||
#: __init__.py:39 views.py:67
|
||||
msgid "private keys"
|
||||
msgstr "llaves privadas"
|
||||
|
||||
#: __init__.py:40 views.py:70
|
||||
msgid "public keys"
|
||||
msgstr "llaves públicas"
|
||||
|
||||
#: __init__.py:41
|
||||
msgid "delete"
|
||||
msgstr "borrar"
|
||||
|
||||
#: __init__.py:42
|
||||
msgid "query keyservers"
|
||||
msgstr "consultar servidor de llaves"
|
||||
|
||||
#: __init__.py:43
|
||||
msgid "import"
|
||||
msgstr "importar"
|
||||
|
||||
#: __init__.py:44
|
||||
msgid "upload signature"
|
||||
msgstr "subir firma"
|
||||
|
||||
#: __init__.py:45
|
||||
msgid "download signature"
|
||||
msgstr "descargar firma"
|
||||
|
||||
#: __init__.py:46
|
||||
msgid "key management"
|
||||
msgstr "manejo de llaves"
|
||||
|
||||
#: __init__.py:49
|
||||
msgid "signatures"
|
||||
msgstr "firmas"
|
||||
|
||||
#: api.py:22
|
||||
msgid "Public"
|
||||
msgstr "Pública"
|
||||
|
||||
#: api.py:23
|
||||
msgid "Secret"
|
||||
msgstr "Secreta"
|
||||
|
||||
#: api.py:31 api.py:36
|
||||
msgid "RSA"
|
||||
msgstr "RSA"
|
||||
|
||||
#: api.py:32
|
||||
msgid "DSA"
|
||||
msgstr "DSA"
|
||||
|
||||
#: api.py:37
|
||||
msgid "Elgamal"
|
||||
msgstr "Elgamal"
|
||||
|
||||
#: api.py:51
|
||||
msgid "Bad signature."
|
||||
msgstr "Firma invalida."
|
||||
|
||||
#: api.py:55
|
||||
msgid "Document not signed or invalid signature."
|
||||
msgstr "Documento no firmado o firma invalida."
|
||||
|
||||
#: api.py:59
|
||||
msgid "Signature error."
|
||||
msgstr "Error de firma."
|
||||
|
||||
#: api.py:63
|
||||
msgid "Document is signed but no public key is available for verification."
|
||||
msgstr ""
|
||||
"El document ha sido firmado pero no hay llave pública disponible para "
|
||||
"verificación."
|
||||
|
||||
#: api.py:67
|
||||
msgid "Document is signed, and signature is good."
|
||||
msgstr "El document ha sido firmado y la firma esta es buen estado."
|
||||
|
||||
#: api.py:71
|
||||
msgid "Document is signed with a valid signature."
|
||||
msgstr "El document ha sido firmado y la firma ha sido validada."
|
||||
|
||||
#: api.py:144
|
||||
msgid "unknown"
|
||||
msgstr "desconocida"
|
||||
|
||||
#: forms.py:11
|
||||
msgid "Term"
|
||||
msgstr "Término"
|
||||
|
||||
#: forms.py:12
|
||||
msgid "Name, e-mail, key ID or key fingerprint to look for."
|
||||
msgstr ""
|
||||
"Nombre, dirección de correo electrónico, identificador de llave or huella "
|
||||
"digital de llave a buscar."
|
||||
|
||||
#: forms.py:18
|
||||
msgid "Signature file"
|
||||
msgstr "Archivo de firma"
|
||||
|
||||
#: views.py:45
|
||||
#, python-format
|
||||
msgid "Key: %s, imported successfully."
|
||||
msgstr "Llave: %s, importada exitosamente."
|
||||
|
||||
#: views.py:48
|
||||
#, python-format
|
||||
msgid "Unable to import key id: %s"
|
||||
msgstr "No se pudo importa la llave: %s"
|
||||
|
||||
#: views.py:52
|
||||
msgid "Import key"
|
||||
msgstr "Importar llave"
|
||||
|
||||
#: views.py:53
|
||||
#, python-format
|
||||
msgid "Are you sure you wish to import key id: %s?"
|
||||
msgstr "¿Esta seguro que desea importar la llave: %s?"
|
||||
|
||||
#: views.py:78
|
||||
msgid "Key ID"
|
||||
msgstr "Identificador de llave"
|
||||
|
||||
#: views.py:82
|
||||
msgid "Owner"
|
||||
msgstr "Dueño"
|
||||
|
||||
#: views.py:102
|
||||
#, python-format
|
||||
msgid "Key: %s, deleted successfully."
|
||||
msgstr "Llave: %s, borrada exitosamente."
|
||||
|
||||
#: views.py:109
|
||||
msgid "Delete key"
|
||||
msgstr "Borrar llave"
|
||||
|
||||
#: views.py:111
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Are you sure you wish to delete key: %s? If you try to delete a public key "
|
||||
"that is part of a public/private pair the private key will be deleted as "
|
||||
"well."
|
||||
msgstr ""
|
||||
"¿Esta seguro que desea borrar la llave: %s? Si trata de borrar una llave "
|
||||
"pública que es parte de un par público/privado la llave privada será borrada"
|
||||
" también."
|
||||
|
||||
#: views.py:129
|
||||
msgid "Query key server"
|
||||
msgstr "Consultar servidor de llaves"
|
||||
|
||||
#: views.py:142
|
||||
msgid "results"
|
||||
msgstr "resultados"
|
||||
|
||||
#: views.py:147
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
#: views.py:151
|
||||
msgid "type"
|
||||
msgstr "tipo"
|
||||
|
||||
#: views.py:155
|
||||
msgid "creation date"
|
||||
msgstr "fecha de creación"
|
||||
|
||||
#: views.py:159
|
||||
msgid "disabled"
|
||||
msgstr "desactivada"
|
||||
|
||||
#: views.py:163
|
||||
msgid "expiration date"
|
||||
msgstr "fecha de expiración"
|
||||
|
||||
#: views.py:167
|
||||
msgid "expired"
|
||||
msgstr "expirada"
|
||||
|
||||
#: views.py:171
|
||||
msgid "length"
|
||||
msgstr "tamaño"
|
||||
|
||||
#: views.py:175
|
||||
msgid "revoked"
|
||||
msgstr "revocada"
|
||||
|
||||
#: views.py:180
|
||||
msgid "Identifies"
|
||||
msgstr "Identidades"
|
||||
|
||||
#: views.py:205
|
||||
#, python-format
|
||||
msgid "Signature status: %(widget)s %(text)s"
|
||||
msgstr "Estado de la firma: %(widget)s %(text)s"
|
||||
|
||||
#: views.py:212
|
||||
msgid "embedded"
|
||||
msgstr "integrada"
|
||||
|
||||
#: views.py:214
|
||||
msgid "detached"
|
||||
msgstr "a parte"
|
||||
|
||||
#: views.py:219
|
||||
#, python-format
|
||||
msgid "Signature ID: %s"
|
||||
msgstr "ID de la firma: %s"
|
||||
|
||||
#: views.py:220
|
||||
#, python-format
|
||||
msgid "Signature type: %s"
|
||||
msgstr "Tipo de firma: %s"
|
||||
|
||||
#: views.py:221
|
||||
#, python-format
|
||||
msgid "Key ID: %s"
|
||||
msgstr "ID de la llave: %s"
|
||||
|
||||
#: views.py:222
|
||||
#, python-format
|
||||
msgid "Timestamp: %s"
|
||||
msgstr "Fecha y hora: %s"
|
||||
|
||||
#: views.py:223
|
||||
#, python-format
|
||||
msgid "Signee: %s"
|
||||
msgstr "Firmantes: %s"
|
||||
|
||||
#: views.py:228
|
||||
#, python-format
|
||||
msgid "signature properties for: %s"
|
||||
msgstr "propiedades de firma para: %s"
|
||||
|
||||
#: views.py:250
|
||||
msgid "Detached signature uploaded successfully."
|
||||
msgstr "El archivo de firma fue subido exitosamente."
|
||||
|
||||
#: views.py:259
|
||||
#, python-format
|
||||
msgid "Upload detached signature for: %s"
|
||||
msgstr "Subir firma a parte para: %s"
|
||||
|
||||
#: conf/settings.py:13
|
||||
msgid "List of keyservers to be queried for unknown keys."
|
||||
msgstr ""
|
||||
"Lista de servidores de llaves a ser utilizados para buscar llaves "
|
||||
"desconocidas."
|
||||
|
||||
|
||||
BIN
apps/django_gpg/locale/pt/LC_MESSAGES/django.mo
Normal file
291
apps/django_gpg/locale/pt/LC_MESSAGES/django.po
Normal file
@@ -0,0 +1,291 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-12-06 02:06-0400\n"
|
||||
"PO-Revision-Date: 2011-12-05 17:43+0000\n"
|
||||
"Last-Translator: rosarior <roberto.rosario.gonzalez@gmail.com>\n"
|
||||
"Language-Team: Portuguese (http://www.transifex.net/projects/p/mayan-edms/"
|
||||
"team/pt/)\n"
|
||||
"Language: pt\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
|
||||
#: __init__.py:14
|
||||
msgid "Verify document signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:15
|
||||
msgid "View keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:16
|
||||
msgid "Delete keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:17
|
||||
msgid "Query keyservers"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:18
|
||||
msgid "Import key from keyservers"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:19
|
||||
msgid "Upload detached signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:20
|
||||
msgid "Download detached signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:23
|
||||
msgid "Signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:39 views.py:67
|
||||
msgid "private keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:40 views.py:70
|
||||
msgid "public keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:41
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:42
|
||||
msgid "query keyservers"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:43
|
||||
msgid "import"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:44
|
||||
msgid "upload signature"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:45
|
||||
msgid "download signature"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:46
|
||||
msgid "key management"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:49
|
||||
msgid "signatures"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:22
|
||||
msgid "Public"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:23
|
||||
msgid "Secret"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:31 api.py:36
|
||||
msgid "RSA"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:32
|
||||
msgid "DSA"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:37
|
||||
msgid "Elgamal"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:51
|
||||
msgid "Bad signature."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:55
|
||||
msgid "Document not signed or invalid signature."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:59
|
||||
msgid "Signature error."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:63
|
||||
msgid "Document is signed but no public key is available for verification."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:67
|
||||
msgid "Document is signed, and signature is good."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:71
|
||||
msgid "Document is signed with a valid signature."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:144
|
||||
msgid "unknown"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:11
|
||||
msgid "Term"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:12
|
||||
msgid "Name, e-mail, key ID or key fingerprint to look for."
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:18
|
||||
msgid "Signature file"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:45
|
||||
#, python-format
|
||||
msgid "Key: %s, imported successfully."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:48
|
||||
#, python-format
|
||||
msgid "Unable to import key id: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:52
|
||||
msgid "Import key"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:53
|
||||
#, python-format
|
||||
msgid "Are you sure you wish to import key id: %s?"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:78
|
||||
msgid "Key ID"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:82
|
||||
msgid "Owner"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:102
|
||||
#, python-format
|
||||
msgid "Key: %s, deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:109
|
||||
msgid "Delete key"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:111
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Are you sure you wish to delete key: %s? If you try to delete a public key "
|
||||
"that is part of a public/private pair the private key will be deleted as "
|
||||
"well."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:129
|
||||
msgid "Query key server"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:142
|
||||
msgid "results"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:147
|
||||
msgid "ID"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
msgid "type"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
msgid "creation date"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:159
|
||||
msgid "disabled"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:163
|
||||
msgid "expiration date"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:167
|
||||
msgid "expired"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:171
|
||||
msgid "length"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:175
|
||||
msgid "revoked"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:180
|
||||
msgid "Identifies"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:205
|
||||
#, python-format
|
||||
msgid "Signature status: %(widget)s %(text)s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:212
|
||||
msgid "embedded"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:214
|
||||
msgid "detached"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:219
|
||||
#, python-format
|
||||
msgid "Signature ID: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:220
|
||||
#, python-format
|
||||
msgid "Signature type: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:221
|
||||
#, python-format
|
||||
msgid "Key ID: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:222
|
||||
#, python-format
|
||||
msgid "Timestamp: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:223
|
||||
#, python-format
|
||||
msgid "Signee: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:228
|
||||
#, python-format
|
||||
msgid "signature properties for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Detached signature uploaded successfully."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:259
|
||||
#, python-format
|
||||
msgid "Upload detached signature for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: conf/settings.py:13
|
||||
msgid "List of keyservers to be queried for unknown keys."
|
||||
msgstr ""
|
||||
BIN
apps/django_gpg/locale/ru/LC_MESSAGES/django.mo
Normal file
292
apps/django_gpg/locale/ru/LC_MESSAGES/django.po
Normal file
@@ -0,0 +1,292 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
# Translators:
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-12-06 02:06-0400\n"
|
||||
"PO-Revision-Date: 2011-12-05 17:43+0000\n"
|
||||
"Last-Translator: rosarior <roberto.rosario.gonzalez@gmail.com>\n"
|
||||
"Language-Team: Russian (http://www.transifex.net/projects/p/mayan-edms/team/"
|
||||
"ru/)\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
|
||||
|
||||
#: __init__.py:14
|
||||
msgid "Verify document signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:15
|
||||
msgid "View keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:16
|
||||
msgid "Delete keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:17
|
||||
msgid "Query keyservers"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:18
|
||||
msgid "Import key from keyservers"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:19
|
||||
msgid "Upload detached signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:20
|
||||
msgid "Download detached signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:23
|
||||
msgid "Signatures"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:39 views.py:67
|
||||
msgid "private keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:40 views.py:70
|
||||
msgid "public keys"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:41
|
||||
msgid "delete"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:42
|
||||
msgid "query keyservers"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:43
|
||||
msgid "import"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:44
|
||||
msgid "upload signature"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:45
|
||||
msgid "download signature"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:46
|
||||
msgid "key management"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:49
|
||||
msgid "signatures"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:22
|
||||
msgid "Public"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:23
|
||||
msgid "Secret"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:31 api.py:36
|
||||
msgid "RSA"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:32
|
||||
msgid "DSA"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:37
|
||||
msgid "Elgamal"
|
||||
msgstr ""
|
||||
|
||||
#: api.py:51
|
||||
msgid "Bad signature."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:55
|
||||
msgid "Document not signed or invalid signature."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:59
|
||||
msgid "Signature error."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:63
|
||||
msgid "Document is signed but no public key is available for verification."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:67
|
||||
msgid "Document is signed, and signature is good."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:71
|
||||
msgid "Document is signed with a valid signature."
|
||||
msgstr ""
|
||||
|
||||
#: api.py:144
|
||||
msgid "unknown"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:11
|
||||
msgid "Term"
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:12
|
||||
msgid "Name, e-mail, key ID or key fingerprint to look for."
|
||||
msgstr ""
|
||||
|
||||
#: forms.py:18
|
||||
msgid "Signature file"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:45
|
||||
#, python-format
|
||||
msgid "Key: %s, imported successfully."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:48
|
||||
#, python-format
|
||||
msgid "Unable to import key id: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:52
|
||||
msgid "Import key"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:53
|
||||
#, python-format
|
||||
msgid "Are you sure you wish to import key id: %s?"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:78
|
||||
msgid "Key ID"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:82
|
||||
msgid "Owner"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:102
|
||||
#, python-format
|
||||
msgid "Key: %s, deleted successfully."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:109
|
||||
msgid "Delete key"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:111
|
||||
#, python-format
|
||||
msgid ""
|
||||
"Are you sure you wish to delete key: %s? If you try to delete a public key "
|
||||
"that is part of a public/private pair the private key will be deleted as "
|
||||
"well."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:129
|
||||
msgid "Query key server"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:142
|
||||
msgid "results"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:147
|
||||
msgid "ID"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:151
|
||||
msgid "type"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:155
|
||||
msgid "creation date"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:159
|
||||
msgid "disabled"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:163
|
||||
msgid "expiration date"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:167
|
||||
msgid "expired"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:171
|
||||
msgid "length"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:175
|
||||
msgid "revoked"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:180
|
||||
msgid "Identifies"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:205
|
||||
#, python-format
|
||||
msgid "Signature status: %(widget)s %(text)s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:212
|
||||
msgid "embedded"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:214
|
||||
msgid "detached"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:219
|
||||
#, python-format
|
||||
msgid "Signature ID: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:220
|
||||
#, python-format
|
||||
msgid "Signature type: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:221
|
||||
#, python-format
|
||||
msgid "Key ID: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:222
|
||||
#, python-format
|
||||
msgid "Timestamp: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:223
|
||||
#, python-format
|
||||
msgid "Signee: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:228
|
||||
#, python-format
|
||||
msgid "signature properties for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: views.py:250
|
||||
msgid "Detached signature uploaded successfully."
|
||||
msgstr ""
|
||||
|
||||
#: views.py:259
|
||||
#, python-format
|
||||
msgid "Upload detached signature for: %s"
|
||||
msgstr ""
|
||||
|
||||
#: conf/settings.py:13
|
||||
msgid "List of keyservers to be queried for unknown keys."
|
||||
msgstr ""
|
||||
1
apps/django_gpg/models.py
Normal file
@@ -0,0 +1 @@
|
||||
|
||||
4
apps/django_gpg/runtime.py
Normal file
@@ -0,0 +1,4 @@
|
||||
from django_gpg.api import GPG
|
||||
from django_gpg.conf.settings import KEYSERVERS
|
||||
|
||||
gpg = GPG(keyservers=KEYSERVERS)
|
||||
BIN
apps/django_gpg/static/images/icons/cross.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
BIN
apps/django_gpg/static/images/icons/document_signature.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
apps/django_gpg/static/images/icons/key.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
apps/django_gpg/static/images/icons/key_add.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
apps/django_gpg/static/images/icons/key_delete.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
apps/django_gpg/static/images/icons/user_silhouette.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
12
apps/django_gpg/urls.py
Normal file
@@ -0,0 +1,12 @@
|
||||
from django.conf.urls.defaults import patterns, url
|
||||
|
||||
urlpatterns = patterns('django_gpg.views',
|
||||
url(r'^delete/(?P<fingerprint>.+)/(?P<key_type>\w+)/$', 'key_delete', (), 'key_delete'),
|
||||
url(r'^list/private/$', 'key_list', {'secret': True}, 'key_private_list'),
|
||||
url(r'^list/public/$', 'key_list', {'secret': False}, 'key_public_list'),
|
||||
url(r'^verify/(?P<document_pk>\d+)/$', 'document_verify', (), 'document_verify'),
|
||||
url(r'^upload/signature/(?P<document_pk>\d+)/$', 'document_signature_upload', (), 'document_signature_upload'),
|
||||
url(r'^download/signature/(?P<document_pk>\d+)/$', 'document_signature_download', (), 'document_signature_download'),
|
||||
url(r'^query/$', 'key_query', (), 'key_query'),
|
||||
url(r'^receive/(?P<key_id>.+)/$', 'key_receive', (), 'key_receive'),
|
||||
)
|
||||
285
apps/django_gpg/views.py
Normal file
@@ -0,0 +1,285 @@
|
||||
from datetime import datetime
|
||||
import logging
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import render_to_response, get_object_or_404
|
||||
from django.template import RequestContext
|
||||
from django.contrib import messages
|
||||
from django.core.urlresolvers import reverse
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.conf import settings
|
||||
from django.template.defaultfilters import force_escape
|
||||
|
||||
from documents.models import Document, RecentDocument
|
||||
from permissions.api import check_permissions
|
||||
from common.utils import pretty_size, parse_range, urlquote, \
|
||||
return_diff, encapsulate
|
||||
from filetransfers.api import serve_file
|
||||
|
||||
from django_gpg.api import Key, SIGNATURE_STATES
|
||||
from django_gpg.runtime import gpg
|
||||
from django_gpg.exceptions import GPGVerificationError, KeyFetchingError
|
||||
from django_gpg import (PERMISSION_DOCUMENT_VERIFY, PERMISSION_KEY_VIEW,
|
||||
PERMISSION_KEY_DELETE, PERMISSION_KEYSERVER_QUERY,
|
||||
PERMISSION_KEY_RECEIVE, PERMISSION_SIGNATURE_UPLOAD,
|
||||
PERMISSION_SIGNATURE_DOWNLOAD)
|
||||
from django_gpg.forms import KeySearchForm, DetachedSignatureForm
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def key_receive(request, key_id):
|
||||
check_permissions(request.user, [PERMISSION_KEY_RECEIVE])
|
||||
|
||||
post_action_redirect = None
|
||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
|
||||
next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', '/')))
|
||||
|
||||
if request.method == 'POST':
|
||||
try:
|
||||
term = request.GET.get('term')
|
||||
results = gpg.query(term)
|
||||
keys_dict = dict([(key.keyid, key) for key in results])
|
||||
key = gpg.import_key(keys_dict[key_id].key)
|
||||
messages.success(request, _(u'Key: %s, imported successfully.') % key)
|
||||
return HttpResponseRedirect(next)
|
||||
except (KeyFetchingError, KeyError, TypeError):
|
||||
messages.error(request, _(u'Unable to import key id: %s') % key_id)
|
||||
return HttpResponseRedirect(previous)
|
||||
|
||||
return render_to_response('generic_confirm.html', {
|
||||
'title': _(u'Import key'),
|
||||
'message': _(u'Are you sure you wish to import key id: %s?') % key_id,
|
||||
'form_icon': 'key_add.png',
|
||||
'next': next,
|
||||
'previous': previous,
|
||||
'submit_method': 'GET',
|
||||
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def key_list(request, secret=True):
|
||||
check_permissions(request.user, [PERMISSION_KEY_VIEW])
|
||||
|
||||
if secret:
|
||||
object_list = Key.get_all(gpg, secret=True)
|
||||
title = _(u'private keys')
|
||||
else:
|
||||
object_list = Key.get_all(gpg)
|
||||
title = _(u'public keys')
|
||||
|
||||
return render_to_response('generic_list.html', {
|
||||
'object_list': object_list,
|
||||
'title': title,
|
||||
'hide_object': True,
|
||||
'extra_columns': [
|
||||
{
|
||||
'name': _(u'Key ID'),
|
||||
'attribute': 'key_id',
|
||||
},
|
||||
{
|
||||
'name': _(u'Owner'),
|
||||
'attribute': encapsulate(lambda x: u', '.join(x.uids)),
|
||||
},
|
||||
]
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def key_delete(request, fingerprint, key_type):
|
||||
check_permissions(request.user, [PERMISSION_KEY_DELETE])
|
||||
|
||||
secret = key_type == 'sec'
|
||||
key = Key.get(gpg, fingerprint, secret=secret)
|
||||
|
||||
post_action_redirect = None
|
||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
|
||||
next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', '/')))
|
||||
|
||||
if request.method == 'POST':
|
||||
try:
|
||||
gpg.delete_key(key)
|
||||
messages.success(request, _(u'Key: %s, deleted successfully.') % fingerprint)
|
||||
return HttpResponseRedirect(next)
|
||||
except Exception, msg:
|
||||
messages.error(request, msg)
|
||||
return HttpResponseRedirect(previous)
|
||||
|
||||
return render_to_response('generic_confirm.html', {
|
||||
'title': _(u'Delete key'),
|
||||
'delete_view': True,
|
||||
'message': _(u'Are you sure you wish to delete key: %s? If you try to delete a public key that is part of a public/private pair the private key will be deleted as well.') % key,
|
||||
'form_icon': 'key_delete.png',
|
||||
'next': next,
|
||||
'previous': previous,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def key_query(request):
|
||||
check_permissions(request.user, [PERMISSION_KEYSERVER_QUERY])
|
||||
|
||||
subtemplates_list = []
|
||||
term = request.GET.get('term')
|
||||
|
||||
form = KeySearchForm(initial={'term': term})
|
||||
subtemplates_list.append(
|
||||
{
|
||||
'name': 'generic_form_subtemplate.html',
|
||||
'context': {
|
||||
'title': _(u'Query key server'),
|
||||
'form': form,
|
||||
'submit_method': 'GET',
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
if term:
|
||||
results = gpg.query(term)
|
||||
subtemplates_list.append(
|
||||
{
|
||||
'name': 'generic_list_subtemplate.html',
|
||||
'context': {
|
||||
'title': _(u'results'),
|
||||
'object_list': results,
|
||||
'hide_object': True,
|
||||
'extra_columns': [
|
||||
{
|
||||
'name': _(u'ID'),
|
||||
'attribute': 'keyid',
|
||||
},
|
||||
{
|
||||
'name': _(u'type'),
|
||||
'attribute': 'algo',
|
||||
},
|
||||
{
|
||||
'name': _(u'creation date'),
|
||||
'attribute': 'creation_date',
|
||||
},
|
||||
{
|
||||
'name': _(u'disabled'),
|
||||
'attribute': 'disabled',
|
||||
},
|
||||
{
|
||||
'name': _(u'expiration date'),
|
||||
'attribute': 'expiration_date',
|
||||
},
|
||||
{
|
||||
'name': _(u'expired'),
|
||||
'attribute': 'expired',
|
||||
},
|
||||
{
|
||||
'name': _(u'length'),
|
||||
'attribute': 'key_length',
|
||||
},
|
||||
{
|
||||
'name': _(u'revoked'),
|
||||
'attribute': 'revoked',
|
||||
},
|
||||
|
||||
{
|
||||
'name': _(u'Identifies'),
|
||||
'attribute': encapsulate(lambda x: u', '.join([identity.uid for identity in x.identities])),
|
||||
},
|
||||
]
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
return render_to_response('generic_form.html', {
|
||||
'subtemplates_list': subtemplates_list,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def document_verify(request, document_pk):
|
||||
check_permissions(request.user, [PERMISSION_DOCUMENT_VERIFY])
|
||||
document = get_object_or_404(Document, pk=document_pk)
|
||||
|
||||
RecentDocument.objects.add_document_for_user(request.user, document)
|
||||
|
||||
signature = document.verify_signature()
|
||||
|
||||
signature_state = SIGNATURE_STATES.get(getattr(signature, 'status', None))
|
||||
|
||||
widget = (u'<img style="vertical-align: middle;" src="%simages/icons/%s" />' % (settings.STATIC_URL, signature_state['icon']))
|
||||
paragraphs = [
|
||||
_(u'Signature status: %(widget)s %(text)s') % {
|
||||
'widget': mark_safe(widget),
|
||||
'text': signature_state['text']
|
||||
},
|
||||
]
|
||||
|
||||
if document.signature_state:
|
||||
signature_type = _(u'embedded')
|
||||
else:
|
||||
signature_type = _(u'detached')
|
||||
|
||||
if signature:
|
||||
paragraphs.extend(
|
||||
[
|
||||
_(u'Signature ID: %s') % signature.signature_id,
|
||||
_(u'Signature type: %s') % signature_type,
|
||||
_(u'Key ID: %s') % signature.key_id,
|
||||
_(u'Timestamp: %s') % datetime.fromtimestamp(int(signature.sig_timestamp)),
|
||||
_(u'Signee: %s') % force_escape(getattr(signature, 'username', u'')),
|
||||
]
|
||||
)
|
||||
|
||||
return render_to_response('generic_template.html', {
|
||||
'title': _(u'signature properties for: %s') % document,
|
||||
'object': document,
|
||||
'document': document,
|
||||
'paragraphs': paragraphs,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def document_signature_upload(request, document_pk):
|
||||
check_permissions(request.user, [PERMISSION_SIGNATURE_UPLOAD])
|
||||
document = get_object_or_404(Document, pk=document_pk)
|
||||
|
||||
RecentDocument.objects.add_document_for_user(request.user, document)
|
||||
|
||||
post_action_redirect = None
|
||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
|
||||
next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', '/')))
|
||||
|
||||
if request.method == 'POST':
|
||||
form = DetachedSignatureForm(request.POST, request.FILES)
|
||||
if form.is_valid():
|
||||
try:
|
||||
document.add_detached_signature(request.FILES['file'])
|
||||
messages.success(request, _(u'Detached signature uploaded successfully.'))
|
||||
return HttpResponseRedirect(next)
|
||||
except Exception, msg:
|
||||
messages.error(request, msg)
|
||||
return HttpResponseRedirect(previous)
|
||||
else:
|
||||
form = DetachedSignatureForm()
|
||||
|
||||
return render_to_response('generic_form.html', {
|
||||
'title': _(u'Upload detached signature for: %s') % document,
|
||||
'form_icon': 'key_delete.png',
|
||||
'next': next,
|
||||
'form': form,
|
||||
'previous': previous,
|
||||
'object': document,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def document_signature_download(request, document_pk):
|
||||
check_permissions(request.user, [PERMISSION_SIGNATURE_DOWNLOAD])
|
||||
document = get_object_or_404(Document, pk=document_pk)
|
||||
|
||||
try:
|
||||
if document.has_detached_signature():
|
||||
signature = document.detached_signature()
|
||||
return serve_file(
|
||||
request,
|
||||
signature,
|
||||
save_as=u'"%s.sig"' % document.filename,
|
||||
content_type=u'application/octet-stream'
|
||||
)
|
||||
except Exception, e:
|
||||
messages.error(request, e)
|
||||
return HttpResponseRedirect(request.META['HTTP_REFERER'])
|
||||
|
||||
return HttpResponseRedirect(request.META['HTTP_REFERER'])
|
||||
@@ -15,7 +15,7 @@ from document_indexing.filesystem import fs_create_index_directory, \
|
||||
fs_create_document_link, fs_delete_document_link, \
|
||||
fs_delete_index_directory, fs_delete_directory_recusive
|
||||
from document_indexing.conf.settings import SLUGIFY_PATHS
|
||||
from document_indexing.os_agnostic import assemble_document_filename
|
||||
from document_indexing.os_specifics import assemble_suffixed_filename
|
||||
|
||||
if SLUGIFY_PATHS == False:
|
||||
# Do not slugify path or filenames and extensions
|
||||
@@ -127,13 +127,14 @@ def do_rebuild_all_indexes():
|
||||
|
||||
# Internal functions
|
||||
def find_lowest_available_suffix(index_instance, document):
|
||||
index_instance_documents = DocumentRenameCount.objects.filter(index_instance=index_instance).filter(document__file_extension=document.file_extension)
|
||||
# TODO: verify extension's role in query
|
||||
index_instance_documents = DocumentRenameCount.objects.filter(index_instance=index_instance)#.filter(document__file_extension=document.file_extension)
|
||||
files_list = []
|
||||
for index_instance_document in index_instance_documents:
|
||||
files_list.append(assemble_document_filename(index_instance_document.document, index_instance_document.suffix))
|
||||
files_list.append(assemble_suffixed_filename(index_instance_document.document.file.name, index_instance_document.suffix))
|
||||
|
||||
for suffix in xrange(MAX_SUFFIX_COUNT):
|
||||
if assemble_document_filename(document, suffix) not in files_list:
|
||||
if assemble_suffixed_filename(document.file.name, suffix) not in files_list:
|
||||
return suffix
|
||||
|
||||
raise MaxSuffixCountReached(ugettext(u'Maximum suffix (%s) count reached.') % MAX_SUFFIX_COUNT)
|
||||
|
||||
@@ -3,7 +3,8 @@ import os
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from document_indexing.os_agnostic import assemble_document_filename
|
||||
from document_indexing.os_specifics import (assemble_suffixed_filename,
|
||||
assemble_path_from_list)
|
||||
from document_indexing.conf.settings import FILESERVING_ENABLE
|
||||
from document_indexing.conf.settings import FILESERVING_PATH
|
||||
|
||||
@@ -19,12 +20,12 @@ def get_instance_path(index_instance):
|
||||
|
||||
names.append(index_instance.value)
|
||||
|
||||
return os.sep.join(names)
|
||||
return assemble_path_from_list(names)
|
||||
|
||||
|
||||
def fs_create_index_directory(index_instance):
|
||||
if FILESERVING_ENABLE:
|
||||
target_directory = os.path.join(FILESERVING_PATH, get_instance_path(index_instance))
|
||||
target_directory = assemble_path_from_list([FILESERVING_PATH, get_instance_path(index_instance)])
|
||||
try:
|
||||
os.mkdir(target_directory)
|
||||
except OSError, exc:
|
||||
@@ -36,9 +37,9 @@ def fs_create_index_directory(index_instance):
|
||||
|
||||
def fs_create_document_link(index_instance, document, suffix=0):
|
||||
if FILESERVING_ENABLE:
|
||||
name_part = assemble_document_filename(document, suffix)
|
||||
filename = os.extsep.join([name_part, document.file_extension])
|
||||
filepath = os.path.join(FILESERVING_PATH, get_instance_path(index_instance), filename)
|
||||
filename = assemble_suffixed_filename(document.file.name, suffix)
|
||||
filepath = assemble_path_from_list([FILESERVING_PATH, get_instance_path(index_instance), filename])
|
||||
|
||||
try:
|
||||
os.symlink(document.file.path, filepath)
|
||||
except OSError, exc:
|
||||
@@ -56,12 +57,8 @@ def fs_create_document_link(index_instance, document, suffix=0):
|
||||
|
||||
def fs_delete_document_link(index_instance, document, suffix=0):
|
||||
if FILESERVING_ENABLE:
|
||||
name_part = document.file_filename
|
||||
if suffix:
|
||||
name_part = u'_'.join([name_part, unicode(suffix)])
|
||||
|
||||
filename = os.extsep.join([name_part, document.file_extension])
|
||||
filepath = os.path.join(FILESERVING_PATH, get_instance_path(index_instance), filename)
|
||||
filename = assemble_suffixed_filename(document.file.name, suffix)
|
||||
filepath = assemble_path_from_list([FILESERVING_PATH, get_instance_path(index_instance), filename])
|
||||
|
||||
try:
|
||||
os.unlink(filepath)
|
||||
@@ -73,7 +70,7 @@ def fs_delete_document_link(index_instance, document, suffix=0):
|
||||
|
||||
def fs_delete_index_directory(index_instance):
|
||||
if FILESERVING_ENABLE:
|
||||
target_directory = os.path.join(FILESERVING_PATH, get_instance_path(index_instance))
|
||||
target_directory = assemble_path_from_list([FILESERVING_PATH, get_instance_path(index_instance)])
|
||||
try:
|
||||
os.removedirs(target_directory)
|
||||
except OSError, exc:
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
from document_indexing.conf.settings import SUFFIX_SEPARATOR
|
||||
|
||||
|
||||
def assemble_document_filename(document, suffix=0):
|
||||
if suffix:
|
||||
return SUFFIX_SEPARATOR.join([document.file_filename, unicode(suffix)])
|
||||
else:
|
||||
return document.file_filename
|
||||
20
apps/document_indexing/os_specifics.py
Normal file
@@ -0,0 +1,20 @@
|
||||
import os
|
||||
|
||||
from document_indexing.conf.settings import SUFFIX_SEPARATOR
|
||||
|
||||
|
||||
def assemble_suffixed_filename(filename, suffix=0):
|
||||
'''
|
||||
Split document filename, to attach suffix to the name part then
|
||||
re attacht the extension
|
||||
'''
|
||||
|
||||
if suffix:
|
||||
name, extension = filename.split(os.split(os.extsep))
|
||||
return SUFFIX_SEPARATOR.join([name, unicode(suffix), os.extsep, extension])
|
||||
else:
|
||||
return file_filename
|
||||
|
||||
|
||||
def assemble_path_from_list(directory_list):
|
||||
return os.sep.join(directory_list)
|
||||
@@ -13,17 +13,18 @@ from history.api import register_history_type
|
||||
from metadata.api import get_metadata_string
|
||||
from project_setup.api import register_setup
|
||||
|
||||
from documents.models import Document, DocumentPage, \
|
||||
DocumentPageTransformation, DocumentType, DocumentTypeFilename
|
||||
from documents.literals import PERMISSION_DOCUMENT_CREATE, \
|
||||
PERMISSION_DOCUMENT_PROPERTIES_EDIT, PERMISSION_DOCUMENT_VIEW, \
|
||||
PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD, \
|
||||
PERMISSION_DOCUMENT_TRANSFORM, PERMISSION_DOCUMENT_TOOLS, \
|
||||
PERMISSION_DOCUMENT_EDIT
|
||||
from documents.literals import PERMISSION_DOCUMENT_TYPE_EDIT, \
|
||||
PERMISSION_DOCUMENT_TYPE_DELETE, PERMISSION_DOCUMENT_TYPE_CREATE
|
||||
from documents.literals import HISTORY_DOCUMENT_CREATED, \
|
||||
HISTORY_DOCUMENT_EDITED, HISTORY_DOCUMENT_DELETED
|
||||
from documents.models import (Document, DocumentPage,
|
||||
DocumentPageTransformation, DocumentType, DocumentTypeFilename,
|
||||
DocumentVersion)
|
||||
from documents.literals import (PERMISSION_DOCUMENT_CREATE,
|
||||
PERMISSION_DOCUMENT_PROPERTIES_EDIT, PERMISSION_DOCUMENT_VIEW,
|
||||
PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD,
|
||||
PERMISSION_DOCUMENT_TRANSFORM, PERMISSION_DOCUMENT_TOOLS,
|
||||
PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_VERSION_REVERT)
|
||||
from documents.literals import (PERMISSION_DOCUMENT_TYPE_EDIT,
|
||||
PERMISSION_DOCUMENT_TYPE_DELETE, PERMISSION_DOCUMENT_TYPE_CREATE)
|
||||
from documents.literals import (HISTORY_DOCUMENT_CREATED,
|
||||
HISTORY_DOCUMENT_EDITED, HISTORY_DOCUMENT_DELETED)
|
||||
from documents.conf.settings import ZOOM_MAX_LEVEL
|
||||
from documents.conf.settings import ZOOM_MIN_LEVEL
|
||||
from documents.conf import settings as document_settings
|
||||
@@ -35,7 +36,7 @@ def is_first_page(context):
|
||||
|
||||
|
||||
def is_last_page(context):
|
||||
return context['page'].page_number >= context['page'].document.documentpage_set.count()
|
||||
return context['page'].page_number >= context['page'].document_version.pages.count()
|
||||
|
||||
|
||||
def is_min_zoom(context):
|
||||
@@ -45,6 +46,10 @@ def is_min_zoom(context):
|
||||
def is_max_zoom(context):
|
||||
return context['zoom'] >= ZOOM_MAX_LEVEL
|
||||
|
||||
|
||||
def is_current_version(context):
|
||||
return context['object'].document.latest_version.timestamp == context['object'].timestamp
|
||||
|
||||
# Permission setup
|
||||
set_namespace_title('documents', _(u'Documents'))
|
||||
register_permission(PERMISSION_DOCUMENT_CREATE)
|
||||
@@ -55,6 +60,7 @@ register_permission(PERMISSION_DOCUMENT_DELETE)
|
||||
register_permission(PERMISSION_DOCUMENT_DOWNLOAD)
|
||||
register_permission(PERMISSION_DOCUMENT_TRANSFORM)
|
||||
register_permission(PERMISSION_DOCUMENT_TOOLS)
|
||||
register_permission(PERMISSION_DOCUMENT_VERSION_REVERT)
|
||||
|
||||
# Document type permissions
|
||||
set_namespace_title('documents_setup', _(u'Documents setup'))
|
||||
@@ -69,7 +75,7 @@ register_history_type(HISTORY_DOCUMENT_DELETED)
|
||||
|
||||
document_list = {'text': _(u'all documents'), 'view': 'document_list', 'famfam': 'page', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
document_list_recent = {'text': _(u'recent documents'), 'view': 'document_list_recent', 'famfam': 'page', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
document_create_multiple = {'text': _(u'upload new documents'), 'view': 'document_create_multiple', 'famfam': 'page_add', 'permissions': [PERMISSION_DOCUMENT_CREATE], 'children_view_regex': ['upload']}
|
||||
document_create_multiple = {'text': _(u'upload new documents'), 'view': 'document_create_multiple', 'famfam': 'page_add', 'permissions': [PERMISSION_DOCUMENT_CREATE], 'children_view_regex': [r'upload_interactive']}
|
||||
document_create_siblings = {'text': _(u'clone metadata'), 'view': 'document_create_siblings', 'args': 'object.id', 'famfam': 'page_copy', 'permissions': [PERMISSION_DOCUMENT_CREATE]}
|
||||
document_view_simple = {'text': _(u'details'), 'view': 'document_view_simple', 'args': 'object.id', 'famfam': 'page', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
document_view_advanced = {'text': _(u'properties'), 'view': 'document_view_advanced', 'args': 'object.id', 'famfam': 'page_gear', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
@@ -78,14 +84,20 @@ document_multiple_delete = {'text': _(u'delete'), 'view': 'document_multiple_del
|
||||
document_edit = {'text': _(u'edit'), 'view': 'document_edit', 'args': 'object.id', 'famfam': 'page_edit', 'permissions': [PERMISSION_DOCUMENT_PROPERTIES_EDIT]}
|
||||
document_preview = {'text': _(u'preview'), 'class': 'fancybox', 'view': 'document_preview', 'args': 'object.id', 'famfam': 'magnifier', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
document_download = {'text': _(u'download'), 'view': 'document_download', 'args': 'object.id', 'famfam': 'page_save', 'permissions': [PERMISSION_DOCUMENT_DOWNLOAD]}
|
||||
document_find_duplicates = {'text': _(u'find duplicates'), 'view': 'document_find_duplicates', 'args': 'object.id', 'famfam': 'page_refresh', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
document_find_all_duplicates = {'text': _(u'find all duplicates'), 'view': 'document_find_all_duplicates', 'famfam': 'page_refresh', 'permissions': [PERMISSION_DOCUMENT_VIEW], 'description': _(u'Search all the documents\' checksums and return a list of the exact matches.')}
|
||||
document_version_download = {'text': _(u'download'), 'view': 'document_version_download', 'args': 'object.pk', 'famfam': 'page_save', 'permissions': [PERMISSION_DOCUMENT_DOWNLOAD]}
|
||||
document_find_duplicates = {'text': _(u'find duplicates'), 'view': 'document_find_duplicates', 'args': 'object.id', 'famfam': 'page_white_copy', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
document_find_all_duplicates = {'text': _(u'find all duplicates'), 'view': 'document_find_all_duplicates', 'famfam': 'page_white_copy', 'permissions': [PERMISSION_DOCUMENT_VIEW], 'description': _(u'Search all the documents\' checksums and return a list of the exact matches.')}
|
||||
document_update_page_count = {'text': _(u'update office documents\' page count'), 'view': 'document_update_page_count', 'famfam': 'page_white_csharp', 'permissions': [PERMISSION_DOCUMENT_TOOLS], 'description': _(u'Update the page count of the office type documents. This is useful when enabling office document support after there were already office type documents in the database.')}
|
||||
document_clear_transformations = {'text': _(u'clear transformations'), 'view': 'document_clear_transformations', 'args': 'object.id', 'famfam': 'page_paintbrush', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
||||
document_multiple_clear_transformations = {'text': _(u'clear transformations'), 'view': 'document_multiple_clear_transformations', 'famfam': 'page_paintbrush', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
||||
document_print = {'text': _(u'print'), 'view': 'document_print', 'args': 'object.id', 'famfam': 'printer', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
document_history_view = {'text': _(u'history'), 'view': 'history_for_object', 'args': ['"documents"', '"document"', 'object.id'], 'famfam': 'book_go', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
document_missing_list = {'text': _(u'Find missing document files'), 'view': 'document_missing_list', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
|
||||
# Tools
|
||||
document_clear_image_cache = {'text': _(u'Clear the document image cache'), 'view': 'document_clear_image_cache', 'famfam': 'camera_delete', 'permissions': [PERMISSION_DOCUMENT_TOOLS], 'description': _(u'Clear the graphics representations used to speed up the documents\' display and interactive transformations results.')}
|
||||
|
||||
# Document pages
|
||||
document_page_transformation_list = {'text': _(u'page transformations'), 'class': 'no-parent-history', 'view': 'document_page_transformation_list', 'args': 'page.pk', 'famfam': 'pencil_go', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
||||
document_page_transformation_create = {'text': _(u'create new transformation'), 'class': 'no-parent-history', 'view': 'document_page_transformation_create', 'args': 'page.pk', 'famfam': 'pencil_add', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
||||
document_page_transformation_edit = {'text': _(u'edit'), 'class': 'no-parent-history', 'view': 'document_page_transformation_edit', 'args': 'transformation.pk', 'famfam': 'pencil_go', 'permissions': [PERMISSION_DOCUMENT_TRANSFORM]}
|
||||
@@ -104,7 +116,9 @@ document_page_rotate_right = {'text': _(u'rotate right'), 'class': 'no-parent-hi
|
||||
document_page_rotate_left = {'text': _(u'rotate left'), 'class': 'no-parent-history', 'view': 'document_page_rotate_left', 'args': 'page.pk', 'famfam': 'arrow_turn_left', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
document_page_view_reset = {'text': _(u'reset view'), 'class': 'no-parent-history', 'view': 'document_page_view_reset', 'args': 'page.pk', 'famfam': 'page_white', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
|
||||
document_missing_list = {'text': _(u'Find missing document files'), 'view': 'document_missing_list', 'famfam': 'folder_page', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
# Document versions
|
||||
document_version_list = {'text': _(u'versions'), 'view': 'document_version_list', 'args': 'object.pk', 'famfam': 'page_world', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
document_version_revert = {'text': _(u'revert'), 'view': 'document_version_revert', 'args': 'object.pk', 'famfam': 'page_refresh', 'permissions': [PERMISSION_DOCUMENT_VERSION_REVERT], 'conditional_disable': is_current_version}
|
||||
|
||||
# Document type related links
|
||||
document_type_list = {'text': _(u'document type list'), 'view': 'document_type_list', 'famfam': 'layout', 'permissions': [PERMISSION_DOCUMENT_VIEW]}
|
||||
@@ -132,6 +146,9 @@ register_links(['document_type_filename_create', 'document_type_filename_list',
|
||||
register_links(Document, [document_edit, document_print, document_delete, document_download, document_find_duplicates, document_clear_transformations, document_create_siblings])
|
||||
register_multi_item_links(['document_find_duplicates', 'folder_view', 'index_instance_list', 'document_type_document_list', 'search', 'results', 'document_group_view', 'document_list', 'document_list_recent'], [document_multiple_clear_transformations, document_multiple_delete])
|
||||
|
||||
# Document Version links
|
||||
register_links(DocumentVersion, [document_version_revert, document_version_download])
|
||||
|
||||
secondary_menu_links = [document_list_recent, document_list, document_create_multiple]
|
||||
|
||||
register_links(['document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_interactive', 'staging_file_delete'], secondary_menu_links, menu_name='secondary_menu')
|
||||
@@ -158,7 +175,7 @@ register_links(['document_page_transformation_edit', 'document_page_transformati
|
||||
|
||||
register_diagnostic('documents', _(u'Documents'), document_missing_list)
|
||||
|
||||
register_maintenance_links([document_find_all_duplicates, document_update_page_count], namespace='documents', title=_(u'documents'))
|
||||
register_maintenance_links([document_find_all_duplicates, document_update_page_count, document_clear_image_cache], namespace='documents', title=_(u'documents'))
|
||||
|
||||
#def document_exists(document):
|
||||
# try:
|
||||
@@ -187,7 +204,8 @@ register_top_menu(
|
||||
children_path_regex=[
|
||||
r'^documents/[^t]', r'^metadata/[^s]', r'comments', r'tags/document', r'grouping/[^s]', r'history/list/for_object/documents'
|
||||
],
|
||||
children_views=['document_folder_list', 'folder_add_document', 'document_index_list'],
|
||||
#children_view_regex=[r'upload'],
|
||||
children_views=['document_folder_list', 'folder_add_document', 'document_index_list', 'upload_version',],
|
||||
position=1
|
||||
)
|
||||
|
||||
@@ -197,6 +215,7 @@ register_sidebar_template(['document_type_list'], 'document_types_help.html')
|
||||
register_links(Document, [document_view_simple], menu_name='form_header', position=0)
|
||||
register_links(Document, [document_view_advanced], menu_name='form_header', position=1)
|
||||
register_links(Document, [document_history_view], menu_name='form_header')
|
||||
register_links(Document, [document_version_list], menu_name='form_header')
|
||||
|
||||
if (validate_path(document_settings.CACHE_PATH) == False) or (not document_settings.CACHE_PATH):
|
||||
setattr(document_settings, 'CACHE_PATH', tempfile.mkdtemp())
|
||||
|
||||
@@ -2,11 +2,29 @@ from django.contrib import admin
|
||||
|
||||
from metadata.admin import DocumentMetadataInline
|
||||
|
||||
from documents.models import DocumentType, Document, \
|
||||
DocumentTypeFilename, DocumentPage, \
|
||||
DocumentPageTransformation, RecentDocument
|
||||
from documents.models import (DocumentType, Document,
|
||||
DocumentTypeFilename, DocumentPage,
|
||||
DocumentPageTransformation, RecentDocument,
|
||||
DocumentVersion)
|
||||
|
||||
|
||||
class DocumentPageInline(admin.StackedInline):
|
||||
model = DocumentPage
|
||||
extra = 1
|
||||
classes = ('collapse-open',)
|
||||
allow_add = True
|
||||
|
||||
|
||||
class DocumentVersionInline(admin.StackedInline):
|
||||
model = DocumentVersion
|
||||
extra = 1
|
||||
classes = ('collapse-open',)
|
||||
allow_add = True
|
||||
#inlines = [
|
||||
# DocumentPageInline,
|
||||
#]
|
||||
|
||||
|
||||
class DocumentTypeFilenameInline(admin.StackedInline):
|
||||
model = DocumentTypeFilename
|
||||
extra = 1
|
||||
@@ -24,18 +42,11 @@ class DocumentPageTransformationAdmin(admin.ModelAdmin):
|
||||
model = DocumentPageTransformation
|
||||
|
||||
|
||||
class DocumentPageInline(admin.StackedInline):
|
||||
model = DocumentPage
|
||||
extra = 1
|
||||
classes = ('collapse-open',)
|
||||
allow_add = True
|
||||
|
||||
|
||||
class DocumentAdmin(admin.ModelAdmin):
|
||||
inlines = [
|
||||
DocumentMetadataInline, DocumentPageInline
|
||||
DocumentMetadataInline, DocumentVersionInline
|
||||
]
|
||||
list_display = ('uuid', 'file_filename', 'file_extension')
|
||||
list_display = ('uuid', 'file_filename',)
|
||||
|
||||
|
||||
class RecentDocumentAdmin(admin.ModelAdmin):
|
||||
|
||||
@@ -11,9 +11,11 @@ from common.conf.settings import DEFAULT_PAPER_SIZE
|
||||
from common.conf.settings import DEFAULT_PAGE_ORIENTATION
|
||||
from common.widgets import TextAreaDiv
|
||||
|
||||
from documents.models import Document, DocumentType, \
|
||||
DocumentPage, DocumentPageTransformation, DocumentTypeFilename
|
||||
from documents.models import (Document, DocumentType,
|
||||
DocumentPage, DocumentPageTransformation, DocumentTypeFilename,
|
||||
DocumentVersion)
|
||||
from documents.widgets import document_html_widget
|
||||
from documents.literals import (RELEASE_LEVEL_FINAL, RELEASE_LEVEL_CHOICES)
|
||||
|
||||
# Document page forms
|
||||
class DocumentPageTransformationForm(forms.ModelForm):
|
||||
@@ -100,8 +102,10 @@ class DocumentPagesCarouselWidget(forms.widgets.Widget):
|
||||
output = []
|
||||
output.append(u'<div style="white-space:nowrap; overflow: auto;">')
|
||||
|
||||
for page in value.documentpage_set.all():
|
||||
for page in value.pages.all():
|
||||
|
||||
output.append(u'<div style="display: inline-block; margin: 5px 10px 10px 10px;">')
|
||||
output.append(u'<div class="tc">%(page_string)s %(page)s</div>' % {'page_string': ugettext(u'Page'), 'page': page.page_number})
|
||||
output.append(
|
||||
document_html_widget(
|
||||
page.document,
|
||||
@@ -128,7 +132,7 @@ class DocumentPreviewForm(forms.Form):
|
||||
document = kwargs.pop('document', None)
|
||||
super(DocumentPreviewForm, self).__init__(*args, **kwargs)
|
||||
self.fields['preview'].initial = document
|
||||
self.fields['preview'].label = _(u'Document pages (%s)') % document.documentpage_set.count()
|
||||
self.fields['preview'].label = _(u'Document pages (%s)') % document.pages.count()
|
||||
|
||||
preview = forms.CharField(widget=DocumentPagesCarouselWidget())
|
||||
|
||||
@@ -152,6 +156,13 @@ class DocumentForm(forms.ModelForm):
|
||||
# To allow merging with DocumentForm_edit
|
||||
self.fields['document_type'].widget = forms.HiddenInput()
|
||||
|
||||
if instance:
|
||||
self.fields['use_file_name'] = forms.BooleanField(
|
||||
label=_(u'Use the new version filename as the document filename'),
|
||||
initial=False,
|
||||
required=False,
|
||||
)
|
||||
|
||||
# Instance's document_type overrides the passed document_type
|
||||
if instance:
|
||||
if hasattr(instance, 'document_type'):
|
||||
@@ -165,10 +176,50 @@ class DocumentForm(forms.ModelForm):
|
||||
required=False,
|
||||
label=_(u'Quick document rename'))
|
||||
|
||||
if instance:
|
||||
self.version_fields(instance)
|
||||
|
||||
def version_fields(self, document):
|
||||
self.fields['version_update'] = forms.ChoiceField(
|
||||
label=_(u'Version update'),
|
||||
choices=DocumentVersion.get_version_update_choices(document.latest_version)
|
||||
)
|
||||
|
||||
self.fields['release_level'] = forms.ChoiceField(
|
||||
label=_(u'Release level'),
|
||||
choices=RELEASE_LEVEL_CHOICES,
|
||||
initial=RELEASE_LEVEL_FINAL,
|
||||
)
|
||||
|
||||
self.fields['serial'] = forms.IntegerField(
|
||||
label=_(u'Release level serial'),
|
||||
initial=0,
|
||||
widget=forms.widgets.TextInput(
|
||||
attrs = {'style': 'width: auto;'}
|
||||
),
|
||||
)
|
||||
|
||||
self.fields['comment'] = forms.CharField(
|
||||
label=_(u'Comment'),
|
||||
required=False,
|
||||
widget=forms.widgets.Textarea(attrs={'rows': 4}),
|
||||
)
|
||||
|
||||
new_filename = forms.CharField(
|
||||
label=_('New document filename'), required=False
|
||||
)
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = self.cleaned_data
|
||||
cleaned_data['new_version_data'] = {
|
||||
'comment': self.cleaned_data.get('comment'),
|
||||
'version_update': self.cleaned_data.get('version_update'),
|
||||
'release_level': self.cleaned_data.get('release_level'),
|
||||
'serial': self.cleaned_data.get('serial'),
|
||||
}
|
||||
|
||||
# Always return the full collection of cleaned data.
|
||||
return cleaned_data
|
||||
|
||||
class DocumentForm_edit(DocumentForm):
|
||||
"""
|
||||
@@ -177,6 +228,14 @@ class DocumentForm_edit(DocumentForm):
|
||||
class Meta:
|
||||
model = Document
|
||||
exclude = ('file', 'document_type', 'tags')
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(DocumentForm_edit, self).__init__(*args, **kwargs)
|
||||
self.fields.pop('serial')
|
||||
self.fields.pop('release_level')
|
||||
self.fields.pop('version_update')
|
||||
self.fields.pop('comment')
|
||||
self.fields.pop('use_file_name')
|
||||
|
||||
|
||||
class DocumentPropertiesForm(DetailForm):
|
||||
@@ -198,7 +257,7 @@ class DocumentContentForm(forms.Form):
|
||||
super(DocumentContentForm, self).__init__(*args, **kwargs)
|
||||
content = []
|
||||
self.fields['contents'].initial = u''
|
||||
for page in self.document.documentpage_set.all():
|
||||
for page in self.document.pages.all():
|
||||
if page.content:
|
||||
content.append(page.content)
|
||||
content.append(u'\n\n\n - Page %s - \n\n\n' % page.page_number)
|
||||
@@ -220,10 +279,10 @@ class DocumentTypeSelectForm(forms.Form):
|
||||
|
||||
|
||||
class PrintForm(forms.Form):
|
||||
page_size = forms.ChoiceField(choices=PAGE_SIZE_CHOICES, initial=DEFAULT_PAPER_SIZE, label=_(u'Page size'), required=False)
|
||||
custom_page_width = forms.CharField(label=_(u'Custom page width'), required=False)
|
||||
custom_page_height = forms.CharField(label=_(u'Custom page height'), required=False)
|
||||
page_orientation = forms.ChoiceField(choices=PAGE_ORIENTATION_CHOICES, initial=DEFAULT_PAGE_ORIENTATION, label=_(u'Page orientation'), required=True)
|
||||
#page_size = forms.ChoiceField(choices=PAGE_SIZE_CHOICES, initial=DEFAULT_PAPER_SIZE, label=_(u'Page size'), required=False)
|
||||
#custom_page_width = forms.CharField(label=_(u'Custom page width'), required=False)
|
||||
#custom_page_height = forms.CharField(label=_(u'Custom page height'), required=False)
|
||||
#page_orientation = forms.ChoiceField(choices=PAGE_ORIENTATION_CHOICES, initial=DEFAULT_PAGE_ORIENTATION, label=_(u'Page orientation'), required=True)
|
||||
page_range = forms.CharField(label=_(u'Page range'), required=False)
|
||||
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ PERMISSION_DOCUMENT_DELETE = {'namespace': 'documents', 'name': 'document_delete
|
||||
PERMISSION_DOCUMENT_DOWNLOAD = {'namespace': 'documents', 'name': 'document_download', 'label': _(u'Download documents')}
|
||||
PERMISSION_DOCUMENT_TRANSFORM = {'namespace': 'documents', 'name': 'document_transform', 'label': _(u'Transform documents')}
|
||||
PERMISSION_DOCUMENT_TOOLS = {'namespace': 'documents', 'name': 'document_tools', 'label': _(u'Execute document modifying tools')}
|
||||
PERMISSION_DOCUMENT_VERSION_REVERT = {'namespace': 'documents', 'name': 'document_version_revert', 'label': _(u'Revert documents to a previous version')}
|
||||
|
||||
PERMISSION_DOCUMENT_TYPE_EDIT = {'namespace': 'documents_setup', 'name': 'document_type_edit', 'label': _(u'Edit document types')}
|
||||
PERMISSION_DOCUMENT_TYPE_DELETE = {'namespace': 'documents_setup', 'name': 'document_type_delete', 'label': _(u'Delete document types')}
|
||||
@@ -44,3 +45,21 @@ HISTORY_DOCUMENT_DELETED = {
|
||||
'details': _(u'Document "%(document)s" deleted on %(datetime)s by %(fullname)s.'),
|
||||
'expressions': {'fullname': 'user.get_full_name() if user.get_full_name() else user.username'}
|
||||
}
|
||||
|
||||
RELEASE_LEVEL_FINAL = 1
|
||||
RELEASE_LEVEL_ALPHA = 2
|
||||
RELEASE_LEVEL_BETA = 3
|
||||
RELEASE_LEVEL_RC = 4
|
||||
RELEASE_LEVEL_HF = 5
|
||||
|
||||
RELEASE_LEVEL_CHOICES = (
|
||||
(RELEASE_LEVEL_FINAL, _(u'final')),
|
||||
(RELEASE_LEVEL_ALPHA, _(u'alpha')),
|
||||
(RELEASE_LEVEL_BETA, _(u'beta')),
|
||||
(RELEASE_LEVEL_RC, _(u'release candidate')),
|
||||
(RELEASE_LEVEL_HF, _(u'hotfix')),
|
||||
)
|
||||
|
||||
VERSION_UPDATE_MAJOR = u'major'
|
||||
VERSION_UPDATE_MINOR = u'minor'
|
||||
VERSION_UPDATE_MICRO = u'micro'
|
||||
|
||||
219
apps/documents/migrations/0001_initial.py
Normal file
@@ -0,0 +1,219 @@
|
||||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Adding model 'DocumentType'
|
||||
db.create_table('documents_documenttype', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('name', self.gf('django.db.models.fields.CharField')(max_length=32)),
|
||||
))
|
||||
db.send_create_signal('documents', ['DocumentType'])
|
||||
|
||||
# Adding model 'Document'
|
||||
db.create_table('documents_document', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('document_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.DocumentType'], null=True, blank=True)),
|
||||
('file', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
|
||||
('uuid', self.gf('django.db.models.fields.CharField')(default=u'107e50a8-83b3-46da-bd14-460489527ab1', max_length=48, blank=True)),
|
||||
('file_mimetype', self.gf('django.db.models.fields.CharField')(default='', max_length=64)),
|
||||
('file_mime_encoding', self.gf('django.db.models.fields.CharField')(default='', max_length=64)),
|
||||
('file_filename', self.gf('django.db.models.fields.CharField')(default=u'', max_length=255, db_index=True)),
|
||||
('file_extension', self.gf('django.db.models.fields.CharField')(default=u'', max_length=16, db_index=True)),
|
||||
('date_added', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, db_index=True, blank=True)),
|
||||
('date_updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
|
||||
('checksum', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
|
||||
('description', self.gf('django.db.models.fields.TextField')(db_index=True, null=True, blank=True)),
|
||||
))
|
||||
db.send_create_signal('documents', ['Document'])
|
||||
|
||||
# Adding model 'DocumentTypeFilename'
|
||||
db.create_table('documents_documenttypefilename', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('document_type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.DocumentType'])),
|
||||
('filename', self.gf('django.db.models.fields.CharField')(max_length=128, db_index=True)),
|
||||
('enabled', self.gf('django.db.models.fields.BooleanField')(default=True)),
|
||||
))
|
||||
db.send_create_signal('documents', ['DocumentTypeFilename'])
|
||||
|
||||
# Adding model 'DocumentPage'
|
||||
db.create_table('documents_documentpage', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('document', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.Document'])),
|
||||
('content', self.gf('django.db.models.fields.TextField')(db_index=True, null=True, blank=True)),
|
||||
('page_label', self.gf('django.db.models.fields.CharField')(max_length=32, null=True, blank=True)),
|
||||
('page_number', self.gf('django.db.models.fields.PositiveIntegerField')(default=1, db_index=True)),
|
||||
))
|
||||
db.send_create_signal('documents', ['DocumentPage'])
|
||||
|
||||
# Adding model 'DocumentPageTransformation'
|
||||
db.create_table('documents_documentpagetransformation', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('document_page', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.DocumentPage'])),
|
||||
('order', self.gf('django.db.models.fields.PositiveIntegerField')(default=0, null=True, db_index=True, blank=True)),
|
||||
('transformation', self.gf('django.db.models.fields.CharField')(max_length=128)),
|
||||
('arguments', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
|
||||
))
|
||||
db.send_create_signal('documents', ['DocumentPageTransformation'])
|
||||
|
||||
# Adding model 'RecentDocument'
|
||||
db.create_table('documents_recentdocument', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
|
||||
('document', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.Document'])),
|
||||
('datetime_accessed', self.gf('django.db.models.fields.DateTimeField')(db_index=True)),
|
||||
))
|
||||
db.send_create_signal('documents', ['RecentDocument'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting model 'DocumentType'
|
||||
db.delete_table('documents_documenttype')
|
||||
|
||||
# Deleting model 'Document'
|
||||
db.delete_table('documents_document')
|
||||
|
||||
# Deleting model 'DocumentTypeFilename'
|
||||
db.delete_table('documents_documenttypefilename')
|
||||
|
||||
# Deleting model 'DocumentPage'
|
||||
db.delete_table('documents_documentpage')
|
||||
|
||||
# Deleting model 'DocumentPageTransformation'
|
||||
db.delete_table('documents_documentpagetransformation')
|
||||
|
||||
# Deleting model 'RecentDocument'
|
||||
db.delete_table('documents_recentdocument')
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'file_extension': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '16', 'db_index': 'True'}),
|
||||
'file_filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'file_mime_encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file_mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'default': "u'107e50a8-83b3-46da-bd14-460489527ab1'", 'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
146
apps/documents/migrations/0002_filename_extension_merge.py
Normal file
@@ -0,0 +1,146 @@
|
||||
# encoding: utf-8
|
||||
import os
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import DataMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(DataMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
"Write your forwards methods here."
|
||||
for document in orm.Document.objects.all():
|
||||
document.file_filename = os.extsep.join([document.file_filename, document.file_extension])
|
||||
document.save()
|
||||
|
||||
def backwards(self, orm):
|
||||
"Write your backwards methods here."
|
||||
for document in orm.Document.objects.all():
|
||||
document.file_filename, document.file_extension = document.file_filename.split(os.extsep)
|
||||
document.save()
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'file_extension': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '16', 'db_index': 'True'}),
|
||||
'file_filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'file_mime_encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file_mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'default': "u'28bd60c6-a5c2-4adb-8dab-1b6c0098cc9c'", 'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
@@ -0,0 +1,144 @@
|
||||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Deleting field 'Document.file_extension'
|
||||
db.delete_column('documents_document', 'file_extension')
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Adding field 'Document.file_extension'
|
||||
db.add_column('documents_document', 'file_extension', self.gf('django.db.models.fields.CharField')(default=u'', max_length=16, db_index=True), keep_default=False)
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'file_filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'file_mime_encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file_mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'default': "u'06a88ff6-11b2-44b3-8409-21bd58577d4f'", 'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
@@ -0,0 +1,188 @@
|
||||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Adding model 'DocumentVersion'
|
||||
db.create_table('documents_documentversion', (
|
||||
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
|
||||
('document', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.Document'], null=True, blank=True)),
|
||||
('mayor', self.gf('django.db.models.fields.PositiveIntegerField')(default=1)),
|
||||
('minor', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)),
|
||||
('micro', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)),
|
||||
('release_level', self.gf('django.db.models.fields.PositiveIntegerField')(default=1)),
|
||||
('serial', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)),
|
||||
('timestamp', self.gf('django.db.models.fields.DateTimeField')()),
|
||||
('file', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
|
||||
('mimetype', self.gf('django.db.models.fields.CharField')(default='', max_length=64)),
|
||||
('encoding', self.gf('django.db.models.fields.CharField')(default='', max_length=64)),
|
||||
('filename', self.gf('django.db.models.fields.CharField')(default=u'', max_length=255, db_index=True)),
|
||||
('checksum', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
|
||||
))
|
||||
db.send_create_signal('documents', ['DocumentVersion'])
|
||||
|
||||
# Adding unique constraint on 'DocumentVersion', fields ['document', 'mayor', 'minor', 'micro', 'release_level', 'serial']
|
||||
db.create_unique('documents_documentversion', ['document_id', 'mayor', 'minor', 'micro', 'release_level', 'serial'])
|
||||
|
||||
# Adding field 'DocumentPage.document_version'
|
||||
db.add_column('documents_documentpage', 'document_version', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.DocumentVersion'], null=True, blank=True), keep_default=False)
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Removing unique constraint on 'DocumentVersion', fields ['document', 'mayor', 'minor', 'micro', 'release_level', 'serial']
|
||||
db.delete_unique('documents_documentversion', ['document_id', 'mayor', 'minor', 'micro', 'release_level', 'serial'])
|
||||
|
||||
# Deleting model 'DocumentVersion'
|
||||
db.delete_table('documents_documentversion')
|
||||
|
||||
# Deleting field 'DocumentPage.document_version'
|
||||
db.delete_column('documents_documentpage', 'document_version_id')
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'file_filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'file_mime_encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file_mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'default': "u'a8389d7d-b9f4-4e51-ac24-dd9dd310fd8c'", 'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'document_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentVersion']", 'null': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.documentversion': {
|
||||
'Meta': {'unique_together': "(('document', 'mayor', 'minor', 'micro', 'release_level', 'serial'),)", 'object_name': 'DocumentVersion'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']", 'null': 'True', 'blank': 'True'}),
|
||||
'encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'mayor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'micro': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'minor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'release_level': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'serial': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'timestamp': ('django.db.models.fields.DateTimeField', [], {})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
176
apps/documents/migrations/0005_document_versions.py
Normal file
@@ -0,0 +1,176 @@
|
||||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import DataMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(DataMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
for document in orm.Document.objects.all():
|
||||
document_version = document.documentversion_set.create(
|
||||
document = document,
|
||||
timestamp = document.date_added,
|
||||
file = document.file,
|
||||
mimetype = document.file_mimetype,
|
||||
encoding = document.file_mime_encoding,
|
||||
filename = document.file_filename,
|
||||
checksum = document.checksum,
|
||||
)
|
||||
document_version.save()
|
||||
for document_page in document.documentpage_set.all():
|
||||
document_page.document_version = document_version
|
||||
document_page.save()
|
||||
|
||||
def backwards(self, orm):
|
||||
for document in orm.Document.objects.all():
|
||||
document_version = document.documentversion_set.all()[0]
|
||||
document.date_added = document_version.timestamp
|
||||
document.file = document_version.file
|
||||
document.file_mimetype = document_version.mimetype
|
||||
document.file_mime_encoding = document_version.encoding
|
||||
document.filename = document_version.filename
|
||||
document.checksum = document_version.checksum
|
||||
document.save()
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'file_filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'file_mime_encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file_mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'default': "u'6c189f1f-1d85-48b5-9b7d-e8e319603e77'", 'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'document_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentVersion']", 'null': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.documentversion': {
|
||||
'Meta': {'unique_together': "(('document', 'mayor', 'minor', 'micro', 'release_level', 'serial'),)", 'object_name': 'DocumentVersion'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']", 'null': 'True', 'blank': 'True'}),
|
||||
'encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'mayor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'micro': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'minor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'release_level': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'serial': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'timestamp': ('django.db.models.fields.DateTimeField', [], {})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
@@ -0,0 +1,159 @@
|
||||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import DataMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(DataMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
qs = orm.DocumentPage.objects.filter(document_version=None)
|
||||
#print 'Invalid document pages to delete: %s' % qs.count()
|
||||
for document_page in qs:
|
||||
document_page.delete()
|
||||
|
||||
def backwards(self, orm):
|
||||
def backwards(self, orm):
|
||||
raise RuntimeError('Cannot reverse this migration.')
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'file_filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'file_mime_encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file_mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'default': "u'6c189f1f-1d85-48b5-9b7d-e8e319603e77'", 'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'document_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentVersion']", 'null': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.documentversion': {
|
||||
'Meta': {'unique_together': "(('document', 'mayor', 'minor', 'micro', 'release_level', 'serial'),)", 'object_name': 'DocumentVersion'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']", 'null': 'True', 'blank': 'True'}),
|
||||
'encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'mayor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'micro': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'minor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'release_level': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'serial': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'timestamp': ('django.db.models.fields.DateTimeField', [], {})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
202
apps/documents/migrations/0007_remove_old_file_fields.py
Normal file
@@ -0,0 +1,202 @@
|
||||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Changing field 'DocumentVersion.document'
|
||||
db.alter_column('documents_documentversion', 'document_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.Document']))
|
||||
|
||||
# Deleting field 'Document.date_updated'
|
||||
db.delete_column('documents_document', 'date_updated')
|
||||
|
||||
# Deleting field 'Document.file'
|
||||
db.delete_column('documents_document', 'file')
|
||||
|
||||
# Deleting field 'Document.file_filename'
|
||||
db.delete_column('documents_document', 'file_filename')
|
||||
|
||||
# Deleting field 'Document.file_mimetype'
|
||||
db.delete_column('documents_document', 'file_mimetype')
|
||||
|
||||
# Deleting field 'Document.checksum'
|
||||
db.delete_column('documents_document', 'checksum')
|
||||
|
||||
# Deleting field 'Document.file_mime_encoding'
|
||||
db.delete_column('documents_document', 'file_mime_encoding')
|
||||
|
||||
# Deleting field 'DocumentPage.document'
|
||||
db.delete_column('documents_documentpage', 'document_id')
|
||||
|
||||
# Changing field 'DocumentPage.document_version'
|
||||
db.alter_column('documents_documentpage', 'document_version_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.DocumentVersion']))
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Changing field 'DocumentVersion.document'
|
||||
db.alter_column('documents_documentversion', 'document_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.Document'], null=True))
|
||||
|
||||
# Adding field 'Document.date_updated'
|
||||
db.add_column('documents_document', 'date_updated', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, default=datetime.datetime(2011, 12, 2, 2, 17, 25, 53565), blank=True), keep_default=False)
|
||||
|
||||
# Adding field 'Document.file'
|
||||
db.add_column('documents_document', 'file', self.gf('django.db.models.fields.files.FileField')(default='', max_length=100), keep_default=False)
|
||||
|
||||
# Adding field 'Document.file_filename'
|
||||
db.add_column('documents_document', 'file_filename', self.gf('django.db.models.fields.CharField')(default=u'', max_length=255, db_index=True), keep_default=False)
|
||||
|
||||
# Adding field 'Document.file_mimetype'
|
||||
db.add_column('documents_document', 'file_mimetype', self.gf('django.db.models.fields.CharField')(default='', max_length=64), keep_default=False)
|
||||
|
||||
# Adding field 'Document.checksum'
|
||||
db.add_column('documents_document', 'checksum', self.gf('django.db.models.fields.TextField')(null=True, blank=True), keep_default=False)
|
||||
|
||||
# Adding field 'Document.file_mime_encoding'
|
||||
db.add_column('documents_document', 'file_mime_encoding', self.gf('django.db.models.fields.CharField')(default='', max_length=64), keep_default=False)
|
||||
|
||||
# Adding field 'DocumentPage.document'
|
||||
db.add_column('documents_documentpage', 'document', self.gf('django.db.models.fields.related.ForeignKey')(default=0, to=orm['documents.Document']), keep_default=False)
|
||||
|
||||
# Changing field 'DocumentPage.document_version'
|
||||
db.alter_column('documents_documentpage', 'document_version_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['documents.DocumentVersion'], null=True))
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'default': "u'83100718-e901-4880-95f8-3618749c8a99'", 'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentVersion']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.documentversion': {
|
||||
'Meta': {'unique_together': "(('document', 'mayor', 'minor', 'micro', 'release_level', 'serial'),)", 'object_name': 'DocumentVersion'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'mayor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'micro': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'minor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'release_level': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'serial': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'timestamp': ('django.db.models.fields.DateTimeField', [], {})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
172
apps/documents/migrations/0008_fix_mayor_field_name.py
Normal file
@@ -0,0 +1,172 @@
|
||||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Removing unique constraint on 'DocumentVersion', fields ['release_level', 'micro', 'serial', 'document', 'mayor', 'minor']
|
||||
db.delete_unique('documents_documentversion', ['release_level', 'micro', 'serial', 'document_id', 'mayor', 'minor'])
|
||||
|
||||
# Deleting field 'DocumentVersion.mayor'
|
||||
db.delete_column('documents_documentversion', 'mayor')
|
||||
|
||||
# Adding field 'DocumentVersion.major'
|
||||
db.add_column('documents_documentversion', 'major', self.gf('django.db.models.fields.PositiveIntegerField')(default=1), keep_default=False)
|
||||
|
||||
# Adding unique constraint on 'DocumentVersion', fields ['major', 'release_level', 'micro', 'serial', 'document', 'minor']
|
||||
db.create_unique('documents_documentversion', ['major', 'release_level', 'micro', 'serial', 'document_id', 'minor'])
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Removing unique constraint on 'DocumentVersion', fields ['major', 'release_level', 'micro', 'serial', 'document', 'minor']
|
||||
db.delete_unique('documents_documentversion', ['major', 'release_level', 'micro', 'serial', 'document_id', 'minor'])
|
||||
|
||||
# Adding field 'DocumentVersion.mayor'
|
||||
db.add_column('documents_documentversion', 'mayor', self.gf('django.db.models.fields.PositiveIntegerField')(default=1), keep_default=False)
|
||||
|
||||
# Deleting field 'DocumentVersion.major'
|
||||
db.delete_column('documents_documentversion', 'major')
|
||||
|
||||
# Adding unique constraint on 'DocumentVersion', fields ['release_level', 'micro', 'serial', 'document', 'mayor', 'minor']
|
||||
db.create_unique('documents_documentversion', ['release_level', 'micro', 'serial', 'document_id', 'mayor', 'minor'])
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'default': "u'750a3848-39cf-45a5-9a96-e948d09833d7'", 'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentVersion']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.documentversion': {
|
||||
'Meta': {'unique_together': "(('document', 'major', 'minor', 'micro', 'release_level', 'serial'),)", 'object_name': 'DocumentVersion'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'major': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'micro': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'minor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'release_level': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'serial': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'timestamp': ('django.db.models.fields.DateTimeField', [], {})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
155
apps/documents/migrations/0009_add_comment_field.py
Normal file
@@ -0,0 +1,155 @@
|
||||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Adding field 'DocumentVersion.comment'
|
||||
db.add_column('documents_documentversion', 'comment', self.gf('django.db.models.fields.TextField')(default='', blank=True), keep_default=False)
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting field 'DocumentVersion.comment'
|
||||
db.delete_column('documents_documentversion', 'comment')
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'default': "u'123068ef-26d2-45bb-8933-cb6818cd87e4'", 'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentVersion']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.documentversion': {
|
||||
'Meta': {'unique_together': "(('document', 'major', 'minor', 'micro', 'release_level', 'serial'),)", 'object_name': 'DocumentVersion'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'major': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'micro': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'minor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'release_level': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'serial': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'timestamp': ('django.db.models.fields.DateTimeField', [], {})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
@@ -0,0 +1,155 @@
|
||||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Changing field 'Document.date_added'
|
||||
db.alter_column('documents_document', 'date_added', self.gf('django.db.models.fields.DateTimeField')())
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Changing field 'Document.date_added'
|
||||
db.alter_column('documents_document', 'date_added', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True))
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentVersion']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.documentversion': {
|
||||
'Meta': {'unique_together': "(('document', 'major', 'minor', 'micro', 'release_level', 'serial'),)", 'object_name': 'DocumentVersion'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'major': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'micro': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'minor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'release_level': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'serial': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'timestamp': ('django.db.models.fields.DateTimeField', [], {})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
@@ -0,0 +1,156 @@
|
||||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Adding field 'DocumentVersion.signature_state'
|
||||
db.add_column('documents_documentversion', 'signature_state', self.gf('django.db.models.fields.CharField')(max_length=16, null=True, blank=True), keep_default=False)
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting field 'DocumentVersion.signature_state'
|
||||
db.delete_column('documents_documentversion', 'signature_state')
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentVersion']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.documentversion': {
|
||||
'Meta': {'unique_together': "(('document', 'major', 'minor', 'micro', 'release_level', 'serial'),)", 'object_name': 'DocumentVersion'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'major': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'micro': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'minor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'release_level': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'serial': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'signature_state': ('django.db.models.fields.CharField', [], {'max_length': '16', 'null': 'True', 'blank': 'True'}),
|
||||
'timestamp': ('django.db.models.fields.DateTimeField', [], {})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
@@ -0,0 +1,157 @@
|
||||
# encoding: utf-8
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
|
||||
# Adding field 'DocumentVersion.signature_file'
|
||||
db.add_column('documents_documentversion', 'signature_file', self.gf('django.db.models.fields.files.FileField')(max_length=100, null=True, blank=True), keep_default=False)
|
||||
|
||||
|
||||
def backwards(self, orm):
|
||||
|
||||
# Deleting field 'DocumentVersion.signature_file'
|
||||
db.delete_column('documents_documentversion', 'signature_file')
|
||||
|
||||
|
||||
models = {
|
||||
'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
'auth.permission': {
|
||||
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
'comments.comment': {
|
||||
'Meta': {'ordering': "('submit_date',)", 'object_name': 'Comment', 'db_table': "'django_comments'"},
|
||||
'comment': ('django.db.models.fields.TextField', [], {'max_length': '3000'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'content_type_set_for_comment'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'ip_address': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
|
||||
'is_public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_removed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'object_pk': ('django.db.models.fields.TextField', [], {}),
|
||||
'site': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sites.Site']"}),
|
||||
'submit_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'comment_comments'", 'null': 'True', 'to': "orm['auth.User']"}),
|
||||
'user_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'user_name': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
|
||||
'user_url': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'})
|
||||
},
|
||||
'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
'documents.document': {
|
||||
'Meta': {'ordering': "['-date_added']", 'object_name': 'Document'},
|
||||
'date_added': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'description': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']", 'null': 'True', 'blank': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'uuid': ('django.db.models.fields.CharField', [], {'max_length': '48', 'blank': 'True'})
|
||||
},
|
||||
'documents.documentpage': {
|
||||
'Meta': {'ordering': "['page_number']", 'object_name': 'DocumentPage'},
|
||||
'content': ('django.db.models.fields.TextField', [], {'db_index': 'True', 'null': 'True', 'blank': 'True'}),
|
||||
'document_version': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentVersion']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'page_label': ('django.db.models.fields.CharField', [], {'max_length': '32', 'null': 'True', 'blank': 'True'}),
|
||||
'page_number': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1', 'db_index': 'True'})
|
||||
},
|
||||
'documents.documentpagetransformation': {
|
||||
'Meta': {'ordering': "('order',)", 'object_name': 'DocumentPageTransformation'},
|
||||
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'document_page': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentPage']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
|
||||
},
|
||||
'documents.documenttype': {
|
||||
'Meta': {'ordering': "['name']", 'object_name': 'DocumentType'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '32'})
|
||||
},
|
||||
'documents.documenttypefilename': {
|
||||
'Meta': {'ordering': "['filename']", 'object_name': 'DocumentTypeFilename'},
|
||||
'document_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.DocumentType']"}),
|
||||
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'max_length': '128', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
'documents.documentversion': {
|
||||
'Meta': {'unique_together': "(('document', 'major', 'minor', 'micro', 'release_level', 'serial'),)", 'object_name': 'DocumentVersion'},
|
||||
'checksum': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'comment': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'encoding': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
|
||||
'filename': ('django.db.models.fields.CharField', [], {'default': "u''", 'max_length': '255', 'db_index': 'True'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'major': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'micro': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'mimetype': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '64'}),
|
||||
'minor': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'release_level': ('django.db.models.fields.PositiveIntegerField', [], {'default': '1'}),
|
||||
'serial': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
|
||||
'signature_file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
|
||||
'signature_state': ('django.db.models.fields.CharField', [], {'max_length': '16', 'null': 'True', 'blank': 'True'}),
|
||||
'timestamp': ('django.db.models.fields.DateTimeField', [], {})
|
||||
},
|
||||
'documents.recentdocument': {
|
||||
'Meta': {'ordering': "('-datetime_accessed',)", 'object_name': 'RecentDocument'},
|
||||
'datetime_accessed': ('django.db.models.fields.DateTimeField', [], {'db_index': 'True'}),
|
||||
'document': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['documents.Document']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
|
||||
},
|
||||
'sites.site': {
|
||||
'Meta': {'ordering': "('domain',)", 'object_name': 'Site', 'db_table': "'django_site'"},
|
||||
'domain': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
'taggit.tag': {
|
||||
'Meta': {'object_name': 'Tag'},
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '100', 'db_index': 'True'})
|
||||
},
|
||||
'taggit.taggeditem': {
|
||||
'Meta': {'object_name': 'TaggedItem'},
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_tagged_items'", 'to': "orm['contenttypes.ContentType']"}),
|
||||
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'object_id': ('django.db.models.fields.IntegerField', [], {'db_index': 'True'}),
|
||||
'tag': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'taggit_taggeditem_items'", 'to': "orm['taggit.Tag']"})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['documents']
|
||||
0
apps/documents/migrations/__init__.py
Normal file
BIN
apps/documents/static/images/icons/camera_delete.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
apps/documents/static/images/icons/page_white_copy.png
Normal file
|
After Width: | Height: | Size: 862 B |
@@ -1,5 +1,5 @@
|
||||
{% load project_tags %}
|
||||
{% load printing_tags %}
|
||||
{#{% load printing_tags %}#}
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
@@ -48,9 +48,10 @@
|
||||
</head>
|
||||
<body>
|
||||
{% for page in pages %}
|
||||
{% get_document_size object %}
|
||||
{#{% get_document_size object %}#}
|
||||
<div class="{% if forloop.counter > 1 and not forloop.last %}break{% endif %}">
|
||||
<img src="{% url document_display_print object.id %}?page={{ page.page_number }}" {% if document_aspect > page_aspect %}width="97%"{% else %}height="97%"{% endif %} />
|
||||
{#<img src="{% url document_display_print object.id %}?page={{ page.page_number }}" {% if document_aspect > page_aspect %}width="97%"{% else %}height="97%"{% endif %} />#}
|
||||
<img src="{% url document_display_print object.id %}?page={{ page.page_number }}" />
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from django.template import Library, Node, Variable
|
||||
|
||||
from converter.api import get_document_dimensions
|
||||
from converter.api import get_dimensions
|
||||
|
||||
from documents.conf.settings import PRINT_SIZE
|
||||
|
||||
@@ -13,7 +13,7 @@ class GetImageSizeNode(Node):
|
||||
|
||||
def render(self, context):
|
||||
document = Variable(self.document).resolve(context)
|
||||
width, height = get_document_dimensions(document)
|
||||
width, height = get_dimensions(document)
|
||||
context[u'document_width'], context['document_height'] = width, height
|
||||
context[u'document_aspect'] = float(width) / float(height)
|
||||
return u''
|
||||
|
||||
@@ -33,10 +33,15 @@ urlpatterns = patterns('documents.views',
|
||||
url(r'^(?P<document_id>\d+)/create/siblings/$', 'document_create_siblings', (), 'document_create_siblings'),
|
||||
url(r'^(?P<document_id>\d+)/find_duplicates/$', 'document_find_duplicates', (), 'document_find_duplicates'),
|
||||
url(r'^(?P<document_id>\d+)/clear_transformations/$', 'document_clear_transformations', (), 'document_clear_transformations'),
|
||||
|
||||
url(r'^(?P<document_pk>\d+)/version/all/$', 'document_version_list', (), 'document_version_list'),
|
||||
url(r'^document/version/(?P<document_version_pk>\d+)/download/$', 'document_download', (), 'document_version_download'),
|
||||
url(r'^document/version/(?P<document_version_pk>\d+)/revert/$', 'document_version_revert', (), 'document_version_revert'),
|
||||
|
||||
url(r'^multiple/clear_transformations/$', 'document_multiple_clear_transformations', (), 'document_multiple_clear_transformations'),
|
||||
url(r'^duplicates/list/$', 'document_find_all_duplicates', (), 'document_find_all_duplicates'),
|
||||
url(r'^maintenance/update_page_count/$', 'document_update_page_count', (), 'document_update_page_count'),
|
||||
url(r'^maintenance/clear_image_cache/$', 'document_clear_image_cache', (), 'document_clear_image_cache'),
|
||||
|
||||
url(r'^page/(?P<document_page_id>\d+)/$', 'document_page_view', (), 'document_page_view'),
|
||||
url(r'^page/(?P<document_page_id>\d+)/text/$', 'document_page_text', (), 'document_page_text'),
|
||||
|
||||
@@ -36,25 +36,27 @@ from documents.conf.settings import ROTATION_STEP
|
||||
from documents.conf.settings import PRINT_SIZE
|
||||
from documents.conf.settings import RECENT_COUNT
|
||||
|
||||
from documents.literals import PERMISSION_DOCUMENT_CREATE, \
|
||||
PERMISSION_DOCUMENT_PROPERTIES_EDIT, \
|
||||
PERMISSION_DOCUMENT_VIEW, \
|
||||
PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD, \
|
||||
PERMISSION_DOCUMENT_TRANSFORM, \
|
||||
PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_TOOLS
|
||||
from documents.literals import HISTORY_DOCUMENT_CREATED, \
|
||||
HISTORY_DOCUMENT_EDITED, HISTORY_DOCUMENT_DELETED
|
||||
from documents.literals import (PERMISSION_DOCUMENT_CREATE,
|
||||
PERMISSION_DOCUMENT_PROPERTIES_EDIT,
|
||||
PERMISSION_DOCUMENT_VIEW,
|
||||
PERMISSION_DOCUMENT_DELETE, PERMISSION_DOCUMENT_DOWNLOAD,
|
||||
PERMISSION_DOCUMENT_TRANSFORM,
|
||||
PERMISSION_DOCUMENT_EDIT, PERMISSION_DOCUMENT_TOOLS,
|
||||
PERMISSION_DOCUMENT_VERSION_REVERT)
|
||||
from documents.literals import (HISTORY_DOCUMENT_CREATED,
|
||||
HISTORY_DOCUMENT_EDITED, HISTORY_DOCUMENT_DELETED)
|
||||
|
||||
from documents.forms import DocumentTypeSelectForm, \
|
||||
DocumentForm_edit, DocumentPropertiesForm, \
|
||||
DocumentPreviewForm, \
|
||||
DocumentPageForm, DocumentPageTransformationForm, \
|
||||
DocumentContentForm, DocumentPageForm_edit, \
|
||||
DocumentPageForm_text, PrintForm, DocumentTypeForm, \
|
||||
DocumentTypeFilenameForm, DocumentTypeFilenameForm_create
|
||||
from documents.forms import (DocumentTypeSelectForm,
|
||||
DocumentForm_edit, DocumentPropertiesForm,
|
||||
DocumentPreviewForm, DocumentPageForm,
|
||||
DocumentPageTransformationForm, DocumentContentForm,
|
||||
DocumentPageForm_edit, DocumentPageForm_text, PrintForm,
|
||||
DocumentTypeForm, DocumentTypeFilenameForm,
|
||||
DocumentTypeFilenameForm_create)
|
||||
from documents.wizards import DocumentCreateWizard
|
||||
from documents.models import Document, DocumentType, DocumentPage, \
|
||||
DocumentPageTransformation, RecentDocument, DocumentTypeFilename
|
||||
from documents.models import (Document, DocumentType, DocumentPage,
|
||||
DocumentPageTransformation, RecentDocument, DocumentTypeFilename,
|
||||
DocumentVersion)
|
||||
|
||||
# Document type permissions
|
||||
from documents.literals import PERMISSION_DOCUMENT_TYPE_EDIT, \
|
||||
@@ -65,7 +67,7 @@ def document_list(request, object_list=None, title=None, extra_context=None):
|
||||
check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW])
|
||||
|
||||
context = {
|
||||
'object_list': object_list if not (object_list is None) else Document.objects.only('file_filename', 'file_extension').all(),
|
||||
'object_list': object_list if not (object_list is None) else Document.objects.all(),
|
||||
'title': title if title else _(u'documents'),
|
||||
'multi_select_as_buttons': True,
|
||||
'hide_links': True,
|
||||
@@ -114,8 +116,7 @@ def document_view(request, document_id, advanced=False):
|
||||
|
||||
if advanced:
|
||||
document_properties_form = DocumentPropertiesForm(instance=document, extra_fields=[
|
||||
{'label': _(u'Filename'), 'field': 'file_filename'},
|
||||
{'label': _(u'File extension'), 'field': 'file_extension'},
|
||||
{'label': _(u'Filename'), 'field': 'filename'},
|
||||
{'label': _(u'File mimetype'), 'field': 'file_mimetype'},
|
||||
{'label': _(u'File mime encoding'), 'field': 'file_mime_encoding'},
|
||||
{'label': _(u'File size'), 'field':lambda x: pretty_size(x.size) if x.size else '-'},
|
||||
@@ -242,15 +243,15 @@ def document_edit(request, document_id):
|
||||
for warning in warnings:
|
||||
messages.warning(request, warning)
|
||||
|
||||
document.file_filename = form.cleaned_data['new_filename']
|
||||
document.filename = form.cleaned_data['new_filename']
|
||||
document.description = form.cleaned_data['description']
|
||||
|
||||
if 'document_type_available_filenames' in form.cleaned_data:
|
||||
if form.cleaned_data['document_type_available_filenames']:
|
||||
document.file_filename = form.cleaned_data['document_type_available_filenames'].filename
|
||||
document.filename = form.cleaned_data['document_type_available_filenames'].filename
|
||||
|
||||
document.save()
|
||||
create_history(HISTORY_DOCUMENT_EDITED, document, {'user': request.user, 'diff': return_diff(old_document, document, ['file_filename', 'description'])})
|
||||
create_history(HISTORY_DOCUMENT_EDITED, document, {'user': request.user, 'diff': return_diff(old_document, document, ['filename', 'description'])})
|
||||
RecentDocument.objects.add_document_for_user(request.user, document)
|
||||
|
||||
messages.success(request, _(u'Document "%s" edited successfully.') % document)
|
||||
@@ -263,7 +264,7 @@ def document_edit(request, document_id):
|
||||
return HttpResponseRedirect(document.get_absolute_url())
|
||||
else:
|
||||
form = DocumentForm_edit(instance=document, initial={
|
||||
'new_filename': document.file_filename})
|
||||
'new_filename': document.filename})
|
||||
|
||||
return render_to_response('generic_form.html', {
|
||||
'form': form,
|
||||
@@ -279,6 +280,8 @@ def get_document_image(request, document_id, size=PREVIEW_SIZE, base64_version=F
|
||||
page = int(request.GET.get('page', DEFAULT_PAGE_NUMBER))
|
||||
|
||||
zoom = int(request.GET.get('zoom', DEFAULT_ZOOM_LEVEL))
|
||||
|
||||
version = int(request.GET.get('version', document.latest_version.pk))
|
||||
|
||||
if zoom < ZOOM_MIN_LEVEL:
|
||||
zoom = ZOOM_MIN_LEVEL
|
||||
@@ -289,25 +292,29 @@ def get_document_image(request, document_id, size=PREVIEW_SIZE, base64_version=F
|
||||
rotation = int(request.GET.get('rotation', DEFAULT_ROTATION)) % 360
|
||||
|
||||
if base64_version:
|
||||
return HttpResponse(u'<html><body><img src="%s" /></body></html>' % document.get_image(size=size, page=page, zoom=zoom, rotation=rotation, as_base64=True))
|
||||
return HttpResponse(u'<html><body><img src="%s" /></body></html>' % document.get_image(size=size, page=page, zoom=zoom, rotation=rotation, as_base64=True, version=version))
|
||||
else:
|
||||
# TODO: hardcoded MIMETYPE
|
||||
return sendfile.sendfile(request, document.get_image(size=size, page=page, zoom=zoom, rotation=rotation), mimetype=DEFAULT_FILE_FORMAT_MIMETYPE)
|
||||
# TODO: fix hardcoded MIMETYPE
|
||||
return sendfile.sendfile(request, document.get_image(size=size, page=page, zoom=zoom, rotation=rotation, version=version), mimetype=DEFAULT_FILE_FORMAT_MIMETYPE)
|
||||
|
||||
|
||||
|
||||
def document_download(request, document_id):
|
||||
def document_download(request, document_id=None, document_version_pk=None):
|
||||
check_permissions(request.user, [PERMISSION_DOCUMENT_DOWNLOAD])
|
||||
|
||||
document = get_object_or_404(Document, pk=document_id)
|
||||
if document_version_pk:
|
||||
document_version = get_object_or_404(DocumentVersion, pk=document_version_pk)
|
||||
else:
|
||||
document_version = get_object_or_404(Document, pk=document_id).latest_version
|
||||
|
||||
try:
|
||||
#Test permissions and trigger exception
|
||||
document.open()
|
||||
# Test permissions and trigger exception
|
||||
fd = document_version.open()
|
||||
fd.close()
|
||||
return serve_file(
|
||||
request,
|
||||
document.file,
|
||||
save_as=u'"%s"' % document.get_fullname(),
|
||||
content_type=document.file_mimetype if document.file_mimetype else 'application/octet-stream'
|
||||
document_version.file,
|
||||
save_as=u'"%s"' % document_version.filename,
|
||||
content_type=document_version.mimetype if document_version.mimetype else 'application/octet-stream'
|
||||
)
|
||||
except Exception, e:
|
||||
messages.error(request, e)
|
||||
@@ -451,12 +458,11 @@ def _find_duplicate_list(request, source_document_list=Document.objects.all(), i
|
||||
duplicated = []
|
||||
for document in source_document_list:
|
||||
if document.pk not in duplicated:
|
||||
results = Document.objects.filter(checksum=document.checksum).exclude(id__in=duplicated).exclude(pk=document.pk).values_list('pk', flat=True)
|
||||
results = DocumentVersion.objects.filter(checksum=document.latest_version.checksum).exclude(id__in=duplicated).exclude(pk=document.pk).values_list('document__pk', flat=True)
|
||||
duplicated.extend(results)
|
||||
|
||||
if include_source and results:
|
||||
duplicated.append(document.pk)
|
||||
|
||||
context = {
|
||||
'object_list': Document.objects.filter(pk__in=duplicated),
|
||||
'title': _(u'duplicated documents'),
|
||||
@@ -482,16 +488,16 @@ def document_update_page_count(request):
|
||||
|
||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
|
||||
office_converter = OfficeConverter()
|
||||
qs = Document.objects.exclude(file_extension__iendswith='dxf').filter(file_mimetype__in=office_converter.mimetypes())
|
||||
qs = DocumentVersion.objects.exclude(filename__iendswith='dxf').filter(mimetype__in=office_converter.mimetypes())
|
||||
|
||||
if request.method == 'POST':
|
||||
updated = 0
|
||||
processed = 0
|
||||
for document in qs:
|
||||
old_page_count = document.page_count
|
||||
document.update_page_count()
|
||||
for document_version in qs:
|
||||
old_page_count = document_version.pages.count()
|
||||
document_version.update_page_count()
|
||||
processed += 1
|
||||
if old_page_count != document.page_count:
|
||||
if old_page_count != document_version.pages.count():
|
||||
updated += 1
|
||||
|
||||
messages.success(request, _(u'Page count update complete. Documents processed: %(total)d, documents with changed page count: %(change)d') % {
|
||||
@@ -527,7 +533,7 @@ def document_clear_transformations(request, document_id=None, document_id_list=N
|
||||
if request.method == 'POST':
|
||||
for document in documents:
|
||||
try:
|
||||
for document_page in document.documentpage_set.all():
|
||||
for document_page in document.pages.all():
|
||||
document_page.document.invalidate_cached_image(document_page.page_number)
|
||||
for transformation in document_page.documentpagetransformation_set.all():
|
||||
transformation.delete()
|
||||
@@ -663,11 +669,11 @@ def document_page_navigation_next(request, document_page_id):
|
||||
view = resolve_to_name(urlparse.urlparse(request.META.get('HTTP_REFERER', u'/')).path)
|
||||
|
||||
document_page = get_object_or_404(DocumentPage, pk=document_page_id)
|
||||
if document_page.page_number >= document_page.document.documentpage_set.count():
|
||||
if document_page.page_number >= document_page.siblings.count():
|
||||
messages.warning(request, _(u'There are no more pages in this document'))
|
||||
return HttpResponseRedirect(request.META.get('HTTP_REFERER', u'/'))
|
||||
else:
|
||||
document_page = get_object_or_404(DocumentPage, document=document_page.document, page_number=document_page.page_number + 1)
|
||||
document_page = get_object_or_404(document_page.siblings, page_number=document_page.page_number + 1)
|
||||
return HttpResponseRedirect(reverse(view, args=[document_page.pk]))
|
||||
|
||||
|
||||
@@ -680,7 +686,7 @@ def document_page_navigation_previous(request, document_page_id):
|
||||
messages.warning(request, _(u'You are already at the first page of this document'))
|
||||
return HttpResponseRedirect(request.META.get('HTTP_REFERER', u'/'))
|
||||
else:
|
||||
document_page = get_object_or_404(DocumentPage, document=document_page.document, page_number=document_page.page_number - 1)
|
||||
document_page = get_object_or_404(document_page.siblings, page_number=document_page.page_number - 1)
|
||||
return HttpResponseRedirect(reverse(view, args=[document_page.pk]))
|
||||
|
||||
|
||||
@@ -689,7 +695,7 @@ def document_page_navigation_first(request, document_page_id):
|
||||
view = resolve_to_name(urlparse.urlparse(request.META.get('HTTP_REFERER', u'/')).path)
|
||||
|
||||
document_page = get_object_or_404(DocumentPage, pk=document_page_id)
|
||||
document_page = get_object_or_404(DocumentPage, document=document_page.document, page_number=1)
|
||||
document_page = get_object_or_404(document_page.siblings, page_number=1)
|
||||
return HttpResponseRedirect(reverse(view, args=[document_page.pk]))
|
||||
|
||||
|
||||
@@ -698,7 +704,7 @@ def document_page_navigation_last(request, document_page_id):
|
||||
view = resolve_to_name(urlparse.urlparse(request.META.get('HTTP_REFERER', u'/')).path)
|
||||
|
||||
document_page = get_object_or_404(DocumentPage, pk=document_page_id)
|
||||
document_page = get_object_or_404(DocumentPage, document=document_page.document, page_number=document_page.document.documentpage_set.count())
|
||||
document_page = get_object_or_404(document_page.siblings, page_number=document_page.siblings.count())
|
||||
return HttpResponseRedirect(reverse(view, args=[document_page.pk]))
|
||||
|
||||
|
||||
@@ -793,18 +799,18 @@ def document_print(request, document_id):
|
||||
hard_copy_arguments['page_range'] = form.cleaned_data['page_range']
|
||||
|
||||
# Compute page width and height
|
||||
if form.cleaned_data['custom_page_width'] and form.cleaned_data['custom_page_height']:
|
||||
page_width = form.cleaned_data['custom_page_width']
|
||||
page_height = form.cleaned_data['custom_page_height']
|
||||
elif form.cleaned_data['page_size']:
|
||||
page_width, page_height = dict(PAGE_SIZE_DIMENSIONS)[form.cleaned_data['page_size']]
|
||||
#if form.cleaned_data['custom_page_width'] and form.cleaned_data['custom_page_height']:
|
||||
# page_width = form.cleaned_data['custom_page_width']
|
||||
# page_height = form.cleaned_data['custom_page_height']
|
||||
#elif form.cleaned_data['page_size']:
|
||||
# page_width, page_height = dict(PAGE_SIZE_DIMENSIONS)[form.cleaned_data['page_size']]
|
||||
|
||||
# Page orientation
|
||||
if form.cleaned_data['page_orientation'] == PAGE_ORIENTATION_LANDSCAPE:
|
||||
page_width, page_height = page_height, page_width
|
||||
#if form.cleaned_data['page_orientation'] == PAGE_ORIENTATION_LANDSCAPE:
|
||||
# page_width, page_height = page_height, page_width
|
||||
|
||||
hard_copy_arguments['page_width'] = page_width
|
||||
hard_copy_arguments['page_height'] = page_height
|
||||
#hard_copy_arguments['page_width'] = page_width
|
||||
#hard_copy_arguments['page_height'] = page_height
|
||||
|
||||
new_url = [reverse('document_hard_copy', args=[document_id])]
|
||||
if hard_copy_arguments:
|
||||
@@ -852,9 +858,9 @@ def document_hard_copy(request, document_id):
|
||||
if page_range:
|
||||
page_range = parse_range(page_range)
|
||||
|
||||
pages = document.documentpage_set.filter(page_number__in=page_range)
|
||||
pages = document.pages.filter(page_number__in=page_range)
|
||||
else:
|
||||
pages = document.documentpage_set.all()
|
||||
pages = document.pages.all()
|
||||
|
||||
return render_to_response('document_print.html', {
|
||||
'object': document,
|
||||
@@ -1122,3 +1128,91 @@ def document_type_filename_create(request, document_type_id):
|
||||
'document_type': document_type,
|
||||
},
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def document_clear_image_cache(request):
|
||||
check_permissions(request.user, [PERMISSION_DOCUMENT_TOOLS])
|
||||
|
||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
|
||||
|
||||
if request.method == 'POST':
|
||||
try:
|
||||
Document.clear_image_cache()
|
||||
messages.success(request, _(u'Document image cache cleared successfully'))
|
||||
except Exception, msg:
|
||||
messages.error(request, _(u'Error clearing document image cache; %s') % msg)
|
||||
|
||||
return HttpResponseRedirect(previous)
|
||||
|
||||
return render_to_response('generic_confirm.html', {
|
||||
'previous': previous,
|
||||
'title': _(u'Are you sure you wish to clear the document image cache?'),
|
||||
'form_icon': u'camera_delete.png',
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def document_version_list(request, document_pk):
|
||||
check_permissions(request.user, [PERMISSION_DOCUMENT_VIEW])
|
||||
document = get_object_or_404(Document, pk=document_pk)
|
||||
|
||||
RecentDocument.objects.add_document_for_user(request.user, document)
|
||||
|
||||
context = {
|
||||
'object_list': document.versions.order_by('-timestamp'),
|
||||
'title': _(u'versions for document: %s') % document,
|
||||
'hide_object': True,
|
||||
'object': document,
|
||||
'extra_columns': [
|
||||
{
|
||||
'name': _(u'version'),
|
||||
'attribute': 'get_formated_version',
|
||||
},
|
||||
{
|
||||
'name': _(u'time and date'),
|
||||
'attribute': 'timestamp',
|
||||
},
|
||||
{
|
||||
'name': _(u'mimetype'),
|
||||
'attribute': 'mimetype',
|
||||
},
|
||||
{
|
||||
'name': _(u'encoding'),
|
||||
'attribute': 'encoding',
|
||||
},
|
||||
{
|
||||
'name': _(u'filename'),
|
||||
'attribute': 'filename',
|
||||
},
|
||||
{
|
||||
'name': _(u'comment'),
|
||||
'attribute': 'comment',
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
return render_to_response('generic_list.html', context,
|
||||
context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def document_version_revert(request, document_version_pk):
|
||||
check_permissions(request.user, [PERMISSION_DOCUMENT_VERSION_REVERT])
|
||||
|
||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/')))
|
||||
document_version = get_object_or_404(DocumentVersion, pk=document_version_pk)
|
||||
|
||||
if request.method == 'POST':
|
||||
try:
|
||||
document_version.revert()
|
||||
messages.success(request, _(u'Document version reverted successfully'))
|
||||
except Exception, msg:
|
||||
messages.error(request, _(u'Error reverting document version; %s') % msg)
|
||||
|
||||
return HttpResponseRedirect(previous)
|
||||
|
||||
return render_to_response('generic_confirm.html', {
|
||||
'previous': previous,
|
||||
'object': document_version.document,
|
||||
'title': _(u'Are you sure you wish to revert to this version?'),
|
||||
'message': _(u'All later version after this one will be deleted too.'),
|
||||
'form_icon': u'page_refresh.png',
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
@@ -20,14 +20,19 @@ def document_link(document):
|
||||
return mark_safe(u'<a href="%s">%s</a>' % (reverse('document_view_simple', args=[document.pk]), document))
|
||||
|
||||
|
||||
def document_html_widget(document, view='document_thumbnail', click_view=None, page=DEFAULT_PAGE_NUMBER, zoom=DEFAULT_ZOOM_LEVEL, rotation=DEFAULT_ROTATION, gallery_name=None, fancybox_class='fancybox'):
|
||||
def document_html_widget(document, view='document_thumbnail', click_view=None, page=DEFAULT_PAGE_NUMBER, zoom=DEFAULT_ZOOM_LEVEL, rotation=DEFAULT_ROTATION, gallery_name=None, fancybox_class='fancybox', version=None):
|
||||
result = []
|
||||
|
||||
alt_text = _(u'document page image')
|
||||
|
||||
if not version:
|
||||
version = document.latest_version.pk
|
||||
|
||||
query_dict = {
|
||||
'page': page,
|
||||
'zoom': zoom,
|
||||
'rotation': rotation,
|
||||
'version': version,
|
||||
}
|
||||
|
||||
if gallery_name:
|
||||
@@ -67,7 +72,7 @@ def document_html_widget(document, view='document_thumbnail', click_view=None, p
|
||||
});
|
||||
</script>
|
||||
''' % {
|
||||
'url': reverse('documents-expensive-is_zoomable', args=[document.pk, page]),
|
||||
'url': reverse('documents-expensive-is_zoomable', args=[document.pk, version, page]),
|
||||
'pk': document.pk,
|
||||
'page': page if page else 1,
|
||||
'plain_template': mark_safe(u''.join(plain_template)),
|
||||
|
||||
@@ -45,7 +45,7 @@ class SmartLinkImageWidget(forms.widgets.Widget):
|
||||
for document in value['documents']:
|
||||
output.append(u'<div style="display: inline-block; margin: 0px 10px 10px 10px; %s">' % (u'border: 5px solid black; padding: 3px;' if value['current_document'] == document else u''))
|
||||
output.append(u'<div class="tc">%s</div>' % document)
|
||||
output.append(u'<div class="tc">%s: %d</div>' % (ugettext(u'Pages'), document.documentpage_set.count()))
|
||||
output.append(u'<div class="tc">%s: %d</div>' % (ugettext(u'Pages'), document.pages.count()))
|
||||
output.append(get_tags_inline_widget(document))
|
||||
output.append(u'<div style="padding: 5px;">' % document)
|
||||
output.append(document_html_widget(document, click_view='document_display', view='document_preview_multipage', fancybox_class='fancybox-noscaling', gallery_name=u'smart_link_%d_documents_gallery' % value['smart_link_instance'].pk))
|
||||
|
||||
@@ -59,7 +59,7 @@ class SmartLinkManager(models.Manager):
|
||||
if total_query:
|
||||
try:
|
||||
document_qs = Document.objects.filter(total_query)
|
||||
result[smart_link] = {'documents': document_qs.order_by('file_filename') or []}
|
||||
result[smart_link] = {'documents': document_qs.order_by('date_added') or []}
|
||||
except Exception, e:
|
||||
result[smart_link] = {'documents': []}
|
||||
errors.append(e)
|
||||
|
||||
@@ -20,7 +20,8 @@ class LockManager(models.Manager):
|
||||
lock.save(force_insert=True)
|
||||
logger.debug('acquired lock: %s' % name)
|
||||
return lock
|
||||
except IntegrityError:
|
||||
except IntegrityError, msg:
|
||||
logger.debug('IntegrityError: %s', msg)
|
||||
# There is already an existing lock
|
||||
# Check it's expiration date and if expired, reset it
|
||||
try:
|
||||
@@ -32,9 +33,10 @@ class LockManager(models.Manager):
|
||||
|
||||
if datetime.datetime.now() > lock.creation_datetime + datetime.timedelta(seconds=lock.timeout):
|
||||
logger.debug('reseting deleting stale lock: %s' % name)
|
||||
lock.timeout=timeout
|
||||
logger.debug('try to reacquire stale lock: %s' % name)
|
||||
lock.timeout = timeout
|
||||
logger.debug('trying to reacquire stale lock: %s' % name)
|
||||
lock.save()
|
||||
logger.debug('reacquired stale lock: %s' % name)
|
||||
return lock
|
||||
else:
|
||||
logger.debug('unable to acquire lock: %s' % name)
|
||||
|
||||
@@ -8,24 +8,32 @@ from project_tools.api import register_tool
|
||||
from main.conf.settings import SIDE_BAR_SEARCH
|
||||
from main.conf.settings import DISABLE_HOME_VIEW
|
||||
|
||||
__author__ = 'Roberto Rosario'
|
||||
__copyright__ = 'Copyright 2011 Roberto Rosario'
|
||||
__credits__ = ['Roberto Rosario',]
|
||||
__license__ = 'GPL'
|
||||
__maintainer__ = 'Roberto Rosario'
|
||||
__email__ = 'roberto.rosario.gonzalez@gmail.com'
|
||||
__status__ = 'Production'
|
||||
|
||||
__version_info__ = {
|
||||
'major': 0,
|
||||
'minor': 11,
|
||||
'micro': 0,
|
||||
'releaselevel': 'final',
|
||||
'serial': 0
|
||||
}
|
||||
|
||||
def is_superuser(context):
|
||||
return context['request'].user.is_staff or context['request'].user.is_superuser
|
||||
|
||||
|
||||
maintenance_menu = {'text': _(u'maintenance'), 'view': 'maintenance_menu', 'famfam': 'wrench', 'icon': 'wrench.png'}
|
||||
statistics = {'text': _(u'statistics'), 'view': 'statistics', 'famfam': 'table', 'icon': 'blackboard_sum.png'}
|
||||
diagnostics = {'text': _(u'diagnostics'), 'view': 'diagnostics', 'famfam': 'pill', 'icon': 'pill.png'}
|
||||
sentry = {'text': _(u'sentry'), 'view': 'sentry', 'famfam': 'bug', 'icon': 'bug.png', 'condition': is_superuser}
|
||||
admin_site = {'text': _(u'admin site'), 'view': 'admin:index', 'famfam': 'keyboard', 'icon': 'keyboard.png', 'condition': is_superuser}
|
||||
|
||||
__version_info__ = {
|
||||
'major': 0,
|
||||
'minor': 10,
|
||||
'micro': 0,
|
||||
'releaselevel': 'hotfix',
|
||||
'serial': 4
|
||||
}
|
||||
|
||||
if not DISABLE_HOME_VIEW:
|
||||
register_top_menu('home', link={'text': _(u'home'), 'view': 'home', 'famfam': 'house'}, position=0)
|
||||
if not SIDE_BAR_SEARCH:
|
||||
@@ -36,14 +44,15 @@ def get_version():
|
||||
"""
|
||||
Return the formatted version information
|
||||
"""
|
||||
vers = ["%(major)i.%(minor)i" % __version_info__, ]
|
||||
vers = ['%(major)i.%(minor)i' % __version_info__, ]
|
||||
|
||||
if __version_info__['micro']:
|
||||
vers.append(".%(micro)i" % __version_info__)
|
||||
vers.append('.%(micro)i' % __version_info__)
|
||||
if __version_info__['releaselevel'] != 'final':
|
||||
vers.append('%(releaselevel)s%(serial)i' % __version_info__)
|
||||
return ''.join(vers)
|
||||
|
||||
|
||||
__version__ = get_version()
|
||||
|
||||
register_setup(admin_site)
|
||||
|
||||
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-11-22 11:26-0400\n"
|
||||
"POT-Creation-Date: 2011-12-06 03:26-0400\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@@ -17,31 +17,31 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: __init__.py:15
|
||||
#: __init__.py:31
|
||||
msgid "maintenance"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:16
|
||||
#: __init__.py:32
|
||||
msgid "statistics"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:17
|
||||
#: __init__.py:33
|
||||
msgid "diagnostics"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:18
|
||||
#: __init__.py:34
|
||||
msgid "sentry"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:19
|
||||
#: __init__.py:35
|
||||
msgid "admin site"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:30
|
||||
#: __init__.py:38
|
||||
msgid "home"
|
||||
msgstr ""
|
||||
|
||||
#: __init__.py:32
|
||||
#: __init__.py:40
|
||||
msgid "search"
|
||||
msgstr ""
|
||||
|
||||
@@ -130,6 +130,10 @@ msgstr ""
|
||||
msgid "Other available actions"
|
||||
msgstr ""
|
||||
|
||||
#: templates/home.html:8
|
||||
msgid "Django based open source document management system"
|
||||
msgstr ""
|
||||
|
||||
#: templates/project_description.html:6
|
||||
msgid ""
|
||||
"Open source, Django based electronic document manager with custom metadata, "
|
||||
|
||||
@@ -1,49 +1,49 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
|
||||
# This file is distributed under the same license as the PACKAGE package.
|
||||
#
|
||||
#
|
||||
# Translators:
|
||||
# Roberto Rosario <roberto.rosario.gonzalez@gmail.com>, 2011.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Mayan EDMS\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2011-11-22 11:26-0400\n"
|
||||
"PO-Revision-Date: 2011-11-04 00:56+0000\n"
|
||||
"Last-Translator: rosarior <roberto.rosario.gonzalez@gmail.com>\n"
|
||||
"Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/"
|
||||
"mayan-edms/team/es/)\n"
|
||||
"Language: es\n"
|
||||
"POT-Creation-Date: 2011-12-06 03:26-0400\n"
|
||||
"PO-Revision-Date: 2011-12-06 03:27\n"
|
||||
"Last-Translator: Administrador <admin@admin.com>\n"
|
||||
"Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/mayan-edms/team/es/)\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Language: es\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
|
||||
"X-Translated-Using: django-rosetta 0.6.2\n"
|
||||
|
||||
#: __init__.py:15
|
||||
#: __init__.py:31
|
||||
msgid "maintenance"
|
||||
msgstr "mantenimiento"
|
||||
|
||||
#: __init__.py:16
|
||||
#: __init__.py:32
|
||||
msgid "statistics"
|
||||
msgstr "estadísticas"
|
||||
|
||||
#: __init__.py:17
|
||||
#: __init__.py:33
|
||||
msgid "diagnostics"
|
||||
msgstr "diagnósticos"
|
||||
|
||||
#: __init__.py:18
|
||||
#: __init__.py:34
|
||||
msgid "sentry"
|
||||
msgstr "sentry"
|
||||
|
||||
#: __init__.py:19
|
||||
#: __init__.py:35
|
||||
msgid "admin site"
|
||||
msgstr "sitio administrativo"
|
||||
|
||||
#: __init__.py:30
|
||||
#: __init__.py:38
|
||||
msgid "home"
|
||||
msgstr "inicio"
|
||||
|
||||
#: __init__.py:32
|
||||
#: __init__.py:40
|
||||
msgid "search"
|
||||
msgstr "búsqueda"
|
||||
|
||||
@@ -61,11 +61,11 @@ msgstr "Diagnósticos"
|
||||
|
||||
#: conf/settings.py:12
|
||||
msgid ""
|
||||
"Controls whether the search functionality is provided by a sidebar widget or "
|
||||
"by a menu entry."
|
||||
"Controls whether the search functionality is provided by a sidebar "
|
||||
"widget or by a menu entry."
|
||||
msgstr ""
|
||||
"Controla si la funcionalidad de búsqueda es proporcionada por una barra "
|
||||
"lateral o por una entrada de menú."
|
||||
"Controla si la funcionalidad de búsqueda es proporcionada por una "
|
||||
"barra lateral o por una entrada de menú."
|
||||
|
||||
#: templates/about.html:5
|
||||
msgid "About this program"
|
||||
@@ -134,10 +134,15 @@ msgstr "Acciones"
|
||||
msgid "Other available actions"
|
||||
msgstr "Otras acciones disponibles"
|
||||
|
||||
#: templates/home.html:8
|
||||
msgid "Django based open source document management system"
|
||||
msgstr "Gestor de documentos de código abierto, basado en Django."
|
||||
|
||||
#: templates/project_description.html:6
|
||||
msgid ""
|
||||
"Open source, Django based electronic document manager with custom metadata, "
|
||||
"indexing, tagging, file serving integration and OCR capabilities"
|
||||
"Open source, Django based electronic document manager with custom "
|
||||
"metadata, indexing, tagging, file serving integration and OCR "
|
||||
"capabilities"
|
||||
msgstr ""
|
||||
"Gestor documental de código abierto, basado en Django con metadatos "
|
||||
"personaliables, indexación, etiquedado de documentos, integración de "
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
<div class="content tc">
|
||||
<h1>{% project_name %}</h1>
|
||||
<img src="{{ STATIC_URL }}images/1068504_92921456.jpg" />
|
||||
<h2>{% trans 'Django based open source document management system' %}</h2><hr>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block footer %}
|
||||
|
||||
@@ -108,10 +108,14 @@ def document_post_save(sender, instance, **kwargs):
|
||||
post_save.connect(document_post_save, sender=Document)
|
||||
|
||||
|
||||
@receiver(post_save, dispatch_uid='call_queue', sender=QueueDocument)
|
||||
def call_queue(sender, **kwargs):
|
||||
logger.debug('got call_queue signal')
|
||||
task_process_document_queues()
|
||||
# Disabled because it appears Django execute signals using the same
|
||||
# process effectively blocking the view until the OCR process completes
|
||||
# which could take several minutes :/
|
||||
#@receiver(post_save, dispatch_uid='call_queue', sender=QueueDocument)
|
||||
#def call_queue(sender, **kwargs):
|
||||
# if kwargs.get('created', False):
|
||||
# logger.debug('got call_queue signal: %s' % kwargs)
|
||||
# task_process_document_queues()
|
||||
|
||||
|
||||
create_default_queue()
|
||||
|
||||
@@ -88,7 +88,7 @@ def do_document_ocr(queue_document):
|
||||
parser, if the parser fails or if there is no parser registered for
|
||||
the document mimetype do a visual OCR by calling tesseract
|
||||
"""
|
||||
for document_page in queue_document.document.documentpage_set.all():
|
||||
for document_page in queue_document.document.pages.all():
|
||||
try:
|
||||
# Try to extract text by means of a parser
|
||||
parse_document_page(document_page)
|
||||
|
||||
@@ -10,7 +10,7 @@ register_settings(
|
||||
settings=[
|
||||
{'name': u'TESSERACT_PATH', 'global_name': u'OCR_TESSERACT_PATH', 'default': u'/usr/bin/tesseract', 'exists': True},
|
||||
{'name': u'TESSERACT_LANGUAGE', 'global_name': u'OCR_TESSERACT_LANGUAGE', 'default': u'eng'},
|
||||
{'name': u'REPLICATION_DELAY', 'global_name': u'OCR_REPLICATION_DELAY', 'default': 10, 'description': _(u'Amount of seconds to delay OCR of documents to allow for the node\'s storage replication overhead.')},
|
||||
{'name': u'REPLICATION_DELAY', 'global_name': u'OCR_REPLICATION_DELAY', 'default': 0, 'description': _(u'Amount of seconds to delay OCR of documents to allow for the node\'s storage replication overhead.')},
|
||||
{'name': u'NODE_CONCURRENT_EXECUTION', 'global_name': u'OCR_NODE_CONCURRENT_EXECUTION', 'default': 1, 'description': _(u'Maximum amount of concurrent document OCRs a node can perform.')},
|
||||
{'name': u'AUTOMATIC_OCR', 'global_name': u'OCR_AUTOMATIC_OCR', 'default': False, 'description': _(u'Automatically queue newly created documents for OCR.')},
|
||||
{'name': u'QUEUE_PROCESSING_INTERVAL', 'global_name': u'OCR_QUEUE_PROCESSING_INTERVAL', 'default': 10},
|
||||
|
||||
@@ -11,3 +11,7 @@ class UnpaperError(Exception):
|
||||
Raised by unpaper
|
||||
"""
|
||||
pass
|
||||
|
||||
|
||||
class ReQueueError(Exception):
|
||||
pass
|
||||
|
||||