Esempio n. 1
0
def gbt_schedule(request, *args, **kws):
    """
    Serves up a GBT schedule page tailored for Operations.

    Note: This view is in either ET or UTC, database is in UTC.
    """
    def cleanSD(startDate):
        try:
            return datetime.strptime(startDate, '%m/%d/%Y') if startDate else datetime.now() 
        except: # Bad input?
            return datetime.now()

    timezones = ['ET', 'UTC']

    # Note: we probably should have better error handling here,
    # but since the forms are Date Pickers and drop downs, it seems
    # difficult for the user to send us malformed params.

    # Default date, days, and timezone.  Loaded from the values
    # saved below, or from defaults if no values were saved.
    if request.method == 'POST':
        startDate, days, timezone = (None, 5, 'ET')
    else:
        startDate, days, timezone, _ = _get_calendar_defaults(request)
    data      = request.POST if request.method == 'POST' else request.GET
    timezone  = data.get('tz', timezone)
    days      = int(data.get('days', days))
    startDate = cleanSD(data.get('start', startDate))

    start   = TimeAgent.truncateDt(startDate)
    end     = start + timedelta(days = days)

    # save these values for use in 'GET' above.
    _save_calendar_defaults(request, start, days, timezone)
    requestor = get_requestor(request)
    supervisor_mode = True if (requestor in get_rescal_supervisors()) else False

    schedule = get_gbt_schedule_events(start, end, timezone)

    try:
        tzutc = Schedule_Notification.objects.latest('date').date.replace(tzinfo=UTC)
        pubdate = tzutc.astimezone(EST)
    except:
        pubdate = None

    printerFriendly = data.get('printerFriendly', None)
    template = 'users/schedules/schedule_friendly.html' if printerFriendly == '1' \
                   else 'users/schedule.html'
    return render_to_response(
        template,
        {'calendar'        : schedule,
         'day_list'        : range(1, 32),
         'tz_list'         : timezones,
         'timezone'        : timezone,
         'today'           : datetime.now(EST),
         'start'           : start,
         'startFmt'        : start.strftime('%m/%d/%Y'), 
         'days'            : days,
         'rschedule'       : Receiver_Schedule.extract_schedule(start, days),
         'requestor'       : requestor,
         'supervisor_mode' : supervisor_mode,
         'pubdate'         : pubdate,
         })
Esempio n. 2
0
def add_activity(request, group_id = None, year = None,
                 month = None, day = None):

    u = get_requestor(request)
    supervisors = get_rescal_supervisors()
    user = _get_user_name(u)
    supervisor_mode = True if (u in supervisors) else False

    if request.method == 'POST':
        form = RCAddActivityForm(request.POST)

        if form.is_valid():
            # process the returned stuff here...
            ma = Maintenance_Activity()

            if group_id:
                ma.group = Maintenance_Activity_Group.objects.get(id = group_id)

            ma.save() # needs to have a primary key for many-to-many
                      # relationships to be set.
            _process_activity(request, ma, form)
            view_url = "http://%s/resourcecal_display_activity/%s/" % (request.get_host(), ma.id)
            rc_notifier.notify(supervisors, "new", ma.get_start("ET").date(), view_url)

            if request.POST['ActionEvent'] =="Submit And Continue":
                if form.cleaned_data['entity_id']:
                    redirect_url = '/resourcecal_add_activity/%s/' % \
                        (form.cleaned_data['entity_id'])
                elif year and month and day:
                    redirect_url = '/resourcecal_add_activity/%s/%s/%s/' % \
                        (year, month, day)
                else:
                    redirect_url = '/resourcecal_add_activity/'

                return HttpResponseRedirect(redirect_url)
            else:
                return HttpResponseRedirect('/schedule/')
    else:
        default_telescope = Maintenance_Telescope_Resources.objects \
            .filter(rc_code = 'N')[0]
        default_software  = Maintenance_Software_Resources.objects \
            .filter(rc_code = 'N')[0]

        if group_id:
            g = Maintenance_Activity_Group.objects.get(id = group_id)
            start = TimeAgent.utc2est(g.get_start())
        elif year and month and day:
            start = datetime(int(year), int(month), int(day))

        initial_data = {'date'              : start.date(),
                        'time_hr'           : start.hour,
                        'time_min'          : start.minute,
                        'end_choice'        : "end_time",
                        'end_time_hr'       : start.hour + 1,
                        'end_time_min'      : 0,
                        'responsible'       : user,
                        'telescope'         : default_telescope.id,
                        'software'          : default_software.id,
                        'entity_id'         : group_id,
                        'recurrency_until'  : start + timedelta(days = 30),
                        }

        form = RCAddActivityForm(initial = initial_data)

    return render_to_response('users/rc_add_activity_form.html',
                              {'form': form,
                               'supervisor_mode': supervisor_mode,
                               'add_activity': True })
Esempio n. 3
0
def edit_activity(request, activity_id = None):

    if request.method == 'POST':
        form = RCAddActivityForm(request.POST)

        if form.is_valid():
            # process the returned stuff here...
            ma = Maintenance_Activity.objects \
                .filter(id = form.cleaned_data["entity_id"])[0]
            approved = ma.approved  # save approval status; _process_activity will clear this.
            diffs = _process_activity(request, ma, form)

            if approved: # Notify supervisor if approved activity is modified
                supervisors = get_rescal_supervisors()
                view_url = "http://%s/resourcecal_display_activity/%s/" % (request.get_host(), ma.id)
                rc_notifier.notify(supervisors,
                                   "modified",
                                   ma.get_start("ET").date(),
                                   view_url,
                                   changes = diffs)

            return HttpResponseRedirect('/schedule/')
    else:
        u = get_requestor(request)
        supervisors = get_rescal_supervisors()
        supervisor_mode = True if (u in supervisors) else False

        if request.GET['ActionEvent'] == 'Modify':
            ma = Maintenance_Activity.objects.filter(id = activity_id)[0]
            form = _modify_activity_form(ma)

        elif request.GET['ActionEvent'] == 'ModifyFuture':
            # In this case we want to go back to the template, and set
            # its 'future_template' to this one.
            ma = Maintenance_Activity.objects.filter(id = activity_id)[0]
            ma.set_as_new_template()
            form = _modify_activity_form(ma)

        elif request.GET['ActionEvent'] == 'ModifyAll':
            today = TimeAgent.truncateDt(datetime.now())
            ma = Maintenance_Activity.objects.filter(id = activity_id)[0]
            start_ma = Maintenance_Activity.objects\
                       .filter(repeat_template = ma.repeat_template)\
                       .filter(_start__gte = today)\
                       .order_by('_start')[0]
            start_ma.set_as_new_template()
            form = _modify_activity_form(start_ma)

        elif request.GET['ActionEvent'] == 'Delete':
            ma = Maintenance_Activity.objects.filter(id = activity_id)[0]
            ma.deleted = True
            ma.save()
            creator = _get_ma_creator(ma)

            if creator:
                recipients = supervisors + [creator]
            else:
                recipients = supervisors

            view_url = "http://%s/resourcecal_display_activity/%s/" % (request.get_host(), ma.id)
            rc_notifier.notify(recipients,
                               "deleted",
                               ma.get_start("ET").date(),
                               view_url)

            return HttpResponseRedirect('/schedule/')

        elif request.GET['ActionEvent'] == 'DeleteFuture':
            ma = Maintenance_Activity.objects.filter(id = activity_id)[0]
            ma.repeat_template.repeat_end = ma.get_start('ET').date()
            ma.repeat_template.save()
            mas = Maintenance_Activity.objects\
                  .filter(_start__gte = TimeAgent.truncateDt(ma.get_start()))\
                  .filter(repeat_template = ma.repeat_template)

            for i in mas:
                i.deleted = True
                i.save()

            return HttpResponseRedirect('/schedule/')

        elif request.GET['ActionEvent'] == 'DeleteAll':
            ma = Maintenance_Activity.objects.filter(id = activity_id)[0]
            ma.repeat_template.deleted = True
            ma.repeat_template.save()
            mas = Maintenance_Activity.objects \
                .filter(repeat_template = ma.repeat_template)

            for i in mas:
                i.deleted = True
                i.save()

            return HttpResponseRedirect('/schedule/')

        elif request.GET['ActionEvent'] == 'Approve':
            ma = Maintenance_Activity.objects.filter(id = activity_id)[0]
            u = get_requestor(request)
            user = _get_user_name(u)
            ma.add_approval(user)
            ma.save()

            # Record any receiver changes in the receiver schedule table.
            for i in ma.get_receiver_changes():
                start = ma.get_start()
                rsched = datetime(start.year, start.month, start.day, 16)
                Receiver_Schedule.change_schedule(rsched, [i.up_receiver],
                                                  [i.down_receiver])
            creator = _get_ma_creator(ma)

            if creator:
                view_url = "http://%s/resourcecal_display_activity/%s/" % \
                    (request.get_host(), ma.id)
                rc_notifier.notify(creator,
                                   "approved",
                                   ma.get_start("ET").date(),
                                   view_url)

            return HttpResponseRedirect('/schedule/')

        elif request.GET['ActionEvent'] == 'Move':
            rank = request.GET['Rank']
            ma = Maintenance_Activity.objects.get(id = activity_id)
            u = get_requestor(request)
            user = _get_user_name(u)
            d = request.GET['Destination'].split('-')
            date = datetime(int(d[0]), int(d[1]), int(d[2]))
            group = _get_maintenance_activity_group_by_date(date, rank)

            if group:
                ma.group = group          # assuming here 1 maintenance period
                ma.approved = False       # per day.  UI does not support more
                ma.add_modification(user) # than this.
                ma.save()

            return HttpResponseRedirect('/schedule/')

        elif request.GET['ActionEvent'] == 'Copy':
            rank = request.GET['Rank']
            ma = Maintenance_Activity.objects.get(id = activity_id)
            u = get_requestor(request)
            user = _get_user_name(u)
            d = request.GET['Destination'].split('-')
            date = datetime(int(d[0]), int(d[1]), int(d[2]))
            group = _get_maintenance_activity_group_by_date(date, rank)

            if group:
                new_ma = ma.clone(group)
                new_ma.add_modification(user)
                new_ma.save()

            return HttpResponseRedirect('/schedule/')

    return render_to_response('users/rc_add_activity_form.html',
                              {'form': form,
                               'supervisor_mode': supervisor_mode,
                               'add_activity' : False })
Esempio n. 4
0
def display_maintenance_activity(request, activity_id = None):
    if activity_id:
        ma = Maintenance_Activity.objects.filter(id = activity_id)[0]
        start = ma.get_start('ET')
        duration = timedelta(hours = ma.duration)
        end = start + duration
        u = get_requestor(request)
        supervisors = get_rescal_supervisors()

        if ma.is_repeat_activity():
            repeat_interval = interval_names[ma.repeat_template.repeat_interval]
            repeat_end = ma.repeat_template.repeat_end
            repeat_template = ma.repeat_template.id
        else:
            repeat_interval = "None"
            repeat_end = "None"
            repeat_template = "None"

        last_modified = str(ma.modifications.all()
                            [ma.modifications.count() - 1]
                            if ma.modifications.all() else "")
        created = str(ma.modifications.all()[0]
                      if ma.modifications.all() else ""),
        supervisor_mode = True if (u  in supervisors) else False
        copymove_groups = _get_future_maintenance_dates3()
        copymove_dates = copymove_groups.keys()
        
        params = {'subject'            : ma.subject,
                  'date'               : start.date(),
                  'time'               : start.time(),
                  'end_choice'         : "end_time",
                  'end_time'           : end.time(),
                  'responsible'        : ma.contacts,
                  'location'           : ma.location,
                  'telescope'          : ma.telescope_resource.resource,
                  'software'           : ma.software_resource.resource,
                  'other_resources'    : ", ".join([o.full_description()
                                                    for o in ma.other_resources.all()]),
                  'receivers'          : ", ".join([r.full_description()
                                                    for r in ma.receivers.all()]),
                  'backends'           : ", ".join([b.full_description()
                                                    for b in ma.backends.all()]),
                  'description'        : ma.description,
                  'activity_id'        : activity_id,
                  'approval'           : 'Yes' if ma.approved else 'No',
                  'last_modified'      : last_modified,
                  'created'            : created,
                  'receiver_swap'      : ma.receiver_changes.all(),
                  'supervisor_mode'    : supervisor_mode,
                  'maintenance_group'  : ma.group_id,
                  'repeat_activity'    : ma.is_repeat_activity(),
                  'repeat_interval'    : repeat_interval,
                  'repeat_end'         : repeat_end,
                  'repeat_template'    : repeat_template,
                  'copymove_dates'     : copymove_dates,
                  'copymove_groups'    : copymove_groups
                 }
    else:
        params = {}

    return render_to_response('users/rc_display_activity.html', params)