8069f7d8eb805d6085e86dd3963a8c1d45b9f7e0
[htsworkflow.git] / samplebc / samples / views.py
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
7 from django.contrib.auth.decorators import login_required
8
9 from django.utils.safestring import mark_safe
10
11 from samplebc.samples.forms import FreezerForm, ContainerForm, SampleForm, CmdMoveSampleForm
12 from samplebc.samples.models import Freezer, Container, Sample
13 from samplebc.samples.util import get_uuid, get_sampleid, assign_to_container
14 from samplebc.samples.errors import NoSpaceAvaliable
15 from samplebc import settings
16
17 # Barcode Magic!
18 from samplebc.bcmagic.forms import BarcodeMagicForm
19
20 # Reversion
21 from reversion import revision
22
23 import random
24 import ftplib
25 import StringIO
26
27
28 ################################################
29 # Util functions
30 ################################################
31
32 def print_zpl(zpl_text):
33     """
34     Sends zpl_text to printer
35     """
36     ftp = ftplib.FTP(host='131.215.54.194', user='blank', passwd='')
37     ftp.login()
38     ftp.storlines("STOR printme.txt", StringIO.StringIO(zpl_text))
39
40
41 def __center_line(line, width):
42     spaces_to_add = width - len(line)
43     
44     front_half = spaces_to_add / 2
45     back_half = spaces_to_add - front_half
46     
47     return (' ' * front_half) + line + (' ' * back_half)    
48
49
50   
51   
52 ################################################
53 # Container
54 ################################################
55 @login_required
56 def container_index(request):
57     """
58     Returns an index of available to containers
59     """
60     container_list = Container.objects.all()
61     c = Context({'title': 'Container Index',
62                  'container_list': container_list})
63     t = get_template('container_index.html')
64     
65     return render_to_response('app.html', {
66                                 'app_name': "HTSW-SampleTracker",
67                                 'page_name': 'Container Index',
68                                 'bcmagic': BarcodeMagicForm(),
69                                 'select': 'container',
70                                 'body': t.render(c)
71                             },
72                               context_instance=RequestContext(request))
73     
74
75
76 @login_required
77 def container_summary(request, container_id, msg=None):
78     """
79     Returns details of a container
80     """
81     # Retrieve container by UUID
82     try:
83         container = models.Container.objects.get(uuid=container_id)
84     except ObjectDoesNotExist, e:
85         msg = "Container (%s) does not exist." % (container_id)
86         return render_to_response('app.html', {
87                                     'app_name': settings.HTSW_ST_APPNAME,
88                                     'page_name': 'Container Summary',
89                                     'media': '',
90                                     'bcmagic': BarcodeMagicForm(),
91                                     'select': 'container',
92                                     'body': msg
93                                 },
94                                   context_instance=RequestContext(request))
95     
96     # Retrieve samples from container
97     sample_list = container.sample_set.all()
98     
99     # Prepare a Sample Index of Contained Samples
100     cs = Context({'title': 'Contained Samples',
101                  'sample_list': sample_list})
102     ts = get_template('sample_index.html')
103     
104     # Render prepared samples into container summary
105     cc = Context({'container': container,
106                   'msg': msg,
107                  'rendered_samples': ts.render(cs) })
108     tc = get_template('container_summary.html')
109     
110     # Render container summary to app html
111     return render_to_response('app.html', {
112                                 'app_name': settings.HTSW_ST_APPNAME,
113                                 'page_name': 'Container Summary',
114                                 'media': '',
115                                 'bcmagic': BarcodeMagicForm(),
116                                 'select': 'container',
117                                 'body': tc.render(cc)
118                             },
119                               context_instance=RequestContext(request))
120
121 @login_required
122 @revision.create_on_success
123 def container_add(request):
124     """
125     Form for adding a container.
126     """
127     #Reversion stuff
128     #revision.user = me
129     revision.comment = "New container created by user."
130     
131     # If user submitted the Container form.
132     if request.method == 'POST':
133         # Fill in ContainerForm with POSTed data.
134         form = ContainerForm(request.POST)
135         
136         # If the form is valid, process it.
137         if form.is_valid():
138             # Create new Container object from form data
139             c_obj = form.save(commit=False)
140             # Added UUID
141             c_obj.uuid = get_uuid()
142             # Save to DB.
143             c_obj.save()
144             # Save the many to many link data.
145             form.save_m2m()
146             return container_summary(request, c_obj.uuid)
147     else:
148         # If users first visit, create empty form.
149         form = ContainerForm()
150         
151     # Load form template
152     c = Context({'form': form,
153                  'action_url': '/samples/container/add/'})
154     t = get_template('generic_form.html')
155
156     return render_to_response('app.html', {
157                                 'app_name': settings.HTSW_ST_APPNAME,
158                                 'page_name': 'Container Add',
159                                 'media': form.media,
160                                 'bcmagic': BarcodeMagicForm(),
161                                 'select': 'container',
162                                 'body': t.render(c)
163                             },
164                               context_instance=RequestContext(request))
165
166 @login_required
167 @revision.create_on_success
168 def container_edit(request, container_id):
169     """
170     Allow editing of a container
171     """
172     #Reversion stuff
173     revision.comment = "Manual container edit by user."
174     
175     try:
176         container = models.Container.objects.get(uuid=container_id)
177     except ObjectDoesNotExist, e:
178         msg = "Container (%s) cannot be edited as it does not exist." % (container_id)
179         return render_to_response('app.html', {
180                                     'app_name': settings.HTSW_ST_APPNAME,
181                                     'page_name': 'Container Edit',
182                                     'media': '',
183                                     'bcmagic': BarcodeMagicForm(),
184                                     'select': 'container',
185                                     'body': msg
186                                 },
187                                   context_instance=RequestContext(request))
188     
189     # If user submitted the container form.
190     if request.method == 'POST':
191         # Fill in ContainerForm with POSTed data.
192         form = ContainerForm(request.POST, instance=container)
193         
194         # If the form is valid, process it.
195         if form.is_valid():
196             # Save Container object from form data
197             c_obj = form.save(commit=True)
198             # Save many2many changes as well
199             #form.save_m2m() #Not needed when form.save(commit=True)
200             
201             return container_summary(request, c_obj.uuid)
202     else:
203         # If users first visit, create form from Container instance.
204         form = ContainerForm(instance=container)
205
206     # Load form template
207     c = Context({'form': form,
208                  'action_url': '%sedit/' % (container.get_absolute_url())})
209     t = get_template('generic_form.html')
210
211     return render_to_response('app.html', {
212                                 'app_name': settings.HTSW_ST_APPNAME,
213                                 'page_name': 'Container Edit',
214                                 'media': form.media,
215                                 'bcmagic': BarcodeMagicForm(),
216                                 'select': 'container',
217                                 'body': t.render(c)
218                             },
219                               context_instance=RequestContext(request))
220
221 @login_required
222 def container_print(request, container_id):
223     """
224     prints a container label
225     """
226     
227     try:
228         container = models.Container.objects.get(uuid=container_id)
229     except ObjectDoesNotExist:
230         return HttpResponse('Container (%s) does not exist!' % (container_id))
231     
232     params = {}
233     params['container_name'] = __center_line(container.name[0:17], 17)
234     params['line1'] = __center_line('%s' % (container.name[17:34]), 17)
235     params['line2'] = __center_line('%s' % (container.name[34:51]), 17)
236     params['line3'] = __center_line('%s' % (container.name[51:68]), 17)
237     params['line4'] = __center_line('%s' % (container.name[68:85]), 17)
238     params['barcode'] = 'cntr|%s' % (container.uuid)
239     params['symbol'] = ''
240     
241     c = RequestContext(request, params)
242     t = get_template('zpl_container_label.txt')
243     print_zpl(t.render(c))
244     
245     return container_summary(request, container_id, msg='print command for container %s sent.' % (container.uuid))
246
247
248 ################################################
249 # Freezer
250 ################################################
251 @login_required
252 def freezer_index(request):
253     """
254     Returns an index of available freezers
255     """
256     freezer_list = Freezer.objects.all()
257     c = Context({'freezer_list': freezer_list})
258     t = get_template('freezer_index.html')
259     
260     return render_to_response('app.html', {
261                                 'app_name': "HTSW-SampleTracker",
262                                 'page_name': 'Freezer Index',
263                                 'media': '',
264                                 'bcmagic': BarcodeMagicForm(),
265                                 'select': 'freezer',
266                                 'body': t.render(c)
267                             },
268                               context_instance=RequestContext(request))
269     
270 @login_required    
271 def freezer_summary(request, freezer_id, msg=None):
272     """
273     Returns summary of freezer_id
274     """
275     # Retrieve freezer by UUID
276     try:
277         freezer = models.Freezer.objects.get(uuid=freezer_id)
278     except ObjectDoesNotExist, e:
279         msg = "Freezer (%s) does not exist." % (freezer_id)
280         return render_to_response('app.html', {
281                                     'app_name': settings.HTSW_ST_APPNAME,
282                                     'page_name': 'Freezer Summary',
283                                     'media': '',
284                                     'bcmagic': BarcodeMagicForm(),
285                                     'select': 'freezer',
286                                     'body': msg
287                                     },
288                                   context_instance=RequestContext(request))
289     
290     # List of contained containers
291     container_list = freezer.container_set.all()
292     
293     
294     # Render prepared container index into freezer summary
295     cf = Context({'freezer': freezer,
296                   'msg': msg})
297     tf = get_template('freezer_summary.html')
298     
299     # Render Freezer summary to app html
300     return render_to_response('app.html', {
301                                 'app_name': settings.HTSW_ST_APPNAME,
302                                 'page_name': 'Freezer Summary',
303                                 'media': '',
304                                 'bcmagic': BarcodeMagicForm(),
305                                 'select': 'freezer',
306                                 'body': tf.render(cf)
307                             },
308                               context_instance=RequestContext(request))
309
310 @login_required
311 @revision.create_on_success
312 def freezer_add(request):
313     """
314     Allows you to add a new freezer.
315     """
316     #Reversion stuff
317     revision.comment = "New freezer created by user."
318     
319     # If user submitted the freezer form.
320     if request.method == 'POST':
321         # Fill in FreezerForm with POSTed data.
322         form = FreezerForm(request.POST)
323         
324         # If the form is valid, process it.
325         if form.is_valid():
326             # Create new Freezer object from form data
327             f_obj = form.save(commit=False)
328             # Added UUID
329             f_obj.uuid = get_uuid()
330             # Save to DB.
331             f_obj.save()
332             return freezer_summary(request, f_obj.uuid)
333     else:
334         # If users first visit, create empty form.
335         form = FreezerForm()
336
337     # Load form template
338     c = Context({'form': form,
339                  'action_url': '/samples/freezer/add/'})
340     t = get_template('generic_form.html')
341
342     return render_to_response('app.html', {
343                                 'app_name': settings.HTSW_ST_APPNAME,
344                                 'page_name': 'Freezer Add',
345                                 'media': form.media,
346                                 'bcmagic': BarcodeMagicForm(),
347                                 'select': 'freezer',
348                                 'body': t.render(c)
349                             },
350                               context_instance=RequestContext(request))
351
352 @login_required
353 @revision.create_on_success
354 def freezer_edit(request, freezer_id):
355     """
356     Allow editing of a freezer
357     """
358     #Reversion stuff
359     revision.comment = "Manual freezer edit by user."
360     
361     try:
362         freezer = models.Freezer.objects.get(uuid=freezer_id)
363     except ObjectDoesNotExist, e:
364         msg = "Freezer (%s) cannot be edited as it does not exist." % (freezer_id)
365         return render_to_response('app.html', {
366                                     'app_name': settings.HTSW_ST_APPNAME,
367                                     'page_name': 'Freezer Summary',
368                                     'media': '',
369                                     'bcmagic': BarcodeMagicForm(),
370                                     'select': 'freezer',
371                                     'body': msg
372                                     },
373                                   context_instance=RequestContext(request))
374     
375     # If user submitted the freezer form.
376     if request.method == 'POST':
377         # Fill in FreezerForm with POSTed data.
378         form = FreezerForm(request.POST, instance=freezer)
379         
380         # If the form is valid, process it.
381         if form.is_valid():
382             # Save Freezer object from form data
383             f_obj = form.save(commit=True)
384             
385             return freezer_summary(request, f_obj.uuid)
386     else:
387         # If users first visit, create form from freezer instance.
388         form = FreezerForm(instance=freezer)
389
390     # Load form template
391     c = Context({'form': form,
392                  'action_url': '%sedit/' % (freezer.get_absolute_url())})
393     t = get_template('generic_form.html')
394
395     return render_to_response('app.html', {
396                                 'app_name': settings.HTSW_ST_APPNAME,
397                                 'page_name': 'Freezer Edit',
398                                 'media': form.media,
399                                 'bcmagic': BarcodeMagicForm(),
400                                 'select': 'freezer',
401                                 'body': t.render(c)
402                             },
403                               context_instance=RequestContext(request))
404
405 @login_required
406 def freezer_print(request, freezer_id):
407     """
408     prints a freezer label
409     """
410     
411     try:
412         freezer = models.Freezer.objects.get(uuid=freezer_id)
413     except ObjectDoesNotExist:
414         return HttpResponse('Freezer (%s) does not exist!' % (freezer_id))
415     
416     params = {}
417     params['freezer_name'] = __center_line(freezer.name, 17)
418     params['line1'] = __center_line('%s' % (freezer.name[17:34]), 17)
419     params['line2'] = __center_line('%s' % (freezer.name[34:51]), 17)
420     params['line3'] = __center_line('%s' % (freezer.name[51:68]), 17)
421     params['line4'] = __center_line('Temp: %s C' % (freezer.temperature), 17)
422     params['barcode'] = 'frzr|%s' % (freezer.uuid)
423     params['symbol'] = ''
424     
425     c = RequestContext(request, params)
426     t = get_template('zpl_freezer_label.txt')
427     print_zpl(t.render(c))
428     
429     return freezer_summary(request, freezer_id, msg='print command for freezer %s sent.' % (freezer.uuid))
430
431
432 ################################################
433 # Samples
434 ################################################
435 @login_required
436 def sample_index(request):
437     """
438     return a list of samples and what we can do with them.
439     """
440     sample_list = models.Sample.objects.all()
441     
442     # Load form template
443     c = Context({'title': 'Sample Index',
444                  'sample_list': sample_list})
445     t = get_template('sample_index.html')
446     #html.append('%s <a href="/samples/sample/%s/print">(print)</a>' \
447     #            % (sample, sample.sampleid))
448         
449     return render_to_response('app.html', {
450                                 'app_name': settings.HTSW_ST_APPNAME,
451                                 'page_name': 'Samples Index',
452                                 'media': '',
453                                 'bcmagic': BarcodeMagicForm(),
454                                 'select': 'samples',
455                                 'body': t.render(c)
456                             },
457                               context_instance=RequestContext(request))
458
459 @login_required
460 def sample_homeless(request):
461     """
462     Returns an index of homeless samples
463     """
464     sample_list = Sample.objects.filter(container=None)
465     c = Context({'title': 'Homeless Samples',
466                  'sample_list': sample_list})
467     t = get_template('sample_homeless.html')
468     
469     return render_to_response('app.html', {
470                                 'app_name': "HTSW-SampleTracker",
471                                 'page_name': 'Homeless Samples',
472                                 'bcmagic': BarcodeMagicForm(),
473                                 'select': 'samples',
474                                 'body': t.render(c)
475                             },
476                               context_instance=RequestContext(request))
477     
478 @login_required
479 @revision.create_on_success
480 def sample_add(request):
481     """
482     Allow adding of a new sample
483     """
484     #Reversion stuff
485     revision.comment = "New sample created by user."
486     
487     ASSIGNED_CONTAINER = False
488     
489     # If user submitted the sample form.
490     if request.method == 'POST':
491         # Fill in SampleForm with POSTed data.
492         form = SampleForm(request.POST)
493         
494         # If the form is valid, process it.
495         if form.is_valid():
496             # Create new Sample object from form data
497             s_obj = form.save(commit=False)
498             
499             # Add sample ID
500             s_obj.sampleid = get_sampleid()
501             
502             # If the user wants us to assign a container.
503             if form.cleaned_data['assign_container']:
504                 # Choose container
505                 try:
506                     assign_to_container(s_obj)
507                     ASSIGNED_CONTAINER = True
508                 except NoSpaceAvaliable, e:
509                     #return HttpResponse("<b>Error:</b> %s<br /><i>You will need to prepare a new container before continuing.</i>" \
510                     #                    % (e))
511                     ASSIGNED_CONTAINER = False
512                                     
513             # Save to DB.
514             s_obj.save()
515             
516             if not ASSIGNED_CONTAINER:
517                 msg = "NOTE: Sample is homeless"
518                 return sample_summary(request, s_obj.sampleid, msg=msg)
519
520             
521             msg = "Sample created."
522             return sample_summary(request, s_obj.sampleid, msg=msg)
523     else:
524         # If users first visit, create empty form.
525         form = SampleForm()
526
527     # Load form template
528     c = Context({'form': form,
529                  'action_url': '/samples/sample/add/'})
530     t = get_template('generic_form.html')
531
532     return render_to_response('app.html', {
533                                 'app_name': settings.HTSW_ST_APPNAME,
534                                 'page_name': 'Sample Add',
535                                 'media': form.media,
536                                 'bcmagic': BarcodeMagicForm(),
537                                 'select': 'samples',
538                                 'body': t.render(c)
539                             },
540                               context_instance=RequestContext(request))
541     
542 @login_required
543 @revision.create_on_success
544 def sample_edit(request, sampleid):
545     """
546     Allow editing of a sample
547     """
548     #Reversion stuff
549     revision.comment = "Manual sample edit by user."
550     
551     try:
552         sample = models.Sample.objects.get(sampleid=sampleid)
553     except ObjectDoesNotExist, e:
554         msg = "Sample (%s) cannot be edited as it does not exist." % (sampleid)
555         return render_to_response('app.html', {
556                     'app_name': settings.HTSW_ST_APPNAME,
557                     'page_name': 'Sample Edit',
558                     'media': '',
559                     'bcmagic': BarcodeMagicForm(),
560                     'select': 'samples',
561                     'body': msg
562                 })
563     
564     # If user submitted the sample form.
565     if request.method == 'POST':
566         # Fill in SampleForm with POSTed data.
567         form = SampleForm(request.POST, instance=sample)
568         
569         # If the form is valid, process it.
570         if form.is_valid():
571             # Save Sample object from form data
572             s_obj = form.save(commit=True)
573             
574             msg = "Sample Update Saved"
575             return sample_summary(request, s_obj.sampleid, msg)
576     else:
577         # If users first visit, create form from sample instance.
578         form = SampleForm(instance=sample)
579
580     # Load form template
581     c = Context({'form': form,
582                  'action_url': '%sedit/' % (sample.get_absolute_url())})
583     t = get_template('generic_form.html')
584
585     return render_to_response('app.html', {
586                                 'app_name': settings.HTSW_ST_APPNAME,
587                                 'page_name': 'Sample Edit',
588                                 'media': form.media,
589                                 'bcmagic': BarcodeMagicForm(),
590                                 'select': 'samples',
591                                 'body': t.render(c)
592                             },
593                               context_instance=RequestContext(request))
594
595 @login_required
596 @revision.create_on_success
597 def sample_assign_container(request, sampleid):
598     """
599     Assigns sample to container using the assign to container algorithm
600     """
601     
602     sample = Sample.objects.get(sampleid=sampleid)
603     
604     try:
605         assign_to_container(sample)
606     except NoSpaceAvaliable, e:
607         return render_to_response('app.html', {
608                                     'app_name': settings.HTSW_ST_APPNAME,
609                                     'page_name': 'Sample Assign',
610                                     'media': '',
611                                     'bcmagic': BarcodeMagicForm(),
612                                     'select': 'samples',
613                                     'body': mark_safe("<b>Error:</b> %s<br /><i>You will need to prepare a new container before continuing.</i>" \
614                                                         % (e))
615                                     },
616                                   context_instance=RequestContext(request))
617         
618     sample.save()
619     
620     body = 'Sample (<a href="%s">%s</a>) assigned to container (<a href="%s">%s</a>)' \
621            % (sample.get_absolute_url(), str(sample), sample.container.get_absolute_url(), str(sample.container))
622     
623     #Reversion stuff
624     revision.comment = "Sample auto-assigned to container (%s: %s)" % (str(sample.container), sample.container.uuid)
625     
626     return render_to_response('app.html', {
627                                 'app_name': settings.HTSW_ST_APPNAME,
628                                 'page_name': 'Sample Assign',
629                                 'media': '',
630                                 'bcmagic': BarcodeMagicForm(),
631                                 'select': 'samples',
632                                 'body': mark_safe(body),
633                             },
634                             context_instance=RequestContext(request))
635
636 @login_required
637 def sample_summary(request, sampleid, msg=None):
638     """
639     Display a summary of a given sample
640     """
641     try:
642         sample = models.Sample.objects.get(sampleid=sampleid)
643     except ObjectDoesNotExist, e:
644         msg = "Sample (%s) does not exist." % (sampleid)
645         return render_to_response('app.html', {
646                                     'app_name': settings.HTSW_ST_APPNAME,
647                                     'page_name': 'Sample Summary',
648                                     'media': '',
649                                     'bcmagic': BarcodeMagicForm(),
650                                     'select': 'samples',
651                                     'body': msg
652                                 },
653                                   context_instance=RequestContext(request))
654     
655     c = Context({'sample': sample,
656                  'msg': msg,})
657     t = get_template('sample_summary.html')
658     
659     return render_to_response('app.html', {
660                                 'app_name': settings.HTSW_ST_APPNAME,
661                                 'page_name': 'Sample Summary',
662                                 'media': '',
663                                 'bcmagic': BarcodeMagicForm(),
664                                 'select': 'samples',
665                                 'body': t.render(c)
666                             },
667                               context_instance=RequestContext(request))
668
669 @login_required  
670 def sample_print(request, sampleid):
671     """
672     prints a sample!
673     """
674     
675     try:
676         sample = models.Sample.objects.get(sampleid=sampleid)
677     except ObjectDoesNotExist:
678         return HttpResponse('Sample (%s) does not exist!' % (sampleid))
679     
680     params = {}
681     params['fullid'] = str(sample)
682     params['sampleid'] = __center_line("s|%s" % (sample.sampleid), 16)
683     params['line1'] = __center_line(sample.name[0:10], 10)
684     params['line2'] = __center_line(sample.name[10:25], 14)
685     params['line3'] = __center_line('ExpType %s' % (sample.sample_type.name[0:8]), 15)
686     params['slot_num'] = random.randint(1,81)
687     
688     c = RequestContext(request, params)
689     t = get_template('half_inch_samples.txt')
690     print_zpl(t.render(c))
691     
692     return sample_summary(request, sampleid, msg='print command for sample %s sent.' % (sample.sampleid))
693
694 @login_required
695 def user_profile(request):
696     """
697     Information about the user
698     """
699     return render_to_response('registration/profile.html', {
700                                 'app_name': settings.HTSW_ST_APPNAME,
701                                 'page_name': 'User Profile',
702                                 'media': '',
703                                 'bcmagic': BarcodeMagicForm(),
704                                 'select': 'settings',
705                             },
706                               context_instance=RequestContext(request))
707
708 ################################################
709 # Barcode Magic Commands
710 ################################################
711
712 def __cmd_move_sample_return(form, request, msg=''):
713     """
714     A small helper function since this code is reused multiple times
715     """
716     # Load form template
717     c = Context({'form': form,
718                  'action_url': '.'})
719     t = get_template('generic_form.html')
720     
721     return render_to_response('app.html', {
722                                 'app_name': settings.HTSW_ST_APPNAME,
723                                 'page_name': 'CMD: Move Sample',
724                                 'media': '',
725                                 'bcmagic': BarcodeMagicForm({'bcm_mode': 'cmd_move_sample'}),
726                                 'select': 'samples',
727                                 'msg': msg,
728                                 'body': t.render(c)
729                             },
730                               context_instance=RequestContext(request))
731
732 @login_required
733 @revision.create_on_success
734 def cmd_move_sample(request):
735     """
736     Moves a sample to a target container
737     """
738     form = CmdMoveSampleForm()
739     # Process form:
740     if request.method == 'POST':
741         form = CmdMoveSampleForm(request.POST)
742         
743         #If for some reason the form is not valid, return
744         if not form.is_valid():
745             msg = "Form is not valid."
746             return __cmd_move_sample_return(form, request, msg)
747         
748         try:
749             sample = models.Sample.objects.get(sampleid=form.cleaned_data['sampleid'])
750         except ObjectDoesNotExist, e:
751             msg = "Sample %s does not exist." % (form.cleaned_data['sampleid'])
752             return __cmd_move_sample_return(form, request, msg)
753             
754         try:
755             container = models.Container.objects.get(uuid=form.cleaned_data['container_id'])
756         except ObjectDoesNotExist, e:
757             msg = "Container %s does not exist." % (form.cleaned_data['container_id'])
758             return __cmd_move_sample_return(form, request, msg)
759         
760         # Move the sample to the new container
761         old_container = sample.container
762         sample.container = container
763         if old_container is None:
764             revision.comment = "Sample (%s) moved from Homeless to Container(%s; uuid: %s)" \
765                                % (str(sample), str(container), container.uuid)
766         else:
767             revision.comment = "Sample (%s) moved from Container(%s; uuid: %s) to Container(%s; uuid: %s)" \
768                                % (str(sample), str(old_container), old_container.uuid, str(container), container.uuid)
769         sample.save()
770         
771         return __cmd_move_sample_return(CmdMoveSampleForm(), request, revision.comment)
772         
773     return __cmd_move_sample_return(form, request)
774         
775         
776     
777