Example #1
0
    def send_confirmation(self, user, response):
        try:
            answers = db.session.query(Answer).filter(Answer.response_id == response.id).all()
            if answers is None:
                LOGGER.warn('Found no answers associated with response with id {response_id}'.format(response_id=response.id))

            questions = db.session.query(Question).filter(Question.application_form_id == response.application_form_id).all()
            if questions is None:
                LOGGER.warn('Found no questions associated with application form with id {form_id}'.format(form_id=response.application_form_id))

            application_form = db.session.query(ApplicationForm).filter(ApplicationForm.id == response.application_form_id).first() 
            if application_form is None:
                LOGGER.warn('Found no application form with id {form_id}'.format(form_id=response.application_form_id))

            event = db.session.query(Event).filter(Event.id == application_form.event_id).first() 
            if event is None:
                LOGGER.warn('Found no event id {event_id}'.format(form_id=application_form.event_id))
        except:
            LOGGER.error('Could not connect to the database to retrieve response confirmation email data on response with ID : {response_id}'.format(response_id=response.id))

        try:
            # Building the summary, where the summary is a dictionary whose key is the question headline, and the value is the relevant answer
            summary = {}
            for answer in answers:
                for question in questions:
                    if answer.question_id == question.id:
                        summary[question.headline] = _get_answer_value(answer, question)

            subject = 'Your application to {}'.format(event.description)
            greeting = strings.build_response_email_greeting(user.user_title, user.firstname, user.lastname)
            body_text = greeting + '\n\n' + strings.build_response_email_body(event.name, event.description, summary)
            emailer.send_mail(user.email, subject, body_text=body_text)

        except:
            LOGGER.error('Could not send confirmation email for response with id : {response_id}'.format(response_id=response.id))
Example #2
0
    def send_confirmation(self, user, questions, answers, confirmed, event_name):
        if answers is None:
            LOGGER.warn(
                'Found no answers associated with response with id {response_id}'.format(response_id=user.id))
        if questions is None:
            LOGGER.warn(
                'Found no questions associated with application form with id {form_id}'.format(form_id=user.id))
        try:
            # Building the summary, where the summary is a dictionary whose key is the question headline, and the value
            # is the relevant answer
            summary = ""
            for answer in answers:
                for question in questions:
                    if answer.registration_question_id == question.id:
                        summary += "Question heading :" + question.headline + "\nQuestion Description :" + \
                            question.description + "\nAnswer :" + _get_answer_value(
                                answer, question) + "\n"

            subject = event_name + ' Registration'
            greeting = strings.build_response_email_greeting(
                user.user_title, user.firstname, user.lastname)
            if len(summary) <= 0:
                summary = '\nNo valid questions were answered'
            body_text = greeting + '\n\n' + REGISTRATION_MESSAGE + \
                self.get_confirmed_message(
                    confirmed) + '\n\nHere is a copy of your responses:\n\n' + summary

            emailer.send_mail(user.email, subject, body_text=body_text)

        except Exception as e:
            LOGGER.error('Could not send confirmation email for response with id : {response_id}'.format(
                response_id=user.id))
Example #3
0
    def send_confirmation(self, user, questions, answers, event_name):
        if answers is None:
            LOGGER.warn(
                'Found no answers associated with response with id {response_id}'
                .format(response_id=user.id))
        if questions is None:
            LOGGER.warn(
                'Found no questions associated with application form with id {form_id}'
                .format(form_id=user.id))
        try:
            # Building the summary, where the summary is a dictionary whose key is the question headline, and the value
            # is the relevant answer
            summary = ""
            for answer in answers:
                for question in questions:
                    if answer.registration_question_id == question.id:
                        summary += "Question heading :" + question.headline + "\nQuestion Description :" + \
                                   question.description + "\nAnswer :" + _get_answer_value(
                            answer, question) + "\n"

            subject = event_name + ' Registration'
            greeting = strings.build_response_email_greeting(
                user.user_title, user.firstname, user.lastname)
            if len(summary) <= 0:
                summary = '\nNo valid questions were answered'
            body_text = greeting + '\n\n' + 'Thank you for completing your guest registration. Please find a copy of your answers below for future reference.' + '\n\n' + summary + '\n\nKind Regards, The Deep Learning Indaba Team'

            emailer.send_mail(user.email, subject, body_text=body_text)
            return True

        except Exception as e:
            LOGGER.error(
                'Could not send confirmation email for response with id : {response_id}'
                .format(response_id=user.id))
            return False
Example #4
0
    def get(self):
        email = request.args.get('email')

        LOGGER.debug("Resending verification email to: {}".format(email))

        user = db.session.query(AppUser).filter(
            func.lower(AppUser.email) == func.lower(email)).first()

        if not user:
            LOGGER.debug("User not found for email: {}".format(email))
            return USER_NOT_FOUND

        if user.verify_token is None:
            user.verify_token = make_code()

        try:
            db.session.commit()
        except IntegrityError:
            LOGGER.error("Adding verify token for {} failed. ".format(email))
            return ADD_VERIFY_TOKEN_FAILED

        send_mail(recipient=user.email,
                  subject='Baobab Email Verification',
                  body_text=VERIFY_EMAIL_BODY.format(user.user_title,
                                                     user.firstname,
                                                     user.lastname,
                                                     get_baobab_host(),
                                                     user.verify_token))

        LOGGER.debug("Resent email verification to: {}".format(email))

        return {}, 201
Example #5
0
    def post(self):

        req_parser = reqparse.RequestParser()
        req_parser.add_argument('email', type=str, required=True)
        args = req_parser.parse_args()

        LOGGER.debug("Requesting password reset for email {}".format(
            args['email']))

        user = db.session.query(AppUser).filter(
            func.lower(AppUser.email) == func.lower(args['email'])).first()

        if not user:
            LOGGER.debug("No user found for email {}".format(args['email']))
            return USER_NOT_FOUND

        password_reset = PasswordReset(user=user)
        db.session.add(password_reset)
        db.session.commit()

        send_mail(recipient=args['email'],
                  subject='Password Reset for Deep Learning Indaba portal',
                  body_text=RESET_EMAIL_BODY.format(user.user_title,
                                                    user.firstname,
                                                    user.lastname,
                                                    get_baobab_host(),
                                                    password_reset.code))

        return {}, 201
Example #6
0
    def post(self):
        req_parser = reqparse.RequestParser()
        req_parser.add_argument('user_id', type=int, required=True)
        req_parser.add_argument('email_subject', type=str, required=True)
        req_parser.add_argument('email_body', type=str, required=True)
        args = req_parser.parse_args()

        user = user_repository.get_by_id(args['user_id'])
        if user is None:
            return errors.USER_NOT_FOUND
        try:
            send_mail(recipient=user.email,
                      sender_name=g.organisation.name,
                      sender_email=g.organisation.email_from,
                      subject=args['email_subject'],
                      body_text=GENERIC_EMAIL_TEMPLATE.format(
                          user_title=user.user_title,
                          user_firstname=user.firstname,
                          user_lastname=user.lastname,
                          body=args['email_body'],
                      )
                      )
        except Exception as e:
            LOGGER.error('Error sending email: {}'.format(e))
            return errors.EMAIL_NOT_SENT
Example #7
0
    def post(self):
        args = self.req_parser.parse_args()
        event_id = args['event_id']
        user_id = g.current_user['id']

        event = db.session.query(Event).get(event_id)
        if not event:
            return EVENT_NOT_FOUND

        current_user = user_repository.get_by_id(user_id)
        if not current_user.is_event_admin(event_id):
            return FORBIDDEN

        users = user_repository.get_all_without_responses()
        for user in users:
            title = user.user_title
            firstname = user.firstname
            lastname = user.lastname
            event_name = event.name
            deadline = event.get_application_form().deadline.strftime('%A %-d %B %Y')
            
            subject = 'FINAL REMINDER: We do not have your application to attend {}'.format(event_name)
            body = NOT_STARTED_EMAIL_BODY.format(title=title, firstname=firstname, lastname=lastname, event=event_name, deadline=deadline)
            
            send_mail(recipient=user.email, subject=subject, body_text=body)
        
        return {'not_started_responses': len(users)}, 201
Example #8
0
    def post(self):
        args = self.req_parser.parse_args()
        user_id = args['user_id']
        event_id = args['event_id']
        email_template = args['email_template']
        offer_date = datetime.strptime((args['offer_date']),
                                       '%Y-%m-%dT%H:%M:%S.%fZ')
        expiry_date = datetime.strptime((args['expiry_date']),
                                        '%Y-%m-%dT%H:%M:%S.%fZ')
        payment_required = args['payment_required']
        travel_award = args['travel_award']
        accommodation_award = args['accommodation_award']
        user = db.session.query(AppUser).filter(AppUser.id == user_id).first()
        event_name = db.session.query(Event).filter(
            Event.id == event_id).first().name

        existing_offer = db.session.query(Offer).filter(
            Offer.user_id == user_id, Offer.event_id == event_id).first()
        if existing_offer:
            return errors.DUPLICATE_OFFER

        existing_outcome = outcome_repository.get_latest_by_user_for_event(
            user_id, event_id)
        if existing_outcome:
            if existing_outcome.status == Status.REJECTED:
                return errors.CANDIDATE_REJECTED
            existing_outcome.reset_latest()

        new_outcome = Outcome(event_id, user_id, Status.ACCEPTED,
                              g.current_user['id'])
        outcome_repository.add(new_outcome)

        offer_entity = Offer(user_id=user_id,
                             event_id=event_id,
                             offer_date=offer_date,
                             expiry_date=expiry_date,
                             payment_required=payment_required,
                             travel_award=travel_award,
                             accommodation_award=accommodation_award)

        db.session.add(offer_entity)
        db.session.commit()

        if user.email:
            email_body_template = email_template or OFFER_EMAIL_BODY
            send_mail(
                recipient=user.email,
                subject='{} Application Status Update'.format(event_name),
                body_text=email_body_template.format(
                    user_title=user.user_title,
                    first_name=user.firstname,
                    last_name=user.lastname,
                    event_name=event_name,
                    host=misc.get_baobab_host(),
                    expiry_date=offer_entity.expiry_date.strftime("%Y-%m-%d")))

            LOGGER.debug("Sent an offer email to {}".format(user.email))

        return offer_info(offer_entity), 201
Example #9
0
    def delete(self):
        # Delete an existing response for the logged-in user.
        req_parser = reqparse.RequestParser()
        req_parser.add_argument('id', type=int, required=True)
        args = req_parser.parse_args()

        try:
            response = db.session.query(Response).filter(
                Response.id == args['id']).first()
            if not response:
                return errors.RESPONSE_NOT_FOUND

            if response.user_id != g.current_user['id']:
                return errors.UNAUTHORIZED

            response.is_withdrawn = True
            response.withdrawn_timestamp = datetime.datetime.now()
            response.is_submitted = False
            response.submitted_timestamp = None

            db.session.commit()
            db.session.flush()

        except SQLAlchemyError as e:
            LOGGER.error("Database error encountered: {}".format(e))
            return errors.DB_NOT_AVAILABLE
        except:
            LOGGER.error("Encountered unknown error: {}".format(
                traceback.format_exc()))
            return errors.DB_NOT_AVAILABLE

        try:
            user = db.session.query(AppUser).filter(
                AppUser.id == g.current_user['id']).first()
            event = response.application_form.event
            organisation = event.organisation
            subject = 'Withdrawal of Application for the {event_name}'.format(
                event_name=event.description)

            withdrawal_template = email_repository.get(event.id,
                                                       'withdrawal').template
            body_text = withdrawal_template.format(
                title=user.user_title,
                firstname=user.firstname,
                lastname=user.lastname,
                organisation_name=organisation.name,
                event_name=event.name)
            emailer.send_mail(user.email,
                              subject,
                              body_text,
                              sender_name=g.organisation.name,
                              sender_email=g.organisation.email_from)
        except:
            LOGGER.error(
                'Failed to send withdrawal confirmation email for response with ID : {id}, but the response was withdrawn succesfully'
                .format(id=args['id']))

        return {}, 204
Example #10
0
 def test_send_email(self):
     try:
         LOGGER.info("Testing mailer")
         send_mail(recipient='*****@*****.**',
                   subject='TestSMTPEmail',
                   body_text='Hello world from Amazon SES')
         return True
     except Exception:
         return False
Example #11
0
File: api.py Project: mxaba/Baobab
    def post(self):
        args = self.post_req_parser.parse_args()
        response_id = args['response_id']
        title = args['title']
        firstname = args['firstname']
        lastname = args['lastname']
        relation = args['relation']
        email = args['email']
        user = user_repository.get_by_id(g.current_user['id'])

        if not user:
            return USER_NOT_FOUND

        event = event_repository.get_event_by_response_id(response_id)
        if not event:
            return EVENT_NOT_FOUND

        response = response_repository.get_by_id(response_id)
        if not response:
            return RESPONSE_NOT_FOUND

        reference_request = ReferenceRequest(response_id=response_id,
                                             title=title,
                                             firstname=firstname,
                                             lastname=lastname,
                                             relation=relation,
                                             email=email)
        reference_request_repository.create(reference_request)

        link = "{host}/reference/{token}".format(host=misc.get_baobab_host(),
                                                 token=reference_request.token)

        candidate, candidate_firstname, nominator = _get_candidate_nominator(
            response)
        if nominator is None:
            nomination_text = "has nominated themself"
        else:
            nomination_text = "has been nominated by {}".format(nominator)

        subject = 'REFERENCE REQUEST - {}'.format(event.name)
        body = REFERENCE_REQUEST_EMAIL_BODY.format(
            title=title,
            firstname=firstname,
            lastname=lastname,
            candidate=candidate,
            candidate_firstname=candidate_firstname,
            nomination_text=nomination_text,
            event_name=event.name,
            event_url=event.url,
            application_close_date=event.application_close,
            link=link)
        send_mail(recipient=email, subject=subject, body_text=body)

        reference_request.set_email_sent(datetime.now())
        reference_request_repository.add(reference_request)
        return reference_request, 201
Example #12
0
    def put(self):
        args = self.req_parser.parse_args()

        email = args['email']
        firstname = args['firstname']
        lastname = args['lastname']
        user_title = args['user_title']
        nationality_country_id = args['nationality_country_id']
        residence_country_id = args['residence_country_id']
        user_gender = args['user_gender']
        affiliation = args['affiliation']
        department = args['department']
        user_disability = args['user_disability']
        user_category_id = args['user_category_id']
        user_dateOfBirth = datetime.strptime((args['user_dateOfBirth']),
                                             '%Y-%m-%dT%H:%M:%S.%fZ')
        user_primaryLanguage = args['user_primaryLanguage']

        user = db.session.query(AppUser).filter(
            AppUser.id == g.current_user['id']).first()

        if user.email != email:
            user.update_email(email)

        user.firstname = firstname
        user.lastname = lastname
        user.user_title = user_title
        user.nationality_country_id = nationality_country_id
        user.residence_country_id = residence_country_id
        user.user_gender = user_gender
        user.affiliation = affiliation
        user.department = department
        user.user_disability = user_disability
        user.user_category_id = user_category_id
        user.user_dateOfBirth = user_dateOfBirth
        user.user_primaryLanguage = user_primaryLanguage

        try:
            db.session.commit()
        except IntegrityError:
            LOGGER.error("email {} already in use".format(email))
            return EMAIL_IN_USE

        if not user.verified_email:
            send_mail(recipient=user.email,
                      subject='Baobab Email Re-Verification',
                      body_text=VERIFY_EMAIL_BODY.format(
                          user_title, firstname, lastname, get_baobab_host(),
                          user.verify_token))

            LOGGER.debug("Sent re-verification email to {}".format(user.email))

        roles = db.session.query(EventRole).filter(
            EventRole.user_id == user.id).all()

        return user_info(user, roles), 200
Example #13
0
File: api.py Project: mxaba/Baobab
    def post(self, send_email=True):
        args = self.req_parser.parse_args()
        event_id = args['event_id']
        email = args['email']
        role = args['role']

        user = user_repository.get_by_email(email, g.organisation.id)

        if not user:
            return USER_NOT_FOUND

        event = event_repository.get_by_id(event_id)
        if not event:
            return EVENT_NOT_FOUND

        existingInvitedGuest = db.session.query(InvitedGuest).filter(
            InvitedGuest.event_id == event_id).filter(
                InvitedGuest.user_id == user.id).first()

        if existingInvitedGuest:
            return INVITED_GUEST_FOR_EVENT_EXISTS

        invitedGuest = InvitedGuest(event_id=event_id,
                                    user_id=user.id,
                                    role=role)

        db.session.add(invitedGuest)

        try:
            db.session.commit()
        except IntegrityError:
            LOGGER.error("Failed to add invited guest: {}".format(email))
            return ADD_INVITED_GUEST_FAILED

        if send_email:
            try:
                send_mail(recipient=user.email,
                          subject='Your invitation to {}'.format(event.name),
                          body_text=GUEST_EMAIL_TEMPLATE.format(
                              user_title=user.user_title,
                              firstname=user.firstname,
                              lastname=user.lastname,
                              role=role,
                              event_name=event.name,
                              event_key=event.key,
                              system_name=g.organisation.system_name,
                              host=misc.get_baobab_host()))
            except Exception as e:
                LOGGER.error(
                    'Failed to send email to invited guest with user Id {}, due to {}'
                    .format(user.id, e))
                return INVITED_GUEST_EMAIL_FAILED

        return invitedGuest_info(invitedGuest, user), 201
Example #14
0
    def send_confirmation(self, user, response):
        try:
            answers = db.session.query(Answer).join(
                Question, Answer.question_id == Question.id).filter(
                    Answer.response_id == response.id).order_by(
                        Question.order).all()
            if answers is None:
                LOGGER.warn(
                    'Found no answers associated with response with id {response_id}'
                    .format(response_id=response.id))

            application_form = db.session.query(ApplicationForm).filter(
                ApplicationForm.id == response.application_form_id).first()
            if application_form is None:
                LOGGER.warn(
                    'Found no application form with id {form_id}'.format(
                        form_id=response.application_form_id))

            event = db.session.query(Event).filter(
                Event.id == application_form.event_id).first()
            if event is None:
                LOGGER.warn('Found no event id {event_id}'.format(
                    form_id=application_form.event_id))
        except:
            LOGGER.error(
                'Could not connect to the database to retrieve response confirmation email data on response with ID : {response_id}'
                .format(response_id=response.id))

        try:
            subject = 'Your application to {}'.format(event.description)
            question_answer_summary = strings.build_response_email_body(
                answers)

            template = email_repository.get(event.id,
                                            'confirmation-response').template
            body_text = template.format(
                title=user.user_title,
                firstname=user.firstname,
                lastname=user.lastname,
                event_description=event.description,
                question_answer_summary=question_answer_summary,
                event_name=event.name)
            emailer.send_mail(user.email,
                              subject,
                              body_text=body_text,
                              sender_name=g.organisation.name,
                              sender_email=g.organisation.email_from)

        except:
            LOGGER.error(
                'Could not send confirmation email for response with id : {response_id}'
                .format(response_id=response.id))
Example #15
0
def _send_registration_confirmation_mail(user, event_name):
    subject = event_name + ' Registration Confirmation'
    greeting = strings.build_response_email_greeting(
        user.user_title, user.firstname, user.lastname)
    body_text = greeting + '\n\n' + \
        REGISTRATION_CONFIRMED_MESSAGE.format(event_name=event_name)

    try:
        emailer.send_mail(user.email, subject, body_text=body_text)
        return True
    except Exception as e:
        LOGGER.error(
            'Error occured while sending email to {}: {}'.format(user.email, e))
        return False
Example #16
0
File: api.py Project: mxaba/Baobab
    def post(self):
        args = self.post_req_parser.parse_args()
        user_id = g.current_user['id']
        event_id = args['event_id']
        reviewer_user_email = args['reviewer_user_email']
        num_reviews = args['num_reviews']

        event = db.session.query(Event).filter(Event.id == event_id).first()
        if not event:
            return EVENT_NOT_FOUND

        current_user = user_repository.get_by_id(user_id)
        if not current_user.is_event_admin(event_id):
            return FORBIDDEN

        reviewer_user = user_repository.get_by_email(reviewer_user_email,
                                                     g.organisation.id)
        if reviewer_user is None:
            return USER_NOT_FOUND

        if not reviewer_user.is_reviewer(event_id):
            self.add_reviewer_role(reviewer_user.id, event_id)

        config = review_configuration_repository.get_configuration_for_event(
            event_id)

        response_ids = self.get_eligible_response_ids(
            event_id, reviewer_user.id, num_reviews,
            config.num_reviews_required)
        response_reviewers = [
            ResponseReviewer(response_id, reviewer_user.id)
            for response_id in response_ids
        ]
        db.session.add_all(response_reviewers)
        db.session.commit()

        if len(response_ids) > 0:
            send_mail(recipient=reviewer_user.email,
                      subject='You have been assigned reviews in Baobab',
                      body_text=ASSIGNED_BODY.format(
                          title=reviewer_user.user_title,
                          firstname=reviewer_user.firstname,
                          lastname=reviewer_user.lastname,
                          num_reviews=len(response_ids),
                          baobab_host=misc.get_baobab_host(),
                          system_name=g.organisation.system_name,
                          event_key=event.key,
                          event=event.name))

        return {}, 201
Example #17
0
    def post(self):
        LOGGER.debug('Received post request for reference-request')
        args = self.post_req_parser.parse_args()
        response_id = args['response_id']
        title = args['title']
        firstname = args['firstname']
        lastname = args['lastname']
        relation = args['relation']
        email = args['email']
        user = user_repository.get_by_id(g.current_user['id'])

        if not user:
            return USER_NOT_FOUND

        response_event = event_repository.get_event_by_response_id(response_id)
        if not response_event or not response_event.Event:
            return EVENT_NOT_FOUND
        event = response_event.Event
        reference_request = ReferenceRequest(response_id=response_id,
                                             title=title,
                                             firstname=firstname,
                                             lastname=lastname,
                                             relation=relation,
                                             email=email)
        reference_request_repository.create(reference_request)

        link = "{host}/{key}/reference?token={token}".format(
            host=misc.get_baobab_host(),
            key=event.key,
            token=reference_request.token)

        subject = 'REFERENCE REQUEST - {}'.format(event.name)
        body = REFERENCE_REQUEST_EMAIL_BODY.format(
            title=title,
            firstname=firstname,
            lastname=lastname,
            event_description=event.description,
            link=link,
            candidate_firstname=user.firstname,
            candidate_lastname=user.lastname,
            application_close_date=event.application_close)
        send_mail(recipient=email, subject=subject, body_text=body)

        reference_request.set_email_sent(datetime.now())
        reference_request_repository.update(reference_request)
        return {}, 201
Example #18
0
File: api.py Project: mxaba/Baobab
    def put(self):
        args = self.put_req_parser.parse_args()

        firstname = args['firstname']
        lastname = args['lastname']
        user_title = args['user_title']
        email = args['email']

        user = db.session.query(AppUser).filter(
            AppUser.id == g.current_user['id']).first()

        if user.email != email:
            user.update_email(email)

        user.firstname = firstname
        user.lastname = lastname
        user.user_title = user_title

        try:
            db.session.commit()
        except Exception as e:
            LOGGER.error("Exception updating user profile - {}".format(e))
            return ERROR_UPDATING_USER_PROFILE

        if not user.verified_email:
            send_mail(recipient=user.email,
                      sender_name=g.organisation.name,
                      sender_email=g.organisation.email_from,
                      subject='{} Email Re-Verification'.format(
                          g.organisation.system_name),
                      body_text=VERIFY_EMAIL_BODY.format(
                          title=user_title,
                          firstname=firstname,
                          lastname=lastname,
                          system=g.organisation.system_name,
                          organisation=g.organisation.name,
                          host=misc.get_baobab_host(),
                          token=user.verify_token))

            LOGGER.debug("Sent re-verification email to {}".format(user.email))

        roles = db.session.query(EventRole).filter(
            EventRole.user_id == user.id).all()

        return user_info(user, roles), 200
Example #19
0
File: api.py Project: mxaba/Baobab
    def post(self):
        args = self.req_parser.parse_args()

        user_api = UserAPI.UserAPI()
        user, status = user_api.post(invitedGuest=True)
        if status != 201:
            return user, status

        invited_guest_api = InvitedGuestAPI()
        invited_guest_info, status = invited_guest_api.post(send_email=False)

        if status == 201:
            event_id = invited_guest_info['event_id']
            role = invited_guest_info['role']
            user = user_repository.get_by_id(user['id'])
            event = event_repository.get_by_id(event_id)

            reset_code = misc.make_code()
            password_reset = PasswordReset(user=user)
            db.session.add(password_reset)
            db.session.commit()

            try:
                send_mail(recipient=user.email,
                          subject='Your invitation to {}'.format(event.name),
                          body_text=NEW_GUEST_EMAIL_TEMPLATE.format(
                              user_title=user.user_title,
                              firstname=user.firstname,
                              lastname=user.lastname,
                              role=role,
                              event_name=event.name,
                              event_key=event.key,
                              system_name=g.organisation.system_name,
                              host=misc.get_baobab_host(),
                              reset_code=password_reset.code))
            except Exception as e:
                LOGGER.error(
                    'Failed to send email for invited guest with user Id {} due to: {}'
                    .format(user.id, e))
                return INVITED_GUEST_EMAIL_FAILED

        return invited_guest_info, status
Example #20
0
    def delete(self):
        # Delete an existing response for the logged-in user.
        req_parser = reqparse.RequestParser()
        req_parser.add_argument('id', type=int, required=True)
        args = req_parser.parse_args()

        try:
            response = db.session.query(Response).filter(Response.id == args['id']).first()
            if not response:
                return errors.RESPONSE_NOT_FOUND

            if response.user_id != g.current_user['id']:
                return errors.UNAUTHORIZED
            
            response.is_withdrawn = True
            response.withdrawn_timestamp = datetime.datetime.now()
            response.is_submitted = False
            response.submitted_timestamp = None

            db.session.commit()
            db.session.flush()

        except SQLAlchemyError as e:
            LOGGER.error("Database error encountered: {}".format(e))            
            return errors.DB_NOT_AVAILABLE
        except: 
            LOGGER.error("Encountered unknown error: {}".format(traceback.format_exc()))
            return errors.DB_NOT_AVAILABLE            

        try:
            user = db.session.query(AppUser).filter(AppUser.id == g.current_user['id']).first()
            subject = 'Withdrawal of Application for the Deep Learning Indaba'
            
            WITHDRAWAL_BODY.format(title=user.user_title, firstname=user.firstname, lastname=user.lastname)
            emailer.send_mail(user.email, subject, body_text)
        except:                
            LOGGER.error('Failed to send withdrawal confirmation email for response with ID : {id}, but the response was withdrawn succesfully'.format(id=args['id']))

        return {}, 204
Example #21
0
File: api.py Project: mxaba/Baobab
    def get(self):
        email = request.args.get('email')

        LOGGER.debug("Resending verification email to: {}".format(email))

        user = user_repository.get_by_email(email, g.organisation.id)

        if not user:
            LOGGER.debug(
                "User not found for email: {} in organisation: {}".format(
                    email, g.organisation.name))
            return USER_NOT_FOUND

        if user.verify_token is None:
            user.verify_token = make_code()

        try:
            db.session.commit()
        except IntegrityError:
            LOGGER.error("Adding verify token for {} failed. ".format(email))
            return ADD_VERIFY_TOKEN_FAILED

        send_mail(recipient=user.email,
                  sender_name=g.organisation.name,
                  sender_email=g.organisation.email_from,
                  subject='{} Email Verification'.format(
                      g.organisation.system_name),
                  body_text=VERIFY_EMAIL_BODY.format(
                      title=user.user_title,
                      firstname=user.firstname,
                      lastname=user.lastname,
                      system=g.organisation.system_name,
                      organisation=g.organisation.name,
                      host=misc.get_baobab_host(),
                      token=user.verify_token))

        LOGGER.debug("Resent email verification to: {}".format(email))

        return {}, 201
Example #22
0
    def post(self):
        args = self.req_parser.parse_args()
        event_id = args['event_id']
        user_id = g.current_user['id']

        event = db.session.query(Event).get(event_id)
        if not event:
            return EVENT_NOT_FOUND

        current_user = user_repository.get_by_id(user_id)
        if not current_user.is_event_admin(event_id):
            return FORBIDDEN

        users = user_repository.get_all_with_unsubmitted_response()
        for user in users:
            title = user.user_title
            firstname = user.firstname
            lastname = user.lastname
            event_name = event.name
            organisation_name = event.organisation.name
            deadline = event.get_application_form().deadline.strftime(
                '%A %-d %B %Y')

            subject = 'FINAL REMINDER to submit you application for {}'.format(
                event_name)
            not_submitted_body = email_repository.get(
                event_id, 'application-not-submitted').template
            body = not_submitted_body.format(
                title=title,
                firstname=firstname,
                lastname=lastname,
                event=event_name,
                organisation_name=organisation_name,
                deadline=deadline)

            send_mail(recipient=user.email, subject=subject, body_text=body)

        return {'unsubmitted_responses': len(users)}, 201
Example #23
0
File: api.py Project: mxaba/Baobab
    def post(self):

        req_parser = reqparse.RequestParser()
        req_parser.add_argument('email', type=str, required=True)
        args = req_parser.parse_args()

        LOGGER.debug(
            "Requesting password reset for email {} and organisation {}".
            format(args['email'], g.organisation.name))

        user = user_repository.get_by_email(args['email'], g.organisation.id)

        if not user:
            LOGGER.debug(
                "No user found for email {} and organisation {}".format(
                    args['email'], g.organisation.name))
            return USER_NOT_FOUND

        password_reset = PasswordReset(user=user)
        db.session.add(password_reset)
        db.session.commit()

        send_mail(recipient=args['email'],
                  sender_name=g.organisation.name,
                  sender_email=g.organisation.email_from,
                  subject='Password Reset for {}'.format(
                      g.organisation.system_name),
                  body_text=RESET_EMAIL_BODY.format(
                      title=user.user_title,
                      firstname=user.firstname,
                      lastname=user.lastname,
                      system=g.organisation.system_name,
                      organisation=g.organisation.name,
                      host=misc.get_baobab_host(),
                      token=password_reset.code))

        return {}, 201
Example #24
0
File: api.py Project: mxaba/Baobab
    def post(self, invitedGuest=False):
        args = self.req_parser.parse_args()
        email = args['email']
        firstname = args['firstname']
        lastname = args['lastname']
        user_title = args['user_title']
        policy_agreed = args['policy_agreed']

        if (invitedGuest):
            password = self.randomPassword()
        else:
            password = args['password']

        if (password is None):
            return MISSING_PASSWORD

        if not policy_agreed:
            return POLICY_NOT_AGREED

        LOGGER.info("Registering email: {}".format(email))

        user = AppUser(email=email,
                       firstname=firstname,
                       lastname=lastname,
                       user_title=user_title,
                       password=password,
                       organisation_id=g.organisation.id)

        db.session.add(user)

        try:
            db.session.commit()
        except IntegrityError:
            LOGGER.error("email: {} already in use".format(email))
            return EMAIL_IN_USE

        if (not invitedGuest):
            send_mail(recipient=user.email,
                      sender_name=g.organisation.name,
                      sender_email=g.organisation.email_from,
                      subject='{} Email Verification'.format(
                          g.organisation.system_name),
                      body_text=VERIFY_EMAIL_BODY.format(
                          title=user_title,
                          firstname=firstname,
                          lastname=lastname,
                          system=g.organisation.system_name,
                          organisation=g.organisation.name,
                          host=misc.get_baobab_host(),
                          token=user.verify_token))

            LOGGER.debug("Sent verification email to {}".format(user.email))
        else:
            user.verified_email = True
            try:
                db.session.commit()
            except IntegrityError:
                LOGGER.error("Unable to verify email: {}".format(email))
                return VERIFY_EMAIL_INVITED_GUEST

        return user_info(user, []), 201
Example #25
0
    def post(self):
        args = self.req_parser.parse_args()
        event_id = args['event_id']
        user_id = args['user_id']
        registration_user_id = g.current_user['id']

        registration_user = user_repository.get_by_id(registration_user_id)
        if not registration_user.is_registration_volunteer(event_id):
            return FORBIDDEN

        event = event_repository.get_by_id(event_id)
        if event is None:
            return EVENT_NOT_FOUND

        user = user_repository.get_by_id(user_id)
        if user is None:
            return USER_NOT_FOUND

        if attendance_repository.exists(event_id, user_id):
            return ATTENDANCE_ALREADY_CONFIRMED

        attendance = Attendance(event_id, user_id, registration_user_id)
        attendance_repository.create(attendance)

        send_mail(recipient=user.email,
                  subject='Welcome to {}'.format(event.name),
                  body_text=ATTENDANCE_EMAIL_BODY.format(
                      user_title=user.user_title,
                      first_name=user.firstname,
                      last_name=user.lastname,
                      event_name=event.name))

        # Other Fields
        unavailable_response = None
        invitedguest_role = unavailable_response
        is_invited_guest = unavailable_response
        has_accepted_accom_award = unavailable_response

        offer = db.session.query(Offer).filter(
            Offer.user_id == user_id).filter(
                Offer.event_id == event_id).first()
        if offer:
            has_accepted_accom_award = (offer.accommodation_award
                                        and offer.accepted_accommodation_award)

        # Check if invited guest
        invited_guest = db.session.query(InvitedGuest).filter(
            InvitedGuest.event_id == event_id).filter(
                InvitedGuest.user_id == user.id).first()
        if (invited_guest):
            is_invited_guest = True
            invitedguest_role = invited_guest.role

        # Shirt Size
        shirt_answer = (
            get_registration_answer_based_headline(user_id, "T-Shirt Size")
            and get_registration_answer_based_headline(
                user_id, "T-Shirt Size").value) or unavailable_response

        # Poster registration
        bringing_poster = False
        poster_answer = get_registration_answer_based_headline(
            user_id, "Will you be bringing a poster?")
        if (poster_answer is not None and poster_answer.value == 'yes'):
            bringing_poster = True

        attendance_user = AttendanceUser(attendance, has_accepted_accom_award,
                                         shirt_answer, is_invited_guest,
                                         bringing_poster, invitedguest_role)
        return attendance_user, 201
Example #26
0
def generate(template_path, event_id, work_address, addressed_to,
             residential_address, passport_name, passport_no,
             passport_issued_by, invitation_letter_sent_at, to_date, from_date,
             country_of_residence, nationality, date_of_birth, email,
             user_title, firstname, lastname, bringing_poster, expiry_date):

    check_values(template_path, event_id, work_address, addressed_to,
                 residential_address, passport_name, passport_no,
                 passport_issued_by, invitation_letter_sent_at, to_date,
                 from_date, country_of_residence, nationality, date_of_birth,
                 email, user_title, firstname, lastname, bringing_poster,
                 expiry_date)

    # Path to store the template locally of merged and unmerged
    template = 'app/invitationletter/template/tmp.docx'
    template_merged = 'app/invitationletter/template/template.docx'

    download_blob(bucket_name=GCP_BUCKET_NAME,
                  source_blob_name=template_path,
                  destination_file_name=template)

    if not os.path.exists(template):
        return errors.TEMPLATE_NOT_FOUND

    document = MailMerge(template)
    LOGGER.debug("merge-fields.... {} .".format(document.get_merge_fields()))
    document.merge(TITLE=user_title,
                   FIRSTNAME=firstname,
                   LASTNAME=lastname,
                   WORK_ADDRESS=work_address.decode('utf-8'),
                   ADDRESSED_TO=addressed_to.decode('utf-8'),
                   RESIDENTIAL_ADDRESS=residential_address.decode('utf-8'),
                   PASSPORT_NAME=passport_name.decode('utf-8'),
                   PASSPORT_NO=passport_no.decode('utf-8'),
                   ISSUED_BY=passport_issued_by.decode('utf-8'),
                   EXPIRY_DATE=expiry_date,
                   ACCOMODATION_END_DATE=to_date,
                   ACCOMODATION_START_DATE=from_date,
                   COUNTRY_OF_RESIDENCE=country_of_residence.decode('utf-8'),
                   NATIONALITY=nationality,
                   DATE_OF_BIRTH=date_of_birth,
                   INVITATION_LETTER_SENT_AT=invitation_letter_sent_at,
                   BRINGING_POSTER=bringing_poster)

    document.write(template_merged)

    # Conversion
    template_pdf = 'app/invitationletter/letter/template.pdf'
    if os.path.exists(template_pdf):
        os.remove(template_pdf)
    success = pdfconvertor.convert_to(folder='app/invitationletter/letter',
                                      source=template_merged,
                                      output=template_pdf)
    if not success:
        return errors.CREATING_INVITATION_FAILED

    event = db.session.query(Event).get(event_id)
    if not event:
        return errors.EVENT_NOT_FOUND

    subject = "Invitation Letter for " + event.name

    try:
        emailer.send_mail(recipient=email,
                          subject=subject,
                          body_text=INVITATION_EMAIL_BODY.format(
                              user_title=user_title,
                              first_name=firstname,
                              last_name=lastname),
                          file_name="InvitationLetter.pdf",
                          file_path=template_pdf)

        LOGGER.debug('successfully sent email...')
        return True
    except ValueError:
        LOGGER.debug('Did not send email...')
        return False

    return False
Example #27
0
    def post(self, invitedGuest=False):
        args = self.req_parser.parse_args()
        email = args['email']
        firstname = args['firstname']
        lastname = args['lastname']
        user_title = args['user_title']
        nationality_country_id = args['nationality_country_id']
        residence_country_id = args['residence_country_id']
        user_gender = args['user_gender']
        affiliation = args['affiliation']
        department = args['department']
        user_disability = args['user_disability']
        user_category_id = args['user_category_id']

        if (invitedGuest):
            password = self.randomPassword()
        else:
            password = args['password']

        if (password is None):
            return MISSING_PASSWORD

        user_dateOfBirth = datetime.strptime((args['user_dateOfBirth']),
                                             '%Y-%m-%dT%H:%M:%S.%fZ')
        user_primaryLanguage = args['user_primaryLanguage']

        LOGGER.info("Registering email: {}".format(email))

        user = AppUser(email=email,
                       firstname=firstname,
                       lastname=lastname,
                       user_title=user_title,
                       nationality_country_id=nationality_country_id,
                       residence_country_id=residence_country_id,
                       user_gender=user_gender,
                       affiliation=affiliation,
                       department=department,
                       user_disability=user_disability,
                       user_category_id=user_category_id,
                       user_dateOfBirth=user_dateOfBirth,
                       user_primaryLanguage=user_primaryLanguage,
                       password=password)

        db.session.add(user)

        try:
            db.session.commit()
        except IntegrityError:
            LOGGER.error("email: {} already in use".format(email))
            return EMAIL_IN_USE

        if (not invitedGuest):
            send_mail(recipient=user.email,
                      subject='Baobab Email Verification',
                      body_text=VERIFY_EMAIL_BODY.format(
                          user_title, firstname, lastname, get_baobab_host(),
                          user.verify_token))

            LOGGER.debug("Sent verification email to {}".format(user.email))
        else:
            user.verified_email = True
            try:
                db.session.commit()
            except IntegrityError:
                LOGGER.error("Unable to verify email: {}".format(email))
                return VERIFY_EMAIL_INVITED_GUEST

        return user_info(user, []), 201