示例#1
0
def size_change(request, subscription_id):
    """
    Overriden from core
    change the size of a subscription
    """
    subscription = get_object_or_404(Subscription, id=subscription_id)
    parts_order_allowed = subscription.waiting or subscription.active
    if request.method == 'POST' and int(timezone.now().strftime(
            "%m")) <= Config.business_year_cancelation_month():
        if not parts_order_allowed:
            raise ValidationError(
                _('Für gekündigte {} können keine Bestandteile bestellt werden'
                  ).format(Config.vocabulary('subscription_pl')),
                code='invalid')
        form = SubscriptionPartOrderForm(subscription, request.POST)
        if form.is_valid():
            selected = form.get_selected()
            err_msg = quantity_error(selected,
                                     subscription.active_and_future_parts)
            if not err_msg:
                create_subscription_parts(subscription, selected)
                return redirect("content_edit",
                                subscription_id=subscription_id)
            else:
                form.add_error(None, err_msg)
    else:
        form = SubscriptionPartOrderForm()
    renderdict = {
        'form': form,
        'subscription': subscription,
        'hours_used': Config.assignment_unit() == 'HOURS',
        'next_cancel_date': temporal.next_cancelation_date(),
        'parts_order_allowed': parts_order_allowed,
    }
    return render(request, 'size_change.html', renderdict)
示例#2
0
def size_change(request, subscription_id):
    """
    change the size of a subscription
    """
    subscription = get_object_or_404(Subscription, id=subscription_id)
    parts_order_allowed = subscription.waiting or subscription.active
    if request.method == 'POST':
        if not parts_order_allowed:
            raise ValidationError(
                _('Für gekündigte {} können keine Bestandteile bestellt werden'
                  ).format(Config.vocabulary('subscription_pl')),
                code='invalid')
        form = SubscriptionPartOrderForm(subscription, request.POST)
        if form.is_valid():
            create_subscription_parts(subscription, form.get_selected())
            return return_to_previous_location(request)
    else:
        form = SubscriptionPartOrderForm()
    renderdict = get_menu_dict(request)
    renderdict.update({
        'form': form,
        'subscription': subscription,
        'hours_used': Config.assignment_unit() == 'HOURS',
        'next_cancel_date': temporal.next_cancelation_date(),
        'parts_order_allowed': parts_order_allowed,
    })
    return render(request, 'size_change.html', renderdict)
示例#3
0
def cs_select_subscription(request, cs_session):
    if request.method == 'POST':
        form = SubscriptionPartSelectForm(cs_session.subscriptions, request.POST)
        if form.is_valid():
            cs_session.subscriptions = form.get_selected()
            return redirect(cs_session.next_page())
    else:
        form = SubscriptionPartSelectForm(cs_session.subscriptions)

    render_dict = {
        'form': form,
        'subscription_selected': sum(form.get_selected().values()) > 0,
        'hours_used': Config.assignment_unit() == 'HOURS',
    }
    return render(request, 'createsubscription/select_subscription.html', render_dict)
示例#4
0
def size_change(request, subscription_id):
    """
    change the size of a subscription
    """
    subscription = get_object_or_404(Subscription, id=subscription_id)
    if request.method == 'POST':
        form = SubscriptionPartOrderForm(subscription, request.POST)
        if form.is_valid():
            create_subscription_parts(subscription, form.get_selected())
            return return_to_previous_location(request)
    else:
        form = SubscriptionPartOrderForm()
    renderdict = get_menu_dict(request)
    renderdict.update({
        'form': form,
        'subscription': subscription,
        'hours_used': Config.assignment_unit() == 'HOURS',
        'next_cancel_date': temporal.next_cancelation_date(),
    })
    return render(request, 'size_change.html', renderdict)
示例#5
0
def size_change(request, subscription_id):
    """
    change the size of a subscription
    """
    subscription = get_object_or_404(Subscription, id=subscription_id)
    saved = False
    share_error = False
    if request.method == 'POST' and int(timezone.now().strftime(
            '%m')) <= Config.business_year_cancelation_month():
        # create dict with subscription type -> selected amount
        selected = selected_subscription_types(request.POST)
        # check if members of sub have enough shares
        if subscription.all_shares < sum([
                sub_type.shares * amount
                for sub_type, amount in selected.items()
        ]):
            share_error = True
        elif sum(selected.values()
                 ) > 0:  # check that at least one subscription was selected
            replace_subscription_types(subscription, selected)
            saved = True
    products = SubscriptionProductDao.get_all()
    renderdict = get_menu_dict(request)
    renderdict.update({
        'saved':
        saved,
        'subscription':
        subscription,
        'shareerror':
        share_error,
        'hours_used':
        Config.assignment_unit() == 'HOURS',
        'next_cancel_date':
        temporal.next_cancelation_date(),
        'selected_subscription':
        subscription.future_types.all()[0].id,
        'products':
        products,
    })
    return render(request, 'size_change.html', renderdict)
示例#6
0
def initial_select_size(request, cs_session, **kwargs):
    if request.method == 'POST':
        form = SubscriptionPartSelectForm(cs_session.subscriptions,
                                          request.POST)
        if form.is_valid():
            selected = form.get_selected()
            cs_session.custom_prod = {}
            err_msg = quantity_error(selected)
            if not err_msg or request.POST.get("subscription") == "-1":
                cs_session.subscriptions = selected
                return redirect(cs_session.next_page())
            else:
                form.add_error(None, err_msg)
    else:
        form = SubscriptionPartSelectForm(cs_session.subscriptions)

    render_dict = {
        'form': form,
        'subscription_selected': sum(form.get_selected().values()) > 0,
        'hours_used': Config.assignment_unit() == 'HOURS',
    }
    return render(request, 'cs/initial_select_size.html', render_dict)
def size_change(request, subscription_id):
    """
    change the size of a subscription
    """
    subscription = get_object_or_404(Subscription, id=subscription_id)
    saved = False
    if request.method == 'POST':
        form = SubscriptionTypeEditForm(subscription, request.POST)
        if form.is_valid():
            replace_subscription_types(subscription, form.get_selected())
            saved = True
    else:
        form = SubscriptionTypeEditForm(subscription)

    renderdict = get_menu_dict(request)
    renderdict.update({
        'form': form,
        'saved': saved,
        'subscription': subscription,
        'hours_used': Config.assignment_unit() == 'HOURS',
        'next_cancel_date': temporal.next_cancelation_date(),
    })
    return render(request, 'size_change.html', renderdict)
示例#8
0
def job(request, job_id):
    '''
    Details for a job
    '''
    member = request.user.member
    job = get_object_or_404(Job, id=int(job_id))
    slotrange = list(range(0, job.slots))
    allowed_additional_participants = list(range(1, job.free_slots + 1))
    job_fully_booked = len(allowed_additional_participants) == 0
    job_is_in_past = job.end_time() < timezone.now()
    job_is_running = job.start_time() < timezone.now()
    job_canceled = job.canceled
    can_subscribe = job.infinite_slots or not (
        job_fully_booked or job_is_in_past or job_is_running or job_canceled)
    renderdict = get_menu_dict(request)

    if request.method == 'POST' and can_subscribe and 0 < int(
            request.POST.get('jobs')) <= job.free_slots:
        num = int(request.POST.get('jobs'))
        # adding participants
        amount = 1
        if Config.assignment_unit() == 'ENTITY':
            amount = job.multiplier
        elif Config.assignment_unit() == 'HOURS':
            amount = job.multiplier * job.duration
        for i in range(num):
            assignment = Assignment.objects.create(member=member,
                                                   job=job,
                                                   amount=amount)
        for extra in job.type.job_extras_set.all():
            if request.POST.get('extra' + str(extra.extra_type.id)) == str(
                    extra.extra_type.id):
                assignment.job_extras.add(extra)
        assignment.save()
        membernotification.job_signup(member.email, job)
        # redirect to same page such that refresh in the browser or back
        # button does not trigger a resubmission of the form
        return redirect('job', job_id=job_id)
    elif request.method == 'POST':
        renderdict['messages'].extend(error_message(request))

    all_participants = MemberDao.members_by_job(job)
    number_of_participants = len(all_participants)
    unique_participants = all_participants.annotate(
        assignment_for_job=Count('id')).distinct()

    participants_summary = []
    emails = []
    for participant in unique_participants:
        name = '{} {}'.format(participant.first_name, participant.last_name)
        if participant.assignment_for_job == 2:
            name += _(' (mit einer weiteren Person)')
        elif participant.assignment_for_job > 2:
            name += _(' (mit {} weiteren Personen)').format(
                participant.assignment_for_job - 1)
        contact_url = reverse('contact-member', args=[participant.id])
        extras = []
        for assignment in AssignmentDao.assignments_for_job_and_member(
                job.id, participant):
            for extra in assignment.job_extras.all():
                extras.append(extra.extra_type.display_full)
        reachable = participant.reachable_by_email is True or request.user.is_staff or \
            job.type.activityarea.coordinator == participant
        participants_summary.append(
            (name, contact_url, reachable, ' '.join(extras)))
        emails.append(participant.email)

    renderdict['messages'].extend(job_messages(request, job))
    renderdict.update({
        'can_contact':
        request.user.has_perm('juntagrico.can_send_mails')
        or (job.type.activityarea.coordinator == member
            and request.user.has_perm('juntagrico.is_area_admin')),
        'emails':
        '\n'.join(emails),
        'number_of_participants':
        number_of_participants,
        'participants_summary':
        participants_summary,
        'job':
        job,
        'slotrange':
        slotrange,
        'allowed_additional_participants':
        allowed_additional_participants,
        'can_subscribe':
        can_subscribe,
        'edit_url':
        get_job_admin_url(request, job)
    })
    return render(request, 'job.html', renderdict)