Merge branch 'master' of ase.cs.columbia.edu:halo

Jonathan Bell [2011-11-02 14:57:48]
Merge branch 'master' of ase.cs.columbia.edu:halo

Conflicts:
	halo-se-feature/feature.xml
	halo-update-site/artifacts.jar
	halo-update-site/content.jar
	halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar
	halo-update-site/site.xml
Filename
halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AdminService.java
halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/UserService.java
halo-se-admin/META-INF/MANIFEST.MF
halo-se-admin/MyMailServer.txt
halo-se-admin/lib/halo-common.jar
halo-se-admin/src/edu/columbia/cs/psl/halo/admin/UserLoader.java
halo-se-admin/students.csv
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUser.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUserResponse.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminService.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminServiceService.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/CourseServiceService.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/LogServiceService.java
halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/UserServiceService.java
halo-se-feature/feature.xml
halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java
halo-update-site/artifacts.jar
halo-update-site/content.jar
halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.0.jar
halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.1.jar
halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.2.jar
halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.3.jar
halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.0.jar
halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.1.jar
halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.2.jar
halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.3.jar
halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar
halo-update-site/install.html
halo-update-site/next.jpg
halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101523.jar
halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101716.jar
halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101719.jar
halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110102242.jar
halo-update-site/select-install.png
halo-update-site/site.xml
halo-update-site/untitled.jpg
halo-update-site/update site.jpg
halo_se_web/.project
halo_se_web/.settings/org.eclipse.mylyn.tasks.ui.prefs
halo_se_web/__init__.pyc
halo_se_web/backends.py
halo_se_web/halo_admin/__init__.py
halo_se_web/halo_admin/models.py
halo_se_web/halo_admin/static/css/course_admin.css
halo_se_web/halo_admin/static/css/dashboard.css
halo_se_web/halo_admin/tests.py
halo_se_web/halo_admin/urls.py
halo_se_web/halo_admin/util.py
halo_se_web/halo_admin/views.py
halo_se_web/halo_web/models.py
halo_se_web/halo_web/models_backup.py
halo_se_web/halo_web/settings.py
halo_se_web/halo_web/urls.py
halo_se_web/halo_web/views.py
halo_se_web/login/__init__.py
halo_se_web/login/models.py
halo_se_web/login/tests.py
halo_se_web/login/views.py
halo_se_web/media/__init__.py
halo_se_web/media/models.py
halo_se_web/media/tests.py
halo_se_web/media/urls.py
halo_se_web/media/views.py
halo_se_web/settings.py
halo_se_web/settings.pyc
halo_se_web/src/halo_se_web/__init__.pyc
halo_se_web/src/halo_se_web/settings.pyc
halo_se_web/templates/halo_admin/assignment_admin.html
halo_se_web/templates/halo_admin/course_admin.html
halo_se_web/templates/halo_admin/dashboard.html
halo_se_web/templates/halo_web/index.html
halo_se_web/templates/halo_web/quests.html
halo_se_web/templates/login/credentials.html
halo_se_web/templates/login/login.html
halo_se_web/templates/login/splash.html
halo_se_web/templates/login/success.html
halo_se_web/templates/media/css/admin/dashboard.css
halo_se_web/urls.py
halo_se_web/urls.pyc
diff --git a/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AdminService.java b/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AdminService.java
index 4f6891d..3fe7399 100644
--- a/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AdminService.java
+++ b/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/AdminService.java
@@ -1,5 +1,6 @@
 package edu.columbia.cs.psl.halo.server;

+import java.util.Date;
 import java.util.List;

 import javax.annotation.security.RolesAllowed;
@@ -10,7 +11,9 @@ import javax.persistence.criteria.CriteriaQuery;
 import edu.columbia.cs.psl.halo.entity.Assignment;
 import edu.columbia.cs.psl.halo.entity.Course;
 import edu.columbia.cs.psl.halo.entity.Enrollment;
+import edu.columbia.cs.psl.halo.entity.EnrollmentType;
 import edu.columbia.cs.psl.halo.entity.Quest;
+import edu.columbia.cs.psl.halo.entity.QuestProgress;
 import edu.columbia.cs.psl.halo.entity.Task;
 import edu.columbia.cs.psl.halo.entity.User;

@@ -19,6 +22,40 @@ import edu.columbia.cs.psl.halo.entity.User;
 @RolesAllowed("ADMIN")
 public class AdminService extends AbstractFacade<User> {

+	public void addUser(String first, String last, String email, String password)
+	{
+		Course c = getEntityManager().find(Course.class, 1);
+
+		User u = new User();
+		u.setFirstName(first);
+		u.setLastName(last);
+		u.setEmail(email);
+		u.setPassword(UserService.getEncryptedPassword(password));
+		u.setXp(0);
+		getEntityManager().persist(u);
+
+		Enrollment e = new Enrollment();
+		e.setUser(u);
+		e.setCourse(c);
+		e.setType(EnrollmentType.STUDENT);
+
+		getEntityManager().persist(e);
+
+		javax.persistence.criteria.CriteriaQuery<Task> cq = getEntityManager().getCriteriaBuilder().createQuery(Task.class);
+        cq.select(cq.from(Task.class));
+        for(Task t : getEntityManager().createQuery(cq).getResultList())
+		{
+			QuestProgress p = new QuestProgress();
+			p.setUser(u);
+			p.setTask(t);
+			p.setQuest(t.getQuest());
+			p.setUpdated(new Date());
+			p.setCompleted(false);
+			getEntityManager().persist(p);
+
+
+		}
+	}
 	@SuppressWarnings({ "rawtypes", "unchecked" })
 	public List<Course> getCourses()
 	{
diff --git a/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/UserService.java b/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/UserService.java
index ff244eb..b79f35f 100644
--- a/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/UserService.java
+++ b/halo-EJB/ejbModule/edu/columbia/cs/psl/halo/server/UserService.java
@@ -84,13 +84,29 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     	getEntityManager().merge(qp);
     	String ret = handleResults(t.getResultsIn());
     	User me = getUser();
-    	me.setXp(me.getXp() + t.getQuest().getExperiencePoints());
-    	if(t.getQuest().getExperiencePoints() > 0)
-    		ret += "You've received " + t.getQuest().getExperiencePoints() + " XP\n";
-    	if(me.getLevel().getXpMax() <= me.getXp())
+    	List<QuestProgress> done = me.getProgress();
+    	boolean allDone = true;
+    	for(Task tz : t.getQuest().getTasks())
     	{
-    		me.setLevel(getLevel(me.getLevel().getLevel() + 1));
-    		ret += "You've reached level " + me.getLevel().getLevel()+", hooray!\n";
+    		boolean found = false;
+    		for(QuestProgress qpz : done)
+    		{
+    			if(qpz.getTask().getId()==tz.getId())
+    				found = true;
+    		}
+    		if(!found)
+    			allDone = false;
+    	}
+    	if(allDone)
+    	{
+	    	me.setXp(me.getXp() + t.getQuest().getExperiencePoints());
+	    	if(t.getQuest().getExperiencePoints() > 0)
+	    		ret += "You've received " + t.getQuest().getExperiencePoints() + " XP\n";
+	    	if(me.getLevel().getXpMax() <= me.getXp())
+	    	{
+	    		me.setLevel(getLevel(me.getLevel().getLevel() + 1));
+	    		ret += "You've reached level " + me.getLevel().getLevel()+", hooray!\n";
+	    	}
     	}
     	getEntityManager().merge(me);

@@ -321,7 +337,7 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
     }
     private final static String HEX_DIGITS = "0123456789abcdef";

-	private String getEncryptedPassword(String plaintext) {
+	public static String getEncryptedPassword(String plaintext) {

 		java.security.MessageDigest d =null;
 				try {
@@ -461,7 +477,16 @@ public class UserService extends AbstractFacade<User> implements UserServiceRemo
 	@WebMethod
 	public String getLeadersStr()
 	{
-		return "(By XP points; top 10)\n1. Jon Bell (300) \n2. Swapneel Sheth (200) \n3. Nipun Arora (150)";
+		String r = "(By XP points; top 10)\n";
+		Query q = getEntityManager().createNativeQuery("SELECT * from h_user order by XP DESC, ID ASC LIMIT 10",User.class);
+		List<User> res = q.getResultList();
+		int i = 1;
+		for(User u : res)
+		{
+			r+=i+": " + u.getFirstName() + " " + u.getLastName() + " (" + u.getXp()+")\n";
+			i++;
+		}
+		return r;
 	}
 	public static void reportError(Exception ex, String message)
 	{
diff --git a/halo-se-admin/META-INF/MANIFEST.MF b/halo-se-admin/META-INF/MANIFEST.MF
index bde12ae..02d0e3d 100644
--- a/halo-se-admin/META-INF/MANIFEST.MF
+++ b/halo-se-admin/META-INF/MANIFEST.MF
@@ -14,7 +14,8 @@ Require-Bundle: org.eclipse.ui,
  javax.xml.soap;bundle-version="1.2.0",
  org.eclipse.swt,
  org.eclipse.jface,
- org.eclipse.ui.workbench
+ org.eclipse.ui.workbench,
+ javax.mail;bundle-version="1.4.0"
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-1.6
 Bundle-ClassPath: .,
diff --git a/halo-se-admin/MyMailServer.txt b/halo-se-admin/MyMailServer.txt
new file mode 100644
index 0000000..3f8c63d
--- /dev/null
+++ b/halo-se-admin/MyMailServer.txt
@@ -0,0 +1,20 @@
+# Configuration file for javax.mail
+# If a value for an item is not provided, then
+# system defaults will be used. These items can
+# also be set in code.
+
+# Host whose mail services will be used
+# (Default value : localhost)
+mail.host=mx.columbia.edu
+
+# Return address to appear on emails
+# (Default value : username@host)
+mail.from=jbell@cs.columbia.edu
+
+# Other possible items include:
+# mail.user=
+# mail.store.protocol=
+# mail.transport.protocol=
+# mail.smtp.host=
+# mail.smtp.user=
+# mail.debug=
\ No newline at end of file
diff --git a/halo-se-admin/lib/halo-common.jar b/halo-se-admin/lib/halo-common.jar
index 0973dc6..98196bb 100644
Binary files a/halo-se-admin/lib/halo-common.jar and b/halo-se-admin/lib/halo-common.jar differ
diff --git a/halo-se-admin/src/edu/columbia/cs/psl/halo/admin/UserLoader.java b/halo-se-admin/src/edu/columbia/cs/psl/halo/admin/UserLoader.java
new file mode 100644
index 0000000..f083519
--- /dev/null
+++ b/halo-se-admin/src/edu/columbia/cs/psl/halo/admin/UserLoader.java
@@ -0,0 +1,108 @@
+package edu.columbia.cs.psl.halo.admin;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+import java.util.Scanner;
+
+import javax.mail.Message;
+import javax.mail.Message.RecipientType;
+import javax.mail.MessagingException;
+import javax.mail.Session;
+import javax.mail.Transport;
+import javax.mail.internet.InternetAddress;
+import javax.mail.internet.MimeMessage;
+
+import edu.columbia.cs.psl.halo.HALOServiceFactory;
+import edu.columbia.cs.psl.halo.server.stubs.AdminService;
+import edu.columbia.cs.psl.halo.server.stubs.AdminServiceService;
+
+public class UserLoader {
+	public static void main(String[] args) throws Exception{
+//		HALOServiceFactory.getInstance().login("jon", "test123");
+		File f = new File("students.csv");
+		Scanner s = new Scanner(f);
+		while(s.hasNextLine())
+		{
+			String l = s.nextLine();
+			String[] a = l.split(",");
+//			HALOServiceFactory.getInstance().getAdminSvc().addUser(a[1],a[0],a[2],a[3]);
+			String msg = "Dear FIRST_N LAST_N,\n"+
+"Please find your login for HALO-SE below, as well as a link to installation instructions. While it is not mandatory that you use HALO to help with your upcoming assignment, we would encourage you to give it a try - it is designed to help you ensure that you fully accomplish the requirements of the assignment and receive full credit.\n\n"+
+
+"Your username is: UNI\n"+
+"Your password is: PASSWORD\n"+
+"(Note that once you login, you can change your password to whatever you like)\n\n"+
+
+"You can find detailed installation instructions here:Êhttp://ase.cs.columbia.edu/halo-update/install.html\n\n"+
+
+"If you have any problems using HALO-SE, please do not hesitate to contact me directly.\n\n"+
+
+"Best,\nJon Bell";
+			msg  = msg.replace("FIRST_N", a[1]).replace("LAST_N", a[0]).replace("UNI", a[2]).replace("PASSWORD", a[3]);
+//			System.out.println(msg);
+			sendEmail("jbell@cs.columbia.edu", a[2]+"@columbia.edu", "COMS 3134: HALO Installation Info & Login Credentials", msg);
+//			System.exit(0);
+		}
+	}
+	  private static Properties fMailServerConfig = new Properties();
+
+	  static {
+		    fetchConfig();
+		  }
+
+		  /**
+		  * Open a specific text file containing mail server
+		  * parameters, and populate a corresponding Properties object.
+		  */
+		  private static void fetchConfig() {
+		    InputStream input = null;
+		    try {
+		      //If possible, one should try to avoid hard-coding a path in this
+		      //manner; in a web application, one should place such a file in
+		      //WEB-INF, and access it using ServletContext.getResourceAsStream.
+		      //Another alternative is Class.getResourceAsStream.
+		      //This file contains the javax.mail config properties mentioned above.
+		      input = new FileInputStream( "/Users/jon/Documents/PSL/Projects/halo-eclipse/halo-se-admin/MyMailServer.txt" );
+		      fMailServerConfig.load( input );
+		    }
+		    catch ( IOException ex ){
+		      System.err.println("Cannot open and load mail server properties file.");
+		    }
+		    finally {
+		      try {
+		        if ( input != null ) input.close();
+		      }
+		      catch ( IOException ex ){
+		        System.err.println( "Cannot close mail server properties file." );
+		      }
+		    }
+		  }
+	public static void sendEmail(
+		    String aFromEmailAddr, String aToEmailAddr,
+		    String aSubject, String aBody
+		  ){
+		    //Here, no Authenticator argument is used (it is null).
+		    //Authenticators are used to prompt the user for user
+		    //name and password.
+		    Session session = Session.getDefaultInstance( fMailServerConfig, null );
+		    MimeMessage message = new MimeMessage( session );
+		    try {
+		      //the "from" address may be set in code, or set in the
+		      //config file under "mail.from" ; here, the latter style is used
+		      //message.setFrom( new InternetAddress(aFromEmailAddr) );
+		      message.addRecipient(
+		        Message.RecipientType.TO, new InternetAddress(aToEmailAddr)
+		      );
+		      message.addRecipient(Message.RecipientType.BCC, new InternetAddress("jbell@cs.columbia.edu"));
+		      message.setSubject( aSubject );
+		      message.setText( aBody );
+		      Transport.send( message );
+		    }
+		    catch (MessagingException ex){
+		      System.err.println("Cannot send email. " + ex);
+		    }
+		  }
+}
diff --git a/halo-se-admin/students.csv b/halo-se-admin/students.csv
new file mode 100644
index 0000000..9318534
--- /dev/null
+++ b/halo-se-admin/students.csv
@@ -0,0 +1 @@
+Al-Syed,Abdullah,aza2105,dEPer8fa
Artemiou,Vasilios,va2265,28ECuZus
Becker,Joseph,jmb2297,phEn8trA
Bell,Daniel,dpb2121,tHu7ajAz
Benitez,Jamie,jab2314,F52SWuju
Bleuel,Nicole,nkb2115,MecHe2e3
Bose,Koel,kab2186,P5WuPE8p
Cao,Jeff,jhc2154,stekEz3K
Castellucci,Francis,fvc2105,TrAs9e9r
Chang,Victor,vc2281,WRuKa44u
Chao,David,dkc2110,sW8CRega
Chen,Sitian,sc3235,kasAtuQ7
Chong,Hahn,hc2361,Ke2eC2fR
Cohen,David,Dec-43,qej8QeDr
Damian,Mijael,mad2222,PHa4EsP2
Davis,Wesley,wbd2103,gEstat2x
Dong,James,jpd2152,chUv6pet
Erkilic,Mehmet,me2419,SwustEd3
Eum,Julianna,jme2134,fR97reXA
Evans,Benjamin,bse2105,zUsw56uf
Fells,Johnny,jf2608,4ut8eSpe
Guo,Hong,hg2269,6H9tachU
Jacobs,Ernesto,ewj2110,sTab7nun
Jung,SeungJun,sj2453,9ruchAvE
Kim,Bora,bk2380,S4EDrux2
Kim,SungHwan,sk3408,2r2yUsWu
Kolodzinski,Anthony,aak2166,c6SPeSte
Kotliar,Dylan,dak2135,naTH7fUP
Lee,Albert,akl2140,3axa5edR
Lee,Connie,cfl2119,bAWra8E4
Lee,Jin,jl3455,2REmuj3b
Lee,Kevin,kwl2116,7rE6utre
Lubat,Jonathan,jil2124,heb4ehA2
Marsocci,Michael,mkm2154,puXaF5Ek
Narayan,Ram,rsn2115,2eSWAwru
Nertomb,Leslie,ln2250,wr9bRUSt
Ramachandran,Abhimanyu,ar3015,fUwagE8P
Rastogi,Sumit,sar2161,B26raswU
Shin,SooHyun,ss3751,PEva4uBr
Stappenbeck,Corey,ccs2135,vE7eCaZu
Sun,Jerry,js4016,ruraDR9w
Taku,Maria,mat2185,chugARe4
Tay,QiXiu,qt2106,PhESwe9h
Vel,Ponni,pvv2001,dREPr9Ph
Wang,Qiurui,qw2128,9espEvU3
Wu,Kelly,kjw2130,3UH3wRuS
Xu,Xin,xx2135,tRAnep6e
Yang,LingKai,ly2243,dA4r6cuq
Yoon,Richard,ry2201,quX4gexe
Zech,John,jrz2111,BrEB9pR4
Zhu,Yuexin,yz2362,stekEz3K
\ No newline at end of file
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUser.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUser.java
new file mode 100644
index 0000000..90920c2
--- /dev/null
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUser.java
@@ -0,0 +1,147 @@
+
+package edu.columbia.cs.psl.halo.server.stubs;
+
+import java.io.Serializable;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+import edu.columbia.cs.psl.halo.server.wrapper.EqualsHashCodeProvider;
+
+
+/**
+ * <p>Java class for addUser complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="addUser">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *         &lt;element name="arg0" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *         &lt;element name="arg1" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *         &lt;element name="arg2" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *         &lt;element name="arg3" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *       &lt;/sequence>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "addUser", propOrder = {
+    "arg0",
+    "arg1",
+    "arg2",
+    "arg3"
+})
+public class AddUser
+    extends EqualsHashCodeProvider
+    implements Serializable
+{
+
+    private final static long serialVersionUID = 100L;
+    protected String arg0;
+    protected String arg1;
+    protected String arg2;
+    protected String arg3;
+
+    /**
+     * Gets the value of the arg0 property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getArg0() {
+        return arg0;
+    }
+
+    /**
+     * Sets the value of the arg0 property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setArg0(String value) {
+        this.arg0 = value;
+    }
+
+    /**
+     * Gets the value of the arg1 property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getArg1() {
+        return arg1;
+    }
+
+    /**
+     * Sets the value of the arg1 property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setArg1(String value) {
+        this.arg1 = value;
+    }
+
+    /**
+     * Gets the value of the arg2 property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getArg2() {
+        return arg2;
+    }
+
+    /**
+     * Sets the value of the arg2 property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setArg2(String value) {
+        this.arg2 = value;
+    }
+
+    /**
+     * Gets the value of the arg3 property.
+     *
+     * @return
+     *     possible object is
+     *     {@link String }
+     *
+     */
+    public String getArg3() {
+        return arg3;
+    }
+
+    /**
+     * Sets the value of the arg3 property.
+     *
+     * @param value
+     *     allowed object is
+     *     {@link String }
+     *
+     */
+    public void setArg3(String value) {
+        this.arg3 = value;
+    }
+
+}
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUserResponse.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUserResponse.java
new file mode 100644
index 0000000..39890a5
--- /dev/null
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AddUserResponse.java
@@ -0,0 +1,38 @@
+
+package edu.columbia.cs.psl.halo.server.stubs;
+
+import java.io.Serializable;
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlType;
+import edu.columbia.cs.psl.halo.server.wrapper.EqualsHashCodeProvider;
+
+
+/**
+ * <p>Java class for addUserResponse complex type.
+ *
+ * <p>The following schema fragment specifies the expected content contained within this class.
+ *
+ * <pre>
+ * &lt;complexType name="addUserResponse">
+ *   &lt;complexContent>
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
+ *       &lt;sequence>
+ *       &lt;/sequence>
+ *     &lt;/restriction>
+ *   &lt;/complexContent>
+ * &lt;/complexType>
+ * </pre>
+ *
+ *
+ */
+@XmlAccessorType(XmlAccessType.FIELD)
+@XmlType(name = "addUserResponse")
+public class AddUserResponse
+    extends EqualsHashCodeProvider
+    implements Serializable
+{
+
+    private final static long serialVersionUID = 100L;
+
+}
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminService.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminService.java
index f1d8805..8beb6d3 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminService.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminService.java
@@ -40,6 +40,40 @@ public interface AdminService {

     /**
      *
+     * @param arg3
+     * @param arg2
+     * @param arg1
+     * @param arg0
+     */
+    @WebMethod
+    @RequestWrapper(localName = "addUser", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.AddUser")
+    @ResponseWrapper(localName = "addUserResponse", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.AddUserResponse")
+    public void addUser(
+        @WebParam(name = "arg0", targetNamespace = "")
+        String arg0,
+        @WebParam(name = "arg1", targetNamespace = "")
+        String arg1,
+        @WebParam(name = "arg2", targetNamespace = "")
+        String arg2,
+        @WebParam(name = "arg3", targetNamespace = "")
+        String arg3);
+
+    /**
+     *
+     * @param arg0
+     * @return
+     *     returns edu.columbia.cs.psl.halo.server.stubs.User
+     */
+    @WebMethod
+    @WebResult(targetNamespace = "")
+    @RequestWrapper(localName = "updateUser", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.UpdateUser")
+    @ResponseWrapper(localName = "updateUserResponse", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.UpdateUserResponse")
+    public User updateUser(
+        @WebParam(name = "arg0", targetNamespace = "")
+        User arg0);
+
+    /**
+     *
      * @return
      *     returns java.util.List<edu.columbia.cs.psl.halo.server.stubs.Course>
      */
@@ -162,20 +196,6 @@ public interface AdminService {
      *
      * @param arg0
      * @return
-     *     returns edu.columbia.cs.psl.halo.server.stubs.User
-     */
-    @WebMethod
-    @WebResult(targetNamespace = "")
-    @RequestWrapper(localName = "updateUser", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.UpdateUser")
-    @ResponseWrapper(localName = "updateUserResponse", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", className = "edu.columbia.cs.psl.halo.server.stubs.UpdateUserResponse")
-    public User updateUser(
-        @WebParam(name = "arg0", targetNamespace = "")
-        User arg0);
-
-    /**
-     *
-     * @param arg0
-     * @return
      *     returns boolean
      */
     @WebMethod
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminServiceService.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminServiceService.java
index 68942d1..58e1b4f 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminServiceService.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/AdminServiceService.java
@@ -17,7 +17,7 @@ import javax.xml.ws.WebServiceFeature;
  * Generated source version: 2.1
  *
  */
-@WebServiceClient(name = "AdminServiceService", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", wsdlLocation = "http://amos.cs.columbia.edu:18585/AdminServiceService/AdminService?wsdl")
+@WebServiceClient(name = "AdminServiceService", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", wsdlLocation = "http://127.0.0.1:8080/AdminServiceService/AdminService?wsdl")
 public class AdminServiceService
     extends Service
 {
@@ -30,9 +30,9 @@ public class AdminServiceService
         try {
             URL baseUrl;
             baseUrl = edu.columbia.cs.psl.halo.server.stubs.AdminServiceService.class.getResource(".");
-            url = new URL(baseUrl, "http://amos.cs.columbia.edu:18585/AdminServiceService/AdminService?wsdl");
+            url = new URL(baseUrl, "http://127.0.0.1:8080/AdminServiceService/AdminService?wsdl");
         } catch (MalformedURLException e) {
-            logger.warning("Failed to create URL for the wsdl Location: 'http://amos.cs.columbia.edu:18585/AdminServiceService/AdminService?wsdl', retrying as a local file");
+            logger.warning("Failed to create URL for the wsdl Location: 'http://127.0.0.1:8080/AdminServiceService/AdminService?wsdl', retrying as a local file");
             logger.warning(e.getMessage());
         }
         ADMINSERVICESERVICE_WSDL_LOCATION = url;
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/CourseServiceService.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/CourseServiceService.java
index 85b6b5d..c8c8e71 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/CourseServiceService.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/CourseServiceService.java
@@ -17,7 +17,7 @@ import javax.xml.ws.WebServiceFeature;
  * Generated source version: 2.1
  *
  */
-@WebServiceClient(name = "CourseServiceService", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", wsdlLocation = "http://amos.cs.columbia.edu:18585/CourseServiceService/CourseService?wsdl")
+@WebServiceClient(name = "CourseServiceService", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", wsdlLocation = "http://127.0.0.1:8080/CourseServiceService/CourseService?wsdl")
 public class CourseServiceService
     extends Service
 {
@@ -30,9 +30,9 @@ public class CourseServiceService
         try {
             URL baseUrl;
             baseUrl = edu.columbia.cs.psl.halo.server.stubs.CourseServiceService.class.getResource(".");
-            url = new URL(baseUrl, "http://amos.cs.columbia.edu:18585/CourseServiceService/CourseService?wsdl");
+            url = new URL(baseUrl, "http://127.0.0.1:8080/CourseServiceService/CourseService?wsdl");
         } catch (MalformedURLException e) {
-            logger.warning("Failed to create URL for the wsdl Location: 'http://amos.cs.columbia.edu:18585/CourseServiceService/CourseService?wsdl', retrying as a local file");
+            logger.warning("Failed to create URL for the wsdl Location: 'http://127.0.0.1:8080/CourseServiceService/CourseService?wsdl', retrying as a local file");
             logger.warning(e.getMessage());
         }
         COURSESERVICESERVICE_WSDL_LOCATION = url;
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/LogServiceService.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/LogServiceService.java
index a58640b..f6fd872 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/LogServiceService.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/LogServiceService.java
@@ -17,7 +17,7 @@ import javax.xml.ws.WebServiceFeature;
  * Generated source version: 2.1
  *
  */
-@WebServiceClient(name = "LogServiceService", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", wsdlLocation = "http://amos.cs.columbia.edu:18585/LogServiceService/LogService?wsdl")
+@WebServiceClient(name = "LogServiceService", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", wsdlLocation = "http://127.0.0.1:8080/LogServiceService/LogService?wsdl")
 public class LogServiceService
     extends Service
 {
@@ -30,9 +30,9 @@ public class LogServiceService
         try {
             URL baseUrl;
             baseUrl = edu.columbia.cs.psl.halo.server.stubs.LogServiceService.class.getResource(".");
-            url = new URL(baseUrl, "http://amos.cs.columbia.edu:18585/LogServiceService/LogService?wsdl");
+            url = new URL(baseUrl, "http://127.0.0.1:8080/LogServiceService/LogService?wsdl");
         } catch (MalformedURLException e) {
-            logger.warning("Failed to create URL for the wsdl Location: 'http://amos.cs.columbia.edu:18585/LogServiceService/LogService?wsdl', retrying as a local file");
+            logger.warning("Failed to create URL for the wsdl Location: 'http://127.0.0.1:8080/LogServiceService/LogService?wsdl', retrying as a local file");
             logger.warning(e.getMessage());
         }
         LOGSERVICESERVICE_WSDL_LOCATION = url;
diff --git a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/UserServiceService.java b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/UserServiceService.java
index 6b52a76..4e8905b 100644
--- a/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/UserServiceService.java
+++ b/halo-se-common/src/edu/columbia/cs/psl/halo/server/stubs/UserServiceService.java
@@ -17,7 +17,7 @@ import javax.xml.ws.WebServiceFeature;
  * Generated source version: 2.1
  *
  */
-@WebServiceClient(name = "UserServiceService", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", wsdlLocation = "http://amos.cs.columbia.edu:18585/UserServiceService/UserService?wsdl")
+@WebServiceClient(name = "UserServiceService", targetNamespace = "http://server.halo.psl.cs.columbia.edu/", wsdlLocation = "http://127.0.0.1:8080/UserServiceService/UserService?wsdl")
 public class UserServiceService
     extends Service
 {
@@ -30,9 +30,9 @@ public class UserServiceService
         try {
             URL baseUrl;
             baseUrl = edu.columbia.cs.psl.halo.server.stubs.UserServiceService.class.getResource(".");
-            url = new URL(baseUrl, "http://amos.cs.columbia.edu:18585/UserServiceService/UserService?wsdl");
+            url = new URL(baseUrl, "http://127.0.0.1:8080/UserServiceService/UserService?wsdl");
         } catch (MalformedURLException e) {
-            logger.warning("Failed to create URL for the wsdl Location: 'http://amos.cs.columbia.edu:18585/UserServiceService/UserService?wsdl', retrying as a local file");
+            logger.warning("Failed to create URL for the wsdl Location: 'http://127.0.0.1:8080/UserServiceService/UserService?wsdl', retrying as a local file");
             logger.warning(e.getMessage());
         }
         USERSERVICESERVICE_WSDL_LOCATION = url;
diff --git a/halo-se-feature/feature.xml b/halo-se-feature/feature.xml
index 97f2261..7dc7563 100644
--- a/halo-se-feature/feature.xml
+++ b/halo-se-feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="edu.columbia.cs.psl.halo.client"
       label="HALO SE Client Environment"
-      version="1.0.1.5">
+      version="1.0.1.4">

    <description url="http://www.example.com/description">
       [Enter Feature Description here.]
@@ -16,10 +16,6 @@
       [Enter License Description here.]
    </license>

-   <requires>
-      <import plugin="org.eclipse.ui.forms"/>
-   </requires>
-
    <plugin
          id="edu.columbia.cs.psl.halo.client"
          download-size="0"
@@ -27,11 +23,4 @@
          version="0.0.0"
          unpack="false"/>

-   <plugin
-         id="org.eclipse.ui.forms"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
 </feature>
diff --git a/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java b/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java
index 6bed3c7..99c207c 100644
--- a/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java
+++ b/halo-se/src/edu/columbia/cs/psl/halo/client/views/QuestHUD.java
@@ -150,88 +150,6 @@ public class QuestHUD extends ViewPart {
 				}
 			return true;
 		}
-//		@Override
-//		public void sort(Viewer viewer, Object[] elements) {
-//			System.out.println("running sort");
-//			if(elements.length > 0)
-//			{
-//				if(elements[0] instanceof Assignment)
-//				{
-//					ArrayList<Assignment> sorted = new ArrayList<Assignment>(elements.length);
-//					for(Object o : elements)
-//						sorted.add((Assignment) o);
-//					Collections.sort(sorted, new Comparator<Assignment>() {
-//
-//						@Override
-//						public int compare(Assignment o1, Assignment o2) {
-//							boolean o1Done = assignmentCompleted(o1);
-//							boolean o2Done = assignmentCompleted(o2);
-//
-//							if(o1Done && ! o2Done)
-//								return 1;
-//							else if(o2Done && ! o1Done)
-//								return -1;
-//							else if(o1.getDueOn() != null && o2.getDueOn() != null)
-//								return o1.getDueOn().compare(o2.getDueOn());
-//							else
-//								return (o1.getId() < o2.getId() ? -1 : 1);
-//						}
-//					});
-//					for(Assignment a : sorted)
-//					{
-//						System.out.println(a.getTitle());
-//					}
-//					elements = sorted.toArray();
-//				}
-//				else if (elements[0] instanceof Quest) {
-//					ArrayList<Quest> sorted = new ArrayList<Quest>(elements.length);
-//					for(Object o : elements)
-//						sorted.add((Quest) o);
-//					Collections.sort(sorted, new Comparator<Quest>() {
-//
-//						@Override
-//						public int compare(Quest o1, Quest o2) {
-//							boolean o1Done = questCompleted(o1);
-//							boolean o2Done = questCompleted(o2);
-//
-//							if(o1Done && ! o2Done)
-//								return 1;
-//							else if(o2Done && ! o1Done)
-//								return -1;
-//							else
-//								return (o1.getId() < o2.getId() ? -1 : 1);
-//						}
-//					});
-//					System.out.println(sorted);
-//					elements = sorted.toArray();
-//				}
-//				else if(elements[0] instanceof Task)
-//				{
-//					ArrayList<Task> sorted = new ArrayList<Task>(elements.length);
-//					for(Object o : elements)
-//						sorted.add((Task) o);
-//					Collections.sort(sorted, new Comparator<Task>() {
-//
-//						@Override
-//						public int compare(Task o1, Task o2) {
-//							if(!cachedProgress.containsKey(o1) || !cachedProgress.containsKey(o2))
-//								return 0;
-//							boolean o1Done = cachedProgress.get(o1).isCompleted();
-//							boolean o2Done = cachedProgress.get(o2).isCompleted();
-//
-//							if(o1Done && ! o2Done)
-//								return -1;
-//							else if(o2Done && ! o1Done)
-//								return 1;
-//							else
-//								return (o1.getId() < o2.getId() ? -1 : 1);
-//						}
-//					});
-//					System.out.println(sorted);
-//					elements = sorted.toArray();
-//				}
-//			}
-//		}
 	}

 	class QuestDetails extends Composite {
@@ -306,9 +224,8 @@ public class QuestHUD extends ViewPart {
 			backgroundHeader.setText("Task Details");
 			questDueDate.setText("(Part of " + ((Quest) t.getQuest().getRef()).getName() +")");

-			String objectives = "";
-			objectivesHeader.setText("Quest Background");
-			objectivesBody.setText(((Quest) t.getQuest().getRef()).getDescription());
+			objectivesHeader.setText("");
+			objectivesBody.setText("");
 			refreshLayout();
 		}
 		private void refreshLayout()
@@ -319,16 +236,16 @@ public class QuestHUD extends ViewPart {
 					SWT.DEFAULT));
 			getParent().layout(true,true);
 		}
-		public void setQuest(QuestWrapper w) {
-			questTitle.setText(w.getQuest().getName());
-			questDueDate.setText("(Part of " + w.getAssignment().getTitle()
-					+ ", due " + w.getDueStrHuman() + ")");
-			questBackground.setText(w.getQuest().getDescription());
+		public void setQuest(Quest w) {
+			questTitle.setText(w.getName());
+			questDueDate.setText("(Part of " + ((Assignment) w.getAssignment().getRef()).getTitle()
+					+ ", due " + QuestWrapper.getDueStrHuman((Assignment) w.getAssignment().getRef()) + ")");
+			questBackground.setText(w.getDescription() + "\nCompleting this quest will reward you with " + w.getExperiencePoints() + " XP");
 			backgroundHeader.setText("Background");

 			String objectives = "";

-			for (Task t : w.getQuest().getTasks()) {
+			for (Task t : w.getTasks()) {
 				objectives += t.getName() + "\n";
 			}
 			objectivesHeader.setText("Objectives");
@@ -710,18 +627,18 @@ public class QuestHUD extends ViewPart {
 						if (event.getSelection() instanceof IStructuredSelection) {
 							IStructuredSelection selection = (IStructuredSelection) event
 									.getSelection();
-							QuestWrapper qw = null;
+//							QuestWrapper qw = null;
 							if ((selection.getFirstElement()) instanceof Quest) {
 //								System.out.println(((Quest) selection.getFirstElement()).getId());
-								qw = quests.get(((Quest) selection.getFirstElement()).getId());
-								if(qw == null)
-								{
-									questsViewer.setSelection(null);
-									return;
-								}
-								Activator.logBackground("QuestHUDQuestOrTaskSelected", "" + qw.getQuest().getId());
+								Quest q = ((Quest) selection.getFirstElement());
+//								if(qw == null)
+//								{
+//									questsViewer.setSelection(null);
+//									return;
+//								}
+								Activator.logBackground("QuestHUDQuestOrTaskSelected", "" + q.getId());
 								detailsLayout.topControl = questDetailsScroller;
-								questDetails.setQuest(qw);
+								questDetails.setQuest(q);
 								refreshLayout();
 							}
 							else if((selection.getFirstElement()) instanceof Task) {
diff --git a/halo-update-site/artifacts.jar b/halo-update-site/artifacts.jar
index 9d700ab..7db8b6c 100644
Binary files a/halo-update-site/artifacts.jar and b/halo-update-site/artifacts.jar differ
diff --git a/halo-update-site/content.jar b/halo-update-site/content.jar
index 0f9ca86..07f0bad 100644
Binary files a/halo-update-site/content.jar and b/halo-update-site/content.jar differ
diff --git a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.0.jar b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.0.jar
deleted file mode 100644
index 1511b88..0000000
Binary files a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.0.jar and /dev/null differ
diff --git a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.1.jar b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.1.jar
deleted file mode 100644
index 17c5516..0000000
Binary files a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.1.jar and /dev/null differ
diff --git a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.2.jar b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.2.jar
deleted file mode 100644
index ae609c9..0000000
Binary files a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.2.jar and /dev/null differ
diff --git a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.3.jar b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.3.jar
deleted file mode 100644
index 6076a01..0000000
Binary files a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.0.3.jar and /dev/null differ
diff --git a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.0.jar b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.0.jar
deleted file mode 100644
index 5ff920e..0000000
Binary files a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.0.jar and /dev/null differ
diff --git a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.1.jar b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.1.jar
deleted file mode 100644
index 9cda8f7..0000000
Binary files a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.1.jar and /dev/null differ
diff --git a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.2.jar b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.2.jar
deleted file mode 100644
index fc738a1..0000000
Binary files a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.2.jar and /dev/null differ
diff --git a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.3.jar b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.3.jar
deleted file mode 100644
index b6fa1a6..0000000
Binary files a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.3.jar and /dev/null differ
diff --git a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar
index 28e23df..af26617 100644
Binary files a/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar and b/halo-update-site/features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar differ
diff --git a/halo-update-site/install.html b/halo-update-site/install.html
new file mode 100644
index 0000000..b399bcc
--- /dev/null
+++ b/halo-update-site/install.html
@@ -0,0 +1,63 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<title>HALO SE Installation Instructions</title>
+<style type="text/css">
+<!--
+body {
+	font: 100% Verdana, Arial, Helvetica, sans-serif;
+	background: #666666;
+	margin: 0; /* it's good practice to zero the margin and padding of the body element to account for differing browser defaults */
+	padding: 0;
+	text-align: center; /* this centers the container in IE 5* browsers. The text is then set to the left aligned default in the #container selector */
+	color: #000000;
+}
+.oneColElsCtr #container {
+	width: 46em;
+	background: #FFFFFF;
+	margin: 0 auto; /* the auto margins (in conjunction with a width) center the page */
+	border: 1px solid #000000;
+	text-align: left; /* this overrides the text-align: center on the body element. */
+}
+.oneColElsCtr #mainContent {
+	padding: 0 20px; /* remember that padding is the space inside the div box and margin is the space outside the div box */
+}
+-->
+</style></head>
+
+<body class="oneColElsCtr">
+
+<div id="container">
+  <div id="mainContent">
+    <h1>Installing HALO-SE</h1>
+    <p>Follow these simple steps to get started using HALO-SE</p>
+    <ol>
+      <li>Start eclipse.</li>
+      <li>Open the &quot;Help&quot; menu, then select &quot;Install new software...&quot;
+        <ol>
+          <li><img src="select-install.png" alt="" width="641" height="239" /></li>
+        </ol>
+      </li>
+      <li>Click on &quot;Add...&quot; next to &quot;Work with&quot;</li>
+      <li>Enter &quot;HALO&quot; for name, and &quot;http://ase.cs.columbia.edu/halo-update&quot; for Location
+        <ol>
+          <li><img src="update site.jpg" alt="" width="468" height="91" /></li>
+        </ol>
+      </li>
+      <li>Click &quot;OK&quot;, and then click the checkbox next to &quot;HALO-SE&quot;, and &quot;Next &gt;&quot;
+        <ol>
+          <li><img src="next.jpg" alt="" width="551" height="385" /></li>
+        </ol>
+      </li>
+      <li>Click &quot;Next&quot; again, and then accept the license agreement, and select &quot;Finish&quot;</li>
+      <li>Click &quot;OK&quot; through the security warning</li>
+      <li>Select &quot;Restart Now&quot; once the installation completes</li>
+      <li>When Eclipse restarts, you should see a &quot;HALO Dashboard&quot; tab on the bottom, and a &quot;HALO Quests&quot; tab on the right. If you do not see these, go to the &quot;Window&quot; menu, and select &quot;Reset Perspective&quot;</li>
+      <li>Login with your UNI for username, and the password that was emailed to you.</li>
+    </ol>
+    <p>If you have any problems or general feedback for HALO, please email <a href="mailto:jbell@cs.columbia.edu">Jon Bell</a>.</p>
+  </div>
+</div>
+</body>
+</html>
diff --git a/halo-update-site/next.jpg b/halo-update-site/next.jpg
new file mode 100644
index 0000000..3987471
Binary files /dev/null and b/halo-update-site/next.jpg differ
diff --git a/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101523.jar b/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101523.jar
deleted file mode 100644
index 776200d..0000000
Binary files a/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101523.jar and /dev/null differ
diff --git a/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101716.jar b/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101716.jar
deleted file mode 100644
index dbb88ce..0000000
Binary files a/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101716.jar and /dev/null differ
diff --git a/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101719.jar b/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101719.jar
deleted file mode 100644
index 01e7a8c..0000000
Binary files a/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110101719.jar and /dev/null differ
diff --git a/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110102242.jar b/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110102242.jar
new file mode 100644
index 0000000..93a7232
Binary files /dev/null and b/halo-update-site/plugins/edu.columbia.cs.psl.halo.client_1.0.0.201110102242.jar differ
diff --git a/halo-update-site/select-install.png b/halo-update-site/select-install.png
new file mode 100644
index 0000000..d59f8f1
Binary files /dev/null and b/halo-update-site/select-install.png differ
diff --git a/halo-update-site/site.xml b/halo-update-site/site.xml
index 19c750e..529cef9 100644
--- a/halo-update-site/site.xml
+++ b/halo-update-site/site.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <site>
-   <feature url="features/edu.columbia.cs.psl.halo.client_1.0.1.5.jar" id="edu.columbia.cs.psl.halo.client" version="1.0.1.5">
+   <feature url="features/edu.columbia.cs.psl.halo.client_1.0.1.4.jar" id="edu.columbia.cs.psl.halo.client" version="1.0.1.4">
       <category name="HALO"/>
    </feature>
    <category-def name="HALO" label="HALO SE"/>
diff --git a/halo-update-site/untitled.jpg b/halo-update-site/untitled.jpg
new file mode 100644
index 0000000..2ea8eb5
Binary files /dev/null and b/halo-update-site/untitled.jpg differ
diff --git a/halo-update-site/update site.jpg b/halo-update-site/update site.jpg
new file mode 100644
index 0000000..b23c033
Binary files /dev/null and b/halo-update-site/update site.jpg differ
diff --git a/halo_se_web/.project b/halo_se_web/.project
deleted file mode 100644
index 9f03673..0000000
--- a/halo_se_web/.project
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>halo_se_web</name>
-	<comment></comment>
-	<projects>
-		<project>halo-eclipse-EAR</project>
-		<project>halo-se</project>
-		<project>halo-se-admin</project>
-		<project>halo-se-common</project>
-		<project>halo-se-EJB</project>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.python.pydev.PyDevBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.python.pydev.pythonNature</nature>
-		<nature>org.python.pydev.django.djangoNature</nature>
-	</natures>
-</projectDescription>
diff --git a/halo_se_web/.settings/org.eclipse.mylyn.tasks.ui.prefs b/halo_se_web/.settings/org.eclipse.mylyn.tasks.ui.prefs
deleted file mode 100644
index f94cbe6..0000000
--- a/halo_se_web/.settings/org.eclipse.mylyn.tasks.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Sep 26 07:57:12 EDT 2011
-eclipse.preferences.version=1
-project.repository.kind=jira
-project.repository.url=https\://ase.cs.columbia.edu/jira/browse/HALO
diff --git a/halo_se_web/__init__.pyc b/halo_se_web/__init__.pyc
deleted file mode 100644
index 2a24a83..0000000
Binary files a/halo_se_web/__init__.pyc and /dev/null differ
diff --git a/halo_se_web/backends.py b/halo_se_web/backends.py
new file mode 100644
index 0000000..62f62f8
--- /dev/null
+++ b/halo_se_web/backends.py
@@ -0,0 +1,18 @@
+from django.conf import settings
+from django.contrib.auth.models import User, check_password
+from login.models import HUser
+
+class EmailAuthBackend(object):
+    def authenticate(self,username=None, password=None):
+        try:
+            user = HUser.objects.get(email=username)
+            if user.check_password(password):
+                return user
+        except User.DoesNotExist:
+            return None
+
+    def get_user(self, user_id):
+        try:
+            return HUser.objects.get(pk=user_id)
+        except User.DoesNotExist:
+            return None
diff --git a/halo_se_web/halo_admin/__init__.py b/halo_se_web/halo_admin/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/halo_se_web/halo_admin/models.py b/halo_se_web/halo_admin/models.py
new file mode 100644
index 0000000..71a8362
--- /dev/null
+++ b/halo_se_web/halo_admin/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/halo_se_web/halo_admin/static/css/course_admin.css b/halo_se_web/halo_admin/static/css/course_admin.css
new file mode 100644
index 0000000..9c715bd
--- /dev/null
+++ b/halo_se_web/halo_admin/static/css/course_admin.css
@@ -0,0 +1,7 @@
+.crud-item {
+	width: 200px;
+}
+
+.crud-add {
+	width: 50px;
+}
diff --git a/halo_se_web/halo_admin/static/css/dashboard.css b/halo_se_web/halo_admin/static/css/dashboard.css
new file mode 100644
index 0000000..afe51e5
--- /dev/null
+++ b/halo_se_web/halo_admin/static/css/dashboard.css
@@ -0,0 +1,22 @@
+body {
+	font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;
+}
+
+.header {
+	background-color: lightblue;
+	border-radius: 15px;
+}
+
+.header .title {
+	font-weight: bold;
+	font-size: 24px;
+	margin-left: 30px;
+	padding-top: 30px;
+}
+.header .welcome {
+	text-align: right;
+}
+
+#crud-table {
+	padding:20px;
+}
\ No newline at end of file
diff --git a/halo_se_web/halo_admin/tests.py b/halo_se_web/halo_admin/tests.py
new file mode 100644
index 0000000..501deb7
--- /dev/null
+++ b/halo_se_web/halo_admin/tests.py
@@ -0,0 +1,16 @@
+"""
+This file demonstrates writing tests using the unittest module. These will pass
+when you run "manage.py test".
+
+Replace this with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+
+class SimpleTest(TestCase):
+    def test_basic_addition(self):
+        """
+        Tests that 1 + 1 always equals 2.
+        """
+        self.assertEqual(1 + 1, 2)
diff --git a/halo_se_web/halo_admin/urls.py b/halo_se_web/halo_admin/urls.py
new file mode 100644
index 0000000..80e34b4
--- /dev/null
+++ b/halo_se_web/halo_admin/urls.py
@@ -0,0 +1,16 @@
+from django.conf.urls.defaults import patterns, include, url
+
+urlpatterns = patterns('halo_admin.views',
+    (r'^$', 'dashboard'),
+    (r'^(?P<course_id>\d+)/(?P<assignment_id>\d+)/(?P<quest_id>\d+)/add_task/(?P<parent_task_id>\d+)$', 'add_task'),
+    (r'^(?P<course_id>\d+)/(?P<assignment_id>\d+)/(?P<quest_id>\d+)/add_task/$', 'add_task'),
+    (r'^(?P<course_id>\d+)/(?P<assignment_id>\d+)/(?P<quest_id>\d+)/tasks/$', 'task_admin'),
+    (r'^(?P<course_id>\d+)/(?P<assignment_id>\d+)/quests/$', 'quest_admin'),
+    (r'^(?P<course_id>\d+)/(?P<assignment_id>\d+)/add_quest/(?P<parent_quest_id>\d+)/$', 'add_quest'),
+    (r'^(?P<course_id>\d+)/(?P<assignment_id>\d+)/add_quest/$', 'add_quest'),
+    (r'^(?P<course_id>\d+)/add_assignment/$', 'add_assignment'),
+    (r'^(?P<course_id>\d+)/assignments/$', 'assignment_admin'),
+    (r'^(?P<course_id>\d+)/student_list/(?P<focus_id>\d+)/$', 'student_list'),
+    (r'^(?P<course_id>\d+)/student_list/$', 'student_list'),
+    (r'^(?P<course_id>\d+)/$', 'course_admin'),
+)
\ No newline at end of file
diff --git a/halo_se_web/halo_admin/util.py b/halo_se_web/halo_admin/util.py
new file mode 100644
index 0000000..b95af7e
--- /dev/null
+++ b/halo_se_web/halo_admin/util.py
@@ -0,0 +1,12 @@
+def contains_course(course_list, course_id):
+    for course in course_list:
+        if course.getId() == int(course_id):
+            print True
+            return True
+    return False
+
+def set_course_choices():
+    course_choices = []
+    for course in course_list:
+        course_choices.append([course.id, course.name])
+    return course_choices
\ No newline at end of file
diff --git a/halo_se_web/halo_admin/views.py b/halo_se_web/halo_admin/views.py
new file mode 100644
index 0000000..4410ce7
--- /dev/null
+++ b/halo_se_web/halo_admin/views.py
@@ -0,0 +1,379 @@
+from django.http import HttpResponse, Http404, HttpResponseRedirect
+from django.shortcuts import render_to_response#, context_instance
+from django import forms
+from django.template.context import RequestContext
+from login.models import HUser, Enrollment, Course, Studentassignment, Quest, Task
+from halo_admin.util import contains_course
+from halo_web.models import Questprogress
+from datetime import date, timedelta
+
+def dashboard(request):
+    user = request.user
+    if (user.is_authenticated()):
+        u_id = user.getUserId()
+        enrollment = Enrollment.objects.filter(user_id=u_id)
+        admin_enrollment = enrollment.filter(type="ADMIN")
+        admin_courses = []
+        assignment_list = []
+        quest_list = []
+        task_list = []
+        for enr in admin_enrollment:
+            course = Course.objects.get(id=enr.getCourseId())
+            admin_courses.append(course)
+            for course in admin_courses:
+
+                asmtset = Studentassignment.objects.filter(course_id = course.id)
+                assignment_list.append([course.id, asmtset])
+
+                for asmt in asmtset:
+                    questset = Quest.objects.filter(assignment_id = asmt.id)
+                    quest_list.append([asmt.id, questset])
+
+                    for quest in questset:
+                        taskset = Task.objects.filter(quest_id = quest.id)
+                        task_list.append([quest.id, taskset])
+
+
+     #   print admin_courses
+     #   print assignment_list
+     #   print quest_list
+     #   print task_list
+  #  course_select = AdminSelectForm(admin_courses)
+    else:
+        enrollment = None
+        admin_courses = None
+        assignment_list = None
+        quest_list = None
+        task_list = None
+
+    data1 = (1,2,3)
+
+    return render_to_response('halo_admin/dashboard.html', {'user': user, 'enrollment': enrollment, 'admin_courses': admin_courses, 'assignment_list': assignment_list, 'quest_list': quest_list, 'task_list': task_list, 'data1': data1}, context_instance = RequestContext(request))
+
+def course_admin(request, course_id):
+    user = request.user
+    this_course = Course.objects.get(id=course_id)
+
+    if (user.is_authenticated()):
+        u_id = user.getUserId()
+        my_enrollment = Enrollment.objects.filter(user_id=u_id)
+        admin_enrollment = my_enrollment.filter(type="ADMIN")
+        admin_courses = []
+        for enr in admin_enrollment:
+            course = Course.objects.get(id=enr.getCourseId())
+            admin_courses.append(course)
+        admin_this_course = contains_course(admin_courses, course_id)
+
+        assignments = Studentassignment.objects.filter(course_id=course_id)
+        quests = []
+        for asmt in assignments:
+            asmt_quests = Quest.objects.filter(assignment_id = asmt.id)
+            for q in asmt_quests:
+                quests.append(q)
+        course_enrollment = Enrollment.objects.filter(course_id = course_id).filter(type="STUDENT")
+        tasks = []
+        for q in quests:
+            q_tasks = Task.objects.filter(quest_id = q.id)
+            for qt in q_tasks:
+                tasks.append(qt)
+
+        data = []
+        students = []
+        for enr in course_enrollment:
+            stu_id = enr.user_id
+            enddate = date.today()
+            startdate = enddate - timedelta(days=7)
+            stu_progress = Questprogress.objects.filter(user_id=stu_id).filter(completed=1).filter(updated__range=[startdate, enddate])
+            data.append(len(stu_progress))
+            students.append(HUser.objects.get(id=stu_id).lastname)
+        data_max = max(data)
+    else:
+        my_enrollment = None
+        admin_courses = None
+        admin_this_course = False
+        data_max = None
+        tasks = None
+        quests = None
+        students = None
+        data = None
+        course_enrollment = None
+
+    return render_to_response('halo_admin/course_admin.html', {'user': user, 'enrollment': my_enrollment, 'data_max': data_max, 'assignments':assignments, 'tasks': tasks, 'quests': quests,'data': data, 'students': students, 'course_enrollment': course_enrollment, 'this_course': this_course, 'admin_courses': admin_courses, 'admin_this_course': admin_this_course}, context_instance=RequestContext(request))
+
+#class AdminSelectForm(forms.Form):
+#    course = forms.CharField(max_length=100, choices = admin_courses)
+
+def assignment_admin(request, course_id):
+    user = request.user
+    this_course = Course.objects.get(id=course_id)
+
+    if (user.is_authenticated()):
+        u_id = user.getUserId()
+        enrollment = Enrollment.objects.filter(user_id=u_id)
+        admin_enrollment = enrollment.filter(type="ADMIN")
+        admin_courses = []
+        for enr in admin_enrollment:
+            course = Course.objects.get(id=enr.getCourseId())
+            admin_courses.append(course)
+        admin_this_course = contains_course(admin_courses, course_id)
+
+        assignment_list = Studentassignment.objects.filter(course_id=course_id)
+        print assignment_list
+    else:
+        enrollment = None
+        admin_courses = None
+        admin_this_course = False
+        assignment_list = None
+    return render_to_response('halo_admin/assignment_admin.html', {'user': user, 'enrollment': enrollment, 'this_course': this_course, 'admin_courses': admin_courses, 'admin_this_course': admin_this_course, 'assignment_list': assignment_list}, context_instance=RequestContext(request))
+
+def quest_admin(request, course_id, assignment_id):
+    user = request.user
+    this_course = Course.objects.get(id=course_id)
+
+    if (user.is_authenticated()):
+        u_id = user.getUserId()
+        enrollment = Enrollment.objects.filter(user_id=u_id)
+        admin_enrollment = enrollment.filter(type="ADMIN")
+        admin_courses = []
+        for enr in admin_enrollment:
+            course = Course.objects.get(id=enr.getCourseId())
+            admin_courses.append(course)
+        admin_this_course = contains_course(admin_courses, course_id)
+        this_assignment = Studentassignment.objects.get(id=assignment_id)
+        quest_list = Quest.objects.filter(assignment_id=assignment_id)
+        print quest_list
+    else:
+        enrollment = None
+        admin_courses = None
+        admin_this_course = False
+        quest_list = None
+    return render_to_response('halo_admin/quest_admin.html', {'user': user, 'enrollment': enrollment, 'this_course': this_course, 'this_assignment': this_assignment, 'admin_courses': admin_courses, 'admin_this_course': admin_this_course, 'quest_list': quest_list}, context_instance=RequestContext(request))
+
+def task_admin(request, course_id, assignment_id, quest_id):
+    user = request.user
+    this_course = Course.objects.get(id=course_id)
+
+    if (user.is_authenticated()):
+        u_id = user.getUserId()
+        enrollment = Enrollment.objects.filter(user_id=u_id)
+        admin_enrollment = enrollment.filter(type="ADMIN")
+        admin_courses = []
+        for enr in admin_enrollment:
+            course = Course.objects.get(id=enr.getCourseId())
+            admin_courses.append(course)
+        admin_this_course = contains_course(admin_courses, course_id)
+        this_assignment = Studentassignment.objects.get(id=assignment_id)
+        this_quest = Quest.objects.get(id=quest_id)
+        task_list = Task.objects.filter(quest_id=quest_id)
+        task_list_range = range(len(task_list))
+    else:
+        enrollment = None
+        admin_courses = None
+        admin_this_course = False
+        task_list = None
+    return render_to_response('halo_admin/task_admin.html', {'user': user, 'enrollment': enrollment, 'this_course': this_course, 'this_assignment': this_assignment, 'this_quest': this_quest, 'admin_courses': admin_courses, 'admin_this_course': admin_this_course, 'task_list': task_list, 'task_list_range': task_list_range}, context_instance=RequestContext(request))
+
+#def add_quest2(request, course_id=None, assignment_id=None, parent_quest_id=None):
+#    user = request.user
+#    this_course = Course.objects.get(id=course_id)
+#
+#    if (user.is_authenticated()):
+#        u_id = user.getUserId()
+#        enrollment = Enrollment.objects.filter(user_id=u_id)
+#        admin_enrollment = enrollment.filter(type="ADMIN")
+#        admin_courses = []
+#        for enr in admin_enrollment:
+#            course = Course.objects.get(id=enr.getCourseId())
+#            admin_courses.append(course)
+#        admin_this_course = contains_course(admin_courses, course_id)
+#
+#    else:
+#        admin_this_course = False
+#    if request.method == 'POST':
+#        form = AddQuestForm2(request.user, course_id, assignment_id, parent_quest_id, request.POST)
+#        if form.is_valid():
+#            new_quest = Quest(name=form.cleaned_data['name'], description=form.cleaned_data['description'], assignment_id = assignment_id, parent_id = parent_quest_id, experiencepoints = form.cleaned_data['experiencePoints'])
+#            new_quest.save()
+#            print new_quest.id
+#            return HttpResponseRedirect('/admin/add_quest')
+#    else:
+#        form = AddQuestForm2(request.user, courses, assignments, quests)
+#    return render_to_response('halo_admin/add_quest.html', {'user': user, 'admin_this_course': admin_this_course, 'form': form}, context_instance = RequestContext(request))
+
+
+def add_quest(request,course_id, assignment_id, parent_quest_id=None):
+    user = request.user
+    this_course = Course.objects.get(id=course_id)
+
+    if (user.is_authenticated()):
+        u_id = user.getUserId()
+        enrollment = Enrollment.objects.filter(user_id=u_id)
+        admin_enrollment = enrollment.filter(type="ADMIN")
+        admin_courses = []
+        for enr in admin_enrollment:
+            course = Course.objects.get(id=enr.getCourseId())
+            admin_courses.append(course)
+        admin_this_course = contains_course(admin_courses, course_id)
+
+        quest_list = Quest.objects.filter(assignment_id=assignment_id)
+
+    else:
+        admin_this_course = False
+    if request.method == 'POST':
+        form = AddQuestForm(request.user, course_id, assignment_id, parent_quest_id, request.POST)
+        if form.is_valid():
+            new_quest = Quest(name=form.cleaned_data['name'], description=form.cleaned_data['description'], assignment_id = assignment_id, parent_id = parent_quest_id, experiencepoints = form.cleaned_data['experiencePoints'])
+            new_quest.save()
+            print new_quest.id
+            return HttpResponseRedirect('/admin/'+str(course_id)+'/'+str(assignment_id)+'/quests')
+    else:
+        form = AddQuestForm(request.user, course_id, assignment_id, parent_quest_id)
+    return render_to_response('halo_admin/add_quest.html', {'user': user, 'admin_this_course': admin_this_course, 'form': form}, context_instance = RequestContext(request))
+
+class AddQuestForm(forms.Form):
+    def __init__(self, user, course_id, assignment_id, parent_quest_id, *args, **kwargs):
+        super(AddQuestForm, self).__init__(*args, **kwargs)
+
+    name = forms.CharField(max_length=150)
+    description = forms.CharField(widget=forms.Textarea)
+    experiencePoints = forms.IntegerField()
+
+#
+#class AddQuestForm2(forms.Form):
+#    def __init__(self, user, courses, assignments, quests, *args, **kwargs):
+#        super(AddQuestForm2, self).__init__(*args, **kwargs)
+#    courses = forms.Select(choices=courses)
+#    assignment = forms.Select(choices = assignments)
+#    name = forms.CharField(max_length=150)
+#    description = forms.CharField(widget=forms.Textarea)
+#    experiencePoints = forms.IntegerField()
+#
+class AddAssignmentForm(forms.Form):
+    def __init__(self, user, course_id, *args, **kwargs):
+        super(AddAssignmentForm, self).__init__(*args, **kwargs)
+    assignedon = forms.DateTimeField(widget=forms.DateTimeInput)
+    description = forms.CharField(widget=forms.Textarea)
+    dueon = forms.DateTimeField(widget=forms.DateTimeInput)
+    title = forms.CharField()
+
+def add_assignment(request, course_id):
+    user = request.user
+    this_course = Course.objects.get(id=course_id)
+
+    if (user.is_authenticated()):
+        u_id = user.getUserId()
+        enrollment = Enrollment.objects.filter(user_id=u_id)
+        admin_enrollment = enrollment.filter(type="ADMIN")
+        admin_courses = []
+        for enr in admin_enrollment:
+            course = Course.objects.get(id=enr.getCourseId())
+            admin_courses.append(course)
+        admin_this_course = contains_course(admin_courses, course_id)
+
+        asmt_list = Studentassignment.objects.filter(course_id=course_id)
+
+    else:
+        admin_this_course = False
+    if request.method == 'POST':
+        form = AddAssignmentForm(request.user, course_id, request.POST)
+        if form.is_valid():
+            new_asmt = Studentassignment(assignedon=form.cleaned_data['assignedon'], description=form.cleaned_data['description'], dueon = form.cleaned_data['dueon'], title = form.cleaned_data['title'], course_id = course_id)
+            new_asmt.save()
+            print new_asmt.id
+            return HttpResponseRedirect('/admin/'+str(course_id))
+    else:
+        form = AddAssignmentForm(request.user, course_id)
+    return render_to_response('halo_admin/add_assignment.html', {'user': user, 'admin_this_course': admin_this_course, 'form': form}, context_instance = RequestContext(request))
+
+def add_task(request,course_id, assignment_id, quest_id, parent_task_id=None):
+    user = request.user
+    this_course = Course.objects.get(id=course_id)
+
+    if (user.is_authenticated()):
+        u_id = user.getUserId()
+        enrollment = Enrollment.objects.filter(user_id=u_id)
+        admin_enrollment = enrollment.filter(type="ADMIN")
+        admin_courses = []
+        for enr in admin_enrollment:
+            course = Course.objects.get(id=enr.getCourseId())
+            admin_courses.append(course)
+        admin_this_course = contains_course(admin_courses, course_id)
+        this_assignment = Studentassignment.objects.get(id=assignment_id)
+        this_quest = Quest.objects.get(id=quest_id)
+
+
+    else:
+        admin_this_course = False
+    if request.method == 'POST':
+        form = AddTaskForm(request.user, course_id, assignment_id, quest_id, parent_task_id, request.POST)
+        if form.is_valid():
+            new_task = Task(name=form.cleaned_data['name'],description=form.cleaned_data['description'], quest_id = quest_id, parent_id = parent_task_id)
+            new_task.save()
+            print new_task.id
+            return HttpResponseRedirect('/admin/'+str(course_id)+'/'+str(assignment_id)+'/'+str(quest_id)+'/tasks')
+    else:
+        form = AddTaskForm(request.user, course_id, assignment_id, quest_id, parent_task_id)
+    return render_to_response('halo_admin/add_task.html', {'user': user, 'admin_this_course': admin_this_course, 'form': form}, context_instance = RequestContext(request))
+
+class AddTaskForm(forms.Form):
+    def __init__(self, user, course_id, assignment_id, quest_id, parent_task_id, *args, **kwargs):
+        super(AddTaskForm, self).__init__(*args, **kwargs)
+
+    name = forms.CharField(max_length=150)
+    description = forms.CharField(widget=forms.Textarea)
+
+def student_list(request, course_id, focus_id = None):
+    user = request.user
+    this_course = Course.objects.get(id=course_id)
+    if (focus_id):
+        focus_user = HUser.objects.get(id=focus_id)
+        focus = {'name': focus_user.getName(), 'email': focus_user.getEmail(), 'id': focus_user.getUserId()}
+        focus_data = []
+        focus_labels = []
+        focus_max = 0
+        for i in range(30):
+            startdate = date.today() - timedelta(days=(31-i))
+            enddate = date.today() - timedelta(days=(30-i))
+            stu_progress = Questprogress.objects.filter(user_id=focus['id']).filter(completed=1).filter(updated__range=[startdate, enddate])
+            focus_max = max(focus_max, len(stu_progress))
+            focus_data.append(len(stu_progress))
+            if (i % 7 == 0):
+                focus_labels.append(enddate)
+
+        print focus_data
+        print focus_max
+
+    else:
+        focus = None
+        focus_data = None
+        focus_max = 0
+        focus_labels = None
+    if (user.is_authenticated()):
+        u_id = user.getUserId()
+        my_enrollment = Enrollment.objects.filter(user_id=u_id)
+        admin_enrollment = my_enrollment.filter(type="ADMIN")
+        admin_courses = []
+        for enr in admin_enrollment:
+            course = Course.objects.get(id=enr.getCourseId())
+            admin_courses.append(course)
+        admin_this_course = contains_course(admin_courses, course_id)
+        students = []
+        course_enrollment = Enrollment.objects.filter(course_id = course_id)
+        for enr in course_enrollment:
+            stud = HUser.objects.get(id=enr.user_id)
+            stud_data = {'name': stud.getName(), 'email': stud.getEmail(), 'id': stud.getUserId()}
+            students.append(stud_data)
+    else:
+        my_enrollment = None
+        admin_courses = None
+        admin_this_course = False
+        data_max = None
+        tasks = None
+        quests = None
+        students = None
+        data = None
+        course_enrollment = None
+
+    return render_to_response('halo_admin/student_list.html', {'course_id': course_id, 'user': user, 'focus': focus, 'focus_data': focus_data, 'focus_range': range(focus_max+1), 'focus_labels': focus_labels, 'admin_this_course': admin_this_course,'students': students}, context_instance=RequestContext(request))
+
+
\ No newline at end of file
diff --git a/halo_se_web/halo_web/models.py b/halo_se_web/halo_web/models.py
new file mode 100644
index 0000000..9286420
--- /dev/null
+++ b/halo_se_web/halo_web/models.py
@@ -0,0 +1,255 @@
+# This is an auto-generated Django model module.
+# You'll have to do the following manually to clean this up:
+#     * Rearrange models' order
+#     * Make sure each model has one field with primary_key=True
+# Feel free to rename the models, but don't rename db_table values or field names.
+#
+# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]'
+# into your database.
+
+from django.db import models
+
+class Achievement(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    name = models.CharField(max_length=765, db_column='NAME', blank=True) # Field name made lowercase.
+    points = models.IntegerField(null=True, db_column='POINTS', blank=True) # Field name made lowercase.
+    resulttitle_id = models.IntegerField(null=True, db_column='RESULTTITLE_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'achievement'
+
+class Achievementrecord(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    completiontime = models.DateTimeField(null=True, db_column='COMPLETIONTIME', blank=True) # Field name made lowercase.
+    achievement_id = models.IntegerField(null=True, db_column='ACHIEVEMENT_ID', blank=True) # Field name made lowercase.
+    user_id = models.IntegerField(null=True, db_column='USER_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'achievementrecord'
+
+class AuthGroup(models.Model):
+    id = models.IntegerField(primary_key=True)
+    name = models.CharField(unique=True, max_length=240)
+    class Meta:
+        db_table = u'auth_group'
+
+class DjangoContentType(models.Model):
+    id = models.IntegerField(primary_key=True)
+    name = models.CharField(max_length=300)
+    app_label = models.CharField(unique=True, max_length=255)
+    model = models.CharField(unique=True, max_length=255)
+    class Meta:
+        db_table = u'django_content_type'
+
+class AuthPermission(models.Model):
+    id = models.IntegerField(primary_key=True)
+    name = models.CharField(max_length=150)
+    content_type = models.ForeignKey(DjangoContentType)
+    codename = models.CharField(unique=True, max_length=255)
+    class Meta:
+        db_table = u'auth_permission'
+
+class AuthGroupPermissions(models.Model):
+    id = models.IntegerField(primary_key=True)
+    group = models.ForeignKey(AuthGroup)
+    permission = models.ForeignKey(AuthPermission)
+    class Meta:
+        db_table = u'auth_group_permissions'
+
+class AuthUser(models.Model):
+    id = models.IntegerField(primary_key=True)
+    username = models.CharField(unique=True, max_length=90)
+    first_name = models.CharField(max_length=90)
+    last_name = models.CharField(max_length=90)
+    email = models.CharField(max_length=225)
+    password = models.CharField(max_length=384)
+    is_staff = models.IntegerField()
+    is_active = models.IntegerField()
+    is_superuser = models.IntegerField()
+    last_login = models.DateTimeField()
+    date_joined = models.DateTimeField()
+    class Meta:
+        db_table = u'auth_user'
+
+class AuthMessage(models.Model):
+    id = models.IntegerField(primary_key=True)
+    user = models.ForeignKey(AuthUser)
+    message = models.TextField()
+    class Meta:
+        db_table = u'auth_message'
+
+class AuthUserGroups(models.Model):
+    id = models.IntegerField(primary_key=True)
+    user = models.ForeignKey(AuthUser)
+    group = models.ForeignKey(AuthGroup)
+    class Meta:
+        db_table = u'auth_user_groups'
+
+class AuthUserUserPermissions(models.Model):
+    id = models.IntegerField(primary_key=True)
+    user = models.ForeignKey(AuthUser)
+    permission = models.ForeignKey(AuthPermission)
+    class Meta:
+        db_table = u'auth_user_user_permissions'
+
+class Causualrelation(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    achievementcause_id = models.IntegerField(null=True, db_column='ACHIEVEMENTCAUSE_ID', blank=True) # Field name made lowercase.
+    achievementresult_id = models.IntegerField(null=True, db_column='ACHIEVEMENTRESULT_ID', blank=True) # Field name made lowercase.
+    taskcause_id = models.IntegerField(null=True, db_column='TASKCAUSE_ID', blank=True) # Field name made lowercase.
+    taskresult_id = models.IntegerField(null=True, db_column='TASKRESULT_ID', blank=True) # Field name made lowercase.
+    cardinality = models.IntegerField(null=True, db_column='CARDINALITY', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'causualrelation'
+
+class Course(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    name = models.CharField(max_length=765, db_column='NAME', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'course'
+
+class DjangoAdminLog(models.Model):
+    id = models.IntegerField(primary_key=True)
+    action_time = models.DateTimeField()
+    user = models.ForeignKey(AuthUser)
+    content_type = models.ForeignKey(DjangoContentType, null=True, blank=True)
+    object_id = models.TextField(blank=True)
+    object_repr = models.CharField(max_length=600)
+    action_flag = models.IntegerField()
+    change_message = models.TextField()
+    class Meta:
+        db_table = u'django_admin_log'
+
+class DjangoSession(models.Model):
+    session_key = models.CharField(max_length=120, primary_key=True)
+    session_data = models.TextField()
+    expire_date = models.DateTimeField()
+    class Meta:
+        db_table = u'django_session'
+
+class DjangoSite(models.Model):
+    id = models.IntegerField(primary_key=True)
+    domain = models.CharField(max_length=300)
+    name = models.CharField(max_length=150)
+    class Meta:
+        db_table = u'django_site'
+
+class Enrollment(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    type = models.CharField(max_length=765, db_column='TYPE', blank=True) # Field name made lowercase.
+    course_id = models.IntegerField(null=True, db_column='COURSE_ID', blank=True) # Field name made lowercase.
+    user_id = models.IntegerField(null=True, db_column='USER_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'enrollment'
+
+class HUser(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    achievementpoints = models.IntegerField(null=True, db_column='ACHIEVEMENTPOINTS', blank=True) # Field name made lowercase.
+    email = models.CharField(max_length=765, db_column='EMAIL', blank=True) # Field name made lowercase.
+    firstname = models.CharField(max_length=765, db_column='FIRSTNAME', blank=True) # Field name made lowercase.
+    lastname = models.CharField(max_length=765, db_column='LASTNAME', blank=True) # Field name made lowercase.
+    password = models.CharField(max_length=765, db_column='PASSWORD', blank=True) # Field name made lowercase.
+    status = models.CharField(max_length=765, db_column='STATUS', blank=True) # Field name made lowercase.
+    thumbnail = models.TextField(db_column='THUMBNAIL', blank=True) # Field name made lowercase.
+    xp = models.IntegerField(null=True, db_column='XP', blank=True) # Field name made lowercase.
+    activetitle_id = models.IntegerField(null=True, db_column='ACTIVETITLE_ID', blank=True) # Field name made lowercase.
+    level_id = models.IntegerField(null=True, db_column='LEVEL_ID', blank=True) # Field name made lowercase.
+    rememberme = models.CharField(max_length=765, db_column='REMEMBERME', blank=True) # Field name made lowercase.
+    remembermeexp = models.DateTimeField(null=True, blank=True)
+    facebooksessionkey = models.CharField(max_length=765, db_column='FACEBOOKSESSIONKEY', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'h_user'
+
+class HUserTitle(models.Model):
+    user_id = models.IntegerField(primary_key=True, db_column='User_ID') # Field name made lowercase.
+    titles_id = models.IntegerField(db_column='titles_ID') # Field name made lowercase.
+    class Meta:
+        db_table = u'h_user_title'
+
+class Level(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    level = models.IntegerField(null=True, db_column='LEVEL', blank=True) # Field name made lowercase.
+    xprequired = models.IntegerField(null=True, db_column='XPREQUIRED', blank=True) # Field name made lowercase.
+    xpmax = models.IntegerField(null=True, db_column='XPMAX', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'level'
+
+class Logaction(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    log_key = models.CharField(max_length=765, blank=True)
+    class Meta:
+        db_table = u'logaction'
+
+class Logentry(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    createdat = models.DateTimeField(null=True, db_column='CREATEDAT', blank=True) # Field name made lowercase.
+    ip = models.BigIntegerField(null=True, db_column='IP', blank=True) # Field name made lowercase.
+    params = models.CharField(max_length=765, db_column='PARAMS', blank=True) # Field name made lowercase.
+    action_id = models.IntegerField(null=True, db_column='ACTION_ID', blank=True) # Field name made lowercase.
+    createdby_id = models.IntegerField(null=True, db_column='CREATEDBY_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'logentry'
+
+class PollsPoll(models.Model):
+    id = models.IntegerField(primary_key=True)
+    question = models.CharField(max_length=600)
+    pub_date = models.DateTimeField()
+    class Meta:
+        db_table = u'polls_poll'
+
+class PollsChoice(models.Model):
+    id = models.IntegerField(primary_key=True)
+    poll = models.ForeignKey(PollsPoll)
+    choice = models.CharField(max_length=600)
+    votes = models.IntegerField()
+    class Meta:
+        db_table = u'polls_choice'
+
+
+class Quest(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    description = models.TextField(db_column='DESCRIPTION', blank=True) # Field name made lowercase.
+    name = models.CharField(max_length=765, db_column='NAME', blank=True) # Field name made lowercase.
+    assignment_id = models.IntegerField(null=True, db_column='ASSIGNMENT_ID', blank=True) # Field name made lowercase.
+    parent_id = models.IntegerField(null=True, db_column='PARENT_ID', blank=True) # Field name made lowercase.
+    experiencepoints = models.IntegerField(null=True, db_column='experiencePoints', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'quest'
+    def __unicode__(self):
+        return self.name
+
+class Questprogress(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    completed = models.IntegerField(null=True, db_column='COMPLETED', blank=True) # Field name made lowercase.
+    updated = models.DateTimeField(null=True, db_column='UPDATED', blank=True) # Field name made lowercase.
+    quest_id = models.IntegerField(null=True, db_column='QUEST_ID', blank=True) # Field name made lowercase.
+    task_id = models.IntegerField(null=True, db_column='TASK_ID', blank=True) # Field name made lowercase.
+    user_id = models.IntegerField(null=True, db_column='USER_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'questprogress'
+
+class Studentasisgnment(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    assignedon = models.DateTimeField(null=True, db_column='ASSIGNEDON', blank=True) # Field name made lowercase.
+    description = models.CharField(max_length=765, db_column='DESCRIPTION', blank=True) # Field name made lowercase.
+    dueon = models.DateTimeField(null=True, db_column='DUEON', blank=True) # Field name made lowercase.
+    title = models.CharField(max_length=765, db_column='TITLE', blank=True) # Field name made lowercase.
+    course_id = models.IntegerField(null=True, db_column='COURSE_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'studentasisgnment'
+
+class Task(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    description = models.CharField(max_length=765, db_column='DESCRIPTION', blank=True) # Field name made lowercase.
+    name = models.CharField(max_length=765, db_column='NAME', blank=True) # Field name made lowercase.
+    type = models.CharField(max_length=765, db_column='TYPE', blank=True) # Field name made lowercase.
+    parent_id = models.IntegerField(null=True, db_column='PARENT_ID', blank=True) # Field name made lowercase.
+    quest_id = models.IntegerField(null=True, db_column='QUEST_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'task'
+
+class Title(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    position = models.CharField(max_length=765, db_column='POSITION', blank=True) # Field name made lowercase.
+    title = models.CharField(max_length=765, db_column='TITLE', blank=True) # Field name made lowercase.
+    comesfrom_id = models.IntegerField(null=True, db_column='COMESFROM_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'title'
\ No newline at end of file
diff --git a/halo_se_web/halo_web/models_backup.py b/halo_se_web/halo_web/models_backup.py
new file mode 100644
index 0000000..9286420
--- /dev/null
+++ b/halo_se_web/halo_web/models_backup.py
@@ -0,0 +1,255 @@
+# This is an auto-generated Django model module.
+# You'll have to do the following manually to clean this up:
+#     * Rearrange models' order
+#     * Make sure each model has one field with primary_key=True
+# Feel free to rename the models, but don't rename db_table values or field names.
+#
+# Also note: You'll have to insert the output of 'django-admin.py sqlcustom [appname]'
+# into your database.
+
+from django.db import models
+
+class Achievement(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    name = models.CharField(max_length=765, db_column='NAME', blank=True) # Field name made lowercase.
+    points = models.IntegerField(null=True, db_column='POINTS', blank=True) # Field name made lowercase.
+    resulttitle_id = models.IntegerField(null=True, db_column='RESULTTITLE_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'achievement'
+
+class Achievementrecord(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    completiontime = models.DateTimeField(null=True, db_column='COMPLETIONTIME', blank=True) # Field name made lowercase.
+    achievement_id = models.IntegerField(null=True, db_column='ACHIEVEMENT_ID', blank=True) # Field name made lowercase.
+    user_id = models.IntegerField(null=True, db_column='USER_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'achievementrecord'
+
+class AuthGroup(models.Model):
+    id = models.IntegerField(primary_key=True)
+    name = models.CharField(unique=True, max_length=240)
+    class Meta:
+        db_table = u'auth_group'
+
+class DjangoContentType(models.Model):
+    id = models.IntegerField(primary_key=True)
+    name = models.CharField(max_length=300)
+    app_label = models.CharField(unique=True, max_length=255)
+    model = models.CharField(unique=True, max_length=255)
+    class Meta:
+        db_table = u'django_content_type'
+
+class AuthPermission(models.Model):
+    id = models.IntegerField(primary_key=True)
+    name = models.CharField(max_length=150)
+    content_type = models.ForeignKey(DjangoContentType)
+    codename = models.CharField(unique=True, max_length=255)
+    class Meta:
+        db_table = u'auth_permission'
+
+class AuthGroupPermissions(models.Model):
+    id = models.IntegerField(primary_key=True)
+    group = models.ForeignKey(AuthGroup)
+    permission = models.ForeignKey(AuthPermission)
+    class Meta:
+        db_table = u'auth_group_permissions'
+
+class AuthUser(models.Model):
+    id = models.IntegerField(primary_key=True)
+    username = models.CharField(unique=True, max_length=90)
+    first_name = models.CharField(max_length=90)
+    last_name = models.CharField(max_length=90)
+    email = models.CharField(max_length=225)
+    password = models.CharField(max_length=384)
+    is_staff = models.IntegerField()
+    is_active = models.IntegerField()
+    is_superuser = models.IntegerField()
+    last_login = models.DateTimeField()
+    date_joined = models.DateTimeField()
+    class Meta:
+        db_table = u'auth_user'
+
+class AuthMessage(models.Model):
+    id = models.IntegerField(primary_key=True)
+    user = models.ForeignKey(AuthUser)
+    message = models.TextField()
+    class Meta:
+        db_table = u'auth_message'
+
+class AuthUserGroups(models.Model):
+    id = models.IntegerField(primary_key=True)
+    user = models.ForeignKey(AuthUser)
+    group = models.ForeignKey(AuthGroup)
+    class Meta:
+        db_table = u'auth_user_groups'
+
+class AuthUserUserPermissions(models.Model):
+    id = models.IntegerField(primary_key=True)
+    user = models.ForeignKey(AuthUser)
+    permission = models.ForeignKey(AuthPermission)
+    class Meta:
+        db_table = u'auth_user_user_permissions'
+
+class Causualrelation(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    achievementcause_id = models.IntegerField(null=True, db_column='ACHIEVEMENTCAUSE_ID', blank=True) # Field name made lowercase.
+    achievementresult_id = models.IntegerField(null=True, db_column='ACHIEVEMENTRESULT_ID', blank=True) # Field name made lowercase.
+    taskcause_id = models.IntegerField(null=True, db_column='TASKCAUSE_ID', blank=True) # Field name made lowercase.
+    taskresult_id = models.IntegerField(null=True, db_column='TASKRESULT_ID', blank=True) # Field name made lowercase.
+    cardinality = models.IntegerField(null=True, db_column='CARDINALITY', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'causualrelation'
+
+class Course(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    name = models.CharField(max_length=765, db_column='NAME', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'course'
+
+class DjangoAdminLog(models.Model):
+    id = models.IntegerField(primary_key=True)
+    action_time = models.DateTimeField()
+    user = models.ForeignKey(AuthUser)
+    content_type = models.ForeignKey(DjangoContentType, null=True, blank=True)
+    object_id = models.TextField(blank=True)
+    object_repr = models.CharField(max_length=600)
+    action_flag = models.IntegerField()
+    change_message = models.TextField()
+    class Meta:
+        db_table = u'django_admin_log'
+
+class DjangoSession(models.Model):
+    session_key = models.CharField(max_length=120, primary_key=True)
+    session_data = models.TextField()
+    expire_date = models.DateTimeField()
+    class Meta:
+        db_table = u'django_session'
+
+class DjangoSite(models.Model):
+    id = models.IntegerField(primary_key=True)
+    domain = models.CharField(max_length=300)
+    name = models.CharField(max_length=150)
+    class Meta:
+        db_table = u'django_site'
+
+class Enrollment(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    type = models.CharField(max_length=765, db_column='TYPE', blank=True) # Field name made lowercase.
+    course_id = models.IntegerField(null=True, db_column='COURSE_ID', blank=True) # Field name made lowercase.
+    user_id = models.IntegerField(null=True, db_column='USER_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'enrollment'
+
+class HUser(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    achievementpoints = models.IntegerField(null=True, db_column='ACHIEVEMENTPOINTS', blank=True) # Field name made lowercase.
+    email = models.CharField(max_length=765, db_column='EMAIL', blank=True) # Field name made lowercase.
+    firstname = models.CharField(max_length=765, db_column='FIRSTNAME', blank=True) # Field name made lowercase.
+    lastname = models.CharField(max_length=765, db_column='LASTNAME', blank=True) # Field name made lowercase.
+    password = models.CharField(max_length=765, db_column='PASSWORD', blank=True) # Field name made lowercase.
+    status = models.CharField(max_length=765, db_column='STATUS', blank=True) # Field name made lowercase.
+    thumbnail = models.TextField(db_column='THUMBNAIL', blank=True) # Field name made lowercase.
+    xp = models.IntegerField(null=True, db_column='XP', blank=True) # Field name made lowercase.
+    activetitle_id = models.IntegerField(null=True, db_column='ACTIVETITLE_ID', blank=True) # Field name made lowercase.
+    level_id = models.IntegerField(null=True, db_column='LEVEL_ID', blank=True) # Field name made lowercase.
+    rememberme = models.CharField(max_length=765, db_column='REMEMBERME', blank=True) # Field name made lowercase.
+    remembermeexp = models.DateTimeField(null=True, blank=True)
+    facebooksessionkey = models.CharField(max_length=765, db_column='FACEBOOKSESSIONKEY', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'h_user'
+
+class HUserTitle(models.Model):
+    user_id = models.IntegerField(primary_key=True, db_column='User_ID') # Field name made lowercase.
+    titles_id = models.IntegerField(db_column='titles_ID') # Field name made lowercase.
+    class Meta:
+        db_table = u'h_user_title'
+
+class Level(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    level = models.IntegerField(null=True, db_column='LEVEL', blank=True) # Field name made lowercase.
+    xprequired = models.IntegerField(null=True, db_column='XPREQUIRED', blank=True) # Field name made lowercase.
+    xpmax = models.IntegerField(null=True, db_column='XPMAX', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'level'
+
+class Logaction(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    log_key = models.CharField(max_length=765, blank=True)
+    class Meta:
+        db_table = u'logaction'
+
+class Logentry(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    createdat = models.DateTimeField(null=True, db_column='CREATEDAT', blank=True) # Field name made lowercase.
+    ip = models.BigIntegerField(null=True, db_column='IP', blank=True) # Field name made lowercase.
+    params = models.CharField(max_length=765, db_column='PARAMS', blank=True) # Field name made lowercase.
+    action_id = models.IntegerField(null=True, db_column='ACTION_ID', blank=True) # Field name made lowercase.
+    createdby_id = models.IntegerField(null=True, db_column='CREATEDBY_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'logentry'
+
+class PollsPoll(models.Model):
+    id = models.IntegerField(primary_key=True)
+    question = models.CharField(max_length=600)
+    pub_date = models.DateTimeField()
+    class Meta:
+        db_table = u'polls_poll'
+
+class PollsChoice(models.Model):
+    id = models.IntegerField(primary_key=True)
+    poll = models.ForeignKey(PollsPoll)
+    choice = models.CharField(max_length=600)
+    votes = models.IntegerField()
+    class Meta:
+        db_table = u'polls_choice'
+
+
+class Quest(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    description = models.TextField(db_column='DESCRIPTION', blank=True) # Field name made lowercase.
+    name = models.CharField(max_length=765, db_column='NAME', blank=True) # Field name made lowercase.
+    assignment_id = models.IntegerField(null=True, db_column='ASSIGNMENT_ID', blank=True) # Field name made lowercase.
+    parent_id = models.IntegerField(null=True, db_column='PARENT_ID', blank=True) # Field name made lowercase.
+    experiencepoints = models.IntegerField(null=True, db_column='experiencePoints', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'quest'
+    def __unicode__(self):
+        return self.name
+
+class Questprogress(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    completed = models.IntegerField(null=True, db_column='COMPLETED', blank=True) # Field name made lowercase.
+    updated = models.DateTimeField(null=True, db_column='UPDATED', blank=True) # Field name made lowercase.
+    quest_id = models.IntegerField(null=True, db_column='QUEST_ID', blank=True) # Field name made lowercase.
+    task_id = models.IntegerField(null=True, db_column='TASK_ID', blank=True) # Field name made lowercase.
+    user_id = models.IntegerField(null=True, db_column='USER_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'questprogress'
+
+class Studentasisgnment(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    assignedon = models.DateTimeField(null=True, db_column='ASSIGNEDON', blank=True) # Field name made lowercase.
+    description = models.CharField(max_length=765, db_column='DESCRIPTION', blank=True) # Field name made lowercase.
+    dueon = models.DateTimeField(null=True, db_column='DUEON', blank=True) # Field name made lowercase.
+    title = models.CharField(max_length=765, db_column='TITLE', blank=True) # Field name made lowercase.
+    course_id = models.IntegerField(null=True, db_column='COURSE_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'studentasisgnment'
+
+class Task(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    description = models.CharField(max_length=765, db_column='DESCRIPTION', blank=True) # Field name made lowercase.
+    name = models.CharField(max_length=765, db_column='NAME', blank=True) # Field name made lowercase.
+    type = models.CharField(max_length=765, db_column='TYPE', blank=True) # Field name made lowercase.
+    parent_id = models.IntegerField(null=True, db_column='PARENT_ID', blank=True) # Field name made lowercase.
+    quest_id = models.IntegerField(null=True, db_column='QUEST_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'task'
+
+class Title(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    position = models.CharField(max_length=765, db_column='POSITION', blank=True) # Field name made lowercase.
+    title = models.CharField(max_length=765, db_column='TITLE', blank=True) # Field name made lowercase.
+    comesfrom_id = models.IntegerField(null=True, db_column='COMESFROM_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'title'
\ No newline at end of file
diff --git a/halo_se_web/halo_web/settings.py b/halo_se_web/halo_web/settings.py
index 957a049..4ee1df4 100644
--- a/halo_se_web/halo_web/settings.py
+++ b/halo_se_web/halo_web/settings.py
@@ -107,6 +107,7 @@ TEMPLATE_DIRS = (
     # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
     # Always use forward slashes, even on Windows.
     # Don't forget to use absolute paths, not relative paths.
+    "/Users/miriammelnick/git/halo/halo_se_web/templates"
 )

 INSTALLED_APPS = (
@@ -116,6 +117,7 @@ INSTALLED_APPS = (
     'django.contrib.sites',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'halo_web',
     # Uncomment the next line to enable the admin:
     # 'django.contrib.admin',
     # Uncomment the next line to enable admin documentation:
diff --git a/halo_se_web/halo_web/urls.py b/halo_se_web/halo_web/urls.py
index 092b787..b9a440f 100644
--- a/halo_se_web/halo_web/urls.py
+++ b/halo_se_web/halo_web/urls.py
@@ -13,5 +13,5 @@ urlpatterns = patterns('',
     # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

     # Uncomment the next line to enable the admin:
-    url(r'^admin/', include(admin.site.urls)),
+  #  url(r'^admin/', include(admin.site.urls)),
 )
diff --git a/halo_se_web/halo_web/views.py b/halo_se_web/halo_web/views.py
new file mode 100644
index 0000000..22a39f8
--- /dev/null
+++ b/halo_se_web/halo_web/views.py
@@ -0,0 +1,47 @@
+from django.shortcuts import render_to_response, get_object_or_404
+from login.models import Quest, Enrollment, Course, HUser
+from django.http import HttpResponse, Http404, HttpResponseRedirect
+from django.template.context import RequestContext
+
+def index(request):
+    user = request.user
+    enrollment = Enrollment.objects.filter(user_id = user.id)
+    courses = []
+    for enr in enrollment:
+        courses.append(Course.objects.get(id = enr.course_id))
+    return render_to_response('halo_web/index.html', {'courses': courses}, context_instance = RequestContext(request))
+
+def quests(request):
+    quest_list = Quest.objects.all()
+    return render_to_response('halo_web/quests.html', {'quest_list': quest_list}, context_instance = RequestContext(request))
+
+def home(request):
+    user = request.user
+    admin_courses = []
+
+    if (user.is_authenticated()):
+        u_id = user.getUserId()
+        my_enrollment = Enrollment.objects.filter(user_id=u_id)
+        admin_enrollment = my_enrollment.filter(type="ADMIN")
+        for enr in admin_enrollment:
+            course = Course.objects.get(id=enr.getCourseId())
+            admin_courses.append(course)
+        if (len(admin_courses)>0):
+            return HttpResponseRedirect('/admin/')
+        else:
+            return HttpResponseRedirect('/halo_web/')
+    return HttpResponseRedirect('/login/')
+
+def leaderboard(request, course_id):
+    this_course = Course.objects.get(id=course_id)
+    course_enrollment = Enrollment.objects.filter(course_id=course_id)
+    enr_this_course = course_enrollment.get(user_id = request.user.id)
+    students = []
+    leaders = []
+    for enrstud in course_enrollment:
+        student = HUser.objects.get(id = enrstud.user_id)
+        students.append(student)
+    students.sort(key=lambda student: student.getXP(), reverse = True)
+    for i in range(5):
+        leaders.append(students[i])
+    return render_to_response('halo_web/leaderboard.html', {'enr_this_course': enr_this_course, 'leaders': leaders}, context_instance = RequestContext(request))
\ No newline at end of file
diff --git a/halo_se_web/login/__init__.py b/halo_se_web/login/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/halo_se_web/login/models.py b/halo_se_web/login/models.py
new file mode 100644
index 0000000..a7d7f3c
--- /dev/null
+++ b/halo_se_web/login/models.py
@@ -0,0 +1,113 @@
+from django.db import models
+import hashlib
+
+class HUser(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    achievementpoints = models.IntegerField(null=True, db_column='ACHIEVEMENTPOINTS', blank=True) # Field name made lowercase.
+    email = models.CharField(max_length=765, db_column='EMAIL', blank=True) # Field name made lowercase.
+    firstname = models.CharField(max_length=765, db_column='FIRSTNAME', blank=True) # Field name made lowercase.
+    lastname = models.CharField(max_length=765, db_column='LASTNAME', blank=True) # Field name made lowercase.
+    password = models.CharField(max_length=765, db_column='PASSWORD', blank=True) # Field name made lowercase.
+    status = models.CharField(max_length=765, db_column='STATUS', blank=True) # Field name made lowercase.
+    thumbnail = models.TextField(db_column='THUMBNAIL', blank=True) # Field name made lowercase.
+    xp = models.IntegerField(null=True, db_column='XP', blank=True) # Field name made lowercase.
+    activetitle_id = models.IntegerField(null=True, db_column='ACTIVETITLE_ID', blank=True) # Field name made lowercase.
+    level_id = models.IntegerField(null=True, db_column='LEVEL_ID', blank=True) # Field name made lowercase.
+    rememberme = models.CharField(max_length=765, db_column='REMEMBERME', blank=True) # Field name made lowercase.
+    remembermeexp = models.DateTimeField(null=True, blank=True)
+    facebooksessionkey = models.CharField(max_length=765, db_column='FACEBOOKSESSIONKEY', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'h_user'
+    def __unicode__(self):
+        return self.firstname + " " + self.lastname
+    def getName(self):
+        return self.firstname + " " + self.lastname
+    def getPassword(self):
+        return self.password
+    def getEmail(self):
+        return self.email
+    def check_password(self,typedPassword):
+        if (hashlib.sha1(typedPassword).hexdigest()==self.getPassword()):
+            return True
+        return False
+    def getXP(self):
+        return self.xp
+    def getUserId(self):
+        return self.id
+    def is_active(self):
+        return True     #we don't have a way to denote inactive users
+    def is_authenticated(self):
+        return True
+
+class Enrollment(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    type = models.CharField(max_length=765, db_column='TYPE', blank=True) # Field name made lowercase.
+    course_id = models.IntegerField(null=True, db_column='COURSE_ID', blank=True) # Field name made lowercase.
+    user_id = models.IntegerField(null=True, db_column='USER_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'enrollment'
+    def __unicode__(self):
+        return str(self.user_id)+" has "+str(self.type)+" access to "+str(self.course_id)
+    def getType(self):
+        return self.type
+    def getCourseId(self):
+        return self.course_id
+    def getUserId(self):
+        return self.user_id
+
+class Course(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    name = models.CharField(max_length=765, db_column='NAME', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'course'
+    def __unicode__(self):
+        return self.name
+    def getId(self):
+        return self.id
+    def getName(self):
+        return self.name
+
+
+class Quest(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    description = models.TextField(db_column='DESCRIPTION', blank=True) # Field name made lowercase.
+    name = models.CharField(max_length=765, db_column='NAME', blank=True) # Field name made lowercase.
+    assignment_id = models.IntegerField(null=True, db_column='ASSIGNMENT_ID', blank=True) # Field name made lowercase.
+    parent_id = models.IntegerField(null=True, db_column='PARENT_ID', blank=True) # Field name made lowercase.
+    experiencepoints = models.IntegerField(null=True, db_column='experiencePoints', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'quest'
+    def __unicode__(self):
+        return self.name
+
+class Questprogress(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    completed = models.IntegerField(null=True, db_column='COMPLETED', blank=True) # Field name made lowercase.
+    updated = models.DateTimeField(null=True, db_column='UPDATED', blank=True) # Field name made lowercase.
+    quest_id = models.IntegerField(null=True, db_column='QUEST_ID', blank=True) # Field name made lowercase.
+    task_id = models.IntegerField(null=True, db_column='TASK_ID', blank=True) # Field name made lowercase.
+    user_id = models.IntegerField(null=True, db_column='USER_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'questprogress'
+
+class Studentassignment(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    assignedon = models.DateTimeField(null=True, db_column='ASSIGNEDON', blank=True) # Field name made lowercase.
+    description = models.CharField(max_length=765, db_column='DESCRIPTION', blank=True) # Field name made lowercase.
+    dueon = models.DateTimeField(null=True, db_column='DUEON', blank=True) # Field name made lowercase.
+    title = models.CharField(max_length=765, db_column='TITLE', blank=True) # Field name made lowercase.
+    course_id = models.IntegerField(null=True, db_column='COURSE_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'studentassignment'
+    def __unicode__(self):
+        return self.title
+
+class Task(models.Model):
+    id = models.IntegerField(primary_key=True, db_column='ID') # Field name made lowercase.
+    description = models.CharField(max_length=765, db_column='DESCRIPTION', blank=True) # Field name made lowercase.
+    name = models.CharField(max_length=765, db_column='NAME', blank=True) # Field name made lowercase.
+    type = models.CharField(max_length=765, db_column='TYPE', blank=True) # Field name made lowercase.
+    parent_id = models.IntegerField(null=True, db_column='PARENT_ID', blank=True) # Field name made lowercase.
+    quest_id = models.IntegerField(null=True, db_column='QUEST_ID', blank=True) # Field name made lowercase.
+    class Meta:
+        db_table = u'task'
\ No newline at end of file
diff --git a/halo_se_web/login/tests.py b/halo_se_web/login/tests.py
new file mode 100644
index 0000000..501deb7
--- /dev/null
+++ b/halo_se_web/login/tests.py
@@ -0,0 +1,16 @@
+"""
+This file demonstrates writing tests using the unittest module. These will pass
+when you run "manage.py test".
+
+Replace this with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+
+class SimpleTest(TestCase):
+    def test_basic_addition(self):
+        """
+        Tests that 1 + 1 always equals 2.
+        """
+        self.assertEqual(1 + 1, 2)
diff --git a/halo_se_web/login/views.py b/halo_se_web/login/views.py
new file mode 100644
index 0000000..23af5bb
--- /dev/null
+++ b/halo_se_web/login/views.py
@@ -0,0 +1,65 @@
+from django.contrib.auth import authenticate, login, logout
+from django.contrib.auth.models import AnonymousUser
+from django.http import HttpResponse, Http404, HttpResponseRedirect
+from django import forms
+from django.shortcuts import render_to_response
+from django.template.context import RequestContext
+from login.models import HUser
+import hashlib
+
+class LoginForm(forms.Form):
+    uni = forms.CharField(max_length=100)
+    password = forms.CharField(widget=forms.PasswordInput(render_value=False),max_length=100)
+
+def doLogin(request):
+    if (request.user.is_authenticated()):
+        return HttpResponse("You are already logged in. Please <a href='/logout'>logout</a> if you wish to change users.")
+    def errorHandle(error):
+        form = LoginForm()
+        return render_to_response('login/login.html', {
+                'error' : error,
+                'form' : form,
+        }, context_instance = RequestContext(request))
+    if request.method == 'POST': # If the form has been submitted...
+        form = LoginForm(request.POST) # A form bound to the POST data
+        if form.is_valid(): # All validation rules pass
+            email = request.POST['uni']
+            password = request.POST['password']
+            user = authenticate(username=email, password=password)
+            if user is not None:
+                if user.is_active:
+                    # Redirect to a success page.
+                    login(request, user)
+                    return HttpResponseRedirect('/')
+                else:
+                    # Return a 'disabled account' error message
+                    error = u'account disabled'
+                    return errorHandle(error)
+            else:
+                 # Return an 'invalid login' error message.
+                error = u'invalid login'
+                return errorHandle(error)
+        else:
+            error = u'form is invalid'
+            return errorHandle(error)
+    else:
+        form = LoginForm() # An unbound form
+        return render_to_response('login/login.html', {
+            'request': request,
+            'form': form
+        }, context_instance = RequestContext(request))
+
+def doLogout(request):
+    logout(request)
+    return HttpResponseRedirect('/')
+
+def showCredentials(request):
+    user = request.user
+    if not user.is_authenticated():
+        return render_to_response('login/notloggedin.html', {'dump': user}, context_instance = RequestContext(request))
+    else:
+        password = user.getPassword()
+        email = user.getEmail()
+        return render_to_response('login/credentials.html', {'dump': user, 'password': password, 'email': email}, context_instance = RequestContext(request))
+
+
diff --git a/halo_se_web/media/__init__.py b/halo_se_web/media/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/halo_se_web/media/models.py b/halo_se_web/media/models.py
new file mode 100644
index 0000000..71a8362
--- /dev/null
+++ b/halo_se_web/media/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/halo_se_web/media/tests.py b/halo_se_web/media/tests.py
new file mode 100644
index 0000000..501deb7
--- /dev/null
+++ b/halo_se_web/media/tests.py
@@ -0,0 +1,16 @@
+"""
+This file demonstrates writing tests using the unittest module. These will pass
+when you run "manage.py test".
+
+Replace this with more appropriate tests for your application.
+"""
+
+from django.test import TestCase
+
+
+class SimpleTest(TestCase):
+    def test_basic_addition(self):
+        """
+        Tests that 1 + 1 always equals 2.
+        """
+        self.assertEqual(1 + 1, 2)
diff --git a/halo_se_web/media/urls.py b/halo_se_web/media/urls.py
new file mode 100644
index 0000000..4859fa3
--- /dev/null
+++ b/halo_se_web/media/urls.py
@@ -0,0 +1,7 @@
+from django.conf.urls.defaults import patterns, include, url
+
+urlpatterns = patterns('',
+
+    url(r'^(?P<poll_id>\d+)/vote/$', 'polls.views.vote'),
+
+)
\ No newline at end of file
diff --git a/halo_se_web/media/views.py b/halo_se_web/media/views.py
new file mode 100644
index 0000000..60f00ef
--- /dev/null
+++ b/halo_se_web/media/views.py
@@ -0,0 +1 @@
+# Create your views here.
diff --git a/halo_se_web/settings.py b/halo_se_web/settings.py
index f47d1f6..8c498e0 100644
--- a/halo_se_web/settings.py
+++ b/halo_se_web/settings.py
@@ -1,9 +1,10 @@
-# Django settings for halo_se_web project.
+# Django settings for halo_web project.

 DEBUG = True
 TEMPLATE_DEBUG = DEBUG

 ADMINS = (
+          ('Miriam Melnick', 'mrm2198@columbia.edu')
     # ('Your Name', 'your_email@example.com'),
 )

@@ -11,10 +12,10 @@ MANAGERS = ADMINS

 DATABASES = {
     'default': {
-        'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
-        'NAME': '',                      # Or path to database file if using sqlite3.
-        'USER': '',                      # Not used with sqlite3.
-        'PASSWORD': '',                  # Not used with sqlite3.
+        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+        'NAME': 'halo',                      # Or path to database file if using sqlite3.
+        'USER': 'root',                      # Not used with sqlite3.
+        'PASSWORD': 'alphabetsoup',                  # Not used with sqlite3.
         'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
         'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
     }
@@ -27,7 +28,7 @@ DATABASES = {
 # timezone as the operating system.
 # If running in a Windows environment this must be set to the same as your
 # system time zone.
-TIME_ZONE = 'America/Chicago'
+TIME_ZONE = 'America/New_York'

 # Language code for this installation. All choices can be found here:
 # http://www.i18nguy.com/unicode/language-identifiers.html
@@ -45,7 +46,7 @@ USE_L10N = True

 # Absolute filesystem path to the directory that will hold user-uploaded files.
 # Example: "/home/media/media.lawrence.com/media/"
-MEDIA_ROOT = ''
+MEDIA_ROOT = '/Users/miriammelnick/git/halo/halo_se_web/templates/media/user-uploaded/'

 # URL that handles the media served from MEDIA_ROOT. Make sure to use a
 # trailing slash.
@@ -56,7 +57,7 @@ MEDIA_URL = ''
 # Don't put anything in this directory yourself; store your static files
 # in apps' "static/" subdirectories and in STATICFILES_DIRS.
 # Example: "/home/media/media.lawrence.com/static/"
-STATIC_ROOT = ''
+STATIC_ROOT = '/Users/miriammelnick/git/halo/halo_se_web/static/'

 # URL prefix for static files.
 # Example: "http://media.lawrence.com/static/"
@@ -83,7 +84,7 @@ STATICFILES_FINDERS = (
 )

 # Make this unique, and don't share it with anybody.
-SECRET_KEY = '8mt9$qn+kl^x%5z6(!tog8(le054y@ug5wx*b75eorq$qzru8r'
+SECRET_KEY = 'q4j#ed)q%j(v17t*n&d!=2-_*jjiw8sombw6#y8dl_y)3l_x+_'

 # List of callables that know how to import templates from various sources.
 TEMPLATE_LOADERS = (
@@ -106,6 +107,7 @@ TEMPLATE_DIRS = (
     # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
     # Always use forward slashes, even on Windows.
     # Don't forget to use absolute paths, not relative paths.
+    "/Users/miriammelnick/git/halo/halo_se_web/templates"
 )

 INSTALLED_APPS = (
@@ -115,8 +117,12 @@ INSTALLED_APPS = (
     'django.contrib.sites',
     'django.contrib.messages',
     'django.contrib.staticfiles',
+    'googlecharts',
+    'halo_web',
+    'halo_admin',
+    'login',
     # Uncomment the next line to enable the admin:
-    # 'django.contrib.admin',
+    #'django.contrib.admin',
     # Uncomment the next line to enable admin documentation:
     # 'django.contrib.admindocs',
 )
@@ -143,3 +149,5 @@ LOGGING = {
         },
     }
 }
+
+AUTHENTICATION_BACKENDS = ('halo_se_web.backends.EmailAuthBackend',)
\ No newline at end of file
diff --git a/halo_se_web/settings.pyc b/halo_se_web/settings.pyc
deleted file mode 100644
index 6c527f1..0000000
Binary files a/halo_se_web/settings.pyc and /dev/null differ
diff --git a/halo_se_web/src/halo_se_web/__init__.pyc b/halo_se_web/src/halo_se_web/__init__.pyc
deleted file mode 100644
index 3c26004..0000000
Binary files a/halo_se_web/src/halo_se_web/__init__.pyc and /dev/null differ
diff --git a/halo_se_web/src/halo_se_web/settings.pyc b/halo_se_web/src/halo_se_web/settings.pyc
deleted file mode 100644
index 8b75d2e..0000000
Binary files a/halo_se_web/src/halo_se_web/settings.pyc and /dev/null differ
diff --git a/halo_se_web/templates/halo_admin/assignment_admin.html b/halo_se_web/templates/halo_admin/assignment_admin.html
new file mode 100644
index 0000000..7042d71
--- /dev/null
+++ b/halo_se_web/templates/halo_admin/assignment_admin.html
@@ -0,0 +1,27 @@
+{% extends "base_admin.html" %}
+{% block content %}
+
+{% if admin_this_course %}
+
+<div class="assignment-admin-wrapper">
+	<ul class="admin-course-list">
+		{% for course in admin_courses %}
+			<li> <a href="/admin/{{ course.id }}">{{ course.name }} </a></li>
+		{% endfor %}
+	</ul>
+
+	<ul class="assignment-list">
+		{% for asmt in assignment_list %}
+			<li>{{ asmt.title }} </li>
+		{% endfor %}
+	</ul>
+
+
+</div>
+</html>
+
+{% else %}
+Sorry, you do not have permission to see this page.
+
+{% endif %}
+{% endblock %}
\ No newline at end of file
diff --git a/halo_se_web/templates/halo_admin/course_admin.html b/halo_se_web/templates/halo_admin/course_admin.html
new file mode 100644
index 0000000..e8121ce
--- /dev/null
+++ b/halo_se_web/templates/halo_admin/course_admin.html
@@ -0,0 +1,38 @@
+{% extends "base_admin.html" %}
+{% block content %}
+{% if admin_this_course %}
+<div class="admin-wrapper">
+	<ul class="admin-course-list">
+		{% for course in admin_courses %}
+			<li> <a href="/admin/{{ course.id }}">{{ course.name }} </a></li>
+			<ul>
+				<li><a href="/admin/{{course.id}}/add_assignment">(+) Add New Assignment</a></li>
+			{% for assignment in assignments %}
+				<li><a href="/admin/{{course.id}}/{{assignment.id}}/quests">{{assignment.title}}</a></li>
+			{% endfor %}
+			</ul>
+		{% endfor %}
+	</ul>
+
+	{% load charts %}
+	{% chart %}
+		{% chart-title "Tasks Completed This Week" %}
+		{% chart-data data %}
+		{% chart-type "bar" %}
+		{% chart-size "300x1000" %}
+		{% axis "left" %}
+			{% axis-labels students %}
+		{% endaxis %}
+		{% axis "bottom" %}
+			{% axis-range 0 data_max %}
+		{% endaxis %}
+	{% endchart %}
+
+</div>
+
+{% else %}
+Sorry, you do not have permission to see this page. Please <a href="/login">log in</a> to administer a course.
+
+{% endif %}
+
+{% endblock %}
\ No newline at end of file
diff --git a/halo_se_web/templates/halo_admin/dashboard.html b/halo_se_web/templates/halo_admin/dashboard.html
new file mode 100644
index 0000000..43c76ab
--- /dev/null
+++ b/halo_se_web/templates/halo_admin/dashboard.html
@@ -0,0 +1,64 @@
+{% if admin_courses %}
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head>
+	<title>HALO SE Admin</title>
+	<link rel="stylesheet" href="{{ STATIC_URL }}css/dashboard.css" type="text/css" />
+<!--	<script src="{{ STATIC_URL }}js/jquery-1.6.4.js"></script>
+	<script src="{{ STATIC_URL }}js/jquery.jstree.js"></script>
+	<script src="{{ STATIC_URL }}js/dashboard.js"></script> -->
+</head>
+<body class="admin-dashboard">
+	<div class="header">
+		<div class="title">HALO SE Administration</div> <div class="welcome" >Welcome, {{ user }}. <a href="/logout">Logout</a></div>
+	</div>
+	<br/>
+Please select a class to administer.
+	<ul class="admin-course-list">
+		{% for course in admin_courses %}
+			<li class="list-course"> <a href="/admin/{{ course.id }}/assignments">{{ course.name }} </a> </li>
+			<ul>
+			{% for cid, asmtset in assignment_list %}
+				{% for asmt in asmtset %}
+				<li class="list-assignment"><a href="/admin/{{course.id}}/{{ asmt.id }}/quests">{{ asmt }}</a></li>
+				<ul>
+					{% for aid, questset in quest_list %}
+						{% if asmt.id == aid %}
+							{% for quest in questset %}
+								<li class="list-quest"><a href="/admin/{{course.id}}/{{asmt.id}}/{{quest.id}}/tasks">{{ quest.name }}</a></li>
+								<ul>
+									{% for qid, taskset in task_list %}
+										{% if quest.id == qid %}
+											{% for task in taskset %}
+												<li class="list-task">{{ task.name }}</li>
+											{% endfor %}
+										{% endif %}
+									{% endfor %}
+								</ul>
+							{% endfor %}
+						{% endif %}
+					{% endfor %}
+
+				</ul>
+				{% endfor %}
+			{% endfor %}
+			</ul>
+		{% endfor %}
+	</ul>
+	{% load charts %}
+	{% chart %}
+		{% chart-data data1 %}
+		{% chart-size "300x200" %}
+		{% chart-type "pie" %}
+		{% chart-labels "One" "Two" "Three" %}
+		{% chart-alt "It worked!" %}
+	{% endchart %}
+
+</body>
+</html>
+
+{% else %}
+Sorry, you do not have permission to see this page.
+
+{% endif %}
\ No newline at end of file
diff --git a/halo_se_web/templates/halo_web/index.html b/halo_se_web/templates/halo_web/index.html
new file mode 100644
index 0000000..82cb76e
--- /dev/null
+++ b/halo_se_web/templates/halo_web/index.html
@@ -0,0 +1,12 @@
+{% extends "base_generic.html" %}
+
+{% block content %}{% if courses %}
+	My Courses
+	<ul>
+	{% for course in courses %}
+		<li><a href="/halo_web/{{course.id}}/leaderboard">{{ course.name }}</a></li>
+	{% endfor %}
+	</ul>
+{% else %}
+	<p>You are not enrolled in any courses.</p>
+{% endif %} {% endblock %}
\ No newline at end of file
diff --git a/halo_se_web/templates/halo_web/quests.html b/halo_se_web/templates/halo_web/quests.html
new file mode 100644
index 0000000..96b9ffe
--- /dev/null
+++ b/halo_se_web/templates/halo_web/quests.html
@@ -0,0 +1,9 @@
+{% if quest_list %}
+	<ul>
+	{% for quest in quest_list %}
+		<li>{{ quest }}</li>
+	{% endfor %}
+	</ul>
+{% else %}
+	<p>No quests are available.</p>
+{% endif %}
\ No newline at end of file
diff --git a/halo_se_web/templates/login/credentials.html b/halo_se_web/templates/login/credentials.html
new file mode 100644
index 0000000..b2a8b18
--- /dev/null
+++ b/halo_se_web/templates/login/credentials.html
@@ -0,0 +1,3 @@
+Data Dump: {{ dump }} <br/>
+Email: {{ email }} <br/>
+Password Hash: {{ password }}
\ No newline at end of file
diff --git a/halo_se_web/templates/login/login.html b/halo_se_web/templates/login/login.html
new file mode 100644
index 0000000..a05eba9
--- /dev/null
+++ b/halo_se_web/templates/login/login.html
@@ -0,0 +1,13 @@
+{% if error %}
+
+	{{ error }}
+
+{% endif %}
+
+<h3>Please log in to HALO-SE Web</h3>
+
+<form action="." method="post">
+{% csrf_token %}
+{{ form.as_p }}
+<input type="submit" value="Submit" />
+</form>
\ No newline at end of file
diff --git a/halo_se_web/templates/login/splash.html b/halo_se_web/templates/login/splash.html
new file mode 100644
index 0000000..e69de29
diff --git a/halo_se_web/templates/login/success.html b/halo_se_web/templates/login/success.html
new file mode 100644
index 0000000..cf41f66
--- /dev/null
+++ b/halo_se_web/templates/login/success.html
@@ -0,0 +1 @@
+<h1>Welcome, {{ email }}</h1>
\ No newline at end of file
diff --git a/halo_se_web/templates/media/css/admin/dashboard.css b/halo_se_web/templates/media/css/admin/dashboard.css
new file mode 100644
index 0000000..edc6417
--- /dev/null
+++ b/halo_se_web/templates/media/css/admin/dashboard.css
@@ -0,0 +1,23 @@
+body {
+	font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;
+}
+
+.header {
+	background-color: lightblue;
+	border-radius: 15px;
+}
+
+.header .title {
+	font-weight: bold;
+	font-size: 24px;
+	margin-left: 30px;
+	padding-top: 30px;
+}
+.header .welcome {
+	text-align: right;
+	padding-right: 30px;
+}
+
+#crud-table {
+	padding:20px;
+}
\ No newline at end of file
diff --git a/halo_se_web/urls.py b/halo_se_web/urls.py
index cb99092..bee72df 100644
--- a/halo_se_web/urls.py
+++ b/halo_se_web/urls.py
@@ -1,10 +1,11 @@
 from django.conf.urls.defaults import patterns, include, url

 # Uncomment the next two lines to enable the admin:
-# from django.contrib import admin
-# admin.autodiscover()
+#from django.contrib import admin
+#admin.autodiscover()

 urlpatterns = patterns('',
+
     # Examples:
     # url(r'^$', 'halo_se_web.views.home', name='home'),
     # url(r'^halo_se_web/', include('halo_se_web.foo.urls')),
@@ -12,6 +13,19 @@ urlpatterns = patterns('',
     # Uncomment the admin/doc line below to enable admin documentation:
     # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),

+    url(r'^$', 'halo_web.views.home'),
+    url(r'^login/$', 'login.views.doLogin'),
+    url(r'^logout/$', 'login.views.doLogout'),
+    url(r'^login/success/$', 'login.views.success'),
+    url(r'^login/credentials/$', 'login.views.showCredentials'), #remove this before production
+
+    url(r'^admin/', include('halo_admin.urls')),
+
+    url(r'^halo_web/$', 'halo_web.views.index'),
+    url(r'^halo_web/(?P<course_id>\d+)/leaderboard/$', 'halo_web.views.leaderboard'),
+    url(r'^halo_web/quests/$', 'halo_web.views.quests'),
     # Uncomment the next line to enable the admin:
-    # url(r'^admin/', include(admin.site.urls)),
+#    url(r'^admin/', include(admin.site.urls)),
+
+ #   url(r'^media/', include('media.urls')),
 )
diff --git a/halo_se_web/urls.pyc b/halo_se_web/urls.pyc
deleted file mode 100644
index 617f542..0000000
Binary files a/halo_se_web/urls.pyc and /dev/null differ