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, })
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 })
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 })
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)