diff options
-rw-r--r-- | sbhs/templates/account/home.html | 2 | ||||
-rw-r--r-- | sbhs/templates/dashboard/dashboard_index.html | 144 | ||||
-rw-r--r-- | sbhs/templates/slot/new.html | 83 | ||||
-rw-r--r-- | sbhs/urls.py | 12 | ||||
-rw-r--r-- | sbhs/views.py | 897 | ||||
-rw-r--r-- | sbhs_raspi/requirements.txt | 7 |
6 files changed, 779 insertions, 366 deletions
diff --git a/sbhs/templates/account/home.html b/sbhs/templates/account/home.html index fa95a26..f2089b3 100644 --- a/sbhs/templates/account/home.html +++ b/sbhs/templates/account/home.html @@ -10,7 +10,7 @@ <li id="download-log-nav"><a href="">Download log files</a></li> <li id="video-nav"><a href="">Show video</a></li> {% if user.profile.is_moderator %} - <li id="admin-nav"><a href="{% url 'dashboard_index' %}">Dashboard</a></li> + <li id="admin-nav"><a href="{% url 'moderator_dashboard' %}">Moderator Dashboard</a></li> {% endif %} <br><br> </ul> diff --git a/sbhs/templates/dashboard/dashboard_index.html b/sbhs/templates/dashboard/dashboard_index.html index 679e460..8dacb7a 100644 --- a/sbhs/templates/dashboard/dashboard_index.html +++ b/sbhs/templates/dashboard/dashboard_index.html @@ -1,55 +1,105 @@ {% extends "account/home.html" %} +{% load staticfiles %} {% block title %} Dashboard {% endblock %} -{% block content %} - <div class="container"> - <div class="row"> - <div class="span12" style="position: relative;top: 1.3em;"> - <ul class="nav nav-pills"> - <li id=""><a href="">Show all Boards</a></li> - <li id=""><a href="">Show all Bookings</a></li> - <li id=""><a href="">Show all Images</a></li> - <li id=""><a href="">Test Boards</a></li> - <li id=""><a href="">Update MID</a></li> - <li id=""><a href="">Fetch Logs</a></li> - <li id=""><a href="">Download Experiment Directory</a></li> - <li id=""><a href="">Turn On all Boards</a></li> - <li id=""><a href="">Turn Off all Boards</a></li> - <li id=""><a href="">Book All Slots</a></li> - <br><br> - </ul> - </div> +{% block headerfiles %} - <div class="span12"> - <h4>MID allotment mode is . <small>Change to <a href=""></a></small></h4> - <h1>Board Status</h1> - <table class="table table-bordered"> - <thead> - <tr> - <th>Board MID</th> - <th>Status</th> - <th>Power Status</th> - <th>Webcam</th> - <th>Temperature Profile</th> - <th>Download Logs</th> - - </tr> - </thead> - <tbody> - {% for b in boards %} - <tr> - <td class = "board_id">{{ b.mid }}</td> - <td><span style="cursor: pointer;" class="label label-{% if not b.online %}important{% elif b.temp_offline %}warning{% else %}success{% endif %}">{% if not b.online %}Offline{% elif b.temp_offline %}Temp Offline{% else %}Online{% endif %}</span></td> - <td><span style = "cursor: pointer;" class = "label {% if not b.power_status %}danger{% else %}success{% endif %}">{% if not b.power_status %}OFF{% else %}ON{% endif %}</span></td> - <td><a href="{% url 'webcam_show_video_to_admin' b.mid %}" target="_blank">View image</a></td> - <td><a href="{% url 'admin_profile' b.mid %}">View</a></td> - <td><a href="{% url 'admin_logs' b.mid %}">Download</a></td> - </tr> + <script type="{% static 'js/jquery-ui.js' %}"></script> + <link rel="stylesheet" type="text/css" href="{% static 'css/jquery.datetimepicker.css' %}"/> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css"/> +{% endblock %} +{% block content %} +<br> +<div class="row"> + <div class="col-sm-3 col-md-2 sidebar"> + <ul class="nav nav-sidebar nav-stacked"> + <li class = "active"> + <a href="#tab_a" data-toggle="pill">Show all Boards</a> + </li> + <li> + <a href="#tab_b" data-toggle="pill">Show all Bookings</a> + </li> + <li> + <a href="#tab_c" data-toggle="pill">Show all Images</a> + </li> + <li> + <a href="#tab_d" data-toggle="pill">Test Boards</a> + </li> + <li> + <a href="#tab_e" data-toggle="pill">Update MID</a> + </li> + <li> + <a href="#tab_f" data-toggle="pill">Fetch Logs</a> + </li> + <li> + <a href="#tab_g" data-toggle="pill">Download Experiment Directory</a> + </li> + <li> + <a href="#tab_h" data-toggle="pill">Turn On all Boards</a> + </li> + <li> + <a href="#tab_i" data-toggle="pill">Turn Off all Boards</a> + </li> + <li> + <a href="#tab_j" data-toggle="pill">Book all Slots</a> + </li> + </ul> + </div> + <div class="tab-content col-md-10"> + {# Div for Show all boards #} + <div class = "tab-pane active" id="tab_a"> + <h4>All Active Boards</h4> + <br> + <table class = "table table-striped"> + {% for board in all_active_boards %} + <thead> + <tr> + <th>Board MID</th> + <th>Webcam</th> + <th>Temperature Profile</th> + <th>Download Logs</th> + </tr> + </thead> + <tbody> + <tr> + <td>{{board.mac_ids.0}}</td> + <td></td> + <td></td> + <td></td> + </tr> + </tbody> {% endfor %} - </tbody> - </table> - </div> - </div> + </table> + </div> + <div class = "tab-pane" id="tab_b"> + <h4>All Bookings</h4> + </div> + <div class = "tab-pane" id="tab_c"> + <h4>All Images</h4> + </div> + <div class = "tab-pane" id="tab_d"> + <h4>Test Boards</h4> + </div> + <div class = "tab-pane" id="tab_e"> + <h4>Update MID</h4> + </div> + <div class = "tab-pane" id="tab_f"> + <h4>Fetch Logs</h4> + </div> + <div class = "tab-pane" id="tab_g"> + <h4>Download Experiment Directory</h4> + </div> + <div class = "tab-pane" id="tab_h"> + <h4>Turn On all Boards</h4> + </div> + <div class = "tab-pane" id="tab_i"> + <h4>Turn Off all Boards</h4> + </div> + <div class = "tab-pane" id="tab_j"> + <h4>Book all Slots</h4> + </div> + </div> </div> + {% endblock %}
\ No newline at end of file diff --git a/sbhs/templates/slot/new.html b/sbhs/templates/slot/new.html index ec999c9..f2464fa 100644 --- a/sbhs/templates/slot/new.html +++ b/sbhs/templates/slot/new.html @@ -15,17 +15,17 @@ {% endblock %} <br> <div class="row"> - <div class="col-sm-3 col-md-2 sidebar"> - <ul class="nav nav-sidebar nav-stacked"> - <li class = "active"> - <a href="#tab_a" data-toggle="pill">Create Slot</a> - </li> - <li> - <a href="#tab_b" data-toggle="pill">Slot History</a> - </li> - </ul> - </div> - <div class="tab-content col-md-9 col-md-offset-2 main"> + <div class="col-sm-3 col-md-2 sidebar"> + <ul class="nav nav-sidebar nav-stacked"> + <li class = "active"> + <a href="#tab_a" data-toggle="pill">Create Slot</a> + </li> + <li> + <a href="#tab_b" data-toggle="pill">Slot History</a> + </li> + </ul> + </div> + <div class="tab-content col-md-10"> <div class = "tab-pane active" id="tab_a"> <br> <h4>Book future slots:</h4> @@ -34,7 +34,7 @@ <div class = "form-group"> {% csrf_token %} <b>Book for a given date:</b><br/> - {{form.as_p}} + {{form.as_p}} <button class="btn btn-primary" type="submit" name='book_date' value='book_date'>Book Date</button><br/> <center>OR</center> <b>Book for current date and time</b><br/> @@ -49,38 +49,39 @@ <div class = "tab-pane" id="tab_b"> <form action="" method="POST"> {%csrf_token %} - <table class="table table-striped"> + <table class="table table-striped"> - <thead> - <tr> - <b><th></th></b> - <b><th>Start Time of a Slot</th></b> - <b><th>Duration</th></b> - <b><th>Action</th></b> - </tr> - </thead> - {% for h in history %} + <thead> <tr> - {%if h.start_time >= now %} - <td><input type="checkbox" name="slots" value="{{h.id}}"/></td> - {% else %} - <td><input type="hidden"/></td> + <b><th></th></b> + <b><th>Start Time of a Slot</th></b> + <b><th>Duration</th></b> + <b><th>Action</th></b> + </tr> + </thead> + {% for h in history %} + <tr> + {%if h.start_time >= now %} + <td><input type="checkbox" name="slots" value="{{h.id}}"/></td> + {% else %} + <td><input type="hidden"/></td> - {% endif %} - <td>{{h.start_time}}</td> - <td>{{h.end_time}}</td> - {% compare_slot_time h.start_time h.end_time now as slot_status %} - {%if slot_status == "pending" %} - <td><p class="label label-warning">Pending</p></td> - {% elif slot_status == "ongoing" %} - <td><p class="label label-success">Ongoing</p></td> - {% else %} - <td><p class="label label-danger">Finished </p></td> - {% endif %} - </tr> - {% endfor %} - </table> - <button class="btn btn-danger" type="submit" name="delete" value="delete">Delete</button> + {% endif %} + <td>{{h.start_time}}</td> + <td>{{h.end_time}}</td> + {% compare_slot_time h.start_time h.end_time now as slot_status %} + {%if slot_status == "pending" %} + <td><p class="label label-warning">Pending</p></td> + {% elif slot_status == "ongoing" %} + <td><p class="label label-success">Ongoing</p></td> + {% else %} + <td><p class="label label-danger">Finished </p></td> + {% endif %} + </tr> + {% endfor %} + </table> + <button class="btn btn-danger" type="submit" name="delete" value="delete">Delete</button> + </form> </div> </div> </div> diff --git a/sbhs/urls.py b/sbhs/urls.py index 81b63c8..07ad629 100644 --- a/sbhs/urls.py +++ b/sbhs/urls.py @@ -1,7 +1,7 @@ from django.conf.urls import url from django.contrib.auth.views import ( password_reset, password_change, password_change_done, password_reset_done, - password_reset_confirm, password_reset_complete + password_reset_confirm, password_reset_complete, ) from . import views @@ -54,12 +54,14 @@ urlpatterns = [ ################## Slot Urls ####################### url(r'^slot/new/$',views.slot_new,name='slot_new'), - ################## Dashboard Urls ###################### - url(r'^dashboard/$',views.dashboard_index, name='dashboard_index'), - ################## Experiment urls ##################### url(r'^experiment/check_connection/$',views.check_connection, name='experiment_check_connection'), - url(r'^experiment/initiate/$',views.initiation,name='experiment_initiate') + url(r'^experiment/initiate/$',views.initiation,name='experiment_initiate'), + url(r'^experiment/map_machines/$',views.map_sbhs_to_rpi,name='experiment_initiate'), + + ################## Moderator urls ##################### + url(r'^moderator/$',views.moderator_dashboard, + name='moderator_dashboard'), ] diff --git a/sbhs/views.py b/sbhs/views.py index 803d460..37d307e 100644 --- a/sbhs/views.py +++ b/sbhs/views.py @@ -29,333 +29,688 @@ from django.contrib.auth import login, logout, authenticate from django.shortcuts import render, redirect, get_object_or_404 from django.core.exceptions import ObjectDoesNotExist, MultipleObjectsReturned from django.http import HttpResponse, HttpResponseRedirect,\ - Http404, HttpResponseServerError, JsonResponse - + Http404, HttpResponseServerError, JsonResponse +from urllib.parse import urljoin from .models import Board, Experiment, Profile, Slot#, Webcam from .forms import UserLoginForm, UserRegistrationForm, SlotCreationForm -from . import sbhs from .send_emails import send_user_mail from sbhs_server import credentials as credentials - from sbhs.decorators import email_verified -from . import switch_off -from . import switch_onn - - -LIMIT = 2 -# ser = serial.Serial('/dev/ttyUSB0') - -# required for experiment views -currentdir = os.path.dirname( - os.path.abspath(inspect.getfile(inspect.currentframe()))) -parentdir = os.path.dirname(currentdir) -sys.path.insert(0, parentdir) - ################# pages views ####################### def index(request, next_url=None): - if request.user.is_authenticated(): - return render(request,'account/home.html') - return render(request,"pages/pages_index.html") + if request.user.is_authenticated(): + return render(request,'account/home.html') + return render(request,"pages/pages_index.html") def about(req): - return render(req, "pages/about.html") + return render(req, "pages/about.html") def info(request): - return render(request,"pages/info.html") + return render(request,"pages/info.html") def downloads(req): - return redirect("http://sbhs.os-hardware.in/downloads") + return redirect("http://sbhs.os-hardware.in/downloads") def theory(req): - return render(req, "pages/theory.html") + return render(req, "pages/theory.html") def procedure(req): - return render(req, "pages/procedure.html") + return render(req, "pages/procedure.html") def experiments(req): - return render(req, "pages/experiments.html") + return render(req, "pages/experiments.html") def feedback(req): - return render(req, "pages/feedback.html") + return render(req, "pages/feedback.html") #########Account Views ########### @email_verified def account_index(request): - if request.user.is_authenticated(): - return render(request,'account/home.html') + if request.user.is_authenticated(): + return render(request,'account/home.html') - return render(request,'account/account_index.html',{ - 'login_form':UserLoginForm(request.POST or None), - 'registration_form':UserRegistrationForm(request.POST or None) - }) + return render(request,'account/account_index.html',{ + 'login_form':UserLoginForm(request.POST or None), + 'registration_form':UserRegistrationForm(request.POST or None) + }) def user_login(request): - user = request.user - context = {} - if user.is_authenticated(): - return account_index(request) - - if request.method == 'POST': - form = UserLoginForm(request.POST) - if form.is_valid(): - cd = form.cleaned_data - user = authenticate(username=cd['username'], - password=cd['password']) - if user is not None: - if user.is_active: - login(request,user) - return redirect('account_enter') - else: - messages.success(request,"Account Disabled") - return redirect('account_enter') - else: - messages.success(request, "Username and/or Password is \ - invalid") - return redirect('account_enter') - else: - context={ - "login_form": form - } - else: - form = UserLoginForm() - context = { - "login_form":form - } - return redirect('account_enter') + user = request.user + context = {} + if user.is_authenticated(): + return account_index(request) + + if request.method == 'POST': + form = UserLoginForm(request.POST) + if form.is_valid(): + cd = form.cleaned_data + user = authenticate(username=cd['username'], + password=cd['password']) + if user is not None: + if user.is_active: + login(request,user) + return redirect('account_enter') + else: + messages.success(request,"Account Disabled") + return redirect('account_enter') + else: + messages.success(request, "Username and/or Password is \ + invalid") + return redirect('account_enter') + else: + context={ + "login_form": form + } + else: + form = UserLoginForm() + context = { + "login_form":form + } + return redirect('account_enter') def user_logout(request): - logout(request) - return redirect('account_enter') + logout(request) + return redirect('account_enter') def user_register(request): - user = request.user - if user.is_authenticated(): - return render(request,'account/home.html') - context={} - if request.method == 'POST': - form = UserRegistrationForm(request.POST) - if form.is_valid(): - u_name, pwd, user_email, key= form.save() - new_user = authenticate(username=u_name,password=pwd) - login(request, new_user) - if user_email and key: - success, msg = send_user_mail(user_email, key) - context = { - 'activation_msg':msg - } - return render(request,'account/activation_status.html', - context - ) - return redirect('account_enter') - else: - return redirect('account_enter') - else: - return redirect('account_enter') + user = request.user + if user.is_authenticated(): + return render(request,'account/home.html') + context={} + if request.method == 'POST': + form = UserRegistrationForm(request.POST) + if form.is_valid(): + u_name, pwd, user_email, key= form.save() + new_user = authenticate(username=u_name,password=pwd) + login(request, new_user) + if user_email and key: + + success, msg = send_user_mail(user_email, key) + context = { + 'activation_msg':msg + } + return render(request,'account/activation_status.html', + context + ) + return redirect('account_enter') + else: + return redirect('account_enter') + else: + return redirect('account_enter') +@login_required def activate_user(request, key): - profile = get_object_or_404(Profile, activation_key=key) - context = {} - context['success'] = False - if profile.is_email_verified: - context['activation_msg'] = "Your account is already verified" - return render(request,'account/activation_status.html',context) - if timezone.now() > profile.key_expiry_time: - content['msg'] = dedent( - """ - Your activation time expired. Please try again - """ - ) - else: - context['success'] = True - profile.is_email_verified=True - profile.save() - context['msg'] = "Your account is activated" - return render(request,'account/activation_status.html',context) + profile = get_object_or_404(Profile, activation_key=key) + context = {} + context['success'] = False + if profile.is_email_verified: + context['activation_msg'] = "Your account is already verified" + return render(request,'account/activation_status.html',context) + if timezone.now() > profile.key_expiry_time: + content['msg'] = dedent( + """ + Your activation time expired. Please try again + """ + ) + else: + context['success'] = True + profile.is_email_verified=True + profile.save() + context['msg'] = "Your account is activated" + return render(request,'account/activation_status.html',context) def new_activation(request, email=None): - context = {} - if request.method == 'POST': - email = request.POST.get('email') - try: - user = User.objects.get(email=email) - except MultipleObjectsReturned: - context['email_err_msg'] = 'Multiple entries found for this email \ - Please change your email' - return render(request,'account/activation_status.html',context) - except ObjectDoesNotExist: - context['success'] = False - context['msg'] = "Your account is not verified. Please verify your \ - account" - return render(request, 'account/activation_status.html',context) - - if not user.profile.is_email_verified: - user.profile.activation_key = generate_activation_key(user.username) - user.profile.key_expiry_time = timezone.now() \ - + timezone.timedelta(minutes=20) - user.profile.save() - new_user_data = User.objects.get(email=email) - success, msg = send_user_mail(new_user_data.email, \ - new_user_data.profile.activation_key) - - if success: - context['activation_msg'] = msg - else: - context['msg'] = msg - else: - context['activation_msg'] = "Your account is already verified" - return render(request,'account/activation_status.html',{}) + context = {} + if request.method == 'POST': + email = request.POST.get('email') + try: + user = User.objects.get(email=email) + except MultipleObjectsReturned: + context['email_err_msg'] = 'Multiple entries found for this email \ + Please change your email' + return render(request,'account/activation_status.html',context) + except ObjectDoesNotExist: + context['success'] = False + context['msg'] = "Your account is not verified. Please verify your \ + account" + return render(request, 'account/activation_status.html',context) + + if not user.profile.is_email_verified: + user.profile.activation_key = generate_activation_key(user.username) + user.profile.key_expiry_time = timezone.now() \ + + timezone.timedelta(minutes=20) + user.profile.save() + new_user_data = User.objects.get(email=email) + success, msg = send_user_mail(new_user_data.email, \ + new_user_data.profile.activation_key) + + if success: + context['activation_msg'] = msg + else: + context['msg'] = msg + else: + context['activation_msg'] = "Your account is already verified" + return render(request,'account/activation_status.html',{}) +@login_required def update_email(request): - context = {} - if request.method == 'POST': - email = request.POST.get('email') - username = request.POST.get('username') - user = get_object_or_404(User, username=username) - user.email = email - user.save() - return new_activation(request, email) - else: - context['email_err_msg'] = "Please Update your email" - return render(request,'account/activation_status.html',context) + context = {} + if request.method == 'POST': + email = request.POST.get('email') + username = request.POST.get('username') + user = get_object_or_404(User, username=username) + user.email = email + user.save() + return new_activation(request, email) + else: + context['email_err_msg'] = "Please Update your email" + return render(request,'account/activation_status.html',context) @login_required @email_verified def slot_new(request): - user = request.user - slot_history = Slot.objects.filter(user=user).order_by("start_time") - context = {} - now = timezone.now() - if not request.user.is_authenticated(): - return redirect('account_enter') - - if request.method == 'POST': - if request.POST.get('delete') == "delete": - slots = request.POST.getlist("slots") - Slot.objects.filter(id__in=slots).delete() - if request.POST.get("book_date") == "book_date": - form = SlotCreationForm(request.POST) - if form.is_valid(): - new_slot = form.save(commit=False) - if new_slot.start_time >= now: - new_slot.end_time = new_slot.start_time + timedelta( - minutes=settings.SLOT_DURATION - ) - new_slot.user = user - new_slot.save() - messages.success(request,'Slot created successfully.') - else: - messages.error(request, - 'Start time selected' - + ' is before today.' - + 'Please choose again.' - ) - if request.POST.get("book_now") == "book_now": - slot_now = Slot.objects.create(user=user, start_time=now, - end_time=now+timedelta(minutes=55) - ) - messages.success(request,'Slot created successfully.') - return redirect("slot_new") - - else: - form = SlotCreationForm() - context['history']=slot_history - context['form']=form - context['now'] = now - return render(request,'slot/new.html',context) - + user = request.user + slot_history = Slot.objects.filter(user=user).order_by("start_time") + context = {} + now = timezone.now() + if not request.user.is_authenticated(): + return redirect('account_enter') + + if request.method == 'POST': + if request.POST.get('delete') == "delete": + slots = request.POST.getlist("slots") + Slot.objects.filter(id__in=slots).delete() + if request.POST.get("book_date") == "book_date": + form = SlotCreationForm(request.POST) + if form.is_valid(): + new_slot = form.save(commit=False) + if new_slot.start_time >= now: + new_slot.end_time = new_slot.start_time + timedelta( + minutes=settings.SLOT_DURATION + ) + new_slot.user = user + new_slot.save() + messages.success(request,'Slot created successfully.') + else: + messages.error(request, + 'Start time selected' + + ' is before today.' + + 'Please choose again.' + ) + if request.POST.get("book_now") == "book_now": + slot_now = Slot.objects.create(user=user, start_time=now, + end_time=now+timedelta(minutes=55) + ) + messages.success(request,'Slot created successfully.') + return redirect("slot_new") + + else: + form = SlotCreationForm() + context['history']=slot_history + context['form']=form + context['now'] = now + return render(request,'slot/new.html',context) + -################## Moderator Views ########################## - -@login_required -def dashboard_index(request): - context = {} - return render(request,'dashboard/dashboard_index.html',context) ###################Experiment Views ###################### def check_connection(request): - message = {"message":"TESTOK"} - return JsonResponse(message, safe=True, status=200) + message = {"message":"TESTOK"} + return JsonResponse(message, safe=True, status=200) @login_required def initial_login(request): - """ Logs in an user for conducting the experiment on the specified - board. - Input: req:request object. - Output: HttpResponse object. - """ - - username = request.POST.get("username") - rpi_ip = '' - try: - assigned_mid = 2 - except Exception as e: - return JsonResponse({ - "STATUS":400, - "MESSAGE":{ - "IS_IP":"1", - "DATA":"Invalid username" - } - }) - rpi_ip = '10.102.54.71' - if rpi_ip is None: - return JsonResponse({ - "STATUS":400, - "MESSAGE":{ - "IS_IP":"1", - "DATA":"Board is currently offline" - } - }) - return JsonResponse({ - "STATUS":200, - "MESSAGE":{ - "IS_IP":"1", - "DATA":rpi_ip - } - }) + """ Logs in an user for conducting the experiment on the specified + board. + Input: req:request object. + Output: HttpResponse object. + """ + + username = request.POST.get("username") + rpi_ip = '' + try: + assigned_mid = 2 + except Exception as e: + return JsonResponse({ + "STATUS":400, + "MESSAGE":{ + "IS_IP":"1", + "DATA":"Invalid username" + } + }) + rpi_ip = '10.102.54.71' + if rpi_ip is None: + return JsonResponse({ + "STATUS":400, + "MESSAGE":{ + "IS_IP":"1", + "DATA":"Board is currently offline" + } + }) + return JsonResponse({ + "STATUS":200, + "MESSAGE":{ + "IS_IP":"1", + "DATA":rpi_ip + } + }) @csrf_exempt def initiation(request): - username = request.POST.get("username") - password = request.POST.get("password") - user = authenticate(username=username, password=password) - if user: - if user.is_active: - now = timezone.now() - slots = Slot.objects.filter(user=user, - start_time__gte=now, - end_time__lt = now - ) - - slot = slots.last() - if slot: - filename = '' - message = { - "STATUS":1, - "MESSAGE": filename - } - else: - message = { - "STATUS":0, - "MESSAGE":"Slot has ended. Please book the next slot \ - to continue the experiment" - } - else: - message = { - "STATUS":0, - "MESSAGE":"Your account is not activated. Please check your \ - mail for activation link" - } - else: - message = { - "STATUS":0, - "MESSAGE":"Invalid username and password" - } - - return JsonResponse(message, safe=True, status=200)
\ No newline at end of file + username = request.POST.get("username") + password = request.POST.get("password") + user = authenticate(username=username, password=password) + if user: + if user.is_active: + now = timezone.now() + slots = Slot.objects.filter(user=user, + start_time__gte=now, + end_time__lt = now + ) + + slot = slots.last() + if slot: + filename = '' + message = { + "STATUS":1, + "MESSAGE": filename + } + else: + message = { + "STATUS":0, + "MESSAGE":"Slot has ended. Please book the next slot \ + to continue the experiment" + } + else: + message = { + "STATUS":0, + "MESSAGE":"Your account is not activated. Please check your \ + mail for activation link" + } + else: + message = { + "STATUS":0, + "MESSAGE":"Invalid username and password" + } + + return JsonResponse(message, safe=True, status=200) + +def map_sbhs_to_rpi(client_ip): + """ + """ + r_pis = settings.RASP_PI_IPS + map_machines = [] + if r_pis: + for r_pi in r_pis: + rpi_map = {} + rpi_map["rpi_ip"] = r_pi + rpi_connect = connect_sbhs(r_pi, "get_machine_ids") + mac_ids = json.loads(rpi_connect) + board = Board() + board.save_board_details(r_pi, mac_ids) + rpi_map["mac_ids"] = [i['sbhs_mac_id'] for i in mac_ids] + map_machines.append(rpi_map) + else: + rpi_map = {} + client_name = client_ip + ":1234" + rpi_map["rpi_ip"] = client_name + rpi_connect = connect_sbhs(client_name, "get_machine_ids") + mac_ids = json.loads(rpi_connect) + board = Board() + board.save_board_details(client_name, mac_ids) + +def connect_sbhs(rpi_ip, experiment_url): + connect_rpi = requests.get("http://{0}/experiment/{1}".format( + rpi_ip, experiment_url + ) + ) + return connect_rpi.text + +################## Moderator Views ########################## + +def is_moderator(user): + """Check if the user is having moderator rights""" + if user.profile.is_moderator: + return True + +@login_required +def moderator_dashboard(request): + user = request.user + context = {} + if not is_moderator(user): + raise Http404("You are not allowed to see this page!") + else: + all_boards = map_sbhs_to_rpi(request.META["SERVER_NAME"]) + context["all_active_boards"] = all_boards + return render(request, 'dashboard/dashboard_index.html', context) + + +# @login_required +# def index(req): +# user = request.user +# if not is_moderator(user): +# raise Http404("You are not allowed to see this page!") +# 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 +# def toggle_allotment_mode(req): +# checkadmin(req) +# Board.toggle_random_allotment() +# return redirect(index) + +# @login_required(redirect_field_name=None) +# def booking_index(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}) + +# @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 + +# 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") +# 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) + +# return HttpResponse(r.text, content_type="application/json") +# except Exception as e: +# retVal={"status_code":500,"message":"Could not fetch device logs.."} +# return HttpResponse(json.dumps(retVal),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":500, "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.Please Try in the next hour after your slot ends.") + +# @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(os.path.join(settings.EXPERIMENT_LOGS_DIR, 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} +# """ +# checkadmin(req) +# mid=int(req.POST.get('mid')) + +# 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/resetdevice" +# payload = {"mid":mid} +# r = requests.post(url , data = payload) + +# return HttpResponse(r.text, content_type="application/json") +# except Exception as e: +# retVal={"status_code":500,"message":"Could not reset the device.."} +# return HttpResponse(json.dumps(retVal),content_type='application/json') + + +# @csrf_exempt +# def set_device_params(req): +# """Sets the device parameters as per the arguments sent +# Takes mid,fan,heat as paramter +# Returns status_code = 200, data={temp:temp of the device} if succesful +# else +# status_code = 500 , data={error:errorMessage} +# """ +# checkadmin(req) +# mid=int(req.POST.get('mid')) +# fan=int(req.POST.get('fan')) +# heat=int(req.POST.get('heat')) +# try: +# ip = "192.168.1.141" +# # 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/setdevice" +# # payload = {"mid":mid, "fan":fan, "heat":heat} +# # r = requests.post(url , data = payload) +# s = Sbhs() +# fan = s.setFan(ip,fan) +# heat = s.setHeat(ip,heat) +# payload = {"ip":ip,"fan":fan,"heat":heat} +# # return HttpResponse(r.text, content_type="application/json") +# return HttpResponse(payload,content_type="application/json") +# except Exception as e: +# 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 +# Takes mid,fan,heat as paramter +# Returns status_code = 200, data={temp:temp of the device} if succesful +# else +# status_code = 500 , data={error:errorMessage} +# """ +# checkadmin(req) +# # mid=int(req.POST.get('mid')) +# 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/gettemp" +# # payload = {"mid":mid} +# # r = requests.post(url , data = payload) +# ip = "192.168.1.141" +# s = Sbhs() +# contents = s.getTemp(ip) +# print("contents: {}".format(contents)) +# # return HttpResponse(r.text, content_type="application/json") +# return HttpResponse(json.dumps({"status_code": 200,"contents":contents}),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') diff --git a/sbhs_raspi/requirements.txt b/sbhs_raspi/requirements.txt index 5c8c61b..5f73360 100644 --- a/sbhs_raspi/requirements.txt +++ b/sbhs_raspi/requirements.txt @@ -1 +1,6 @@ -flask==1.0.2
\ No newline at end of file +# Please run sbhs_communication_server files i.e. sbhs_server.py and sbhs.py in python 2 only. +# This is because we could not figure out the working of pyserial with python 3. + +flask==1.0.2 +pyserial==3.4 + |