def has_designated_service(user): if is_trainee(user): worker = trainee_from_user(user).worker w_designated_services = worker.designated.all() if w_designated_services.exists(): return True return None
def deactivate_user(user): if is_trainee(user): # There might be other things we need to deactivate as well. Our other option here # is to, in all of these places, also filter on active=True. There's at least # one place already that doesn't do this, though. user.is_active = False user.team = None user.house = None user.save()
def get_object(self, queryset=None): ct = Term.current_term() if is_trainee(self.request.user): trainee = trainee_from_user(self.request.user) else: trainee = Trainee.objects.first() obj, created = SemiAnnual.objects.get_or_create(trainee=trainee, term=ct) return obj
def hc_surveys(user): ret = False if is_trainee(user): tr = trainee_from_user(user) if tr.has_group(['HC']) and tr.type != 'C': term = Term.current_term() admins = HCSurveyAdmin.objects.filter(open_survey=True).filter(term=term) if admins.exists(): ret = True return ret
def get_context_data(self, **kwargs): context = super(RostersAllTeamsView, self).get_context_data(**kwargs) gt = get_object_or_404(GospelTrip, pk=self.kwargs['pk']) all_destinations = Destination.objects.filter(gospel_trip=gt) if is_trainee(self.request.user) and all_destinations.filter(trainees=self.request.user).exists(): context['destination'] = all_destinations.get(trainees=self.request.user) context['page_title'] = context['destination'].name if self.request.user.has_group(['training_assistant']): context['trainees'] = self.get_trainee_dict(gt, all_destinations) context['page_title'] = "Rosters: All Teams" return context
def hc_surveys(user): ret = False if is_trainee(user) and trainee_from_user(user).house.gender not in [ 'C', None ]: term = Term.current_term() admins = HCSurveyAdmin.objects.filter(open_survey=True).filter( term=term) if admins.exists(): ret = True return ret
def get_announcements(request): notifications = [] if is_trainee(request.user): trainee = trainee_from_user(request.user) notifications = chain(discipline_announcements(trainee), server_announcements(trainee), bible_reading_announcements(trainee), request_statuses(trainee), attendance_announcements(trainee)) # sort on severity level of message return sorted(notifications, lambda a, b: b[0] - a[0])
def finalizeStatus(request): my_user = request.user if request.is_ajax(): action = request.POST['action'] week_id = request.POST['week_id'] forced = request.POST.get('forced', False) current_term = Term.current_term() term_id = current_term.id term_week_code = str(term_id) + "_" + str(week_id) now = datetime.date.today() lastDayofWeek = Term.enddate_of_week(current_term, int(week_id)) WedofNextWeek = lastDayofWeek + datetime.timedelta(days=3) # if not TA, cannot finalize till right time. if is_trainee(my_user): if forced: pass elif now >= WedofNextWeek or now < lastDayofWeek: return HttpResponse('Cannot finalize now', status=400) if is_TA(my_user): my_user = Trainee.objects.get(pk=request.POST['userId']) try: trainee_bible_reading = BibleReading.objects.get(trainee=my_user) except BibleReading.ObjectDoesNotExist: trainee_bible_reading = BibleReading( trainee=my_user, weekly_reading_status={term_week_code: EMPTY_WEEK_CODE_QUERY}, books_read={}) if term_week_code not in trainee_bible_reading.weekly_reading_status: trainee_bible_reading.weekly_reading_status[ term_week_code] = EMPTY_WEEK_CODE_QUERY trainee_weekly_reading = trainee_bible_reading.weekly_reading_status[ term_week_code] json_weekly_reading = json.loads(trainee_weekly_reading) if action == "finalize" and str( json_weekly_reading['finalized']) == FINALIZED_STR: return HttpResponse("Already finalized, so cannot finalize.", status=400) if action == "finalize": json_weekly_reading['finalized'] = FINALIZED_STR if action == "unfinalize": json_weekly_reading['finalized'] = UNFINALIZED_STR hstore_weekly_reading = json.dumps(json_weekly_reading) trainee_bible_reading.weekly_reading_status[ term_week_code] = hstore_weekly_reading trainee_bible_reading.save() return HttpResponse("Successfully saved")
def dispatch(self, request, *args, **kwargs): if request.method == 'GET' and not self.kwargs.get('pk', None): term = Term.current_term() if is_trainee(request.user): trainee = trainee_from_user(request.user) else: trainee = Trainee.objects.first() semi = SemiAnnual.objects.get_or_create(trainee=trainee, term=term)[0] return redirect(reverse('semi:attendance', kwargs={'pk': semi.pk})) return super(AttendanceUpdate, self).dispatch(request, *args, **kwargs)
def class_popup(request): context_attr = 'is_in_class' in_class = False user = request.user if hasattr(user, 'type') and is_trainee(user): trainee = trainee_from_user(user) events = trainee.immediate_upcoming_event(time_delta=0) if events: event = events[0] if event.type == 'C': in_class = True return {context_attr: in_class, 'user': user}
def exams_taken(request): user = request.user if not hasattr(user, 'type') or not is_trainee(user): return {'exams_taken': 0} sessions = Session.objects.filter(trainee=user, is_graded=True) exam_count = 0 for session in sessions: if session.exam == None: session.delete() elif session.exam.is_open: exam_count += 1 exams_taken = exam_count > 0 return {'exams_taken': exams_taken}
def teams_available(request): user = request.user if not hasattr(user, 'type') or not is_trainee(user): return {'teams_available': False} try: admin = next((gt for gt in GospelTrip.objects.order_by('-open_time') if gt.show_teams), None) if admin and Destination.objects.filter(gospel_trip=admin, trainees=user).exists(): return {'teams_available': True} else: return {'teams_available': False} except GospelTrip.DoesNotExist: return {'teams_available': False}
def interim_intentions_available(request): user = request.user if not hasattr(user, 'type') or not is_trainee(user): return {'interim_intentions_available': False} try: admin = InterimIntentionsAdmin.objects.get(term=Term.current_term()) if admin.open_time and admin.close_time: if datetime.now() >= admin.open_time and datetime.now( ) <= admin.close_time: return {'interim_intentions_available': True} except InterimIntentionsAdmin.DoesNotExist: pass return {'interim_intentions_available': False}
def exams_available(request): user = request.user if not hasattr(user, 'type') or not is_trainee(user): return {'exams_available': 0} exams = Exam.objects.filter(is_open=True) exam_count = 0 for exam in exams: if trainee_can_take_exam(user, exam): exam_count += 1 not_open_exams = Exam.objects.filter(is_open=False) for exam in not_open_exams: if makeup_available(exam, user): exam_count += 1 return {'exams_available': exam_count}
def gospel_trip_trainee(request, pk): gt = get_object_or_404(GospelTrip, pk=pk) context = {'page_title': gt.name} if is_trainee(request.user): trainee = trainee_from_user(request.user) else: context['preview_trainees'] = Trainee.objects.all() trainee = Trainee.objects.get(id=request.GET.get('trainee', Trainee.objects.first().id)) context['selected_trainee'] = trainee section_qs = Section.objects.filter(Q(gospel_trip=gt) & ~Q(show='HIDE')) question_qs = Question.objects.filter(Q(section__in=section_qs) & ~Q(answer_type="None")) answer_forms = [] if request.method == "POST": for q in question_qs: answer = Answer.objects.get_or_create(trainee=trainee, gospel_trip=gt, question=q)[0] answer_forms.append( AnswerForm(request.POST, prefix=q.id, instance=answer, gospel_trip__pk=pk) ) if all(f.is_valid() for f in answer_forms): for f in answer_forms: answer = f.save(commit=False) answer.gospel_trip = gt answer.trainee = trainee answer.question = Question.objects.get(id=f.prefix) answer.save() return HttpResponseRedirect(pk) else: context['answer_forms'] = answer_forms else: for q in question_qs: answer = Answer.objects.get_or_create(trainee=trainee, gospel_trip=gt, question=q)[0] answer_forms.append(AnswerForm(prefix=q.id, instance=answer, gospel_trip__pk=pk)) context['answer_forms'] = answer_forms context['section_qs'] = section_qs context['pk'] = gt.id context['AIRPORT_CODES'] = json.dumps(get_airport_codes()) context['AIRLINE_CODES'] = json.dumps(get_airline_codes()) return render(request, 'gospel_trips/gospel_trips.html', context=context)
def gospel_trips_available(request): user = request.user if not hasattr(user, 'type') or not is_trainee(user): return {'gospel_trips_available': False} # if user is trainee try: # sorts by latest open_time (most current), finds first gt that is open admin = next((gt for gt in GospelTrip.objects.order_by('-open_time') if gt.is_open), None) if admin: # is_open is True return {'gospel_trips_available': True} else: admin = next((gt for gt in GospelTrip.objects.order_by('-open_time') if gt.keep_open), None) if admin: # keep_open is True if user.id in admin.get_submitted_trainees(): return {'gospel_trips_available': True} return {'gospel_trips_available': False} except GospelTrip.DoesNotExist: return {'gospel_trips_available': False}
def is_week_finalized(user, week): finalized = True term = Term.current_term() try: if is_trainee(user): trainee = trainee_from_user(user) today = date.today() term_week_code = str(term.id) + "_" + str(week) try: trainee_weekly_reading = BibleReading.objects.get(trainee=trainee).weekly_reading_status[term_week_code] json_weekly_reading = json.loads(trainee_weekly_reading) except (BibleReading.DoesNotExist, KeyError): trainee_weekly_reading = "{\"status\": \"_______\", \"finalized\": \"N\"}" json_weekly_reading = json.loads(trainee_weekly_reading) try: if today > term.startdate_of_week(week) + timedelta(8): if str(json_weekly_reading['finalized']) == 'N': finalized = False except TypeError: pass except AttributeError: pass return finalized
def exams_available(request): user = request.user if not hasattr(user, 'type') or not is_trainee(user): return {'exams_available': 0} exams = Exam.objects.filter(is_open=True) exam_count = 0 for exam in exams: if trainee_can_take_exam(user, exam): exam_count += 1 not_open_exams = Exam.objects.filter(is_open=False) for exam in not_open_exams: if makeup_available(exam, user): exam_count += 1 sessions = Session.objects.filter(trainee=user, is_graded=True) for session in sessions: if session.exam == None: session.delete() elif session.exam.is_graded_open and not makeup_available( session.exam, user): exam_count += 1 return {'exams_available': exam_count}
def grad_forms(user): forms = [] if is_trainee(user): admin, created = GradAdmin.objects.get_or_create( term=Term.current_term()) models = [ Testimony, Consideration, Outline, Remembrance, Website, Misc ] for m in models: forms.append( m.objects.get_or_create(trainee=user, grad_admin=admin)[0]) xb_admin, created = XBAdmin.objects.get_or_create( term=Term.current_term()) forms.append( XBApplication.objects.get_or_create(trainee=user, xb_admin=xb_admin)[0]) forms = filter( lambda f: (user.current_term == 4 and f.show_status != 'NO'), forms) return forms
def home(request): user = request.user # Default for Daily Bible Reading current_term = Term.current_term() term_id = current_term.id try: # Do not set as user input. current_week = Term.current_term().term_week_of_date(date.today()) except ValueError: current_week = 19 term_week_code = str(term_id) + "_" + str(current_week) try: trainee_bible_reading = BibleReading.objects.get(trainee=user) except ObjectDoesNotExist: trainee_bible_reading = BibleReading( trainee=trainee_from_user(user), weekly_reading_status={term_week_code: EMPTY_WEEK_CODE_QUERY}, books_read={}) trainee_bible_reading.save() except MultipleObjectsReturned: return HttpResponse( 'Multiple bible reading records found for trainee!') weekly_status = EMPTY_WEEKLY_STATUS finalized_str = UNFINALIZED_STR if term_week_code in trainee_bible_reading.weekly_reading_status: weekly_reading = trainee_bible_reading.weekly_reading_status[ term_week_code] json_weekly_reading = json.loads(weekly_reading) weekly_status = str(json_weekly_reading['status']) finalized_str = str(json_weekly_reading['finalized']) data = { 'daily_nourishment': Portion.today(), 'user': user, 'isTrainee': is_trainee(user), 'trainee_info': BibleReading.weekly_statistics, 'current_week': current_week, 'weekly_status': weekly_status, 'weeks': Term.all_weeks_choices(), 'finalized': finalized_str, 'weekday_codes': json.dumps(WEEKDAY_CODES) } notifications = get_announcements(request) for notification in notifications: tag, content = notification messages.add_message(request, tag, content) data['popups'] = get_popups(request) if is_trainee(user): trainee = trainee_from_user(user) # Bible Reading progress bar trainee_bible_reading = BibleReading.objects.filter( trainee=trainee).first() if trainee_bible_reading is None: data['bible_reading_progress'] = 0 else: _, year_progress = BibleReading.calcBibleReadingProgress( trainee_bible_reading, user) data['bible_reading_progress'] = year_progress # condition for maintenance brothers elif is_TA(user) and user.has_group(['facility_maintenance' ]) and user.groups.all().count() == 1: data['house_requests'] = MaintenanceRequest.objects.all() data['request_status'] = MaintenanceRequest.STATUS return render(request, 'index.html', context=data)
def get(self, request, *args, **kwargs): if not is_trainee(self.request.user): return redirect('home') context = self.get_context_data() return super(AuditRollsView, self).render_to_response(context)
def get_popups(request): if not is_trainee(request.user): return [] trainee = trainee_from_user(request.user) announcements = Announcement.announcements_for_today(trainee, is_popup=True) return announcements
def get_context_data(self, **kwargs): ctx = super(AuditRollsView, self).get_context_data(**kwargs) ctx['current_url'] = resolve(self.request.path_info).url_name if is_trainee(self.request.user): ctx['user_gender'] = Trainee.objects.filter(id=self.request.user.id).values('gender')[0] ctx['current_period'] = Term.period_from_date(CURRENT_TERM, date.today()) if self.request.method == 'POST': val = self.request.POST.get('id')[10:] if self.request.POST.get('state') == 'true': Trainee.objects.filter(pk=val).update(self_attendance=True) elif self.request.POST.get('state') == 'false': Trainee.objects.filter(pk=val).update(self_attendance=False) audit_log = [] if self.request.method == 'GET': # filter for the selected gender trainees_secondyear = Trainee.objects.filter(current_term__gt=2) gen = self.request.GET.get('gender') if gen == "brothers": trainees_secondyear = trainees_secondyear.filter(gender='B') elif gen == "sisters": trainees_secondyear = trainees_secondyear.filter(gender='S') elif gen == "": trainees_secondyear = trainees_secondyear.none() # filter rolls for the selected period rolls_all = Roll.objects.none() for p in self.request.GET.getlist('period[]'): rolls_all = rolls_all | Roll.objects.filter(date__gte=Term.startdate_of_period(CURRENT_TERM, int(p)), date__lte=Term.enddate_of_period(CURRENT_TERM, int(p))) # audit trainees that are not attendance monitor # this treats an attendance monitor as a regular trainee, may need to reconsider for actual cases for t in trainees_secondyear.order_by('lastname'): mismatch = 0 AT_discrepancy = 0 details = [] rolls = rolls_all.filter(trainee=t) roll_trainee = rolls.filter(submitted_by=t) # rolls taken by trainee roll_am = rolls.filter(submitted_by__in=trainees_secondyear.filter(groups__name="attendance_monitors")) # rolls taken by attendance monitor for r in roll_am.order_by('date'): self_status = roll_trainee.filter(event=r.event, date=r.date).values('status') r_stat_trainee = 'P' if self_status: r_stat_trainee = self_status[0]['status'] # PM indicates that mismatch is only when trainee marks P and AM marks otherwise if r_stat_trainee == 'P' and r.status != 'P': mismatch += 1 details.append("MF %d/%d %s" % (r.date.month, r.date.day, r.event.code)) # PM indicates that AT discrepancy is only when AM marks A and trainee marks a type of T if r.status == 'A' and r_stat_trainee in set(['T', 'U', 'L']): AT_discrepancy += 1 details.append("AT %d/%d %s" % (r.date.month, r.date.day, r.event.code)) audit_log.append([t.gender, t.self_attendance, t, mismatch, AT_discrepancy, ", ".join(details)]) if self.request.GET.get('ask'): ctx['audit_log'] = audit_log ctx['title'] = 'Audit Rolls' return ctx
def get_context_data(self, **kwargs): context = super(AudioRequestUpdate, self).get_context_data(**kwargs) if is_trainee(self.request.user): if context['form'].instance.status in ['D', 'A']: context['read_only'] = True return context
def generate_menu(context): user = context['user'] if user.is_anonymous(): return "" menu = "" # The sidebar menu items, with their permissions and conditions required, should be input here attendance_menu = MenuItem( name='Attendance', ta_only=[ SubMenuItem(name='View Leave Slips', url='leaveslips:ta-leaveslip-list'), SubMenuItem(name='View Service Attendance', url='services:service_hours_ta_view'), SubMenuItem(name='View Trainee Attendance', url='attendance:attendance-submit'), ], trainee_only=[ SubMenuItem(name='Absent Trainee Roster', permission='absent_trainee_roster.add_roster', url='absent_trainee_roster:absent_trainee_form', condition=user.has_group( ['HC', 'absent_trainee_roster'])), SubMenuItem(name='Personal Attendance', url='attendance:attendance-submit', condition=True), SubMenuItem(name='Semi Annual Study Attendance', url='semi:attendance-base', condition=attendance_form_available()), SubMenuItem(name='Semi Annual Study Location', url='semi:location-base', condition=location_form_available()), SubMenuItem(name='Roll Entry Seating Chart', permission='attendance.add_roll', url='attendance:class-rolls', condition=user.has_group(['attendance_monitors'])), SubMenuItem(name='Audit', permission='attendance.add_roll', url='attendance:audit-rolls', condition=user.has_group(['attendance_monitors'])), SubMenuItem(name='Designated Service Hours', permission='services.add_designated_service_hours', url='services:designated_service_hours', condition=user.has_group(['designated_service'])), ], common=[ SubMenuItem(name='Roll Entry Table', permission='attendance.add_roll', url='attendance:house-rolls', condition=user.has_group( ['attendance_monitors', 'training_assistant'])), SubMenuItem(name='House Roll', permission='attendance.add_roll', url='attendance:house-rolls', condition=user.has_group(['HC'])), SubMenuItem(name='Team Roll', permission='attendance.add_roll', url='attendance:team-rolls', condition=user.has_group(['team_monitors'])), ]) discipline_menu = MenuItem( name='Discipline', common=[ SubMenuItem(name='Life Studies', url='lifestudies:discipline_list'), SubMenuItem(name='Class Notes', url='classnotes:classnotes_list') ]) exam_menu = MenuItem(name='Exams', ta_only=[ SubMenuItem(name='Create Exam', permission='exams.add_exam', url='exams:new', condition=user.has_group([ 'exam_graders', 'training_assistant' ])), SubMenuItem(name='Manage Exams', permission='exams.add_exam', url='exams:manage', condition=user.has_group([ 'exam_graders', 'training_assistant' ])), ], trainee_only=[ SubMenuItem(name="Take Exam", url='exams:list', condition=context['exams_available']), SubMenuItem(name="View Graded Exams", url='exams:taken', condition=context['exams_taken']), ]) requests_menu = MenuItem( name='Requests', ta_only=[ SubMenuItem(name='Room Reservation', url='room_reservations:ta-room-reservation-list'), SubMenuItem(name='Audio', url='audio:ta-audio-home'), ], trainee_only=[ SubMenuItem(name='Room Reservation', url='room_reservations:room-reservation-submit'), SubMenuItem(name='Audio', url='audio:audio-home'), ], common=[ SubMenuItem(name='Announcements', url='announcements:announcement-request-list'), SubMenuItem(name='Web Access', url='web_access:web_access-list'), SubMenuItem(name='Maintenance', url='house_requests:maintenance-list'), SubMenuItem(name='Linens', url='house_requests:linens-list', condition=user.has_group( ['training_assistant', 'HC', 'linens'])), SubMenuItem(name='Framing', url='house_requests:framing-list'), ]) misc_menu = MenuItem( name="Misc", common=[ SubMenuItem(name='Bible Reading Tracker', url='bible_tracker:index'), SubMenuItem(name='Class Files', url='classes:index'), ], ta_only=[ SubMenuItem(name='Daily Announcements', url='announcements:announcement-list'), SubMenuItem(name='Designated Services Trainees', url='services:designated_services_viewer'), SubMenuItem(name='Designated Services Hours', url='services:service_hours_ta_view'), # SubMenuItem(name='HC Forms Admin', url='hc:hc-admin'), # SubMenuItem(name='Manage Custom Forms', url='fobi.dashboard') ], trainee_only=[ SubMenuItem(name='View Read Announcements', url='announcements:announcements-read'), ], specific=[ SubMenuItem(name='Service Scheduling', permission='services.add_service', url='services:services_view', condition=user.has_group(['service_schedulers'])), SubMenuItem(name='Badges', permission='badges.add_badge', url='badges:badges_list', condition=user.has_group(['badges'])), SubMenuItem(name='Meal Seating', permission='meal_seating.add_table', url='meal_seating:new-seats', condition=user.has_group(['kitchen'])), SubMenuItem(name='Seating Chart', permission='seating.add_chart', url='seating:chart_list', condition=user.has_group(['attendance_monitors'])), SubMenuItem(name='Audio Upload', permission='audio.add_audiofile', url='audio:audio-upload', condition=user.has_group(['av'])), ]) hc_forms = [] if hc_surveys(user): hc_forms.append( SubMenuItem(name='HC Surveys', permission='hc.add_survey', url='hc:hc-survey', condition=user.has_group(['HC']))) if hc_recommendations(user): hc_forms.append( SubMenuItem(name='HC Recommendations', permission='hc.add_recommendation', url='hc:hc-recommendation', condition=user.has_group(['HC']))) HC_menu = MenuItem(name="HC", trainee_only=hc_forms, common=[]) grad_menu = MenuItem(name="Grad", specific=[ SubMenuItem(name='Grad Admin', permission='graduation.add_gradadmin', url='graduation:grad-admin', condition=user.has_group( ['training_assistant'])), ], trainee_only=[ SubMenuItem(name=f.menu_title(), url=f.get_absolute_url()) for f in grad_forms(user) ]) # For every 'current' item that needs to appear in the side-bar, ie exams to be taken, iterim intentions form, exit interview, etc, the context variable needs to be added to the context, and the menu item can be added here as follows current_menu = MenuItem( name='Current', trainee_only=[ SubMenuItem(name='Interim Intentions', url='interim:interim_intentions', condition=context['interim_intentions_available']), ] + [ SubMenuItem(name=pf.name, url='/forms/view/' + pf.slug) for pf in user_forms(user) ], ) user_menu = [ attendance_menu, discipline_menu, requests_menu, exam_menu, misc_menu, HC_menu, current_menu, grad_menu ] # check for usertype TA and only in one group, maintenance or kitchen if user.type == 'T' and user.has_group( ['facility_maintenance']) and user.groups.all().count() == 1: user_menu = [] for menu_item in user_menu: items = [] if menu_item.common: for sub_item in menu_item.common: if sub_item.condition: items += smart_add(sub_item.url, sub_item.name) if menu_item.ta_only: if is_TA(user): for sub_item in menu_item.ta_only: if sub_item.condition: items += smart_add(sub_item.url, sub_item.name) if menu_item.trainee_only: if is_trainee(user): for sub_item in menu_item.trainee_only: if sub_item.condition: items += smart_add(sub_item.url, sub_item.name) if menu_item.specific: for specific_perm_item in menu_item.specific: if specific_perm_item.condition: items += smart_add(specific_perm_item.url, specific_perm_item.name) if items: menu += """<li class="dropdown"> <span class="triangle-up"></span> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> {0} </a><ul class="dropdown-menu"><li class="spacer"></li>""".format( menu_item.name) for (path, name) in sorted(items, key=lambda i: i[1]): if name == '|': menu += "<li role=\"separator\" class=\"divider\"></li>" else: menu += "<li><a href=\"" + path + "\">" + name + "</a></li>" menu += "</ul>" return menu
def home(request): user = request.user trainee = trainee_from_user(user) worker = None # Set default values current_week = 19 weekly_status = EMPTY_WEEKLY_STATUS finalized_str = UNFINALIZED_STR designated_list = [] assigned_list = [] service_day = [] # Default for Daily Bible Reading current_term = Term.current_term() term_id = current_term.id if is_trainee(user): worker = Worker.objects.get(trainee=user) if request.GET.get('week_schedule'): current_week = request.GET.get('week_schedule') current_week = int(current_week) current_week = current_week if current_week < LAST_WEEK else LAST_WEEK current_week = current_week if current_week > FIRST_WEEK else FIRST_WEEK cws = WeekSchedule.get_or_create_week_schedule(trainee, current_week) else: # Do not set as user input. current_week = Term.current_term().term_week_of_date(date.today()) cws = WeekSchedule.get_or_create_week_schedule(trainee, current_week) # try: # # Do not set as user input. # current_week = Term.current_term().term_week_of_date(date.today()) # cws = WeekSchedule.get_or_create_week_schedule(trainee, current_week) # except ValueError: # cws = WeekSchedule.get_or_create_current_week_schedule(trainee) term_week_code = str(term_id) + "_" + str(current_week) try: trainee_bible_reading = BibleReading.objects.get(trainee=user) except ObjectDoesNotExist: trainee_bible_reading = BibleReading( trainee=trainee_from_user(user), weekly_reading_status={term_week_code: EMPTY_WEEK_CODE_QUERY}, books_read={}) trainee_bible_reading.save() except MultipleObjectsReturned: return HttpResponse('Multiple bible reading records found for trainee!') if term_week_code in trainee_bible_reading.weekly_reading_status: weekly_reading = trainee_bible_reading.weekly_reading_status[term_week_code] json_weekly_reading = json.loads(weekly_reading) weekly_status = str(json_weekly_reading['status']) finalized_str = str(json_weekly_reading['finalized']) worker_assignments = worker.assignments.filter(week_schedule=cws) designated_list = list(service.encode("utf-8") for service in worker_assignments.filter(service__category__name="Designated Services").values_list('service__name', flat=True)) assigned_list = list(service.encode("utf-8") for service in worker_assignments.exclude(service__category__name="Designated Services").values_list('service__name', flat=True)) service_day = list(worker_assignments.exclude(service__category__name="Designated Services").values_list('service__weekday', flat=True)) data = { 'daily_nourishment': Portion.today(), 'user': user, 'worker': worker, 'isTrainee': is_trainee(user), 'trainee_info': BibleReading.weekly_statistics, 'current_week': current_week, 'weekly_status': weekly_status, 'weeks': Term.all_weeks_choices(), 'finalized': finalized_str, 'weekday_codes': json.dumps(WEEKDAY_CODES), 'service_day': json.dumps(service_day), 'assigned_list': json.dumps(assigned_list), 'designated_list': json.dumps(designated_list), } notifications = get_announcements(request) for notification in notifications: tag, content = notification messages.add_message(request, tag, content) data['popups'] = get_popups(request) if is_trainee(user): trainee = trainee_from_user(user) # Bible Reading progress bar trainee_bible_reading = BibleReading.objects.filter(trainee=trainee).first() if trainee_bible_reading is None: data['bible_reading_progress'] = 0 else: _, year_progress = BibleReading.calcBibleReadingProgress(trainee_bible_reading, user) data['bible_reading_progress'] = year_progress # condition for maintenance brothers elif is_TA(user) and user.has_group(['facility_maintenance']) and user.groups.all().count() == 1: data['house_requests'] = MaintenanceRequest.objects.all() data['request_status'] = MaintenanceRequest.STATUS return render(request, 'index.html', context=data)