Exemple #1
0
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
Exemple #2
0
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()
Exemple #3
0
 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
Exemple #4
0
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
Exemple #5
0
 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
Exemple #6
0
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])
Exemple #8
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")
Exemple #9
0
 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}
Exemple #15
0
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}
Exemple #17
0
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}
Exemple #19
0
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
Exemple #20
0
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)
Exemple #21
0
    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
Exemple #23
0
  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
Exemple #24
0
 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
Exemple #25
0
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
Exemple #26
0
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)