Esempio n. 1
0
def index(request):
    results = {}
    today = timezone.now()
    if request.user.is_staff:
        yesterday = today - datetime.timedelta(days=1)
        results['yesterday'] = Activity.objects.filter(activity_date=yesterday.date())
        results['today'] = Activity.objects.filter(activity_date=today)
        context = {'results': results, 'yesterday' : yesterday, 'today':  today}
        return render(request, 'activities/admin_dashboard.html', context)
    else:
        results['all'] = Activity.objects.filter(author__username=request.user.username)
        results['today'] = [item for item in results['all'] if item.activity_date == today.date()]
        results['last_seven_days'] = [item for item in results['all'] \
                                          if (item.activity_date + datetime.timedelta(days=7) > today.date() \
                                              and item.activity_date < today.date())]
        if request.method == "POST":
            form = ActivityForm(request.POST)
            if form.is_valid():
                activity = Activity(author=request.user,
                                    description=form.cleaned_data["description"],
                                    activity_date=form.cleaned_data["activity_date"],
                                    activity_type=form.cleaned_data["activity_type"],
                                    ticket_number=form.cleaned_data["ticket_number"],
                                    hours_worked=form.cleaned_data["hours_worked"],
                                    comment=form.cleaned_data["comment"])
                activity.save()
                messages.add_message(request, messages.SUCCESS, "Activity added successfully!")
                return redirect(reverse('index'))
        else:
            form = ActivityForm()
        context = { 'name' : request.user.username,
                    'results' : results,
                    'form' : form ,
                    'today': today.date()}
        return render(request, "activities/dashboard.html", context)
Esempio n. 2
0
    def post(self, *args, **kwargs):
        context = {}
        form = ActivityForm(self.request.POST)

        if form.is_valid():
            form.save(commit=True)

        context['form'] = form

        return self.render_to_response(context)
Esempio n. 3
0
def index(request):
    results = {}
    today = timezone.now()
    if request.user.is_staff:
        yesterday = today - datetime.timedelta(days=1)
        results['yesterday'] = Activity.objects.filter(
            activity_date=yesterday.date())
        results['today'] = Activity.objects.filter(activity_date=today)
        context = {'results': results, 'yesterday': yesterday, 'today': today}
        return render(request, 'activities/admin_dashboard.html', context)
    else:
        results['all'] = Activity.objects.filter(
            author__username=request.user.username)
        results['today'] = [
            item for item in results['all']
            if item.activity_date == today.date()
        ]
        results['last_seven_days'] = [item for item in results['all'] \
                                          if (item.activity_date + datetime.timedelta(days=7) > today.date() \
                                              and item.activity_date < today.date())]
        if request.method == "POST":
            form = ActivityForm(request.POST)
            if form.is_valid():
                activity = Activity(
                    author=request.user,
                    description=form.cleaned_data["description"],
                    activity_date=form.cleaned_data["activity_date"],
                    activity_type=form.cleaned_data["activity_type"],
                    ticket_number=form.cleaned_data["ticket_number"],
                    hours_worked=form.cleaned_data["hours_worked"],
                    comment=form.cleaned_data["comment"])
                activity.save()
                messages.add_message(request, messages.SUCCESS,
                                     "Activity added successfully!")
                return redirect(reverse('index'))
        else:
            form = ActivityForm()
        context = {
            'name': request.user.username,
            'results': results,
            'form': form,
            'today': today.date()
        }
        return render(request, "activities/dashboard.html", context)
Esempio n. 4
0
def create_booking(request, activity_id):
    activity = Activity.objects.get(pk=activity_id)
    features = activity.feature_set.all()
    prices = activity.price

    form = ActivityForm(request.POST, features=features, activity=activity)
    if not form.is_valid():
        return render(request, 'activities/main.html', {'form': form, 'prices': prices})

    user = request.user

    adults = int(request.POST['adults'])
    youths = int(request.POST['youths'])
    children = int(request.POST['children'])
    students = int(request.POST['students'])
    seniors = int(request.POST['seniors'])

    amount = adults*prices.adult + youths*prices.youth + children*prices.child + \
             students*prices.student + seniors*prices.senior


    dateStrings = request.POST['date'].split("/")
    month = dateStrings[0]
    day = dateStrings[1]
    year = dateStrings[2]

    date_time = datetime.date(int(year), int(month), int(day))
    booking = Booking.objects.create(user=user, activity=activity, amount=amount, activity_date=date_time)
    activity.purchases += 1
    activity.save()

    peoples = People.objects.create(label=activity.label, booking=booking, adult=adults, youth=youths, child=children, student=students, senior=seniors)

    i = 1
    for feature in features:
        option = feature.featureoption_set.get(option=request.POST['feature' + str(i)])
        BookingOption.objects.create(booking=booking, feature_option=option)
        i = i + 1

    return HttpResponseRedirect(reverse('bookings:booking', args=(booking.pk,)))
Esempio n. 5
0
def edit(request, activity_id):
    activity = get_object_or_404(Activity, pk=activity_id,
                                 is_deleted=False)

    if not clubs.utils.can_edit_activity(request.user, activity):
        raise PermissionDenied

    user_coordination = clubs.utils.get_user_coordination_and_deputyships(request.user)
    user_club = user_coordination.first()

    if request.method == 'POST':
        attachment_formset = AttachmentFormSet(request.POST,
                                               request.FILES,
                                               instance=activity)
        item_request_formset = ItemRequestFormSet(request.POST,
                                                  instance=activity)

        if request.user.has_perm('activities.directly_add_activity'):
            modified_activity = DirectActivityForm(request.POST,
                                                   instance=activity)
        elif not activity.is_editable and \
             clubs.utils.has_coordination_to_activity(request.user, activity):
            modified_activity = DisabledActivityForm(request.POST,
                                                     instance=activity)
            item_request_formset = None
        elif activity.primary_club.possible_parents.exists():
            modified_activity = ReviewerActivityForm(request.POST, instance=activity)
            modified_activity.fields['chosen_reviewer_club'].queryset = activity.primary_club.possible_parents.all()
        else:
            modified_activity = ActivityForm(request.POST,
                                             instance=activity)

        # Should check that edits are valid before saving
        if modified_activity.is_valid() and \
           attachment_formset.is_valid() and \
           (not item_request_formset or item_request_formset and item_request_formset.is_valid()):
            modified_activity.save()
            if activity.is_editable:
                item_request_formset.save()

            # Handle attachments
            attachments = attachment_formset.save(commit=False)
            for changed_attachment, fields in attachment_formset.changed_objects:
                changed_attachment.save()
            for new_attachment in attachment_formset.new_objects:
                # Just in case an attachment was uploaded by a user
                # other than the original activity submitter, we need
                # to document that.
                new_attachment.submitter = request.user
                new_attachment.save()
            for deleted_attachment in attachment_formset.deleted_objects:
                deleted_attachment.delete()

            # If the choesn reviewer club was changed, the new one
            # should be the assignee (i.e. reset the stage), send them
            # a notification, and no notification should be sent to
            # that pending review club. Otherwise, if the edit has
            # been done in response to a review, send a notification
            # email to the pending review club.
            if 'chosen_reviewer_club' in modified_activity.changed_data:
                chosen_reviewer_club = modified_activity.cleaned_data['chosen_reviewer_club']
                activity.assignee = chosen_reviewer_club
                show_activity_url = reverse('activities:show', args=(activity.pk,))
                full_url = request.build_absolute_uri(show_activity_url)
                email_context = {'activity': activity,
                                 'full_url': full_url,
                                 'reviewer_club': chosen_reviewer_club}
                if chosen_reviewer_club.coordinator and \
                   chosen_reviewer_club.coordinator.email:
                    mail.send([chosen_reviewer_club.coordinator.email],
                               template="activity_submitted",
                               context=email_context)
            elif activity.assignee == activity.primary_club:
                pending_review = activity.review_set.filter(is_approved=None).first()
                activity.assignee = pending_review.reviewer_club
                activity.save()
                review_url = reverse('activities:review',
                       args=(activity_id, pending_review.reviewer_club.pk))
                review_full_url =  request.build_absolute_uri(review_url)
                email_context = {'activity': activity,
                                 'pending_review': pending_review,
                                 'full_url': review_full_url}
                mail.send([pending_review.reviewer.email],
                          template="activity_edited_to_reviewer",
                          context=email_context)

            return HttpResponseRedirect(reverse('activities:show',
                                                args=(activity.pk, )))
        else:
            context = {'form': modified_activity,
                       'user_club': user_club,
                       'activity_id': activity_id,
                       'attachment_formset': attachment_formset,
                       'item_request_formset': item_request_formset,
                       'edit': True}
            return render(request, 'activities/new.html', context)
    else:
        attachment_formset = AttachmentFormSet(instance=activity)
        item_request_formset = ItemRequestFormSet(instance=activity)

        # There are different activity forms depending on what
        # permission the user has.  Presidency group members
        # (i.e. with directly_add_activity) can add activities
        # directly without waiting for the approval of the deanship.
        # They can also (with change_activity) edit activities
        # regardless of their is_editable value.
        if request.user.has_perm('activities.directly_add_activity'):
            form = DirectActivityForm(instance=activity)
        elif not activity.is_editable and \
             clubs.utils.has_coordination_to_activity(request.user, activity):
            form = DisabledActivityForm(instance=activity)
            item_request_formset = DisabledItemRequestFormSet(instance=activity)
        elif activity.primary_club.possible_parents.exists():
            form = ReviewerActivityForm(instance=activity)
            form.fields['chosen_reviewer_club'].queryset = activity.primary_club.possible_parents.all()
        else:
            form = ActivityForm(instance=activity)
        context = {'form': form, 'activity_id': activity_id,
                   'user_club': user_club,
                   'activity': activity, 'edit': True,
                   'attachment_formset': attachment_formset,
                   'item_request_formset': item_request_formset}
        return render(request, 'activities/new.html', context)
Esempio n. 6
0
def create(request):

    # --- Permission checks ---

    # (1) Check if the user is a coordinator

    # To check permissions, rather than using the
    # @permission_required('activities.add_activity') decorator, it is
    # more dynamic to check whether the user is a coordinator of any
    # club, or has the permission to add activities (i.e. part of the
    # presidency group)
    if not request.user.has_perm("activities.add_activity") and \
       not clubs.utils.can_submit_activities(request.user):
        raise PermissionDenied

    # (2) Check if the user's club has no more than 3 overdue
    # follow-up reports.  If any club coordinated by the user exceeds
    # the 3-report threshold, prevent new activity submission (again
    # in reality the user will only coordinate one club)
    user_coordination = clubs.utils.get_user_coordination_and_deputyships(request.user)
    if any([not club.can_skip_followup_reports and club.get_overdue_report_count() > media.utils.MAX_OVERDUE_REPORTS
            for club in user_coordination]):
        raise PermissionDenied

    if user_coordination.exists():
        user_club = user_coordination.first()

    if request.method == 'POST':
        # DirectActivityForm get to choose what club to submit the
        # activity under.  Normal users shouldn't.
        can_directly_add = request.user.has_perm('activities.directly_add_activity')
        attachment_formset = AttachmentFormSet(request.POST, request.FILES)
        item_request_formset = ItemRequestFormSet(request.POST)
        if can_directly_add:
            activity = Activity(submitter=request.user)
            form = DirectActivityForm(request.POST, instance=activity)
        else:
            activity = Activity(submitter=request.user, primary_club=user_club)
            if user_club.possible_parents.exists():
                # If there are multiple possible parents, all the user to choose.
                form = ReviewerActivityForm(request.POST, instance=activity)
                form.fields['chosen_reviewer_club'].queryset = user_club.possible_parents.all()
            else:
                form = ActivityForm(request.POST, instance=activity)
        if form.is_valid() and attachment_formset.is_valid() and item_request_formset.is_valid():
            form_object = form.save()
            attachment_formset.instance = form_object
            item_request_formset.instance = form_object
            attachments = attachment_formset.save(commit=False)
            for attachment in attachments:
                attachment.submitter = request.user
                attachment.save()
            item_request_formset.save()

            # If the user can directly add activities, make the
            # activity automatically approved.  Otherwise, email the
            # reviewing parent.
            if can_directly_add:
                form_object.is_approved = True
                form_object.assignee = None
            else:
                if form.cleaned_data.get('chosen_reviewer_club'):
                    reviewing_parent = form.cleaned_data['chosen_reviewer_club']
                else:
                    reviewing_parent = form_object.primary_club.get_next_activity_reviewing_parent()

                if not reviewing_parent:
                    form_object.is_approved = True
                    form_object.assignee = None
                else:
                    form_object.is_approved = None
                    form_object.assignee = reviewing_parent
                    show_activity_url = reverse('activities:show', args=(form_object.pk,))
                    full_url = request.build_absolute_uri(show_activity_url)
                    email_context = {'activity': form_object,
                                     'full_url': full_url,
                                     'reviewer_club': reviewing_parent}
                    if reviewing_parent.coordinator and \
                       reviewing_parent.coordinator.email:
                        mail.send([reviewing_parent.coordinator.email],
                                   template="activity_submitted",
                                   context=email_context)
            form_object.save()
            return HttpResponseRedirect(reverse('activities:list'))
        else:
            context = {'form': form,
                       'attachment_formset': attachment_formset,
                       'item_request_formset': item_request_formset}
            return render(request, 'activities/new.html', context)
    elif request.method == 'GET':
        context = {'attachment_formset': AttachmentFormSet(), 'item_request_formset': ItemRequestFormSet()}
        if request.user.has_perm("activities.directly_add_activity"):
            form = DirectActivityForm()
        else:
            if user_club.possible_parents.exists():
                form = ReviewerActivityForm()
                form.fields['chosen_reviewer_club'].queryset = user_club.possible_parents.all()
            else:
                form = ActivityForm()
            context['user_club'] = user_club
        context['form'] = form
        return render(request, 'activities/new.html', context)