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)
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)
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)
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()
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)))
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()
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)
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)
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
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)
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()
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)
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)
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
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