Add per POP email source interval, add per email source log

This commit is contained in:
Roberto Rosario
2012-03-12 13:36:56 -04:00
parent b849352b3a
commit d1cf15b3eb
8 changed files with 257 additions and 38 deletions

View File

@@ -23,7 +23,7 @@ from .conf.settings import POP3_EMAIL_PROCESSING_INTERVAL
staging_file_preview = {'text': _(u'preview'), 'class': 'fancybox-noscaling', 'view': 'staging_file_preview', 'args': ['source.source_type', 'source.pk', 'object.id'], 'famfam': 'zoom', 'permissions': [PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]} staging_file_preview = {'text': _(u'preview'), 'class': 'fancybox-noscaling', 'view': 'staging_file_preview', 'args': ['source.source_type', 'source.pk', 'object.id'], 'famfam': 'zoom', 'permissions': [PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]}
staging_file_delete = {'text': _(u'delete'), 'view': 'staging_file_delete', 'args': ['source.source_type', 'source.pk', 'object.id'], 'famfam': 'delete', 'keep_query': True, 'permissions': [PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]} staging_file_delete = {'text': _(u'delete'), 'view': 'staging_file_delete', 'args': ['source.source_type', 'source.pk', 'object.id'], 'famfam': 'delete', 'keep_query': True, 'permissions': [PERMISSION_DOCUMENT_NEW_VERSION, PERMISSION_DOCUMENT_CREATE]}
setup_sources = {'text': _(u'sources'), 'view': 'setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebForm], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW], 'children_view_regex': [r'setup_web_form', r'setup_staging_folder', r'setup_source_']} setup_sources = {'text': _(u'sources'), 'view': 'setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebForm], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW], 'children_view_regex': [r'setup_web_form', r'setup_staging_folder', r'setup_source_', r'setup_pop3']}
setup_web_form_list = {'text': _(u'web forms'), 'view': 'setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebForm], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]} setup_web_form_list = {'text': _(u'web forms'), 'view': 'setup_web_form_list', 'famfam': 'application_form', 'icon': 'application_form.png', 'children_classes': [WebForm], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]}
setup_staging_folder_list = {'text': _(u'staging folders'), 'view': 'setup_staging_folder_list', 'famfam': 'folder_camera', 'children_classes': [StagingFolder], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]} setup_staging_folder_list = {'text': _(u'staging folders'), 'view': 'setup_staging_folder_list', 'famfam': 'folder_camera', 'children_classes': [StagingFolder], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]}
setup_watch_folder_list = {'text': _(u'watch folders'), 'view': 'setup_watch_folder_list', 'famfam': 'folder_magnify', 'children_classes': [WatchFolder], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]} setup_watch_folder_list = {'text': _(u'watch folders'), 'view': 'setup_watch_folder_list', 'famfam': 'folder_magnify', 'children_classes': [WatchFolder], 'permissions': [PERMISSION_SOURCES_SETUP_VIEW]}
@@ -32,6 +32,7 @@ setup_pop3_email_list = {'text': _(u'POP3 email'), 'view': 'setup_pop3_email_lis
setup_source_edit = {'text': _(u'edit'), 'view': 'setup_source_edit', 'args': ['source.source_type', 'source.pk'], 'famfam': 'application_form_edit', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]} setup_source_edit = {'text': _(u'edit'), 'view': 'setup_source_edit', 'args': ['source.source_type', 'source.pk'], 'famfam': 'application_form_edit', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]}
setup_source_delete = {'text': _(u'delete'), 'view': 'setup_source_delete', 'args': ['source.source_type', 'source.pk'], 'famfam': 'application_form_delete', 'permissions': [PERMISSION_SOURCES_SETUP_DELETE]} setup_source_delete = {'text': _(u'delete'), 'view': 'setup_source_delete', 'args': ['source.source_type', 'source.pk'], 'famfam': 'application_form_delete', 'permissions': [PERMISSION_SOURCES_SETUP_DELETE]}
setup_source_create = {'text': _(u'add new source'), 'view': 'setup_source_create', 'args': 'source_type', 'famfam': 'application_form_add', 'permissions': [PERMISSION_SOURCES_SETUP_CREATE]} setup_source_create = {'text': _(u'add new source'), 'view': 'setup_source_create', 'args': 'source_type', 'famfam': 'application_form_add', 'permissions': [PERMISSION_SOURCES_SETUP_CREATE]}
setup_source_log_list = {'text': _(u'logs'), 'view': 'setup_source_log_list', 'args': ['source.source_type', 'source.pk'], 'famfam': 'book', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]}
setup_source_transformation_list = {'text': _(u'transformations'), 'view': 'setup_source_transformation_list', 'args': ['source.source_type', 'source.pk'], 'famfam': 'shape_move_front', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]} setup_source_transformation_list = {'text': _(u'transformations'), 'view': 'setup_source_transformation_list', 'args': ['source.source_type', 'source.pk'], 'famfam': 'shape_move_front', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]}
setup_source_transformation_create = {'text': _(u'add transformation'), 'view': 'setup_source_transformation_create', 'args': ['source.source_type', 'source.pk'], 'famfam': 'shape_square_add', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]} setup_source_transformation_create = {'text': _(u'add transformation'), 'view': 'setup_source_transformation_create', 'args': ['source.source_type', 'source.pk'], 'famfam': 'shape_square_add', 'permissions': [PERMISSION_SOURCES_SETUP_EDIT]}
@@ -53,7 +54,8 @@ register_links(['setup_pop3_email_list', 'setup_web_form_list', 'setup_staging_f
register_links(WebForm, [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list], menu_name='form_header') register_links(WebForm, [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list], menu_name='form_header')
register_links(WebForm, [setup_source_transformation_list, setup_source_edit, setup_source_delete]) register_links(WebForm, [setup_source_transformation_list, setup_source_edit, setup_source_delete])
register_links(['setup_web_form_list', 'setup_staging_folder_list', 'setup_watch_folder_list', 'setup_source_edit', 'setup_source_delete', 'setup_source_create', 'setup_pop3_email_list'], [setup_sources, setup_source_create], menu_name='sidebar') #register_links(['setup_source_log_list', 'setup_web_form_list', 'setup_staging_folder_list', 'setup_watch_folder_list', 'setup_source_edit', 'setup_source_delete', 'setup_source_create', 'setup_pop3_email_list'], [setup_sources, setup_source_create], menu_name='secondary_menu')
register_links([WebForm, StagingFolder, POP3Email, 'setup_web_form_list', 'setup_staging_folder_list', 'setup_watch_folder_list', 'setup_source_create', 'setup_pop3_email_list'], [setup_source_create], menu_name='secondary_menu')
#register_links(StagingFolder, [setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list], menu_name='form_header') #register_links(StagingFolder, [setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list], menu_name='form_header')
register_links(StagingFolder, [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list], menu_name='form_header') register_links(StagingFolder, [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list], menu_name='form_header')
@@ -61,6 +63,7 @@ register_links(StagingFolder, [setup_source_transformation_list, setup_source_ed
register_links(POP3Email, [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list], menu_name='form_header') register_links(POP3Email, [setup_web_form_list, setup_staging_folder_list, setup_pop3_email_list], menu_name='form_header')
register_links(POP3Email, [setup_source_transformation_list, setup_source_edit, setup_source_delete]) register_links(POP3Email, [setup_source_transformation_list, setup_source_edit, setup_source_delete])
register_links(POP3Email, [setup_source_log_list])
register_links(WatchFolder, [setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list], menu_name='form_header') register_links(WatchFolder, [setup_web_form_list, setup_staging_folder_list, setup_watch_folder_list], menu_name='form_header')
register_links(WatchFolder, [setup_source_transformation_list, setup_source_edit, setup_source_delete]) register_links(WatchFolder, [setup_source_transformation_list, setup_source_edit, setup_source_delete])

View File

@@ -8,8 +8,9 @@ from smart_settings.api import Setting, SettingNamespace
namespace = SettingNamespace('sources', _(u'Sources'), module='sources.conf.settings') namespace = SettingNamespace('sources', _(u'Sources'), module='sources.conf.settings')
POP3_DEFAULT_TIMEOUT = 10 # POP3 only not SSL POP3_DEFAULT_TIMEOUT = 10 # for POP3 only not POP3_SSL
POP3_DEFAULT_EMAIL_PROCESSING_INTERVAL = 15 * 60 # 15 minutes POP3_DEFAULT_EMAIL_PROCESSING_INTERVAL = 5
DEFAULT_POP3_EMAIL_LOG_COUNT = 10 # Max log entries to store
Setting( Setting(
namespace=namespace, namespace=namespace,
@@ -25,3 +26,9 @@ Setting(
default=POP3_DEFAULT_EMAIL_PROCESSING_INTERVAL, default=POP3_DEFAULT_EMAIL_PROCESSING_INTERVAL,
) )
Setting(
namespace=namespace,
name='POP3_EMAIL_LOG_SIZE',
global_name='SOURCES_POP3_EMAIL_LOG_SIZE',
default=DEFAULT_POP3_EMAIL_LOG_COUNT,
)

View File

@@ -2,6 +2,7 @@ from django.utils.translation import ugettext_lazy as _
POP3_PORT = 110 POP3_PORT = 110
POP3_SSL_PORT = 995 POP3_SSL_PORT = 995
DEFAULT_POP3_INTERVAL = 15 * 60 # 15 minutes in seconds
SOURCE_UNCOMPRESS_CHOICE_Y = 'y' SOURCE_UNCOMPRESS_CHOICE_Y = 'y'
SOURCE_UNCOMPRESS_CHOICE_N = 'n' SOURCE_UNCOMPRESS_CHOICE_N = 'n'

View File

@@ -1,8 +1,12 @@
from __future__ import absolute_import
from ast import literal_eval from ast import literal_eval
from django.db import models from django.db import models
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from .conf.settings import POP3_EMAIL_LOG_SIZE
class SourceTransformationManager(models.Manager): class SourceTransformationManager(models.Manager):
def get_for_object(self, obj): def get_for_object(self, obj):
@@ -24,3 +28,12 @@ class SourceTransformationManager(models.Manager):
warnings.append(e) warnings.append(e)
return transformations, warnings return transformations, warnings
class POP3EmailLogManager(models.Manager):
def save_status(self, pop3_email, status):
new_recent = self.model(pop3_email=pop3_email, status=status)
new_recent.save()
to_delete = self.model.objects.filter(pop3_email=pop3_email).order_by('-creation_datetime')[POP3_EMAIL_LOG_SIZE:]
for recent_to_delete in to_delete:
recent_to_delete.delete()

View File

@@ -0,0 +1,118 @@
# 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 'POP3EmailLog'
db.create_table('sources_pop3emaillog', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('pop3_email', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['sources.POP3Email'])),
('creation_datetime', self.gf('django.db.models.fields.DateTimeField')()),
('status', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('sources', ['POP3EmailLog'])
# Adding field 'POP3Email.interval'
db.add_column('sources_pop3email', 'interval', self.gf('django.db.models.fields.PositiveIntegerField')(default=900), keep_default=False)
def backwards(self, orm):
# Deleting model 'POP3EmailLog'
db.delete_table('sources_pop3emaillog')
# Deleting field 'POP3Email.interval'
db.delete_column('sources_pop3email', 'interval')
models = {
'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'})
},
'sources.outofprocess': {
'Meta': {'ordering': "('title',)", 'object_name': 'OutOfProcess'},
'blacklist': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'whitelist': ('django.db.models.fields.TextField', [], {'blank': 'True'})
},
'sources.pop3email': {
'Meta': {'ordering': "('title',)", 'object_name': 'POP3Email'},
'blacklist': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'host': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'interval': ('django.db.models.fields.PositiveIntegerField', [], {'default': '900'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'port': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
'ssl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'uncompress': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
'username': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'whitelist': ('django.db.models.fields.TextField', [], {'blank': 'True'})
},
'sources.pop3emaillog': {
'Meta': {'object_name': 'POP3EmailLog'},
'creation_datetime': ('django.db.models.fields.DateTimeField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'pop3_email': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['sources.POP3Email']"}),
'status': ('django.db.models.fields.TextField', [], {})
},
'sources.sourcetransformation': {
'Meta': {'ordering': "('order',)", 'object_name': 'SourceTransformation'},
'arguments': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
'order': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0', 'null': 'True', 'db_index': 'True', 'blank': 'True'}),
'transformation': ('django.db.models.fields.CharField', [], {'max_length': '128'})
},
'sources.stagingfolder': {
'Meta': {'ordering': "('title',)", 'object_name': 'StagingFolder'},
'blacklist': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'delete_after_upload': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'folder_path': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'icon': ('django.db.models.fields.CharField', [], {'max_length': '24', 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'preview_height': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'preview_width': ('django.db.models.fields.IntegerField', [], {}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'uncompress': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
'whitelist': ('django.db.models.fields.TextField', [], {'blank': 'True'})
},
'sources.watchfolder': {
'Meta': {'ordering': "('title',)", 'object_name': 'WatchFolder'},
'blacklist': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'delete_after_upload': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'folder_path': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'interval': ('django.db.models.fields.PositiveIntegerField', [], {}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'uncompress': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
'whitelist': ('django.db.models.fields.TextField', [], {'blank': 'True'})
},
'sources.webform': {
'Meta': {'ordering': "('title',)", 'object_name': 'WebForm'},
'blacklist': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'icon': ('django.db.models.fields.CharField', [], {'max_length': '24', 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
'uncompress': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
'whitelist': ('django.db.models.fields.TextField', [], {'blank': 'True'})
}
}
complete_apps = ['sources']

View File

@@ -6,6 +6,7 @@ import poplib
from email.Utils import collapse_rfc2231_value from email.Utils import collapse_rfc2231_value
from email import message_from_string from email import message_from_string
import os import os
import datetime
try: try:
from cStringIO import StringIO from cStringIO import StringIO
@@ -32,12 +33,13 @@ from metadata.api import save_metadata_list
from scheduler.api import register_interval_job, remove_job from scheduler.api import register_interval_job, remove_job
from acls.utils import apply_default_acls from acls.utils import apply_default_acls
from .managers import SourceTransformationManager from .managers import SourceTransformationManager, POP3EmailLogManager
from .literals import (SOURCE_CHOICES, SOURCE_CHOICES_PLURAL, from .literals import (SOURCE_CHOICES, SOURCE_CHOICES_PLURAL,
SOURCE_INTERACTIVE_UNCOMPRESS_CHOICES, SOURCE_CHOICE_WEB_FORM, SOURCE_INTERACTIVE_UNCOMPRESS_CHOICES, SOURCE_CHOICE_WEB_FORM,
SOURCE_CHOICE_STAGING, SOURCE_ICON_DISK, SOURCE_ICON_DRIVE, SOURCE_CHOICE_STAGING, SOURCE_ICON_DISK, SOURCE_ICON_DRIVE,
SOURCE_ICON_CHOICES, SOURCE_CHOICE_WATCH, SOURCE_UNCOMPRESS_CHOICES, SOURCE_ICON_CHOICES, SOURCE_CHOICE_WATCH, SOURCE_UNCOMPRESS_CHOICES,
SOURCE_UNCOMPRESS_CHOICE_Y, POP3_PORT, POP3_SSL_PORT, SOURCE_CHOICE_POP3_EMAIL) SOURCE_UNCOMPRESS_CHOICE_Y, POP3_PORT, POP3_SSL_PORT,
SOURCE_CHOICE_POP3_EMAIL, DEFAULT_POP3_INTERVAL)
from .compressed_file import CompressedFile, NotACompressedFile from .compressed_file import CompressedFile, NotACompressedFile
from .conf.settings import POP3_TIMEOUT from .conf.settings import POP3_TIMEOUT
@@ -184,10 +186,11 @@ class POP3Email(BaseModel):
host = models.CharField(max_length=64, verbose_name=_(u'host')) host = models.CharField(max_length=64, verbose_name=_(u'host'))
ssl = models.BooleanField(verbose_name=_(u'SSL')) ssl = models.BooleanField(verbose_name=_(u'SSL'))
port = models.PositiveIntegerField(default=POP3_PORT, blank=True, null=True, verbose_name=_(u'port'), help_text=_(u'Typical values are: %d and %d for SSL. These are the defaults if no port is specified.') % (POP3_PORT, POP3_SSL_PORT)) port = models.PositiveIntegerField(blank=True, null=True, verbose_name=_(u'port'), help_text=_(u'Typical values are: %d and %d for SSL. These are the defaults if no port is specified.') % (POP3_PORT, POP3_SSL_PORT))
username = models.CharField(max_length=64, verbose_name=_(u'username')) username = models.CharField(max_length=64, verbose_name=_(u'username'))
password = models.CharField(max_length=64, verbose_name=_(u'password')) password = models.CharField(max_length=64, verbose_name=_(u'password'))
uncompress = models.CharField(max_length=1, choices=SOURCE_UNCOMPRESS_CHOICES, verbose_name=_(u'uncompress'), help_text=_(u'Whether to expand or not compressed archives.')) uncompress = models.CharField(max_length=1, choices=SOURCE_UNCOMPRESS_CHOICES, verbose_name=_(u'uncompress'), help_text=_(u'Whether to expand or not compressed archives.'))
interval = models.PositiveIntegerField(default=DEFAULT_POP3_INTERVAL, verbose_name=_(u'interval'), help_text=_(u'Interval in seconds between document downloads from this account.'))
# From: http://bookmarks.honewatson.com/2009/08/11/python-gmail-imaplib-search-subject-get-attachments/ # From: http://bookmarks.honewatson.com/2009/08/11/python-gmail-imaplib-search-subject-get-attachments/
@staticmethod @staticmethod
@@ -215,44 +218,80 @@ class POP3Email(BaseModel):
def fetch_mail(self): def fetch_mail(self):
logger.debug('Starting POP3 email fetch') try:
logger.debug('host: %s' % self.host) last_check = self.pop3emaillog_set.latest().creation_datetime
logger.debug('ssl: %s' % self.ssl) except POP3EmailLog.DoesNotExist:
if self.ssl: # Trigger email fetch when there are no previous logs
port = self.port or POP3_SSL_PORT initial_trigger = True
logger.debug('port: %d' % port) difference = datetime.timedelta(seconds=0)
mailbox = poplib.POP3_SSL(self.host, int(port))
else: else:
port = self.port or POP3_PORT difference = datetime.datetime.now() - last_check
logger.debug('port: %d' % port) initial_trigger = False
mailbox = poplib.POP3(self.host, int(port), timeout=POP3_TIMEOUT)
mailbox.getwelcome() if difference >= datetime.timedelta(seconds=self.interval) or initial_trigger:
mailbox.user(self.username) try:
mailbox.pass_(self.password) logger.debug('Starting POP3 email fetch')
messages_info = mailbox.list() logger.debug('host: %s' % self.host)
logger.debug('ssl: %s' % self.ssl)
if self.ssl:
port = self.port or POP3_SSL_PORT
logger.debug('port: %d' % port)
mailbox = poplib.POP3_SSL(self.host, int(port))
else:
port = self.port or POP3_PORT
logger.debug('port: %d' % port)
mailbox = poplib.POP3(self.host, int(port), timeout=POP3_TIMEOUT)
logger.debug('messages_info:') mailbox.getwelcome()
logger.debug(messages_info) mailbox.user(self.username)
logger.debug('messages count: %s' % len(messages_info[1])) mailbox.pass_(self.password)
messages_info = mailbox.list()
for message_info in messages_info[1]: logger.debug('messages_info:')
message_number, message_size = message_info.split() logger.debug(messages_info)
logger.debug('message_number: %s' % message_number) logger.debug('messages count: %s' % len(messages_info[1]))
logger.debug('message_size: %s' % message_size)
complete_message = '\n'.join(mailbox.retr(message_number)[1]) for message_info in messages_info[1]:
message_number, message_size = message_info.split()
logger.debug('message_number: %s' % message_number)
logger.debug('message_size: %s' % message_size)
POP3Email.process_message(source=self, message=complete_message, expand=self.uncompress) complete_message = '\n'.join(mailbox.retr(message_number)[1])
mailbox.dele(message_number)
mailbox.quit() POP3Email.process_message(source=self, message=complete_message, expand=self.uncompress)
mailbox.dele(message_number)
mailbox.quit()
POP3EmailLog.objects.save_status(pop3_email=self, status='Successful connection.')
except Exception, exc:
logger.error('Unhandled exception: %s' % exc)
POP3EmailLog.objects.save_status(pop3_email=self, status='Error: %s' % exc)
class Meta(BaseModel.Meta): class Meta(BaseModel.Meta):
verbose_name = _(u'POP email') verbose_name = _(u'POP email')
verbose_name_plural = _(u'POP email') verbose_name_plural = _(u'POP email')
class POP3EmailLog(models.Model):
pop3_email = models.ForeignKey(POP3Email, verbose_name=_(u'POP3 email'))
creation_datetime = models.DateTimeField(verbose_name=_(u'date time'))
status = models.TextField(verbose_name=_(u'status'))
objects = POP3EmailLogManager()
def save(self, *args, **kwargs):
if not self.pk:
self.creation_datetime = datetime.datetime.now()
return super(POP3EmailLog, self).save(*args, **kwargs)
class Meta:
verbose_name = _(u'POP3 email log')
verbose_name_plural = _(u'POP3 emails logs')
get_latest_by = 'creation_datetime'
ordering = ('creation_datetime',)
class StagingFolder(InteractiveBaseModel): class StagingFolder(InteractiveBaseModel):
is_interactive = True is_interactive = True
source_type = SOURCE_CHOICE_STAGING source_type = SOURCE_CHOICE_STAGING

View File

@@ -32,4 +32,6 @@ urlpatterns = patterns('sources.views',
url(r'^setup/interactive/(?P<source_type>\w+)/(?P<source_id>\d+)/transformation/create/$', 'setup_source_transformation_create', (), 'setup_source_transformation_create'), url(r'^setup/interactive/(?P<source_type>\w+)/(?P<source_id>\d+)/transformation/create/$', 'setup_source_transformation_create', (), 'setup_source_transformation_create'),
url(r'^setup/interactive/source/transformation/(?P<transformation_id>\d+)/edit/$', 'setup_source_transformation_edit', (), 'setup_source_transformation_edit'), url(r'^setup/interactive/source/transformation/(?P<transformation_id>\d+)/edit/$', 'setup_source_transformation_edit', (), 'setup_source_transformation_edit'),
url(r'^setup/interactive/source/transformation/(?P<transformation_id>\d+)/delete/$', 'setup_source_transformation_delete', (), 'setup_source_transformation_delete'), url(r'^setup/interactive/source/transformation/(?P<transformation_id>\d+)/delete/$', 'setup_source_transformation_delete', (), 'setup_source_transformation_delete'),
url(r'^setup/source/(?P<source_type>\w+)/(?P<source_pk>\d+)/log/list/$', 'setup_source_log_list', (), 'setup_source_log_list'),
) )

View File

@@ -24,7 +24,7 @@ import sendfile
from acls.models import AccessEntry from acls.models import AccessEntry
from .models import (WebForm, StagingFolder, SourceTransformation, from .models import (WebForm, StagingFolder, SourceTransformation,
WatchFolder, POP3Email) WatchFolder, POP3Email, POP3EmailLog)
from .literals import (SOURCE_CHOICE_WEB_FORM, SOURCE_CHOICE_STAGING, from .literals import (SOURCE_CHOICE_WEB_FORM, SOURCE_CHOICE_STAGING,
SOURCE_CHOICE_WATCH, SOURCE_CHOICE_POP3_EMAIL) SOURCE_CHOICE_WATCH, SOURCE_CHOICE_POP3_EMAIL)
from .literals import (SOURCE_UNCOMPRESS_CHOICE_Y, from .literals import (SOURCE_UNCOMPRESS_CHOICE_Y,
@@ -590,6 +590,40 @@ def setup_source_create(request, source_type):
context_instance=RequestContext(request)) context_instance=RequestContext(request))
def setup_source_log_list(request, source_type, source_pk):
Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT])
if source_type == SOURCE_CHOICE_WEB_FORM:
cls = WebForm
elif source_type == SOURCE_CHOICE_STAGING:
cls = StagingFolder
elif source_type == SOURCE_CHOICE_WATCH:
cls = WatchFolder
elif source_type == SOURCE_CHOICE_POP3_EMAIL:
cls = POP3Email
source = get_object_or_404(cls, pk=source_pk)
context = {
'object_list': POP3EmailLog.objects.filter(pop3_email=source).order_by('-creation_datetime'),
'title': _(u'logs for: %s') % source.fullname(),
'source': source,
'object_name': _(u'source'),
'navigation_object_name': 'source',
'source_type': source_type,
'extra_columns': [
{'name': _(u'Date time'), 'attribute': 'creation_datetime'},
{'name': _(u'Status'), 'attribute': 'status'},
],
'hide_link': True,
'hide_object': True,
'hide_links': True,
}
return render_to_response('generic_list.html', context,
context_instance=RequestContext(request))
def setup_source_transformation_list(request, source_type, source_id): def setup_source_transformation_list(request, source_type, source_id):
Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT]) Permission.objects.check_permissions(request.user, [PERMISSION_SOURCES_SETUP_EDIT])
@@ -609,6 +643,7 @@ def setup_source_transformation_list(request, source_type, source_id):
'title': _(u'transformations for: %s') % source.fullname(), 'title': _(u'transformations for: %s') % source.fullname(),
'source': source, 'source': source,
'object_name': _(u'source'), 'object_name': _(u'source'),
'source_type': source_type,
'navigation_object_name': 'source', 'navigation_object_name': 'source',
'list_object_variable_name': 'transformation', 'list_object_variable_name': 'transformation',
'extra_columns': [ 'extra_columns': [
@@ -724,6 +759,7 @@ def setup_source_transformation_create(request, source_type, source_id):
return render_to_response('generic_form.html', { return render_to_response('generic_form.html', {
'form': form, 'form': form,
'source': source, 'source': source,
'source_type': source_type,
'object_name': _(u'source'), 'object_name': _(u'source'),
'navigation_object_name': 'source', 'navigation_object_name': 'source',
'title': _(u'Create new transformation for source: %s') % source, 'title': _(u'Create new transformation for source: %s') % source,