diff --git a/README.md b/README.md index d4740cde..0740a59b 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# virtual_lab +# vital_development repository for web code diff --git a/vital_site/scripts/on_web_server_startup.sh b/vital_site/scripts/on_web_server_startup.sh index 563dfb7e..e75d700d 100755 --- a/vital_site/scripts/on_web_server_startup.sh +++ b/vital_site/scripts/on_web_server_startup.sh @@ -16,34 +16,18 @@ dbpass=$(awk -F ":" '/VITAL_DB_PWD/ {print $2}' /home/vital/config.ini | tr -d ' dbname=$(awk -F ":" '/VITAL_DB_NAME/ {print $2}' /home/vital/config.ini | tr -d ' ') dbuser=$(awk -F ":" '/VITAL_DB_USER/ {print $2}' /home/vital/config.ini | tr -d ' ') dbport=$(awk -F ":" '/VITAL_DB_PORT/ {print $2}' /home/vital/config.ini | tr -d ' ') -sftp=$(awk -F ":" '/SFTP_ADDR/ {print $2}' /home/vital/config.ini | tr -d ' ') -localrepo=$(awk -F ":" '/LOCAL_REPO/ {print $2}' /home/vital/config.ini | tr -d ' ') + + # sets up required bridges and bonds for the courses on web server nets=$(PGPASSWORD=$dbpass psql -U $dbuser -d $dbname -h $dbhost -p $dbport -t -c "SELECT c.id from vital_course c join vital_network_configuration n on c.id=n.course_id where c.status='ACTIVE' and n.is_course_net=True") + set -f array=(${nets// / }) -# Flush Iptables -iptables -F -iptables -t nat -F + for var in "${array[@]}" do /home/vital/vital2.0/source/virtual_lab/vital_site/scripts/ws_course_network_startup.sh $var done - -# enables SFTP access to the SFTP server and local ubuntu repo from xen vms -# TODO change the hardcorded server IP -SERVER_IP=( $sftp $localrepo ) - -for ip in "${SERVER_IP[@]}" -do - iptables -I FORWARD 2 -p icmp --icmp-type 8 -s 0/0 -d $ip -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT - iptables -I FORWARD 1 -p icmp --icmp-type 0 -s $ip -d 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT -done - -# to enable NAT from xen -#iptables -t nat -A POSTROUTING -s 192.168.35.0/24 -o eth0 -j MASQUERADE -##ap4414 EDIT: moving iptables rules to the front of the chain -iptables -t nat -I POSTROUTING 1 -s 192.168.35.0/24 -o enp5s0 -j MASQUERADE diff --git a/vital_site/scripts/ws_course_network_startup.sh b/vital_site/scripts/ws_course_network_startup.sh index 555ea867..f60f2d86 100755 --- a/vital_site/scripts/ws_course_network_startup.sh +++ b/vital_site/scripts/ws_course_network_startup.sh @@ -1,55 +1,30 @@ #!/bin/bash -# reading from config file +#reading from config file host=$(awk -F ":" '/VITAL_DB_HOST/ {print $2}' /home/vital/config.ini | tr -d ' ') pass=$(awk -F ":" '/VITAL_DB_PWD/ {print $2}' /home/vital/config.ini | tr -d ' ') -sftp=$(awk -F ":" '/SFTP_ADDR/ {print $2}' /home/vital/config.ini | tr -d ' ') -localrepo=$(awk -F ":" '/LOCAL_REPO/ {print $2}' /home/vital/config.ini | tr -d ' ') port=$(awk -F ":" '/VITAL_DB_PORT/ {print $2}' /home/vital/config.ini | tr -d ' ') +dbname=$(awk -F ":" '/VITAL_DB_NAME/ {print $2}' /home/vital/config.ini | tr -d ' ') vlan=$1 -vconfig add bond0 $vlan -ifconfig bond0.$vlan 10.$vlan.1.1 netmask 255.255.255.0 broadcast 10.$vlan.1.255 up - -# NAT forward requests from xen vms to vital -#iptables -t nat -A POSTROUTING -s 10.$vlan.1.0/24 -o eth0 -j SNAT --to 128.238.77.20 -#iptables -A INPUT -i bond0.$vlan -p udp --dport 67:68 --sport 67:68 -j ACCEPT - -##as11552 : EDIT : Add rules to allow DNS requests from Student VM's -iptables -A INPUT -s 10.$vlan.1.0/24 -p udp -m udp --dport 53 -j ACCEPT -iptables -A OUTPUT -d 10.$vlan.1.0/24 -p udp -m udp --sport 53 -j ACCEPT - -##ap4414 EDIT: moving NAT forward requests to front of the chain -iptables -t nat -I POSTROUTING 1 -s 10.$vlan.1.0/24 -o enp5s0 -j SNAT --to 128.238.77.21 -iptables -I INPUT 1 -i bond0.$vlan -p udp --dport 67:68 --sport 67:68 -j ACCEPT - -##ap4414 EDIT: drop any traffic to Vital web-server -iptables -A INPUT -s 10.$vlan.1.0/24 -j DROP - -#Forward all SFTP requests -#iptables -A FORWARD -i bond0.$vlan -s 10.$vlan.1.0/24 -d 128.238.66.35 -p tcp --dport 22 -j ACCEPT -#iptables -A FORWARD -i bond0.$vlan -s 10.$vlan.1.0/24 -d 10.$vlan.1.0/24 -j ACCEPT - -##ap4414 EDIT: moving SFTP requests to front of the chain -SERVER_IP=$sftp -iptables -I FORWARD 1 -i bond0.$vlan -s 10.$vlan.1.0/24 -d $SERVER_IP -p tcp --dport 22 -j ACCEPT -iptables -I FORWARD 2 -i bond0.$vlan -s $SERVER_IP -d 10.$vlan.1.0/24 -j ACCEPT - -##as11552 EDIT: Add rules for accessing Local Repository -SERVER_IP=$localrepo -iptables -I FORWARD 3 -i bond0.$vlan -s 10.$vlan.1.0/24 -d $SERVER_IP -p tcp --dport 80 -j ACCEPT -iptables -I FORWARD 4 -i bond0.$vlan -s $SERVER_IP -d 10.$vlan.1.0/24 -j ACCEPT +if /sbin/ethtool bond0.$vlan | grep -q "Link detected: yes"; then + echo "Online" +else + echo "Not online" + vconfig add bond0 $vlan + ifconfig bond0.$vlan 10.$vlan.1.1 netmask 255.255.255.0 broadcast 10.$vlan.1.255 up +fi -iptables -I FORWARD 5 -i bond0.$vlan -s 10.$vlan.1.0/24 -d 10.$vlan.1.0/24 -j ACCEPT +requires_internet=$(PGPASSWORD=$pass psql -U postgres -d $dbname -h $host -p $port -t -c "SELECT n.has_internet_access from vital_course c join vital_network_configuration n on c.id=n.course_id where n.is_course_net=True and c.id="+$vlan) -requires_internet=$(PGPASSWORD=$pass psql -U postgres -d vital_db -h $host -p $port -t -c "SELECT n.has_internet_access from vital_course c join vital_network_configuration n on c.id=n.course_id where n.is_course_net=True and c.id="+$vlan) +iptables -C FORWARD -i bond0.$vlan -s 10.$vlan.1.0/24 -j REJECT -if [ $requires_internet = 't' ] +if [ $(echo $?) == '1' ] && [ $requires_internet = 'f' ] then - echo "Internet enabled for vlan $vlan" + echo "Rule Added" + iptables -I FORWARD 2 -i bond0.$vlan -s 10.$vlan.1.0/24 -j REJECT else - echo "Internet disabled for vlan $vlan" -# iptables -A FORWARD -i bond0.$vlan -s 10.$vlan.1.0/24 -j REJECT - iptables -I FORWARD 6 -i bond0.$vlan -s 10.$vlan.1.0/24 -j REJECT + echo "No need to add the rule" fi + /home/vlab_scp/vmnet_conf/vlab-natdhcp/bin/busybox udhcpd -S /home/vlab_scp/vmnet_conf/vlab-natdhcp/Nat-$vlan.dhcpd diff --git a/vital_site/vital/management/commands/RemoveCourse.py b/vital_site/vital/management/commands/RemoveCourse.py index 6ec2e63f..a364d920 100644 --- a/vital_site/vital/management/commands/RemoveCourse.py +++ b/vital_site/vital/management/commands/RemoveCourse.py @@ -1,5 +1,8 @@ from django.core.management.base import BaseCommand import logging +import os +import re +import subprocess from vital.models import Course, Registered_Course, User_Network_Configuration, Available_Config, User_VM_Config, Network_Configuration, Virtual_Machine, Course logger = logging.getLogger(__name__) @@ -18,22 +21,77 @@ def add_arguments(self, parser): ) def handle(self, *args, **options): - course_id = options['course_id'] - course = Course.objects.get(id=course_id) - print "Removing course: "+course.name+" (ID:" + str(course.id) + ")" - print "Removing registered students" - Registered_Course.objects.filter(course=course).delete() - print "Removing registered user network configs" - user_nets = User_Network_Configuration.objects.filter(course=course) - for net in user_nets: - conf = Available_Config() - conf.category = 'MAC_ADDR' - conf.value = net.mac_id - conf.save() - net.delete() - print "Removing course network config" - Network_Configuration.objects.filter(course=course).delete() - print "Removing course virtual machines" - Virtual_Machine.objects.filter(course=course).delete() - Course.objects.get(id=course_id).delete() - print course.name+" (ID:" + str(course.id) + ")"+" has been deleted" + try: + course_id = options['course_id'] + course = Course.objects.get(id=course_id) + print "Removing course: "+course.name+" (ID:" + str(course.id) + ")" + print "Removing registered students" + Registered_Course.objects.filter(course=course).delete() + print "Removing registered user network configs" + user_nets = User_Network_Configuration.objects.filter(course=course) + for net in user_nets: + conf = Available_Config() + conf.category = 'MAC_ADDR' + conf.value = net.mac_id + conf.save() + net.delete() + print "Removing course network config" + Network_Configuration.objects.filter(course=course).delete() + print "Removing course virtual machines" + Virtual_Machine.objects.filter(course=course).delete() + Course.objects.get(id=course_id).delete() + print course.name+" (ID:" + str(course.id) + ")"+" has been deleted" + except Exception as e: + print(e) + pass + + print("Removing conf and qcow course files") + for files in os.listdir("/mnt/vlab-datastore/vital/vm_dsk/"): + #print(files) + if files.find(str(course_id)) == 3: + files = "/mnt/vlab-datastore/vital/vm_dsk/" + files + os.remove(files) + + for files in os.listdir("/mnt/vlab-datastore/vital/vm_conf/"): + #print(files) + if files.find(str(course_id)) == 3: + files = "/mnt/vlab-datastore/vital/vm_conf/" + files + os.remove(files) + + for files in os.listdir("/mnt/vlab-datastore/vital/vm_conf/clean/"): + #print(files) + if files.find(str(course_id)) == 0: + files = "/mnt/vlab-datastore/vital/vm_conf/clean/" + files + os.remove(files) + + for files in os.listdir("/mnt/vlab-datastore/vital/vm_dsk/clean/"): + #print(files) + if files.find(str(course_id)) == 0: + files = "/mnt/vlab-datastore/vital/vm_dsk/clean/" + files + os.remove(files) + + print("Removing dhcpd file") + try: + + st = "/home/vlab_scp/vmnet_conf/vlab-natdhcp/Nat-" + str(course_id) + ".dchpd" + os.remove(st) + except Exception as e: + print(st+":"+str(e)) + pass + + print("Removing vlan interfaces") + remvlan = "vconfig rem bond0." + str(course_id) + downvlan = "ip link set dev bond0."+ str(course_id) + " down" + + process = subprocess.Popen(downvlan.split(), stdout=subprocess.PIPE) + output, error = process.communicate() + print(output) + process = subprocess.Popen(remvlan.split(), stdout=subprocess.PIPE) + output, error = process.communicate() + print(output) + + print("Removing iptable rule") + delrule = "iptables -D FORWARD -i bond0." + str(course_id) + " -s 10." + str(course_id) + ".1.0/24 -j REJECT" + process = subprocess.Popen(delrule.split(), stdout=subprocess.PIPE) + output, error = process.communicate() + print(output) diff --git a/vital_site/vital/templates/vital/base.html b/vital_site/vital/templates/vital/base.html index da4f7e38..a6692cd4 100644 --- a/vital_site/vital/templates/vital/base.html +++ b/vital_site/vital/templates/vital/base.html @@ -56,15 +56,15 @@
diff --git a/vital_site/vital/templates/vital/course_detail.html b/vital_site/vital/templates/vital/course_detail.html index 825d8da9..7bf461db 100644 --- a/vital_site/vital/templates/vital/course_detail.html +++ b/vital_site/vital/templates/vital/course_detail.html @@ -105,7 +105,7 @@ title={{ vm.name }}>
- +
@@ -114,7 +114,7 @@
- +
@@ -154,4 +154,4 @@ {% endif %}
-{% endblock content_without_center %} \ No newline at end of file +{% endblock content_without_center %} diff --git a/vital_site/vital/templates/vital/registered_courses.html b/vital_site/vital/templates/vital/registered_courses.html index 69b727f2..aafcaf5b 100644 --- a/vital_site/vital/templates/vital/registered_courses.html +++ b/vital_site/vital/templates/vital/registered_courses.html @@ -2,11 +2,11 @@ {% block content_without_center %}
-{% if message %}

{{ message }}   Register for new course

{% endif %} +{% if message %}

{{ message }}   Register for new course

{% endif %} {% if reg_courses %}
Registered Courses
-
Add course
+
Add course
diff --git a/vital_site/vital/templates/vital/virtual_machines.html b/vital_site/vital/templates/vital/virtual_machines.html index b4f54cb0..d8c991b7 100644 --- a/vital_site/vital/templates/vital/virtual_machines.html +++ b/vital_site/vital/templates/vital/virtual_machines.html @@ -21,11 +21,11 @@
{% if vm.state == 'R'%} - + {% else %} - + {% endif %} @@ -50,7 +50,7 @@
{% if vm.state != 'R'%} - + {% endif %} diff --git a/vital_site/vital/urls.py b/vital_site/vital/urls.py index fdd66aad..6897e545 100644 --- a/vital_site/vital/urls.py +++ b/vital_site/vital/urls.py @@ -18,9 +18,9 @@ url(r'^users/(?P[0-9]+)/vms/(?P[0-9]+)/release-vm/$', views.release_vm, name='user_releaseVM'), url(r'^login/$', views.login, name='login'), url(r'^logout/$', views.logout, name='logout'), - url(r'^users/reset-password', views.reset_password, name='user_reset_password'), - url(r'^users/forgot-password', views.forgot_password, name='user_forgot_password'), - url(r'^courses/(?P[0-9]+)/vms/(?P[0-9]+)/start', views.start_vm, name='start_vm'), - url(r'^courses/(?P[0-9]+)/vms/(?P[0-9]+)/stop', views.stop_vm, name='stop_vm'), - url(r'^courses/(?P[0-9]+)/vms/(?P[0-9]+)/rebase', views.rebase_vm, name='rebase_vm'), + url(r'^users/reset-password/$', views.reset_password, name='user_reset_password'), + url(r'^users/forgot-password/$', views.forgot_password, name='user_forgot_password'), + url(r'^courses/(?P[0-9]+)/vms/(?P[0-9]+)/start/$', views.start_vm, name='start_vm'), + url(r'^courses/(?P[0-9]+)/vms/(?P[0-9]+)/stop/$', views.stop_vm, name='stop_vm'), + url(r'^courses/(?P[0-9]+)/vms/(?P[0-9]+)/rebase/$', views.rebase_vm, name='rebase_vm'), ] diff --git a/vital_site/vital/views/.student_view.py.swp b/vital_site/vital/views/.student_view.py.swp new file mode 100644 index 00000000..3f31ce44 Binary files /dev/null and b/vital_site/vital/views/.student_view.py.swp differ diff --git a/vital_site/vital/views/faculty_view.py b/vital_site/vital/views/faculty_view.py index d99c066e..92e61568 100644 --- a/vital_site/vital/views/faculty_view.py +++ b/vital_site/vital/views/faculty_view.py @@ -6,7 +6,7 @@ logger = logging.getLogger(__name__) -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def advising_courses(request): logger.debug("In registered courses") faculty_records = Faculty.objects.filter(user_id=request.user.id) @@ -17,7 +17,7 @@ def advising_courses(request): return render(request, 'vital/advising_courses.html', {'advising_courses': adv_courses}) -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def course_detail(request, course_id): logger.debug("in course detail") professors = '' diff --git a/vital_site/vital/views/security_view.py b/vital_site/vital/views/security_view.py index 419151c8..acc6842a 100644 --- a/vital_site/vital/views/security_view.py +++ b/vital_site/vital/views/security_view.py @@ -20,6 +20,7 @@ import os import signal import json +from random import randint config_ini = ConfigParser.ConfigParser() config_ini.optionxform=str @@ -63,11 +64,7 @@ def register(request): user.sftp_account = user.email[:user.email.find('@')] user.sftp_pass = user.password # workaround to set sftp account user.set_password(user.password) # hashes the password -<<<<<<< HEAD - activation_code = str(uuid.uuid4()).replace('-', '') -======= activation_code = str(randint(100000, 999999)) ->>>>>>> master user.activation_code = activation_code #TODO temporary fix until sftp issue solved @@ -133,7 +130,7 @@ def activate(request): logger.debug('activated..'+user.email) form = Authentication_Form() # return render(request, 'vital/login.html', {'form': form }) - return redirect('/vital') + return redirect('/') else: message = 'Please check your activation code' else: @@ -179,7 +176,7 @@ def reset_password(request): user.save() update_session_auth_hash(request, user) - return redirect('/vital') # change here to home page + return redirect('/') # change here to home page else: logger.debug(form.cleaned_data['user_email']+'-'+form.cleaned_data['activation_code']) user = VLAB_User.objects.get(email=form.cleaned_data['user_email']) @@ -199,7 +196,7 @@ def reset_password(request): user.save() update_session_auth_hash(request, user) - return redirect('/vital') # change here to home page + return redirect('/') # change here to home page else: error_message = 'Please use the link sent to you in your email' else: @@ -250,7 +247,7 @@ def login(request): if user.is_active: django_login(request, user) audit(request, 'User logged in') - return redirect('/vital') + return redirect('/') else: form = User_Activation_Form(initial={'user_email': user.email}) return render(request, 'vital/user_registration_validate.html', @@ -290,7 +287,7 @@ def logout(request): logger.debug(">>>>>>>>>>>>>>>>>>" + str(request.user)) audit(request, 'User logged out') django_logout(request) - return redirect('/vital/login') + return redirect('/login') def stop_vms_during_logout(user): @@ -307,15 +304,15 @@ def stop_vms_during_logout(user): return all_vms_shutdown -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def index(request): logger.debug("In index") user = request.user if not user.is_faculty and not user.is_admin: - return redirect('/vital/courses/registered') # change here to home page + return redirect('/courses/registered') # change here to home page elif user.is_faculty: logger.debug('user is a faculty') - return redirect('/vital/courses/advising') # change here to home page + return redirect('/courses/advising') # change here to home page else: logger.debug('user is admin') diff --git a/vital_site/vital/views/student_view.py b/vital_site/vital/views/student_view.py index fc6255ca..7e3a9efe 100644 --- a/vital_site/vital/views/student_view.py +++ b/vital_site/vital/views/student_view.py @@ -20,7 +20,7 @@ config_ini.read("/home/vital/config.ini") -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def registered_courses(request): """ lists all registered courses for logged in user @@ -39,7 +39,7 @@ def registered_courses(request): return render(request, 'vital/registered_courses.html', {'reg_courses': reg_courses, 'message':message}) -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def virtual_machines(request, course_id): """ lists all VMs of the selected course @@ -72,7 +72,7 @@ def virtual_machines(request, course_id): return render_to_response('vital/virtual_machines.html', params) -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def course_vms(request, course_id): """ Stub method for rendering course Page @@ -88,7 +88,7 @@ def course_vms(request, course_id): return render(request, 'vital/course_vms.html', params) -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def console(request, vm_id): """ fetches terminal port and server name for novnc console @@ -154,7 +154,7 @@ def vm_create_websockify_token(config, started_vm): except Exception as e: raise e -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def start_vm(request, course_id, vm_id): """ starts the specified VM @@ -186,21 +186,21 @@ def start_vm(request, course_id, vm_id): # start_novnc(config, started_vm) vm_create_websockify_token(config, started_vm) audit(request, 'Started Virtual machine ' + str(vm.name)) - return redirect('/vital/courses/' + course_id + '/vms?message=' + vm.name + ' VM started') + return redirect('/courses/' + course_id + '/vms?message=' + vm.name + ' VM started') except Virtual_Machine.DoesNotExist as e: logger.error(str(e)) audit(request, 'Error starting Virtual machine ' + str(vm_id) + '( Does not exist )') - return redirect('/vital/courses/' + course_id + '/vms?message=Unable to start VM - ' + vm.name) + return redirect('/courses/' + course_id + '/vms?message=Unable to start VM - ' + vm.name) except Exception as e: logger.error(str(e)) audit(request, 'Error starting Virtual machine ' + str(vm.name) + '( ' + e.message + ' )') if 'Connection refused' not in str(e).rstrip() or started_vm is not None: XenClient().remove_network_bridges(vm.xen_server, request.user, course_id, vm_id) XenClient().stop_vm(started_vm['xen_server'], request.user, course_id, vm_id) - return redirect('/vital/courses/' + course_id + '/vms?message=Unable to start VM - ' + vm.name) + return redirect('/courses/' + course_id + '/vms?message=Unable to start VM - ' + vm.name) -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def stop_vm(request, course_id, vm_id): """ stops the specified VM @@ -232,13 +232,13 @@ def stop_vm(request, course_id, vm_id): # config.save() # vm.delete() audit(request, 'Stopped Virtual machine ' + str(virtual_machine.name)) - return redirect('/vital/courses/' + course_id + '/vms?message=VM stopped...') + return redirect('/courses/' + course_id + '/vms?message=VM stopped...') except Exception as e: audit(request, 'Error stopping Virtual machine ' + str(virtual_machine.name)+'('+e.message+')') raise e -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def rebase_vm(request, course_id, vm_id): """ rebase the specified VM to initial state @@ -261,10 +261,10 @@ def rebase_vm(request, course_id, vm_id): except Exception as e: audit(request, 'Error re-imaged Virtual machine ' + str(virtual_machine.name)) raise e - return redirect('/vital/courses/' + course_id + '/vms?message=VM rebased to initial state..') + return redirect('/courses/' + course_id + '/vms?message=VM rebased to initial state..') -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def register_for_course(request): """ creates necessary VMs for the specified course @@ -296,7 +296,7 @@ def register_for_course(request): registered_course = Registered_Course(course_id=course.id, user_id=user.id) registered_course.save() audit(request, 'Registered for course ' + str(course.name)) - return redirect('/vital/courses/registered/') + return redirect('/courses/registered/') else: audit(request, 'Error registering for course ' + str(course.name) + ' (Inactive/Capacity Full)') error_message = 'The course is either inactive or has reached its maximum student capacity.' @@ -307,7 +307,7 @@ def register_for_course(request): return render(request, 'vital/course_register.html', {'form': form, 'error_message': error_message}) -@login_required(login_url='/vital/login/') +@login_required(login_url='/login/') def unregister_from_course(request, course_id): """ removes all VMs attached to a selected course and removes course finally from the users profile @@ -325,14 +325,16 @@ def unregister_from_course(request, course_id): vms = User_VM_Config.objects.filter(user_id=request.user.id, vm_id__in=course_to_remove.course.virtual_machine_set.all()) + logger.debug("HERE") if len(vms) > 0: for vm_conf in vms: stop_vm(request, course_id, vm_conf.vm.id) - + logger.debug("HERE") XenClient().unregister_student_vms(request.user, course_to_remove.course) audit(request, 'Un-registered from course ' + str(course.name)) + logger.debug("HERE") course_to_remove.delete() - return redirect('/vital/courses/registered/') + return redirect('/courses/registered/') except Exception as e: audit(request, 'Error while Un-registering from course ' + str(course.name)+' ('+e.message+')') raise e diff --git a/vital_site/vital_site/urls.py b/vital_site/vital_site/urls.py index 59bad8e1..b9a9bd8d 100644 --- a/vital_site/vital_site/urls.py +++ b/vital_site/vital_site/urls.py @@ -17,7 +17,8 @@ from django.contrib import admin urlpatterns = [ - url(r'^vital/', include('vital.urls')), + #url(r'^vital/', include('vital.urls')), + url(r'', include('vital.urls')), url(r'^admin/', admin.site.urls), url(r'^captcha/', include('captcha.urls')), url(r'session_security/', include('session_security.urls')),