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')
                    )
Beispiel #2
0
 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()
Beispiel #3
0
    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