diff --git a/apps/icons/iconsets/fat_cow.py b/apps/icons/iconsets/fat_cow.py index c6c5c545e6..9744c0e1d3 100644 --- a/apps/icons/iconsets/fat_cow.py +++ b/apps/icons/iconsets/fat_cow.py @@ -11,6 +11,11 @@ class IconSet(IconSetBase): available_sizes = ['32x32', '16x16'] dictionary = { ADD: 'add.png', + APPLICATION_FORM: 'application_form.png', + APPLICATION_FORM_DELETE: 'application_form_delete.png', + APPLICATION_FORM_EDIT: 'application_form_edit.png', + APPLICATION_FORM_ADD: 'application_form_add.png', + APPLICATION_VIEW_ICONS: 'application_view_icons.png', APPLICATION_VIEW_ICONS: 'application_view_icons.png', ARROW_TURN_RIGHT: 'arrow_turn_right.png', ARROW_TURN_LEFT: 'arrow_turn_left.png', @@ -49,14 +54,20 @@ class IconSet(IconSetBase): DELETE: 'delete.png', DISK: 'disk.png', DRAW_AIRBRUSH: 'draw_airbrush.png', + DRIVE: 'drive.png', + DRIVE_NETWORK: 'drive_network.png', + DRIVE_USER: 'drive_user.png', DOCUMENT_SIGNATURE: 'document_signature.png', + EMAIL: 'email.png', ERROR: 'error.png', FOLDER: 'folder.png', FOLDERS: 'folders.png', FOLDER_ADD: 'folder_add.png', + FOLDER_CAMERA: 'folder_camera.png', FOLDER_EDIT: 'folder_edit.png', FOLDER_DELETE: 'folder_delete.png', FOLDER_GO: 'folder_go.png', + FOLDER_MAGNIFY: 'folder_magnify.png', FOLDER_PAGE: 'folder_page.png', FOLDER_USER: 'folder_user.png', GROUP: 'group.png', @@ -68,6 +79,8 @@ class IconSet(IconSetBase): GROUP_MEMBERS: ['group.png', 'arrow_refresh.png'], HOURGLASS: 'hourglass.png', HOUSE: 'house.png', + IMAGE: 'image.png', + IMAGES: 'images.png', INDEX: 'index.png', INFORMATION: 'information.png', KEY: 'key.png', @@ -101,6 +114,7 @@ class IconSet(IconSetBase): NODE_TREE_DELETE: ['node-tree.png', 'delete.png'], PACKAGE: 'package.png', PAGE: 'page.png', + PAGE_ADD: 'page_add.png', PAGE_COPY: 'page_copy.png', PAGE_GEAR: 'page_gear.png', PAGE_GO: 'page_go.png', @@ -123,6 +137,7 @@ class IconSet(IconSetBase): PILL: 'pill.png', PLUGIN: 'plugin.png', PRINTER: 'printer.png', + PRINTER_EMPTY: 'printer_empty.png', RADIOACTIVITY: 'radioactivity.png', RAINBOW: 'rainbow.png', RESULTSET_FIRST: 'resultset_first.png', @@ -169,6 +184,7 @@ class IconSet(IconSetBase): WIZARD_DELETE: ['wizard.png', 'delete.png'], WIZARD_EDIT: ['wizard.png', 'pencil.png'], WIZARD_LIGHTNING: ['wizard.png', 'lightning.png'], + WORLD: 'world.png', WORLD_GO: 'world_go.png', WRENCH: 'wrench.png', XHTML: 'xhtml.png', diff --git a/apps/icons/literals.py b/apps/icons/literals.py index 4c94c1f731..0123f47733 100644 --- a/apps/icons/literals.py +++ b/apps/icons/literals.py @@ -5,6 +5,10 @@ DEFAULT_ICON_SET = 'fat_cow' ICONSETS_STATIC_DIRECTORY = 'icons' ADD = 'add' +APPLICATION_FORM = 'application_form' +APPLICATION_FORM_DELETE = 'application_form_delete' +APPLICATION_FORM_EDIT = 'application_form_edit' +APPLICATION_FORM_ADD = 'application_form_add' APPLICATION_VIEW_ICONS = 'application_view_icons' ARROW_TURN_RIGHT = 'arrow_turn_right' ARROW_TURN_LEFT = 'arrow_turn_left' @@ -43,16 +47,22 @@ DATABASE_LIGHTNING = 'database_lightning' DELETE = 'delete' DISK = 'disk' DRAW_AIRBRUSH = 'draw_airbrush' +DRIVE = 'drive' +DRIVE_NETWORK = 'drive_network' +DRIVE_USER = 'drive_user' DOCUMENT_SIGNATURE = 'document_signature' +EMAIL = 'email' ERROR = 'error' FILE_EXTENSION_ERROR = 'file_extension_error' FILE_EXTENSION_UNKNOWN = 'file_extension_unknown' FOLDER = 'folder' FOLDERS = 'folders' FOLDER_ADD = 'folder_add' +FOLDER_CAMERA = 'folder_camera' FOLDER_EDIT = 'folder_edit' FOLDER_DELETE = 'folder_delete' FOLDER_GO = 'folder_go' +FOLDER_MAGNIFY = 'folder_magnify' FOLDER_PAGE = 'folder_page' FOLDER_USER = 'folder_user' GROUP = 'group' @@ -64,6 +74,8 @@ GROUP_LINK = 'group_link' GROUP_MEMBERS = 'group_members' HOURGLASS = 'hourglass' HOUSE = 'house' +IMAGE = 'image' +IMAGES = 'images' INDEX = 'index' INFORMATION = 'information' KEY = 'key' @@ -97,6 +109,7 @@ NODE_TREE_EDIT = 'node_tree_edit' NODE_TREE_DELETE = 'node_tree_delete' PACKAGE = 'package' PAGE = 'page' +PAGE_ADD = 'page_add' PAGE_COPY = 'page_copy' PAGE_DELETE = 'page_delete' PAGE_EDIT = 'page_edit' @@ -119,6 +132,7 @@ PICTURES = 'pictures' PILL = 'pill' PLUGIN = 'plugin' PRINTER = 'printer' +PRINTER_EMPTY = 'printer_empty' RADIOACTIVITY = 'radioactivity' RAINBOW = 'rainbow' RESULTSET_FIRST = 'resultset_first' @@ -165,6 +179,7 @@ WIZARD_ADD = 'wizard_add' WIZARD_DELETE = 'wizard_delete' WIZARD_EDIT = 'wizard_edit' WIZARD_LIGHTNING = 'wizard_lightning' +WORLD = 'world' WORLD_GO = 'world_go' WRENCH = 'wrench' XHTML = 'xhtml' diff --git a/apps/sources/__init__.py b/apps/sources/__init__.py index 3cf8e6122b..8b13789179 100644 --- a/apps/sources/__init__.py +++ b/apps/sources/__init__.py @@ -1,76 +1 @@ -from __future__ import absolute_import -from django.utils.translation import ugettext_lazy as _ - -#from backups.api import AppBackup, ModelBackup -#from app_registry import register_app, UnableToRegister -from common.utils import encapsulate -from documents.models import Document -from navigation.api import (bind_links, register_model_list_columns, - register_sidebar_template) -from project_setup.api import register_setup -from scheduler.api import LocalScheduler - -from .conf.settings import EMAIL_PROCESSING_INTERVAL -from .links import (staging_file_delete, setup_sources, - setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list, - setup_pop3_email_list, setup_imap_email_list, setup_source_edit, - setup_source_delete, setup_source_create, setup_source_log_list, - setup_source_transformation_list, setup_source_transformation_create, - setup_source_transformation_edit, setup_source_transformation_delete, - upload_version, document_create_multiple, setup_local_scanner_list, - setup_local_scanners_refresh) -from .models import (WebForm, StagingFolder, SourceTransformation, - WatchFolder, POP3Email, IMAPEmail, LocalScanner) -from .staging import StagingFile -from .tasks import task_fetch_pop3_emails, task_fetch_imap_emails -from .widgets import staging_file_thumbnail - -bind_links([StagingFile], [staging_file_delete]) -bind_links([SourceTransformation], [setup_source_transformation_edit, setup_source_transformation_delete]) -bind_links([LocalScanner, 'setup_local_scanner_list'], [setup_local_scanners_refresh], menu_name='secondary_menu') -bind_links(['setup_imap_email_list', 'setup_pop3_email_list', 'setup_web_form_list', 'setup_staging_folder_list', 'setup_watch_folder_list', 'setup_source_create', 'setup_local_scanner_list'], [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') -bind_links([WebForm, StagingFolder, POP3Email, IMAPEmail, LocalScanner, 'setup_web_form_list', 'setup_staging_folder_list', 'setup_watch_folder_list', 'setup_source_create', 'setup_pop3_email_list', 'setup_imap_email_list', 'setup_local_scanner_list'], [setup_source_create], menu_name='secondary_menu') -bind_links([WebForm], [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') -bind_links([WebForm], [setup_source_transformation_list, setup_source_edit, setup_source_delete]) -bind_links([StagingFolder], [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') -bind_links([StagingFolder], [setup_source_transformation_list, setup_source_edit, setup_source_delete]) -bind_links([POP3Email], [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') -bind_links([POP3Email], [setup_source_transformation_list, setup_source_edit, setup_source_delete]) -bind_links([POP3Email], [setup_source_log_list]) -bind_links([IMAPEmail], [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') -bind_links([IMAPEmail], [setup_source_transformation_list, setup_source_edit, setup_source_delete]) -bind_links([IMAPEmail], [setup_source_log_list]) -bind_links([WatchFolder], [setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') -bind_links([WatchFolder], [setup_source_transformation_list, setup_source_edit, setup_source_delete]) -bind_links([LocalScanner], [setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') -bind_links([LocalScanner], [setup_source_transformation_list, setup_source_edit, setup_source_delete]) -register_sidebar_template([LocalScanner, 'setup_local_scanner_list'], 'scanner_list.html') - -# Document version -bind_links(['document_version_list', 'upload_version', 'document_version_revert', 'document_version_text_compare', 'document_version_show_diff_text'], [upload_version], menu_name='sidebar') -bind_links(['setup_source_transformation_create', 'setup_source_transformation_edit', 'setup_source_transformation_delete', 'setup_source_transformation_list'], [setup_source_transformation_create], menu_name='sidebar') -source_views = ['setup_web_form_list', 'setup_staging_folder_list', 'setup_watch_folder_list', 'setup_source_edit', 'setup_source_delete', 'setup_source_create', 'setup_source_transformation_list', 'setup_source_transformation_edit', 'setup_source_transformation_delete', 'setup_source_transformation_create'] - -register_model_list_columns(StagingFile, [ - {'name':_(u'thumbnail'), 'attribute': - encapsulate(lambda x: staging_file_thumbnail(x)) - }, - ]) - -register_setup(setup_sources) - -sources_scheduler = LocalScheduler('sources', _(u'Document sources')) -sources_scheduler.add_interval_job('task_fetch_pop3_emails', _(u'Connects to the POP3 email sources and fetches the attached documents.'), task_fetch_pop3_emails, seconds=EMAIL_PROCESSING_INTERVAL) -sources_scheduler.add_interval_job('task_fetch_imap_emails', _(u'Connects to the IMAP email sources and fetches the attached documents.'), task_fetch_imap_emails, seconds=EMAIL_PROCESSING_INTERVAL) -sources_scheduler.start() - -bind_links(['document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_interactive', 'staging_file_delete'], [document_create_multiple], menu_name='secondary_menu') -bind_links([Document], [document_create_multiple], menu_name='secondary_menu') - -#try: -# app = register_app('sources', _(u'Sources')) -#except UnableToRegister: -# pass -#else: -# AppBackup(app, [ModelBackup()]) diff --git a/apps/sources/conf/__init__.py b/apps/sources/conf/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/apps/sources/forms.py b/apps/sources/forms.py index a61f0d49a5..b5e3a59e65 100644 --- a/apps/sources/forms.py +++ b/apps/sources/forms.py @@ -8,7 +8,7 @@ from documents.forms import DocumentForm from .models import (WebForm, StagingFolder, SourceTransformation, WatchFolder, POP3Email, IMAPEmail, LocalScanner) -from .widgets import FamFamRadioSelect +from .widgets import IconRadioSelect from .utils import validate_whitelist_blacklist @@ -74,7 +74,7 @@ class WebFormForm(DocumentForm): class WebFormSetupForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(WebFormSetupForm, self).__init__(*args, **kwargs) - self.fields['icon'].widget = FamFamRadioSelect( + self.fields['icon'].widget = IconRadioSelect( attrs=self.fields['icon'].widget.attrs, choices=self.fields['icon'].widget.choices, ) @@ -86,7 +86,7 @@ class WebFormSetupForm(forms.ModelForm): class StagingFolderSetupForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(StagingFolderSetupForm, self).__init__(*args, **kwargs) - self.fields['icon'].widget = FamFamRadioSelect( + self.fields['icon'].widget = IconRadioSelect( attrs=self.fields['icon'].widget.attrs, choices=self.fields['icon'].widget.choices, ) @@ -110,7 +110,7 @@ class LocalScannerSetupForm(forms.ModelForm): def __init__(self, *args, **kwargs): super(LocalScannerSetupForm, self).__init__(*args, **kwargs) - self.fields['icon'].widget = FamFamRadioSelect( + self.fields['icon'].widget = IconRadioSelect( attrs=self.fields['icon'].widget.attrs, choices=self.fields['icon'].widget.choices, ) diff --git a/apps/sources/icons.py b/apps/sources/icons.py new file mode 100644 index 0000000000..5f4af6aa5f --- /dev/null +++ b/apps/sources/icons.py @@ -0,0 +1,26 @@ +from __future__ import absolute_import + +from icons.literals import (APPLICATION_FORM, APPLICATION_FORM_DELETE, APPLICATION_FORM_EDIT, + APPLICATION_FORM_ADD, BOOK, DELETE, EMAIL, IMAGE, FOLDER_MAGNIFY, FOLDER_CAMERA, + PAGE_ADD, ZOOM, CROSS) +from icons import Icon + +icon_staging_file_preview = Icon(ZOOM) +icon_staging_file_delete = Icon(DELETE) +icon_setup_sources = Icon(APPLICATION_FORM) +icon_setup_web_form_list = Icon(APPLICATION_FORM) +icon_setup_staging_folder_list = Icon(FOLDER_CAMERA) +icon_setup_watch_folder_list = Icon(FOLDER_MAGNIFY) +icon_setup_pop3_email_list = Icon(EMAIL) +icon_setup_imap_email_list = Icon(EMAIL) +icon_setup_local_scanner_list = Icon(IMAGE) +icon_setup_local_scanners_refresh = Icon(IMAGE) +icon_setup_source_edit = Icon(APPLICATION_FORM_EDIT) +icon_setup_source_delete = Icon(APPLICATION_FORM_DELETE) +icon_setup_source_create = Icon(APPLICATION_FORM_ADD) +icon_setup_source_log_list = Icon(BOOK) +icon_source_list = Icon(PAGE_ADD) +icon_upload_version = Icon(PAGE_ADD) +icon_document_create_multiple = Icon(PAGE_ADD) + +icon_cross = Icon(CROSS) diff --git a/apps/sources/links.py b/apps/sources/links.py index 35ada815a8..f9eab191c5 100644 --- a/apps/sources/links.py +++ b/apps/sources/links.py @@ -5,33 +5,49 @@ from django.utils.translation import ugettext_lazy as _ from navigation import Link from documents.permissions import (PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE) + from .permissions import (PERMISSION_SOURCES_SETUP_VIEW, PERMISSION_SOURCES_SETUP_EDIT, PERMISSION_SOURCES_SETUP_DELETE, PERMISSION_SOURCES_SETUP_CREATE) - -staging_file_preview = Link(text=_(u'preview'), klass='fancybox-noscaling', view='staging_file_preview', args=['source.source_type', 'source.pk', 'object.pk'], sprite='zoom', permissions=[PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]) -staging_file_delete = Link(text=_(u'delete'), view='staging_file_delete', args=['source.source_type', 'source.pk', 'object.pk'], sprite='delete', keep_query=True, permissions=[PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]) +from .icons import (icon_staging_file_preview, icon_staging_file_delete, + icon_setup_sources, icon_setup_web_form_list, icon_setup_staging_folder_list, + icon_setup_watch_folder_list, icon_setup_pop3_email_list, + icon_setup_imap_email_list, icon_setup_local_scanner_list, + icon_setup_local_scanners_refresh, icon_setup_source_edit, + icon_setup_source_delete, icon_setup_source_create, + icon_setup_source_log_list, icon_source_list, icon_upload_version, + icon_document_create_multiple, icon_staging_file_preview, + icon_staging_file_delete, icon_setup_sources, icon_setup_web_form_list, + icon_setup_staging_folder_list, icon_setup_watch_folder_list, + icon_setup_pop3_email_list, icon_setup_imap_email_list, + icon_setup_local_scanner_list, icon_setup_local_scanners_refresh, + icon_setup_source_edit, icon_setup_source_delete, icon_setup_source_create, + icon_setup_source_log_list, icon_source_list, icon_upload_version, + icon_document_create_multiple) -setup_sources = Link(text=_(u'sources'), view='setup_web_form_list', sprite='application_form', icon='application_form.png', permissions=[PERMISSION_SOURCES_SETUP_VIEW], children_view_regex=[r'setup_web_form', r'setup_staging_folder', r'setup_source_', r'setup_pop3', r'setup_imap']) -setup_web_form_list = Link(text=_(u'web forms'), view='setup_web_form_list', sprite='application_form', icon='application_form.png', permissions=[PERMISSION_SOURCES_SETUP_VIEW]) -setup_staging_folder_list = Link(text=_(u'staging folders'), view='setup_staging_folder_list', sprite='folder_camera', permissions=[PERMISSION_SOURCES_SETUP_VIEW]) -setup_watch_folder_list = Link(text=_(u'watch folders'), view='setup_watch_folder_list', sprite='folder_magnify', permissions=[PERMISSION_SOURCES_SETUP_VIEW]) -setup_pop3_email_list = Link(text=_(u'POP3 email'), view='setup_pop3_email_list', sprite='email', permissions=[PERMISSION_SOURCES_SETUP_VIEW]) -setup_imap_email_list = Link(text=_(u'IMAP email'), view='setup_imap_email_list', sprite='email', permissions=[PERMISSION_SOURCES_SETUP_VIEW]) -setup_local_scanner_list = Link(text=_(u'Local scanner'), view='setup_local_scanner_list', sprite='image', permissions=[PERMISSION_SOURCES_SETUP_VIEW]) -setup_local_scanners_refresh = Link(text=_(u'Refresh scanner list'), view='scanners_refresh', sprite='images', permissions=[PERMISSION_SOURCES_SETUP_VIEW]) +staging_file_preview = Link(text=_(u'preview'), klass='fancybox-noscaling', view='staging_file_preview', args=['source.source_type', 'source.pk', 'object.pk'], icon=icon_staging_file_preview, permissions=[PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]) +staging_file_delete = Link(text=_(u'delete'), view='staging_file_delete', args=['source.source_type', 'source.pk', 'object.pk'], icon=icon_staging_file_delete, keep_query=True, permissions=[PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]) -setup_source_edit = Link(text=_(u'edit'), view='setup_source_edit', args=['source.source_type', 'source.pk'], sprite='application_form_edit', permissions=[PERMISSION_SOURCES_SETUP_EDIT]) -setup_source_delete = Link(text=_(u'delete'), view='setup_source_delete', args=['source.source_type', 'source.pk'], sprite='application_form_delete', permissions=[PERMISSION_SOURCES_SETUP_DELETE]) -setup_source_create = Link(text=_(u'add new source'), view='setup_source_create', args='source_type', sprite='application_form_add', permissions=[PERMISSION_SOURCES_SETUP_CREATE]) -setup_source_log_list = Link(text=_(u'logs'), view='setup_source_log_list', args=['source.source_type', 'source.pk'], sprite='book', permissions=[PERMISSION_SOURCES_SETUP_EDIT]) +setup_sources = Link(text=_(u'sources'), view='setup_web_form_list', icon=icon_setup_sources, permissions=[PERMISSION_SOURCES_SETUP_VIEW], children_view_regex=[r'setup_web_form', r'setup_staging_folder', r'setup_source_', r'setup_pop3', r'setup_imap']) +setup_web_form_list = Link(text=_(u'web forms'), view='setup_web_form_list', icon=icon_setup_web_form_list, permissions=[PERMISSION_SOURCES_SETUP_VIEW]) +setup_staging_folder_list = Link(text=_(u'staging folders'), view='setup_staging_folder_list', icon=icon_setup_staging_folder_list, permissions=[PERMISSION_SOURCES_SETUP_VIEW]) +setup_watch_folder_list = Link(text=_(u'watch folders'), view='setup_watch_folder_list', icon=icon_setup_watch_folder_list, permissions=[PERMISSION_SOURCES_SETUP_VIEW]) +setup_pop3_email_list = Link(text=_(u'POP3 email'), view='setup_pop3_email_list', icon=icon_setup_pop3_email_list, permissions=[PERMISSION_SOURCES_SETUP_VIEW]) +setup_imap_email_list = Link(text=_(u'IMAP email'), view='setup_imap_email_list', icon=icon_setup_imap_email_list, permissions=[PERMISSION_SOURCES_SETUP_VIEW]) +setup_local_scanner_list = Link(text=_(u'Local scanner'), view='setup_local_scanner_list', icon=icon_setup_local_scanner_list, permissions=[PERMISSION_SOURCES_SETUP_VIEW]) +setup_local_scanners_refresh = Link(text=_(u'Refresh scanner list'), view='scanners_refresh', icon=icon_setup_local_scanners_refresh, permissions=[PERMISSION_SOURCES_SETUP_VIEW]) -setup_source_transformation_list = Link(text=_(u'transformations'), view='setup_source_transformation_list', args=['source.source_type', 'source.pk'], sprite='shape_move_front', permissions=[PERMISSION_SOURCES_SETUP_EDIT]) -setup_source_transformation_create = Link(text=_(u'add transformation'), view='setup_source_transformation_create', args=['source.source_type', 'source.pk'], sprite='shape_square_add', permissions=[PERMISSION_SOURCES_SETUP_EDIT]) -setup_source_transformation_edit = Link(text=_(u'edit'), view='setup_source_transformation_edit', args='transformation.pk', sprite='shape_square_edit', permissions=[PERMISSION_SOURCES_SETUP_EDIT]) -setup_source_transformation_delete = Link(text=_(u'delete'), view='setup_source_transformation_delete', args='transformation.pk', sprite='shape_square_delete', permissions=[PERMISSION_SOURCES_SETUP_EDIT]) +setup_source_edit = Link(text=_(u'edit'), view='setup_source_edit', args=['source.source_type', 'source.pk'], icon=icon_setup_source_edit, permissions=[PERMISSION_SOURCES_SETUP_EDIT]) +setup_source_delete = Link(text=_(u'delete'), view='setup_source_delete', args=['source.source_type', 'source.pk'], icon=icon_setup_source_delete, permissions=[PERMISSION_SOURCES_SETUP_DELETE]) +setup_source_create = Link(text=_(u'add new source'), view='setup_source_create', args='source_type', icon=icon_setup_source_create, permissions=[PERMISSION_SOURCES_SETUP_CREATE]) +setup_source_log_list = Link(text=_(u'logs'), view='setup_source_log_list', args=['source.source_type', 'source.pk'], icon=icon_setup_source_log_list, permissions=[PERMISSION_SOURCES_SETUP_EDIT]) -source_list = Link(text=_(u'Document sources'), view='setup_web_form_list', sprite='page_add', children_url_regex=[r'sources/setup'], permissions=[PERMISSION_SOURCES_SETUP_VIEW]) +#setup_source_transformation_list = Link(text=_(u'transformations'), view='setup_source_transformation_list', args=['source.source_type', 'source.pk'], sprite='shape_move_front', permissions=[PERMISSION_SOURCES_SETUP_EDIT]) +#setup_source_transformation_create = Link(text=_(u'add transformation'), view='setup_source_transformation_create', args=['source.source_type', 'source.pk'], sprite='shape_square_add', permissions=[PERMISSION_SOURCES_SETUP_EDIT]) +#setup_source_transformation_edit = Link(text=_(u'edit'), view='setup_source_transformation_edit', args='transformation.pk', sprite='shape_square_edit', permissions=[PERMISSION_SOURCES_SETUP_EDIT]) +#setup_source_transformation_delete = Link(text=_(u'delete'), view='setup_source_transformation_delete', args='transformation.pk', sprite='shape_square_delete', permissions=[PERMISSION_SOURCES_SETUP_EDIT]) -upload_version = Link(text=_(u'upload new version'), view='upload_version', args='object.pk', sprite='page_add', permissions=[PERMISSION_DOCUMENT_NEW_VERSION]) -document_create_multiple = Link(text=_(u'upload new documents'), view='document_create_multiple', sprite='page_add', permissions=[PERMISSION_DOCUMENT_CREATE], children_view_regex=[r'upload_interactive']) +source_list = Link(text=_(u'Document sources'), view='setup_web_form_list', icon=icon_source_list, children_url_regex=[r'sources/setup'], permissions=[PERMISSION_SOURCES_SETUP_VIEW]) + +upload_version = Link(text=_(u'upload new version'), view='upload_version', args='object.pk', icon=icon_upload_version, permissions=[PERMISSION_DOCUMENT_NEW_VERSION]) +document_create_multiple = Link(text=_(u'upload new documents'), view='document_create_multiple', icon=icon_document_create_multiple, permissions=[PERMISSION_DOCUMENT_CREATE], children_view_regex=[r'upload_interactive']) diff --git a/apps/sources/literals.py b/apps/sources/literals.py index 4e272e5596..95a2b8b02f 100644 --- a/apps/sources/literals.py +++ b/apps/sources/literals.py @@ -1,5 +1,10 @@ +from __future__ import absolute_import + from django.utils.translation import ugettext_lazy as _ +from icons.literals import (DISK, DATABASE, DRIVE, DRIVE_NETWORK, DRIVE_USER, + EMAIL, FOLDER, WORLD, PRINTER, PRINTER_EMPTY, IMAGES) + POP3_PORT = 110 POP3_SSL_PORT = 995 DEFAULT_POP3_INTERVAL = 15 * 60 # 15 minutes in seconds @@ -25,30 +30,18 @@ SOURCE_INTERACTIVE_UNCOMPRESS_CHOICES = ( (SOURCE_UNCOMPRESS_CHOICE_ASK, _(u'Ask user')) ) -SOURCE_ICON_DISK = 'disk' -SOURCE_ICON_DATABASE = 'database' -SOURCE_ICON_DRIVE = 'drive' -SOURCE_ICON_DRIVE_NETWORK = 'drive_network' -SOURCE_ICON_DRIVE_USER = 'drive_user' -SOURCE_ICON_EMAIL = 'email' -SOURCE_ICON_FOLDER = 'folder' -SOURCE_ICON_WORLD = 'world' -SOURCE_ICON_PRINTER = 'printer' -SOURCE_ICON_PRINTER_EMPTY = 'printer_empty' -SOURCE_ICON_IMAGES = 'images' - SOURCE_ICON_CHOICES = ( - (SOURCE_ICON_DISK, _(u'Disk')), - (SOURCE_ICON_DATABASE, _(u'Database')), - (SOURCE_ICON_DRIVE, _(u'Drive')), - (SOURCE_ICON_DRIVE_NETWORK, _(u'Network drive')), - (SOURCE_ICON_DRIVE_USER, _(u'User drive')), - (SOURCE_ICON_EMAIL, _(u'Envelope')), - (SOURCE_ICON_FOLDER, _(u'Folder')), - (SOURCE_ICON_IMAGES, _(u'Images')), - (SOURCE_ICON_WORLD, _(u'World')), - (SOURCE_ICON_PRINTER, _(u'Printer')), - (SOURCE_ICON_PRINTER_EMPTY, _(u'Empty printer')), + (DISK, _(u'Disk')), + (DATABASE, _(u'Database')), + (DRIVE, _(u'Drive')), + (DRIVE_NETWORK, _(u'Network drive')), + (DRIVE_USER, _(u'User drive')), + (EMAIL, _(u'Envelope')), + (FOLDER, _(u'Folder')), + (IMAGES, _(u'Images')), + (WORLD, _(u'World')), + (PRINTER, _(u'Printer')), + (PRINTER_EMPTY, _(u'Empty printer')), ) SOURCE_CHOICE_WEB_FORM = 'webform' @@ -77,3 +70,6 @@ SOURCE_CHOICES_PLURAL = ( ) DEFAULT_LOCAL_SCANNER_FILE_FORMAT = 'JPEG' +DEFAULT_POP3_DEFAULT_TIMEOUT = 10 # for POP3 only not POP3_SSL +DEFAULT_EMAIL_PROCESSING_INTERVAL = 60 +DEFAULT_POP3_EMAIL_LOG_COUNT = 10 # Max log entries to store diff --git a/apps/sources/managers.py b/apps/sources/managers.py index b9a7d74b91..2651462748 100644 --- a/apps/sources/managers.py +++ b/apps/sources/managers.py @@ -5,7 +5,7 @@ from ast import literal_eval from django.db import models from django.contrib.contenttypes.models import ContentType -from .conf.settings import LOG_SIZE +#from .settings import LOG_SIZE class SourceTransformationManager(models.Manager): diff --git a/apps/sources/models.py b/apps/sources/models.py index 7345a76592..3b821bfedd 100644 --- a/apps/sources/models.py +++ b/apps/sources/models.py @@ -24,7 +24,7 @@ from django.core.exceptions import ValidationError from django.db import transaction from django.core.files import File -from converter.api import get_available_transformations_choices +#from converter.api import get_available_transformations_choices from converter.literals import DIMENSION_SEPARATOR from documents.models import Document, DocumentType from documents.events import history_document_created @@ -34,7 +34,7 @@ from acls.utils import apply_default_acls from .managers import SourceTransformationManager, SourceLogManager from .literals import (SOURCE_CHOICES, SOURCE_CHOICES_PLURAL, SOURCE_INTERACTIVE_UNCOMPRESS_CHOICES, SOURCE_CHOICE_WEB_FORM, - SOURCE_CHOICE_STAGING, SOURCE_ICON_DISK, SOURCE_ICON_DRIVE, + SOURCE_CHOICE_STAGING, DISK, DRIVE, SOURCE_ICON_CHOICES, SOURCE_CHOICE_WATCH, SOURCE_UNCOMPRESS_CHOICES, SOURCE_UNCOMPRESS_CHOICE_Y, POP3_PORT, POP3_SSL_PORT, @@ -42,11 +42,10 @@ from .literals import (SOURCE_CHOICES, SOURCE_CHOICES_PLURAL, IMAP_PORT, IMAP_SSL_PORT, SOURCE_CHOICE_IMAP_EMAIL, DEFAULT_IMAP_INTERVAL, IMAP_DEFAULT_MAILBOX, - SOURCE_CHOICE_LOCAL_SCANNER, SOURCE_ICON_IMAGES, + SOURCE_CHOICE_LOCAL_SCANNER, IMAGES, DEFAULT_LOCAL_SCANNER_FILE_FORMAT) from .compressed_file import CompressedFile, NotACompressedFile -from .conf.settings import POP3_TIMEOUT -#from . import sources_scheduler +#from .post_init import sources_scheduler logger = logging.getLogger(__name__) @@ -268,6 +267,8 @@ class POP3Email(EmailBaseModel): source_type = SOURCE_CHOICE_POP3_EMAIL def fetch_mail(self): + from .settings import POP3_TIMEOUT + try: last_check = SourceLog.objects.get_latest_for(self) except SourceLog.DoesNotExist: @@ -391,7 +392,7 @@ class LocalScanner(InteractiveBaseModel): is_interactive = True source_type = SOURCE_CHOICE_LOCAL_SCANNER - default_icon = SOURCE_ICON_IMAGES + default_icon = IMAGES scanner_device = models.CharField(max_length=255, verbose_name=_(u'scanner device')) scanner_description = models.CharField(max_length=255, verbose_name=_(u'scanner description')) @@ -462,7 +463,7 @@ class LocalScanner(InteractiveBaseModel): class StagingFolder(InteractiveBaseModel): is_interactive = True source_type = SOURCE_CHOICE_STAGING - default_icon = SOURCE_ICON_DRIVE + default_icon = DRIVE folder_path = models.CharField(max_length=255, verbose_name=_(u'folder path'), help_text=_(u'Server side filesystem path.')) preview_width = models.IntegerField(verbose_name=_(u'preview width'), help_text=_(u'Width value to be passed to the converter backend.')) @@ -502,7 +503,7 @@ class SourceMetadata(models.Model): class WebForm(InteractiveBaseModel): is_interactive = True source_type = SOURCE_CHOICE_WEB_FORM - default_icon = SOURCE_ICON_DISK + default_icon = DISK uncompress = models.CharField(max_length=1, choices=SOURCE_INTERACTIVE_UNCOMPRESS_CHOICES, verbose_name=_(u'uncompress'), help_text=_(u'Whether to expand or not compressed archives.')) #Default path @@ -578,7 +579,8 @@ class SourceTransformation(models.Model): object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey('content_type', 'object_id') order = models.PositiveIntegerField(default=0, blank=True, null=True, verbose_name=_(u'order'), db_index=True) - transformation = models.CharField(choices=get_available_transformations_choices(), max_length=128, verbose_name=_(u'transformation')) + #transformation = models.CharField(choices=get_available_transformations_choices(), max_length=128, verbose_name=_(u'transformation')) + transformation = models.CharField(max_length=128, verbose_name=_(u'transformation')) arguments = models.TextField(blank=True, null=True, verbose_name=_(u'arguments'), help_text=_(u'Use dictionaries to indentify arguments, example: %s') % u'{\'degrees\':90}', validators=[ArgumentsValidator()]) objects = models.Manager() diff --git a/apps/sources/post_init.py b/apps/sources/post_init.py new file mode 100644 index 0000000000..4501a1fc4a --- /dev/null +++ b/apps/sources/post_init.py @@ -0,0 +1,64 @@ +from __future__ import absolute_import + +from django.utils.translation import ugettext_lazy as _ + +from common.utils import encapsulate +from documents.models import Document +from navigation.api import (bind_links, register_model_list_columns, + register_sidebar_template) +from scheduler.api import LocalScheduler + +#from .settings import EMAIL_PROCESSING_INTERVAL +from .links import (staging_file_delete, setup_sources, + setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list, + setup_pop3_email_list, setup_imap_email_list, setup_source_edit, + setup_source_delete, setup_source_create, setup_source_log_list, + #setup_source_transformation_list, setup_source_transformation_create, + #setup_source_transformation_edit, setup_source_transformation_delete, + upload_version, document_create_multiple, setup_local_scanner_list, + setup_local_scanners_refresh) +from .models import (WebForm, StagingFolder, SourceTransformation, + WatchFolder, POP3Email, IMAPEmail, LocalScanner) +from .staging import StagingFile +from .tasks import task_fetch_pop3_emails, task_fetch_imap_emails +from .widgets import staging_file_thumbnail + +bind_links([StagingFile], [staging_file_delete]) +#bind_links([SourceTransformation], [setup_source_transformation_edit, setup_source_transformation_delete]) +bind_links([LocalScanner, 'setup_local_scanner_list'], [setup_local_scanners_refresh], menu_name='secondary_menu') +bind_links(['setup_imap_email_list', 'setup_pop3_email_list', 'setup_web_form_list', 'setup_staging_folder_list', 'setup_watch_folder_list', 'setup_source_create', 'setup_local_scanner_list'], [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') +bind_links([WebForm, StagingFolder, POP3Email, IMAPEmail, LocalScanner, 'setup_web_form_list', 'setup_staging_folder_list', 'setup_watch_folder_list', 'setup_source_create', 'setup_pop3_email_list', 'setup_imap_email_list', 'setup_local_scanner_list'], [setup_source_create], menu_name='secondary_menu') +bind_links([WebForm], [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') +bind_links([WebForm], [setup_source_edit, setup_source_delete]) +bind_links([StagingFolder], [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') +bind_links([StagingFolder], [setup_source_edit, setup_source_delete]) +bind_links([POP3Email], [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') +bind_links([POP3Email], [setup_source_edit, setup_source_delete]) +bind_links([POP3Email], [setup_source_log_list]) +bind_links([IMAPEmail], [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') +bind_links([IMAPEmail], [setup_source_edit, setup_source_delete]) +bind_links([IMAPEmail], [setup_source_log_list]) +bind_links([WatchFolder], [setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') +bind_links([WatchFolder], [setup_source_edit, setup_source_delete]) +bind_links([LocalScanner], [setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list, setup_imap_email_list, setup_local_scanner_list], menu_name='form_header') +bind_links([LocalScanner], [setup_source_edit, setup_source_delete]) +register_sidebar_template([LocalScanner, 'setup_local_scanner_list'], 'scanner_list.html') + +# Document version +bind_links(['document_version_list', 'upload_version', 'document_version_revert', 'document_version_text_compare', 'document_version_show_diff_text'], [upload_version], menu_name='sidebar') +#bind_links(['setup_source_transformation_create', 'setup_source_transformation_edit', 'setup_source_transformation_delete', 'setup_source_transformation_list'], [setup_source_transformation_create], menu_name='sidebar') +source_views = ['setup_web_form_list', 'setup_staging_folder_list', 'setup_watch_folder_list', 'setup_source_edit', 'setup_source_delete', 'setup_source_create', 'setup_source_transformation_list', 'setup_source_transformation_edit', 'setup_source_transformation_delete', 'setup_source_transformation_create'] + +register_model_list_columns(StagingFile, [ + {'name':_(u'thumbnail'), 'attribute': + encapsulate(lambda x: staging_file_thumbnail(x)) + }, + ]) + +#sources_scheduler = LocalScheduler('sources', _(u'Document sources')) +#sources_scheduler.add_interval_job('task_fetch_pop3_emails', _(u'Connects to the POP3 email sources and fetches the attached documents.'), task_fetch_pop3_emails, seconds=EMAIL_PROCESSING_INTERVAL) +#sources_scheduler.add_interval_job('task_fetch_imap_emails', _(u'Connects to the IMAP email sources and fetches the attached documents.'), task_fetch_imap_emails, seconds=EMAIL_PROCESSING_INTERVAL) +#sources_scheduler.start() + +bind_links(['document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_interactive', 'staging_file_delete'], [document_create_multiple], menu_name='secondary_menu') +bind_links([Document], [document_create_multiple], menu_name='secondary_menu') diff --git a/apps/sources/conf/settings.py b/apps/sources/registry.py similarity index 59% rename from apps/sources/conf/settings.py rename to apps/sources/registry.py index 87dc85e5ea..e3e2effe30 100644 --- a/apps/sources/conf/settings.py +++ b/apps/sources/registry.py @@ -1,15 +1,17 @@ -"""Configuration options for the sources app""" +from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ -from smart_settings.api import Setting, SettingNamespace +from .icons import icon_source_list +from .links import setup_sources -namespace = SettingNamespace('sources', _(u'Sources'), module='sources.conf.settings') - -POP3_DEFAULT_TIMEOUT = 10 # for POP3 only not POP3_SSL -DEFAULT_EMAIL_PROCESSING_INTERVAL = 60 -DEFAULT_POP3_EMAIL_LOG_COUNT = 10 # Max log entries to store +label = _(u'Sources') +description = _(u'Provides source from where to add documents.') +dependencies = ['app_registry', 'icons', 'navigation', 'documents'] +icon = icon_source_list +setup_links = [setup_sources] +''' Setting( namespace=namespace, name='POP3_TIMEOUT', @@ -30,3 +32,4 @@ Setting( global_name='SOURCES_LOG_SIZE', default=DEFAULT_POP3_EMAIL_LOG_COUNT, ) +''' diff --git a/apps/sources/staging.py b/apps/sources/staging.py index b62d78ced1..03475ab9c3 100644 --- a/apps/sources/staging.py +++ b/apps/sources/staging.py @@ -9,10 +9,10 @@ from django.core.exceptions import ObjectDoesNotExist from django.utils.translation import ugettext from django.utils.encoding import smart_str -from documents.conf.settings import THUMBNAIL_SIZE +from documents.settings import THUMBNAIL_SIZE -from mimetype.api import (get_icon_file_path, get_error_icon_file_path, - get_mimetype) +#from mimetype.api import (get_icon_file_path, get_error_icon_file_path, +from mimetype.api import get_mimetype from converter.api import convert, cache_cleanup from converter.exceptions import UnknownFileFormat, UnkownConvertError @@ -146,6 +146,7 @@ class StagingFile(object): #return convert(self.filepath, size=size, cleanup_files=False, transformations=transformations) except UnknownFileFormat: mimetype, encoding = get_mimetype(open(self.filepath, 'rb'), self.filepath) - return get_icon_file_path(mimetype) + # TODO: Fix + return ''#get_icon_file_path(mimetype) except UnkownConvertError: return get_error_icon_file_path() diff --git a/apps/sources/tasks.py b/apps/sources/tasks.py index 1758825c13..d7d7749e50 100644 --- a/apps/sources/tasks.py +++ b/apps/sources/tasks.py @@ -5,7 +5,7 @@ import logging from lock_manager import Lock, LockError from .models import POP3Email, IMAPEmail -from .conf.settings import POP3_TIMEOUT +#from .settings import POP3_TIMEOUT from .literals import IMAP_LOCK_TIMEOUT logger = logging.getLogger(__name__) diff --git a/apps/sources/views.py b/apps/sources/views.py index 2e76b2a769..37d73dd712 100644 --- a/apps/sources/views.py +++ b/apps/sources/views.py @@ -16,7 +16,7 @@ from django.core.exceptions import PermissionDenied from documents.permissions import (PERMISSION_DOCUMENT_CREATE, PERMISSION_DOCUMENT_NEW_VERSION) from documents.models import DocumentType, Document -from documents.conf.settings import THUMBNAIL_SIZE +from documents.settings import THUMBNAIL_SIZE from documents.exceptions import NewDocumentVersionNotAllowed from documents.forms import DocumentTypeSelectForm from metadata.forms import MetadataFormSet, MetadataSelectionForm @@ -27,6 +27,7 @@ from common.widgets import two_state_template import sendfile from acls.models import AccessEntry from navigation import Link +from icons import Icon from .models import (WebForm, StagingFolder, SourceTransformation, WatchFolder, POP3Email, SourceLog, IMAPEmail, LocalScanner) @@ -61,7 +62,7 @@ def get_tab_link_for_source(source, document=None): view = u'upload_interactive' args = [u'"%s"' % source.source_type, source.pk] - return Link(text=source.title, view=view, args=args, sprite=source.icon, keep_query=True, conditional_highlight=return_function(source)) + return Link(text=source.title, view=view, args=args, icon=Icon(source.icon), keep_query=True, conditional_highlight=return_function(source)) def get_active_tab_links(document=None): @@ -524,7 +525,7 @@ def setup_source_list(request, source_type): 'list_object_variable_name': 'source', 'source_type': source_type, 'extra_columns': [ - {'name': _(u'Enabled'), 'attribute': encapsulate(lambda source: two_state_template(source.enabled))}, + {'name': _(u'Enabled'), 'attribute': encapsulate(lambda source: two_state_template(source.enabled).display_small())}, ], } diff --git a/apps/sources/widgets.py b/apps/sources/widgets.py index f55223290a..518a2d736c 100644 --- a/apps/sources/widgets.py +++ b/apps/sources/widgets.py @@ -5,6 +5,10 @@ from django.conf import settings from django.utils.translation import ugettext_lazy as _ from django.core.urlresolvers import reverse +from icons import Icon + +from .icons import icon_cross + class FamFamRadioFieldRenderer(forms.widgets.RadioFieldRenderer): def render(self): @@ -21,8 +25,23 @@ class FamFamRadioFieldRenderer(forms.widgets.RadioFieldRenderer): return mark_safe(u'\n'.join(results)) -class FamFamRadioSelect(forms.widgets.RadioSelect): - renderer = FamFamRadioFieldRenderer +class IconRadioFieldRenderer(forms.widgets.RadioFieldRenderer): + def render(self): + results = [] + results.append(u'') + return mark_safe(u'\n'.join(results)) + + +class IconRadioSelect(forms.widgets.RadioSelect): + renderer = IconRadioFieldRenderer def staging_file_thumbnail(staging_file): diff --git a/settings.py b/settings.py index c6413338d1..a1f42a0a74 100644 --- a/settings.py +++ b/settings.py @@ -182,7 +182,7 @@ INSTALLED_APPS = ( 'main', #'installation', 'document_indexing', - #'sources', + 'sources', #'mailer', #'document_acls', 'history', diff --git a/urls.py b/urls.py index 19e445d856..8976ce2acd 100644 --- a/urls.py +++ b/urls.py @@ -24,7 +24,7 @@ urlpatterns = patterns('', (r'^document_indexing/', include('document_indexing.urls')), (r'^history/', include('history.urls')), (r'^converter/', include('converter.urls')), - #(r'^sources/', include('sources.urls')), + (r'^sources/', include('sources.urls')), (r'^acls/', include('acls.urls')), #(r'^document_acls/', include('document_acls.urls')), (r'^api/', include('rest_api.urls')),