def put(self, resource_id, *args, **kwargs): """edit contact student""" from voluptuous import Schema from sosbeacon.student import Student student_key = ndb.Key(urlsafe = resource_id) if student_key.get().is_direct: super(StudentHandler, self).put(self, *args, **kwargs) return obj = json.loads(self.request.body) schema = Schema(self.schema, extra=True) try: obj = schema(obj) except: logging.exception('validation failed') student = student_key.get().to_dict() if obj['contacts'][1]['first_name'] == '': obj['contacts'][1]['first_name'] = student['contacts'][1]['first_name'] if obj['contacts'][1]['methods'][0]['value'] == obj['contacts'][1]['methods'][1]['value'] \ == obj['contacts'][1]['methods'][2]['value'] == '': obj['contacts'][1]['methods'][0]['value'] = student['contacts'][1]['methods'][0]['value'] obj['contacts'][1]['methods'][1]['value'] = student['contacts'][1]['methods'][1]['value'] obj['contacts'][1]['methods'][2]['value'] = student['contacts'][1]['methods'][2]['value'] student = Student.from_dict(obj) to_put = [student] ndb.put_multi(to_put) self.write_json_response(student.to_dict())
def get_student_keys(group_key, cursor=None, batch_size=50): """Return the next batch of students in this group, insert continuation task if there are more to process for this batch. Returns a tuple of students, new cursor, more. """ from sosbeacon.student import Student query = Student.query().order(Student.key) query = query.filter(Student.groups == group_key) start_cursor = ndb.Cursor(urlsafe=cursor) return query.fetch_page(batch_size, start_cursor=start_cursor, keys_only=True)
def get(self): """Export all student contact of current school""" from sosbeacon.student import Student from google.appengine.ext import blobstore from google.appengine.api import files session_store = sessions.get_store() session = session_store.get_session() school_urlsafe = session.get('s') school_key = ndb.Key(urlsafe=school_urlsafe) file_name = files.blobstore.create( mime_type='text/csv', _blobinfo_uploaded_filename='export_student.csv') students = Student.query(ndb.AND(Student.school == school_key, Student.is_direct == False), namespace='_x_').fetch() headers = [ 'group_name', 'contacts_first_name', 'contacts_last_name', 'parent1_first_name', 'parent1_last_name', 'parent1_email', 'parent1_text_phone', 'parent1_voice_phone', 'parent2_first_name', 'parent2_last_name', 'parent2_email', 'parent2_text_phone', 'parent2_voice_phone' ] headers = ','.join(headers) with files.open(file_name, 'a') as f: f.write(headers) f.write('\n') for student in students: with files.open(file_name, 'a') as f: info = self.get_info_student(student) info = ','.join(info) f.write(info) f.write('\n') files.finalize(file_name) blob_key = files.blobstore.get_blob_key(file_name) blob_info = blobstore.BlobInfo.get(blob_key) if not blobstore.get(blob_key): self.error(404) else: self.send_blob(blob_info, save_as=blob_info.filename)
def test_from_dict(self, memcache_delete_mock): """Ensure merging two non-acked doesn't ack.""" from sosbeacon.student import Student student_dict = { 'name': 'ly hoang long', 'groups': [], 'is_direct': False, } student = Student.from_dict(student_dict) self.assertEqual(student_dict['name'], student.name) self.assertEqual(student_dict['groups'], student.groups) self.assertEqual(student_dict['is_direct'], student.is_direct) self.assertFalse(memcache_delete_mock.call_count)
def test_to_from_composition(self): """Ensure to_dict(from_dict(x)) returns a correctly setup object.""" from datetime import datetime from sosbeacon.student import Student student_dict = { 'name': 'ly hoang long', 'added': datetime(2012, 8, 30, 7, 37), 'groups': [], 'is_direct': False, } student = Student.from_dict(student_dict) student.put() new_student = student.to_dict() self.assertEqual(student_dict, new_student)
def get(self): """Export all student contact of current school""" from sosbeacon.student import Student from google.appengine.ext import blobstore from google.appengine.api import files session_store = sessions.get_store() session = session_store.get_session() school_urlsafe = session.get('s') school_key = ndb.Key(urlsafe = school_urlsafe) file_name = files.blobstore.create(mime_type='text/csv',_blobinfo_uploaded_filename='export_student.csv') students = Student.query(ndb.AND(Student.school == school_key, Student.is_direct == False), namespace = '_x_').fetch() headers = ['group_name', 'contacts_first_name', 'contacts_last_name', 'parent1_first_name', 'parent1_last_name', 'parent1_email', 'parent1_text_phone', 'parent1_voice_phone', 'parent2_first_name', 'parent2_last_name', 'parent2_email', 'parent2_text_phone', 'parent2_voice_phone'] headers = ','.join(headers) with files.open(file_name, 'a') as f: f.write(headers) f.write('\n') for student in students: with files.open(file_name, 'a') as f: info = self.get_info_student(student) info = ','.join(info) f.write(info) f.write('\n') files.finalize(file_name) blob_key = files.blobstore.get_blob_key(file_name) blob_info = blobstore.BlobInfo.get(blob_key) if not blobstore.get(blob_key): self.error(404) else: self.send_blob(blob_info, save_as=blob_info.filename)
def put(self, resource_id, *args, **kwargs): """edit contact student""" from voluptuous import Schema from sosbeacon.student import Student student_key = ndb.Key(urlsafe=resource_id) if student_key.get().is_direct: super(StudentHandler, self).put(self, *args, **kwargs) return obj = json.loads(self.request.body) schema = Schema(self.schema, extra=True) try: obj = schema(obj) except: logging.exception('validation failed') student = student_key.get().to_dict() if obj['contacts'][1]['first_name'] == '': obj['contacts'][1]['first_name'] = student['contacts'][1][ 'first_name'] if obj['contacts'][1]['methods'][0]['value'] == obj['contacts'][1]['methods'][1]['value'] \ == obj['contacts'][1]['methods'][2]['value'] == '': obj['contacts'][1]['methods'][0]['value'] = student['contacts'][1][ 'methods'][0]['value'] obj['contacts'][1]['methods'][1]['value'] = student['contacts'][1][ 'methods'][1]['value'] obj['contacts'][1]['methods'][2]['value'] = student['contacts'][1][ 'methods'][2]['value'] student = Student.from_dict(obj) to_put = [student] ndb.put_multi(to_put) self.write_json_response(student.to_dict())
def setUp(self): from sosbeacon.school import School from sosbeacon.student import Student from sosbeacon.student import DEFAULT_STUDENT_ID self.testbed = testbed.Testbed() self.testbed.activate() self.testbed.setup_env(app_id='testapp') self.testbed.init_datastore_v3_stub() self.testbed.init_memcache_stub() url_map = [ webapp2.Route(r'/service/student/<resource_id:.+>', handler='sosbeacon.service.StudentHandler'), webapp2.Route(r'/service/student<:/?>', handler='sosbeacon.service.StudentListHandler'), webapp2.Route(r'/service/admin/user<:/?>', handler='sosbeacon.service.UserListHandler'), ('/authentication/login', LoginUserHandler) ] app = webapp2.WSGIApplication( url_map, config=webapp_config ) self.testapp = webtest.TestApp(app) self.school1 = School( id='100', name='School_Test', ) self.school2 = School( id='200', name='School_Test_2', ) self.school1.put() self.school2.put() params = { 'name': 'longly', 'email': '*****@*****.**', 'phone': '84973796065', 'password': '******', 'schools': [self.school1.key.urlsafe()] } self.testapp.post_json('/service/admin/user/', params) email = '*****@*****.**' password = '******' params1 = {'email': email, 'password': password} self.testapp.post('/authentication/login', params1) self.student1 = Student( id = '1', name = 'Student 1', contacts = [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ], school = self.school1.key, is_direct = False ) self.student2 = Student( id = '2', name = 'Student 2', contacts = [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ], school = self.school1.key, is_direct = False ) self.student3 = Student( id = '3', name = 'Student 3', contacts = [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ], school = self.school1.key, is_direct = True ) self.student4 = Student( id = '4', name = 'Student 4', contacts = [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ], school = self.school2.key, is_direct = True ) self.student5 = Student( id = '5', name = 'Student 5', contacts = [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ], school = self.school2.key, is_direct = False )
class TestServiceContact(unittest.TestCase): """Test service contact""" def setUp(self): from sosbeacon.school import School from sosbeacon.student import Student from sosbeacon.student import DEFAULT_STUDENT_ID self.testbed = testbed.Testbed() self.testbed.activate() self.testbed.setup_env(app_id='testapp') self.testbed.init_datastore_v3_stub() self.testbed.init_memcache_stub() url_map = [ webapp2.Route(r'/service/student/<resource_id:.+>', handler='sosbeacon.service.StudentHandler'), webapp2.Route(r'/service/student<:/?>', handler='sosbeacon.service.StudentListHandler'), webapp2.Route(r'/service/admin/user<:/?>', handler='sosbeacon.service.UserListHandler'), ('/authentication/login', LoginUserHandler) ] app = webapp2.WSGIApplication( url_map, config=webapp_config ) self.testapp = webtest.TestApp(app) self.school1 = School( id='100', name='School_Test', ) self.school2 = School( id='200', name='School_Test_2', ) self.school1.put() self.school2.put() params = { 'name': 'longly', 'email': '*****@*****.**', 'phone': '84973796065', 'password': '******', 'schools': [self.school1.key.urlsafe()] } self.testapp.post_json('/service/admin/user/', params) email = '*****@*****.**' password = '******' params1 = {'email': email, 'password': password} self.testapp.post('/authentication/login', params1) self.student1 = Student( id = '1', name = 'Student 1', contacts = [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ], school = self.school1.key, is_direct = False ) self.student2 = Student( id = '2', name = 'Student 2', contacts = [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ], school = self.school1.key, is_direct = False ) self.student3 = Student( id = '3', name = 'Student 3', contacts = [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ], school = self.school1.key, is_direct = True ) self.student4 = Student( id = '4', name = 'Student 4', contacts = [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ], school = self.school2.key, is_direct = True ) self.student5 = Student( id = '5', name = 'Student 5', contacts = [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ], school = self.school2.key, is_direct = False ) def test_service_create_student(self): """Ensure create success new student with json object send from client""" params = { 'name': 'Student Test', 'groups': [], 'contacts': [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ] } response = self.testapp.post_json('/service/student', params) obj = json.loads(response.normal_body) self.assertEqual(response.status_int, 200) self.assertEqual(obj['name'], params['name']) self.assertEqual(obj['groups'], params['groups']) self.assertFalse(obj['is_direct']) def test_service_get_filter_student_contact(self): """Ensure server response student contact which same school""" from google.appengine.ext import ndb to_put = [self.student1, self.student2, self.student3, self.student4, self.student5] ndb.put_multi(to_put) response = self.testapp.get('/service/student?feq_is_direct=false') obj = json.loads(response.normal_body) self.assertEqual(len(obj), 2) def test_service_get_filter_direct_contact(self): """Ensure server response student contact which same school and default student""" from google.appengine.ext import ndb to_put = [self.student1, self.student2, self.student3, self.student4, self.student5] ndb.put_multi(to_put) response = self.testapp.get('/service/student?feq_is_direct=true') obj = json.loads(response.normal_body) self.assertEqual(len(obj), 2) self.assertTrue(obj[0]['default_student']) def test_service_edit_student(self): """Ensure student will be update new data""" self.student1.put() params = { 'name': 'Update Student', 'groups': [], 'contacts': [{ 'name': 'contact 1', 'methods': ['123432', '*****@*****.**'] }, { 'name': 'contact 2', 'methods': ['123432', '*****@*****.**'] } ] } response = self.testapp.put_json('/service/student/%s' % self.student1.key.urlsafe(), params) obj = json.loads(response.normal_body) self.assertEqual(response.status_int, 200) self.assertEqual(obj['name'], params['name']) self.assertEqual(obj['groups'], params['groups']) def test_service_delete_student(self): """Ensure this student will be None object""" from google.appengine.ext import ndb self.student1.put() response = self.testapp.delete('/service/student/%s' %self.student1.key.urlsafe()) query_event = ndb.Key(urlsafe=self.student1.key.urlsafe()) self.assertIsNone(query_event.get()) self.assertEqual(response.status_int, 200)