示例#1
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))
示例#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 show(self, org):
        if not org or org.activated_at is None:
            flask.flash('Organization not found. Please try again', 'danger')
            return flask.redirect(flask.url_for('index'))
        cloudinary = dict(entity_id=org.id,
                          entity_type='organization',
                          **CloudinaryHandler.cloudinary_elements())

        ef = forms.MassEmailForm()
        email_form = self.custom_email_form(org.id, ef)
        wtforms = {
            'mass_email': email_form,
            'confirm': forms.ConfirmForm(flask.request.form)
        }
        context = {
            'cloudinary': cloudinary,
            'env': CONF.get('environment'),
            'google_api_key': CONF.get('google.api.key'),
            'invited_users': self.get_invited_users(org.id),
            'join_request_url': flask.url_for('orgs.join_request',
                                              org_id=org.id),
            'members': self.get_users(org.id),
            'org': org,
            'video_extensions': tuple(VIDEO_EXTENSIONS),
            'wtforms': wtforms
        }
        return flask.render_template('organization/view.html', **context)
示例#4
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))
示例#5
0
def index(_ctxt):
    groups_limit = CONF.get('max.groups.on.homepage')
    cls = models.Group
    query_filter = [
        models.GroupPrivacySetting.description.like('Public%'),
        cls.archived_at.is_(None)]
    order_by = cls.id.desc()

    if flask.request.method == 'POST':
        form = flask.request.get_json()
        if form.get('age'):
            query_filter.append(cls.age_range_id == form['age'])
        if form.get('gender') or form.get('gender') == '':
            query_filter.append(cls.gender_focus == form['gender'])
        if form.get('group_types'):
            query_filter.append(cls.group_type_id.in_(form['group_types']))
        if form.get('order'):
            order_by = cls.clicks.desc()

    query = models.Session.query(cls).join(
        cls.privacy_settings
    ).filter(*query_filter).order_by(
        order_by
    ).limit(groups_limit)

    if flask.request.method == 'POST':
        return render_template(
            '_partials/featured_groups.html', group_list=query.all())

    filter_ages = models.Session.query(models.AgeRange).options(
        orm.load_only('id', 'description')).all()
    filter_group_types = models.Session.query(models.GroupType).options(
        orm.load_only('id', 'description')).all()

    wtforms = {
        'confirm': forms.ConfirmForm(),
        'contact': forms.ContactForm()
    }

    # TODO: see models.py Group.gender_focus note
    context = {
        'group_list': query.all(),
        'filter': {
            'genders': [
                ('', "Men and Women"),
                ('M', "Men's Group"),
                ('F', "Women's Group")
            ],
            'ages': filter_ages,
            'group_types': filter_group_types
        },
        'wtforms': wtforms
    }
    return render_template('index.html', **context)
示例#6
0
def block_as_spam(_ctxt, notification_id):
    form = forms.ConfirmForm(flask.request.form)
    if form.validate():
        LOG.debug("Block Notification as Spam")
        notification = models.Notification.get(notification_id)
        notification.declined = datetime.datetime.utcnow()
        notification.blocked_as_spam = True
        notification.save()
        flask.flash("Notification blocked successfully!", "success")
    else:
        flask.flash("Can't block notification as Spam. Please, try again"
                    " later", "danger")
    return flask.redirect(
        flask.url_for('users.show', user_id=current_user.id))
示例#7
0
def join_request(_ctxt, org_id):
    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        return flask.redirect(
            flask.redirect(flask.url_for('.show', org_id=org_id)))
    try:
        with models.transaction() as session:
            existing_om = helper.get_member(org_id, current_user.id)
            if existing_om:
                flask.flash('You are already a member of this organization',
                            'danger')
                return flask.redirect(flask.url_for('.show', org_id=org_id))
            org = models.Organization.get(org_id)
            if not org:
                flask.flash('No organization found', 'danger')
                return flask.redirect(flask.url_for('.show', org_id=org_id))
            org_admins_and_owners = helper.get_leaders(org_id)
            if not org_admins_and_owners:
                flask.flash(
                    'There is not currently any organization'
                    ' owners/administrators for this organization. No request'
                    ' sent Please try again shortly.', 'danger')
            else:
                notification_type = session.query(
                    models.NotificationType).filter(
                        models.NotificationType.description ==
                        'Organization Join Request').first()
                for user in org_admins_and_owners:
                    notification = models.Notification(
                        user_to_id=user.id,
                        user_from_id=current_user.id,
                        notification_type_id=notification_type.id,
                        organization_id=org_id)
                    reminder = helper.send_notification(notification)
                mail_to = ','.join([u.email for u in org_admins_and_owners])
                email_type = email.OrgJoinRequestEmail()
                helper.send_email(email_type,
                                  current_user.email,
                                  mail_to,
                                  reminder,
                                  org=org)

                flask.flash('Request to join organization successfully sent!',
                            'success')
    except Exception:
        LOG.exception('Failed to send group join request to organization %s',
                      org_id)
        flask.flash('There was an error sending your join request!', 'danger')
    return flask.redirect(flask.url_for('.show', org_id=org_id))
示例#8
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))
示例#9
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))
示例#10
0
def show(_ctxt, user_id):
    if current_user.id != user_id and not current_user.super_admin:
        flask.flash('Permission denied.', 'danger')
        return flask.redirect('/')
    user = models.User.get(user_id)
    wtforms = {
        'confirm': forms.ConfirmForm(flask.request.form),
        'password_reset': forms.PasswordResetForm(flask.request.form),
        'user_profile': forms.UserProfileForm(flask.request.form, obj=user)
    }
    wtforms['user_profile'].timezone_default.data = user.timezone
    cloudinary = dict(entity_type='user',
                      entity_id=user_id,
                      **CloudinaryHandler.cloudinary_elements())
    context = {'cloudinary': cloudinary, 'user': user, 'wtforms': wtforms}
    return flask.render_template('user/profile.html', **context)
示例#11
0
def edit(_ctxt, org_id):
    tf = forms.TextMessageForm()
    text_message_form = helper.text_message_form(org_id, tf)
    ef = forms.MassEmailForm()
    mass_email_form = helper.custom_email_form(org_id, ef)

    org = models.Organization.get(org_id)
    creator = org.creator
    members = helper.get_users(org_id)
    invited_users = helper.get_invited_users(org_id)

    wtforms = {
        'org': forms.OrgForm(),
        'mass_email': mass_email_form,
        'link': forms.LinkForm(),
        'chart_filter': forms.ChartFilterForm(),
        'confirm': forms.ConfirmForm(),
        'text_message': text_message_form,
        'add_member': forms.AddMemberForm(),
        'role_forms_dict': {}
    }

    helper.populate_primary_form(wtforms['org'], org)

    for member, role in members:
        role_form = forms.RoleForm()
        role_form.role.choices = helper.get_role_choices(org_id)
        role_form.role.data = role.id
        wtforms['role_forms_dict'][member.id] = role_form

    charts = Charts(org).get()
    cloudinary = dict(entity_id=org.id,
                      entity_type='org',
                      **CloudinaryHandler.cloudinary_elements())

    context = {
        'add_member_return_url': flask.url_for('.edit', org_id=org_id),
        'charts': charts,
        'cloudinary': cloudinary,
        'creator': creator,
        'current_user': current_user,
        'invited_users': invited_users,
        'members': members,
        'org': org,
        'wtforms': wtforms
    }
    return flask.render_template('organization/edit.html', **context)
示例#12
0
def show(_ctxt, group_id):
    tf = forms.TextMessageForm()
    text_message_form = helper.text_message_form(group_id, tf)
    ef = forms.MassEmailForm()
    mass_email_form = helper.custom_email_form(group_id, ef)
    group = models.Group.get(group_id)
    if not group or group.archived_at:
        flask.flash('Group not found. Please try again.', 'danger')
        return flask.redirect(flask.url_for('index'))
    elif not group.parent_org.activated_at:
        flask.flash(
            'This group does not exist, please try again or contact'
            ' an organization administrator for that group', 'danger')
        return flask.redirect(flask.url_for('index'))
    wtforms = {
        'group_leaders_email': forms.GroupLeadersEmailForm(),
        'mass_email': mass_email_form,
        'add_member': forms.AddMemberForm(),
        'text_message': text_message_form,
        'group_add_document': forms.GroupAddDocumentForm(),
        'group_add_google_doc': forms.GroupAddGoogleDocForm(),
        'group_meeting': forms.GroupMeetingForm(),
        'confirm': forms.ConfirmForm()
    }

    cloudinary = dict(entity_type='group',
                      entity_id=group.id,
                      **CloudinaryHandler.cloudinary_elements())
    google_api = {'key': GOOGLE_API_KEY, 'client_id': GOOGLE_API_CLIENT_ID}

    context = {
        'add_member_return_url': flask.url_for(".show", group_id=group_id),
        'cloudinary': cloudinary,
        'current_user': current_user,
        'entity_type': 'group',
        'google_api': google_api,
        'group': group,
        'invited_users': helper.get_invited_users(group_id),
        'meetings': helper.get_meetings(group_id),
        'members': helper.get_users(group_id),
        'video_extensions': tuple(VIDEO_EXTENSIONS),
        'wtforms': wtforms
    }

    if current_user.is_authenticated:
        context['disqus_config'] = disqus.conf(current_user, group_id)
    return flask.render_template('group/view.html', **context)
示例#13
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))
示例#14
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))
示例#15
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))
示例#16
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))
示例#17
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))
示例#18
0
def meeting_text_create(_ctxt, group_id, meeting_id):
    form = forms.ConfirmForm(flask.request.form)
    if not form.validate():
        app_utils.flash_errors(form)
    else:
        group = models.Group.get(group_id)
        zoom_meeting = models.ZoomMeeting.get(meeting_id)
        group_leaders = helper.get_leaders(group_id, texting=True)
        group_users = helper.get_users(group_id, texting=True)

        # Three message sets due to hosts receiving two and leaders receiving
        # three separate messages
        join_messages = {}
        host_messages = {}
        leader_messages = {}

        for user in group_users:
            message = helper.meeting_join_text(user, group, zoom_meeting)
            join_messages[user.phone_number] = message
        for host in group_users:
            if zoom_meeting.can_host_meeting(host.id):
                message = helper.meeting_creator_alert_text(
                    host, group, zoom_meeting)
                host_messages[host.phone_number] = message
        for leader in group_leaders:
            if leader is not current_user:
                message = helper.leader_alert_text(leader, current_user, group,
                                                   zoom_meeting)
                leader_messages[leader.phone_number] = message

        # It is assumed that if the Join text is sent, necessary data for the
        # others are sent. Logs will be kept on all three, but flashes will
        # only occur for Join text
        helper.send_text_message(join_messages, flash=True)
        helper.send_text_message(host_messages, flash=False)
        helper.send_text_message(leader_messages, flash=False)

    return flask.redirect(flask.url_for('.show', group_id=group_id))
示例#19
0
def edit(_ctxt, group_id):
    tf = forms.TextMessageForm()
    text_message_form = helper.text_message_form(group_id, tf)
    ef = forms.MassEmailForm()
    mass_email_form = helper.custom_email_form(group_id, ef)

    group = models.Group.get(group_id)
    if not group.parent_org.activated_at:
        flask.flash(
            'This group does not exist, please try again or contact'
            ' an organization administrator for that group', 'danger')
        return flask.redirect(flask.url_for('index'))
    other_orgs = helper.get_unaffiliated_orgs_for_group(group_id)
    members = helper.get_users(group_id)
    invited_users = helper.get_invited_users(group_id)
    wtforms = {
        'add_member': forms.AddMemberForm(),
        'group_add_org': forms.GroupAddOrgForm(),
        'confirm': forms.ConfirmForm(),
        'group_edit': forms.GroupEditForm(),
        'link': forms.LinkForm(),
        'mass_email': mass_email_form,
        'role_forms': {},
        'text_message': text_message_form,
        'tinymce_api_key': CONF.get('tinymce.api.key')
    }

    # TODO This is ripe for optimization. It's nice to get the models
    #      but we should eager load the meet_time_types at least to
    #      save N unexpected trips to the database
    wtforms['group_edit'].meet_times.data = [
        t.meet_time_type for t in group.meet_times
    ]
    wtforms[
        'group_edit'].privacy_settings.choices = forms.privacy_setting_choices(
        )
    helper.populate_primary_form(wtforms['group_edit'], group)
    add_member_return_url = flask.url_for(".edit", group_id=group_id)
    wtforms['group_add_org'].orgs.choices = [('', 'Select Organization')] + [
        (str(o.id), o.name) for o in other_orgs
    ]
    role_forms = {}
    org = group.parent_org

    if current_user.is_group_admin(org_id=org.id):
        group_role_choices = helper.get_role_choices()
    elif current_user.role_for_group(group_id):
        priority = current_user.role_for_group(group_id).priority
        group_role_choices = helper.get_role_choices(priority)
    else:
        group_role_choices = helper.get_role_choices(0)
    for user, group_member, role in members:
        group_user_role_form = forms.GroupUserRoleForm()
        group_user_role_form.role.choices = group_role_choices
        group_user_role_form.role.data = str(role.id)
        group_user_role_form.cohost_meeting.data = (
            group_member.can_cohost_meeting)
        role_forms[user.id] = group_user_role_form

    cloudinary = dict(entity_type='group',
                      entity_id=group.id,
                      **CloudinaryHandler.cloudinary_elements())

    context = {
        'add_member_return_url': add_member_return_url,
        'cloudinary': cloudinary,
        'group': group,
        'invited_users': invited_users,
        'members': members,
        'role_forms': role_forms,
        'wtforms': wtforms
    }
    return flask.render_template('group/edit.html', **context)