Skip to content
This repository was archived by the owner on Feb 5, 2025. It is now read-only.

Add proposed status to study groups #8

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion manage.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
from flask.ext.script import Manager
from studygroup.application import create_app, db
from studygroup.application import create_app, db, create_baseline_data


manager = Manager(create_app)


@manager.command
def create_tables():
db.create_all()
create_baseline_data()


if __name__ == "__main__":
manager.run()
15 changes: 15 additions & 0 deletions studygroup/application.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,21 @@
db = SQLAlchemy()
oauth = OAuth()


def create_baseline_data():
from studygroup.models import GroupStatus
group_statuses = [
('proposed', 'Proposed'),
('active', 'Active'),
('inactive', 'Inactive'),
]
for name, display in group_statuses:
if not db.session.query(GroupStatus).filter(GroupStatus.name == name).first():
db.session.add(GroupStatus(name=name, display=display))

db.session.commit()


def create_app(debug=True):
from views import studygroup

Expand Down
23 changes: 20 additions & 3 deletions studygroup/models.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,22 @@
"""
Data models for StudyGroups
"""
from sqlalchemy.sql import select

from .application import db
import settings

ROLE_MEMBER = 1
ROLE_GROUP_LEADER = 10


class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
meetup_member_id = db.Column(db.String, unique=True)
full_name = db.Column(db.String)
is_admin = db.Column(db.Boolean, nullable=False, default=False)

memberships = db.relationship("Membership", backref="user")
memberships = db.relationship('Membership', backref='user')


class Membership(db.Model):
Expand All @@ -24,23 +26,38 @@ class Membership(db.Model):
role = db.Column(db.Integer, nullable=False, default=ROLE_MEMBER)


class GroupStatus(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, nullable=False, unique=True)
display = db.Column(db.String, nullable=False)


class Group(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True)
description = db.Column(db.String)
max_members = db.Column(db.Integer, nullable=False,
default=settings.DEFAULT_MAX_MEMBERS)
status_id = db.Column(db.Integer, db.ForeignKey('group_status.id'),
nullable=False,
default=select([GroupStatus.__table__.c.id]).
where(GroupStatus.__table__.c.name == 'proposed'))

memberships = db.relationship("Membership", backref="group")
memberships = db.relationship('Membership', backref='group')
status = db.relationship('GroupStatus')

@classmethod
def all_with_memberships(cls):
return Group.query.options(db.joinedload(Group.memberships)).all()
return Group.query.options(db.joinedload(Group.memberships))

@classmethod
def by_id_with_memberships(cls, id):
return Group.query.filter_by(id=id)\
.options(db.joinedload(Group.memberships)).first()

@staticmethod
def filter_proposed(query):
return query.join(GroupStatus).filter(GroupStatus.name != 'proposed')

def is_full(self):
return len(self.memberships) >= self.max_members
21 changes: 18 additions & 3 deletions studygroup/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from flask import (g, request, redirect, render_template,
session, url_for, jsonify, Blueprint)
session, url_for, jsonify, Blueprint, abort)

from .models import User, Group
from .application import db, meetup
Expand All @@ -8,6 +8,7 @@

studygroup = Blueprint("studygroup", __name__, static_folder='static')


@studygroup.before_request
def load_user():
user_id = session.get('user_id')
Expand All @@ -21,17 +22,29 @@ def load_user():
def index():
return render_template('index.html')


@studygroup.route('/groups')
@login_required
def show_groups():
g.groups = Group.all_with_memberships()
groups = Group.all_with_memberships()
if not g.user.is_admin:
groups = Group.filter_proposed(groups)
g.groups = groups
return render_template('groups.html')


@studygroup.route('/group/<id>')
def show_group(id):
g.group = Group.query.filter_by(id=id).first()
groups = Group.query.filter_by(id=id)
if not g.user.is_admin:
groups = Group.filter_proposed(groups)
group = groups.first()
if not group:
abort(404)
g.group = group
return render_template('show_group.html')


@studygroup.route('/group/new', methods=('GET', 'POST'))
def new_group():
form = GroupForm()
Expand All @@ -40,6 +53,7 @@ def new_group():
return redirect(url_for('.show_group', id=group.id))
return render_template('new_group.html', form=form)


@studygroup.route('/join_group', methods=('POST',))
def join_group():
pass
Expand Down Expand Up @@ -92,6 +106,7 @@ def send_message(member_id):
else:
return "Invalid Request", 500


@studygroup.route('/boom')
def boom():
raise Exception('BOOM')
Expand Down
64 changes: 62 additions & 2 deletions tests/test_app.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

from .tools import StudyGroupTestCase

from studygroup.models import Group
from studygroup.application import db
from studygroup.models import Group, GroupStatus


class HomePageTest(StudyGroupTestCase):
Expand All @@ -16,7 +17,7 @@ def test_logged_in(self):
self.login(self.alice_id)
resp = self.client.get('/')
self.assert200(resp)
self.assertIn('Welcome, Alice B. Admin', resp.data)
self.assertIn('Welcome, Alice B.', resp.data)
self.assertNotIn('Sign In Now', resp.data)


Expand All @@ -42,3 +43,62 @@ def test_make_a_group(self):
self.assertEqual(g1.name, "The Group")
self.assertEqual(g1.description, "A group!")
self.assertEqual(g1.max_members, 10)
self.assertEqual(g1.status.name, 'proposed')


class GroupListTest(StudyGroupTestCase):
def setUp(self):
super(GroupListTest, self).setUp()
self.proposed_group = Group(
name='Proposed Group',
description='Proposed Group',
status=db.session.query(GroupStatus).filter(GroupStatus.name == 'proposed').one())
db.session.add(self.proposed_group)

self.active_group = Group(
name='Active Group',
description='Active Group',
status=db.session.query(GroupStatus).filter(GroupStatus.name == 'active').one())
db.session.add(self.active_group)

db.session.commit()

def test_hide_proposed_from_non_admin(self):
self.login(self.alice_id)
resp = self.client.get(url_for('studygroup.show_groups'))

self.assert200(resp)
self.assertIn('Active Group', resp.data)
self.assertNotIn('Proposed Group', resp.data)

def test_show_proposed_to_admin(self):
self.login(self.admin_id)
resp = self.client.get(url_for('studygroup.show_groups'))

self.assert200(resp)
self.assertIn('Active Group', resp.data)
self.assertIn('Proposed Group', resp.data)


class ShowGroupTest(StudyGroupTestCase):
def setUp(self):
super(ShowGroupTest, self).setUp()
self.proposed_group = Group(
name='Proposed Group',
description='Proposed Group',
status=db.session.query(GroupStatus).filter(GroupStatus.name == 'proposed').one())
db.session.add(self.proposed_group)

db.session.commit()

def test_hide_proposed_from_non_admin(self):
self.login(self.alice_id)
resp = self.client.get(url_for('studygroup.show_group', id=self.proposed_group.id))

self.assert404(resp)

def test_show_proposed_to_admin(self):
self.login(self.admin_id)
resp = self.client.get(url_for('studygroup.show_group', id=self.proposed_group.id))

self.assert200(resp)
9 changes: 4 additions & 5 deletions tests/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,9 @@
Tools to help test StudyGroup.
"""

import unittest

from flask import session
from flask.ext.testing import TestCase

from studygroup.application import create_app, db
from studygroup.application import create_app, db, create_baseline_data
from studygroup.models import User


Expand All @@ -17,7 +14,9 @@ class StudyGroupTestCase(TestCase):
"""
def setUp(self):
db.create_all()
self.alice_id = self.create_user(full_name="Alice B. Admin")
create_baseline_data()
self.alice_id = self.create_user(full_name='Alice B.')
self.admin_id = self.create_user(full_name='Bob Admin', is_admin=True)

def tearDown(self):
db.session.remove()
Expand Down