1 """
2 Classes to store the result of batch jobs to enable the user to
3 review or plan them
4 """
5
6 from elixir.entity import Entity
7 from elixir.options import using_options
8 from elixir.fields import Field
9 import sqlalchemy.types
10 from elixir.relationships import ManyToOne
11
12 from camelot.core.utils import ugettext_lazy as _
13 from camelot.model import metadata
14 from camelot.view import filters
15 from camelot.admin.entity_admin import EntityAdmin
16 import camelot.types
17
18 import datetime
19
20 __metadata__ = metadata
23 using_options( tablename = 'batch_job_type' )
24 name = Field(sqlalchemy.types.Unicode(256), required=True)
25 parent = ManyToOne('BatchJobType')
26
29
30 @classmethod
32 batch_job_type = cls.query.filter_by( name = name ).first()
33 if not batch_job_type:
34 batch_job_type = cls( name = name )
35 batch_job_type.flush()
36 return batch_job_type
37
38 - class Admin(EntityAdmin):
41
43 import socket
44 return socket.gethostname()
45
47 using_options( tablename = 'batch_job', order_by=['-date'] )
48 date = Field(sqlalchemy.types.DateTime, required=True, default=datetime.datetime.now)
49 host = Field(sqlalchemy.types.Unicode(256), required=True, default=hostname)
50 type = ManyToOne('BatchJobType', required=True, ondelete = 'restrict', onupdate = 'cascade')
51 status = Field(camelot.types.Enumeration([(-2, 'planned'), (-1, 'running'), (0, 'success'), (1,'warnings'), (2,'errors')]), required=True, default='planned' )
52 message = Field(camelot.types.RichText())
53
55 import traceback, cStringIO
56 sio = cStringIO.StringIO()
57 traceback.print_exc(file=sio)
58 traceback_print = sio.getvalue()
59 sio.close()
60 self.message = (self.message or '') + '<br/>' + unicode(exception) + '<br/>' + traceback_print.replace('\n', '<br/>')
61
63 """:param strings: a list or generator of strings"""
64 self.message = (self.message or '') + '<br/>'.join(list(strings))
65
66 - class Admin(EntityAdmin):
71