Beispiel #1
0
 def logout(self, targetURL=h.encodeURL("/")):
     "Logout"
     # If the person is logged in,
     if h.isPerson():
         del session["minutesOffset"]
         del session["personID"]
         del session["nickname"]
         session.save()
     # Redirect
     return redirect(url(h.decodeURL(targetURL)))
Beispiel #2
0
 def logout(self, targetURL=h.encodeURL('/')):
     'Logout'
     # If the person is logged in,
     if h.isPerson():
         del session['minutesOffset']
         del session['personID']
         del session['nickname']
         session.save()
     # Redirect
     return redirect(url(h.decodeURL(targetURL)))
Beispiel #3
0
 def confirm(self, ticket):
     "Confirm changes"
     # Send feedback
     candidate = confirmPersonCandidate(ticket)
     # If the candidate exists,
     if candidate:
         messageCode = "updated" if candidate.person_id else "created"
     else:
         messageCode = "expired"
     # Return
     return redirect(url("person_login", targetURL=h.encodeURL("/"), messageCode=messageCode))
Beispiel #4
0
 def confirm(self, ticket):
     'Confirm changes'
     # Send feedback
     candidate = confirmPersonCandidate(ticket)
     # If the candidate exists,
     if candidate:
         messageCode = 'updated' if candidate.person_id else 'created'
     else:
         messageCode = 'expired'
     # Return
     return redirect(url('person_login', targetURL=h.encodeURL('/'), messageCode=messageCode))
Beispiel #5
0
 def test_logout(self):
     """
     Make sure that logging out works
     If the person is logged in, make sure the person gets logged out
     and is redirected properly.  If the person is already logged out, 
     return the user to the page before the user tried to log out.
     """
     # Initialize
     url_test = url("person_index")
     # Add person
     meta.Session.add(model.Person(username, model.hashString(password), nickname, email))
     meta.Session.commit()
     # Logging out should redirect back
     self.assert_(url_test in self.app.get(url("person_logout", targetURL=h.encodeURL(url_test))))
     # Log in
     self.assert_("Login" in self.app.get(url("person_login", targetURL=h.encodeURL(url_test))))
     self.assertEqual(
         simplejson.dumps({"isOk": 1}),
         self.app.post(url("person_login_"), dict(username=username, password=password)).body,
     )
     # Logging out should redirect back
     self.assert_(url_test in self.app.get(url("person_logout", targetURL=h.encodeURL(url_test))))
Beispiel #6
0
 def update(self):
     'Show account update page'
     # Load
     personID = h.getPersonID()
     # If the person is not logged in,
     if not personID:
         # Return
         return redirect(url('person_login', targetURL=h.encodeURL('/')))
     # Render
     c.isNew = False
     person = Session.query(model.Person).get(personID)
     # Return
     return formencode.htmlfill.render(render('/people/change.mako'), {
         'username': person.username,
         'nickname': person.nickname,
         'email': person.email,
         'email_sms': person.email_sms,
     })
Beispiel #7
0
 def clone(self, scenarioID):
     'Show form to create a new item based on datasets and parameters from existing scenario'
     # Make sure the user is logged in
     personID = h.getPersonID()
     if not personID:
         return redirect(url('person_login', targetURL=h.encodeURL(request.path)))
     # Make sure the user has access to the scenario
     scenario = Session.query(model.Scenario).filter(model.getScopeFilter(personID)).filter(model.Scenario.id==scenarioID).first()
     if not scenario:
         return redirect(url('new_scenario'))
     # Load
     scenarioInput = scenario.input
     # Prepare
     c.scenario = scenario
     c.metricModel = metric.getModel(request.GET.get('metricModel', scenarioInput['metric model name']))
     c.metricConfiguration = scenarioInput['metric configuration']
     c.networkModel = network.getModel(request.GET.get('networkModel', scenarioInput['network model name']))
     c.networkConfiguration = scenarioInput['network configuration']
     # Return
     return render('/scenarios/new.mako')
Beispiel #8
0
 def update(self):
     "Show account update page"
     # Load
     personID = h.getPersonID()
     # If the person is not logged in,
     if not personID:
         # Return
         return redirect(url("person_login", targetURL=h.encodeURL("/")))
     # Render
     c.isNew = False
     person = Session.query(model.Person).get(personID)
     # Return
     return formencode.htmlfill.render(
         render("/people/change.mako"),
         {
             "username": person.username,
             "nickname": person.nickname,
             "email": person.email,
             "email_sms": person.email_sms,
         },
     )
Beispiel #9
0
 def new(self, format='html'):
     'GET /scenarios/new: Show form to create a new item'
     # If the user is not logged in,
     if not h.isPerson():
         # Redirect to login
         return redirect(url('person_login', targetURL=h.encodeURL(h.url('new_scenario'))))
     # Make sure that the requested metric model exists
     metricModelNames = metric.getModelNames()
     metricModelName = request.GET.get('metricModel')
     if metricModelName not in metricModelNames:
         metricModelName = metricModelNames[0]
     c.metricModel = metric.getModel(metricModelName)
     c.metricConfiguration = {}
     # Make sure that the requested network model exists
     networkModelNames = network.getModelNames()
     networkModelName = request.GET.get('networkModel')
     if networkModelName not in networkModelNames:
         networkModelName = networkModelNames[0]
     c.networkModel = network.getModel(networkModelName)
     c.networkConfiguration = {}
     # Render form
     c.scenario = None
     return render('/scenarios/new.mako')
Beispiel #10
0
 def test_login(self):
     """
     Make sure that logging in works
     Ensure that the login page shows
     Ensure that bad credentials result in an error message
     Ensure that good credentials result in a proper redirect
     """
     # Initialize
     url_test = url("person_update")
     # Assert that the login page shows and stores url
     self.assert_("Login" in self.app.get(url("person_login", targetURL=h.encodeURL(url_test))))
     # Add person
     meta.Session.add(model.Person(username, model.hashString(password), nickname, email))
     meta.Session.commit()
     # Log in using bad credentials
     self.assertEqual(
         simplejson.dumps({"rejection_count": 1, "isOk": 0}),
         self.app.post(url("person_login_"), dict(username=username, password=password + "x")).body,
     )
     # Log in using good credentials
     self.assertEqual(
         simplejson.dumps({"isOk": 1}),
         self.app.post(url("person_login_"), dict(username=username, password=password)).body,
     )
Beispiel #11
0
 def create(self):
     'POST /scenarios: Create a new item'
     # Initialize
     personID = h.getPersonID()
     if not personID:
         return redirect(url('person_login', targetURL=h.encodeURL(h.url('new_scenario'))))
     # Load
     try:
         demographicDatabase_h = int(request.POST.get('demographicDatabase_h', 0))
     except ValueError:
         demographicDatabase_h = 0
     if not demographicDatabase_h and 'demographicDatabase' not in request.POST:
         return cjson.encode(dict(isOk=0, message='The demographicDatabase field is required'))
     scenarioName = request.POST.get('scenarioName') or 'Untitled'
     try:
         scenarioScope = int(request.POST.get('scenarioScope', model.scopePrivate))
     except ValueError:
         scenarioScope = model.scopePrivate
     metricModelName = request.POST.get('metricModelName', metric.getModelNames()[0])
     networkModelName = request.POST.get('networkModelName', network.getModelNames()[0])
     callbackURL = request.POST.get('callbackURL')
     # Create scenario
     scenario = model.Scenario(personID, scenarioName, scenarioScope)
     Session.add(scenario)
     Session.commit()
     scenarioFolder = scenario.getFolder()
     if os.path.exists(scenarioFolder):
         shutil.rmtree(scenarioFolder)
     store.makeFolderSafely(scenarioFolder)
     # If the user is using an existing demographicDatabase,
     if demographicDatabase_h:
         # Copy source in case it is deleted
         sourceScenario = Session.query(model.Scenario).get(demographicDatabase_h)
         sourceScenarioFolder = sourceScenario.getFolder()
         demographicFileName = sourceScenario.input['demographic file name']
         demographicPath = os.path.join(scenarioFolder, demographicFileName)
         shutil.copyfile(os.path.join(sourceScenarioFolder, demographicFileName), demographicPath)
     # If the user is uploading a new demographicDatabase,
     else:
         # Save original demographicDatabase in case the user wants it later
         demographicDatabase = request.POST['demographicDatabase']
         demographicFileExtension = os.path.splitext(demographicDatabase.filename)[1]
         demographicFileName = 'demographics' + demographicFileExtension
         demographicPath = os.path.join(scenarioFolder, demographicFileName)
         shutil.copyfileobj(demographicDatabase.file, open(demographicPath, 'wb'))
         demographicDatabase.file.close()
     # Store input
     configurationByName = extractConfigurationByName(request.POST, scenarioFolder)
     scenario.input = {
         'demographic file name': str(demographicFileName),
         'metric model name': metricModelName,
         'metric configuration': configurationByName.get('metric', {}),
         'network model name': networkModelName,
         'network configuration': configurationByName.get('network', {}),
         'callback url': callbackURL,
         'host url': request.host_url, 
     }
     Session.commit()
     store.zipFolder(scenarioFolder + '.zip', scenarioFolder)
     # Redirect
     redirect(url('scenario', id=scenario.id))
Beispiel #12
0
 def test_update(self):
     """
     Make sure that updating credentials works
     Make sure the update page only appears when the user is logged in
     Make sure the update form is filled with the user's credentials
     Make sure that update_ only works when the user is logged in
     Make sure that update confirmation works
     """
     # Assert that we are redirected to the login page if the person is not logged in
     response = self.app.get(url("person_update"))
     self.assertEqual(
         urlparse.urlparse(response.response.location).path, url("person_login", targetURL=h.encodeURL("/"))
     )
     # Assert that we get rejected if we try to post without logging in
     self.assertEqual(simplejson.dumps({"isOk": 0}), self.app.post(url("person_update_")).body)
     # Add person
     meta.Session.add(model.Person(username, model.hashString(password), nickname, email, email_sms))
     meta.Session.commit()
     # Log in
     self.app.post(url("person_login_"), dict(username=username, password=password))
     # Assert that the update form is filled with the user's credentials
     responseBody = self.app.get(url("person_update")).body
     self.assert_(username in responseBody)
     self.assert_(nickname in responseBody)
     self.assert_(email in responseBody)
     self.assert_(email_sms in responseBody)
     # Update credentials
     newUsername = store.makeRandomString(16)
     newPassword = store.makeRandomAlphaNumericString(parameter.PASSWORD_LENGTH_AVERAGE)
     newNickname = unicode(store.makeRandomString(16))
     newEmail = re.sub(r".*@", store.makeRandomString(16) + "@", email)
     newEmailSMS = re.sub(r".*@", store.makeRandomString(16) + "@", email)
     self.assertEqual(
         simplejson.dumps({"isOk": 1}),
         self.app.post(
             url("person_update_"),
             dict(
                 username=newUsername,
                 password=newPassword,
                 nickname=newNickname,
                 email=newEmail,
                 email_sms=newEmailSMS,
             ),
         ).body,
     )
     # Make sure the credentials have not changed yet
     self.assertEqual(
         meta.Session.query(model.Person)
         .filter_by(
             username=newUsername,
             password_hash=model.hashString(newPassword),
             nickname=newNickname,
             email=newEmail,
             email_sms=newEmailSMS,
         )
         .count(),
         0,
     )
     # Activate candidate
     self.app.get(
         url(
             "person_confirm",
             ticket=meta.Session.query(model.PersonCandidate.ticket).filter_by(username=newUsername).first()[0],
         )
     )
     # Make sure the credentials have changed
     self.assertEqual(
         meta.Session.query(model.Person)
         .filter_by(
             username=newUsername,
             password_hash=model.hashString(newPassword),
             nickname=newNickname,
             email=newEmail,
             email_sms=newEmailSMS,
         )
         .count(),
         1,
     )
Beispiel #13
0
 def login(self, targetURL=h.encodeURL("/")):
     "Show login form"
     c.messageCode = request.GET.get("messageCode")
     c.targetURL = h.decodeURL(targetURL)
     c.publicKey = config["safe"]["recaptcha"]["public"]
     return render("/people/login.mako")
Beispiel #14
0
 def login(self, targetURL=h.encodeURL('/')):
     'Show login form'
     c.messageCode = request.GET.get('messageCode')
     c.targetURL = h.decodeURL(targetURL)
     c.publicKey = config['safe']['recaptcha']['public']
     return render('/people/login.mako')