8000 implement Signal strategy · mauler/django-elastic-transcoder@e4bf12d · GitHub
[go: up one dir, main page]

Skip to content

Commit e4bf12d

Browse files
committed
implement Signal strategy
1 parent 7268137 commit e4bf12d

File tree

5 files changed

+187
-10
lines changed

5 files changed

+187
-10
lines changed

dj_elastictranscoder/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
class EncodeJob(models.Model):
77
STATE_CHOICES = (
8-
(0, 'Waiting'),
8+
(0, 'Submitted'),
99
(1, 'Progressing'),
1010
(2, 'Error'),
1111
(3, 'Warning'),

dj_elastictranscoder/signals.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
from django.dispatch import Signal
2+
3+
transcode_init = Signal(providing_args=["message"])
4+
transcode_onprogress = Signal(providing_args=["message"])
5+
transcode_onerror = Signal(providing_args=["message"])
6+
transcode_oncomplete = Signal(providing_args=["message"])

dj_elastictranscoder/tests.py

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os.path
2+
import json
23

34
from django.test import TestCase
45
from django.db import models
@@ -63,3 +64,170 @@ def test_oncomplete(self):
6364

6465
job = EncodeJob.objects.get(id=self.job_id)
6566
self.assertEqual(job.state, 4)
67+
68+
69+
from .signals import (
70+
transcode_init,
71+
transcode_onprogress,
72+
transcode_onerror,
73+
transcode_oncomplete
74+
)
75+
from django.dispatch import receiver
76+
77+
78+
class SignalTest(TestCase):
79+
80+
def test_transcode_init(self):
81+
"""
82+
test for transcode_init signal
83+
"""
84+
85+
with open(os.path.join(FIXTURE_DIRS, 'submit.json')) as f:
86+
message = json.loads(f.read())
87+
88+
# define signal receiver
89+
@receiver(transcode_init)
90+
def job_record(sender, message, **kwargs):
91+
item = Item.objects.create(name='Hello')
92+
93+
ctype = ContentType.objects.get_for_model(item)
94+
95+
job = EncodeJob()
96+
job.id = message['Job']['Id']
97+
job.content_type = ctype
98+
job.object_id = item.id
99+
job.save()
100+
101+
# send signal
102+
transcode_init.send(sender=None, message=message)
103+
104+
self.assertEqual(1, EncodeJob.objects.count())
105+
106+
job = EncodeJob.objects.get(pk=message['Job']['Id'])
107+
self.assertEqual('1396802241671-jkmme8', job.id)
108+
109+
def test_transcode_onprogress(self):
110+
"""
111+
test for transcode_onprogress signal
112+
"""
113+
114+
# assume an encode job was submitted
115+
item = Item.objects.create(name='Hello')
116+
117+
ctype = ContentType.objects.get_for_model(item)
118+
119+
job = EncodeJob()
120+
job.id = '1396802241671-jkmme8'
121+
job.content_type = ctype
122+
job.object_id = item.id
123+
job.save()
124+
125+
#
126+
with open(os.path.join(FIXTURE_DIRS, 'onprogress.json')) as f:
127+
resp = json.loads(f.read())
128+
message = json.loads(resp['Message'])
129+
130+
# define signal receiver
131+
@receiver(transcode_onprogress)
132+
def job_record(sender, message, **kwargs):
133+
job = EncodeJob.objects.get(pk=message['jobId'])
134+
job.message = 'Progress'
135+
job.state = 1
136+
job.save()
137+
138+
# send signal
139+
transcode_onprogress.send(sender=None, message=message)
140+
141+
#
142+
job = EncodeJob.objects.get(pk=message['jobId'])
143+
144+
#
145+
self.assertEqual(1, EncodeJob.objects.count())
146+
self.assertEqual('1396802241671-jkmme8', job.id)
147+
self.assertEqual('Progress', job.message)
148+
self.assertEqual(1, job.state)
149+
150+
151+
def test_transcode_onerror(self):
152+
"""
153+
test for transcode_onerror signal
154+
"""
155+
156+
# assume an encode job was submitted
157+
item = Item.objects.create(name='Hello')
158+
159+
ctype = ContentType.objects.get_for_model(item)
160+
161+
job = EncodeJob()
162+
job.id = '1396802241671-jkmme8'
163+
job.content_type = ctype
164+
job.object_id = item.id
165+
job.save()
166+
167+
#
168+
with open(os.path.join(FIXTURE_DIRS, 'onerror.json')) as f:
169+
resp = json.loads(f.read())
170+
message = json.loads(resp['Message'])
171+
172+
173+
# define signal receiver
174+
@receiver(transcode_onerror)
175+
def job_record(sender, message, **kwargs):
176+
job = EncodeJob.objects.get(pk=message['jobId'])
177+
job.message = message['messageDetails']
178+
job.state = 2
179+
job.save()
180+
181+
# send signal
182+
transcode_onerror.send(sender=None, message=message)
183+
184+
#
185+
job = EncodeJob.objects.get(pk=message['jobId'])
186+
error_message = "3002 25319782-210b-45b2-a8a2-fb929b87d46b: The specified object could not be saved in the specified bucket because an object by that name already exists: bucket=bucket_name, key=output.mp3."
187+
188+
#
189+
self.assertEqual(1, EncodeJob.objects.count())
190+
self.assertEqual('1396802241671-jkmme8', job.id)
191+
self.assertEqual(error_message, job.message)
192+
self.assertEqual(2, job.state)
193+
194+
def test_transcode_oncomplete(self):
195+
"""
196+
test for transcode_oncomplete signal
197+
"""
198+
199+
# assume an encode job was submitted
200+
item = Item.objects.create(name='Hello')
201+
202+
ctype = ContentType.objects.get_for_model(item)
203+
204+
job = EncodeJob()
205+
job.id = '1396802241671-jkmme8'
206+
job.content_type = ctype
207+
job.object_id = item.id
208+
job.save()
209+
210+
#
211+
with open(os.path.join(FIXTURE_DIRS, 'oncomplete.json')) as f:
212+
resp = json.loads(f.read())
213+
message = json.loads(resp['Message'])
214+
215+
# define signal receiver
216+
@receiver(transcode_oncomplete)
217+
def job_record(sender, message, **kwargs):
218+
job = EncodeJob.objects.get(pk=message['jobId'])
219+
job.message = 'Success'
220+
job.state = 4
221+
job.save()
222+
223+
# send signal
224+
transcode_oncomplete.send(sender=None, message=message)
225+
226+
#
227+
job = EncodeJob.objects.get(pk=message['jobId'])
228+
229+
#
230+
self.assertEqual(1, EncodeJob.objects.count())
231+
self.assertEqual('1396802241671-jkmme8', job.id)
232+
self.assertEqual('Success', job.message)
233+
self.assertEqual(4, job.state)

dj_elastictranscoder/utils.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,30 @@
11
from boto import elastictranscoder
22

33
from django.conf import settings
4-
from django.contrib.contenttypes.models import ContentType
54

6-
from .models import EncodeJob
5+
from .signals import transcode_init
76

87

9-
def encode(obj, pipeline_id, input_name, outputs, preset_id, region=None):
8+
def encode(pipeline_id, input_name, outputs, preset_id, region=None):
109
"""
1110
encode
1211
"""
12+
1313
aws_access_key_id = getattr(settings, 'AWS_ACCESS_KEY_ID', None)
1414
aws_secret_access_key = getattr(settings, 'AWS_SECRET_ACCESS_KEY', None)
1515

1616
if not region:
1717
aws_region = getattr(settings, 'AWS_REGION', None)
1818

1919
if not aws_access_key_id or not aws_secret_access_key or not aws_region:
20-
assert False, 'Please provide `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY`'
20+
assert False, 'Please provide `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` and `AWS_REGION` settings'
2121

22-
transcoder = elastictranscoder.connect_to_region(aws_region,
22+
encoder = elastictranscoder.connect_to_region(
23+
aws_region,
2324
aws_access_key_id=aws_access_key_id,
2425
aws_secret_access_key=aws_secret_access_key)
2526

26-
resp = transcoder.create_job(pipeline_id, input_name, outputs=outputs)
27-
28-
content_type = ContentType.objects.get_for_model(obj)
29-
EncodeJob.objects.create(id=resp['Job']['Id'], content_type=content_type, object_id=obj.id)
27+
message = encoder.create_job(pipeline_id, input_name, outputs=outputs)
28+
29+
# send signal
30+
transcode_init.send(sender=None, message=message)

dj_elastictranscoder/views.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from django.http import HttpResponse, HttpResponseBadRequest
44
from django.core.mail import mail_admins
5+
56
from .models import EncodeJob
67

78

@@ -43,6 +44,7 @@ def sns_endpoint(request):
4344
elif message['state'] == 'ERROR':
4445
job.state = 3
4546

47+
job.message = json.dumps(message)
4648
job.save()
4749

4850
# TODO: send signal to handler

0 commit comments

Comments
 (0)
0