def _create_deliveries(self): from devilry.apps.core.models import Delivery for assignmentgroup in self.assignment.assignmentgroups.all().prefetch_related('candidates'): number_of_deliveries = random.randint(self.mindeliveries, self.maxdeliveries) self._print_message('Adding {} deliveries to {}'.format(number_of_deliveries, assignmentgroup)) try: first_canididate = assignmentgroup.candidates.all()[0] except IndexError: continue for deliverynumber in xrange(number_of_deliveries): files = self._choose_random_files(random.randint(self.minfiles, self.maxfiles)) delivery = Delivery( deadline=assignmentgroup.last_deadline, delivered_by=first_canididate, successful=True, # NOTE: Set time_of_delivery to ensure sorting is correct (can create multiple deliveries during # a single second) time_of_delivery=timezone.now() + timedelta(seconds=deliverynumber)) delivery.save(autoset_time_of_delivery=False) self._print_message('Adding {} files to {}'.format(len(files), delivery)) for filepath in files: filename = os.path.relpath(filepath, self.directory) delivery.add_file( filename=filename, iterable_data=open(filepath, 'rb') )
def __init__(self, **kwargs): if 'time_of_delivery' not in kwargs: kwargs['time_of_delivery'] = timezone.now() self.delivery = Delivery(**kwargs) if 'number' not in kwargs: self.delivery.set_number() self.delivery.save()
def convert_to_delivery(self, deadline, user): """ Convert all the UploadedDeliveryFile objects mathing the given deadline and user to a Delivery. Typical usage:: from django.db import transaction with transaction.commit_on_success(): delivery, files = UploadedDeliveryFile.objects.convert_to_delivery(mydeadline, myuser) with transaction.commit_on_success(): files.delete_objects_and_files() :return: A (delivery, queryset) tuple where the ``delivery`` is the created Delivery, the ``queryset` is a :class:`.UploadedDeliveryFileQuerySet` with the files that was made into a delivery. """ queryset = self.filter_for_deadline(deadline, user) if not queryset.exists(): raise UploadedDeliveryFile.DoesNotExist( 'No UploadedDeliveryFile with the given deadline and user exists.' ) candidate = deadline.assignment_group.candidates.filter( relatedstudent__user=user).get() delivery = Delivery(deadline=deadline, delivered_by=candidate, successful=False) delivery.set_number() delivery.save() for uploaded_deliveryfile in queryset: delivery.add_file(uploaded_deliveryfile.filename, uploaded_deliveryfile.uploaded_file) delivery.successful = True delivery.save() return delivery, queryset