source: server/lib/gutenbach/server/job.py @ 33ea505

no-cups
Last change on this file since 33ea505 was 33ea505, checked in by Jessica B. Hamrick <jhamrick@…>, 12 years ago

Keep IPP code in GutenbachPrinter?, not in GutenbachJob?

  • Property mode set to 100644
File size: 4.8 KB
Line 
1from .errors import InvalidJobStateException, MissingDataException
2from .player import Player
3from gutenbach.ipp import JobStates as States
4import logging
5import os
6
7# initialize logger
8logger = logging.getLogger(__name__)
9
10class GutenbachJob(object):
11
12    def __init__(self, job_id=None, creator=None, name=None):
13        """Create an empty Gutenbach job.
14
15        """
16
17        self.player = None
18
19        self.id = job_id
20        self.creator = creator
21        self.name = name
22        self.state = States.HELD
23        self.priority = 1
24        self.document = None
25
26    def __repr__(self):
27        return str(self)
28
29    def __str__(self):
30        return "<Job %d '%s'>" % (self.id, self.name)
31
32    def __cmp__(self, other):
33        return cmp(self.priority, other.priority)
34
35    ######################################################################
36    ###                          Properties                            ###
37    ######################################################################
38
39    @property
40    def id(self):
41        """Unique job identifier.  Should be a positive integer,
42        except when unassigned, when it defaults to -1.
43       
44        """
45        return self._id
46    @id.setter
47    def id(self, val):
48        try:
49            self._id = int(val)
50        except TypeError:
51            self._id = -1
52
53    @property
54    def creator(self):
55        """The user who created the job; analogous to the IPP
56        requesting-user-name.
57
58        """
59        return self._creator
60    @creator.setter
61    def creator(self, val):
62        if val is None:
63            self._creator = ""
64        else:
65            self._creator = str(val)
66
67    @property
68    def name(self):
69        """The job's name.
70
71        """
72        return self._name
73    @name.setter
74    def name(self, val):
75        if val is None:
76            self._name = ""
77        else:
78            self._name = str(val)
79
80    @property
81    def size(self):
82        """The size of the job in bytes.
83
84        """
85        try:
86            size = os.path.getsize(self.document)
87        except:
88            size = 0
89        return size
90
91    @property
92    def is_playing(self):
93        return self.state == States.PROCESSING
94
95    @property
96    def is_ready(self):
97        return self.state == States.PENDING
98
99    @property
100    def is_finished(self):
101        return self.state != States.PENDING and \
102               self.state != States.PROCESSING and \
103               self.state != States.HELD
104       
105    ######################################################################
106    ###                            Methods                             ###
107    ######################################################################
108
109    def spool(self, document, username=None):
110        if self.state != States.HELD:
111            raise InvalidJobStateException(self.state)
112
113        self.document = document.name
114        self.player = Player(document)
115        self.creator = username
116        self.state = States.PENDING
117
118        logger.debug("document for job %d is '%s'" % (self.id, self.document))
119
120
121    def play(self):
122        """Non-blocking play function.  Sets the job state to
123        PROCESSING.
124
125        Raises
126        ------
127        InvalidJobStateException
128            If the job is not ready to be played.
129
130        """
131       
132        # make sure the job is waiting to be played and that it's
133        # valid
134        if not self.is_ready:
135            raise InvalidJobStateException(self.state)
136       
137        # and set the state to processing if we're good to go
138        logger.info("playing job %s" % str(self))
139
140        def _completed():
141            logger.info("completed job %s" % str(self))
142            self.state = States.COMPLETE
143            self.player = None
144
145        self.state = States.PROCESSING
146        self.player.callback = _completed
147        self.player.start()
148
149    def pause(self):
150        """Non-blocking pause function.  Sets the job state to
151        STOPPED.
152
153        """
154       
155        if not self.is_playing:
156            raise InvalidJobStateException(self.state)
157       
158        self.player.mplayer_pause()
159        self.state = States.STOPPED
160
161    def cancel(self):
162        def _canceled():
163            logger.info("canceled job %s" % str(self))
164            self.state = States.CANCELLED
165            self.player = None
166
167        if self.is_playing:
168            self.player.callback = _canceled
169            self.player.mplayer_stop()
170        elif self.is_finished:
171            raise InvalidJobStateException(self.state)
172       
173        self.state = States.CANCELLED
174
175    def abort(self):
176        def _aborted():
177            logger.info("aborted job %s" % str(self))
178            self.state = States.ABORTED
179            self.player = None
180
181        if self.is_playing:
182            self.player.callback = _aborted
183            self.player.mplayer_stop()
184        elif self.is_finished:
185            raise InvalidJobStateException(self.state)
186       
187        self.state = States.ABORTED
188
189
Note: See TracBrowser for help on using the repository browser.