Example #1
0
 def pre_save(cls, sender, instance, **kwds):
     if instance.old_canceled != instance.canceled and instance.old_canceled is False:
         assignments = AssignmentDao.assignments_for_job(instance.id)
         emails = set()
         for assignment in assignments:
             emails.add(assignment.member.email)
         instance.slots = 0
         if len(emails) > 0:
             send_job_canceled(emails, instance)
     if instance.old_time != instance.time:
         assignments = AssignmentDao.assignments_for_job(instance.id)
         emails = set()
         for assignment in assignments:
             emails.add(assignment.member.email)
         if len(emails) > 0:
             send_job_time_changed(emails, instance)
Example #2
0
def handle_job_canceled(sender, instance, **kwargs):
    assignments = AssignmentDao.assignments_for_job(instance.id)
    emails = set()
    for assignment in assignments:
        emails.add(assignment.member.email)
        assignment.delete()
    instance.slots = 0
    if len(emails) > 0:
        membernotification.job_canceled(emails, instance)
Example #3
0
def memberjobs(request):
    '''
    All jobs of current user
    '''
    member = request.user.member
    allassignments = AssignmentDao.assignments_for_member(member)
    renderdict = get_menu_dict(request, 'jobs')
    renderdict.update({'assignments': allassignments})
    return render(request, 'memberjobs.html', renderdict)
Example #4
0
 def transform_job_type(self, queryset):
     for inst in queryset.all():
         i = 0
         for rj in JobDao.recurings_by_type(inst.id):
             oj = OneTimeJob()
             attribute_copy(inst, oj)
             attribute_copy(rj, oj)
             oj.name += str(i)
             i += 1
             oj.save()
             for b in AssignmentDao.assignments_for_job(rj.id):
                 b.job = oj
                 b.save()
             rj.delete()
         inst.delete()
Example #5
0
    def handle(self, *args, **options):

        now = timezone.now()
        end = now + datetime.timedelta(days=2)
        for job in JobDao.jobs_to_remind(now, end):
            participants = []
            emails = []
            for assignment in AssignmentDao.assignments_for_job(job.id):
                if assignment.member is not None:
                    participants.append(str(assignment.member))
                    emails.append(assignment.member.email)
            send_job_reminder(emails, job, ', '.join(participants))
            job.reminder_sent = True
            job.save()
            print(('reminder sent for job ' + str(job.id)))
Example #6
0
 def transform_job(self, queryset):
     for inst in queryset.all():
         t = JobType()
         rj = RecuringJob()
         attribute_copy(inst, t)
         attribute_copy(inst, rj)
         name = t.name
         t.name = "something temporal which possibly is never used"
         t.save()
         rj.type = t
         rj.save()
         for b in AssignmentDao.assignments_for_job(inst.id):
             b.job = rj
             b.save()
         inst.delete()
         t.name = name
         t.save()
Example #7
0
def pastjobs(request):
    '''
    All past jobs of current user
    '''
    member = request.user.member

    allassignments = AssignmentDao.assignments_for_member(member)
    past_assingments = []

    for assignment in allassignments:
        if assignment.job.time < timezone.now():
            past_assingments.append(assignment)

    renderdict = get_menu_dict(request)
    renderdict.update({
        'assignments': past_assingments,
        'menu': {
            'participation': 'active'
        },
    })
    return render(request, 'pastjobs.html', renderdict)
Example #8
0
 def get_status_percentage(self):
     assignments = AssignmentDao.assignments_for_job(self.id)
     if self.slots < 1:
         return get_status_image(100)
     return get_status_image(assignments.count() * 100 / self.slots)
Example #9
0
def get_menu_dict(request):
    member = request.user.member
    next_jobs = []

    required_assignments = 0
    if member.subscription is not None:
        partner_assignments = []
        for subscription_member in member.subscription.recipients_all:
            if subscription_member == member:
                continue
            partner_assignments.extend(
                AssignmentDao.assignments_for_member_current_business_year(
                    subscription_member))

        userassignments = AssignmentDao.assignments_for_member_current_business_year(
            member)
        required_assignments = member.subscription.required_assignments
        assignmentsrange = list(
            range(
                0,
                max(required_assignments,
                    len(userassignments) + len(partner_assignments))))

        for assignment in AssignmentDao.upcomming_assignments_for_member(
                member).order_by('job__time'):
            next_jobs.append(assignment.job)
    else:
        assignmentsrange = None
        partner_assignments = []
        userassignments = []
        next_jobs = []

    userassignments_total = int(sum(a.amount for a in userassignments))
    userassignemnts_core = int(
        sum(a.amount for a in userassignments if a.is_core()))
    partner_assignments_total = int(sum(a.amount for a in partner_assignments))
    partner_assignments_core = int(
        sum(a.amount for a in partner_assignments if a.is_core()))
    assignmentsrange = list(
        range(
            0,
            max(required_assignments,
                userassignments_total + partner_assignments_total)))

    depot_admin = DepotDao.depots_for_contact(request.user.member)
    area_admin = ActivityAreaDao.areas_by_coordinator(request.user.member)
    menu_dict = {
        'user':
        request.user,
        'assignmentsrange':
        assignmentsrange,
        'userassignments_bound':
        userassignments_total,
        'userassignemnts_core_bound':
        userassignemnts_core,
        'partner_assignments_bound':
        userassignments_total + partner_assignments_total,
        'partner_assignments__core_bound':
        userassignments_total + partner_assignments_core,
        'next_jobs':
        next_jobs,
        'can_filter_members':
        request.user.has_perm('juntagrico.can_filter_members'),
        'can_filter_subscriptions':
        request.user.has_perm('juntagrico.can_filter_subscriptions'),
        'can_send_mails':
        request.user.has_perm('juntagrico.can_send_mails'),
        'operation_group':
        request.user.has_perm('juntagrico.is_operations_group'),
        'has_extra_subscriptions':
        ExtraSubscriptionCategoryDao.all_categories_ordered().count() > 0,
        'depot_admin':
        depot_admin,
        'area_admin':
        area_admin,
        'show_core':
        ActivityAreaDao.all_core_areas().count() > 0,
        'show_extras':
        JobExtraDao.all_job_extras().count() > 0,
        'show_deliveries':
        len(
            DeliveryDao.deliveries_by_subscription(
                request.user.member.subscription)) > 0,
        'admin_menus':
        get_admin_menus(),
    }
    enrich_menu_dict(request, menu_dict)
    return menu_dict
Example #10
0
def job(request, job_id):
    '''
    Details for a job
    '''
    member = request.user.member
    job = get_object_or_404(Job, id=int(job_id))

    if request.method == 'POST':
        num = 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.type.duration
        add = int(num)
        for i in range(add):
            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()

        send_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 HttpResponseRedirect('my/jobs')

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

    slotrange = list(range(0, job.slots))
    allowed_additional_participants = list(
        range(1, job.slots - number_of_participants + 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 = not (job_fully_booked or job_is_in_past or job_is_running
                         or job_canceled)

    renderdict = get_menu_dict(request)
    renderdict.update({
        'admin':
        request.user.is_staff or job.type.activityarea.coordinator == member,
        'emails':
        '\n'.join(emails),
        'number_of_participants':
        number_of_participants,
        'participants_summary':
        participants_summary,
        'job':
        job,
        'slotrange':
        slotrange,
        'allowed_additional_participants':
        allowed_additional_participants,
        'job_fully_booked':
        job_fully_booked,
        'job_is_in_past':
        job_is_in_past,
        'job_is_running':
        job_is_running,
        'job_canceled':
        job_canceled,
        'can_subscribe':
        can_subscribe
    })
    return render(request, 'job.html', renderdict)
Example #11
0
 def post_init(cls, sender, instance, **kwds):
     instance.old_time = instance.time
     instance.old_canceled = instance.canceled
     if instance.canceled:
         assignments = AssignmentDao.assignments_for_job(instance.id)
         assignments.delete()
Example #12
0
def handle_job_time_changed(sender, instance, **kwargs):
    assignments = AssignmentDao.assignments_for_job(instance.id)
    emails = set([assignment.member.email for assignment in assignments])
    if len(emails) > 0:
        membernotification.job_time_changed(emails, instance)
Example #13
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)
Example #14
0
def get_menu_dict(request):
    member = request.user.member
    next_jobs = JobDao.upcomming_jobs_for_member(member)

    required_assignments = 0
    if member.subscription_current is not None:
        partner_assignments = []
        for subscription_member in member.subscription_current.recipients_all:
            if subscription_member == member:
                continue
            partner_assignments.extend(
                AssignmentDao.assignments_for_member_current_business_year(
                    subscription_member))

        userassignments = AssignmentDao.assignments_for_member_current_business_year(
            member)
        required_assignments = member.subscription_current.required_assignments
    else:
        partner_assignments = []
        userassignments = []

    userassignments_total = int(sum(a.amount for a in userassignments))
    userassignemnts_core = int(
        sum(a.amount for a in userassignments if a.is_core()))
    partner_assignments_total = int(sum(a.amount for a in partner_assignments))
    partner_assignments_core = int(
        sum(a.amount for a in partner_assignments if a.is_core()))
    assignmentsrange = list(
        range(
            0,
            max(required_assignments,
                userassignments_total + partner_assignments_total)))

    depot_admin = DepotDao.depots_for_contact(request.user.member)
    area_admin = ActivityAreaDao.areas_by_coordinator(request.user.member)
    menu_dict = get_page_dict(request)
    menu_dict.update({
        'user':
        request.user,
        'assignmentsrange':
        assignmentsrange,
        'userassignments_bound':
        userassignments_total,
        'userassignemnts_core_bound':
        userassignemnts_core,
        'partner_assignments_bound':
        userassignments_total + partner_assignments_total,
        'partner_assignments_core_bound':
        userassignments_total + partner_assignments_core,
        'next_jobs':
        next_jobs,
        'can_filter_members':
        request.user.has_perm('juntagrico.can_filter_members'),
        'can_filter_subscriptions':
        request.user.has_perm('juntagrico.can_filter_subscriptions'),
        'can_send_mails':
        request.user.has_perm('juntagrico.can_send_mails'),
        'operation_group':
        request.user.has_perm('juntagrico.is_operations_group'),
        'has_extra_subscriptions':
        ExtraSubscriptionCategoryDao.all_categories_ordered().count() > 0,
        'depot_admin':
        depot_admin,
        'area_admin':
        area_admin,
        'show_core':
        ActivityAreaDao.all_core_areas().count() > 0,
        'requires_core':
        SubscriptionTypeDao.get_with_core().count() > 0,
        'show_extras':
        JobExtraDao.all_job_extras().count() > 0,
        'show_deliveries':
        len(
            DeliveryDao.deliveries_by_subscription(
                request.user.member.subscription_current)) > 0,
        'admin_menus':
        addons.config.get_admin_menus(),
        'admin_subscription_menus':
        addons.config.get_admin_subscription_menu(),
        'user_menus':
        addons.config.get_user_menus(),
        'messages': [],
    })
    return menu_dict
Example #15
0
def get_menu_dict(request):
    member = request.user.member
    next_jobs = []

    def filter_to_past_assignments(assignments):
        res = []
        for assignment in assignments:
            if assignment.job.time.year == date.today(
            ).year and assignment.job.time < timezone.now():
                res.append(assignment)
        return res

    subscription_size = 0
    if member.subscription is not None:
        partner_assignments = []
        for subscription_member in member.subscription.recipients():
            if subscription_member == member:
                continue
            partner_assignments.extend(
                filter_to_past_assignments(
                    AssignmentDao.assignments_for_member(subscription_member)))

        userassignments = filter_to_past_assignments(
            AssignmentDao.assignments_for_member(member))
        subscription_size = member.subscription.required_assignments()
        assignmentsrange = list(
            range(
                0,
                max(subscription_size,
                    len(userassignments) + len(partner_assignments))))

        for assignment in AssignmentDao.assignments_for_member(
                member).order_by("job__time"):
            if assignment.job.time > timezone.now():
                next_jobs.append(assignment.job)
    else:
        assignmentsrange = None
        partner_assignments = []
        userassignments = []
        next_jobs = []

    depot_admin = DepotDao.depots_for_contact(request.user.member)
    area_admin = ActivityAreaDao.areas_by_coordinator(request.user.member)
    menu_dict = {
        'user':
        request.user,
        'assignmentsrange':
        assignmentsrange,
        'userassignments_total':
        len(userassignments),
        'userassignemnts_core':
        len([
            assignment for assignment in userassignments
            if assignment.is_core()
        ]),
        'partner_assignments_total':
        len(userassignments) + len(partner_assignments),
        'partner_assignments_core':
        len(userassignments) + len([
            assignment
            for assignment in partner_assignments if assignment.is_core()
        ]),
        'subscription_size':
        subscription_size,
        'next_jobs':
        next_jobs,
        'can_filter_members':
        request.user.has_perm('juntagrico.can_filter_members'),
        'can_filter_subscriptions':
        request.user.has_perm('juntagrico.can_filter_subscriptions'),
        'can_send_mails':
        request.user.has_perm('juntagrico.can_send_mails'),
        'operation_group':
        request.user.has_perm('juntagrico.is_operations_group'),
        'depot_admin':
        depot_admin,
        'area_admin':
        area_admin,
        'show_core':
        ActivityAreaDao.all_core_areas().count() > 0,
        'show_extras':
        JobExtraDao.all_job_extras().count() > 0,
        'depot_list_url':
        settings.MEDIA_URL + settings.MEDIA_ROOT + "/dpl.pdf",
    }
    enrich_menu_dict(request, menu_dict)
    return menu_dict