summaryrefslogtreecommitdiff
path: root/myadmin/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'myadmin/views.py')
-rw-r--r--myadmin/views.py199
1 files changed, 181 insertions, 18 deletions
diff --git a/myadmin/views.py b/myadmin/views.py
index 4c6ccce..2e82773 100644
--- a/myadmin/views.py
+++ b/myadmin/views.py
@@ -1,14 +1,33 @@
from django.shortcuts import render, redirect
-from django.http import Http404,HttpResponse
+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
-import subprocess,json,serial,os, datetime, requests
+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
@@ -53,6 +72,43 @@ def logs_index(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)
+ path = settings.BASE_DIR + '/experiments/'
+ # path = os.path.abspath("/experiments/")
+ zipdir(path,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)
@@ -61,7 +117,8 @@ def profile(req, mid):
f = open(filename, "r")
f.close()
except:
- raise Http404
+ # 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)
@@ -117,18 +174,44 @@ def monitor_experiment(req):
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:
- ip = settings.pi_ip_map.get(str(mid))
- if ip is None:
- return HttpResponse(json.dumps({"status_code":400, "message":"Board is offline"}), content_type="application/json")
- url = "http://" + str(ip) + "/pi/admin/monitor"
- payload = {"mid":mid}
- r = requests.post(url , data = payload)
+ 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")
- return HttpResponse(r.text, 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:
- retVal={"status_code":500,"message":"Could not fetch device logs.."}
- return HttpResponse(json.dumps(retVal),content_type='application/json')
+ 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):
@@ -174,7 +257,6 @@ def toggle_device_status(req):
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
@@ -182,8 +264,62 @@ def toggle_device_status(req):
return HttpResponse(json.dumps({"status_code":200, "message":"Toggle successful"}), content_type="application/json")
except Exception as e:
- return HttpResponse(json.dumps({"status_code":500, "message":"Unsuccessful"}), content_type="application/json")
+ 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:
@@ -212,6 +348,7 @@ def update_allocated_mid(req):
@login_required(redirect_field_name=None)
def download_log(req, mid):
+ print 'download log'
checkadmin(req)
try:
global_logfile = settings.SBHS_GLOBAL_LOG_DIR + "/" + mid + ".log"
@@ -220,7 +357,7 @@ def download_log(req, mid):
f.close()
return HttpResponse(data, content_type='text/text')
except:
- return HttpResponse("Requested log file doesn't exist.Please Try in the next hour after your slot ends.")
+ return HttpResponse("Requested log file doesn't exist.")
@login_required(redirect_field_name=None)
@csrf_exempt
@@ -251,9 +388,11 @@ def download_experiment_log(req, experiment_id):
Output: HttpResponse object
"""
checkadmin(req)
+ print 'download_experiment_log'
try:
experiment_data = Experiment.objects.select_related("booking", "booking__account").get(id=experiment_id)
- f = open(os.path.join(settings.EXPERIMENT_LOGS_DIR, experiment_data.log), "r")
+ # f = open(experiment_data.log, "r")
+ f = open(settings.BASE_DIR + '/experiments/' + experiment_data.log,'r')
data = f.read()
f.close()
return HttpResponse(data, content_type='text/text')
@@ -310,6 +449,7 @@ def set_device_params(req):
retVal={"status_code":500,"message":"Could not set the device params.."}
return HttpResponse(json.dumps(retVal),content_type='application/json')
+
@csrf_exempt
def get_device_temp(req):
"""Sets the device parameters as per the arguments sent
@@ -319,16 +459,39 @@ def get_device_temp(req):
status_code = 500 , data={error:errorMessage}
"""
checkadmin(req)
+ print 'inside get_device_temp function'
mid=int(req.POST.get('mid'))
+ print 'mid',mid
try:
ip = settings.pi_ip_map.get(str(mid))
+ print 'ip',ip
if ip is None:
return HttpResponse(json.dumps({"status_code":400, "message":"Board is offline"}), content_type="application/json")
url = "http://" + str(ip) + "/pi/admin/gettemp"
+ print 'url ', url
payload = {"mid":mid}
+ print 'payload',payload
r = requests.post(url , data = payload)
-
+ print 'r', r
return HttpResponse(r.text, content_type="application/json")
except Exception as e:
retVal={"status_code":500,"message":"Could not get the device temperature.."+str(e)}
return HttpResponse(json.dumps(retVal),content_type='application/json')
+
+
+@login_required(redirect_field_name=None)
+def automated_slot_booking(req):
+ checkadmin(req)
+ boards = Board.objects.order_by('-online').all()
+ auto = class_based_automated_slot_booking.Automated_Slot_Booking()
+
+ auto.SuperUserList()
+ auto.CurrentBookedAccount()
+ auto.BookedMidList()
+ auto.BookSlot()
+ auto.CloseDb()
+
+ switch_onn.switchOnn(sys.argv)
+ # check_future_slots.check_future_slots()
+ # switch_on_all_boards()
+ return render(req,'admin/index.html',{'boards':boards})