Move db.sql.models* to db.models*
[mediagoblin.git] / mediagoblin / processing / task.py
CommitLineData
eace050a
E
1# GNU MediaGoblin -- federated, autonomous media hosting
2# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
3#
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU Affero General Public License as published by
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU Affero General Public License for more details.
13#
14# You should have received a copy of the GNU Affero General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17import logging
18
19from celery.task import Task
20
21from mediagoblin import mg_globals as mgg
b0c8328e 22from mediagoblin.db.models import MediaEntry
eace050a 23from mediagoblin.processing import mark_entry_failed, BaseProcessingFail
5354f954 24from mediagoblin.tools.processing import json_processing_callback
eace050a
E
25
26_log = logging.getLogger(__name__)
51eb0267
JW
27logging.basicConfig()
28_log.setLevel(logging.DEBUG)
eace050a
E
29
30
31################################
32# Media processing initial steps
33################################
34
35class ProcessMedia(Task):
36 """
eace050a
E
37 Pass this entry off for processing.
38 """
39 def run(self, media_id):
40 """
41 Pass the media entry off to the appropriate processing function
42 (for now just process_image...)
43 """
71717fd5 44 entry = MediaEntry.query.get(media_id)
eace050a
E
45
46 # Try to process, and handle expected errors.
47 try:
64712915
JW
48 entry.state = u'processing'
49 entry.save()
50
eace050a 51 _log.debug('Processing {0}'.format(entry))
64712915 52
6af6bc05 53 # run the processing code
5f8b4ae8 54 entry.media_manager['processor'](entry)
64712915 55
6af6bc05
CAW
56 # We set the state to processed and save the entry here so there's
57 # no need to save at the end of the processing stage, probably ;)
64712915
JW
58 entry.state = u'processed'
59 entry.save()
60
5354f954 61 json_processing_callback(entry)
51eb0267 62 except BaseProcessingFail as exc:
5c2b8486 63 mark_entry_failed(entry.id, exc)
5354f954 64 json_processing_callback(entry)
eace050a 65 return
64712915 66
51eb0267 67 except ImportError as exc:
eace050a
E
68 _log.error(
69 'Entry {0} failed to process due to an import error: {1}'\
70 .format(
71 entry.title,
72 exc))
73
5c2b8486 74 mark_entry_failed(entry.id, exc)
5354f954 75 json_processing_callback(entry)
eace050a 76
2891b2c6
JW
77 except Exception as exc:
78 _log.error('An unhandled exception was raised while'
79 + ' processing {0}'.format(
80 entry))
81
5c2b8486 82 mark_entry_failed(entry.id, exc)
5354f954 83 json_processing_callback(entry)
2891b2c6
JW
84 raise
85
eace050a
E
86 def on_failure(self, exc, task_id, args, kwargs, einfo):
87 """
88 If the processing failed we should mark that in the database.
89
90 Assuming that the exception raised is a subclass of
91 BaseProcessingFail, we can use that to get more information
92 about the failure and store that for conveying information to
93 users about the failure, etc.
94 """
95 entry_id = args[0]
96 mark_entry_failed(entry_id, exc)
5354f954 97
939d57a0 98 entry = mgg.database.MediaEntry.query.filter_by(id=entry_id).first()
5354f954 99 json_processing_callback(entry)