1 from django.http import HttpResponse, HttpResponseRedirect
2 from samplebc.samples import models
3 from django.core.exceptions import ObjectDoesNotExist
4 from django.template import Context, Template, RequestContext
5 from django.template.loader import get_template
6 from django.shortcuts import render_to_response
8 from django.utils.safestring import mark_safe
10 from samplebc.samples.forms import FreezerForm, ContainerForm, SampleForm
11 from samplebc.samples.models import Freezer, Container, Sample
12 from samplebc.samples.util import get_uuid, get_sampleid, assign_to_container
13 from samplebc.samples.errors import NoSpaceAvaliable
14 from samplebc import settings
17 from samplebc.bcmagic.forms import BarcodeMagicForm
25 ################################################
27 ################################################
30 def print_zpl(zpl_text):
32 Sends zpl_text to printer
34 ftp = ftplib.FTP(host='131.215.54.194', user='blank', passwd='')
36 ftp.storlines("STOR printme.txt", StringIO.StringIO(zpl_text))
39 def __center_line(line, width):
40 spaces_to_add = width - len(line)
42 front_half = spaces_to_add / 2
43 back_half = spaces_to_add - front_half
45 return (' ' * front_half) + line + (' ' * back_half)
50 ################################################
52 ################################################
54 def container_index(request):
56 Returns an index of available to containers
58 container_list = Container.objects.all()
59 c = Context({'title': 'Container Index',
60 'container_list': container_list})
61 t = get_template('container_index.html')
63 return render_to_response('app.html', {
64 'app_name': "HTSW-SampleTracker",
65 'page_name': 'Container Index',
66 'bcmagic': BarcodeMagicForm(),
67 'select': 'container',
74 def container_summary(request, container_id):
76 Returns details of a container
78 # Retrieve container by UUID
80 container = models.Container.objects.get(uuid=container_id)
81 except ObjectDoesNotExist, e:
82 msg = "Container (%s) does not exist." % (container_id)
83 return render_to_response('app.html', {
84 'app_name': settings.HTSW_ST_APPNAME,
85 'page_name': 'Container Summary',
87 'bcmagic': BarcodeMagicForm(),
88 'select': 'container',
92 # Retrieve samples from container
93 sample_list = container.sample_set.all()
95 # Prepare a Sample Index of Contained Samples
96 cs = Context({'title': 'Contained Samples',
97 'sample_list': sample_list})
98 ts = get_template('sample_index.html')
100 # Render prepared samples into container summary
101 cc = Context({'container': container,
102 'rendered_samples': ts.render(cs) })
103 tc = get_template('container_summary.html')
105 # Render container summary to app html
106 return render_to_response('app.html', {
107 'app_name': settings.HTSW_ST_APPNAME,
108 'page_name': 'Container Summary',
110 'bcmagic': BarcodeMagicForm(),
111 'select': 'container',
112 'body': tc.render(cc)
116 def container_add(request):
118 Form for adding a container.
120 # If user submitted the Container form.
121 if request.method == 'POST':
122 # Fill in ContainerForm with POSTed data.
123 form = ContainerForm(request.POST)
125 # If the form is valid, process it.
127 # Create new Container object from form data
128 c_obj = form.save(commit=False)
130 c_obj.uuid = get_uuid()
133 # Save the many to many link data.
135 return container_summary(request, c_obj.uuid)
137 # If users first visit, create empty form.
138 form = ContainerForm()
141 c = Context({'form': form,
142 'action_url': '/samples/container/add/'})
143 t = get_template('generic_form.html')
145 return render_to_response('app.html', {
146 'app_name': settings.HTSW_ST_APPNAME,
147 'page_name': 'Container Add',
149 'bcmagic': BarcodeMagicForm(),
150 'select': 'container',
154 def container_edit(request, container_id):
156 Allow editing of a container
159 container = models.Container.objects.get(uuid=container_id)
160 except ObjectDoesNotExist, e:
161 msg = "Container (%s) cannot be edited as it does not exist." % (container_id)
162 return render_to_response('app.html', {
163 'app_name': settings.HTSW_ST_APPNAME,
164 'page_name': 'Container Edit',
166 'bcmagic': BarcodeMagicForm(),
167 'select': 'container',
171 # If user submitted the container form.
172 if request.method == 'POST':
173 # Fill in ContainerForm with POSTed data.
174 form = ContainerForm(request.POST, instance=container)
176 # If the form is valid, process it.
178 # Save Container object from form data
179 c_obj = form.save(commit=True)
180 # Save many2many changes as well
181 #form.save_m2m() #Not needed when form.save(commit=True)
183 return container_summary(request, c_obj.uuid)
185 # If users first visit, create form from Container instance.
186 form = ContainerForm(instance=container)
189 c = Context({'form': form,
190 'action_url': '%sedit/' % (container.get_absolute_url())})
191 t = get_template('generic_form.html')
193 return render_to_response('app.html', {
194 'app_name': settings.HTSW_ST_APPNAME,
195 'page_name': 'Container Edit',
197 'bcmagic': BarcodeMagicForm(),
198 'select': 'container',
204 ################################################
206 ################################################
208 def freezer_index(request):
210 Returns an index of available freezers
212 freezer_list = Freezer.objects.all()
213 c = Context({'freezer_list': freezer_list})
214 t = get_template('freezer_index.html')
216 return render_to_response('app.html', {
217 'app_name': "HTSW-SampleTracker",
218 'page_name': 'Freezer Index',
220 'bcmagic': BarcodeMagicForm(),
226 def freezer_summary(request, freezer_id):
228 Returns summary of freezer_id
230 # Retrieve freezer by UUID
232 freezer = models.Freezer.objects.get(uuid=freezer_id)
233 except ObjectDoesNotExist, e:
234 msg = "Freezer (%s) does not exist." % (freezer_id)
235 return render_to_response('app.html', {
236 'app_name': settings.HTSW_ST_APPNAME,
237 'page_name': 'Freezer Summary',
239 'bcmagic': BarcodeMagicForm(),
244 # List of contained containers
245 container_list = freezer.container_set.all()
248 # Render prepared container index into freezer summary
249 cf = Context({'freezer': freezer })
250 tf = get_template('freezer_summary.html')
252 # Render Freezer summary to app html
253 return render_to_response('app.html', {
254 'app_name': settings.HTSW_ST_APPNAME,
255 'page_name': 'Freezer Summary',
257 'bcmagic': BarcodeMagicForm(),
259 'body': tf.render(cf)
263 def freezer_add(request):
265 Allows you to add a new freezer.
267 # If user submitted the freezer form.
268 if request.method == 'POST':
269 # Fill in FreezerForm with POSTed data.
270 form = FreezerForm(request.POST)
272 # If the form is valid, process it.
274 # Create new Freezer object from form data
275 f_obj = form.save(commit=False)
277 f_obj.uuid = get_uuid()
280 return freezer_summary(request, f_obj.uuid)
282 # If users first visit, create empty form.
286 c = Context({'form': form,
287 'action_url': '/samples/freezer/add/'})
288 t = get_template('generic_form.html')
290 return render_to_response('app.html', {
291 'app_name': settings.HTSW_ST_APPNAME,
292 'page_name': 'Freezer Add',
294 'bcmagic': BarcodeMagicForm(),
300 def freezer_edit(request, freezer_id):
302 Allow editing of a freezer
305 freezer = models.Freezer.objects.get(uuid=freezer_id)
306 except ObjectDoesNotExist, e:
307 msg = "Freezer (%s) cannot be edited as it does not exist." % (freezer_id)
308 return render_to_response('app.html', {
309 'app_name': settings.HTSW_ST_APPNAME,
310 'page_name': 'Freezer Summary',
312 'bcmagic': BarcodeMagicForm(),
317 # If user submitted the freezer form.
318 if request.method == 'POST':
319 # Fill in FreezerForm with POSTed data.
320 form = FreezerForm(request.POST, instance=freezer)
322 # If the form is valid, process it.
324 # Save Freezer object from form data
325 f_obj = form.save(commit=True)
327 return freezer_summary(request, f_obj.uuid)
329 # If users first visit, create form from freezer instance.
330 form = FreezerForm(instance=freezer)
333 c = Context({'form': form,
334 'action_url': '%sedit/' % (freezer.get_absolute_url())})
335 t = get_template('generic_form.html')
337 return render_to_response('app.html', {
338 'app_name': settings.HTSW_ST_APPNAME,
339 'page_name': 'Freezer Edit',
341 'bcmagic': BarcodeMagicForm(),
348 ################################################
350 ################################################
352 def sample_index(request):
354 return a list of samples and what we can do with them.
356 sample_list = models.Sample.objects.all()
359 c = Context({'title': 'Sample Index',
360 'sample_list': sample_list})
361 t = get_template('sample_index.html')
362 #html.append('%s <a href="/samples/sample/%s/print">(print)</a>' \
363 # % (sample, sample.sampleid))
365 return render_to_response('app.html', {
366 'app_name': settings.HTSW_ST_APPNAME,
367 'page_name': 'Samples Index',
369 'bcmagic': BarcodeMagicForm(),
375 def sample_homeless(request):
377 Returns an index of homeless samples
379 sample_list = Sample.objects.filter(container=None)
380 c = Context({'title': 'Homeless Samples',
381 'sample_list': sample_list})
382 t = get_template('sample_homeless.html')
384 return render_to_response('app.html', {
385 'app_name': "HTSW-SampleTracker",
386 'page_name': 'Homeless Samples',
387 'bcmagic': BarcodeMagicForm(),
393 def sample_add(request):
395 Allow adding of a new sample
397 ASSIGNED_CONTAINER = False
399 # If user submitted the sample form.
400 if request.method == 'POST':
401 # Fill in SampleForm with POSTed data.
402 form = SampleForm(request.POST)
404 # If the form is valid, process it.
406 # Create new Sample object from form data
407 s_obj = form.save(commit=False)
410 s_obj.sampleid = get_sampleid()
412 # If the user wants us to assign a container.
413 if form.cleaned_data['assign_container']:
416 assign_to_container(s_obj)
417 ASSIGNED_CONTAINER = True
418 except NoSpaceAvaliable, e:
419 #return HttpResponse("<b>Error:</b> %s<br /><i>You will need to prepare a new container before continuing.</i>" \
421 ASSIGNED_CONTAINER = False
426 if not ASSIGNED_CONTAINER:
427 msg = "NOTE: Sample is homeless"
428 return sample_summary(request, s_obj.sampleid, msg=msg)
431 msg = "Sample created."
432 return sample_summary(request, s_obj.sampleid, msg=msg)
434 # If users first visit, create empty form.
438 c = Context({'form': form,
439 'action_url': '/samples/sample/add/'})
440 t = get_template('generic_form.html')
442 return render_to_response('app.html', {
443 'app_name': settings.HTSW_ST_APPNAME,
444 'page_name': 'Sample Add',
446 'bcmagic': BarcodeMagicForm(),
452 def sample_edit(request, sampleid):
454 Allow editing of a sample
457 sample = models.Sample.objects.get(sampleid=sampleid)
458 except ObjectDoesNotExist, e:
459 msg = "Sample (%s) cannot be edited as it does not exist." % (sampleid)
460 return render_to_response('app.html', {
461 'app_name': settings.HTSW_ST_APPNAME,
462 'page_name': 'Sample Edit',
464 'bcmagic': BarcodeMagicForm(),
469 # If user submitted the sample form.
470 if request.method == 'POST':
471 # Fill in SampleForm with POSTed data.
472 form = SampleForm(request.POST, instance=sample)
474 # If the form is valid, process it.
476 # Save Sample object from form data
477 s_obj = form.save(commit=True)
479 msg = "Sample Update Saved"
480 return sample_summary(request, s_obj.sampleid, msg)
482 # If users first visit, create form from sample instance.
483 form = SampleForm(instance=sample)
486 c = Context({'form': form,
487 'action_url': '%sedit/' % (sample.get_absolute_url())})
488 t = get_template('generic_form.html')
490 return render_to_response('app.html', {
491 'app_name': settings.HTSW_ST_APPNAME,
492 'page_name': 'Sample Edit',
494 'bcmagic': BarcodeMagicForm(),
500 def sample_assign_container(request, sampleid):
502 Assigns sample to container using the assign to container algorithm
505 sample = Sample.objects.get(sampleid=sampleid)
508 assign_to_container(sample)
509 except NoSpaceAvaliable, e:
510 return render_to_response('app.html', {
511 'app_name': settings.HTSW_ST_APPNAME,
512 'page_name': 'Sample Assign',
514 'bcmagic': BarcodeMagicForm(),
516 'body': mark_safe("<b>Error:</b> %s<br /><i>You will need to prepare a new container before continuing.</i>" \
522 body = 'Sample (<a href="%s">%s</a>) assigned to container (<a href="%s">%s</a>)' \
523 % (sample.get_absolute_url(), str(sample), sample.container.get_absolute_url(), str(sample.container))
525 return render_to_response('app.html', {
526 'app_name': settings.HTSW_ST_APPNAME,
527 'page_name': 'Sample Assign',
529 'bcmagic': BarcodeMagicForm(),
531 'body': mark_safe(body),
535 def sample_summary(request, sampleid, msg=None):
537 Display a summary of a given sample
540 sample = models.Sample.objects.get(sampleid=sampleid)
541 except ObjectDoesNotExist, e:
542 msg = "Sample (%s) does not exist." % (sampleid)
543 return render_to_response('app.html', {
544 'app_name': settings.HTSW_ST_APPNAME,
545 'page_name': 'Sample Summary',
547 'bcmagic': BarcodeMagicForm(),
552 c = Context({'sample': sample,
554 t = get_template('sample_summary.html')
556 return render_to_response('app.html', {
557 'app_name': settings.HTSW_ST_APPNAME,
558 'page_name': 'Sample Summary',
560 'bcmagic': BarcodeMagicForm(),
566 def sample_print(request, sampleid):
572 sample = models.Sample.objects.get(sampleid=sampleid)
573 except ObjectDoesNotExist:
574 return HttpResponse('Sample (%s) does not exist!' % (sampleid))
577 params['fullid'] = str(sample)
578 params['sampleid'] = __center_line("s|%s" % (sample.sampleid), 16)
579 params['line1'] = __center_line(sample.name[0:10], 10)
580 params['line2'] = __center_line(sample.name[10:25], 14)
581 params['line3'] = __center_line('ExpType %s' % (sample.sample_type.name[0:8]), 15)
582 params['slot_num'] = random.randint(1,81)
585 t = get_template('half_inch_samples.txt')
586 print_zpl(t.render(c))
588 return HttpResponse('print command for sample %s sent.' % (sample.sampleid))
591 ################################################
592 # Barcode Magic Commands
593 ################################################
595 def cmd_move_sample(request):
597 Moves a sample to a target container
599 return render_to_response('app.html', {
600 'app_name': settings.HTSW_ST_APPNAME,
601 'page_name': 'CMD: Move Sample',
603 'bcmagic': BarcodeMagicForm(),