Пример #1
0
    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())
Пример #2
0
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)
Пример #3
0
    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)
Пример #4
0
    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)
Пример #5
0
    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)
Пример #6
0
    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)
Пример #7
0
    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())
Пример #8
0
    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
        )
Пример #9
0
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)