Displaying differences for changeset
 
display as  

src/moplay/accounts.py

@@ -11,7 +11,7 @@
         """
         user = users.get_current_user()
         if user:
-            account = Account.from_id(user.user_id())
+            account = Account.retrieve(user.user_id())
             self.response.write(account.to_json())
         else:
             self.redirect('/')
@@ -28,7 +28,7 @@
 
             if Account.exists(user_id):
 
-                account = Account.from_id(user_id)
+                account = Account.retrieve(user_id)
                 if name is not None:
                     account.name = name
                 account.put()

src/moplay/js/multiobj.js

@@ -777,6 +777,24 @@
     });
 }
 
+function problemExists() {
+    var exists = false;
+    $.ajax({
+        url: '/problem_id',
+        type: 'GET',
+        contentType: "application/json; charset=utf-8",
+        dataType: "json",
+        async: false,
+        data: {
+            name: $('problem_name').val()
+        },
+        success: function(response) {
+            exists = response.id != null;
+        }
+    });
+    return exists;
+}
+
 function saveCode() {
     var request = getCSIPRequest();
     $.ajax({

src/moplay/main.py

@@ -5,7 +5,7 @@
 from templates import env
 from runner import RunHandler
 from accounts import AccountHandler
-from problems import ProblemHandler, ProblemListHandler, ProblemTemplateHandler
+from problems import ProblemHandler, ProblemIDHandler, ProblemListHandler, ProblemTemplateHandler
 
 
 class MainHandler(webapp2.RequestHandler):
@@ -42,4 +42,5 @@
     ('/problem', ProblemHandler),
     ('/problems_list', ProblemListHandler),
     ('/problems_template', ProblemTemplateHandler),
+    ('/problems_id', ProblemIDHandler),
 ], debug=True)

src/moplay/models.py

@@ -34,9 +34,8 @@
         return ndb.Key(Account, hashlib.md5(user_id).hexdigest())
 
     @staticmethod
-    def from_id(user_id):
-        k = Account.key_from_id(user_id)
-        return k.get()
+    def retrieve(user_id):
+        return Account.key_from_id(user_id).get()
 
     @classmethod
     def exists(cls, user_id):
@@ -208,5 +207,17 @@
         return p
 
     @classmethod
-    def exists(cls, name, owner_id):
+    def exists(cls, urlsafe_id):
+        return len(cls.query(ancestor=ndb.Key(urlsafe=urlsafe_id)).fetch(1)) != 0
+
+    @classmethod
+    def exists_by_name(cls, name, owner_id):
         return len(cls.query(ancestor=Problem.build_key_from_name(name, owner_id)).fetch(1)) != 0
+
+    @staticmethod
+    def retrieve(urlsafe_id):
+        return ndb.Key(urlsafe=urlsafe_id).get()
+
+    @staticmethod
+    def retrieve_by_name(name, owner_id):
+        return Problem.build_key_from_name(name, owner_id).get()

src/moplay/problems.py

@@ -1,3 +1,4 @@
+import json
 import webapp2
 from templates import env
 from models import Problem
@@ -12,19 +13,23 @@
         Get a problem by ID, check for permission
         """
 
-        key = ndb.Key(urlsafe=self.request.get('id'))
-        problem = key.get()
+        problem_id = self.request.get('id')
 
-        if problem.public:
-            self.response.write(problem.to_json())
+        if Problem.exists(problem_id):
+            problem = Problem.retrieve(problem_id)
+            if problem.public:
+                self.response.write(problem.to_json())
 
-        else:
-            user = users.get_current_user()
-            owner_id = user.user_id()
-            if owner_id == problem.owner_id:
-                self.response.write(problem.to_json())
             else:
-                self.error(403)
+                user = users.get_current_user()
+                if user:
+                    owner_id = user.user_id()
+                    if owner_id == problem.owner_id:
+                        self.response.write(problem.to_json())
+                    else:
+                        self.error(403)
+                else:
+                    self.redirect('/')
 
     def post(self):
         """
@@ -41,6 +46,29 @@
             self.error(403)
 
 
+class ProblemIDHandler(webapp2.RequestHandler):
+
+    def get(self):
+        """
+        Get whether a problem exists_by_name
+        """
+
+        name = self.request.get('name')
+        user = users.get_current_user()
+
+        if user and Problem.exists_by_name(name, user.user_id()):
+            problem = Problem.retrieve_by_name(name, user.user_id())
+            if problem.public or problem.owner_id == user.user_id():
+                self.response.write(json.dumps({
+                    'id': problem.key.urlsafe()
+                }))
+                return
+
+        self.response.write(json.dumps({
+            'id': None
+        }))
+
+
 class ProblemListHandler(webapp2.RequestHandler):
 
     def get(self):