Example #1
0
def multiply_task(request, task_pk):
    obj = get_object_or_404(Task.query(request), pk=task_pk)
    # noinspection PyProtectedMember
    model_admin = admin.site._registry[Organization]
    assert isinstance(model_admin, OrganizationAdmin)
    # noinspection PyProtectedMember
    opts = model_admin.model._meta
    if request.method == 'POST':
        form = MultiplyTaskForm(request.POST)
        if form.is_valid():
            until_src = form.cleaned_data['until']
            every_src = form.cleaned_data['every']
            assert isinstance(until_src, datetime.datetime)
            limit = datetime.datetime(year=until_src.year, month=until_src.month, day=until_src.day,
                                      hour=23, minute=59, second=59, tzinfo=obj.start_time.tzinfo)
            to_create = []
            increment = datetime.timedelta(days=every_src)
            start_time = obj.start_time + increment
            end_time = obj.end_time + increment
            matcher = re.match(r'^(.*)\s+\((\d+)\)', obj.name)
            if matcher:
                new_name = matcher.group(1)
                name_index = int(matcher.group(2)) + 1
            else:
                new_name = obj.name
                name_index = 2
            current_category_pks = [x.pk for x in obj.categories.all()]
            while start_time < limit:
                new_task = Task(organization_id=obj.organization_id, name='%s (%d)' % (new_name, name_index),
                                start_time=start_time, end_time=end_time)
                to_create.append(new_task)
                start_time += increment
                end_time += increment
                name_index += 1
            if to_create:
                if current_category_pks:
                    cls = Task.categories.through
                    all_categories_to_create = []
                    for new_task in to_create:
                        new_task.save()
                        all_categories_to_create += [cls(task_id=new_task.pk, category_id=category_pk)
                                                     for category_pk in current_category_pks]
                    cls.objects.bulk_create(all_categories_to_create)
                else:
                    Task.objects.bulk_create(to_create)
            if len(to_create) > 1:
                messages.info(request, _('%(count)d tasks have been created.') % {'count': len(to_create)})
            elif to_create:
                messages.info(request, _('A task has been created.'))
            new_url = reverse('admin:%s_%s_change' % (opts.app_label, opts.model_name),
                              args=(quote(obj.organization_id), ), current_app=model_admin.admin_site.name)
            return HttpResponseRedirect(new_url)
    else:
        form = MultiplyTaskForm(initial={'source_task': obj})
    template_values = get_template_values(request, organization_pk=obj.organization_id)
    template_values['obj'] = obj
    template_values['form'] = form
    return render_to_response('autoplanner/multiply_task.html', template_values, RequestContext(request))