diff --git a/README.md b/README.md index cad1f6fa..f0f04932 100644 --- a/README.md +++ b/README.md @@ -4,11 +4,17 @@ A conference management solution from Eldarion. Built with the generous support of the Python Software Foundation. -See http://eldarion.com/symposion/ for commercial support, customization and hosting +See http://eldarion.com/symposion/ for commercial support, customization and +hosting. ## Quickstart -If you're interested in running symposion locally, we have built a [basic +To install Symposion, run: + + pip install symposion + +Symposion is a Django app. You will need to create a Django project to +customize and manage your Symposion installation. We have built a [basic Django startproject template that includes Symposion][1]. [1]: https://github.com/pinax/pinax-project-symposion diff --git a/requirements/base.txt b/requirements/base.txt new file mode 100644 index 00000000..2ee30364 --- /dev/null +++ b/requirements/base.txt @@ -0,0 +1,13 @@ +Django==1.4.5 +django-appconf==0.5 +django-forms-bootstrap==2.0.3.post2 +django-markitup==1.0.0 +django-model-utils==1.1.0 +django-reversion==1.7 +django-sitetree==0.9.4 +django-taggit==0.9.3 +django-timezones==0.2 +django-user-accounts==1.0b13 +easy-thumbnails==1.2 +html5lib==0.95 +markdown==2.3.1 diff --git a/requirements-docs.txt b/requirements/docs.txt similarity index 100% rename from requirements-docs.txt rename to requirements/docs.txt diff --git a/setup.py b/setup.py index 74eebbc5..2018f9a9 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,20 @@ #!/usr/bin/env python - +import os from setuptools import setup, find_packages import symposion +def read_file(filename): + """Read a file into a string.""" + path = os.path.abspath(os.path.dirname(__file__)) + filepath = os.path.ojoin(path, filename) + try: + return open(filepath).read() + except IOError: + return '' + + setup( name="symposion", author="James Tauber", @@ -12,7 +22,7 @@ setup( version=symposion.__version__, description="A collection of Django apps for conference websites.", url="http://eldarion.com/symposion/", - packages=find_packages(exclude=["symposion_project"]), + packages=find_packages(), include_package_data=True, classifiers=( "Development Status :: 4 - Beta", @@ -22,4 +32,5 @@ setup( "Natural Language :: English", "License :: OSI Approved :: MIT License", ), + install_requires=read_file("requirements/base.txt").splitlines(), ) diff --git a/symposion/reviews/fixture_gen.py b/symposion/reviews/fixture_gen.py deleted file mode 100644 index 3a6aaa40..00000000 --- a/symposion/reviews/fixture_gen.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.contrib.auth.models import Group - -from fixture_generator import fixture_generator - - -@fixture_generator(Group) -def initial_data(): - Group.objects.create(name="reviewers") - Group.objects.create(name="reviewers-admins") diff --git a/symposion/reviews/tests.py b/symposion/reviews/tests.py deleted file mode 100644 index e5fe7caf..00000000 --- a/symposion/reviews/tests.py +++ /dev/null @@ -1,143 +0,0 @@ -from django.core.urlresolvers import reverse -from django.test import TestCase - -from django.contrib.auth.models import User, Group - -from symposion.proposals.models import Proposal -from symposion.reviews.models import Review, ReviewAssignment - - -class login(object): - def __init__(self, testcase, user, password): - self.testcase = testcase - success = testcase.client.login(username=user, password=password) - self.testcase.assertTrue( - success, - "login with username=%r, password=%r failed" % (user, password) - ) - - def __enter__(self): - pass - - def __exit__(self, *args): - self.testcase.client.logout() - - -class ReviewTests(TestCase): - fixtures = ["proposals"] - - def get(self, url_name, *args, **kwargs): - return self.client.get(reverse(url_name, args=args, kwargs=kwargs)) - - def post(self, url_name, *args, **kwargs): - data = kwargs.pop("data") - return self.client.post(reverse(url_name, args=args, kwargs=kwargs), data) - - def login(self, user, password): - return login(self, user, password) - - def test_detail_perms(self): - guidos_proposal = Proposal.objects.all()[0] - response = self.get("review_detail", pk=guidos_proposal.pk) - - # Not logged in - self.assertEqual(response.status_code, 302) - - with self.login("guido", "pythonisawesome"): - response = self.get("review_detail", pk=guidos_proposal.pk) - # Guido can see his own proposal. - self.assertEqual(response.status_code, 200) - - with self.login("matz", "pythonsucks"): - response = self.get("review_detail", pk=guidos_proposal.pk) - # Matz can't see guido's proposal - self.assertEqual(response.status_code, 302) - - larry = User.objects.get(username="larryw") - # Larry is a trustworthy guy, he's a reviewer. - larry.groups.add(Group.objects.get(name="reviewers")) - with self.login("larryw", "linenoisehere"): - response = self.get("review_detail", pk=guidos_proposal.pk) - # Reviewers can see a review detail page. - self.assertEqual(response.status_code, 200) - - def test_reviewing(self): - guidos_proposal = Proposal.objects.all()[0] - - with self.login("guido", "pythonisawesome"): - response = self.post("review_review", pk=guidos_proposal.pk, data={ - "vote": "+1", - }) - # It redirects, but... - self.assertEqual(response.status_code, 302) - # ... no vote recorded - self.assertEqual(guidos_proposal.reviews.count(), 0) - - larry = User.objects.get(username="larryw") - # Larry is a trustworthy guy, he's a reviewer. - larry.groups.add(Group.objects.get(name="reviewers")) - with self.login("larryw", "linenoisehere"): - response = self.post("review_review", pk=guidos_proposal.pk, data={ - "vote": "+0", - "text": "Looks like a decent proposal, and Guido is a smart guy", - }) - self.assertEqual(response.status_code, 302) - self.assertEqual(guidos_proposal.reviews.count(), 1) - self.assertEqual(ReviewAssignment.objects.count(), 1) - assignment = ReviewAssignment.objects.get() - self.assertEqual(assignment.proposal, guidos_proposal) - self.assertEqual(assignment.origin, ReviewAssignment.OPT_IN) - self.assertEqual(guidos_proposal.comments.count(), 1) - comment = guidos_proposal.comments.get() - self.assertFalse(comment.public) - - response = self.post("review_review", pk=guidos_proposal.pk, data={ - "vote": "+1", - "text": "Actually Perl is dead, we really need a talk on the future", - }) - self.assertEqual(guidos_proposal.reviews.count(), 2) - self.assertEqual(ReviewAssignment.objects.count(), 1) - assignment = ReviewAssignment.objects.get() - self.assertEqual(assignment.review, Review.objects.order_by("-id")[0]) - self.assertEqual(guidos_proposal.comments.count(), 2) - - # Larry's a big fan... - response = self.post("review_review", pk=guidos_proposal.pk, data={ - "vote": "+20", - }) - self.assertEqual(guidos_proposal.reviews.count(), 2) - - def test_speaker_commenting(self): - guidos_proposal = Proposal.objects.all()[0] - - with self.login("guido", "pythonisawesome"): - response = self.get("review_comment", pk=guidos_proposal.pk) - # Guido can comment on his proposal. - self.assertEqual(response.status_code, 200) - - response = self.post("review_comment", pk=guidos_proposal.pk, data={ - "text": "FYI I can do this as a 30-minute or 45-minute talk.", - }) - self.assertEqual(response.status_code, 302) - self.assertEqual(guidos_proposal.comments.count(), 1) - comment = guidos_proposal.comments.get() - self.assertTrue(comment.public) - - larry = User.objects.get(username="larryw") - # Larry is a trustworthy guy, he's a reviewer. - larry.groups.add(Group.objects.get(name="reviewers")) - with self.login("larryw", "linenoisehere"): - response = self.get("review_comment", pk=guidos_proposal.pk) - # Larry can comment, since he's a reviewer - self.assertEqual(response.status_code, 200) - - response = self.post("review_comment", pk=guidos_proposal.pk, data={ - "text": "Thanks for the heads-up Guido." - }) - self.assertEqual(response.status_code, 302) - self.assertEqual(guidos_proposal.comments.count(), 2) - - with self.login("matz", "pythonsucks"): - response = self.get("review_comment", pk=guidos_proposal.pk) - # Matz can't comment. - self.assertEqual(response.status_code, 302) diff --git a/symposion/speakers/fixture_gen.py b/symposion/speakers/fixture_gen.py deleted file mode 100644 index fc38463f..00000000 --- a/symposion/speakers/fixture_gen.py +++ /dev/null @@ -1,29 +0,0 @@ -from django.contrib.auth.models import User - -from fixture_generator import fixture_generator - -from symposion.speakers.models import Speaker - - -@fixture_generator(Speaker, User) -def speakers(): - guido = User.objects.create_user("guido", "guido@python.org", "pythonisawesome") - matz = User.objects.create_user("matz", "matz@ruby.org", "pythonsucks") - larry = User.objects.create_user("larryw", "larry@perl.org", "linenoisehere") - - Speaker.objects.create( - user=guido, - name="Guido van Rossum", - biography="I wrote Python, and named it after Monty Python", - ) - Speaker.objects.create( - user=matz, - name="Yukihiro Matsumoto", - biography="I wrote Ruby, and named it after the rare gem Ruby, a pun " - "on Perl/pearl.", - ) - Speaker.objects.create( - user=larry, - name="Larry Wall", - biography="I wrote Perl, and named it after the Parable of the Pearl", - )