Beispiel #1
0
    def save(self, commit=True):
        designated_service_cleaned = self.cleaned_data['designated_service']
        workers_cleaned = self.cleaned_data['workers']
        groups_cleaned = self.cleaned_data['groups']

        # add to worke group, designated services should have only one worker group
        workergroup = designated_service_cleaned.worker_groups.all().first()
        workergroup.workers.add(*list(workers_cleaned))

        # add service to workers
        for w in workers_cleaned:
            w.designated.add(designated_service_cleaned)

        for group in groups_cleaned:
            group.user_set.add(
                *list(Trainee.objects.filter(worker__in=workers_cleaned)))

        # populating the designated hours for newly added trainees so that the force page doesn't show.
        current_term = Term.current_term()
        week_range = range(0, current_term.term_week_of_date(date.today()))
        for worker in workers_cleaned:
            services = worker.designated.all()
            for service in services:
                for week in week_range:
                    service_attendance = ServiceAttendance.objects.get_or_create(
                        designated_service=service,
                        worker=worker,
                        term=current_term,
                        week=week)[0]
                    service_attendance.excused = True
                    service_attendance.save()
Beispiel #2
0
  def post(self, request, *args, **kwargs):
    """'approve' when an approve button is pressed 'delete' when a delete
    button is pressed 'attend_assign' when assgning discipline from
    AttendanceAssign"""

    if 'approve' in request.POST:
      for value in request.POST.getlist('selection'):
        Discipline.objects.get(pk=value).approve_all_summary()
      messages.success(request, "Checked Discipline(s) Approved!")
    if 'delete' in request.POST:
      for value in request.POST.getlist('selection'):
        Discipline.objects.get(pk=value).delete()
      messages.success(request, "Checked Discipline(s) Deleted!")
    if 'trainee_pk' in request.POST:
      trainee_pk = request.POST.getlist('trainee_pk')
      ls_count = request.POST.getlist('ls_count')
      period = int(request.POST.get('period'))
      for idx, pk in enumerate(trainee_pk):
        discipline = Discipline(
          infraction='AT',
          quantity=ls_count[idx],
          due=Period(Term.current_term()).start(period + 1) + timedelta(weeks=1),  # Due on the second Monday of the next period
          offense='MO',
          trainee=Trainee.objects.get(pk=pk))
        try:
          discipline.save()
        except IntegrityError:
          logger.error('Abort trasanction error')
          transaction.rollback()
      messages.success(request, "Discipline Assigned According to Attendance!")
    return self.get(request, *args, **kwargs)
Beispiel #3
0
    def get_context_data(self, **kwargs):
        ctx = super(InterimIntentionsCalendarView,
                    self).get_context_data(**kwargs)
        term = Term.current_term()

        interim_start = term.end + timedelta(days=1)
        if not InterimIntentionsAdmin.objects.get(
                term=term
        ).date_1yr_return or not InterimIntentionsAdmin.objects.get(
                term=term).date_2yr_return:
            interim_end = interim_start + timedelta(days=1)
            ctx['subtitle'] = "Please enter the return dates for next term."
        else:
            date_1 = InterimIntentionsAdmin.objects.get(
                term=term).date_1yr_return
            date_2 = InterimIntentionsAdmin.objects.get(
                term=term).date_2yr_return
            interim_end = date_2.date() if (
                date_2 >= date_1) else date_1.date()

        ctx['interim_length'] = (interim_end - interim_start).days + 1
        ctx['date_list'] = [
            interim_start + timedelta(days=x)
            for x in range(0, ctx['interim_length'])
        ]

        ctx['trainees'] = Trainee.objects.values('firstname', 'lastname', 'id')

        for t in ctx['trainees']:
            t['name'] = unicode(t['firstname'] + ' ' + t['lastname'])
            t['intention'] = InterimIntentions.objects.filter(
                trainee__id=t['id'], admin__term=term).first()

        ctx['page_title'] = 'Interim Calendar Report'
        return ctx
Beispiel #4
0
class RollsJSON(BaseDatatableView):
    model = Roll
    fields = [
        'id', 'trainee', 'event', 'event.id', 'date', 'status', 'finalized',
        'submitted_by'
    ]
    columns = fields
    order_columns = fields
    max_display_length = 200
    term = Term.current_term()

    def filter_queryset(self, qs):
        qs = qs.filter(date__gte=self.term.start, date__lte=self.term.end)
        search = self.request.GET.get(u'search[value]', None)
        qs_params = Q()
        ret = qs.none()
        if search:
            for exp in search.split():
                try:
                    q = Q(trainee__firstname__icontains=exp) | Q(trainee__lastname__icontains=exp) | Q(id__icontains=exp) | \
                        Q(event__id__icontains=exp) | Q(event__name__icontains=exp) | Q(date__icontains=exp) | Q(status__icontains=exp)
                    qs_params = qs_params & q if q else qs_params

                except ValueError:
                    continue

            ret = ret | qs.filter(qs_params).distinct()
            return ret
        else:
            return qs
Beispiel #5
0
    def create(self, validated_data):
        if validated_data.get("id"):
            #this is pretty naive and inefficient, needs to be optimized later
            chart = Chart.objects.get(pk=validated_data.get("id"))
            seats = Seat.objects.filter(chart=chart).delete()

            chart.width = validated_data.get("width")
            chart.height = validated_data.get("height")
            chart.name = validated_data.get("name")
            chart.save()

            seats = validated_data.pop('trainees')
            print seats
            for y in range(0, validated_data.get('height')):
                for x in range(0, validated_data.get('width')):
                    if seats[y][x] != {} and seats[y][x].get('pk') != '':
                        trainee = Trainee.objects.get(pk=seats[y][x]['pk'])
                        s = Seat(trainee=trainee, chart=chart, x=x, y=y)
                        s.save()

            return chart
        seats = validated_data.pop('trainees')
        print seats
        validated_data['term'] = Term.current_term()
        new_chart = Chart.objects.create(**validated_data)
        for y in range(0, validated_data.get('height')):
            for x in range(0, validated_data.get('width')):
                if seats[y][x] != {} and seats[y][x].get('pk') != '':
                    trainee = Trainee.objects.get(pk=seats[y][x]['pk'])
                    s = Seat(trainee=trainee, chart=new_chart, x=x, y=y)
                    s.save()

        return new_chart
Beispiel #6
0
class GroupSlipsJSON(BaseDatatableView):
    model = GroupSlip
    columns = [
        'id', 'trainee', 'submitted', 'trainees', 'description', 'status',
        'service_assignment', 'start', 'end'
    ]
    order_columns = [
        'id', 'trainee', 'submitted', '', 'description', 'status',
        'service_assignment', 'start', 'end'
    ]
    max_display_length = 200
    which_url = 'get_admin_url'
    term = Term.current_term()

    def filter_queryset(self, qs):
        qs = qs.filter(start__gte=self.term.start, end__lte=self.term.end)
        search = self.request.GET.get(u'search[value]', None)
        qs_params = Q()
        ret = qs.none()
        if search:
            for exp in search.split():
                try:
                    q = Q(id__icontains=exp) | Q(
                        service_assignment__service__name__icontains=exp)
                    qs_params = qs_params & q if q else qs_params

                except ValueError:
                    continue

            ret = ret | qs.filter(qs_params).distinct()
            return ret
        else:
            return qs
Beispiel #7
0
def import_csvfile(file_path):
    # sanity check
    localities, teams, residences = check_csvfile(file_path)
    if localities or teams or residences:
        return False

    log.info("Beginning CSV File Import")

    # TODO(import2): Remove this
    # count = 0;
    with open(file_path, 'r') as f:
        reader = csv.DictReader(f)
        for row in reader:
            # count = count + 1
            # if count > 10:
            #     return
            import_row(row)
    term = Term.current_term()
    schedules = Schedule.objects.filter(term=term)

    # TODO(import2) -- this needs to be smarter eventually
    for schedule in schedules:
        schedule.assign_trainees_to_schedule()

    log.info("Import complete")
    return True
Beispiel #8
0
    def get_object(self, queryset=None):
        term = Term.current_term()
        worker = trainee_from_user(self.request.user).worker
        self.designated_assignments = worker.assignments.all().filter(
            service__designated=True).exclude(
                service__name__icontains="Breakfast")
        try:
            self.week = self.kwargs['week']
        except KeyError:
            self.week = term.term_week_of_date(datetime.now().date())

        # get service
        try:
            self.service_id = self.kwargs['service_id']
        except KeyError:
            self.service_id = self.designated_assignments[0].service.id

        self.service = Service.objects.get(id=self.service_id)

        # get the existing object or created a new one
        service_attendance = ServiceAttendance.objects.get_or_create(
            worker=worker,
            term=term,
            week=self.week,
            designated_service=self.service)[0]
        return service_attendance
Beispiel #9
0
    def weighted_service_frequency(self):
        # cache results
        if not hasattr(self, '_service_freq'):
            # dictionary format is {category: {day: week count, day: week count}, category: {day: week count}}
            # keeps track of how often a worker got assigned to a service on a specific day
            self._services_freq = {}

            current_term = Term.current_term()
            for a in self.assignments.all():
                if a.week_schedule.start >= current_term.start:
                    day = a.service.weekday
                    if a.service.category in self._services_freq:
                        if day in self._services_freq[a.service.category]:
                            # weeks are added so assignments for more recent weeks will have larger weights
                            self._services_freq[a.service.category][
                                day] += a.week_schedule.week
                        else:
                            self._services_freq[
                                a.service.category][day] = a.week_schedule.week
                    else:
                        self._services_freq[a.service.category] = {
                            day: a.week_schedule.week
                        }

        return self._services_freq
Beispiel #10
0
class LeaveSlipsJSON(BaseDatatableView):
    model = IndividualSlip
    fields = ['id', 'trainee', 'rolls', 'status', 'TA', 'type']
    columns = fields
    order_columns = fields
    max_display_length = 200
    which_url = 'get_admin_url'
    term = Term.current_term()

    def filter_queryset(self, qs):
        qs = qs.filter(rolls__date__gte=self.term.start,
                       rolls__date__lte=self.term.end)
        search = self.request.GET.get(u'search[value]', None)
        qs_params = Q()
        ret = qs.none()
        if search:
            for exp in search.split():
                try:
                    q = Q(trainee__firstname__icontains=exp) | Q(trainee__lastname__icontains=exp) | Q(id__icontains=exp) | \
                        Q(type__icontains=exp) | Q(rolls__event__name__icontains=exp) | Q(rolls__event__id__icontains=exp) | Q(rolls__id__icontains=exp)
                    qs_params = qs_params & q if q else qs_params

                except ValueError:
                    continue

            ret = ret | qs.filter(qs_params).distinct()
            return ret
        else:
            return qs
 def _send_emails(self):
     # Only send email during the term
     today = date.today()
     if Term.current_term().is_date_within_term(today):
         send_absentee_report(today.year, today.month, today.day)
         print 'Cron job emails sent!'
     else:
         print 'Absentee report not sent because term not currently in session'
Beispiel #12
0
 def form_valid(self, form):
     term = Term.current_term()
     index = len(HCSurveyAdmin.objects.filter(term=term)) + 1
     hcsa = form.save(commit=False)
     hcsa.term = term
     hcsa.index = index
     hcsa.save()
     return super(HCSurveyAdminCreate, self).form_valid(form)
Beispiel #13
0
 def filter_list(self, week, trainee):
     term = Term.current_term()
     # return pre-training recordings
     if week == 0:
         return filter(lambda f: f.code == 'PT', self.filter_term(term))
     # also filters year: if not a class with a Y1/Y2 designation or if the class year matches trainee's year, add file to files list
     return filter(lambda f: f.week == week and f.can_trainee_view(trainee),
                   self.filter_term(term))
Beispiel #14
0
 def form_valid(self, form):
     term = Term.current_term()
     index = len(HCSurveyAdmin.objects.filter(term=term)) + 1
     hcsa = form.save(commit=False)
     hcsa.term = term
     hcsa.index = index
     hcsa.save()
     return HttpResponseRedirect(self.success_url)
Beispiel #15
0
 def form_valid(self, form):
     hc_recommendation = form.save(commit=False)
     hc_recommendation.survey_admin = self.admin_model.objects.get_or_create(
         term=Term.current_term())[0]
     hc_recommendation.hc = self.request.user
     hc_recommendation.house = self.request.user.house
     hc_recommendation.save()
     return super(HCRecommendationCreate, self).form_valid(form)
Beispiel #16
0
def mid_term():
    """ Returns true if we are still in the current term or if the current term hasn't yet
    started yet """
    term = Term.current_term()
    if term:
        return term.currently_in_term()
    else:
        return False
Beispiel #17
0
def badgeprintout(request):
    return render(
        request, 'badges/print.html', {
            'object_list':
            Badge.objects.filter(
                Q(term_created__exact=Term.current_term())
                & Q(deactivated__exact=False))
        })
Beispiel #18
0
 def get_context_data(self, **kwargs):
     context = super(HCRecommendationTAView,
                     self).get_context_data(**kwargs)
     hcra = HCRecommendationAdmin.objects.filter(term=Term.current_term())
     context['hc_recommendations'] = HCRecommendation.objects.filter(
         survey_admin=hcra)
     context['page_title'] = "HC Recommendations Report"
     return context
Beispiel #19
0
 def xb_form_valid(self, data):
   term = Term.current_term()
   print term
   xb, created = XBAdmin.objects.get_or_create(term=term)
   print xb
   form = XBAdminForm(data, instance=xb)
   print form
   form.save()
Beispiel #20
0
 def get_context_data(self, **kwargs):
   context = super(DisciplineListView, self).get_context_data(**kwargs)
   try:
     context['current_period'] = Period(Term.current_term()).period_of_date(datetime.now().date())
   except ValueError:
     # ValueError thrown if current date is not in term (interim)
     # return last period of previous period
     context['current_period'] = Period.last_period()
   return context
Beispiel #21
0
 def get_queryset(self):
   try:
     week = int(self.request.GET.get('week', ''))
     day = int(self.request.GET.get('weekday', ''))
     date = Term.current_term().get_date(week, day)
     return Event.objects.filter(chart__isnull=False).filter(Q(weekday=day, day__isnull=True) | Q(day=date))
   except ValueError as e:
     print '%s (%s)' % (e.message, type(e))
     return Event.objects.all()
Beispiel #22
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
Beispiel #23
0
 def __init__(self, *args, **kwargs):
   super(BaseScheduleForm, self).__init__(*args, **kwargs)
   self.fields['trainees'].widget.attrs['class'] = 'select-fk'
   self.fields['parent_schedule'].widget.attrs['class'] = 'select-fk'
   self.fields['term'].widget.attrs['class'] = 'select-fk'
   self.fields['term'].initial = Term.current_term()
   self.fields['season'].initial = 'All'
   self.fields['trainee_select'].initial = 'MA'
   self.fields['query_filter'].widget.attrs['class'] = 'select-fk'
Beispiel #24
0
 def get_context_data(self, **kwargs):
     context = super(TAAudioHome, self).get_context_data(**kwargs)
     audio_requests = AudioRequest.objects.none()
     reqs = AudioRequest.objects.filter_term(
         Term.current_term()).order_by('date_requested')
     for status in ['P', 'F', 'A', 'D']:
         audio_requests = chain(audio_requests, reqs.filter(status=status))
     context['audio_requests'] = audio_requests
     return context
Beispiel #25
0
 def get_context_data(self, **kwargs):
     ctx = super(HCSurveyAdminUpdate, self).get_context_data(**kwargs)
     ctx['hc_admins'] = HCSurveyAdmin.objects.filter(
         term=Term.current_term()).order_by('-index')
     ctx['update'] = True
     ctx['hcsa_form'] = ctx['form']
     ctx['page_title'] = 'Update HC Survey'
     ctx['button_label1'] = 'Update'
     return ctx
Beispiel #26
0
def assign_classnotes(week=None):
  term = Term.current_term()
  start = term.start
  end = term.end
  if week is not None:
    end = term.enddate_of_week(week)
  for trainee in Trainee.objects.all().iterator():
    update_classnotes_list(trainee)
    assign_individual_classnotes(trainee, start, end)
 def get_or_create_week_schedule(scheduler, week_number):
     ct = Term.current_term()
     # service week starts on Tuesdays rather than Mondays
     start = ct.get_date(int(week_number), 1)
     if WeekSchedule.objects.filter(start=start).exists():
         week_schedule = WeekSchedule.objects.get(start=start)
     else:
         week_schedule = WeekSchedule(start=start, scheduler=scheduler)
         week_schedule.save()
     return week_schedule
Beispiel #28
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
def attendance_announcements(trainee):
  today = datetime.date.today()
  term = Term.current_term()
  week = term.term_week_of_date(today)
  if trainee.self_attendance:
    weeks = map(str, filter(lambda w: not term.is_attendance_finalized(w, trainee), range(week)))
  else:
    weeks = []
  message = 'You have not finalized your attendance for week {week}. Fellowship with a TA to finalize it.'
  return [(messages.WARNING, message.format(week=', '.join(weeks)))] if weeks else []
Beispiel #30
0
 def weighted_service_frequency(self):
     # cache results
     if not hasattr(self, '_service_freq'):
         self._services_freq = Counter()
         current_term = Term.current_term()
         for a in self.assignments.all():
             if a.week_schedule.start >= current_term.start:
                 self._services_freq[
                     a.service.category] += a.week_schedule.week / 10.0
     return self._services_freq
    def handle(self, *args, **options):
        verbose = int(options['verbosity']) > 1
        if options['all']:
            for term in Term.objects.all():
                self.fetch_courses(term, verbose=verbose)
            return

        term = Term.current_term()
        if options['year'] is not None and options['semester'] is not None:
            term = Term.objects.get(year=options['year'],
                                    semester=options['semester'])

        self.fetch_courses(term, verbose=verbose)