Ejemplo n.º 1
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = json.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, 'announcement-put', {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'Object not found.', {'key': key})
            return

        payload = request.get('payload')
        transforms.dict_to_entity(entity, transforms.json_to_dict(
            json.loads(payload), SCHEMA_DICT))
        entity.put()

        transforms.send_json_response(self, 200, 'Saved.')
Ejemplo n.º 2
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = json.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(request, 'announcement-put',
                                              {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(self, 401, 'Access denied.',
                                          {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(self, 404, 'Object not found.',
                                          {'key': key})
            return

        payload = request.get('payload')
        transforms.dict_to_entity(
            entity, transforms.json_to_dict(json.loads(payload), SCHEMA_DICT))
        entity.put()

        transforms.send_json_response(self, 200, 'Saved.')
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(request, 'announcement-put',
                                              {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(self, 401, 'Access denied.',
                                          {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(self, 404, 'Object not found.',
                                          {'key': key})
            return

        payload = request.get('payload')
        transforms.dict_to_entity(
            entity,
            transforms.json_to_dict(transforms.loads(payload),
                                    AnnouncementsItemRESTHandler.SCHEMA_DICT))
        entity.put()

        email_sent = False
        if entity.send_email and not entity.is_draft:
            # get all students email
            all_students = self.get_students()
            email_list = []
            recipient = ""
            for s in all_students:
                if s.is_enrolled and s.email != "*****@*****.**":
                    recipient = s.name + "<" + s.email + ">"
                    email_list.append(recipient)

            # send an announcement email
            sender_address = "MOOC <*****@*****.**>"
            user_address = email_list
            subject = "MOOC Announcement: " + entity.title
            body = ""
            html = entity.html
            mail.send_mail(sender_address,
                           "*****@*****.**",
                           subject,
                           body,
                           html=html,
                           bcc=user_address)

        if entity.send_email:
            message = 'Saved and sent.'
        else:
            message = 'Saved.'

        transforms.send_json_response(self, 200, message)
Ejemplo n.º 4
0
 def put_sample_announcements(self):
     """Loads sample data into a database."""
     items = []
     for item in samples.SAMPLE_ANNOUNCEMENTS:
         entity = AnnouncementEntity()
         transforms.dict_to_entity(entity, item)
         entity.put()
         items.append(entity)
     return items
Ejemplo n.º 5
0
 def put_sample_announcements(self):
     """Loads sample data into a database."""
     items = []
     for item in samples.SAMPLE_ANNOUNCEMENTS:
         entity = AnnouncementEntity()
         transforms.dict_to_entity(entity, item)
         entity.put()
         items.append(entity)
     return items
Ejemplo n.º 6
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')
        edit_mode = request.get('mode')

        if GLOBAL_DEBUG:
            logging.warning('***RAM*** put request = ' + str(request))

        if not self.assert_xsrf_token_or_fail(
                request, 'teacher-put', {'key': key}):
            return

        if not TeacherRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'MobileCSP: Admin access denied.', {'key': key})
            return

        entity = TeacherEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'MobileCSP: Teacher Entity not found.', {'key': key})
            return

        schema = TeacherItemRESTHandler.SCHEMA()

        payload = request.get('payload')
        update_dict = transforms.json_to_dict(
            transforms.loads(payload), schema.get_json_schema_dict())

        #  Get the teacher's user_id
        user = Student.get_first_by_email(update_dict['email'])[0]  # returns a tuple
        if not user:
            transforms.send_json_response(
                self, 404, 'MobileCSP: No registered user found for ' + update_dict['email'], {'key': key})
            return

        # Check that the teacher isn't already registered
        if update_dict['mode'] == 'Add':
            teachers = TeacherEntity.get_teachers()
            for teacher in teachers:
                if teacher.email == update_dict['email']:
                    transforms.send_json_response(
                        self, 404, 'MobileCSP: User is already registered as a teacher ' + update_dict['email'], {'key': key})
                    return

        if GLOBAL_DEBUG:
            logging.debug('****RAM**** teacher id ' + str(user.user_id))

        # Store the user_id
        update_dict['user_id'] = user.user_id

        transforms.dict_to_entity(entity, update_dict)

        entity.put()

        transforms.send_json_response(self, 200, 'Saved.')
Ejemplo n.º 7
0
 def put_sample_wiki(self):
     """Loads sample data into a database."""
     items = []
     for item in samples.SAMPLE_WIKI_ENTRIES:
         entity = WikiEntity()            
         transforms.dict_to_entity(entity, item)
         entity.put()
         items.append(entity)
     return items
Ejemplo n.º 8
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(request, 'announcement-put',
                                              {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(self, 401, 'Access denied.',
                                          {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(self, 404, 'Object not found.',
                                          {'key': key})
            return

        schema = AnnouncementsItemRESTHandler.SCHEMA(
            'Announcement',
            self.get_course().get_course_announcement_list_email())

        payload = request.get('payload')
        update_dict = transforms.json_to_dict(transforms.loads(payload),
                                              schema.get_json_schema_dict())

        entity.labels = utils.list_to_text(
            LabelGroupsHelper.decode_labels_group(
                update_dict.get('label_groups')))

        transforms.dict_to_entity(entity, update_dict)

        entity.put()
        AnnouncementUtil.update_course_with_last_announcement(
            self.app_context.get_namespace_name())

        email_sent = False
        if entity.send_email:
            email_manager = notify.EmailManager(self.get_course())
            email_sent = email_manager.send_announcement(
                entity.title, entity.html, intent=ANNOUNCEMENTS_INTENT)

        if entity.send_email and not email_sent:
            if not self.get_course().get_course_announcement_list_email():
                message = 'Saved. Announcement list not configured.'
            else:
                message = 'Saved, but there was an error sending email.'
        else:
            message = 'Saved.'
        transforms.send_json_response(self, 200, message)
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, 'announcement-put', {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'Object not found.', {'key': key})
            return

        payload = request.get('payload')
        transforms.dict_to_entity(entity, transforms.json_to_dict(
            transforms.loads(payload),
            AnnouncementsItemRESTHandler.SCHEMA_DICT))
        entity.put()

        email_sent = False
        if entity.send_email and not entity.is_draft:
            # get all students email
            all_students = self.get_students()
            email_list = []
            recipient = ""
            for s in all_students:
                if s.is_enrolled and s.email != "*****@*****.**":
                    recipient = s.name + "<" + s.email + ">"
                    email_list.append(recipient)

            # send an announcement email
            sender_address = "MOOC <*****@*****.**>"
            user_address = email_list
            subject = "MOOC Announcement: " + entity.title
            body = ""
            html = entity.html
            mail.send_mail(sender_address, "*****@*****.**", subject, body, html=html, bcc=user_address)

        if entity.send_email:
            message = 'Saved and sent.'
        else:
            message = 'Saved.'

        transforms.send_json_response(self, 200, message)
Ejemplo n.º 10
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, 'announcement-put', {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'Object not found.', {'key': key})
            return

        schema = AnnouncementsItemRESTHandler.SCHEMA(
            'Announcement',
            self.get_course().get_course_announcement_list_email())

        payload = request.get('payload')
        update_dict = transforms.json_to_dict(
            transforms.loads(payload), schema.get_json_schema_dict())

        entity.labels = utils.list_to_text(
            LabelGroupsHelper.decode_labels_group(
                update_dict.get('label_groups')))

        transforms.dict_to_entity(entity, update_dict)

        entity.put()

        email_sent = False
        if entity.send_email:
            email_manager = notify.EmailManager(self.get_course())
            email_sent = email_manager.send_announcement(
                entity.title, entity.html)

        if entity.send_email and not email_sent:
            if not self.get_course().get_course_announcement_list_email():
                message = 'Saved. Announcement list not configured.'
            else:
                message = 'Saved, but there was an error sending email.'
        else:
            message = 'Saved.'
        transforms.send_json_response(self, 200, message)
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, 'announcement-put', {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'Object not found.', {'key': key})
            return

        payload = request.get('payload')
        transforms.dict_to_entity(entity, transforms.json_to_dict(
            transforms.loads(payload),
            AnnouncementsItemRESTHandler.SCHEMA_DICT))
        entity.put()

        email_sent = False
        if entity.send_email:
            email_manager = notify.EmailManager(self.get_course())
            email_sent = email_manager.send_announcement(
                entity.title, entity.html)

        if entity.send_email and not email_sent:
            if not self.get_course().get_course_announcement_list_email():
                message = 'Saved. Announcement list not configured.'
            else:
                message = 'Saved, but there was an error sending email.'
        else:
            
            #if message is public
            if entity.is_draft == False:
                message = 'Saved and notifications sent correctly.'
                send_push_notification(self.app_context.get_environ()['course']['title'], entity.title, entity.html)
            else:
                message = 'Saved.'


        transforms.send_json_response(self, 200, message)
    def test_bidirectional_transforms_succeed(self):
        """Tests that transforms entity<->dict<->json round trips correctly."""
        referenced_model_key = ReferencedModel().put()
        entity = UnvalidatedReference(
            referenced_model_key=referenced_model_key)
        entity.put()

        transformed = transforms.entity_to_dict(entity)
        self.assertEqual(referenced_model_key, entity.referenced_model_key)
        self.assertEqual(referenced_model_key,
                         transformed['referenced_model_key'])

        new_key = ReferencedModel().put()
        transformed['referenced_model_key'] = new_key
        restored = transforms.dict_to_entity(entity, transformed)
        self.assertEqual(new_key, restored.referenced_model_key)

        json = transforms.dict_to_json(transformed, None)
        self.assertEqual(str(new_key), json['referenced_model_key'])

        from_json = transforms.json_to_dict(
            json, {'properties': {
                'referenced_model_key': {
                    'type': 'string'
                }
            }})
        self.assertEqual({'referenced_model_key': str(new_key)}, from_json)
Ejemplo n.º 13
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, 'announcement-put', {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'Object not found.', {'key': key})
            return

        payload = request.get('payload')
        transforms.dict_to_entity(entity, transforms.json_to_dict(
            transforms.loads(payload),
            AnnouncementsItemRESTHandler.SCHEMA_DICT))
        entity.put()

        if not (entity.is_draft or entity.already_notified):
            Notification.notify_all_students(url='/announcements',
                    text=entity.title)
            entity.already_notified = True
            entity.put()

        email_sent = False
        if entity.send_email:
            email_manager = notify.EmailManager(self.get_course())
            email_sent = email_manager.send_announcement(
                entity.title, entity.html)

        if entity.send_email and not email_sent:
            if not self.get_course().get_course_announcement_list_email():
                message = 'Saved. Announcement list not configured.'
            else:
                message = 'Saved, but there was an error sending email.'
        else:
            message = 'Saved.'
        transforms.send_json_response(self, 200, message)
Ejemplo n.º 14
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, self.ACTION, {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'Object not found.', {'key': key})
            return

        schema = AnnouncementsItemRESTHandler.SCHEMA()

        payload = request.get('payload')
        update_dict = transforms.json_to_dict(
            transforms.loads(payload), schema.get_json_schema_dict())
        if entity.is_draft and not update_dict.get('set_draft'):
            item = news.NewsItem(
                str(TranslatableResourceAnnouncement.key_for_entity(entity)),
                AnnouncementsStudentHandler.URL.lstrip('/'))
            news.CourseNewsDao.add_news_item(item)

        # The datetime widget returns a datetime object and we need a UTC date.
        update_dict['date'] = update_dict['date'].date()
        del update_dict['key']  # Don't overwrite key member method in entity.
        transforms.dict_to_entity(entity, update_dict)

        entity.put()

        transforms.send_json_response(self, 200, 'Saved.')
Ejemplo n.º 15
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, 'announcement-put', {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'Object not found.', {'key': key})
            return

        schema = AnnouncementsItemRESTHandler.SCHEMA()

        payload = request.get('payload')
        update_dict = transforms.json_to_dict(
            transforms.loads(payload), schema.get_json_schema_dict())

        # The datetime widget returns a datetime object and we need a UTC date.
        update_dict['date'] = update_dict['date'].date()

        entity.labels = common_utils.list_to_text(
            resources_display.LabelGroupsHelper.field_data_to_labels(
                update_dict))
        resources_display.LabelGroupsHelper.remove_label_field_data(update_dict)

        transforms.dict_to_entity(entity, update_dict)

        entity.put()

        transforms.send_json_response(self, 200, 'Saved.')
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, 'announcement-put', {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'Object not found.', {'key': key})
            return

        schema = AnnouncementsItemRESTHandler.SCHEMA()

        payload = request.get('payload')
        update_dict = transforms.json_to_dict(
            transforms.loads(payload), schema.get_json_schema_dict())

        # The datetime widget returns a datetime object and we need a UTC date.
        update_dict['date'] = datetime.datetime.strptime(
            update_dict['date'], courses.ISO_8601_DATE_FORMAT).date()

        entity.labels = utils.list_to_text(
            LabelGroupsHelper.decode_labels_group(
                update_dict.get('label_groups')))

        transforms.dict_to_entity(entity, update_dict)

        entity.put()

        transforms.send_json_response(self, 200, 'Saved.')
 def test_bidirectional_transforms_succeed(self):
     """Tests that transforms entity<->dict<->json round trips correctly."""
     referenced_model_key = ReferencedModel().put()
     entity = UnvalidatedReference(referenced_model_key=referenced_model_key)
     entity.put()
     transformed = transforms.entity_to_dict(entity)
     self.assertEqual(referenced_model_key, entity.referenced_model_key)
     self.assertEqual(referenced_model_key, transformed["referenced_model_key"])
     new_key = ReferencedModel().put()
     transformed["referenced_model_key"] = new_key
     restored = transforms.dict_to_entity(entity, transformed)
     self.assertEqual(new_key, restored.referenced_model_key)
     json = transforms.dict_to_json(transformed, None)
     self.assertEqual(str(new_key), json["referenced_model_key"])
     from_json = transforms.json_to_dict(json, {"properties": {"referenced_model_key": {"type": "string"}}})
     self.assertEqual({"referenced_model_key": str(new_key)}, from_json)
Ejemplo n.º 18
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, 'announcement-put', {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'Object not found.', {'key': key})
            return

        payload = request.get('payload')
        transforms.dict_to_entity(entity, transforms.json_to_dict(
            transforms.loads(payload),
            AnnouncementsItemRESTHandler.SCHEMA_DICT))
        entity.put()

        # Google Course Builder starts:
        #email_sent = False
        #if entity.send_email:
        #    email_manager = notify.EmailManager(self.get_course())
        #    email_sent = email_manager.send_announcement(
        #        entity.title, entity.html)
        #if entity.send_email and not email_sent:
        #    if not self.get_course().get_course_announcement_list_email():
        #        message = 'Saved. Announcement list not configured.'
        #    else:
        #        message = 'Saved, but there was an error sending email.'
        #else:
        #    message = 'Saved.'
        # Google Course Builder ends


        # CGL-MOOC-Builder: Get user's Google App email and
        # course title from course setting page
        course = self.app_context.get_environ()['course']
        if 'google_app_email' in course:
            sender_email = course['google_app_email']
        else:
            sender_email = ''

        if 'title' in course:
            course_title = course['title']
        else:
            course_title = ''

        # CGL-MOOC-Builder starts:
        # Send an email when an announcement was made
        if entity.send_email and not entity.is_draft:
            # get all students email
            all_students = self.get_students()
            email_list = []
            recipient = ""
            for s in all_students:
                if s.is_enrolled:
                    recipient = s.name + "<" + s.email + ">"
                    email_list.append(recipient)
            # send an announcement email
            sender_address = course_title + " <"+sender_email+">"
            user_address = email_list
            subject = "Announcement: " + entity.title
            body = ""
            html = entity.html
            mail.send_mail(sender_address, "*****@*****.**", subject, body, html=html, bcc=user_address)
        if entity.send_email:
            message = 'Saved and sent.'
        else:
            message = 'Saved.'
        # CGL-MOOC-Builder ends

        transforms.send_json_response(self, 200, message)
Ejemplo n.º 19
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
 
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, 'section-put', {'key': key}):
#            logging.warning('***RAM*** put FAIL (saving) ' + str(request))
            return

#        logging.warning('***RAM*** put (saving) ' + str(request))

        if not TeacherRights.can_edit_section(self):
            transforms.send_json_response(
                self, 401, 'MobileCSP: Access denied.', {'key': key})
            return

        entity = CourseSectionEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'MobileCSP: Course Section not found.', {'key': key})
            return

        schema = SectionItemRESTHandler.SCHEMA()

        payload = request.get('payload')
        update_dict = transforms.json_to_dict(
            transforms.loads(payload), schema.get_json_schema_dict())

        # Check for invalid emails -- email must be a registered student
        # Found the regular expression on Stackoverflow
        emails_raw = update_dict['students']
        emails = re.findall(r'[\w\.-]+@[\w\.-]+', emails_raw)
        
        return_code = 200
        bad_emails = []
        good_emails = []
        for email in emails:
#            email = email.strip(' \t\n\r')
            if email:
                logging.debug('***RAM*** email = |' + email + '|')
                student = Student.get_first_by_email(email)[0]  # returns a tuple
                if not student:
                    bad_emails.append(email)
                else:
                    good_emails.append(email)
     
        confirm_message  = 'Confirmation\n'
        confirm_message += '------------\n\n' 
        if bad_emails:
            logging.info('***RAM*** bad_emails found = ' + str(bad_emails))
            return_code = 401
            confirm_message = 'The following were invalid emails:\n'
            for email in bad_emails: 
                confirm_message += email + '\n'
            confirm_message += 'Either there is no student with that email\n'
            confirm_message += 'registered for the course.  Or there is a \n'
            confirm_message += 'typo in the email address provided.\n\n'
        if good_emails:
            logging.info('***RAM*** good_emails found = ' + str(good_emails))
            confirm_message += 'Students with the following emails\n'
            confirm_message += 'are currently registered in your section:\n'
            for email in good_emails:
                confirm_message += email + '\n'
          
            update_dict['students'] = ','.join(good_emails)  # New-line delimited

        transforms.dict_to_entity(entity, update_dict)

        entity.put()
        if return_code == 200:
            confirm_message += 'Your section was successfully updated and saved.\n\n\n\n\n'
        else:
            confirm_message += 'Other information for your section was successfully updated and saved.\n\n\n\n\n'
        confirm_message += 'Confirmation\n'
        confirm_message += '------------\n'

        transforms.send_json_response(
            self, return_code, confirm_message, {'key': key})
Ejemplo n.º 20
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""

        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(request, 'section-put',
                                              {'key': key}):
            #            logging.warning('***RAM*** put FAIL (saving) ' + str(request))
            return

#        logging.warning('***RAM*** put (saving) ' + str(request))

        if not TeacherRights.can_edit_section(self):
            transforms.send_json_response(self, 401,
                                          'MobileCSP: Access denied.',
                                          {'key': key})
            return

        entity = CourseSectionEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'MobileCSP: Course Section not found.',
                {'key': key})
            return

        schema = SectionItemRESTHandler.SCHEMA()

        payload = request.get('payload')
        update_dict = transforms.json_to_dict(transforms.loads(payload),
                                              schema.get_json_schema_dict())

        # Check for invalid emails -- email must be a registered student
        # Found the regular expression on Stackoverflow
        emails_raw = update_dict['students']
        emails = re.findall(r'[\w\.-]+@[\w\.-]+', emails_raw)

        return_code = 200
        bad_emails = []
        good_emails = []
        for email in emails:
            #            email = email.strip(' \t\n\r')
            if email:
                logging.debug('***RAM*** email = |' + email + '|')
                student = Student.get_first_by_email(email)[
                    0]  # returns a tuple
                if not student:
                    bad_emails.append(email)
                else:
                    good_emails.append(email)

        confirm_message = 'Confirmation\n'
        confirm_message += '------------\n\n'
        if bad_emails:
            logging.info('***RAM*** bad_emails found = ' + str(bad_emails))
            return_code = 401
            confirm_message = 'The following were invalid emails:\n'
            for email in bad_emails:
                confirm_message += email + '\n'
            confirm_message += 'Either there is no student with that email\n'
            confirm_message += 'registered for the course.  Or there is a \n'
            confirm_message += 'typo in the email address provided.\n\n'
        if good_emails:
            logging.info('***RAM*** good_emails found = ' + str(good_emails))
            confirm_message += 'Students with the following emails\n'
            confirm_message += 'are currently registered in your section:\n'
            for email in good_emails:
                confirm_message += email + '\n'

            update_dict['students'] = ','.join(
                good_emails)  # New-line delimited

        transforms.dict_to_entity(entity, update_dict)

        entity.put()
        if return_code == 200:
            confirm_message += 'Your section was successfully updated and saved.\n\n\n\n\n'
        else:
            confirm_message += 'Other information for your section was successfully updated and saved.\n\n\n\n\n'
        confirm_message += 'Confirmation\n'
        confirm_message += '------------\n'

        transforms.send_json_response(self, return_code, confirm_message,
                                      {'key': key})
Ejemplo n.º 21
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')
        edit_mode = request.get('mode')

        if GLOBAL_DEBUG:
            logging.warning('***RAM*** put request = ' + str(request))

        if not self.assert_xsrf_token_or_fail(request, 'teacher-put',
                                              {'key': key}):
            return

        if not TeacherRights.can_edit(self):
            transforms.send_json_response(self, 401,
                                          'MobileCSP: Admin access denied.',
                                          {'key': key})
            return

        entity = TeacherEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'MobileCSP: Teacher Entity not found.',
                {'key': key})
            return

        schema = TeacherItemRESTHandler.SCHEMA()

        payload = request.get('payload')
        update_dict = transforms.json_to_dict(transforms.loads(payload),
                                              schema.get_json_schema_dict())

        #  Get the teacher's user_id
        user = Student.get_first_by_email(
            update_dict['email'])[0]  # returns a tuple
        if not user:
            transforms.send_json_response(
                self, 404, 'MobileCSP: No registered user found for ' +
                update_dict['email'], {'key': key})
            return

        # Check that the teacher isn't already registered
        if update_dict['mode'] == 'Add':
            teachers = TeacherEntity.get_teachers()
            for teacher in teachers:
                if teacher.email == update_dict['email']:
                    transforms.send_json_response(
                        self, 404,
                        'MobileCSP: User is already registered as a teacher ' +
                        update_dict['email'], {'key': key})
                    return

        if GLOBAL_DEBUG:
            logging.debug('****RAM**** teacher id ' + str(user.user_id))

        # Store the user_id
        update_dict['user_id'] = user.user_id

        transforms.dict_to_entity(entity, update_dict)

        entity.put()

        transforms.send_json_response(self, 200, 'Saved.')
Ejemplo n.º 22
0
    def put(self):
        """Handles REST PUT verb with JSON payload."""
        request = transforms.loads(self.request.get('request'))
        key = request.get('key')

        if not self.assert_xsrf_token_or_fail(
                request, 'announcement-put', {'key': key}):
            return

        if not AnnouncementsRights.can_edit(self):
            transforms.send_json_response(
                self, 401, 'Access denied.', {'key': key})
            return

        entity = AnnouncementEntity.get(key)
        if not entity:
            transforms.send_json_response(
                self, 404, 'Object not found.', {'key': key})
            return

        payload = request.get('payload')
        transforms.dict_to_entity(entity, transforms.json_to_dict(
            transforms.loads(payload),
            AnnouncementsItemRESTHandler.SCHEMA_DICT))
        entity.put()

        email_sent = False
        #if entity.send_email:
        #    email_manager = notify.EmailManager(self.get_course())
        #    email_sent = email_manager.send_announcement(
        #        entity.title, entity.html)
        #if entity.send_email and not email_sent:
        #    if not self.get_course().get_course_announcement_list_email():
        #        message = 'Saved. Announcement list not configured.'
        #    else:
        #        message = 'Saved, but there was an error sending email.'
        #else:
        #    message = 'Saved.'

        if entity.send_email and not entity.is_draft:
            # get all students email
            all_students = self.get_students()
            email_list = []
            recipient = ""
            for s in all_students:
                if s.is_enrolled and s.email != "*****@*****.**":
                    recipient = s.name + "<" + s.email + ">"
                    email_list.append(recipient)

            # send an announcement email
            sender_address = "X-Informatics <*****@*****.**>"
            user_address = email_list
            subject = "X-Informatics Announcement: " + entity.title
            body = ""
            html = entity.html
            mail.send_mail(sender_address, user_address, subject, body, html=html)

        if entity.send_email:
            message = 'Saved and sent.'
        else:
            message = 'Saved.'

        transforms.send_json_response(self, 200, message)