diff options
Diffstat (limited to 'myadmin/views.py.save')
-rw-r--r-- | myadmin/views.py.save | 431 |
1 files changed, 431 insertions, 0 deletions
diff --git a/myadmin/views.py.save b/myadmin/views.py.save new file mode 100644 index 0000000..b11ea54 --- /dev/null +++ b/myadmin/views.py.save @@ -0,0 +1,431 @@ +from django.shortcuts import render, redirect +from django.http import Http404, HttpResponse +from django.contrib.auth.decorators import login_required +from django.views.decorators.csrf import csrf_exempt +from django.db.models import Count +from django.db import connection +from django.core.exceptions import ObjectDoesNotExist +from sbhs_server.tables.models import Board, Booking, Slot, Experiment, Account, Webcam +from sbhs_server import settings, sbhs +# from sbhs_server import switch_on, switch_off +import class_based_automated_slot_booking +import subprocess, json, serial, os, datetime, requests, zipfile +import sys, inspect +import time +# Create your views here. +from time import gmtime, strftime +import random +import MySQLdb +import datetime + +from sbhs_server import credentials as credentials + +currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) +parentdir = os.path.dirname(currentdir) +sys.path.insert(0,parentdir) + +import switch_onn, switch_off#, check_future_slots +# ser.close() +ser = serial.Serial('/dev/ttyACM0') + + +def checkadmin(req): + """ Checks for valid admin + Raises Http error if: + Requested user is not admin. + Input: s: request object. + Output: HttpResponse + """ + if not req.user.is_admin: + raise Http404 + +@login_required(redirect_field_name=None) +def index(req): + checkadmin(req) + boards = Board.objects.order_by('-online').all() + allotment_mode = "Random" if Board.can_do_random_allotment() else "Workshop" + return render(req, 'admin/index.html', {"boards": boards, "allotment_mode": allotment_mode}) + +@login_required(redirect_field_name=None) +def toggle_allotment_mode(req): + checkadmin(req) + Board.toggle_random_allotment() + return redirect(index) + +@login_required(redirect_field_name=None) +def booking_index(req): + checkadmin(req) + bookings = Booking.objects.order_by('-booking_date','-slot_id').filter(trashed_at__isnull=True).select_related()[:50] + return render(req, 'admin/booking_index.html', {"bookings": bookings}) + +@login_required(redirect_field_name=None) +def webcam_index(req): + checkadmin(req) + boards = Board.objects.filter(online=True) + for board in boards: + Webcam.load_image(board.mid) + return render(req, 'admin/webcam_index.html', {"boards": boards}) + +@login_required(redirect_field_name=None) +def logs_index(req): + checkadmin(req) + date = (datetime.datetime.now()).strftime("%Y-%m-%d") + return render(req, 'admin/user_logs.html', {"nowdate" : date}) + +def zipdir(path, ziph): + # ziph is zipfile handle + for root, dirs, files in os.walk(path): + for file in files: + ziph.write(os.path.join(root,file)) + +@login_required(redirect_field_name=None) +def logs_folder_index(req): + checkadmin(req) + # pass + if os.path.exists('Experiments.zip'): + os.remove('Experiments.zip') + zipf = zipfile.ZipFile('Experiments.zip','w',zipfile.ZIP_DEFLATED) + zipdir('experiments/',zipf) + zipf.close() + zip_file = open('Experiments.zip','r') + response = HttpResponse(zip_file, content_type='application/force-download') + response['Content-Disposition'] = 'attachment; filename="%s"' % 'Experiments.zip' + return response + +@login_required(redirect_field_name=None) +def switch_on_all_boards(req): + checkadmin(req) + boards = Board.objects.order_by('-online').all() + switch_onn.switchOnn(sys.argv) + return render(req,'admin/switch_on_all_board.html',{"boards":boards}) + +@login_required(redirect_field_name=None) +def switch_off_all_boards(req): + checkadmin(req) + boards = Board.objects.order_by('-online').all() + switch_off.switchOff(sys.argv) + return render(req,'admin/switch_on_all_board.html',{"boards":boards}) + + +@login_required(redirect_field_name=None) +def profile(req, mid): + checkadmin(req) + try: + filename = settings.SBHS_GLOBAL_LOG_DIR + "/" + mid + ".log" + f = open(filename, "r") + f.close() + except: + # raise Http404("log does not exist for this profile") + return render(req,'admin/log_does_not_exist.html') + + delta_T = 1000 + data = subprocess.check_output("tail -n %d %s" % (delta_T, filename), shell=True) + data = data.split("\n") + plot = [] + heatcsv = "" + fancsv = "" + tempcsv = "" + + for t in xrange(len(data)): + line = data[t] + entry = line.strip().split(" ") + try: + plot.append([int(i) for i in entry[0:-1] + [float(entry[-1])]]) + heatcsv += "%d,%s\\n" % (t+1, entry[1]) + fancsv += "%d,%s\\n" % (t+1, entry[2]) + tempcsv += "%d,%s\\n" % (t+1, entry[3]) + except: + continue + + plot = zip(*plot) # transpose + + return render(req, "admin/profile.html", { + "mid": mid, + "delta_T": delta_T, + "heat": heatcsv, + "fan": fancsv, + "temp": tempcsv + }) + +@login_required(redirect_field_name=None) +def testing(req): + checkadmin(req) + now = datetime.datetime.now() + current_slot_id = Slot.objects.filter(start_hour=now.hour, + start_minute__lt=now.minute, + end_minute__gt=now.minute) + + current_slot_id = -1 if not current_slot_id else current_slot_id[0].id + + current_bookings = Booking.objects.filter(slot_id=current_slot_id, + booking_date=datetime.date.today()).select_related() + current_mids = list([-1]) if not current_bookings else [current_booking.account.board.mid for current_booking in current_bookings] + + boards = Board.objects.filter(online=1) + allotment_mode = "Random" if Board.can_do_random_allotment() else "Workshop" + return render(req, 'admin/testexp.html', {"boards": boards, "allotment_mode": allotment_mode, "mids": current_mids}) + +@csrf_exempt +def monitor_experiment(req): + checkadmin(req) + try: + mid = int(req.POST.get("mid")) + except Exception as e: + return HttpResponse(json.dumps({"status_code":400, "message":"Invalid parameters"}), content_type="application/json") + + now = datetime.datetime.now() + current_slot_id = Slot.objects.filter(start_hour=now.hour, + start_minute__lt=now.minute, + end_minute__gt=now.minute) + + current_slot_id = -1 if not current_slot_id else current_slot_id[0].id + + try: + current_booking = Booking.objects.get(slot_id=current_slot_id, + booking_date=datetime.date.today(), + account__board__mid=mid) + except Exception as e: + return HttpResponse(json.dumps({"status_code":400, "message":"Invalid MID"}), content_type="application/json") + + try: + current_booking_id, current_user = current_booking.id, current_booking.account.username + + logfile = Experiment.objects.filter(booking_id=current_booking_id).order_by('created_at').reverse()[0].log + except: + return HttpResponse(json.dumps({"status_code":417, "message":"Experiment hasn't started"}), content_type="application/json") + + try: + # get last 10 lines from logs + stdin,stdout = os.popen2("tail -n 10 "+logfile) + stdin.close() + logs = stdout.readlines(); stdout.close() + screened_logs = [] + for line in logs: + screened_line = " ".join(line.split()[:4]) + "\n" + screened_logs.append(screened_line) + + logs = "".join(screened_logs) + except Exception as e: + return HttpResponse(json.dumps({"status_code":500, "message":"Some error occured"}), content_type="application/json") + + data = {"user": current_user, "logs": logs} + return HttpResponse(json.dumps({"status_code":200, "message":data}), content_type="application/json") + +@login_required(redirect_field_name=None) +def get_allocated_mids(req): + checkadmin(req) + with connection.cursor() as cursor: + cursor.execute("SELECT tables_board.mid, COUNT(tables_account.id), tables_board.id FROM tables_account RIGHT OUTER JOIN tables_board ON tables_account.board_id = tables_board.id WHERE tables_board.online = 1 GROUP BY tables_board.mid ORDER BY COUNT(tables_account.id)") + mid_count = cursor.fetchall() + + return render(req, 'admin/changeMID.html', {"mid_count" : mid_count}) + +@csrf_exempt +def get_users(req): + checkadmin(req) + try: + users = list(Account.objects.select_related().values_list("username", "board__mid")) + return HttpResponse(json.dumps({"status_code":200, "message":users}), content_type="application/json") + except Exception as e: + return HttpResponse(json.dumps({"status_code":500, "message":str(e)}), content_type="application/json") + + +@csrf_exempt +def toggle_device_status(req): + checkadmin(req) + + try : + mid = req.POST.get('mid') + except Exception as e: + return HttpResponse(json.dumps({"status_code":400, "message":"Invalid parameters"}), content_type="application/json") + + try: + now = datetime.datetime.now() + current_slot_id = Slot.objects.filter(start_hour=now.hour, + start_minute__lt=now.minute, + end_minute__gt=now.minute) + + current_slot_id = -1 if not current_slot_id else current_slot_id[0].id + + current_bookings = Booking.objects.filter(slot_id=current_slot_id, + booking_date=datetime.date.today()).select_related() + current_mids = list([-1]) if not current_bookings else [current_booking.account.board.mid for current_booking in current_bookings] + except Exception as e: + return HttpResponse(json.dumps({"status_code":400, "message":"Unsuccessful"}), content_type="application/json") + + if int(mid) in current_mids: + return HttpResponse(json.dumps({"status_code":400, "message":"Board is in use."}), content_type="application/json") + try: + brd = Board.objects.get(mid = mid) + brd.temp_offline = not brd.temp_offline + brd.save() + + return HttpResponse(json.dumps({"status_code":200, "message":"Toggle successful"}), content_type="application/json") + except Exception as e: + return HttpResponse(json.dumps({"status_code":400, "message":"Unsuccessful"}), content_type="application/json") + +@csrf_exempt +def toggle_power_state(req): + checkadmin(req) + # print 'inside toggle_power_state' + try: + mid = req.POST.get('mid') + except Exception as e: + return HttpResponse(json.dumps({"status_code":400, "message":"Invalid parameters"}), content_type="application/json") + + try: + now = datetime.datetime.now() + # print 'now', now + current_slot_id = Slot.objects.filter(start_hour=now.hour, + start_minute__lt=now.minute, + end_minute__gt=now.minute) + # print 'currnet_slo' + current_slot_id = -1 if not current_slot_id else current_slot_id[0].id + + current_bookings = Booking.objects.filter(slot_id=current_slot_id, + booking_date=datetime.date.today()).select_related() + current_mids = list([-1]) if not current_bookings else [current_booking.account.board.mid for current_booking in current_bookings] + except Exception as e: + return HttpResponse(json.dumps({"status_code":400, "message":"Unsuccessful"}), content_type="application/json") + + if int(mid) in current_mids: + return HttpResponse(json.dumps({"status_code":400, "message":"Board is in use."}), content_type="application/json") + try: + print 'mid', mid.strip() + brd = Board.objects.get(mid = mid) + brd.power_status = not brd.power_status + print ' brd.power_status ',int(brd.power_status) + # sys.argv = mid + # print 'sys.argv ',sys.argv + # ser = serial.Serial('/dev/ttyACM0') + # print switch_on.switchOn(sys.argv) + + if not brd.power_status: + m = str(mid).zfill(2) + print 'N ',m + time.sleep(2) + ser.write(b'N'+str(m)) + # switch_on.switchOn(m) + else: + m = str(mid).zfill(2) + print 'F ',m + time.sleep(2) + ser.write(b'F'+str(m)) + # switch_off.switchOff(sys.argv) + # ser.close() + brd.save() + + return HttpResponse(json.dumps({"status_code":200, "message":"Toggle successful"}), content_type="application/json") + except Exception as e: + return HttpResponse(json.dumps({"status_code":400, "message":"Unsuccessful"}), content_type="application/json") + +def user_exists(username): + try: + user = Account.objects.get(username=username) + except ObjectDoesNotExist: + return None + return user + +@csrf_exempt +def update_allocated_mid(req): + checkadmin(req) + try: + username = req.POST.get("username") + board_id = req.POST.get("board_id") + except Exception as e: + return HttpResponse(json.dumps({"status_code":400, "message":"Invalid parameters"}), content_type="application/json") + + user = user_exists(username) + if user is not None: + user.board_id = board_id + user.save() + else: + return HttpResponse(json.dumps({"status_code": 400, "message": "Username does not exist"}), content_type="application/json") + + return HttpResponse(json.dumps({"status_code": 200, "message": "MID changed successfully"}), content_type="application/json") + +@login_required(redirect_field_name=None) +def download_log(req, mid): + checkadmin(req) + try: + global_logfile = settings.SBHS_GLOBAL_LOG_DIR + "/" + mid + ".log" + f = open(global_logfile, "r") + data = f.read() + f.close() + return HttpResponse(data, content_type='text/text') + except: + return HttpResponse("Requested log file doesn't exist.") + +@login_required(redirect_field_name=None) +@csrf_exempt +def range_logs(req): + checkadmin(req) + try: + start_date = req.POST.get("start_date") + end_date = req.POST.get("end_date") + start_time = req.POST.get("start_time") + end_time = req.POST.get("end_time") + except: + return HttpResponse(json.dumps({"status_code":400, "message":"Invalid parameters"}), content_type="application/json") + + try: + start = start_date + " " + start_time + end = end_date + " " + end_time + log_files = Experiment.objects.filter(created_at__range=[start, end]).values("id", "log") + + return HttpResponse(json.dumps({"status_code":200, "message":list(log_files)}), content_type="application/json") + except Exception as e: + return HttpResponse(json.dumps({"status_code": 500, "message": "Some error occured" + str(e)}), content_type="application/json") + +@login_required(redirect_field_name=None) +@csrf_exempt +def download_experiment_log(req, experiment_id): + """ Downloads the experimental log file. + Input: req: request object, experiment_id: experimental id + Output: HttpResponse object + """ + checkadmin(req) + try: + experiment_data = Experiment.objects.select_related("booking", "booking__account").get(id=experiment_id) + f = open(experiment_data.log, "r") + data = f.read() + f.close() + return HttpResponse(data, content_type='text/text') + except: + return HttpResponse("Requested log file doesn't exist.") + +@csrf_exempt +def reset_device(req): + """Resets the device to fan = 100 and heat = 0 + Takes mid as paramter + Returns status_code = 200, data={temp:temp of the device} if succesful + else + status_code = 500 , data={error:errorMessage} + """ + # mid=int(req.POST.get('mid')) + # usb_path=settings.MID_PORT_MAP.get(mid,None) + + # if usb_path is None: + # retVal={"status_code":400,"message":"Invalid MID"} + # return HttpResponse(json.dumps(retVal),content_type='application/json') + + # #trying to connect to device + + # # check if SBHS device is connected + # if not os.path.exists(usb_path): + # retVal={"status_code":500,"message":"Device Not connected to defined USB Port"} + # return HttpResponse(json.dumps(retVal),content_type='application/json') + + # try: + # board = sbhs.Sbhs() + # board.machine_id=mid + # board.boardcon= serial.Serial(port=usb_path, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=2) #orignal stopbits = 1 + # board.status = 1 + # if board.reset_board(): + # retVal={"status_code":200,"message":board.getTemp()} + # return HttpResponse(json.dumps(retVal),content_type='application/json') + # else: + # retVal={"status_code":500,"message":"Could not set the parameters.Try again."} + # return HttpResponse(json.dumps(retVal),content_type='application/json') + # except serial.serialutil.SerialException: + # retVal={"status_code":500,"message":"Could not connect to the device.Try again."}
\ No newline at end of file |