Пример #1
0
def register(_ctxt):
    form = forms.RegisterEmailForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    elif not recaptcha.verify():
        flask.flash("Invalid Captcha. Please make sure to confirm you "
                    "are human.", "danger")
    else:
        try:
            mail_from = CONF.get("email.mailfrom")
            mail_to = form.email.data

            # Don't leak emails to people just guessing, let them
            # think we're always sending something
            if not users.is_existing_user(form.email.data):
                r = email.RegistrationEmail()
                r.send(mail_from, mail_to,
                       return_route="register/validate")
            else:
                r = email.UserExistsRegistrationEmail()
                r.send(mail_from, mail_to,
                       return_route="forgot-password/validate")

            flask.flash("Validation email has been sent. "
                        "Please check your email box to "
                        "complete the registration.",
                        'success')
        except Exception:
            LOG.exception("Error sending registration token")
            flask.flash('There was an error getting you registered.'
                        ' Please try again later.', 'danger')
    return redirect(url_for('login'))
Пример #2
0
def delete(_ctxt, image_id, entity_type):
    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                if entity_type == 'user':
                    ui = models.UserImage.get_by_image_id(image_id)
                    session.delete(ui)
                elif entity_type == 'group':
                    gi = models.GroupImage.get_by_image_id(image_id)
                    session.delete(gi)
                elif entity_type == 'organization':
                    oi = models.OrganizationImage.get_by_image_id(image_id)
                    session.delete(oi)
                i = models.Image.get(image_id)
                session.delete(i)
            CloudinaryHandler().delete([i.public_id])
            flask.flash("Image deleted successfully", "success")
        except Exception:
            message = "Failed to delete image, please try again later"
            LOG.exception(message)
            flask.flash(message, "danger")
    return flask.redirect(flask.request.referrer)
Пример #3
0
def forgot_password(_ctxt):
    form = forms.ForgotPasswordForm(flask.request.form)
    if flask.request.method == 'POST':
        if not form.validate():
            app_utils.flash_errors(form)
        else:
            try:
                user = users.existing_user(form.email.data)
                if not user:
                    flask.flash("User with that email does not exist."
                                "  Please try a different email address.",
                                'danger')
                    return redirect(url_for('forgot_password'))
                mail_from = CONF.get("email.mailfrom")
                mail_to = form.email.data
                r = email.ForgotPasswordEmail()
                r.send(mail_from, mail_to,
                       return_route="forgot-password/validate")

                flask.flash("You've successfully sent a password reset email. "
                            "Please click the link in your email to "
                            "reset your password.",
                            'success')
                return redirect(url_for('login'))
            except Exception:
                LOG.exception("Forgot Password failed for user with email "
                              "'%s'", form.email.data)
                flask.flash('There was an error sending the password reset'
                            '  email.  Please try again later.',
                            'danger')
                return redirect(url_for('forgot_password'))
    return render_template('forgot_password.html', form=form)
Пример #4
0
def create(_ctxt, group_id=None, organization_id=None):
    entity, entity_id, values = get_context(group_id, organization_id)

    form = forms.LinkForm(flask.request.form)
    can_edit_entity = getattr(current_user, 'can_edit_' + entity)
    if not can_edit_entity(entity_id) or not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                link = models.Link(link_type_id=form.link_type.data.id,
                                   url=form.link.data,
                                   **(values if group_id else {
                                       'organization_id': entity_id
                                   }))
                session.add(link)
                flask.flash(
                    'You successfully added %s %s link!' %
                    ('a' if group_id else 'an', entity), 'success')
        except Exception:
            LOG.exception("Failed to create link for %s '%s'", entity,
                          entity_id)
            flask.flash(
                """There was an error adding the %s link.
                 Please try again later""" % entity, 'danger')
    return flask.redirect(flask.url_for('%ss.edit' % entity, **values))
Пример #5
0
def user_add(_ctxt, org_id):
    form = forms.AddMemberForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        org = models.Organization.get(org_id)
        orgr = models.OrganizationRole.get_by_description('Member')
        user = models.User.get_by_email(form.email.data)
        if not user:
            try:
                content = {'org': org, 'role': orgr}
                mail = email.OrgInviteNewMemberEmail()
                mail.send(current_user.email, form.email.data, **content)
                flask.flash('New member sent invite', 'success')
            except Exception:
                LOG.exception('Error sending org invite email.')
                flask.flash(
                    'Error sending invite email, please try again later.',
                    'danger')
        else:
            om = helper.get_member(org_id, user.id)
            if om:
                flask.flash(
                    'User is already a member of the organization. User not'
                    ' added.', 'info')
                return flask.redirect(flask.url_for('.edit', org_id=org.id))
            try:
                helper.notify_join(user, org)
            except Exception:
                message = 'Error occurred, please try again later'
                LOG.exception(message)
                flask.flash(message, 'danger')
    return flask.redirect(form.return_url.data)
Пример #6
0
def search(_ctxt):
    form = forms.OrgSearchForm(flask.request.form)
    context = dict(form=form)
    if flask.request.method == 'POST':
        if not form.validate():
            app_utils.flash_errors(form)
        else:
            with models.transaction() as session:
                filters = [models.Organization.activated_at.isnot(None)]
                form_pairs = {
                    "name": models.Organization.name,
                    "city": models.Address.city,
                    "state": models.Address.state,
                    "zip_code": models.Address.zip_code
                }
                for form_field, model_field in form_pairs.items():
                    form_data = form[form_field].data
                    if form_data:
                        filters.append(
                            model_field.like('{}%'.format(form_data)))
                query = session.query(models.Organization).join(
                    models.Address, models.Address.id ==
                    models.Organization.address_id).filter(*filters).order_by(
                        models.Organization.name)
                context['orgs'] = query.all()
                return flask.render_template('organization/search.html',
                                             **context)
    return flask.render_template('organization/search.html', **context)
Пример #7
0
def user_delete(_ctxt, org_id, user_id):
    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                ou = helper.get_member(org_id, user_id)
                LOG.debug("Removing user '%s' from org '%s'", user_id, org_id)
                session.delete(ou)
                if form.confirm_checkbox.data:
                    org_groups = session.query(
                        models.OrganizationGroup).filter(
                            models.OrganizationGroup.organization_id ==
                            org_id).all()
                    for og in org_groups:
                        gu = session.query(models.GroupMember).filter(
                            models.GroupMember.group_id == og.group_id).filter(
                                models.GroupMember.user_id == user_id).first()
                        if gu:
                            LOG.debug("Removing user '%s' from group '%s'",
                                      user_id, og.group_id)
                            session.delete(gu)
                flask.flash('Member removed successfully!', 'success')
        except Exception:
            LOG.exception("Failed to remove user '%s' from org '%s'", user_id,
                          org_id)
            flask.flash('Failed to remove member.', 'danger')
    return flask.redirect(flask.url_for('.edit', org_id=org_id))
Пример #8
0
def contact(_ctxt):
    form = forms.ContactForm(flask.request.form)
    if flask.request.method == 'POST':
        if not form.validate():
            app_utils.flash_errors(form)
        elif not recaptcha.verify():
            flask.flash("Invalid Captcha. Please make sure to confirm you "
                        "are human.", "danger")
        else:
            try:
                e = email.ContactEmail()
                e.send(
                    form.email.data,
                    CONF.get("support.email.address"),
                    **form.data)
                flask.flash('You successfully submitted your contact request,'
                            ' someone will contact you shortly.'
                            '  Thanks for your feedback/interest!',
                            'success')
                return redirect(url_for('contact'))
            except Exception:
                LOG.exception("Error sending contact form information")
                flask.flash('There was a problem submitting your contact '
                            'request. Sorry for the inconvenience. We will '
                            'fix this as soon as we can. Please try again '
                            'shortly.', 'danger')
    return render_template('contact-us.html', form=form)
Пример #9
0
def login(_ctxt):
    if current_user.is_authenticated:
        return redirect('profile')
    form = forms.LoginForm(flask.request.form)
    if flask.request.method == 'POST':
        if form.validate():
            user = models.User.get_by_email(form.email.data)
            if not user:
                flask.flash('Invalid login credentials.', 'danger')
            elif user.verified_at is None:
                flask.flash("Your account has not been activated. Please "
                            "check your email to verify your account",
                            "danger")
            else:
                try:
                    valid_password = bcrypt.check_password_hash(
                        user.hashed_password, form.password.data)
                    if not valid_password:
                        flask.flash('Invalid login credentials.', 'danger')
                    else:
                        login_user(user)
                        flask.flash('Logged in successfully.', 'success')
                        return redirect_dest(url_for('users.show',
                                                     user_id=user.id))
                except ValueError:
                    LOG.exception(
                        "User %s hasn't updated their password from"
                        " legacy system", form.email.data)
                    flask.flash('Invalid login credentials.', 'danger')
                    return redirect_dest(home=url_for('login'))
        else:
            app_utils.flash_errors(form)
    return render_template('login.html', form=form)
Пример #10
0
def user_add(_ctxt, group_id):
    form = forms.AddMemberForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        group = models.Group.get(group_id)
        gr = models.GroupRole.get_by_description('Member')
        user = models.User.get_by_email(form.email.data)
        if not user:
            try:
                content = {'group': group, 'role': gr}
                mail = email.GroupInviteNewMemberEmail()
                mail.send(current_user.email, form.email.data, **content)
                flask.flash("New member sent invite", "success")
            except Exception:
                LOG.exception("Error sending org invite email.")
                flask.flash(
                    "Error sending invite email, please try again later.",
                    "danger")
        else:
            gm = helper.get_member(group_id, user.id)
            if gm:
                flask.flash(
                    "User is already a member of the group. "
                    "User not invited.", "info")
                return flask.redirect(flask.url_for('.edit',
                                                    group_id=group_id))
            try:
                helper.notify_join(user, group)
            except Exception:
                message = "Error occurred, please try again later"
                LOG.exception(message)
                flask.flash(message, 'danger')
    return flask.redirect(form.return_url.data)
Пример #11
0
def group_leave(_ctxt, user_id, group_id):
    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        group_member = models.Session.query(models.GroupMember).filter(
            models.GroupMember.group_id == group_id).filter(
                models.GroupMember.user_id == user_id).first()
        group_leaders = models.Session.query(models.User).join(
            models.GroupMember,
            models.User.id == models.GroupMember.user_id).join(
                models.Group,
                models.Group.id == models.GroupMember.group_id).join(
                    models.GroupRole,
                    models.GroupRole.id == models.GroupMember.role_id
                ).filter(models.Group.id == group_id).filter(
                    models.GroupRole.description == 'Group Leader').all()
        if (group_member and group_leaders and len(group_leaders) == 1
                and group_leaders[0].id == user_id):
            flask.flash(
                'Unable to leave group when you are the last'
                ' group leader.', 'danger')
        elif group_member:
            with models.transaction() as session:
                session.delete(group_member)
                session.commit()
            flask.flash('You left group successfully!', 'success')
        else:
            flask.flash('Error leaving group.', 'danger')
    return flask.redirect(flask.url_for('.show', user_id=user_id))
Пример #12
0
def document_add(_ctxt, group_id):
    form = forms.GroupAddDocumentForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        googledoc = forms.GroupAddGoogleDocForm(flask.request.form)
        if googledoc.link.data:
            helper.google_doc_add(group_id, googledoc)
            return flask.redirect(flask.url_for('.show', group_id=group_id))
        helper.document_upload(group_id, form)
    return flask.redirect(flask.url_for('.show', group_id=group_id))
Пример #13
0
def update(_ctxt, group_id):
    form = forms.GroupEditForm(flask.request.form)
    form.privacy_settings.choices = forms.privacy_setting_choices()
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                update_group = models.Group.get(group_id)
                if update_group:
                    # TODO I wish form.populate_obj worked here, but it doesn't
                    update_group.description = form.description.data
                    update_group.member_limit = form.member_limit.data
                    update_group.privacy_setting_id = form.privacy_settings.data
                    update_group.anonymous = form.anonymous.data
                    update_group.age_range_id = (form.age_range.data.id if
                                                 form.age_range.data else None)
                    update_group.gender_focus = form.gender_focus.data

                    group_meet_times = []
                    for m in form.meet_times.data:
                        group_meet_time = models.GroupMeetTime(
                            group_id=group_id, meet_time_type_id=m.id)
                        group_meet_times.append(group_meet_time)

                    # NOTE: We can't just .clear(). It actually only sets
                    # the group_id column to NULL on each record for this user,
                    # then we issue N inserts after. Instead we can either
                    # 1) delete then insert
                    # 2) set math, delete if necessary, insert if necessary
                    # Considering there's no downside to deleting, and it's
                    # simpler, that's the approach below.
                    for mt in update_group.meet_times:
                        session.delete(mt)
                    update_group.meet_times.extend(group_meet_times)

                    update_group.group_type_id = (form.group_category.data.id
                                                  if form.group_category.data
                                                  else None)
                    session.add(update_group)
                    flask.flash('You successfully updated the group profile!',
                                'success')
                else:
                    flask.flash('No group found to update', 'danger')
                    return flask.redirect(
                        flask.url_for('.show', group_id=group_id))
        except Exception:
            LOG.exception("Failed to update group profile for group "
                          "%s", group_id)
            flask.flash('There was an error updating the group profile!',
                        'danger')
    return flask.redirect(flask.url_for('.edit', group_id=group_id))
Пример #14
0
def email_leaders(_ctxt, group_id):
    form = forms.GroupLeadersEmailForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        with models.transaction() as session:
            group_users = session.query(models.User).join(
                models.GroupMember,
                models.User.id == models.GroupMember.user_id).join(
                    models.Group,
                    models.Group.id == models.GroupMember.group_id).join(
                        models.GroupRole, models.GroupRole.id ==
                        models.GroupMember.role_id).filter(
                            sa.and_(
                                models.Group.id == group_id,
                                models.GroupRole.description ==
                                'Group Leader')).all()
            subject = form.subject.data
            # TODO: need to wrap this data in a cleaner (NEVER TRUST USER INPUT)
            message = form.message.data
            group_leader_emails = [u.email for u in group_users]
            group_leader_emails = ','.join(group_leader_emails)
            if not group_leader_emails:
                flask.flash(
                    'There are not currently any group leaders for'
                    ' this group.  No message sent'
                    ' Please try again shortly.', 'danger')
            else:
                try:
                    group = models.Group.get(group_id)
                    mail_content = {
                        'to': group_leader_emails,
                        'subject': subject,
                        'message': message,
                        'user': current_user,
                        'group': group
                    }
                    group_leaders_email = email.GroupLeadersEmail()
                    group_leaders_email.send(current_user.email,
                                             group_leader_emails,
                                             **mail_content)
                    flask.flash('You successfully sent your email message.',
                                'success')
                except Exception:
                    LOG.exception("Error sending email to group leaders")
                    flask.flash(
                        'There was a problem sending your message.'
                        ' Sorry for the inconvenience.'
                        '  We will fix this as soon as we can.'
                        ' Please try again shortly.', 'danger')
    return flask.redirect(flask.url_for('.show', group_id=group_id))
Пример #15
0
def register_user_by_invite_create(_ctxt, token):
    form = forms.RegisterForm(flask.request.form)
    try:
        invite_mail = email.OrgInviteNewMemberEmail()
        content = invite_mail.decrypt_token(token)
        address = content.get('mail_to')
        if not address:
            raise signature.InvalidSignature()
        if address and users.is_existing_user(address):
            raise exception.UserAlreadyExists(email=address)
    except (signature.InvalidSignature, exception.MalformedToken):
        LOG.exception('Error decrypting token')
        flask.flash(
            'Error occurred. Please try link in email again or'
            ' ask person to resend invite.', 'danger')
        return flask.redirect(flask.url_for('index'))
    except exception.UserAlreadyExists:
        LOG.exception('User already exists')
        flask.flash(
            'A user is already registered for {}.'
            ' Please login instead.'.format(address), 'danger')
        return flask.redirect(flask.url_for('login'))

    if flask.request.method == 'POST':
        if not form.validate():
            app_utils.flash_errors(form)
        else:
            try:
                user = app_utils.create_user_from_form(form)
                helper.handle_invite(content, user)
            except Exception:
                LOG.exception("Failed to register user with email '%s'",
                              form.email.data)
                models.Session.rollback()
                flask.flash(
                    'There was an error getting you registered.'
                    ' Please try again later.', 'danger')
                return flask.redirect(flask.url_for('login'))
            flask.flash("You've successfully registered.", 'success')
            return flask.redirect(flask.url_for('login'))

    form.email.data = address
    form_url = flask.url_for('.register_user_by_invite_create', token=token)
    context = {
        'form': form,
        'form_url': form_url,
        'minyears': CONF.get("user.minyears")
    }
    return flask.render_template('register_after_email.html', **context)
Пример #16
0
def user_delete(_ctxt, group_id, user_id):
    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                gu = helper.get_member(group_id, user_id)
                session.delete(gu)
                flask.flash('Member removed successfully!', 'success')
        except Exception:
            LOG.exception("Failed to remove user '%s' from group '%s'",
                          user_id, group_id)
            flask.flash('Failed to remove member.', 'error')
    return flask.redirect(flask.url_for('.edit', group_id=group_id))
Пример #17
0
def meeting_create(_ctxt, group_id):
    form = forms.GroupMeetingForm(flask.request.form)
    group = models.Group.get(group_id)
    if not group:
        flask.flash('Group not found, please try again.', 'danger')
        return flask.redirect(flask.url_for('index'))
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                cohosts = session.query(models.GroupMember).filter(
                    models.GroupMember.group_id == group_id).filter(
                        models.GroupMember.can_cohost_meeting == 1).all()
            zoom = meeting.ZoomMeetingDriver()
            meeting_info = {
                'current_user': current_user,
                'cohosts': cohosts,
                'topic': form.topic.data,
                'type': form.meeting_type.data,
                'duration': form.duration.data,
                'start_time': form.start_datetime.data
            }
            result = zoom.schedule_meeting(**meeting_info)
            utc_meeting_start = helper.get_utc_date_time(
                current_user.timezone, form.start_datetime.data)
            with models.transaction() as session:
                m = models.ZoomMeeting(
                    meeting_id=result['id'],
                    duration=form.duration.data,
                    meeting_start=utc_meeting_start,
                    repeat_type=form.meeting_type.data,
                    topic=form.topic.data,
                    start_url=result['start_url'],
                    join_url=result['join_url'],
                    repeat_end_date=form.repeat_end_date.data,
                    user_id=current_user.id,
                    group_id=group_id)
                session.add(m)
            flask.flash(
                "You successfully created your meeting! "
                "Your meeting ID is {}".format(m.meeting_id), 'success')
        except Exception:
            message = "Failed to create meeting for group {}".format(
                group.name)
            LOG.exception(message)
            flask.flash(message, 'danger')
    return flask.redirect(flask.url_for('.show', group_id=group_id))
Пример #18
0
def billing_update(_ctxt, org_id):
    form = forms.LicenseUpdateForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        subscription_driver = subscription.ChargifyDriver(org_id)
        result = subscription_driver.update_license_quantity(
            org_id, form.quantity.data)
        if result:
            message = ("{} leader licenses now available to organizations"
                       " you have created.").format(form.quantity.data)
            flask.flash(message, 'success')
        else:
            flask.flash("Please update your billing information first.",
                        'danger')
    return flask.redirect(flask.url_for('.billing', org_id=org_id))
Пример #19
0
def group_delete(_ctxt, org_id, group_id):
    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                group = models.Group.get(group_id)
                group.archived_at = datetime.datetime.utcnow(),
                session.add(group)
                flask.flash('Group archived successfully!', 'success')
        except Exception:
            LOG.exception("Failed to archive group with id '%s' "
                          "for org %s", group_id, org_id)
            flask.flash('Failed to archive group.', 'error')
    return flask.redirect(flask.url_for('.edit', org_id=org_id))
Пример #20
0
def new(_ctxt, org_id):
    org = models.Organization.get(org_id)

    if not current_user.can_add_group(org_id=org.id):
        flask.flash("You can't add group.", 'danger')
        return flask.redirect(
            flask.url_for('users.show', user_id=current_user.id))
    if not org.is_payed_up and not org.is_in_trial():
        return helper.need_leaders(org.id)

    form = forms.GroupNewForm(flask.request.form)
    form.privacy_settings.choices = forms.privacy_setting_choices()
    form.org.choices = helper.group_creation_org_choices(org_id)
    form.org.data = org_id

    if flask.request.method == 'POST':
        if not form.validate():
            app_utils.flash_errors(form)
        elif not helper.unique_group_name(form.org.data, form.name.data):
            flask.flash(
                '{} is the name of another group in your organization.'
                ' Please try again.'.format(form.name.data), 'danger')
        else:
            try:
                return helper.creation_workflow(form, org)
            except Exception:
                LOG.exception("Group creation failed for user id '%s'",
                              current_user.id)
    context = {}

    subscription_driver = subscription.ChargifyDriver(org_id)
    available = org.available_licenses or org.is_in_trial()
    if org.creator.id == current_user.id:
        context['prices'] = subscription_driver.get_component_prices()
    else:
        if not available:
            flask.flash(
                "Your organization {} has no available Group leaders."
                " Please contact {}".format(org.name,
                                            org.creator.full_name_and_email),
                'danger')
            return flask.redirect(flask.url_for('orgs.edit', org_id=org_id))
    context['available'] = available

    context = {'form': form, 'org': org}

    return flask.render_template('group/create.html', **context)
Пример #21
0
def document_delete(_ctxt, group_id, document_id):
    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                d = models.GroupDocument.get(document_id)
                key = d.file_url.split('/')[-1]
                filehandler.S3FileHandler.delete(key)
                session.delete(d)
                flask.flash('Document deleted successfully!', 'success')
        except Exception:
            LOG.exception("Failed to delete document '%s' for group '%s'",
                          document_id, group_id)
            flask.flash('Failed to delete document.', 'error')
    return flask.redirect(flask.url_for('.show', group_id=group_id))
Пример #22
0
def billing(_ctxt, org_id):
    subscription_driver = subscription.ChargifyDriver(org_id)
    org = models.Organization.get(org_id)
    subscription_data = org.subscription_data
    credit_card = subscription_data.get('credit_card')
    card_info_form = forms.CardInfoForm(flask.request.form
                                        or MultiDict(mapping=credit_card))
    if flask.request.method == 'POST':
        if not card_info_form.validate():
            app_utils.flash_errors(card_info_form)
        else:
            if subscription_data:
                if org.cancel_at_end_of_period:
                    subscription_driver.stop_cancellation(org_id)
                result = subscription_driver.update_card_info(
                    org_id, card_info_form.data)
            else:
                result = subscription_driver.subscribe(current_user, org,
                                                       card_info_form.data)
            if 'errors' in result:
                for error in result['errors']:
                    flask.flash(error, 'danger')
            else:
                message = "Your card information has been safely stored."
                flask.flash(message, 'success')
                return flask.redirect(flask.request.path)

    product_price = subscription_driver.get_product()['price_in_cents']
    if credit_card:
        card_info_form.full_number.data = credit_card['masked_card_number']

    context = {
        'user': current_user,
        'org': org,
        'wtforms': {
            'card_info':
            card_info_form,
            'license_update':
            forms.LicenseUpdateForm(quantity=org.purchased_licenses),
        },
        'prices': subscription_driver.get_component_prices(),
        'product_price': product_price,
        'quantity': org.group_leaders
    }
    return flask.render_template('organization/billing.html', **context)
Пример #23
0
def register_validation(_ctxt, token):
    form = forms.RegisterForm(flask.request.form)
    try:
        reg_email = email.RegistrationEmail()
        content = reg_email.decrypt_token(token)
        address = content.get('mail_to', None)
        if not address:
            raise signature.InvalidSignature()
        if address and users.is_existing_user(address):
            raise exception.UserAlreadyExists(email=address)
        form.email.default = address
    except (signature.InvalidSignature, exception.MalformedToken):
        flask.flash("Error occurred. Please restart registration process",
                    "danger")
        return redirect(url_for("login"))
    except exception.UserAlreadyExists:
        flask.flash("A user is already registered for {}."
                    " Please login instead.".format(address), "danger")
        return redirect(url_for("login"))

    if flask.request.method == 'POST':
        if not form.validate():
            app_utils.flash_errors(form)
        else:
            try:
                app_utils.create_user_from_form(form)
                flask.flash("You've successfully registered."
                            " Please login to continue.",
                            'success')
                return redirect(url_for('login'))
            except Exception:
                LOG.exception("Error creating user via token registration")
                models.Session.rollback()
                flask.flash("There was an error getting you registered."
                            " Please try again later.",
                            'danger')
                return redirect(url_for('register'))
    form.email.data = address
    form_url = url_for("register_validation", token=token)
    context = {
        'form': form,
        'form_url': form_url,
        'minyears': CONF.get("user.minyears")
    }
    return render_template('register_after_email.html', **context)
Пример #24
0
def update(_ctxt, org_id):
    form = forms.OrgForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                org_to_update = models.Organization.get(org_id)
                helper.populate_org(org_to_update, form)
                session.add(org_to_update)
            flask.flash('You successfully updated the organization profile!',
                        'success')
        except Exception:
            LOG.exception('Failed to update org profile %s', org_id)
            flask.flash(
                'There was an error updating the organization '
                'profile!', 'danger')
    return flask.redirect(flask.url_for('.edit', org_id=org_id))
Пример #25
0
def join_request(_ctxt, group_id):
    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            group_leaders = helper.get_leaders(group_id, texting=True)
            if not group_leaders:
                flask.flash(
                    'There are not currently any group leaders for this group.'
                    ' No request sent. Please try again shortly.', 'danger')
            else:
                helper.join_request_handler(group_leaders, group_id)
        except Exception:
            LOG.exception("Failed to send group join request to group %s",
                          group_id)
            flask.flash('There was an error sending your join request!',
                        'danger')
    return flask.redirect(flask.url_for('.show', group_id=group_id))
Пример #26
0
def group_unaffiliate(_ctxt, org_id, group_id):
    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                og = session.query(models.OrganizationGroup).filter(
                    sa.and_(models.OrganizationGroup.organization_id == org_id,
                            models.OrganizationGroup.group_id ==
                            group_id)).first()
                session.delete(og)
                flask.flash('Group unaffiliated successfully!', 'success')
        except Exception:
            LOG.exception(
                "Failed to unaffiliated group with id '%s' "
                "for org %s", group_id, org_id)
            flask.flash('Failed to unaffiliated group.', 'error')
    return flask.redirect(flask.url_for('.edit', org_id=org_id))
Пример #27
0
def delete(_ctxt, link_id, group_id=None, organization_id=None):
    entity, _, values = get_context(group_id, organization_id)

    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                link = models.Link.get(link_id)
                session.delete(link)
                flask.flash(
                    '%s link deleted successfully!' % entity.capitalize(),
                    'success')
        except Exception:
            LOG.exception("Failed to delete link '%s' for %s '%s'", link_id,
                          entity, group_id)
            flask.flash('Failed to delete %s link.' % entity, 'error')
    return flask.redirect(flask.url_for('%ss.edit' % entity, **values))
Пример #28
0
def password_reset(_ctxt):
    form = forms.PasswordResetForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        password = form.password.data
        user = models.User.get(current_user.id)
        try:
            with models.transaction() as session:
                hashed_password = bcrypt.generate_password_hash(
                    password).decode('utf-8')
                user.hashed_password = hashed_password
                session.add(user)
            flask.flash("Password reset successfully!", 'success')
        except Exception:
            LOG.exception("Password reset failed for user id '%s'",
                          current_user.id)
            flask.flash("Error changing password.", 'danger')
    return redirect(url_for('users.show', user_id=current_user.id))
Пример #29
0
def search(_ctxt):
    form = forms.GroupSearchForm(flask.request.form)
    if flask.request.method == 'POST':
        if not form.validate():
            app_utils.flash_errors(form)
        else:
            with models.transaction() as session:
                groups_query = session.query(models.Group).join(
                    models.GroupPrivacySetting, models.Group.privacy_setting_id
                    == models.GroupPrivacySetting.id).join(
                        models.OrganizationGroup,
                        models.OrganizationGroup.group_id ==
                        models.Group.id).join(
                            models.Organization, models.Organization.id ==
                            models.OrganizationGroup.organization_id).join(
                                models.Address, models.Address.id ==
                                models.Organization.address_id)
                # TODO Seeing a lot of this pattern. We should consider mapping
                #      forms -> models. Django serializers ish?
                form_pairs = {
                    "name": models.Group.name,
                    "city": models.Address.city,
                    "state": models.Address.state,
                    "zip_code": models.Address.zip_code,
                    "group_category": models.GroupType.description,
                    "gender_focus": models.Group.gender_focus,
                    "age_range": models.AgeRange.description
                }
                for form_field, model_field in form_pairs.items():
                    form_data = getattr(form, form_field).data
                    if form_data:
                        groups_query = groups_query.filter(
                            model_field.like("{}%".format(form_data)))
                groups_query = groups_query.filter(
                    models.GroupPrivacySetting.description.like("Public%"))
                groups_query = groups_query.filter(
                    models.Group.archived_at.is_(None))
                all_groups = groups_query.order_by(models.Group.name).all()
                return flask.render_template('group/search.html',
                                             form=form,
                                             groups=all_groups)
    return flask.render_template('group/search.html', form=form)
Пример #30
0
def meeting_delete(_ctxt, group_id, meeting_id):
    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        try:
            with models.transaction() as session:
                m = models.ZoomMeeting.get(meeting_id)
                zoom = meeting.ZoomMeetingDriver()
                LOG.debug("Deleting meeting id: %s", id)
                meeting_info = {
                    'meeting_id': m.meeting_id,
                    'current_user': current_user
                }
                zoom.delete_meeting(**meeting_info)
                session.delete(m)
                flask.flash('Meeting deleted successfully!', 'success')
        except Exception:
            LOG.exception("Failed to delete meeting '%s' for group '%s'",
                          meeting_id, group_id)
            flask.flash('Failed to delete meeting.', 'error')
    return flask.redirect(flask.url_for('.show', group_id=group_id))